[FFmpeg-devel] [PATCH] ivfenc: write duration for frame_cnt=1.

Ronald S. Bultje rsbultje at gmail.com
Tue Mar 2 20:28:57 EET 2021


Hi,

On Tue, Mar 2, 2021 at 11:20 AM Andreas Rheinhardt <
andreas.rheinhardt at gmail.com> 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


More information about the ffmpeg-devel mailing list