diff --git a/libavcodec/mpegaudiodec_template.c b/libavcodec/mpegaudiodec_template.c index 1cc5ac47f4..9081a3ca94 100644 --- a/libavcodec/mpegaudiodec_template.c +++ b/libavcodec/mpegaudiodec_template.c @@ -1686,7 +1686,7 @@ static int decode_frame(AVCodecContext * avctx, void *data, int *got_frame_ptr, if (!avctx->bit_rate) avctx->bit_rate = s->bit_rate; - if (s->frame_size <= 0 || s->frame_size > buf_size) { + if (s->frame_size <= 0) { av_log(avctx, AV_LOG_ERROR, "incomplete frame\n"); return AVERROR_INVALIDDATA; } else if (s->frame_size < buf_size) { diff --git a/libavformat/mov.c b/libavformat/mov.c index 5ea6932801..47628165fd 100644 --- a/libavformat/mov.c +++ b/libavformat/mov.c @@ -1669,6 +1669,15 @@ static void mov_parse_stsd_audio(MOVContext *c, AVIOContext *pb, ff_mov_get_lpcm_codec_id(st->codec->bits_per_coded_sample, flags); } + if (version == 0 || (version == 1 && sc->audio_cid != -2)) { + /* can't correctly handle variable sized packet as audio unit */ + switch (st->codec->codec_id) { + case AV_CODEC_ID_MP2: + case AV_CODEC_ID_MP3: + st->need_parsing = AVSTREAM_PARSE_FULL; + break; + } + } } switch (st->codec->codec_id) { @@ -1889,7 +1898,6 @@ static int mov_finalize_stsd_codec(MOVContext *c, AVIOContext *pb, case AV_CODEC_ID_MP3: /* force type after stsd for m1a hdlr */ st->codec->codec_type = AVMEDIA_TYPE_AUDIO; - st->need_parsing = AVSTREAM_PARSE_FULL; break; case AV_CODEC_ID_GSM: case AV_CODEC_ID_ADPCM_MS: diff --git a/tests/fate/mp3.mak b/tests/fate/mp3.mak index 57ee08414b..a7b46c0969 100644 --- a/tests/fate/mp3.mak +++ b/tests/fate/mp3.mak @@ -1,6 +1,6 @@ FATE_MP3 += fate-mp3-float-conf-compl fate-mp3-float-conf-compl: CMD = pcm -acodec mp3float -i $(TARGET_SAMPLES)/mp3-conformance/compl.bit -fate-mp3-float-conf-compl: REF = $(SAMPLES)/mp3-conformance/compl.pcm +fate-mp3-float-conf-compl: REF = $(SAMPLES)/mp3-conformance/compl_2.pcm FATE_MP3 += fate-mp3-float-conf-he_32khz fate-mp3-float-conf-he_32khz: CMD = pcm -acodec mp3float -i $(TARGET_SAMPLES)/mp3-conformance/he_32khz.bit -fs 343296