diff --git a/libavformat/ac3dec.c b/libavformat/ac3dec.c index 74df0d2f44..a11a36e582 100644 --- a/libavformat/ac3dec.c +++ b/libavformat/ac3dec.c @@ -37,18 +37,36 @@ static int ac3_eac3_probe(AVProbeData *p, enum AVCodecID expected_codec_id) end = buf + p->buf_size; for(; buf < end; buf++) { - if(buf > p->buf && (buf[0] != 0x0B || buf[1] != 0x77) ) + if(buf > p->buf && !(buf[0] == 0x0B && buf[1] == 0x77) + && !(buf[0] == 0x77 && buf[1] == 0x0B) ) continue; buf2 = buf; for(frames = 0; buf2 < end; frames++) { + uint8_t buf3[4096]; + int i; if(!memcmp(buf2, "\x1\x10\0\0\0\0\0\0", 8)) buf2+=16; - init_get_bits(&gbc, buf2, 54); + if (buf[0] == 0x77 && buf[1] == 0x0B) { + for(i=0; i<8; i+=2) { + buf3[i ] = buf[i+1]; + buf3[i+1] = buf[i ]; + } + init_get_bits(&gbc, buf3, 54); + }else + init_get_bits(&gbc, buf2, 54); if(avpriv_ac3_parse_header(&gbc, &hdr) < 0) break; - if(buf2 + hdr.frame_size > end || - av_crc(av_crc_get_table(AV_CRC_16_ANSI), 0, buf2 + 2, hdr.frame_size - 2)) + if(buf2 + hdr.frame_size > end) + break; + if (buf[0] == 0x77 && buf[1] == 0x0B) { + av_assert0(hdr.frame_size <= sizeof(buf3)); + for(; i 10) codec_id = AV_CODEC_ID_EAC3;