3 * Copyright (c) 2003 Fabrice Bellard.
4 * Copyright (c) 2003 Michael Niedermayer.
6 * This file is part of FFmpeg.
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.
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.
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
24 #include "ac3_parser.h"
25 #include "aac_ac3_parser.h"
26 #include "bitstream.h"
29 #define AC3_HEADER_SIZE 7
32 static const uint8_t eac3_blocks
[4] = {
37 * Table for center mix levels
38 * reference: Section 5.4.2.4 cmixlev
40 static const uint8_t center_levels
[4] = { 2, 3, 4, 3 };
43 * Table for surround mix levels
44 * reference: Section 5.4.2.5 surmixlev
46 static const uint8_t surround_levels
[4] = { 2, 4, 0, 4 };
49 int ff_ac3_parse_header(GetBitContext
*gbc
, AC3HeaderInfo
*hdr
)
54 memset(hdr
, 0, sizeof(*hdr
));
56 hdr
->sync_word
= get_bits(gbc
, 16);
57 if(hdr
->sync_word
!= 0x0B77)
58 return AC3_PARSE_ERROR_SYNC
;
60 /* read ahead to bsid to distinguish between AC-3 and E-AC-3 */
61 hdr
->bitstream_id
= show_bits_long(gbc
, 29) & 0x1F;
62 if(hdr
->bitstream_id
> 16)
63 return AC3_PARSE_ERROR_BSID
;
65 if(hdr
->bitstream_id
<= 10) {
67 hdr
->crc1
= get_bits(gbc
, 16);
68 hdr
->sr_code
= get_bits(gbc
, 2);
70 return AC3_PARSE_ERROR_SAMPLE_RATE
;
72 frame_size_code
= get_bits(gbc
, 6);
73 if(frame_size_code
> 37)
74 return AC3_PARSE_ERROR_FRAME_SIZE
;
76 skip_bits(gbc
, 5); // skip bsid, already got it
78 skip_bits(gbc
, 3); // skip bitstream mode
79 hdr
->channel_mode
= get_bits(gbc
, 3);
81 /* set default mix levels */
82 hdr
->center_mix_level
= 3; // -4.5dB
83 hdr
->surround_mix_level
= 4; // -6.0dB
85 if(hdr
->channel_mode
== AC3_CHMODE_STEREO
) {
86 skip_bits(gbc
, 2); // skip dsurmod
88 if((hdr
->channel_mode
& 1) && hdr
->channel_mode
!= AC3_CHMODE_MONO
)
89 hdr
->center_mix_level
= center_levels
[get_bits(gbc
, 2)];
90 if(hdr
->channel_mode
& 4)
91 hdr
->surround_mix_level
= surround_levels
[get_bits(gbc
, 2)];
93 hdr
->lfe_on
= get_bits1(gbc
);
95 hdr
->sr_shift
= FFMAX(hdr
->bitstream_id
, 8) - 8;
96 hdr
->sample_rate
= ff_ac3_sample_rate_tab
[hdr
->sr_code
] >> hdr
->sr_shift
;
97 hdr
->bit_rate
= (ff_ac3_bitrate_tab
[frame_size_code
>>1] * 1000) >> hdr
->sr_shift
;
98 hdr
->channels
= ff_ac3_channels_tab
[hdr
->channel_mode
] + hdr
->lfe_on
;
99 hdr
->frame_size
= ff_ac3_frame_size_tab
[frame_size_code
][hdr
->sr_code
] * 2;
100 hdr
->frame_type
= EAC3_FRAME_TYPE_AC3_CONVERT
; //EAC3_FRAME_TYPE_INDEPENDENT;
104 hdr
->frame_type
= get_bits(gbc
, 2);
105 if(hdr
->frame_type
== EAC3_FRAME_TYPE_RESERVED
)
106 return AC3_PARSE_ERROR_FRAME_TYPE
;
108 skip_bits(gbc
, 3); // skip substream id
110 hdr
->frame_size
= (get_bits(gbc
, 11) + 1) << 1;
111 if(hdr
->frame_size
< AC3_HEADER_SIZE
)
112 return AC3_PARSE_ERROR_FRAME_SIZE
;
114 hdr
->sr_code
= get_bits(gbc
, 2);
115 if (hdr
->sr_code
== 3) {
116 int sr_code2
= get_bits(gbc
, 2);
118 return AC3_PARSE_ERROR_SAMPLE_RATE
;
119 hdr
->sample_rate
= ff_ac3_sample_rate_tab
[sr_code2
] / 2;
123 num_blocks
= eac3_blocks
[get_bits(gbc
, 2)];
124 hdr
->sample_rate
= ff_ac3_sample_rate_tab
[hdr
->sr_code
];
128 hdr
->channel_mode
= get_bits(gbc
, 3);
129 hdr
->lfe_on
= get_bits1(gbc
);
131 hdr
->bit_rate
= (uint32_t)(8.0 * hdr
->frame_size
* hdr
->sample_rate
/
132 (num_blocks
* 256.0));
133 hdr
->channels
= ff_ac3_channels_tab
[hdr
->channel_mode
] + hdr
->lfe_on
;
139 int ff_ac3_parse_header_full(GetBitContext
*gbc
, AC3HeaderInfo
*hdr
){
141 ret
= ff_ac3_parse_header(gbc
, hdr
);
143 if(hdr
->bitstream_id
>10){
145 skip_bits(gbc
, 5); // skip bitstream id
147 /* skip dialog normalization and compression gain */
148 for (i
= 0; i
< (hdr
->channel_mode
? 1 : 2); i
++) {
149 skip_bits(gbc
, 5); // skip dialog normalization
150 if (get_bits1(gbc
)) {
151 skip_bits(gbc
, 8); //skip Compression gain word
154 /* dependent stream channel map */
155 if (hdr
->frame_type
== EAC3_FRAME_TYPE_DEPENDENT
&& get_bits1(gbc
)) {
156 hdr
->channel_map
= get_bits(gbc
, 16); //custom channel map
160 //default channel map based on acmod and lfeon
161 hdr
->channel_map
= ff_eac3_default_chmap
[hdr
->channel_mode
];
163 hdr
->channel_map
|= AC3_CHMAP_LFE
;
168 static int ac3_sync(uint64_t state
, AACAC3ParseContext
*hdr_info
,
169 int *need_next_header
, int *new_frame_start
)
172 uint64_t tmp
= be2me_64(state
);
176 init_get_bits(&gbc
, ((uint8_t *)&tmp
)+8-AC3_HEADER_SIZE
, 54);
177 err
= ff_ac3_parse_header(&gbc
, &hdr
);
182 hdr_info
->sample_rate
= hdr
.sample_rate
;
183 hdr_info
->bit_rate
= hdr
.bit_rate
;
184 hdr_info
->channels
= hdr
.channels
;
185 hdr_info
->samples
= AC3_FRAME_SIZE
;
187 *need_next_header
= (hdr
.frame_type
!= EAC3_FRAME_TYPE_AC3_CONVERT
);
188 *new_frame_start
= (hdr
.frame_type
!= EAC3_FRAME_TYPE_DEPENDENT
);
189 return hdr
.frame_size
;
192 static av_cold
int ac3_parse_init(AVCodecParserContext
*s1
)
194 AACAC3ParseContext
*s
= s1
->priv_data
;
195 s
->header_size
= AC3_HEADER_SIZE
;
201 AVCodecParser ac3_parser
= {
203 sizeof(AACAC3ParseContext
),