Hi,
On Tue, Mar 2, 2021 at 11:20 AM Andreas Rheinhardt <
[email protected]> wrote:
> Ronald S. Bultje:
> > ---
> > libavformat/ivfenc.c | 11 ++++++++---
> > 1 file changed, 8 insertions(+), 3 deletions(-)
> >
> > diff --git a/libavformat/ivfenc.c b/libavformat/ivfenc.c
> > index 0951f56..e22625b 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, first_duration;
> > } IVFEncContext;
> >
> > static int ivf_init(AVFormatContext *s)
> > @@ -86,6 +86,8 @@ 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;
> > + else
> > + ctx->first_duration = pkt->duration;
> > ctx->frame_cnt++;
> > ctx->last_pts = pkt->pts;
> >
> > @@ -97,12 +99,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->first_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->frame_cnt > 1 ?
> > + ctx->frame_cnt * ctx->sum_delta_pts / (ctx->frame_cnt
> - 1) :
> > + ctx->first_duration);
> > avio_wl32(pb, 0); // zero out unused bytes
> > avio_seek(pb, end, SEEK_SET);
> > }
> >
> Shouldn't we not always use the duration of the last packet for the
> duration and not only when it is the only packet?
That assumes the duration is always set, which according to the
documentation is not guaranteed.
Ronald
_______________________________________________
ffmpeg-devel mailing list
[email protected]
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
To unsubscribe, visit link above, or email
[email protected] with subject "unsubscribe".