|
|
|
@ -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; |
|
|
|
|