Shaka Packager SDK
Loading...
Searching...
No Matches
aac_audio_specific_config.cc
1// Copyright (c) 2012 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include <packager/media/codecs/aac_audio_specific_config.h>
6
7#include <algorithm>
8#include <cstddef>
9#include <cstdint>
10#include <iterator>
11#include <vector>
12
13#include <absl/log/check.h>
14
15#include <packager/media/base/bit_reader.h>
16#include <packager/media/base/rcheck.h>
17
18namespace shaka {
19namespace media {
20namespace {
21
22// Sampling Frequency Index table, from ISO 14496-3 Table 1.16
23static const uint32_t kSampleRates[] = {96000, 88200, 64000, 48000, 44100,
24 32000, 24000, 22050, 16000, 12000,
25 11025, 8000, 7350};
26
27// Channel Configuration table, from ISO 14496-3 Table 1.17
28const uint8_t kChannelConfigs[] = {0, 1, 2, 3, 4, 5, 6, 8};
29
30// ISO 14496-3 Table 4.2 – Syntax of program_config_element()
31// program_config_element()
32// ...
33// element_is_cpe[i]; 1 bslbf
34// element_tag_select[i]; 4 uimsbf
35bool CountChannels(uint8_t num_elements,
36 uint8_t* num_channels,
37 BitReader* bit_reader) {
38 for (uint8_t i = 0; i < num_elements; ++i) {
39 bool is_pair = false;
40 RCHECK(bit_reader->ReadBits(1, &is_pair));
41 *num_channels += is_pair ? 2 : 1;
42 RCHECK(bit_reader->SkipBits(4));
43 }
44 return true;
45}
46
47} // namespace
48
49AACAudioSpecificConfig::AACAudioSpecificConfig() {}
50
51AACAudioSpecificConfig::~AACAudioSpecificConfig() {}
52
53bool AACAudioSpecificConfig::Parse(const std::vector<uint8_t>& data) {
54 if (data.empty())
55 return false;
56
57 BitReader reader(&data[0], data.size());
58 uint8_t extension_type = AOT_NULL;
59 uint8_t extension_frequency_index = 0xff;
60
61 sbr_present_ = false;
62 ps_present_ = false;
63 frequency_ = 0;
64 extension_frequency_ = 0;
65
66 // The following code is written according to ISO 14496 Part 3 Table 1.13 -
67 // Syntax of AudioSpecificConfig.
68
69 // Read base configuration.
70 // Audio Object Types specified in "ISO/IEC 14496-3:2019, Table 1.19"
71 RCHECK(ParseAudioObjectType(&reader));
72
73 RCHECK(reader.ReadBits(4, &frequency_index_));
74 if (frequency_index_ == 0xf)
75 RCHECK(reader.ReadBits(24, &frequency_));
76 RCHECK(reader.ReadBits(4, &channel_config_));
77
78 RCHECK(channel_config_ < std::size(kChannelConfigs));
79 num_channels_ = kChannelConfigs[channel_config_];
80
81 // Read extension configuration.
82 if (audio_object_type_ == AOT_SBR || audio_object_type_ == AOT_PS) {
83 sbr_present_ = audio_object_type_ == AOT_SBR;
84 ps_present_ = audio_object_type_ == AOT_PS;
85 extension_type = AOT_SBR;
86 RCHECK(reader.ReadBits(4, &extension_frequency_index));
87 if (extension_frequency_index == 0xf)
88 RCHECK(reader.ReadBits(24, &extension_frequency_));
89 RCHECK(ParseAudioObjectType(&reader));
90 }
91
92 RCHECK(ParseDecoderGASpecificConfig(&reader));
93 RCHECK(SkipErrorSpecificConfig());
94
95 // Read extension configuration again
96 // Note: The check for 16 available bits comes from the AAC spec.
97 if (extension_type != AOT_SBR && reader.bits_available() >= 16) {
98 uint16_t sync_extension_type;
99 uint8_t sbr_present_flag;
100 uint8_t ps_present_flag;
101
102 if (reader.ReadBits(11, &sync_extension_type) &&
103 sync_extension_type == 0x2b7) {
104 if (reader.ReadBits(5, &extension_type) && extension_type == 5) {
105 RCHECK(reader.ReadBits(1, &sbr_present_flag));
106 sbr_present_ = sbr_present_flag != 0;
107
108 if (sbr_present_flag) {
109 RCHECK(reader.ReadBits(4, &extension_frequency_index));
110
111 if (extension_frequency_index == 0xf)
112 RCHECK(reader.ReadBits(24, &extension_frequency_));
113
114 // Note: The check for 12 available bits comes from the AAC spec.
115 if (reader.bits_available() >= 12) {
116 RCHECK(reader.ReadBits(11, &sync_extension_type));
117 if (sync_extension_type == 0x548) {
118 RCHECK(reader.ReadBits(1, &ps_present_flag));
119 ps_present_ = ps_present_flag != 0;
120 }
121 }
122 }
123 }
124 }
125 }
126
127 if (frequency_ == 0) {
128 RCHECK(frequency_index_ < std::size(kSampleRates));
129 frequency_ = kSampleRates[frequency_index_];
130 }
131
132 if (extension_frequency_ == 0 && extension_frequency_index != 0xff) {
133 RCHECK(extension_frequency_index < std::size(kSampleRates));
134 extension_frequency_ = kSampleRates[extension_frequency_index];
135 }
136
137 if (audio_object_type_ == AOT_USAC) {
138 return frequency_ != 0 && num_channels_ != 0 && channel_config_ <= 7;
139 } else {
140 return frequency_ != 0 && num_channels_ != 0 && audio_object_type_ >= 1 &&
141 audio_object_type_ <= 4 && frequency_index_ != 0xf &&
142 channel_config_ <= 7;
143 }
144}
145
147 const uint8_t* data,
148 size_t data_size,
149 std::vector<uint8_t>* audio_frame) const {
150 DCHECK(audio_object_type_ >= 1 && audio_object_type_ <= 4 &&
151 frequency_index_ != 0xf && channel_config_ <= 7);
152
153 size_t size = kADTSHeaderSize + data_size;
154
155 // ADTS header uses 13 bits for packet size.
156 if (size >= (1 << 13))
157 return false;
158
159 audio_frame->reserve(size);
160 audio_frame->resize(kADTSHeaderSize);
161
162 audio_frame->at(0) = 0xff;
163 audio_frame->at(1) = 0xf1;
164 audio_frame->at(2) = ((audio_object_type_ - 1) << 6) +
165 (frequency_index_ << 2) + (channel_config_ >> 2);
166 audio_frame->at(3) =
167 ((channel_config_ & 0x3) << 6) + static_cast<uint8_t>(size >> 11);
168 audio_frame->at(4) = static_cast<uint8_t>((size & 0x7ff) >> 3);
169 audio_frame->at(5) = static_cast<uint8_t>(((size & 7) << 5) + 0x1f);
170 audio_frame->at(6) = 0xfc;
171
172 audio_frame->insert(audio_frame->end(), data, data + data_size);
173
174 return true;
175}
176
177AACAudioSpecificConfig::AudioObjectType
179 if (ps_present_)
180 return AOT_PS;
181 if (sbr_present_)
182 return AOT_SBR;
183 return audio_object_type_;
184}
185
187 if (extension_frequency_ > 0)
188 return extension_frequency_;
189
190 if (!sbr_present_)
191 return frequency_;
192
193 // The following code is written according to ISO 14496 Part 3 Table 1.11 and
194 // Table 1.22. (Table 1.11 refers to the capping to 48000, Table 1.22 refers
195 // to SBR doubling the AAC sample rate.)
196 DCHECK_GT(frequency_, 0u);
197 return std::min(2 * frequency_, 48000u);
198}
199
201 // Check for implicit signalling of HE-AAC and indicate stereo output
202 // if the mono channel configuration is signalled.
203 // See ISO-14496-3 Section 1.6.6.1.2 for details about this special casing.
204 if (sbr_present_ && channel_config_ == 1)
205 return 2; // CHANNEL_LAYOUT_STEREO
206
207 // When Parametric Stereo is on, mono will be played as stereo.
208 if (ps_present_ && channel_config_ == 1)
209 return 2; // CHANNEL_LAYOUT_STEREO
210
211 return num_channels_;
212}
213
214bool AACAudioSpecificConfig::ParseAudioObjectType(BitReader* bit_reader) {
215 RCHECK(bit_reader->ReadBits(5, &audio_object_type_));
216
217 if (audio_object_type_ == AOT_ESCAPE) {
218 uint8_t audioObjectTypeExt;
219 RCHECK(bit_reader->ReadBits(6, &audioObjectTypeExt));
220 audio_object_type_ = static_cast<AudioObjectType>(32 + audioObjectTypeExt);
221 }
222
223 return true;
224}
225
226// Currently this function only support GASpecificConfig defined in
227// ISO 14496 Part 3 Table 4.1 - Syntax of GASpecificConfig()
228bool AACAudioSpecificConfig::ParseDecoderGASpecificConfig(
229 BitReader* bit_reader) {
230 switch (audio_object_type_) {
231 case 1:
232 case 2:
233 case 3:
234 case 4:
235 case 6:
236 case 7:
237 case 17:
238 case 19:
239 case 20:
240 case 21:
241 case 22:
242 case 23:
243 return ParseGASpecificConfig(bit_reader);
244 case 42:
245 // Skip UsacConfig() parsing until required
246 RCHECK(bit_reader->SkipBits(bit_reader->bits_available()));
247 return true;
248 default:
249 break;
250 }
251
252 return false;
253}
254
255bool AACAudioSpecificConfig::SkipErrorSpecificConfig() const {
256 switch (audio_object_type_) {
257 case 17:
258 case 19:
259 case 20:
260 case 21:
261 case 22:
262 case 23:
263 case 24:
264 case 25:
265 case 26:
266 case 27:
267 return false;
268 default:
269 break;
270 }
271
272 return true;
273}
274
275// The following code is written according to ISO 14496 part 3 Table 4.1 -
276// GASpecificConfig.
277bool AACAudioSpecificConfig::ParseGASpecificConfig(BitReader* bit_reader) {
278 uint8_t extension_flag = 0;
279 uint8_t depends_on_core_coder;
280 uint16_t dummy;
281
282 RCHECK(bit_reader->ReadBits(1, &dummy)); // frameLengthFlag
283 RCHECK(bit_reader->ReadBits(1, &depends_on_core_coder));
284 if (depends_on_core_coder == 1)
285 RCHECK(bit_reader->ReadBits(14, &dummy)); // coreCoderDelay
286
287 RCHECK(bit_reader->ReadBits(1, &extension_flag));
288 if (channel_config_ == 0)
289 RCHECK(ParseProgramConfigElement(bit_reader));
290
291 if (audio_object_type_ == 6 || audio_object_type_ == 20)
292 RCHECK(bit_reader->ReadBits(3, &dummy)); // layerNr
293
294 if (extension_flag) {
295 if (audio_object_type_ == 22) {
296 RCHECK(bit_reader->ReadBits(5, &dummy)); // numOfSubFrame
297 RCHECK(bit_reader->ReadBits(11, &dummy)); // layer_length
298 }
299
300 if (audio_object_type_ == 17 || audio_object_type_ == 19 ||
301 audio_object_type_ == 20 || audio_object_type_ == 23) {
302 RCHECK(bit_reader->ReadBits(3, &dummy)); // resilience flags
303 }
304
305 RCHECK(bit_reader->ReadBits(1, &dummy)); // extensionFlag3
306 }
307
308 return true;
309}
310
311// ISO 14496-3 Table 4.2 – Syntax of program_config_element()
312// program_config_element()
313// {
314// element_instance_tag; 4 uimsbf
315// object_type; 2 uimsbf
316// sampling_frequency_index; 4 uimsbf
317// num_front_channel_elements; 4 uimsbf
318// num_side_channel_elements; 4 uimsbf
319// num_back_channel_elements; 4 uimsbf
320// num_lfe_channel_elements; 2 uimsbf
321// num_assoc_data_elements; 3 uimsbf
322// num_valid_cc_elements; 4 uimsbf
323// mono_mixdown_present; 1 uimsbf
324// if (mono_mixdown_present == 1)
325// mono_mixdown_element_number; 4 uimsbf
326// stereo_mixdown_present; 1 uimsbf
327// if (stereo_mixdown_present == 1)
328// stereo_mixdown_element_number; 4 uimsbf
329// matrix_mixdown_idx_present; 1 uimsbf
330// if (matrix_mixdown_idx_present == 1) {
331// matrix_mixdown_idx ; 2 uimsbf
332// pseudo_surround_enable; 1 uimsbf
333// }
334// for (i = 0; i < num_front_channel_elements; i++) {
335// front_element_is_cpe[i]; 1 bslbf
336// front_element_tag_select[i]; 4 uimsbf
337// }
338// for (i = 0; i < num_side_channel_elements; i++) {
339// side_element_is_cpe[i]; 1 bslbf
340// side_element_tag_select[i]; 4 uimsbf
341// }
342// for (i = 0; i < num_back_channel_elements; i++) {
343// back_element_is_cpe[i]; 1 bslbf
344// back_element_tag_select[i]; 4 uimsbf
345// }
346// for (i = 0; i < num_lfe_channel_elements; i++)
347// lfe_element_tag_select[i]; 4 uimsbf
348// for ( i = 0; i < num_assoc_data_elements; i++)
349// assoc_data_element_tag_select[i]; 4 uimsbf
350// for (i = 0; i < num_valid_cc_elements; i++) {
351// cc_element_is_ind_sw[i]; 1 uimsbf
352// valid_cc_element_tag_select[i]; 4 uimsbf
353// }
354// byte_alignment(); Note 1
355// comment_field_bytes; 8 uimsbf
356// for (i = 0; i < comment_field_bytes; i++)
357// comment_field_data[i]; 8 uimsbf
358// }
359// Note 1: If called from within an AudioSpecificConfig(), this
360// byte_alignment shall be relative to the start of the AudioSpecificConfig().
361bool AACAudioSpecificConfig::ParseProgramConfigElement(BitReader* bit_reader) {
362 // element_instance_tag (4), object_type (2), sampling_frequency_index (4).
363 RCHECK(bit_reader->SkipBits(4 + 2 + 4));
364
365 uint8_t num_front_channel_elements = 0;
366 uint8_t num_side_channel_elements = 0;
367 uint8_t num_back_channel_elements = 0;
368 uint8_t num_lfe_channel_elements = 0;
369 RCHECK(bit_reader->ReadBits(4, &num_front_channel_elements));
370 RCHECK(bit_reader->ReadBits(4, &num_side_channel_elements));
371 RCHECK(bit_reader->ReadBits(4, &num_back_channel_elements));
372 RCHECK(bit_reader->ReadBits(2, &num_lfe_channel_elements));
373
374 uint8_t num_assoc_data_elements = 0;
375 RCHECK(bit_reader->ReadBits(3, &num_assoc_data_elements));
376 uint8_t num_valid_cc_elements = 0;
377 RCHECK(bit_reader->ReadBits(4, &num_valid_cc_elements));
378
379 RCHECK(bit_reader->SkipBitsConditional(true, 4)); // mono_mixdown
380 RCHECK(bit_reader->SkipBitsConditional(true, 4)); // stereo_mixdown
381 RCHECK(bit_reader->SkipBitsConditional(true, 3)); // matrix_mixdown_idx
382
383 num_channels_ = 0;
384 RCHECK(CountChannels(num_front_channel_elements, &num_channels_, bit_reader));
385 RCHECK(CountChannels(num_side_channel_elements, &num_channels_, bit_reader));
386 RCHECK(CountChannels(num_back_channel_elements, &num_channels_, bit_reader));
387 num_channels_ += num_lfe_channel_elements;
388
389 RCHECK(bit_reader->SkipBits(4 * num_lfe_channel_elements));
390 RCHECK(bit_reader->SkipBits(4 * num_assoc_data_elements));
391 RCHECK(bit_reader->SkipBits(5 * num_valid_cc_elements));
392
393 bit_reader->SkipToNextByte();
394
395 uint8_t comment_field_bytes = 0;
396 RCHECK(bit_reader->ReadBits(8, &comment_field_bytes));
397 RCHECK(bit_reader->SkipBytes(comment_field_bytes));
398 return true;
399}
400
401} // namespace media
402} // namespace shaka
static const size_t kADTSHeaderSize
Size in bytes of the ADTS header added by ConvertEsdsToADTS().
virtual bool ConvertToADTS(const uint8_t *data, size_t data_size, std::vector< uint8_t > *audio_frame) const
virtual bool Parse(const std::vector< uint8_t > &data)
A class to read bit streams.
Definition bit_reader.h:19
size_t bits_available() const
Definition bit_reader.h:91
bool ReadBits(size_t num_bits, T *out)
Definition bit_reader.h:37
All the methods that are virtual are virtual for mocking.