diff mbox series

[FFmpeg-devel,v1] avformat/ivfenc: Set the "number of frames" in IVF header

Message ID DM6PR11MB268101D9DA0D3EAEC0B7D5DEB14EA@DM6PR11MB2681.namprd11.prod.outlook.com
State New
Headers show
Series [FFmpeg-devel,v1] avformat/ivfenc: Set the "number of frames" in IVF header | expand

Checks

Context Check Description
yinshiyou/make_loongarch64 success Make finished
andriy/make_x86 success Make finished
andriy/make_fate_x86 fail Make fate failed

Commit Message

Dai, Jianhui J June 2, 2023, 7:39 a.m. UTC
Should set "number of frames" to bytes 24-27 of IVF header, not duration.
It is described by [1]. Also confirm it by parsing IVF files in [2].

[1] Duck IVF - MultimediaWiki
https://wiki.multimedia.cx/index.php/Duck_IVF

[2] webm/vp8-test-vectors - Git at Google
https://chromium.googlesource.com/webm/vp8-test-vectors

Signed-off-by: Jianhui Dai <jianhui.j.dai@intel.com>
---
 libavformat/ivfenc.c | 13 +++++--------
 1 file changed, 5 insertions(+), 8 deletions(-)
diff mbox series

Patch

diff --git a/libavformat/ivfenc.c b/libavformat/ivfenc.c
index 47b4efbcd1..88399099d4 100644
--- a/libavformat/ivfenc.c
+++ b/libavformat/ivfenc.c
@@ -72,7 +72,8 @@  static int ivf_write_header(AVFormatContext *s)
     avio_wl16(pb, par->height);
     avio_wl32(pb, s->streams[0]->time_base.den);
     avio_wl32(pb, s->streams[0]->time_base.num);
-    avio_wl64(pb, 0xFFFFFFFFFFFFFFFFULL); // length is overwritten at the end of muxing
+    avio_wl32(pb, 0xFFFFFFFF); // "number of frames" is overwritten at the end of muxing
+    avio_wl32(pb, 0); // unused
 
     return 0;
 }
@@ -99,16 +100,12 @@  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 || (ctx->frame_cnt == 1 && ctx->last_pkt_duration))) {
+    // overwrite the "number of frames"
+    if ((pb->seekable & AVIO_SEEKABLE_NORMAL)) {
         int64_t end = avio_tell(pb);
 
         avio_seek(pb, 24, SEEK_SET);
-        // overwrite the "length" field (duration)
-        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_wl32(pb, ctx->frame_cnt);
         avio_seek(pb, end, SEEK_SET);
     }