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
23 #include "config_components.h"
25 #include "libavutil/channel_layout.h"
26 #include "libavutil/mem.h"
30 #include "ac3_parser.h"
31 #include "ac3_parser_internal.h"
32 #include "aac_ac3_parser.h"
34 #include "parser_internal.h"
37 #define AC3_HEADER_SIZE 7
41 static const uint8_t eac3_blocks
[4] = {
46 * Table for center mix levels
47 * reference: Section 5.4.2.4 cmixlev
49 static const uint8_t center_levels
[4] = { 4, 5, 6, 5 };
52 * Table for surround mix levels
53 * reference: Section 5.4.2.5 surmixlev
55 static const uint8_t surround_levels
[4] = { 4, 6, 7, 6 };
57 int ff_ac3_find_syncword(const uint8_t *buf
, int buf_size
)
61 for (i
= 1; i
< buf_size
; i
+= 2) {
62 if (buf
[i
] == 0x77 || buf
[i
] == 0x0B) {
63 if ((buf
[i
] ^ buf
[i
-1]) == (0x77 ^ 0x0B)) {
66 } else if ((buf
[i
] ^ buf
[i
+1]) == (0x77 ^ 0x0B)) {
72 return AVERROR_INVALIDDATA
;
78 * Parse the 'sync info' and 'bit stream info' from the AC-3 bitstream.
79 * GetBitContext within AC3DecodeContext must point to
80 * the start of the synchronized AC-3 bitstream.
82 static int ac3_parse_header(GetBitContext
*gbc
, AC3HeaderInfo
*hdr
)
84 /* read the rest of the bsi. read twice for dual mono mode. */
85 for (int i
= 0; i
< (hdr
->channel_mode
? 1 : 2); i
++) {
86 hdr
->dialog_normalization
[i
] = -get_bits(gbc
, 5);
87 hdr
->compression_exists
[i
] = get_bits1(gbc
);
88 if (hdr
->compression_exists
[i
])
89 hdr
->heavy_dynamic_range
[i
] = get_bits(gbc
, 8);
91 skip_bits(gbc
, 8); //skip language code
93 skip_bits(gbc
, 7); //skip audio production information
96 skip_bits(gbc
, 2); //skip copyright bit and original bitstream bit
98 /* skip the timecodes or parse the Alternate Bit Stream Syntax */
99 if (hdr
->bitstream_id
!= 6) {
101 skip_bits(gbc
, 14); //skip timecode1
103 skip_bits(gbc
, 14); //skip timecode2
105 if (get_bits1(gbc
)) {
106 hdr
->preferred_downmix
= get_bits(gbc
, 2);
107 hdr
->center_mix_level_ltrt
= get_bits(gbc
, 3);
108 hdr
->surround_mix_level_ltrt
= av_clip(get_bits(gbc
, 3), 3, 7);
109 hdr
->center_mix_level
= get_bits(gbc
, 3);
110 hdr
->surround_mix_level
= av_clip(get_bits(gbc
, 3), 3, 7);
112 if (get_bits1(gbc
)) {
113 hdr
->dolby_surround_ex_mode
= get_bits(gbc
, 2);
114 hdr
->dolby_headphone_mode
= get_bits(gbc
, 2);
115 skip_bits(gbc
, 10); // skip adconvtyp (1), xbsi2 (8), encinfo (1)
119 /* skip additional bitstream info */
120 if (get_bits1(gbc
)) {
121 int i
= get_bits(gbc
, 6);
130 static int eac3_parse_header(GetBitContext
*gbc
, AC3HeaderInfo
*hdr
)
132 if (hdr
->frame_type
== EAC3_FRAME_TYPE_RESERVED
)
133 return AC3_PARSE_ERROR_FRAME_TYPE
;
134 if (hdr
->substreamid
)
135 return AC3_PARSE_ERROR_FRAME_TYPE
;
137 skip_bits(gbc
, 5); // skip bitstream id
139 /* volume control params */
140 for (int i
= 0; i
< (hdr
->channel_mode
? 1 : 2); i
++) {
141 hdr
->dialog_normalization
[i
] = -get_bits(gbc
, 5);
142 hdr
->compression_exists
[i
] = get_bits1(gbc
);
143 if (hdr
->compression_exists
[i
])
144 hdr
->heavy_dynamic_range
[i
] = get_bits(gbc
, 8);
147 /* dependent stream channel map */
148 if (hdr
->frame_type
== EAC3_FRAME_TYPE_DEPENDENT
) {
149 hdr
->channel_map_present
= get_bits1(gbc
);
150 if (hdr
->channel_map_present
) {
151 int64_t channel_layout
= 0;
152 int channel_map
= get_bits(gbc
, 16);
154 for (int i
= 0; i
< 16; i
++)
155 if (channel_map
& (1 << (EAC3_MAX_CHANNELS
- i
- 1)))
156 channel_layout
|= ff_eac3_custom_channel_map_locations
[i
][1];
158 if (av_popcount64(channel_layout
) > EAC3_MAX_CHANNELS
) {
159 return AC3_PARSE_ERROR_CHANNEL_MAP
;
161 hdr
->channel_map
= channel_map
;
165 /* mixing metadata */
166 if (get_bits1(gbc
)) {
167 /* center and surround mix levels */
168 if (hdr
->channel_mode
> AC3_CHMODE_STEREO
) {
169 hdr
->preferred_downmix
= get_bits(gbc
, 2);
170 if (hdr
->channel_mode
& 1) {
171 /* if three front channels exist */
172 hdr
->center_mix_level_ltrt
= get_bits(gbc
, 3);
173 hdr
->center_mix_level
= get_bits(gbc
, 3);
175 if (hdr
->channel_mode
& 4) {
176 /* if a surround channel exists */
177 hdr
->surround_mix_level_ltrt
= av_clip(get_bits(gbc
, 3), 3, 7);
178 hdr
->surround_mix_level
= av_clip(get_bits(gbc
, 3), 3, 7);
183 if (hdr
->lfe_on
&& (hdr
->lfe_mix_level_exists
= get_bits1(gbc
))) {
184 hdr
->lfe_mix_level
= get_bits(gbc
, 5);
187 /* info for mixing with other streams and substreams */
188 if (hdr
->frame_type
== EAC3_FRAME_TYPE_INDEPENDENT
) {
189 for (int i
= 0; i
< (hdr
->channel_mode
? 1 : 2); i
++) {
190 // TODO: apply program scale factor
191 if (get_bits1(gbc
)) {
192 skip_bits(gbc
, 6); // skip program scale factor
195 if (get_bits1(gbc
)) {
196 skip_bits(gbc
, 6); // skip external program scale factor
198 /* skip mixing parameter data */
199 switch(get_bits(gbc
, 2)) {
200 case 1: skip_bits(gbc
, 5); break;
201 case 2: skip_bits(gbc
, 12); break;
203 int mix_data_size
= (get_bits(gbc
, 5) + 2) << 3;
204 skip_bits_long(gbc
, mix_data_size
);
208 /* skip pan information for mono or dual mono source */
209 if (hdr
->channel_mode
< AC3_CHMODE_STEREO
) {
210 for (int i
= 0; i
< (hdr
->channel_mode
? 1 : 2); i
++) {
211 if (get_bits1(gbc
)) {
212 /* note: this is not in the ATSC A/52B specification
213 reference: ETSI TS 102 366 V1.1.1
214 section: E.1.3.1.25 */
215 skip_bits(gbc
, 8); // skip pan mean direction index
216 skip_bits(gbc
, 6); // skip reserved paninfo bits
220 /* skip mixing configuration information */
221 if (get_bits1(gbc
)) {
222 for (int i
= 0; i
< hdr
->num_blocks
; i
++) {
223 if (hdr
->num_blocks
== 1 || get_bits1(gbc
)) {
231 /* informational metadata */
232 if (get_bits1(gbc
)) {
233 hdr
->bitstream_mode
= get_bits(gbc
, 3);
234 skip_bits(gbc
, 2); // skip copyright bit and original bitstream bit
235 if (hdr
->channel_mode
== AC3_CHMODE_STEREO
) {
236 hdr
->dolby_surround_mode
= get_bits(gbc
, 2);
237 hdr
->dolby_headphone_mode
= get_bits(gbc
, 2);
239 if (hdr
->channel_mode
>= AC3_CHMODE_2F2R
) {
240 hdr
->dolby_surround_ex_mode
= get_bits(gbc
, 2);
242 for (int i
= 0; i
< (hdr
->channel_mode
? 1 : 2); i
++) {
243 if (get_bits1(gbc
)) {
244 skip_bits(gbc
, 8); // skip mix level, room type, and A/D converter type
247 if (hdr
->sr_code
!= EAC3_SR_CODE_REDUCED
) {
248 skip_bits1(gbc
); // skip source sample rate code
252 /* converter synchronization flag
253 If frames are less than six blocks, this bit should be turned on
254 once every 6 blocks to indicate the start of a frame set.
255 reference: RFC 4598, Section 2.1.3 Frame Sets */
256 if (hdr
->frame_type
== EAC3_FRAME_TYPE_INDEPENDENT
&& hdr
->num_blocks
!= 6) {
257 skip_bits1(gbc
); // skip converter synchronization flag
260 /* original frame size code if this stream was converted from AC-3 */
261 if (hdr
->frame_type
== EAC3_FRAME_TYPE_AC3_CONVERT
&&
262 (hdr
->num_blocks
== 6 || get_bits1(gbc
))) {
263 skip_bits(gbc
, 6); // skip frame size code
266 /* additional bitstream info */
267 if (get_bits1(gbc
)) {
268 int addbsil
= get_bits(gbc
, 6);
269 for (int i
= 0; i
< addbsil
+ 1; i
++) {
271 /* In this 8 bit chunk, the LSB is equal to flag_ec3_extension_type_a
272 which can be used to detect Atmos presence */
274 hdr
->eac3_extension_type_a
= get_bits1(gbc
);
275 if (hdr
->eac3_extension_type_a
) {
276 hdr
->complexity_index_type_a
= get_bits(gbc
, 8);
280 skip_bits(gbc
, 8); // skip additional bit stream info
288 int ff_ac3_parse_header(GetBitContext
*gbc
, AC3HeaderInfo
*hdr
)
292 memset(hdr
, 0, sizeof(*hdr
));
294 hdr
->sync_word
= get_bits(gbc
, 16);
295 if(hdr
->sync_word
!= 0x0B77)
296 return AC3_PARSE_ERROR_SYNC
;
298 /* read ahead to bsid to distinguish between AC-3 and E-AC-3 */
299 hdr
->bitstream_id
= show_bits_long(gbc
, 29) & 0x1F;
300 if(hdr
->bitstream_id
> 16)
301 return AC3_PARSE_ERROR_BSID
;
304 hdr
->ac3_bit_rate_code
= -1;
306 /* set default mix levels */
307 hdr
->center_mix_level
= 5; // -4.5dB
308 hdr
->surround_mix_level
= 6; // -6.0dB
310 /* set default dolby surround mode */
311 hdr
->dolby_surround_mode
= AC3_DSURMOD_NOTINDICATED
;
313 if(hdr
->bitstream_id
<= 10) {
315 hdr
->crc1
= get_bits(gbc
, 16);
316 hdr
->sr_code
= get_bits(gbc
, 2);
317 if(hdr
->sr_code
== 3)
318 return AC3_PARSE_ERROR_SAMPLE_RATE
;
320 frame_size_code
= get_bits(gbc
, 6);
321 if(frame_size_code
> 37)
322 return AC3_PARSE_ERROR_FRAME_SIZE
;
324 hdr
->ac3_bit_rate_code
= (frame_size_code
>> 1);
326 skip_bits(gbc
, 5); // skip bsid, already got it
328 hdr
->bitstream_mode
= get_bits(gbc
, 3);
329 hdr
->channel_mode
= get_bits(gbc
, 3);
331 if(hdr
->channel_mode
== AC3_CHMODE_STEREO
) {
332 hdr
->dolby_surround_mode
= get_bits(gbc
, 2);
334 if((hdr
->channel_mode
& 1) && hdr
->channel_mode
!= AC3_CHMODE_MONO
)
335 hdr
-> center_mix_level
= center_levels
[get_bits(gbc
, 2)];
336 if(hdr
->channel_mode
& 4)
337 hdr
->surround_mix_level
= surround_levels
[get_bits(gbc
, 2)];
339 hdr
->lfe_on
= get_bits1(gbc
);
341 hdr
->sr_shift
= FFMAX(hdr
->bitstream_id
, 8) - 8;
342 hdr
->sample_rate
= ff_ac3_sample_rate_tab
[hdr
->sr_code
] >> hdr
->sr_shift
;
343 hdr
->bit_rate
= (ff_ac3_bitrate_tab
[hdr
->ac3_bit_rate_code
] * 1000) >> hdr
->sr_shift
;
344 hdr
->channels
= ff_ac3_channels_tab
[hdr
->channel_mode
] + hdr
->lfe_on
;
345 hdr
->frame_size
= ff_ac3_frame_size_tab
[frame_size_code
][hdr
->sr_code
] * 2;
346 hdr
->frame_type
= EAC3_FRAME_TYPE_AC3_CONVERT
; //EAC3_FRAME_TYPE_INDEPENDENT;
347 hdr
->substreamid
= 0;
349 int ret
= ac3_parse_header(gbc
, hdr
);
355 hdr
->frame_type
= get_bits(gbc
, 2);
356 if(hdr
->frame_type
== EAC3_FRAME_TYPE_RESERVED
)
357 return AC3_PARSE_ERROR_FRAME_TYPE
;
359 hdr
->substreamid
= get_bits(gbc
, 3);
361 hdr
->frame_size
= (get_bits(gbc
, 11) + 1) << 1;
362 if(hdr
->frame_size
< AC3_HEADER_SIZE
)
363 return AC3_PARSE_ERROR_FRAME_SIZE
;
365 hdr
->sr_code
= get_bits(gbc
, 2);
366 if (hdr
->sr_code
== 3) {
367 int sr_code2
= get_bits(gbc
, 2);
369 return AC3_PARSE_ERROR_SAMPLE_RATE
;
370 hdr
->sample_rate
= ff_ac3_sample_rate_tab
[sr_code2
] / 2;
373 hdr
->num_blocks
= eac3_blocks
[get_bits(gbc
, 2)];
374 hdr
->sample_rate
= ff_ac3_sample_rate_tab
[hdr
->sr_code
];
378 hdr
->channel_mode
= get_bits(gbc
, 3);
379 hdr
->lfe_on
= get_bits1(gbc
);
381 hdr
->bit_rate
= 8LL * hdr
->frame_size
* hdr
->sample_rate
/
382 (hdr
->num_blocks
* 256);
383 hdr
->channels
= ff_ac3_channels_tab
[hdr
->channel_mode
] + hdr
->lfe_on
;
385 int ret
= eac3_parse_header(gbc
, hdr
);
389 hdr
->channel_layout
= ff_ac3_channel_layout_tab
[hdr
->channel_mode
];
391 hdr
->channel_layout
|= AV_CH_LOW_FREQUENCY
;
396 // TODO: Better way to pass AC3HeaderInfo fields to mov muxer.
397 int avpriv_ac3_parse_header(AC3HeaderInfo
**phdr
, const uint8_t *buf
,
405 *phdr
= av_mallocz(sizeof(AC3HeaderInfo
));
407 return AVERROR(ENOMEM
);
410 err
= init_get_bits8(&gb
, buf
, size
);
412 return AVERROR_INVALIDDATA
;
413 err
= ff_ac3_parse_header(&gb
, hdr
);
415 return AVERROR_INVALIDDATA
;
417 return get_bits_count(&gb
);
420 int av_ac3_parse_header(const uint8_t *buf
, size_t size
,
421 uint8_t *bitstream_id
, uint16_t *frame_size
)
425 uint8_t tmp
[32 + AV_INPUT_BUFFER_PADDING_SIZE
];
428 size
= FFMIN(32, size
);
429 memcpy(tmp
, buf
, size
);
430 memset(tmp
+ size
, 0, AV_INPUT_BUFFER_PADDING_SIZE
);
431 err
= init_get_bits8(&gb
, tmp
, size
);
433 return AVERROR_INVALIDDATA
;
434 err
= ff_ac3_parse_header(&gb
, &hdr
);
436 return AVERROR_INVALIDDATA
;
438 *bitstream_id
= hdr
.bitstream_id
;
439 *frame_size
= hdr
.frame_size
;
444 static int ac3_sync(uint64_t state
, int *need_next_header
, int *new_frame_start
)
449 uint8_t u8
[8 + AV_INPUT_BUFFER_PADDING_SIZE
];
450 } tmp
= { av_be2ne64(state
) };
454 if (tmp
.u8
[1] == 0x77 && tmp
.u8
[2] == 0x0b) {
455 FFSWAP(uint8_t, tmp
.u8
[1], tmp
.u8
[2]);
456 FFSWAP(uint8_t, tmp
.u8
[3], tmp
.u8
[4]);
457 FFSWAP(uint8_t, tmp
.u8
[5], tmp
.u8
[6]);
460 init_get_bits(&gbc
, tmp
.u8
+8-AC3_HEADER_SIZE
, 54);
461 err
= ff_ac3_parse_header(&gbc
, &hdr
);
466 *new_frame_start
= (hdr
.frame_type
!= EAC3_FRAME_TYPE_DEPENDENT
);
467 *need_next_header
= *new_frame_start
|| (hdr
.frame_type
!= EAC3_FRAME_TYPE_AC3_CONVERT
);
468 return hdr
.frame_size
;
471 static av_cold
int ac3_parse_init(AVCodecParserContext
*s1
)
473 AACAC3ParseContext
*s
= s1
->priv_data
;
474 s
->header_size
= AC3_HEADER_SIZE
;
475 s
->crc_ctx
= av_crc_get_table(AV_CRC_16_ANSI
);
481 const FFCodecParser ff_ac3_parser
= {
482 PARSER_CODEC_LIST(AV_CODEC_ID_AC3
, AV_CODEC_ID_EAC3
),
483 .priv_data_size
= sizeof(AACAC3ParseContext
),
484 .init
= ac3_parse_init
,
485 .parse
= ff_aac_ac3_parse
,
486 .close
= ff_parse_close
,
491 int avpriv_ac3_parse_header(AC3HeaderInfo
**phdr
, const uint8_t *buf
,
494 return AVERROR(ENOSYS
);
497 int av_ac3_parse_header(const uint8_t *buf
, size_t size
,
498 uint8_t *bitstream_id
, uint16_t *frame_size
)
500 return AVERROR(ENOSYS
);