diff --git a/libavformat/isom.c b/libavformat/isom.c index 2792371c25..ce66d1bcd4 100644 --- a/libavformat/isom.c +++ b/libavformat/isom.c @@ -188,6 +188,7 @@ const AVCodecTag ff_codec_movvideo_tags[] = { { AV_CODEC_ID_VP8, MKTAG('v', 'p', '0', '8') }, /* VP8 */ { AV_CODEC_ID_VP9, MKTAG('v', 'p', '0', '9') }, /* VP9 */ + { AV_CODEC_ID_AV1, MKTAG('a', 'v', '0', '1') }, /* AV1 */ { AV_CODEC_ID_MPEG1VIDEO, MKTAG('m', '1', 'v', ' ') }, { AV_CODEC_ID_MPEG1VIDEO, MKTAG('m', '1', 'v', '1') }, /* Apple MPEG-1 Camcorder */ diff --git a/libavformat/mov.c b/libavformat/mov.c index eda3fff6d5..870c603f0b 100644 --- a/libavformat/mov.c +++ b/libavformat/mov.c @@ -5185,6 +5185,36 @@ static int mov_read_tmcd(MOVContext *c, AVIOContext *pb, MOVAtom atom) return 0; } +static int mov_read_av1c(MOVContext *c, AVIOContext *pb, MOVAtom atom) +{ + AVStream *st; + int ret, version; + + if (c->fc->nb_streams < 1) + return 0; + st = c->fc->streams[c->fc->nb_streams - 1]; + + if (atom.size < 5) { + av_log(c->fc, AV_LOG_ERROR, "Empty AV1 Codec Configuration Box\n"); + return AVERROR_INVALIDDATA; + } + + version = avio_r8(pb); + if (version != 0) { + av_log(c->fc, AV_LOG_WARNING, "Unknown AV1 Codec Configuration Box version %d\n", version); + return 0; + } + avio_skip(pb, 3); /* flags */ + + avio_skip(pb, 1); /* reserved, initial_presentation_delay_present, initial_presentation_delay_minus_one */ + + ret = ff_get_extradata(c->fc, st->codecpar, pb, atom.size - 5); + if (ret < 0) + return ret; + + return 0; +} + static int mov_read_vpcc(MOVContext *c, AVIOContext *pb, MOVAtom atom) { AVStream *st; @@ -6622,6 +6652,7 @@ static const MOVParseTableEntry mov_default_parse_table[] = { { MKTAG('A','A','L','P'), mov_read_avid }, { MKTAG('A','R','E','S'), mov_read_ares }, { MKTAG('a','v','s','s'), mov_read_avss }, +{ MKTAG('a','v','1','C'), mov_read_av1c }, { MKTAG('c','h','p','l'), mov_read_chpl }, { MKTAG('c','o','6','4'), mov_read_stco }, { MKTAG('c','o','l','r'), mov_read_colr },