1/* 2 * AC-3 parser 3 * Copyright (c) 2003 Fabrice Bellard 4 * Copyright (c) 2003 Michael Niedermayer 5 * 6 * This file is part of FFmpeg. 7 * 8 * FFmpeg is free software; you can redistribute it and/or 9 * modify it under the terms of the GNU Lesser General Public 10 * License as published by the Free Software Foundation; either 11 * version 2.1 of the License, or (at your option) any later version. 12 * 13 * FFmpeg is distributed in the hope that it will be useful, 14 * but WITHOUT ANY WARRANTY; without even the implied warranty of 15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 16 * Lesser General Public License for more details. 17 * 18 * You should have received a copy of the GNU Lesser General Public 19 * License along with FFmpeg; if not, write to the Free Software 20 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 21 */ 22 23#include "libavutil/channel_layout.h" 24#include "parser.h" 25#include "ac3_parser.h" 26#include "aac_ac3_parser.h" 27#include "get_bits.h" 28 29 30#define AC3_HEADER_SIZE 7 31 32 33static const uint8_t eac3_blocks[4] = { 34 1, 2, 3, 6 35}; 36 37/** 38 * Table for center mix levels 39 * reference: Section 5.4.2.4 cmixlev 40 */ 41static const uint8_t center_levels[4] = { 4, 5, 6, 5 }; 42 43/** 44 * Table for surround mix levels 45 * reference: Section 5.4.2.5 surmixlev 46 */ 47static const uint8_t surround_levels[4] = { 4, 6, 7, 6 }; 48 49 50int avpriv_ac3_parse_header2(GetBitContext *gbc, AC3HeaderInfo **phdr) 51{ 52 int frame_size_code; 53 AC3HeaderInfo *hdr; 54 55 if (!*phdr) 56 *phdr = av_mallocz(sizeof(AC3HeaderInfo)); 57 if (!*phdr) 58 return AVERROR(ENOMEM); 59 hdr = *phdr; 60 61 memset(hdr, 0, sizeof(*hdr)); 62 63 hdr->sync_word = get_bits(gbc, 16); 64 if(hdr->sync_word != 0x0B77) 65 return AAC_AC3_PARSE_ERROR_SYNC; 66 67 /* read ahead to bsid to distinguish between AC-3 and E-AC-3 */ 68 hdr->bitstream_id = show_bits_long(gbc, 29) & 0x1F; 69 if(hdr->bitstream_id > 16) 70 return AAC_AC3_PARSE_ERROR_BSID; 71 72 hdr->num_blocks = 6; 73 74 /* set default mix levels */ 75 hdr->center_mix_level = 5; // -4.5dB 76 hdr->surround_mix_level = 6; // -6.0dB 77 78 /* set default dolby surround mode */ 79 hdr->dolby_surround_mode = AC3_DSURMOD_NOTINDICATED; 80 81 if(hdr->bitstream_id <= 10) { 82 /* Normal AC-3 */ 83 hdr->crc1 = get_bits(gbc, 16); 84 hdr->sr_code = get_bits(gbc, 2); 85 if(hdr->sr_code == 3) 86 return AAC_AC3_PARSE_ERROR_SAMPLE_RATE; 87 88 frame_size_code = get_bits(gbc, 6); 89 if(frame_size_code > 37) 90 return AAC_AC3_PARSE_ERROR_FRAME_SIZE; 91 92 skip_bits(gbc, 5); // skip bsid, already got it 93 94 hdr->bitstream_mode = get_bits(gbc, 3); 95 hdr->channel_mode = get_bits(gbc, 3); 96 97 if(hdr->channel_mode == AC3_CHMODE_STEREO) { 98 hdr->dolby_surround_mode = get_bits(gbc, 2); 99 } else { 100 if((hdr->channel_mode & 1) && hdr->channel_mode != AC3_CHMODE_MONO) 101 hdr-> center_mix_level = center_levels[get_bits(gbc, 2)]; 102 if(hdr->channel_mode & 4) 103 hdr->surround_mix_level = surround_levels[get_bits(gbc, 2)]; 104 } 105 hdr->lfe_on = get_bits1(gbc); 106 107 hdr->sr_shift = FFMAX(hdr->bitstream_id, 8) - 8; 108 hdr->sample_rate = ff_ac3_sample_rate_tab[hdr->sr_code] >> hdr->sr_shift; 109 hdr->bit_rate = (ff_ac3_bitrate_tab[frame_size_code>>1] * 1000) >> hdr->sr_shift; 110 hdr->channels = ff_ac3_channels_tab[hdr->channel_mode] + hdr->lfe_on; 111 hdr->frame_size = ff_ac3_frame_size_tab[frame_size_code][hdr->sr_code] * 2; 112 hdr->frame_type = EAC3_FRAME_TYPE_AC3_CONVERT; //EAC3_FRAME_TYPE_INDEPENDENT; 113 hdr->substreamid = 0; 114 } else { 115 /* Enhanced AC-3 */ 116 hdr->crc1 = 0; 117 hdr->frame_type = get_bits(gbc, 2); 118 if(hdr->frame_type == EAC3_FRAME_TYPE_RESERVED) 119 return AAC_AC3_PARSE_ERROR_FRAME_TYPE; 120 121 hdr->substreamid = get_bits(gbc, 3); 122 123 hdr->frame_size = (get_bits(gbc, 11) + 1) << 1; 124 if(hdr->frame_size < AC3_HEADER_SIZE) 125 return AAC_AC3_PARSE_ERROR_FRAME_SIZE; 126 127 hdr->sr_code = get_bits(gbc, 2); 128 if (hdr->sr_code == 3) { 129 int sr_code2 = get_bits(gbc, 2); 130 if(sr_code2 == 3) 131 return AAC_AC3_PARSE_ERROR_SAMPLE_RATE; 132 hdr->sample_rate = ff_ac3_sample_rate_tab[sr_code2] / 2; 133 hdr->sr_shift = 1; 134 } else { 135 hdr->num_blocks = eac3_blocks[get_bits(gbc, 2)]; 136 hdr->sample_rate = ff_ac3_sample_rate_tab[hdr->sr_code]; 137 hdr->sr_shift = 0; 138 } 139 140 hdr->channel_mode = get_bits(gbc, 3); 141 hdr->lfe_on = get_bits1(gbc); 142 143 hdr->bit_rate = (uint32_t)(8.0 * hdr->frame_size * hdr->sample_rate / 144 (hdr->num_blocks * 256.0)); 145 hdr->channels = ff_ac3_channels_tab[hdr->channel_mode] + hdr->lfe_on; 146 } 147 hdr->channel_layout = avpriv_ac3_channel_layout_tab[hdr->channel_mode]; 148 if (hdr->lfe_on) 149 hdr->channel_layout |= AV_CH_LOW_FREQUENCY; 150 151 return 0; 152} 153 154int avpriv_ac3_parse_header(GetBitContext *gbc, AC3HeaderInfo *hdr) 155{ 156 AC3HeaderInfo tmp, *ptmp = &tmp; 157 int ret = avpriv_ac3_parse_header2(gbc, &ptmp); 158 159 memcpy(hdr, ptmp, ((intptr_t)&tmp.channel_layout) - ((intptr_t)&tmp) + sizeof(uint64_t)); 160 return ret; 161} 162 163static int ac3_sync(uint64_t state, AACAC3ParseContext *hdr_info, 164 int *need_next_header, int *new_frame_start) 165{ 166 int err; 167 union { 168 uint64_t u64; 169 uint8_t u8[8 + FF_INPUT_BUFFER_PADDING_SIZE]; 170 } tmp = { av_be2ne64(state) }; 171 AC3HeaderInfo hdr, *phdr = &hdr; 172 GetBitContext gbc; 173 174 init_get_bits(&gbc, tmp.u8+8-AC3_HEADER_SIZE, 54); 175 err = avpriv_ac3_parse_header2(&gbc, &phdr); 176 177 if(err < 0) 178 return 0; 179 180 hdr_info->sample_rate = hdr.sample_rate; 181 hdr_info->bit_rate = hdr.bit_rate; 182 hdr_info->channels = hdr.channels; 183 hdr_info->channel_layout = hdr.channel_layout; 184 hdr_info->samples = hdr.num_blocks * 256; 185 hdr_info->service_type = hdr.bitstream_mode; 186 if (hdr.bitstream_mode == 0x7 && hdr.channels > 1) 187 hdr_info->service_type = AV_AUDIO_SERVICE_TYPE_KARAOKE; 188 if(hdr.bitstream_id>10) 189 hdr_info->codec_id = AV_CODEC_ID_EAC3; 190 else if (hdr_info->codec_id == AV_CODEC_ID_NONE) 191 hdr_info->codec_id = AV_CODEC_ID_AC3; 192 193 *need_next_header = (hdr.frame_type != EAC3_FRAME_TYPE_AC3_CONVERT); 194 *new_frame_start = (hdr.frame_type != EAC3_FRAME_TYPE_DEPENDENT); 195 return hdr.frame_size; 196} 197 198static av_cold int ac3_parse_init(AVCodecParserContext *s1) 199{ 200 AACAC3ParseContext *s = s1->priv_data; 201 s->header_size = AC3_HEADER_SIZE; 202 s->sync = ac3_sync; 203 return 0; 204} 205 206 207AVCodecParser ff_ac3_parser = { 208 .codec_ids = { AV_CODEC_ID_AC3, AV_CODEC_ID_EAC3 }, 209 .priv_data_size = sizeof(AACAC3ParseContext), 210 .parser_init = ac3_parse_init, 211 .parser_parse = ff_aac_ac3_parse, 212 .parser_close = ff_parse_close, 213}; 214