diff options
author | Michael Niedermayer <michaelni@gmx.at> | 2012-08-26 01:55:10 +0200 |
---|---|---|
committer | Michael Niedermayer <michaelni@gmx.at> | 2012-08-26 01:55:10 +0200 |
commit | 0c3a3b75d743602dfa207936862789e93327cfc7 (patch) | |
tree | 70e02810bc00aea15a8960e6500e379e886790a8 | |
parent | 4b9e44868b50f9325d2af11c0c2d9afb3c1ce7d8 (diff) | |
download | ffmpeg-0c3a3b75d743602dfa207936862789e93327cfc7.tar.gz |
ac3_probe: fix probing of non standard AC3
Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
-rw-r--r-- | libavformat/ac3dec.c | 26 |
1 files changed, 22 insertions, 4 deletions
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<hdr.frame_size; i+=2) { + buf3[i ] = buf[i+1]; + buf3[i+1] = buf[i ]; + } + } + if(av_crc(av_crc_get_table(AV_CRC_16_ANSI), 0, gbc.buffer + 2, hdr.frame_size - 2)) break; if (hdr.bitstream_id > 10) codec_id = AV_CODEC_ID_EAC3; |