00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #include "libavutil/crc.h"
00023 #include "libavcodec/ac3_parser.h"
00024 #include "avformat.h"
00025 #include "rawdec.h"
00026
00027 static int ac3_eac3_probe(AVProbeData *p, enum CodecID expected_codec_id)
00028 {
00029 int max_frames, first_frames = 0, frames;
00030 uint8_t *buf, *buf2, *end;
00031 AC3HeaderInfo hdr;
00032 GetBitContext gbc;
00033 enum CodecID codec_id = CODEC_ID_AC3;
00034
00035 max_frames = 0;
00036 buf = p->buf;
00037 end = buf + p->buf_size;
00038
00039 for(; buf < end; buf++) {
00040 if(buf > p->buf && (buf[0] != 0x0B || buf[1] != 0x77) )
00041 continue;
00042 buf2 = buf;
00043
00044 for(frames = 0; buf2 < end; frames++) {
00045 if(!memcmp(buf2, "\x1\x10\0\0\0\0\0\0", 8))
00046 buf2+=16;
00047 init_get_bits(&gbc, buf2, 54);
00048 if(avpriv_ac3_parse_header(&gbc, &hdr) < 0)
00049 break;
00050 if(buf2 + hdr.frame_size > end ||
00051 av_crc(av_crc_get_table(AV_CRC_16_ANSI), 0, buf2 + 2, hdr.frame_size - 2))
00052 break;
00053 if (hdr.bitstream_id > 10)
00054 codec_id = CODEC_ID_EAC3;
00055 buf2 += hdr.frame_size;
00056 }
00057 max_frames = FFMAX(max_frames, frames);
00058 if(buf == p->buf)
00059 first_frames = frames;
00060 }
00061 if(codec_id != expected_codec_id) return 0;
00062
00063
00064 if (first_frames>=4) return AVPROBE_SCORE_MAX/2+1;
00065 else if(max_frames>200)return AVPROBE_SCORE_MAX/2;
00066 else if(max_frames>=4) return AVPROBE_SCORE_MAX/4;
00067 else if(max_frames>=1) return 1;
00068 else return 0;
00069 }
00070
00071 #if CONFIG_AC3_DEMUXER
00072 static int ac3_probe(AVProbeData *p)
00073 {
00074 return ac3_eac3_probe(p, CODEC_ID_AC3);
00075 }
00076
00077 AVInputFormat ff_ac3_demuxer = {
00078 .name = "ac3",
00079 .long_name = NULL_IF_CONFIG_SMALL("raw AC-3"),
00080 .read_probe = ac3_probe,
00081 .read_header = ff_raw_audio_read_header,
00082 .read_packet = ff_raw_read_partial_packet,
00083 .flags= AVFMT_GENERIC_INDEX,
00084 .extensions = "ac3",
00085 .raw_codec_id = CODEC_ID_AC3,
00086 };
00087 #endif
00088
00089 #if CONFIG_EAC3_DEMUXER
00090 static int eac3_probe(AVProbeData *p)
00091 {
00092 return ac3_eac3_probe(p, CODEC_ID_EAC3);
00093 }
00094
00095 AVInputFormat ff_eac3_demuxer = {
00096 .name = "eac3",
00097 .long_name = NULL_IF_CONFIG_SMALL("raw E-AC-3"),
00098 .read_probe = eac3_probe,
00099 .read_header = ff_raw_audio_read_header,
00100 .read_packet = ff_raw_read_partial_packet,
00101 .flags = AVFMT_GENERIC_INDEX,
00102 .extensions = "eac3",
00103 .raw_codec_id = CODEC_ID_EAC3,
00104 };
00105 #endif