summaryrefslogtreecommitdiff
path: root/libavformat/ivfdec.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/ivfdec.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/ivfdec.c')
-rw-r--r--libavformat/ivfdec.c13
1 files changed, 10 insertions, 3 deletions
diff --git a/libavformat/ivfdec.c b/libavformat/ivfdec.c
index 511f2387ed..141ce4f1be 100644
--- a/libavformat/ivfdec.c
+++ b/libavformat/ivfdec.c
@@ -51,11 +51,18 @@ static int read_header(AVFormatContext *s)
st->codecpar->codec_id = ff_codec_get_id(ff_codec_bmp_tags, st->codecpar->codec_tag);
st->codecpar->width = avio_rl16(s->pb);
st->codecpar->height = avio_rl16(s->pb);
- time_base.den = avio_rl32(s->pb);
- time_base.num = avio_rl32(s->pb);
- st->duration = avio_rl32(s->pb);
+ time_base.den = avio_rl32(s->pb);
+ time_base.num = avio_rl32(s->pb);
+ st->nb_frames = avio_rl32(s->pb);
avio_skip(s->pb, 4); // unused
+ // Infer duration from nb_frames, in order to be backward compatible with
+ // previous IVF demuxer.
+ // It is popular to configure time_base to 1/frame_rate by IVF muxer, that
+ // the duration happens to be the same with nb_frames. See
+ // `https://chromium.googlesource.com/webm/vp8-test-vectors/+/refs/heads/main`
+ st->duration = st->nb_frames;
+
ffstream(st)->need_parsing = AVSTREAM_PARSE_HEADERS;
if (!time_base.den || !time_base.num) {