X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavformat%2Favidec.c;h=abe8c988f16197d53b73a83bd776684125f94db3;hb=33e997d992ccd4e93b57fa7dfb478fc6a67ce4ac;hp=e5a292ee4281aafd49fd87e3948828fd72c5bb0f;hpb=286d8bae61e8bee3e5e5fc08e90b74e90612330f;p=ffmpeg diff --git a/libavformat/avidec.c b/libavformat/avidec.c index e5a292ee428..abe8c988f16 100644 --- a/libavformat/avidec.c +++ b/libavformat/avidec.c @@ -160,11 +160,11 @@ static int get_riff(AVFormatContext *s, AVIOContext *pb) return 0; } -static int read_braindead_odml_indx(AVFormatContext *s, int frame_num) +static int read_odml_index(AVFormatContext *s, int frame_num) { AVIContext *avi = s->priv_data; AVIOContext *pb = s->pb; - int longs_pre_entry = avio_rl16(pb); + int longs_per_entry = avio_rl16(pb); int index_sub_type = avio_r8(pb); int index_type = avio_r8(pb); int entries_in_use = avio_rl32(pb); @@ -179,9 +179,9 @@ static int read_braindead_odml_indx(AVFormatContext *s, int frame_num) int64_t filesize = avi->fsize; av_log(s, AV_LOG_TRACE, - "longs_pre_entry:%d index_type:%d entries_in_use:%d " + "longs_per_entry:%d index_type:%d entries_in_use:%d " "chunk_id:%X base:%16"PRIX64" frame_num:%d\n", - longs_pre_entry, + longs_per_entry, index_type, entries_in_use, chunk_id, @@ -198,7 +198,7 @@ static int read_braindead_odml_indx(AVFormatContext *s, int frame_num) avio_rl32(pb); - if (index_type && longs_pre_entry != 2) + if (index_type && longs_per_entry != 2) return AVERROR_INVALIDDATA; if (index_type > 1) return AVERROR_INVALIDDATA; @@ -253,7 +253,7 @@ static int read_braindead_odml_indx(AVFormatContext *s, int frame_num) if (avio_seek(pb, offset + 8, SEEK_SET) < 0) return -1; avi->odml_depth++; - read_braindead_odml_indx(s, frame_num); + read_odml_index(s, frame_num); avi->odml_depth--; frame_num += duration; @@ -770,6 +770,10 @@ FF_ENABLE_DEPRECATION_WARNINGS st->codecpar->extradata_size = esize - 10 * 4; } else st->codecpar->extradata_size = size - 10 * 4; + if (st->codecpar->extradata) { + av_log(s, AV_LOG_WARNING, "New extradata in strf chunk, freeing previous one.\n"); + av_freep(&st->codecpar->extradata); + } if (ff_get_extradata(s, st->codecpar, pb, st->codecpar->extradata_size) < 0) return AVERROR(ENOMEM); } @@ -925,6 +929,10 @@ FF_ENABLE_DEPRECATION_WARNINGS st = s->streams[stream_index]; if (size<(1<<30)) { + if (st->codecpar->extradata) { + av_log(s, AV_LOG_WARNING, "New extradata in strd chunk, freeing previous one.\n"); + av_freep(&st->codecpar->extradata); + } if (ff_get_extradata(s, st->codecpar, pb, size) < 0) return AVERROR(ENOMEM); } @@ -942,7 +950,7 @@ FF_ENABLE_DEPRECATION_WARNINGS pos = avio_tell(pb); if (pb->seekable && !(s->flags & AVFMT_FLAG_IGNIDX) && avi->use_odml && - read_braindead_odml_indx(s, 0) < 0 && + read_odml_index(s, 0) < 0 && (s->error_recognition & AV_EF_EXPLODE)) goto fail; avio_seek(pb, pos + size, SEEK_SET); @@ -1203,7 +1211,8 @@ start_sync: if ((d[0] == 'i' && d[1] == 'x' && n < s->nb_streams) || // parse JUNK (d[0] == 'J' && d[1] == 'U' && d[2] == 'N' && d[3] == 'K') || - (d[0] == 'i' && d[1] == 'd' && d[2] == 'x' && d[3] == '1')) { + (d[0] == 'i' && d[1] == 'd' && d[2] == 'x' && d[3] == '1') || + (d[0] == 'i' && d[1] == 'n' && d[2] == 'd' && d[3] == 'x')) { avio_skip(pb, size); goto start_sync; }