diff --git a/libavformat/mov.c b/libavformat/mov.c index 37f24a6beb..40105a408d 100644 --- a/libavformat/mov.c +++ b/libavformat/mov.c @@ -3028,6 +3028,27 @@ static int mov_skip_multiple_stsd(MOVContext *c, AVIOContext *pb, return 0; } +static int mov_finalize_stsd_entry(MOVContext *c, AVStream *st) +{ + int ret; + + /* special codec parameters handling */ + switch (st->codecpar->codec_id) { + case AV_CODEC_ID_H264: + // done for ai5q, ai52, ai55, ai1q, ai12 and ai15. + if (!st->codecpar->extradata_size && TAG_IS_AVCI(st->codecpar->codec_tag)) { + ret = ff_generate_avci_extradata(st); + if (ret < 0) + return ret; + } + break; + default: + break; + } + + return 0; +} + int ff_mov_read_stsd_entries(MOVContext *c, AVIOContext *pb, int entries) { AVStream *st; @@ -3105,6 +3126,10 @@ int ff_mov_read_stsd_entries(MOVContext *c, AVIOContext *pb, int entries) } else if (a.size > 0) avio_skip(pb, a.size); + ret = mov_finalize_stsd_entry(c, st); + if (ret < 0) + return ret; + if (sc->extradata && st->codecpar->extradata) { int extra_size = st->codecpar->extradata_size; @@ -5216,14 +5241,6 @@ static int mov_read_trak(MOVContext *c, AVIOContext *pb, MOVAtom atom) #endif } - // done for ai5q, ai52, ai55, ai1q, ai12 and ai15. - if (!st->codecpar->extradata_size && st->codecpar->codec_id == AV_CODEC_ID_H264 && - TAG_IS_AVCI(st->codecpar->codec_tag)) { - ret = ff_generate_avci_extradata(st); - if (ret < 0) - return ret; - } - switch (st->codecpar->codec_id) { case AV_CODEC_ID_H261: case AV_CODEC_ID_H263: