Libav 0.7.1
|
00001 /* 00002 * Audio and Video frame extraction 00003 * Copyright (c) 2003 Fabrice Bellard 00004 * Copyright (c) 2003 Michael Niedermayer 00005 * Copyright (c) 2009 Alex Converse 00006 * 00007 * This file is part of Libav. 00008 * 00009 * Libav is free software; you can redistribute it and/or 00010 * modify it under the terms of the GNU Lesser General Public 00011 * License as published by the Free Software Foundation; either 00012 * version 2.1 of the License, or (at your option) any later version. 00013 * 00014 * Libav is distributed in the hope that it will be useful, 00015 * but WITHOUT ANY WARRANTY; without even the implied warranty of 00016 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 00017 * Lesser General Public License for more details. 00018 * 00019 * You should have received a copy of the GNU Lesser General Public 00020 * License along with Libav; if not, write to the Free Software 00021 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 00022 */ 00023 00024 #include "aac_ac3_parser.h" 00025 #include "aacadtsdec.h" 00026 #include "get_bits.h" 00027 #include "mpeg4audio.h" 00028 00029 int ff_aac_parse_header(GetBitContext *gbc, AACADTSHeaderInfo *hdr) 00030 { 00031 int size, rdb, ch, sr; 00032 int aot, crc_abs; 00033 00034 if(get_bits(gbc, 12) != 0xfff) 00035 return AAC_AC3_PARSE_ERROR_SYNC; 00036 00037 skip_bits1(gbc); /* id */ 00038 skip_bits(gbc, 2); /* layer */ 00039 crc_abs = get_bits1(gbc); /* protection_absent */ 00040 aot = get_bits(gbc, 2); /* profile_objecttype */ 00041 sr = get_bits(gbc, 4); /* sample_frequency_index */ 00042 if(!ff_mpeg4audio_sample_rates[sr]) 00043 return AAC_AC3_PARSE_ERROR_SAMPLE_RATE; 00044 skip_bits1(gbc); /* private_bit */ 00045 ch = get_bits(gbc, 3); /* channel_configuration */ 00046 00047 skip_bits1(gbc); /* original/copy */ 00048 skip_bits1(gbc); /* home */ 00049 00050 /* adts_variable_header */ 00051 skip_bits1(gbc); /* copyright_identification_bit */ 00052 skip_bits1(gbc); /* copyright_identification_start */ 00053 size = get_bits(gbc, 13); /* aac_frame_length */ 00054 if(size < AAC_ADTS_HEADER_SIZE) 00055 return AAC_AC3_PARSE_ERROR_FRAME_SIZE; 00056 00057 skip_bits(gbc, 11); /* adts_buffer_fullness */ 00058 rdb = get_bits(gbc, 2); /* number_of_raw_data_blocks_in_frame */ 00059 00060 hdr->object_type = aot + 1; 00061 hdr->chan_config = ch; 00062 hdr->crc_absent = crc_abs; 00063 hdr->num_aac_frames = rdb + 1; 00064 hdr->sampling_index = sr; 00065 hdr->sample_rate = ff_mpeg4audio_sample_rates[sr]; 00066 hdr->samples = (rdb + 1) * 1024; 00067 hdr->bit_rate = size * 8 * hdr->sample_rate / hdr->samples; 00068 00069 return size; 00070 }