|
|
|
@ -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 }, |
|
|
|
|