summaryrefslogtreecommitdiff
path: root/libavformat/ivfenc.c
diff options
context:
space:
mode:
authorDai, Jianhui J <jianhui.j.dai-at-intel.com@ffmpeg.org>2023-07-03 04:25:38 +0000
committerRonald S. Bultje <rsbultje@gmail.com>2023-07-09 16:56:58 -0400
commit3b358f151ddc7543f1c0fc0cff82b6fe4ddf9cbf (patch)
tree066f0607a35136547133085b080e8708c28a9b1d /libavformat/ivfenc.c
parentfcbee7efdfb55a25d573669114b5a968a72deb9f (diff)
avformat/ivfenc: Set the "number of frames" in IVF header
Should set "number of frames" to bytes 24-27 of IVF header, not duration. It is described by [1], and confirmed by parsing all IVF files in [2]. This commit also updates the md5sum of refs to pass fate-cbs. [1] Duck IVF - MultimediaWiki https://wiki.multimedia.cx/index.php/Duck_IVF [2] webm/vp8-test-vectors https://chromium.googlesource.com/webm/vp8-test-vectors Signed-off-by: Jianhui Dai <jianhui.j.dai@intel.com> Signed-off-by: Ronald S. Bultje <rsbultje@gmail.com>
Diffstat (limited to 'libavformat/ivfenc.c')
-rw-r--r--libavformat/ivfenc.c13
1 files changed, 5 insertions, 8 deletions
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);
}