00001 /* 00002 * RAW AC-3 and E-AC-3 demuxer 00003 * Copyright (c) 2007 Justin Ruggles <justin.ruggles@gmail.com> 00004 * 00005 * This file is part of FFmpeg. 00006 * 00007 * FFmpeg is free software; you can redistribute it and/or 00008 * modify it under the terms of the GNU Lesser General Public 00009 * License as published by the Free Software Foundation; either 00010 * version 2.1 of the License, or (at your option) any later version. 00011 * 00012 * FFmpeg is distributed in the hope that it will be useful, 00013 * but WITHOUT ANY WARRANTY; without even the implied warranty of 00014 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 00015 * Lesser General Public License for more details. 00016 * 00017 * You should have received a copy of the GNU Lesser General Public 00018 * License along with FFmpeg; if not, write to the Free Software 00019 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 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 buf2 = buf; 00041 00042 for(frames = 0; buf2 < end; frames++) { 00043 if(!memcmp(buf2, "\x1\x100円0円0円0円0円0円", 8)) 00044 buf2+=16; 00045 init_get_bits(&gbc, buf2, 54); 00046 if(ff_ac3_parse_header(&gbc, &hdr) < 0) 00047 break; 00048 if(buf2 + hdr.frame_size > end || 00049 av_crc(av_crc_get_table(AV_CRC_16_ANSI), 0, buf2 + 2, hdr.frame_size - 2)) 00050 break; 00051 if (hdr.bitstream_id > 10) 00052 codec_id = CODEC_ID_EAC3; 00053 buf2 += hdr.frame_size; 00054 } 00055 max_frames = FFMAX(max_frames, frames); 00056 if(buf == p->buf) 00057 first_frames = frames; 00058 } 00059 if(codec_id != expected_codec_id) return 0; 00060 // keep this in sync with mp3 probe, both need to avoid 00061 // issues with MPEG-files! 00062 if (first_frames>=4) return AVPROBE_SCORE_MAX/2+1; 00063 else if(max_frames>500)return AVPROBE_SCORE_MAX/2; 00064 else if(max_frames>=4) return AVPROBE_SCORE_MAX/4; 00065 else if(max_frames>=1) return 1; 00066 else return 0; 00067 } 00068 00069 #if CONFIG_AC3_DEMUXER 00070 static int ac3_probe(AVProbeData *p) 00071 { 00072 return ac3_eac3_probe(p, CODEC_ID_AC3); 00073 } 00074 00075 AVInputFormat ff_ac3_demuxer = { 00076 "ac3", 00077 NULL_IF_CONFIG_SMALL("raw AC-3"), 00078 0, 00079 ac3_probe, 00080 ff_raw_audio_read_header, 00081 ff_raw_read_partial_packet, 00082 .flags= AVFMT_GENERIC_INDEX, 00083 .extensions = "ac3", 00084 .value = CODEC_ID_AC3, 00085 }; 00086 #endif 00087 00088 #if CONFIG_EAC3_DEMUXER 00089 static int eac3_probe(AVProbeData *p) 00090 { 00091 return ac3_eac3_probe(p, CODEC_ID_EAC3); 00092 } 00093 00094 AVInputFormat ff_eac3_demuxer = { 00095 "eac3", 00096 NULL_IF_CONFIG_SMALL("raw E-AC-3"), 00097 0, 00098 eac3_probe, 00099 ff_raw_audio_read_header, 00100 ff_raw_read_partial_packet, 00101 .flags= AVFMT_GENERIC_INDEX, 00102 .extensions = "eac3", 00103 .value = CODEC_ID_EAC3, 00104 }; 00105 #endif