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

Andreas Rheinhardt andreas.rheinhardt at gmail.com
Tue Mar 2 20:33:35 EET 2021


Ronald S. Bultje:
> 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.
> 
Then why don't you use it if it is set?

- Andreas


More information about the ffmpeg-devel mailing list