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 "config_components.h"
26 #include "libavutil/channel_layout.h"
30 #include "ac3_parser.h"
31 #include "ac3_parser_internal.h"
32 #include "aac_ac3_parser.h"
36 #define AC3_HEADER_SIZE 7
40 static const uint8_t eac3_blocks
[4] = {
45 * Table for center mix levels
46 * reference: Section 5.4.2.4 cmixlev
48 static const uint8_t center_levels
[4] = { 4, 5, 6, 5 };
51 * Table for surround mix levels
52 * reference: Section 5.4.2.5 surmixlev
54 static const uint8_t surround_levels
[4] = { 4, 6, 7, 6 };
57 int ff_ac3_parse_header(GetBitContext
*gbc
, AC3HeaderInfo
*hdr
)
61 memset(hdr
, 0, sizeof(*hdr
));
63 hdr
->sync_word
= get_bits(gbc
, 16);
64 if(hdr
->sync_word
!= 0x0B77)
65 return AAC_AC3_PARSE_ERROR_SYNC
;
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
;
73 hdr
->ac3_bit_rate_code
= -1;
75 /* set default mix levels */
76 hdr
->center_mix_level
= 5; // -4.5dB
77 hdr
->surround_mix_level
= 6; // -6.0dB
79 /* set default dolby surround mode */
80 hdr
->dolby_surround_mode
= AC3_DSURMOD_NOTINDICATED
;
82 if(hdr
->bitstream_id
<= 10) {
84 hdr
->crc1
= get_bits(gbc
, 16);
85 hdr
->sr_code
= get_bits(gbc
, 2);
87 return AAC_AC3_PARSE_ERROR_SAMPLE_RATE
;
89 frame_size_code
= get_bits(gbc
, 6);
90 if(frame_size_code
> 37)
91 return AAC_AC3_PARSE_ERROR_FRAME_SIZE
;
93 hdr
->ac3_bit_rate_code
= (frame_size_code
>> 1);
95 skip_bits(gbc
, 5); // skip bsid, already got it
97 hdr
->bitstream_mode
= get_bits(gbc
, 3);
98 hdr
->channel_mode
= get_bits(gbc
, 3);
100 if(hdr
->channel_mode
== AC3_CHMODE_STEREO
) {
101 hdr
->dolby_surround_mode
= get_bits(gbc
, 2);
103 if((hdr
->channel_mode
& 1) && hdr
->channel_mode
!= AC3_CHMODE_MONO
)
104 hdr
-> center_mix_level
= center_levels
[get_bits(gbc
, 2)];
105 if(hdr
->channel_mode
& 4)
106 hdr
->surround_mix_level
= surround_levels
[get_bits(gbc
, 2)];
108 hdr
->lfe_on
= get_bits1(gbc
);
110 hdr
->sr_shift
= FFMAX(hdr
->bitstream_id
, 8) - 8;
111 hdr
->sample_rate
= ff_ac3_sample_rate_tab
[hdr
->sr_code
] >> hdr
->sr_shift
;
112 hdr
->bit_rate
= (ff_ac3_bitrate_tab
[hdr
->ac3_bit_rate_code
] * 1000) >> hdr
->sr_shift
;
113 hdr
->channels
= ff_ac3_channels_tab
[hdr
->channel_mode
] + hdr
->lfe_on
;
114 hdr
->frame_size
= ff_ac3_frame_size_tab
[frame_size_code
][hdr
->sr_code
] * 2;
115 hdr
->frame_type
= EAC3_FRAME_TYPE_AC3_CONVERT
; //EAC3_FRAME_TYPE_INDEPENDENT;
116 hdr
->substreamid
= 0;
120 hdr
->frame_type
= get_bits(gbc
, 2);
121 if(hdr
->frame_type
== EAC3_FRAME_TYPE_RESERVED
)
122 return AAC_AC3_PARSE_ERROR_FRAME_TYPE
;
124 hdr
->substreamid
= get_bits(gbc
, 3);
126 hdr
->frame_size
= (get_bits(gbc
, 11) + 1) << 1;
127 if(hdr
->frame_size
< AC3_HEADER_SIZE
)
128 return AAC_AC3_PARSE_ERROR_FRAME_SIZE
;
130 hdr
->sr_code
= get_bits(gbc
, 2);
131 if (hdr
->sr_code
== 3) {
132 int sr_code2
= get_bits(gbc
, 2);
134 return AAC_AC3_PARSE_ERROR_SAMPLE_RATE
;
135 hdr
->sample_rate
= ff_ac3_sample_rate_tab
[sr_code2
] / 2;
138 hdr
->num_blocks
= eac3_blocks
[get_bits(gbc
, 2)];
139 hdr
->sample_rate
= ff_ac3_sample_rate_tab
[hdr
->sr_code
];
143 hdr
->channel_mode
= get_bits(gbc
, 3);
144 hdr
->lfe_on
= get_bits1(gbc
);
146 hdr
->bit_rate
= 8LL * hdr
->frame_size
* hdr
->sample_rate
/
147 (hdr
->num_blocks
* 256);
148 hdr
->channels
= ff_ac3_channels_tab
[hdr
->channel_mode
] + hdr
->lfe_on
;
150 hdr
->channel_layout
= ff_ac3_channel_layout_tab
[hdr
->channel_mode
];
152 hdr
->channel_layout
|= AV_CH_LOW_FREQUENCY
;
157 // TODO: Better way to pass AC3HeaderInfo fields to mov muxer.
158 int avpriv_ac3_parse_header(AC3HeaderInfo
**phdr
, const uint8_t *buf
,
166 *phdr
= av_mallocz(sizeof(AC3HeaderInfo
));
168 return AVERROR(ENOMEM
);
171 err
= init_get_bits8(&gb
, buf
, size
);
173 return AVERROR_INVALIDDATA
;
174 err
= ff_ac3_parse_header(&gb
, hdr
);
176 return AVERROR_INVALIDDATA
;
178 return get_bits_count(&gb
);
181 int av_ac3_parse_header(const uint8_t *buf
, size_t size
,
182 uint8_t *bitstream_id
, uint16_t *frame_size
)
188 err
= init_get_bits8(&gb
, buf
, size
);
190 return AVERROR_INVALIDDATA
;
191 err
= ff_ac3_parse_header(&gb
, &hdr
);
193 return AVERROR_INVALIDDATA
;
195 *bitstream_id
= hdr
.bitstream_id
;
196 *frame_size
= hdr
.frame_size
;
201 static int ac3_sync(uint64_t state
, AACAC3ParseContext
*hdr_info
,
202 int *need_next_header
, int *new_frame_start
)
207 uint8_t u8
[8 + AV_INPUT_BUFFER_PADDING_SIZE
];
208 } tmp
= { av_be2ne64(state
) };
212 if (tmp
.u8
[1] == 0x77 && tmp
.u8
[2] == 0x0b) {
213 FFSWAP(uint8_t, tmp
.u8
[1], tmp
.u8
[2]);
214 FFSWAP(uint8_t, tmp
.u8
[3], tmp
.u8
[4]);
215 FFSWAP(uint8_t, tmp
.u8
[5], tmp
.u8
[6]);
218 init_get_bits(&gbc
, tmp
.u8
+8-AC3_HEADER_SIZE
, 54);
219 err
= ff_ac3_parse_header(&gbc
, &hdr
);
224 hdr_info
->sample_rate
= hdr
.sample_rate
;
225 hdr_info
->bit_rate
= hdr
.bit_rate
;
226 hdr_info
->channels
= hdr
.channels
;
227 hdr_info
->channel_layout
= hdr
.channel_layout
;
228 hdr_info
->samples
= hdr
.num_blocks
* 256;
229 hdr_info
->service_type
= hdr
.bitstream_mode
;
230 if (hdr
.bitstream_mode
== 0x7 && hdr
.channels
> 1)
231 hdr_info
->service_type
= AV_AUDIO_SERVICE_TYPE_KARAOKE
;
232 if(hdr
.bitstream_id
>10)
233 hdr_info
->codec_id
= AV_CODEC_ID_EAC3
;
234 else if (hdr_info
->codec_id
== AV_CODEC_ID_NONE
)
235 hdr_info
->codec_id
= AV_CODEC_ID_AC3
;
237 *new_frame_start
= (hdr
.frame_type
!= EAC3_FRAME_TYPE_DEPENDENT
);
238 *need_next_header
= *new_frame_start
|| (hdr
.frame_type
!= EAC3_FRAME_TYPE_AC3_CONVERT
);
239 return hdr
.frame_size
;
242 static av_cold
int ac3_parse_init(AVCodecParserContext
*s1
)
244 AACAC3ParseContext
*s
= s1
->priv_data
;
245 s
->header_size
= AC3_HEADER_SIZE
;
251 const AVCodecParser ff_ac3_parser
= {
252 .codec_ids
= { AV_CODEC_ID_AC3
, AV_CODEC_ID_EAC3
},
253 .priv_data_size
= sizeof(AACAC3ParseContext
),
254 .parser_init
= ac3_parse_init
,
255 .parser_parse
= ff_aac_ac3_parse
,
256 .parser_close
= ff_parse_close
,
261 int avpriv_ac3_parse_header(AC3HeaderInfo
**phdr
, const uint8_t *buf
,
264 return AVERROR(ENOSYS
);
267 int av_ac3_parse_header(const uint8_t *buf
, size_t size
,
268 uint8_t *bitstream_id
, uint16_t *frame_size
)
270 return AVERROR(ENOSYS
);