Hi, On Tue, Mar 2, 2021 at 1:59 PM Andreas Rheinhardt < andreas.rheinha...@gmail.com> wrote:
> Ronald S. Bultje: > > --- > > libavformat/ivfenc.c | 10 +++++++--- > > 1 file changed, 7 insertions(+), 3 deletions(-) > > > > diff --git a/libavformat/ivfenc.c b/libavformat/ivfenc.c > > index 0951f56..889c004 100644 > > --- a/libavformat/ivfenc.c > > +++ b/libavformat/ivfenc.c > > @@ -23,7 +23,7 @@ > > > > typedef struct IVFEncContext { > > unsigned frame_cnt; > > - uint64_t last_pts, sum_delta_pts; > > + uint64_t last_pts, sum_delta_pts, last_pkt_duration; > > } IVFEncContext; > > > > static int ivf_init(AVFormatContext *s) > > @@ -86,6 +86,7 @@ static int ivf_write_packet(AVFormatContext *s, > AVPacket *pkt) > > avio_write(pb, pkt->data, pkt->size); > > if (ctx->frame_cnt) > > ctx->sum_delta_pts += pkt->pts - ctx->last_pts; > > + ctx->last_pkt_duration = pkt->duration; > > ctx->frame_cnt++; > > ctx->last_pts = pkt->pts; > > > > @@ -97,12 +98,15 @@ static int ivf_write_trailer(AVFormatContext *s) > > AVIOContext *pb = s->pb; > > IVFEncContext *ctx = s->priv_data; > > > > - if ((pb->seekable & AVIO_SEEKABLE_NORMAL) && ctx->frame_cnt > 1) { > > + if ((pb->seekable & AVIO_SEEKABLE_NORMAL) && > > + (ctx->frame_cnt > 1 || (ctx->frame_cnt == 1 && > ctx->last_pkt_duration))) { > > int64_t end = avio_tell(pb); > > > > avio_seek(pb, 24, SEEK_SET); > > // overwrite the "length" field (duration) > > - avio_wl32(pb, ctx->frame_cnt * ctx->sum_delta_pts / > (ctx->frame_cnt - 1)); > > + avio_wl32(pb, ctx->last_pkt_duration ? > > + ctx->sum_delta_pts + ctx->last_pkt_duration : > > + ctx->frame_cnt * ctx->sum_delta_pts / (ctx->frame_cnt > - 1)); > > avio_wl32(pb, 0); // zero out unused bytes > > avio_seek(pb, end, SEEK_SET); > > } > > > Yes, that's what I had in mind. LGTM. Merged. Ronald _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org https://ffmpeg.org/mailman/listinfo/ffmpeg-devel To unsubscribe, visit link above, or email ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".