diff mbox series

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

Message ID 1614711197-46855-1-git-send-email-rsbultje@gmail.com
State Accepted
Commit d29ec02d48a7fae1e3ed5a7bd79ab3fd73b42a96
Headers show
Series [FFmpeg-devel] ivfenc: write duration for frame_cnt=1.
Related show

Checks

Context Check Description
andriy/x86_make success Make finished
andriy/x86_make_fate success Make fate finished
andriy/PPC64_make success Make finished
andriy/PPC64_make_fate success Make fate finished

Commit Message

Ronald S. Bultje March 2, 2021, 6:53 p.m. UTC
---
 libavformat/ivfenc.c | 10 +++++++---
 1 file changed, 7 insertions(+), 3 deletions(-)

Comments

Andreas Rheinhardt March 2, 2021, 6:59 p.m. UTC | #1
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.

- Andreas
Ronald S. Bultje March 3, 2021, 12:30 p.m. UTC | #2
Hi,

On Tue, Mar 2, 2021 at 1:59 PM Andreas Rheinhardt <
andreas.rheinhardt@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
diff mbox series

Patch

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);
     }