ac3_probe: fix probing of non standard AC3
Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
This commit is contained in:
parent
4b9e44868b
commit
0c3a3b75d7
@ -37,18 +37,36 @@ static int ac3_eac3_probe(AVProbeData *p, enum AVCodecID expected_codec_id)
|
|||||||
end = buf + p->buf_size;
|
end = buf + p->buf_size;
|
||||||
|
|
||||||
for(; buf < end; buf++) {
|
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;
|
continue;
|
||||||
buf2 = buf;
|
buf2 = buf;
|
||||||
|
|
||||||
for(frames = 0; buf2 < end; frames++) {
|
for(frames = 0; buf2 < end; frames++) {
|
||||||
|
uint8_t buf3[4096];
|
||||||
|
int i;
|
||||||
if(!memcmp(buf2, "\x1\x10\0\0\0\0\0\0", 8))
|
if(!memcmp(buf2, "\x1\x10\0\0\0\0\0\0", 8))
|
||||||
buf2+=16;
|
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)
|
if(avpriv_ac3_parse_header(&gbc, &hdr) < 0)
|
||||||
break;
|
break;
|
||||||
if(buf2 + hdr.frame_size > end ||
|
if(buf2 + hdr.frame_size > end)
|
||||||
av_crc(av_crc_get_table(AV_CRC_16_ANSI), 0, buf2 + 2, hdr.frame_size - 2))
|
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;
|
break;
|
||||||
if (hdr.bitstream_id > 10)
|
if (hdr.bitstream_id > 10)
|
||||||
codec_id = AV_CODEC_ID_EAC3;
|
codec_id = AV_CODEC_ID_EAC3;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user