/proc/self/cwd/libfaad/syntax.c
Line | Count | Source (jump to first uncovered line) |
1 | | /* |
2 | | ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding |
3 | | ** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com |
4 | | ** |
5 | | ** This program is free software; you can redistribute it and/or modify |
6 | | ** it under the terms of the GNU General Public License as published by |
7 | | ** the Free Software Foundation; either version 2 of the License, or |
8 | | ** (at your option) any later version. |
9 | | ** |
10 | | ** This program is distributed in the hope that it will be useful, |
11 | | ** but WITHOUT ANY WARRANTY; without even the implied warranty of |
12 | | ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
13 | | ** GNU General Public License for more details. |
14 | | ** |
15 | | ** You should have received a copy of the GNU General Public License |
16 | | ** along with this program; if not, write to the Free Software |
17 | | ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. |
18 | | ** |
19 | | ** Any non-GPL usage of this software or parts of this software is strictly |
20 | | ** forbidden. |
21 | | ** |
22 | | ** The "appropriate copyright message" mentioned in section 2c of the GPLv2 |
23 | | ** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" |
24 | | ** |
25 | | ** Commercial non-GPL licensing of this software is possible. |
26 | | ** For more info contact Nero AG through Mpeg4AAClicense@nero.com. |
27 | | ** |
28 | | ** $Id: syntax.c,v 1.93 2009/01/26 23:51:15 menno Exp $ |
29 | | **/ |
30 | | |
31 | | /* |
32 | | Reads the AAC bitstream as defined in 14496-3 (MPEG-4 Audio) |
33 | | */ |
34 | | |
35 | | #include "common.h" |
36 | | #include "structs.h" |
37 | | |
38 | | #include <stdlib.h> |
39 | | #include <stdio.h> |
40 | | |
41 | | #include "syntax.h" |
42 | | #include "specrec.h" |
43 | | #include "huffman.h" |
44 | | #include "bits.h" |
45 | | #include "pulse.h" |
46 | | #include "analysis.h" |
47 | | #include "drc.h" |
48 | | #ifdef ERROR_RESILIENCE |
49 | | #include "rvlc.h" |
50 | | #endif |
51 | | #ifdef SBR_DEC |
52 | | #include "sbr_syntax.h" |
53 | | #endif |
54 | | #include "mp4.h" |
55 | | |
56 | | |
57 | | /* static function declarations */ |
58 | | static void decode_sce_lfe(NeAACDecStruct *hDecoder, NeAACDecFrameInfo *hInfo, bitfile *ld, |
59 | | uint8_t id_syn_ele); |
60 | | static void decode_cpe(NeAACDecStruct *hDecoder, NeAACDecFrameInfo *hInfo, bitfile *ld, |
61 | | uint8_t id_syn_ele); |
62 | | static uint8_t single_lfe_channel_element(NeAACDecStruct *hDecoder, bitfile *ld, |
63 | | uint8_t channel, uint8_t *tag); |
64 | | static uint8_t channel_pair_element(NeAACDecStruct *hDecoder, bitfile *ld, |
65 | | uint8_t channel, uint8_t *tag); |
66 | | #ifdef COUPLING_DEC |
67 | | static uint8_t coupling_channel_element(NeAACDecStruct *hDecoder, bitfile *ld); |
68 | | #endif |
69 | | static uint16_t data_stream_element(NeAACDecStruct *hDecoder, bitfile *ld); |
70 | | static uint8_t program_config_element(program_config *pce, bitfile *ld); |
71 | | static uint8_t fill_element(NeAACDecStruct *hDecoder, bitfile *ld, drc_info *drc |
72 | | #ifdef SBR_DEC |
73 | | ,uint8_t sbr_ele |
74 | | #endif |
75 | | ); |
76 | | static uint8_t individual_channel_stream(NeAACDecStruct *hDecoder, element *ele, |
77 | | bitfile *ld, ic_stream *ics, uint8_t scal_flag, |
78 | | int16_t *spec_data); |
79 | | static uint8_t ics_info(NeAACDecStruct *hDecoder, ic_stream *ics, bitfile *ld, |
80 | | uint8_t common_window); |
81 | | static uint8_t section_data(NeAACDecStruct *hDecoder, ic_stream *ics, bitfile *ld); |
82 | | static uint8_t scale_factor_data(NeAACDecStruct *hDecoder, ic_stream *ics, bitfile *ld); |
83 | | #ifdef SSR_DEC |
84 | | static void gain_control_data(bitfile *ld, ic_stream *ics); |
85 | | #endif |
86 | | static uint8_t spectral_data(NeAACDecStruct *hDecoder, ic_stream *ics, bitfile *ld, |
87 | | int16_t *spectral_data); |
88 | | static uint8_t pulse_data(ic_stream *ics, pulse_info *pul, bitfile *ld); |
89 | | static void tns_data(ic_stream *ics, tns_info *tns, bitfile *ld); |
90 | | #ifdef LTP_DEC |
91 | | static uint8_t ltp_data(NeAACDecStruct *hDecoder, ic_stream *ics, ltp_info *ltp, bitfile *ld); |
92 | | #endif |
93 | | static uint8_t adts_fixed_header(adts_header *adts, bitfile *ld); |
94 | | static void adts_variable_header(adts_header *adts, bitfile *ld); |
95 | | static void adts_error_check(adts_header *adts, bitfile *ld); |
96 | | static uint8_t side_info(NeAACDecStruct *hDecoder, element *ele, |
97 | | bitfile *ld, ic_stream *ics, uint8_t scal_flag); |
98 | | #ifdef DRM |
99 | | static int8_t DRM_aac_scalable_main_header(NeAACDecStruct *hDecoder, ic_stream *ics1, ic_stream *ics2, |
100 | | bitfile *ld, uint8_t this_layer_stereo); |
101 | | #else |
102 | | static uint16_t extension_payload(bitfile *ld, drc_info *drc, uint16_t count); |
103 | | static uint8_t dynamic_range_info(bitfile *ld, drc_info *drc); |
104 | | static uint8_t excluded_channels(bitfile *ld, drc_info *drc); |
105 | | #endif |
106 | | |
107 | | |
108 | | /* Table 4.4.1 */ |
109 | | int8_t GASpecificConfig(bitfile *ld, mp4AudioSpecificConfig *mp4ASC, |
110 | | program_config *pce_out) |
111 | 257 | { |
112 | 257 | program_config pce; |
113 | | |
114 | | /* 1024 or 960 */ |
115 | 257 | mp4ASC->frameLengthFlag = faad_get1bit(ld |
116 | 257 | DEBUGVAR(1,138,"GASpecificConfig(): FrameLengthFlag")); |
117 | | #ifndef ALLOW_SMALL_FRAMELENGTH |
118 | | if (mp4ASC->frameLengthFlag == 1) |
119 | | return -3; |
120 | | #endif |
121 | | |
122 | 257 | mp4ASC->dependsOnCoreCoder = faad_get1bit(ld |
123 | 257 | DEBUGVAR(1,139,"GASpecificConfig(): DependsOnCoreCoder")); |
124 | 257 | if (mp4ASC->dependsOnCoreCoder == 1) |
125 | 41 | { |
126 | 41 | mp4ASC->coreCoderDelay = (uint16_t)faad_getbits(ld, 14 |
127 | 41 | DEBUGVAR(1,140,"GASpecificConfig(): CoreCoderDelay")); |
128 | 41 | } |
129 | | |
130 | 257 | mp4ASC->extensionFlag = faad_get1bit(ld DEBUGVAR(1,141,"GASpecificConfig(): ExtensionFlag")); |
131 | 257 | if (mp4ASC->channelsConfiguration == 0) |
132 | 198 | { |
133 | 198 | if (program_config_element(&pce, ld)) |
134 | 10 | return -3; |
135 | | //mp4ASC->channelsConfiguration = pce.channels; |
136 | | |
137 | 188 | if (pce_out != NULL) |
138 | 0 | memcpy(pce_out, &pce, sizeof(program_config)); |
139 | | |
140 | | /* |
141 | | if (pce.num_valid_cc_elements) |
142 | | return -3; |
143 | | */ |
144 | 188 | } |
145 | | |
146 | 247 | #ifdef ERROR_RESILIENCE |
147 | 247 | if (mp4ASC->extensionFlag == 1) |
148 | 65 | { |
149 | | /* Error resilience not supported yet */ |
150 | 65 | if (mp4ASC->objectTypeIndex >= ER_OBJECT_START) |
151 | 26 | { |
152 | 26 | mp4ASC->aacSectionDataResilienceFlag = faad_get1bit(ld |
153 | 26 | DEBUGVAR(1,144,"GASpecificConfig(): aacSectionDataResilienceFlag")); |
154 | 26 | mp4ASC->aacScalefactorDataResilienceFlag = faad_get1bit(ld |
155 | 26 | DEBUGVAR(1,145,"GASpecificConfig(): aacScalefactorDataResilienceFlag")); |
156 | 26 | mp4ASC->aacSpectralDataResilienceFlag = faad_get1bit(ld |
157 | 26 | DEBUGVAR(1,146,"GASpecificConfig(): aacSpectralDataResilienceFlag")); |
158 | 26 | } |
159 | | /* 1 bit: extensionFlag3 */ |
160 | 65 | faad_getbits(ld, 1); |
161 | 65 | } |
162 | 247 | #endif |
163 | | |
164 | 247 | return 0; |
165 | 257 | } |
166 | | |
167 | | /* Table 4.4.2 */ |
168 | | /* An MPEG-4 Audio decoder is only required to follow the Program |
169 | | Configuration Element in GASpecificConfig(). The decoder shall ignore |
170 | | any Program Configuration Elements that may occur in raw data blocks. |
171 | | PCEs transmitted in raw data blocks cannot be used to convey decoder |
172 | | configuration information. |
173 | | */ |
174 | | static uint8_t program_config_element(program_config *pce, bitfile *ld) |
175 | 198 | { |
176 | 198 | uint8_t i; |
177 | | |
178 | 198 | memset(pce, 0, sizeof(program_config)); |
179 | | |
180 | 198 | pce->channels = 0; |
181 | | |
182 | 198 | pce->element_instance_tag = (uint8_t)faad_getbits(ld, 4 |
183 | 198 | DEBUGVAR(1,10,"program_config_element(): element_instance_tag")); |
184 | | |
185 | 198 | pce->object_type = (uint8_t)faad_getbits(ld, 2 |
186 | 198 | DEBUGVAR(1,11,"program_config_element(): object_type")); |
187 | 198 | pce->sf_index = (uint8_t)faad_getbits(ld, 4 |
188 | 198 | DEBUGVAR(1,12,"program_config_element(): sf_index")); |
189 | 198 | pce->num_front_channel_elements = (uint8_t)faad_getbits(ld, 4 |
190 | 198 | DEBUGVAR(1,13,"program_config_element(): num_front_channel_elements")); |
191 | 198 | pce->num_side_channel_elements = (uint8_t)faad_getbits(ld, 4 |
192 | 198 | DEBUGVAR(1,14,"program_config_element(): num_side_channel_elements")); |
193 | 198 | pce->num_back_channel_elements = (uint8_t)faad_getbits(ld, 4 |
194 | 198 | DEBUGVAR(1,15,"program_config_element(): num_back_channel_elements")); |
195 | 198 | pce->num_lfe_channel_elements = (uint8_t)faad_getbits(ld, 2 |
196 | 198 | DEBUGVAR(1,16,"program_config_element(): num_lfe_channel_elements")); |
197 | 198 | pce->num_assoc_data_elements = (uint8_t)faad_getbits(ld, 3 |
198 | 198 | DEBUGVAR(1,17,"program_config_element(): num_assoc_data_elements")); |
199 | 198 | pce->num_valid_cc_elements = (uint8_t)faad_getbits(ld, 4 |
200 | 198 | DEBUGVAR(1,18,"program_config_element(): num_valid_cc_elements")); |
201 | | |
202 | 198 | pce->mono_mixdown_present = faad_get1bit(ld |
203 | 198 | DEBUGVAR(1,19,"program_config_element(): mono_mixdown_present")); |
204 | 198 | if (pce->mono_mixdown_present == 1) |
205 | 37 | { |
206 | 37 | pce->mono_mixdown_element_number = (uint8_t)faad_getbits(ld, 4 |
207 | 37 | DEBUGVAR(1,20,"program_config_element(): mono_mixdown_element_number")); |
208 | 37 | } |
209 | | |
210 | 198 | pce->stereo_mixdown_present = faad_get1bit(ld |
211 | 198 | DEBUGVAR(1,21,"program_config_element(): stereo_mixdown_present")); |
212 | 198 | if (pce->stereo_mixdown_present == 1) |
213 | 50 | { |
214 | 50 | pce->stereo_mixdown_element_number = (uint8_t)faad_getbits(ld, 4 |
215 | 50 | DEBUGVAR(1,22,"program_config_element(): stereo_mixdown_element_number")); |
216 | 50 | } |
217 | | |
218 | 198 | pce->matrix_mixdown_idx_present = faad_get1bit(ld |
219 | 198 | DEBUGVAR(1,23,"program_config_element(): matrix_mixdown_idx_present")); |
220 | 198 | if (pce->matrix_mixdown_idx_present == 1) |
221 | 47 | { |
222 | 47 | pce->matrix_mixdown_idx = (uint8_t)faad_getbits(ld, 2 |
223 | 47 | DEBUGVAR(1,24,"program_config_element(): matrix_mixdown_idx")); |
224 | 47 | pce->pseudo_surround_enable = faad_get1bit(ld |
225 | 47 | DEBUGVAR(1,25,"program_config_element(): pseudo_surround_enable")); |
226 | 47 | } |
227 | | |
228 | 1.01k | for (i = 0; i < pce->num_front_channel_elements; i++) |
229 | 815 | { |
230 | 815 | pce->front_element_is_cpe[i] = faad_get1bit(ld |
231 | 815 | DEBUGVAR(1,26,"program_config_element(): front_element_is_cpe")); |
232 | 815 | pce->front_element_tag_select[i] = (uint8_t)faad_getbits(ld, 4 |
233 | 815 | DEBUGVAR(1,27,"program_config_element(): front_element_tag_select")); |
234 | | |
235 | 815 | if (pce->front_element_is_cpe[i] & 1) |
236 | 218 | { |
237 | 218 | pce->cpe_channel[pce->front_element_tag_select[i]] = pce->channels; |
238 | 218 | pce->num_front_channels += 2; |
239 | 218 | pce->channels += 2; |
240 | 597 | } else { |
241 | 597 | pce->sce_channel[pce->front_element_tag_select[i]] = pce->channels; |
242 | 597 | pce->num_front_channels++; |
243 | 597 | pce->channels++; |
244 | 597 | } |
245 | 815 | } |
246 | | |
247 | 1.09k | for (i = 0; i < pce->num_side_channel_elements; i++) |
248 | 892 | { |
249 | 892 | pce->side_element_is_cpe[i] = faad_get1bit(ld |
250 | 892 | DEBUGVAR(1,28,"program_config_element(): side_element_is_cpe")); |
251 | 892 | pce->side_element_tag_select[i] = (uint8_t)faad_getbits(ld, 4 |
252 | 892 | DEBUGVAR(1,29,"program_config_element(): side_element_tag_select")); |
253 | | |
254 | 892 | if (pce->side_element_is_cpe[i] & 1) |
255 | 184 | { |
256 | 184 | pce->cpe_channel[pce->side_element_tag_select[i]] = pce->channels; |
257 | 184 | pce->num_side_channels += 2; |
258 | 184 | pce->channels += 2; |
259 | 708 | } else { |
260 | 708 | pce->sce_channel[pce->side_element_tag_select[i]] = pce->channels; |
261 | 708 | pce->num_side_channels++; |
262 | 708 | pce->channels++; |
263 | 708 | } |
264 | 892 | } |
265 | | |
266 | 1.07k | for (i = 0; i < pce->num_back_channel_elements; i++) |
267 | 879 | { |
268 | 879 | pce->back_element_is_cpe[i] = faad_get1bit(ld |
269 | 879 | DEBUGVAR(1,30,"program_config_element(): back_element_is_cpe")); |
270 | 879 | pce->back_element_tag_select[i] = (uint8_t)faad_getbits(ld, 4 |
271 | 879 | DEBUGVAR(1,31,"program_config_element(): back_element_tag_select")); |
272 | | |
273 | 879 | if (pce->back_element_is_cpe[i] & 1) |
274 | 223 | { |
275 | 223 | pce->cpe_channel[pce->back_element_tag_select[i]] = pce->channels; |
276 | 223 | pce->channels += 2; |
277 | 223 | pce->num_back_channels += 2; |
278 | 656 | } else { |
279 | 656 | pce->sce_channel[pce->back_element_tag_select[i]] = pce->channels; |
280 | 656 | pce->num_back_channels++; |
281 | 656 | pce->channels++; |
282 | 656 | } |
283 | 879 | } |
284 | | |
285 | 378 | for (i = 0; i < pce->num_lfe_channel_elements; i++) |
286 | 180 | { |
287 | 180 | pce->lfe_element_tag_select[i] = (uint8_t)faad_getbits(ld, 4 |
288 | 180 | DEBUGVAR(1,32,"program_config_element(): lfe_element_tag_select")); |
289 | | |
290 | 180 | pce->sce_channel[pce->lfe_element_tag_select[i]] = pce->channels; |
291 | 180 | pce->num_lfe_channels++; |
292 | 180 | pce->channels++; |
293 | 180 | } |
294 | | |
295 | 454 | for (i = 0; i < pce->num_assoc_data_elements; i++) |
296 | 256 | pce->assoc_data_element_tag_select[i] = (uint8_t)faad_getbits(ld, 4 |
297 | 256 | DEBUGVAR(1,33,"program_config_element(): assoc_data_element_tag_select")); |
298 | | |
299 | 904 | for (i = 0; i < pce->num_valid_cc_elements; i++) |
300 | 706 | { |
301 | 706 | pce->cc_element_is_ind_sw[i] = faad_get1bit(ld |
302 | 706 | DEBUGVAR(1,34,"program_config_element(): cc_element_is_ind_sw")); |
303 | 706 | pce->valid_cc_element_tag_select[i] = (uint8_t)faad_getbits(ld, 4 |
304 | 706 | DEBUGVAR(1,35,"program_config_element(): valid_cc_element_tag_select")); |
305 | 706 | } |
306 | | |
307 | 198 | faad_byte_align(ld); |
308 | | |
309 | 198 | pce->comment_field_bytes = (uint8_t)faad_getbits(ld, 8 |
310 | 198 | DEBUGVAR(1,36,"program_config_element(): comment_field_bytes")); |
311 | | |
312 | 10.1k | for (i = 0; i < pce->comment_field_bytes; i++) |
313 | 9.92k | { |
314 | 9.92k | pce->comment_field_data[i] = (uint8_t)faad_getbits(ld, 8 |
315 | 9.92k | DEBUGVAR(1,37,"program_config_element(): comment_field_data")); |
316 | 9.92k | } |
317 | 198 | pce->comment_field_data[i] = 0; |
318 | | |
319 | 198 | if (pce->channels > MAX_CHANNELS) |
320 | 10 | return 22; |
321 | | |
322 | 188 | return 0; |
323 | 198 | } |
324 | | |
325 | | static void decode_sce_lfe(NeAACDecStruct *hDecoder, |
326 | | NeAACDecFrameInfo *hInfo, bitfile *ld, |
327 | | uint8_t id_syn_ele) |
328 | 0 | { |
329 | 0 | uint8_t channels = hDecoder->fr_channels; |
330 | 0 | uint8_t tag = 0; |
331 | | |
332 | | /* One or two channels are used; |
333 | | exact number will be known after single_lfe_channel_element |
334 | | */ |
335 | 0 | if (channels+2 > MAX_CHANNELS) |
336 | 0 | { |
337 | 0 | hInfo->error = 12; |
338 | 0 | return; |
339 | 0 | } |
340 | 0 | if (hDecoder->fr_ch_ele+1 > MAX_SYNTAX_ELEMENTS) |
341 | 0 | { |
342 | 0 | hInfo->error = 13; |
343 | 0 | return; |
344 | 0 | } |
345 | | |
346 | | /* for SCE hDecoder->element_output_channels[] is not set here because this |
347 | | can become 2 when some form of Parametric Stereo coding is used |
348 | | */ |
349 | | |
350 | 0 | if (hDecoder->element_id[hDecoder->fr_ch_ele] != INVALID_ELEMENT_ID && |
351 | 0 | hDecoder->element_id[hDecoder->fr_ch_ele] != id_syn_ele) |
352 | 0 | { |
353 | | /* element inconsistency */ |
354 | 0 | hInfo->error = 21; |
355 | 0 | return; |
356 | 0 | } |
357 | | |
358 | | /* save the syntax element id */ |
359 | 0 | hDecoder->element_id[hDecoder->fr_ch_ele] = id_syn_ele; |
360 | | |
361 | | /* decode the element */ |
362 | 0 | hInfo->error = single_lfe_channel_element(hDecoder, ld, channels, &tag); |
363 | | |
364 | | /* map output channels position to internal data channels */ |
365 | 0 | if (hDecoder->element_output_channels[hDecoder->fr_ch_ele] == 2) |
366 | 0 | { |
367 | | /* this might be faulty when pce_set is true */ |
368 | 0 | hDecoder->internal_channel[channels] = channels; |
369 | 0 | hDecoder->internal_channel[channels+1] = channels+1; |
370 | 0 | } else { |
371 | 0 | if (hDecoder->pce_set) |
372 | 0 | { |
373 | 0 | if (hDecoder->pce.channels > MAX_CHANNELS) |
374 | 0 | { |
375 | 0 | hInfo->error = 22; |
376 | 0 | return; |
377 | 0 | } |
378 | 0 | hDecoder->internal_channel[hDecoder->pce.sce_channel[tag]] = channels; |
379 | 0 | } else { |
380 | 0 | hDecoder->internal_channel[channels] = channels; |
381 | 0 | } |
382 | 0 | } |
383 | | |
384 | 0 | hDecoder->fr_channels += hDecoder->element_output_channels[hDecoder->fr_ch_ele]; |
385 | 0 | hDecoder->fr_ch_ele++; |
386 | 0 | } |
387 | | |
388 | | static void decode_cpe(NeAACDecStruct *hDecoder, NeAACDecFrameInfo *hInfo, bitfile *ld, |
389 | | uint8_t id_syn_ele) |
390 | 0 | { |
391 | 0 | uint8_t channels = hDecoder->fr_channels; |
392 | 0 | uint8_t tag = 0; |
393 | |
|
394 | 0 | if (channels+2 > MAX_CHANNELS) |
395 | 0 | { |
396 | 0 | hInfo->error = 12; |
397 | 0 | return; |
398 | 0 | } |
399 | 0 | if (hDecoder->fr_ch_ele+1 > MAX_SYNTAX_ELEMENTS) |
400 | 0 | { |
401 | 0 | hInfo->error = 13; |
402 | 0 | return; |
403 | 0 | } |
404 | 0 | if (hDecoder->pce_set && (hDecoder->pce.channels > MAX_CHANNELS)) |
405 | 0 | { |
406 | 0 | hInfo->error = 22; |
407 | 0 | return; |
408 | 0 | } |
409 | | |
410 | | /* for CPE the number of output channels is always 2 */ |
411 | 0 | if (hDecoder->element_output_channels[hDecoder->fr_ch_ele] == 0) |
412 | 0 | { |
413 | | /* element_output_channels not set yet */ |
414 | 0 | hDecoder->element_output_channels[hDecoder->fr_ch_ele] = 2; |
415 | 0 | } else if (hDecoder->element_output_channels[hDecoder->fr_ch_ele] != 2) { |
416 | | /* element inconsistency */ |
417 | 0 | hInfo->error = 21; |
418 | 0 | return; |
419 | 0 | } |
420 | | |
421 | 0 | if (hDecoder->element_id[hDecoder->fr_ch_ele] != INVALID_ELEMENT_ID && |
422 | 0 | hDecoder->element_id[hDecoder->fr_ch_ele] != id_syn_ele) |
423 | 0 | { |
424 | | /* element inconsistency */ |
425 | 0 | hInfo->error = 21; |
426 | 0 | return; |
427 | 0 | } |
428 | | |
429 | | /* save the syntax element id */ |
430 | 0 | hDecoder->element_id[hDecoder->fr_ch_ele] = id_syn_ele; |
431 | | |
432 | | /* decode the element */ |
433 | 0 | hInfo->error = channel_pair_element(hDecoder, ld, channels, &tag); |
434 | | |
435 | | /* map output channel position to internal data channels */ |
436 | 0 | if (hDecoder->pce_set) |
437 | 0 | { |
438 | 0 | hDecoder->internal_channel[hDecoder->pce.cpe_channel[tag]] = channels; |
439 | 0 | hDecoder->internal_channel[hDecoder->pce.cpe_channel[tag]+1] = channels+1; |
440 | 0 | } else { |
441 | 0 | hDecoder->internal_channel[channels] = channels; |
442 | 0 | hDecoder->internal_channel[channels+1] = channels+1; |
443 | 0 | } |
444 | |
|
445 | 0 | hDecoder->fr_channels += 2; |
446 | 0 | hDecoder->fr_ch_ele++; |
447 | 0 | } |
448 | | |
449 | | void raw_data_block(NeAACDecStruct *hDecoder, NeAACDecFrameInfo *hInfo, |
450 | | bitfile *ld, program_config *pce, drc_info *drc) |
451 | 0 | { |
452 | 0 | uint8_t id_syn_ele; |
453 | 0 | uint8_t ele_this_frame = 0; |
454 | |
|
455 | 0 | hDecoder->fr_channels = 0; |
456 | 0 | hDecoder->fr_ch_ele = 0; |
457 | 0 | hDecoder->first_syn_ele = 25; |
458 | 0 | hDecoder->has_lfe = 0; |
459 | |
|
460 | 0 | #ifdef ERROR_RESILIENCE |
461 | 0 | if (hDecoder->object_type < ER_OBJECT_START) |
462 | 0 | { |
463 | 0 | #endif |
464 | | /* Table 4.4.3: raw_data_block() */ |
465 | 0 | while ((id_syn_ele = (uint8_t)faad_getbits(ld, LEN_SE_ID |
466 | 0 | DEBUGVAR(1,4,"NeAACDecDecode(): id_syn_ele"))) != ID_END) |
467 | 0 | { |
468 | 0 | switch (id_syn_ele) { |
469 | 0 | case ID_SCE: |
470 | 0 | ele_this_frame++; |
471 | 0 | if (hDecoder->first_syn_ele == 25) hDecoder->first_syn_ele = id_syn_ele; |
472 | 0 | decode_sce_lfe(hDecoder, hInfo, ld, id_syn_ele); |
473 | 0 | if (hInfo->error > 0) |
474 | 0 | return; |
475 | 0 | break; |
476 | 0 | case ID_CPE: |
477 | 0 | ele_this_frame++; |
478 | 0 | if (hDecoder->first_syn_ele == 25) hDecoder->first_syn_ele = id_syn_ele; |
479 | 0 | decode_cpe(hDecoder, hInfo, ld, id_syn_ele); |
480 | 0 | if (hInfo->error > 0) |
481 | 0 | return; |
482 | 0 | break; |
483 | 0 | case ID_LFE: |
484 | | #ifdef DRM |
485 | | hInfo->error = 32; |
486 | | #else |
487 | 0 | ele_this_frame++; |
488 | 0 | hDecoder->has_lfe++; |
489 | 0 | decode_sce_lfe(hDecoder, hInfo, ld, id_syn_ele); |
490 | 0 | #endif |
491 | 0 | if (hInfo->error > 0) |
492 | 0 | return; |
493 | 0 | break; |
494 | 0 | case ID_CCE: /* not implemented yet, but skip the bits */ |
495 | | #ifdef DRM |
496 | | hInfo->error = 32; |
497 | | #else |
498 | 0 | ele_this_frame++; |
499 | | #ifdef COUPLING_DEC |
500 | | hInfo->error = coupling_channel_element(hDecoder, ld); |
501 | | #else |
502 | 0 | hInfo->error = 6; |
503 | 0 | #endif |
504 | 0 | #endif |
505 | 0 | if (hInfo->error > 0) |
506 | 0 | return; |
507 | 0 | break; |
508 | 0 | case ID_DSE: |
509 | 0 | ele_this_frame++; |
510 | 0 | data_stream_element(hDecoder, ld); |
511 | 0 | break; |
512 | 0 | case ID_PCE: |
513 | 0 | if (ele_this_frame != 0) |
514 | 0 | { |
515 | 0 | hInfo->error = 31; |
516 | 0 | return; |
517 | 0 | } |
518 | 0 | ele_this_frame++; |
519 | | /* 14496-4: 5.6.4.1.2.1.3: */ |
520 | | /* program_configuration_element()'s in access units shall be ignored */ |
521 | 0 | program_config_element(pce, ld); |
522 | | //if ((hInfo->error = program_config_element(pce, ld)) > 0) |
523 | | // return; |
524 | | //hDecoder->pce_set = 1; |
525 | 0 | break; |
526 | 0 | case ID_FIL: |
527 | 0 | ele_this_frame++; |
528 | | /* one sbr_info describes a channel_element not a channel! */ |
529 | | /* if we encounter SBR data here: error */ |
530 | | /* SBR data will be read directly in the SCE/LFE/CPE element */ |
531 | 0 | if ((hInfo->error = fill_element(hDecoder, ld, drc |
532 | 0 | #ifdef SBR_DEC |
533 | 0 | , INVALID_SBR_ELEMENT |
534 | 0 | #endif |
535 | 0 | )) > 0) |
536 | 0 | return; |
537 | 0 | break; |
538 | 0 | } |
539 | 0 | if (ld->error != 0) |
540 | 0 | { |
541 | 0 | hInfo->error = 32; |
542 | 0 | return; |
543 | 0 | } |
544 | 0 | } |
545 | 0 | #ifdef ERROR_RESILIENCE |
546 | 0 | } else { |
547 | | /* Table 262: er_raw_data_block() */ |
548 | 0 | switch (hDecoder->channelConfiguration) |
549 | 0 | { |
550 | 0 | case 1: |
551 | 0 | decode_sce_lfe(hDecoder, hInfo, ld, ID_SCE); |
552 | 0 | if (hInfo->error > 0) |
553 | 0 | return; |
554 | 0 | break; |
555 | 0 | case 2: |
556 | 0 | decode_cpe(hDecoder, hInfo, ld, ID_CPE); |
557 | 0 | if (hInfo->error > 0) |
558 | 0 | return; |
559 | 0 | break; |
560 | 0 | case 3: |
561 | 0 | decode_sce_lfe(hDecoder, hInfo, ld, ID_SCE); |
562 | 0 | if (hInfo->error > 0) |
563 | 0 | return; |
564 | 0 | decode_cpe(hDecoder, hInfo, ld, ID_CPE); |
565 | 0 | if (hInfo->error > 0) |
566 | 0 | return; |
567 | 0 | break; |
568 | 0 | case 4: |
569 | 0 | decode_sce_lfe(hDecoder, hInfo, ld, ID_SCE); |
570 | 0 | if (hInfo->error > 0) |
571 | 0 | return; |
572 | 0 | decode_cpe(hDecoder, hInfo, ld, ID_CPE); |
573 | 0 | if (hInfo->error > 0) |
574 | 0 | return; |
575 | 0 | decode_sce_lfe(hDecoder, hInfo, ld, ID_SCE); |
576 | 0 | if (hInfo->error > 0) |
577 | 0 | return; |
578 | 0 | break; |
579 | 0 | case 5: |
580 | 0 | decode_sce_lfe(hDecoder, hInfo, ld, ID_SCE); |
581 | 0 | if (hInfo->error > 0) |
582 | 0 | return; |
583 | 0 | decode_cpe(hDecoder, hInfo, ld, ID_CPE); |
584 | 0 | if (hInfo->error > 0) |
585 | 0 | return; |
586 | 0 | decode_cpe(hDecoder, hInfo, ld, ID_CPE); |
587 | 0 | if (hInfo->error > 0) |
588 | 0 | return; |
589 | 0 | break; |
590 | 0 | case 6: |
591 | 0 | decode_sce_lfe(hDecoder, hInfo, ld, ID_SCE); |
592 | 0 | if (hInfo->error > 0) |
593 | 0 | return; |
594 | 0 | decode_cpe(hDecoder, hInfo, ld, ID_CPE); |
595 | 0 | if (hInfo->error > 0) |
596 | 0 | return; |
597 | 0 | decode_cpe(hDecoder, hInfo, ld, ID_CPE); |
598 | 0 | if (hInfo->error > 0) |
599 | 0 | return; |
600 | 0 | decode_sce_lfe(hDecoder, hInfo, ld, ID_LFE); |
601 | 0 | if (hInfo->error > 0) |
602 | 0 | return; |
603 | 0 | break; |
604 | 0 | case 7: /* 8 channels */ |
605 | 0 | decode_sce_lfe(hDecoder, hInfo, ld, ID_SCE); |
606 | 0 | if (hInfo->error > 0) |
607 | 0 | return; |
608 | 0 | decode_cpe(hDecoder, hInfo, ld, ID_CPE); |
609 | 0 | if (hInfo->error > 0) |
610 | 0 | return; |
611 | 0 | decode_cpe(hDecoder, hInfo, ld, ID_CPE); |
612 | 0 | if (hInfo->error > 0) |
613 | 0 | return; |
614 | 0 | decode_cpe(hDecoder, hInfo, ld, ID_CPE); |
615 | 0 | if (hInfo->error > 0) |
616 | 0 | return; |
617 | 0 | decode_sce_lfe(hDecoder, hInfo, ld, ID_LFE); |
618 | 0 | if (hInfo->error > 0) |
619 | 0 | return; |
620 | 0 | break; |
621 | 0 | default: |
622 | 0 | hInfo->error = 7; |
623 | 0 | return; |
624 | 0 | } |
625 | | #if 0 |
626 | | cnt = bits_to_decode() / 8; |
627 | | while (cnt >= 1) |
628 | | { |
629 | | cnt -= extension_payload(cnt); |
630 | | } |
631 | | #endif |
632 | 0 | } |
633 | 0 | #endif |
634 | | |
635 | | /* new in corrigendum 14496-3:2002 */ |
636 | | #ifdef DRM |
637 | | if (hDecoder->object_type != DRM_ER_LC |
638 | | #if 0 |
639 | | && !hDecoder->latm_header_present |
640 | | #endif |
641 | | ) |
642 | | #endif |
643 | 0 | { |
644 | 0 | faad_byte_align(ld); |
645 | 0 | } |
646 | |
|
647 | 0 | return; |
648 | 0 | } |
649 | | |
650 | | /* Table 4.4.4 and */ |
651 | | /* Table 4.4.9 */ |
652 | | static uint8_t single_lfe_channel_element(NeAACDecStruct *hDecoder, bitfile *ld, |
653 | | uint8_t channel, uint8_t *tag) |
654 | 0 | { |
655 | 0 | uint8_t retval = 0; |
656 | 0 | element sce = {0}; |
657 | 0 | ic_stream *ics = &(sce.ics1); |
658 | 0 | ALIGN int16_t spec_data[1024] = {0}; |
659 | |
|
660 | 0 | sce.element_instance_tag = (uint8_t)faad_getbits(ld, LEN_TAG |
661 | 0 | DEBUGVAR(1,38,"single_lfe_channel_element(): element_instance_tag")); |
662 | |
|
663 | 0 | *tag = sce.element_instance_tag; |
664 | 0 | sce.channel = channel; |
665 | 0 | sce.paired_channel = -1; |
666 | |
|
667 | 0 | retval = individual_channel_stream(hDecoder, &sce, ld, ics, 0, spec_data); |
668 | 0 | if (retval > 0) |
669 | 0 | return retval; |
670 | | |
671 | | /* IS not allowed in single channel */ |
672 | 0 | if (ics->is_used) |
673 | 0 | return 32; |
674 | | |
675 | 0 | #ifdef SBR_DEC |
676 | | /* check if next bitstream element is a fill element */ |
677 | | /* if so, read it now so SBR decoding can be done in case of a file with SBR */ |
678 | 0 | if (faad_showbits(ld, LEN_SE_ID) == ID_FIL) |
679 | 0 | { |
680 | 0 | faad_flushbits(ld, LEN_SE_ID); |
681 | | |
682 | | /* one sbr_info describes a channel_element not a channel! */ |
683 | 0 | if ((retval = fill_element(hDecoder, ld, hDecoder->drc, hDecoder->fr_ch_ele)) > 0) |
684 | 0 | { |
685 | 0 | return retval; |
686 | 0 | } |
687 | 0 | } |
688 | 0 | #endif |
689 | | |
690 | | /* noiseless coding is done, spectral reconstruction is done now */ |
691 | 0 | retval = reconstruct_single_channel(hDecoder, ics, &sce, spec_data); |
692 | 0 | if (retval > 0) |
693 | 0 | return retval; |
694 | | |
695 | 0 | return 0; |
696 | 0 | } |
697 | | |
698 | | /* Table 4.4.5 */ |
699 | | static uint8_t channel_pair_element(NeAACDecStruct *hDecoder, bitfile *ld, |
700 | | uint8_t channels, uint8_t *tag) |
701 | 0 | { |
702 | 0 | ALIGN int16_t spec_data1[1024] = {0}; |
703 | 0 | ALIGN int16_t spec_data2[1024] = {0}; |
704 | 0 | element cpe = {0}; |
705 | 0 | ic_stream *ics1 = &(cpe.ics1); |
706 | 0 | ic_stream *ics2 = &(cpe.ics2); |
707 | 0 | uint8_t result; |
708 | |
|
709 | 0 | cpe.channel = channels; |
710 | 0 | cpe.paired_channel = channels+1; |
711 | |
|
712 | 0 | cpe.element_instance_tag = (uint8_t)faad_getbits(ld, LEN_TAG |
713 | 0 | DEBUGVAR(1,39,"channel_pair_element(): element_instance_tag")); |
714 | 0 | *tag = cpe.element_instance_tag; |
715 | |
|
716 | 0 | if ((cpe.common_window = faad_get1bit(ld |
717 | 0 | DEBUGVAR(1,40,"channel_pair_element(): common_window"))) & 1) |
718 | 0 | { |
719 | | /* both channels have common ics information */ |
720 | 0 | if ((result = ics_info(hDecoder, ics1, ld, cpe.common_window)) > 0) |
721 | 0 | return result; |
722 | | |
723 | 0 | ics1->ms_mask_present = (uint8_t)faad_getbits(ld, 2 |
724 | 0 | DEBUGVAR(1,41,"channel_pair_element(): ms_mask_present")); |
725 | 0 | if (ics1->ms_mask_present == 3) |
726 | 0 | { |
727 | | /* bitstream error */ |
728 | 0 | return 32; |
729 | 0 | } |
730 | 0 | if (ics1->ms_mask_present == 1) |
731 | 0 | { |
732 | 0 | uint8_t g, sfb; |
733 | 0 | for (g = 0; g < ics1->num_window_groups; g++) |
734 | 0 | { |
735 | 0 | for (sfb = 0; sfb < ics1->max_sfb; sfb++) |
736 | 0 | { |
737 | 0 | ics1->ms_used[g][sfb] = faad_get1bit(ld |
738 | 0 | DEBUGVAR(1,42,"channel_pair_element(): faad_get1bit")); |
739 | 0 | } |
740 | 0 | } |
741 | 0 | } |
742 | |
|
743 | 0 | #ifdef ERROR_RESILIENCE |
744 | 0 | if ((hDecoder->object_type >= ER_OBJECT_START) && (ics1->predictor_data_present)) |
745 | 0 | { |
746 | 0 | if (( |
747 | 0 | #ifdef LTP_DEC |
748 | 0 | ics1->ltp.data_present = |
749 | 0 | #endif |
750 | 0 | faad_get1bit(ld DEBUGVAR(1,50,"channel_pair_element(): ltp.data_present"))) & 1) |
751 | 0 | { |
752 | 0 | #ifdef LTP_DEC |
753 | 0 | if ((result = ltp_data(hDecoder, ics1, &(ics1->ltp), ld)) > 0) |
754 | 0 | { |
755 | 0 | return result; |
756 | 0 | } |
757 | | #else |
758 | | return 26; |
759 | | #endif |
760 | 0 | } |
761 | 0 | } |
762 | 0 | #endif |
763 | | |
764 | 0 | memcpy(ics2, ics1, sizeof(ic_stream)); |
765 | 0 | } else { |
766 | 0 | ics1->ms_mask_present = 0; |
767 | 0 | } |
768 | | |
769 | 0 | if ((result = individual_channel_stream(hDecoder, &cpe, ld, ics1, |
770 | 0 | 0, spec_data1)) > 0) |
771 | 0 | { |
772 | 0 | return result; |
773 | 0 | } |
774 | | |
775 | 0 | #ifdef ERROR_RESILIENCE |
776 | 0 | if (cpe.common_window && (hDecoder->object_type >= ER_OBJECT_START) && |
777 | 0 | (ics1->predictor_data_present)) |
778 | 0 | { |
779 | 0 | if (( |
780 | 0 | #ifdef LTP_DEC |
781 | 0 | ics1->ltp2.data_present = |
782 | 0 | #endif |
783 | 0 | faad_get1bit(ld DEBUGVAR(1,50,"channel_pair_element(): ltp.data_present"))) & 1) |
784 | 0 | { |
785 | 0 | #ifdef LTP_DEC |
786 | 0 | if ((result = ltp_data(hDecoder, ics1, &(ics1->ltp2), ld)) > 0) |
787 | 0 | { |
788 | 0 | return result; |
789 | 0 | } |
790 | | #else |
791 | | return 26; |
792 | | #endif |
793 | 0 | } |
794 | 0 | } |
795 | 0 | #endif |
796 | | |
797 | 0 | if ((result = individual_channel_stream(hDecoder, &cpe, ld, ics2, |
798 | 0 | 0, spec_data2)) > 0) |
799 | 0 | { |
800 | 0 | return result; |
801 | 0 | } |
802 | | |
803 | 0 | #ifdef SBR_DEC |
804 | | /* check if next bitstream element is a fill element */ |
805 | | /* if so, read it now so SBR decoding can be done in case of a file with SBR */ |
806 | 0 | if (faad_showbits(ld, LEN_SE_ID) == ID_FIL) |
807 | 0 | { |
808 | 0 | faad_flushbits(ld, LEN_SE_ID); |
809 | | |
810 | | /* one sbr_info describes a channel_element not a channel! */ |
811 | 0 | if ((result = fill_element(hDecoder, ld, hDecoder->drc, hDecoder->fr_ch_ele)) > 0) |
812 | 0 | { |
813 | 0 | return result; |
814 | 0 | } |
815 | 0 | } |
816 | 0 | #endif |
817 | | |
818 | | /* noiseless coding is done, spectral reconstruction is done now */ |
819 | 0 | if ((result = reconstruct_channel_pair(hDecoder, ics1, ics2, &cpe, |
820 | 0 | spec_data1, spec_data2)) > 0) |
821 | 0 | { |
822 | 0 | return result; |
823 | 0 | } |
824 | | |
825 | 0 | return 0; |
826 | 0 | } |
827 | | |
828 | | /* Table 4.4.6 */ |
829 | | static uint8_t ics_info(NeAACDecStruct *hDecoder, ic_stream *ics, bitfile *ld, |
830 | | uint8_t common_window) |
831 | 0 | { |
832 | 0 | uint8_t retval = 0; |
833 | 0 | uint8_t ics_reserved_bit; |
834 | |
|
835 | 0 | ics_reserved_bit = faad_get1bit(ld |
836 | 0 | DEBUGVAR(1,43,"ics_info(): ics_reserved_bit")); |
837 | 0 | if (ics_reserved_bit != 0) |
838 | 0 | return 32; |
839 | 0 | ics->window_sequence = (uint8_t)faad_getbits(ld, 2 |
840 | 0 | DEBUGVAR(1,44,"ics_info(): window_sequence")); |
841 | 0 | ics->window_shape = faad_get1bit(ld |
842 | 0 | DEBUGVAR(1,45,"ics_info(): window_shape")); |
843 | |
|
844 | 0 | #ifdef LD_DEC |
845 | | /* No block switching in LD */ |
846 | 0 | if ((hDecoder->object_type == LD) && (ics->window_sequence != ONLY_LONG_SEQUENCE)) |
847 | 0 | return 32; |
848 | 0 | #endif |
849 | | |
850 | 0 | if (ics->window_sequence == EIGHT_SHORT_SEQUENCE) |
851 | 0 | { |
852 | 0 | ics->max_sfb = (uint8_t)faad_getbits(ld, 4 |
853 | 0 | DEBUGVAR(1,46,"ics_info(): max_sfb (short)")); |
854 | 0 | ics->scale_factor_grouping = (uint8_t)faad_getbits(ld, 7 |
855 | 0 | DEBUGVAR(1,47,"ics_info(): scale_factor_grouping")); |
856 | 0 | } else { |
857 | 0 | ics->max_sfb = (uint8_t)faad_getbits(ld, 6 |
858 | 0 | DEBUGVAR(1,48,"ics_info(): max_sfb (long)")); |
859 | 0 | } |
860 | | |
861 | | /* get the grouping information */ |
862 | 0 | if ((retval = window_grouping_info(hDecoder, ics)) > 0) |
863 | 0 | return retval; |
864 | | |
865 | | |
866 | | /* should be an error */ |
867 | | /* check the range of max_sfb */ |
868 | 0 | if (ics->max_sfb > ics->num_swb) |
869 | 0 | return 16; |
870 | | |
871 | 0 | if (ics->window_sequence != EIGHT_SHORT_SEQUENCE) |
872 | 0 | { |
873 | 0 | if ((ics->predictor_data_present = faad_get1bit(ld |
874 | 0 | DEBUGVAR(1,49,"ics_info(): predictor_data_present"))) & 1) |
875 | 0 | { |
876 | 0 | if (hDecoder->object_type == MAIN) /* MPEG2 style AAC predictor */ |
877 | 0 | { |
878 | 0 | uint8_t sfb; |
879 | 0 | uint8_t predictor_reset, predictor_reset_group_number, prediction_used; |
880 | 0 | uint8_t limit = min(ics->max_sfb, max_pred_sfb(hDecoder->sf_index)); |
881 | |
|
882 | 0 | predictor_reset = faad_get1bit(ld DEBUGVAR(1,53,"ics_info(): pred.predictor_reset")); |
883 | 0 | if (predictor_reset) |
884 | 0 | { |
885 | 0 | predictor_reset_group_number = |
886 | 0 | (uint8_t)faad_getbits(ld, 5 DEBUGVAR(1,54,"ics_info(): pred.predictor_reset_group_number")); |
887 | 0 | } else { |
888 | 0 | predictor_reset_group_number = 0; |
889 | 0 | } |
890 | |
|
891 | 0 | for (sfb = 0; sfb < limit; sfb++) |
892 | 0 | { |
893 | 0 | prediction_used = faad_get1bit(ld DEBUGVAR(1,55,"ics_info(): pred.prediction_used")); |
894 | 0 | #ifdef MAIN_DEC |
895 | 0 | ics->pred.prediction_used[sfb] = prediction_used; |
896 | 0 | #endif |
897 | 0 | } |
898 | 0 | #ifdef MAIN_DEC |
899 | 0 | ics->pred.limit = limit; |
900 | 0 | ics->pred.predictor_reset = predictor_reset; |
901 | 0 | ics->pred.predictor_reset_group_number = predictor_reset_group_number; |
902 | | #else |
903 | | (void)predictor_reset_group_number; |
904 | | (void)prediction_used; |
905 | | #endif |
906 | 0 | } |
907 | 0 | #ifdef LTP_DEC |
908 | 0 | else { /* Long Term Prediction */ |
909 | 0 | if (hDecoder->object_type < ER_OBJECT_START) |
910 | 0 | { |
911 | 0 | if ((ics->ltp.data_present = faad_get1bit(ld |
912 | 0 | DEBUGVAR(1,50,"ics_info(): ltp.data_present"))) & 1) |
913 | 0 | { |
914 | 0 | if ((retval = ltp_data(hDecoder, ics, &(ics->ltp), ld)) > 0) |
915 | 0 | { |
916 | 0 | return retval; |
917 | 0 | } |
918 | 0 | } |
919 | 0 | if (common_window) |
920 | 0 | { |
921 | 0 | if ((ics->ltp2.data_present = faad_get1bit(ld |
922 | 0 | DEBUGVAR(1,51,"ics_info(): ltp2.data_present"))) & 1) |
923 | 0 | { |
924 | 0 | if ((retval = ltp_data(hDecoder, ics, &(ics->ltp2), ld)) > 0) |
925 | 0 | { |
926 | 0 | return retval; |
927 | 0 | } |
928 | 0 | } |
929 | 0 | } |
930 | 0 | } |
931 | 0 | #ifdef ERROR_RESILIENCE |
932 | 0 | if (!common_window && (hDecoder->object_type >= ER_OBJECT_START)) |
933 | 0 | { |
934 | 0 | if ((ics->ltp.data_present = faad_get1bit(ld |
935 | 0 | DEBUGVAR(1,50,"ics_info(): ltp.data_present"))) & 1) |
936 | 0 | { |
937 | 0 | if ((retval = ltp_data(hDecoder, ics, &(ics->ltp), ld)) > 0) |
938 | 0 | { |
939 | 0 | return retval; |
940 | 0 | } |
941 | 0 | } |
942 | 0 | } |
943 | 0 | #endif /* ERROR_RESILIENCE */ |
944 | 0 | } |
945 | | #else /* LTP_DEC */ |
946 | | (void)common_window; |
947 | | #endif /* LTP_DEC */ |
948 | 0 | } |
949 | 0 | } |
950 | | |
951 | 0 | return retval; |
952 | 0 | } |
953 | | |
954 | | /* Table 4.4.7 */ |
955 | | static uint8_t pulse_data(ic_stream *ics, pulse_info *pul, bitfile *ld) |
956 | 0 | { |
957 | 0 | uint8_t i; |
958 | |
|
959 | 0 | pul->number_pulse = (uint8_t)faad_getbits(ld, 2 |
960 | 0 | DEBUGVAR(1,56,"pulse_data(): number_pulse")); |
961 | 0 | pul->pulse_start_sfb = (uint8_t)faad_getbits(ld, 6 |
962 | 0 | DEBUGVAR(1,57,"pulse_data(): pulse_start_sfb")); |
963 | | |
964 | | /* check the range of pulse_start_sfb */ |
965 | 0 | if (pul->pulse_start_sfb > ics->num_swb) |
966 | 0 | return 16; |
967 | | |
968 | 0 | for (i = 0; i < pul->number_pulse+1; i++) |
969 | 0 | { |
970 | 0 | pul->pulse_offset[i] = (uint8_t)faad_getbits(ld, 5 |
971 | 0 | DEBUGVAR(1,58,"pulse_data(): pulse_offset")); |
972 | | #if 0 |
973 | | printf("%d\n", pul->pulse_offset[i]); |
974 | | #endif |
975 | 0 | pul->pulse_amp[i] = (uint8_t)faad_getbits(ld, 4 |
976 | 0 | DEBUGVAR(1,59,"pulse_data(): pulse_amp")); |
977 | | #if 0 |
978 | | printf("%d\n", pul->pulse_amp[i]); |
979 | | #endif |
980 | 0 | } |
981 | |
|
982 | 0 | return 0; |
983 | 0 | } |
984 | | |
985 | | #ifdef COUPLING_DEC |
986 | | /* Table 4.4.8: Currently just for skipping the bits... */ |
987 | | static uint8_t coupling_channel_element(NeAACDecStruct *hDecoder, bitfile *ld) |
988 | | { |
989 | | uint8_t c, result = 0; |
990 | | uint8_t ind_sw_cce_flag = 0; |
991 | | uint8_t num_gain_element_lists = 0; |
992 | | uint8_t num_coupled_elements = 0; |
993 | | |
994 | | element el_empty = {0}; |
995 | | ic_stream ics_empty = {0}; |
996 | | int16_t sh_data[1024]; |
997 | | |
998 | | c = faad_getbits(ld, LEN_TAG |
999 | | DEBUGVAR(1,900,"coupling_channel_element(): element_instance_tag")); |
1000 | | |
1001 | | ind_sw_cce_flag = faad_get1bit(ld |
1002 | | DEBUGVAR(1,901,"coupling_channel_element(): ind_sw_cce_flag")); |
1003 | | num_coupled_elements = faad_getbits(ld, 3 |
1004 | | DEBUGVAR(1,902,"coupling_channel_element(): num_coupled_elements")); |
1005 | | |
1006 | | for (c = 0; c < num_coupled_elements + 1; c++) |
1007 | | { |
1008 | | uint8_t cc_target_is_cpe, cc_target_tag_select; |
1009 | | |
1010 | | num_gain_element_lists++; |
1011 | | |
1012 | | cc_target_is_cpe = faad_get1bit(ld |
1013 | | DEBUGVAR(1,903,"coupling_channel_element(): cc_target_is_cpe")); |
1014 | | cc_target_tag_select = faad_getbits(ld, 4 |
1015 | | DEBUGVAR(1,904,"coupling_channel_element(): cc_target_tag_select")); |
1016 | | |
1017 | | if (cc_target_is_cpe) |
1018 | | { |
1019 | | uint8_t cc_l = faad_get1bit(ld |
1020 | | DEBUGVAR(1,905,"coupling_channel_element(): cc_l")); |
1021 | | uint8_t cc_r = faad_get1bit(ld |
1022 | | DEBUGVAR(1,906,"coupling_channel_element(): cc_r")); |
1023 | | |
1024 | | if (cc_l && cc_r) |
1025 | | num_gain_element_lists++; |
1026 | | } |
1027 | | } |
1028 | | |
1029 | | faad_get1bit(ld |
1030 | | DEBUGVAR(1,907,"coupling_channel_element(): cc_domain")); |
1031 | | faad_get1bit(ld |
1032 | | DEBUGVAR(1,908,"coupling_channel_element(): gain_element_sign")); |
1033 | | faad_getbits(ld, 2 |
1034 | | DEBUGVAR(1,909,"coupling_channel_element(): gain_element_scale")); |
1035 | | |
1036 | | if ((result = individual_channel_stream(hDecoder, &el_empty, ld, &ics_empty, |
1037 | | 0, sh_data)) > 0) |
1038 | | { |
1039 | | return result; |
1040 | | } |
1041 | | |
1042 | | /* IS not allowed in single channel */ |
1043 | | if (ics->is_used) |
1044 | | return 32; |
1045 | | |
1046 | | for (c = 1; c < num_gain_element_lists; c++) |
1047 | | { |
1048 | | uint8_t cge; |
1049 | | |
1050 | | if (ind_sw_cce_flag) |
1051 | | { |
1052 | | cge = 1; |
1053 | | } else { |
1054 | | cge = faad_get1bit(ld |
1055 | | DEBUGVAR(1,910,"coupling_channel_element(): common_gain_element_present")); |
1056 | | } |
1057 | | |
1058 | | if (cge) |
1059 | | { |
1060 | | huffman_scale_factor(ld); |
1061 | | } else { |
1062 | | uint8_t g, sfb; |
1063 | | |
1064 | | for (g = 0; g < ics_empty.num_window_groups; g++) |
1065 | | { |
1066 | | for (sfb = 0; sfb < ics_empty.max_sfb; sfb++) |
1067 | | { |
1068 | | if (ics_empty.sfb_cb[g][sfb] != ZERO_HCB) |
1069 | | huffman_scale_factor(ld); |
1070 | | } |
1071 | | } |
1072 | | } |
1073 | | } |
1074 | | |
1075 | | return 0; |
1076 | | } |
1077 | | #endif |
1078 | | |
1079 | | /* Table 4.4.10 */ |
1080 | | static uint16_t data_stream_element(NeAACDecStruct *hDecoder, bitfile *ld) |
1081 | 0 | { |
1082 | 0 | uint8_t byte_aligned; |
1083 | 0 | uint16_t i, count; |
1084 | 0 | (void)hDecoder; /* TODO: remove parameter; rename method; why result is unused? */ |
1085 | |
|
1086 | 0 | /* element_instance_tag = */ faad_getbits(ld, LEN_TAG |
1087 | 0 | DEBUGVAR(1,60,"data_stream_element(): element_instance_tag")); |
1088 | 0 | byte_aligned = faad_get1bit(ld |
1089 | 0 | DEBUGVAR(1,61,"data_stream_element(): byte_aligned")); |
1090 | 0 | count = (uint16_t)faad_getbits(ld, 8 |
1091 | 0 | DEBUGVAR(1,62,"data_stream_element(): count")); |
1092 | 0 | if (count == 255) |
1093 | 0 | { |
1094 | 0 | count += (uint16_t)faad_getbits(ld, 8 |
1095 | 0 | DEBUGVAR(1,63,"data_stream_element(): extra count")); |
1096 | 0 | } |
1097 | 0 | if (byte_aligned) |
1098 | 0 | faad_byte_align(ld); |
1099 | |
|
1100 | 0 | for (i = 0; i < count; i++) |
1101 | 0 | { |
1102 | 0 | faad_getbits(ld, LEN_BYTE |
1103 | 0 | DEBUGVAR(1,64,"data_stream_element(): data_stream_byte")); |
1104 | 0 | } |
1105 | |
|
1106 | 0 | return count; |
1107 | 0 | } |
1108 | | |
1109 | | /* Table 4.4.11 */ |
1110 | | static uint8_t fill_element(NeAACDecStruct *hDecoder, bitfile *ld, drc_info *drc |
1111 | | #ifdef SBR_DEC |
1112 | | ,uint8_t sbr_ele |
1113 | | #endif |
1114 | | ) |
1115 | 0 | { |
1116 | 0 | uint16_t count; |
1117 | 0 | #ifdef SBR_DEC |
1118 | 0 | uint8_t bs_extension_type; |
1119 | 0 | #endif |
1120 | |
|
1121 | 0 | count = (uint16_t)faad_getbits(ld, 4 |
1122 | 0 | DEBUGVAR(1,65,"fill_element(): count")); |
1123 | 0 | if (count == 15) |
1124 | 0 | { |
1125 | 0 | count += (uint16_t)faad_getbits(ld, 8 |
1126 | 0 | DEBUGVAR(1,66,"fill_element(): extra count")) - 1; |
1127 | 0 | } |
1128 | |
|
1129 | 0 | if (count > 0) |
1130 | 0 | { |
1131 | 0 | #ifdef SBR_DEC |
1132 | 0 | bs_extension_type = (uint8_t)faad_showbits(ld, 4); |
1133 | |
|
1134 | 0 | if ((bs_extension_type == EXT_SBR_DATA) || |
1135 | 0 | (bs_extension_type == EXT_SBR_DATA_CRC)) |
1136 | 0 | { |
1137 | 0 | if (sbr_ele == INVALID_SBR_ELEMENT) |
1138 | 0 | return 24; |
1139 | | |
1140 | 0 | if (!hDecoder->sbr[sbr_ele]) |
1141 | 0 | { |
1142 | 0 | hDecoder->sbr[sbr_ele] = sbrDecodeInit(hDecoder->frameLength, |
1143 | 0 | hDecoder->element_id[sbr_ele], 2*get_sample_rate(hDecoder->sf_index), |
1144 | 0 | hDecoder->downSampledSBR |
1145 | | #ifdef DRM |
1146 | | , 0 |
1147 | | #endif |
1148 | 0 | ); |
1149 | 0 | } |
1150 | 0 | if (!hDecoder->sbr[sbr_ele]) |
1151 | 0 | return 19; |
1152 | | |
1153 | 0 | hDecoder->sbr_present_flag = 1; |
1154 | | |
1155 | | /* parse the SBR data */ |
1156 | 0 | hDecoder->sbr[sbr_ele]->ret = sbr_extension_data(ld, hDecoder->sbr[sbr_ele], count, |
1157 | 0 | hDecoder->postSeekResetFlag); |
1158 | |
|
1159 | | #if 0 |
1160 | | if (hDecoder->sbr[sbr_ele]->ret > 0) |
1161 | | { |
1162 | | printf("%s\n", NeAACDecGetErrorMessage(hDecoder->sbr[sbr_ele]->ret)); |
1163 | | } |
1164 | | #endif |
1165 | |
|
1166 | 0 | #if (defined(PS_DEC) || defined(DRM_PS)) |
1167 | 0 | if (hDecoder->sbr[sbr_ele]->ps_used) |
1168 | 0 | { |
1169 | 0 | hDecoder->ps_used[sbr_ele] = 1; |
1170 | | |
1171 | | /* set element independent flag to 1 as well */ |
1172 | 0 | hDecoder->ps_used_global = 1; |
1173 | 0 | } |
1174 | 0 | #endif |
1175 | 0 | } else { |
1176 | 0 | #endif |
1177 | 0 | #ifndef DRM |
1178 | 0 | while (count > 0) |
1179 | 0 | { |
1180 | 0 | uint16_t payload_bytes = extension_payload(ld, drc, count); |
1181 | 0 | if (payload_bytes <= count) { |
1182 | 0 | count -= payload_bytes; |
1183 | 0 | } else { |
1184 | 0 | count = 0; |
1185 | 0 | } |
1186 | 0 | } |
1187 | | #else |
1188 | | (void)drc; |
1189 | | return 30; |
1190 | | #endif |
1191 | 0 | #ifdef SBR_DEC |
1192 | 0 | } |
1193 | 0 | #endif |
1194 | 0 | } |
1195 | | |
1196 | 0 | return 0; |
1197 | 0 | } |
1198 | | |
1199 | | /* Table 4.4.12 */ |
1200 | | #ifdef SSR_DEC |
1201 | | static void gain_control_data(bitfile *ld, ic_stream *ics) |
1202 | | { |
1203 | | uint8_t bd, wd, ad; |
1204 | | ssr_info *ssr = &(ics->ssr); |
1205 | | |
1206 | | ssr->max_band = (uint8_t)faad_getbits(ld, 2 |
1207 | | DEBUGVAR(1,1000,"gain_control_data(): max_band")); |
1208 | | |
1209 | | if (ics->window_sequence == ONLY_LONG_SEQUENCE) |
1210 | | { |
1211 | | for (bd = 1; bd <= ssr->max_band; bd++) |
1212 | | { |
1213 | | for (wd = 0; wd < 1; wd++) |
1214 | | { |
1215 | | ssr->adjust_num[bd][wd] = (uint8_t)faad_getbits(ld, 3 |
1216 | | DEBUGVAR(1,1001,"gain_control_data(): adjust_num")); |
1217 | | |
1218 | | for (ad = 0; ad < ssr->adjust_num[bd][wd]; ad++) |
1219 | | { |
1220 | | ssr->alevcode[bd][wd][ad] = (uint8_t)faad_getbits(ld, 4 |
1221 | | DEBUGVAR(1,1002,"gain_control_data(): alevcode")); |
1222 | | ssr->aloccode[bd][wd][ad] = (uint8_t)faad_getbits(ld, 5 |
1223 | | DEBUGVAR(1,1003,"gain_control_data(): aloccode")); |
1224 | | } |
1225 | | } |
1226 | | } |
1227 | | } else if (ics->window_sequence == LONG_START_SEQUENCE) { |
1228 | | for (bd = 1; bd <= ssr->max_band; bd++) |
1229 | | { |
1230 | | for (wd = 0; wd < 2; wd++) |
1231 | | { |
1232 | | ssr->adjust_num[bd][wd] = (uint8_t)faad_getbits(ld, 3 |
1233 | | DEBUGVAR(1,1001,"gain_control_data(): adjust_num")); |
1234 | | |
1235 | | for (ad = 0; ad < ssr->adjust_num[bd][wd]; ad++) |
1236 | | { |
1237 | | ssr->alevcode[bd][wd][ad] = (uint8_t)faad_getbits(ld, 4 |
1238 | | DEBUGVAR(1,1002,"gain_control_data(): alevcode")); |
1239 | | if (wd == 0) |
1240 | | { |
1241 | | ssr->aloccode[bd][wd][ad] = (uint8_t)faad_getbits(ld, 4 |
1242 | | DEBUGVAR(1,1003,"gain_control_data(): aloccode")); |
1243 | | } else { |
1244 | | ssr->aloccode[bd][wd][ad] = (uint8_t)faad_getbits(ld, 2 |
1245 | | DEBUGVAR(1,1003,"gain_control_data(): aloccode")); |
1246 | | } |
1247 | | } |
1248 | | } |
1249 | | } |
1250 | | } else if (ics->window_sequence == EIGHT_SHORT_SEQUENCE) { |
1251 | | for (bd = 1; bd <= ssr->max_band; bd++) |
1252 | | { |
1253 | | for (wd = 0; wd < 8; wd++) |
1254 | | { |
1255 | | ssr->adjust_num[bd][wd] = (uint8_t)faad_getbits(ld, 3 |
1256 | | DEBUGVAR(1,1001,"gain_control_data(): adjust_num")); |
1257 | | |
1258 | | for (ad = 0; ad < ssr->adjust_num[bd][wd]; ad++) |
1259 | | { |
1260 | | ssr->alevcode[bd][wd][ad] = (uint8_t)faad_getbits(ld, 4 |
1261 | | DEBUGVAR(1,1002,"gain_control_data(): alevcode")); |
1262 | | ssr->aloccode[bd][wd][ad] = (uint8_t)faad_getbits(ld, 2 |
1263 | | DEBUGVAR(1,1003,"gain_control_data(): aloccode")); |
1264 | | } |
1265 | | } |
1266 | | } |
1267 | | } else if (ics->window_sequence == LONG_STOP_SEQUENCE) { |
1268 | | for (bd = 1; bd <= ssr->max_band; bd++) |
1269 | | { |
1270 | | for (wd = 0; wd < 2; wd++) |
1271 | | { |
1272 | | ssr->adjust_num[bd][wd] = (uint8_t)faad_getbits(ld, 3 |
1273 | | DEBUGVAR(1,1001,"gain_control_data(): adjust_num")); |
1274 | | |
1275 | | for (ad = 0; ad < ssr->adjust_num[bd][wd]; ad++) |
1276 | | { |
1277 | | ssr->alevcode[bd][wd][ad] = (uint8_t)faad_getbits(ld, 4 |
1278 | | DEBUGVAR(1,1002,"gain_control_data(): alevcode")); |
1279 | | |
1280 | | if (wd == 0) |
1281 | | { |
1282 | | ssr->aloccode[bd][wd][ad] = (uint8_t)faad_getbits(ld, 4 |
1283 | | DEBUGVAR(1,1003,"gain_control_data(): aloccode")); |
1284 | | } else { |
1285 | | ssr->aloccode[bd][wd][ad] = (uint8_t)faad_getbits(ld, 5 |
1286 | | DEBUGVAR(1,1003,"gain_control_data(): aloccode")); |
1287 | | } |
1288 | | } |
1289 | | } |
1290 | | } |
1291 | | } |
1292 | | } |
1293 | | #endif |
1294 | | |
1295 | | #ifdef DRM |
1296 | | /* Table 4.4.13 ASME */ |
1297 | | void DRM_aac_scalable_main_element(NeAACDecStruct *hDecoder, NeAACDecFrameInfo *hInfo, |
1298 | | bitfile *ld, program_config *pce, drc_info *drc) |
1299 | | { |
1300 | | uint8_t channels = hDecoder->fr_channels = 0; |
1301 | | uint8_t this_layer_stereo = (hDecoder->channelConfiguration > 1) ? 1 : 0; |
1302 | | element cpe = {0}; |
1303 | | ic_stream *ics1 = &(cpe.ics1); |
1304 | | ic_stream *ics2 = &(cpe.ics2); |
1305 | | ALIGN int16_t spec_data1[1024] = {0}; |
1306 | | ALIGN int16_t spec_data2[1024] = {0}; |
1307 | | |
1308 | | (void)drc; /* TODO: remove unused parameter? */ |
1309 | | (void)pce; /* TODO: remove unused parameter? */ |
1310 | | |
1311 | | hDecoder->fr_ch_ele = 0; |
1312 | | |
1313 | | hInfo->error = DRM_aac_scalable_main_header(hDecoder, ics1, ics2, ld, this_layer_stereo); |
1314 | | if (hInfo->error > 0) |
1315 | | return; |
1316 | | |
1317 | | cpe.common_window = 1; |
1318 | | if (this_layer_stereo) |
1319 | | { |
1320 | | hDecoder->element_id[0] = ID_CPE; |
1321 | | if (hDecoder->element_output_channels[hDecoder->fr_ch_ele] == 0) |
1322 | | hDecoder->element_output_channels[hDecoder->fr_ch_ele] = 2; |
1323 | | } else { |
1324 | | hDecoder->element_id[0] = ID_SCE; |
1325 | | } |
1326 | | |
1327 | | if (this_layer_stereo) |
1328 | | { |
1329 | | cpe.channel = 0; |
1330 | | cpe.paired_channel = 1; |
1331 | | } |
1332 | | |
1333 | | |
1334 | | /* Stereo2 / Mono1 */ |
1335 | | ics1->tns_data_present = faad_get1bit(ld); |
1336 | | |
1337 | | #if defined(LTP_DEC) |
1338 | | ics1->ltp.data_present = faad_get1bit(ld); |
1339 | | #elif defined (DRM) |
1340 | | if(faad_get1bit(ld)) { |
1341 | | hInfo->error = 26; |
1342 | | return; |
1343 | | } |
1344 | | #else |
1345 | | faad_get1bit(ld); |
1346 | | #endif |
1347 | | |
1348 | | hInfo->error = side_info(hDecoder, &cpe, ld, ics1, 1); |
1349 | | if (hInfo->error > 0) |
1350 | | return; |
1351 | | if (this_layer_stereo) |
1352 | | { |
1353 | | /* Stereo3 */ |
1354 | | ics2->tns_data_present = faad_get1bit(ld); |
1355 | | #ifdef LTP_DEC |
1356 | | ics1->ltp.data_present = |
1357 | | #endif |
1358 | | faad_get1bit(ld); |
1359 | | hInfo->error = side_info(hDecoder, &cpe, ld, ics2, 1); |
1360 | | if (hInfo->error > 0) |
1361 | | return; |
1362 | | } |
1363 | | /* Stereo4 / Mono2 */ |
1364 | | if (ics1->tns_data_present) |
1365 | | tns_data(ics1, &(ics1->tns), ld); |
1366 | | if (this_layer_stereo) |
1367 | | { |
1368 | | /* Stereo5 */ |
1369 | | if (ics2->tns_data_present) |
1370 | | tns_data(ics2, &(ics2->tns), ld); |
1371 | | } |
1372 | | |
1373 | | #ifdef DRM |
1374 | | /* CRC check */ |
1375 | | if (hDecoder->object_type == DRM_ER_LC) |
1376 | | { |
1377 | | if ((hInfo->error = (uint8_t)faad_check_CRC(ld, (uint16_t)faad_get_processed_bits(ld) - 8)) > 0) |
1378 | | return; |
1379 | | } |
1380 | | #endif |
1381 | | |
1382 | | /* Stereo6 / Mono3 */ |
1383 | | /* error resilient spectral data decoding */ |
1384 | | if ((hInfo->error = reordered_spectral_data(hDecoder, ics1, ld, spec_data1)) > 0) |
1385 | | { |
1386 | | return; |
1387 | | } |
1388 | | if (this_layer_stereo) |
1389 | | { |
1390 | | /* Stereo7 */ |
1391 | | /* error resilient spectral data decoding */ |
1392 | | if ((hInfo->error = reordered_spectral_data(hDecoder, ics2, ld, spec_data2)) > 0) |
1393 | | { |
1394 | | return; |
1395 | | } |
1396 | | } |
1397 | | |
1398 | | |
1399 | | #ifdef DRM |
1400 | | #ifdef SBR_DEC |
1401 | | /* In case of DRM we need to read the SBR info before channel reconstruction */ |
1402 | | if ((hDecoder->sbr_present_flag == 1) && (hDecoder->object_type == DRM_ER_LC)) |
1403 | | { |
1404 | | bitfile ld_sbr = {0}; |
1405 | | uint32_t i; |
1406 | | uint16_t count = 0; |
1407 | | uint8_t *revbuffer; |
1408 | | uint8_t *prevbufstart; |
1409 | | uint8_t *pbufend; |
1410 | | |
1411 | | /* all forward bitreading should be finished at this point */ |
1412 | | uint32_t bitsconsumed = faad_get_processed_bits(ld); |
1413 | | uint32_t buffer_size = faad_origbitbuffer_size(ld); |
1414 | | uint8_t *buffer = (uint8_t*)faad_origbitbuffer(ld); |
1415 | | |
1416 | | if (bitsconsumed + 8 > buffer_size*8) |
1417 | | { |
1418 | | hInfo->error = 14; |
1419 | | return; |
1420 | | } |
1421 | | |
1422 | | if (!hDecoder->sbr[0]) |
1423 | | { |
1424 | | hDecoder->sbr[0] = sbrDecodeInit(hDecoder->frameLength, hDecoder->element_id[0], |
1425 | | 2*get_sample_rate(hDecoder->sf_index), 0 /* ds SBR */, 1); |
1426 | | } |
1427 | | if (!hDecoder->sbr[0]) |
1428 | | { |
1429 | | hInfo->error = 19; |
1430 | | return; |
1431 | | } |
1432 | | |
1433 | | /* Reverse bit reading of SBR data in DRM audio frame */ |
1434 | | revbuffer = (uint8_t*)faad_malloc(buffer_size*sizeof(uint8_t)); |
1435 | | prevbufstart = revbuffer; |
1436 | | pbufend = &buffer[buffer_size - 1]; |
1437 | | for (i = 0; i < buffer_size; i++) |
1438 | | *prevbufstart++ = reverse_byte(*pbufend--); |
1439 | | |
1440 | | /* Set SBR data */ |
1441 | | /* consider 8 bits from AAC-CRC */ |
1442 | | /* SBR buffer size is original buffer size minus AAC buffer size */ |
1443 | | count = (uint16_t)bit2byte(buffer_size*8 - bitsconsumed); |
1444 | | faad_initbits(&ld_sbr, revbuffer, count); |
1445 | | |
1446 | | hDecoder->sbr[0]->sample_rate = get_sample_rate(hDecoder->sf_index); |
1447 | | hDecoder->sbr[0]->sample_rate *= 2; |
1448 | | |
1449 | | faad_getbits(&ld_sbr, 8); /* Skip 8-bit CRC */ |
1450 | | |
1451 | | hDecoder->sbr[0]->ret = sbr_extension_data(&ld_sbr, hDecoder->sbr[0], count, hDecoder->postSeekResetFlag); |
1452 | | #if (defined(PS_DEC) || defined(DRM_PS)) |
1453 | | if (hDecoder->sbr[0]->ps_used) |
1454 | | { |
1455 | | hDecoder->ps_used[0] = 1; |
1456 | | hDecoder->ps_used_global = 1; |
1457 | | } |
1458 | | #endif |
1459 | | |
1460 | | if (ld_sbr.error) |
1461 | | { |
1462 | | hDecoder->sbr[0]->ret = 1; |
1463 | | } |
1464 | | |
1465 | | /* check CRC */ |
1466 | | /* no need to check it if there was already an error */ |
1467 | | if (hDecoder->sbr[0]->ret == 0) |
1468 | | hDecoder->sbr[0]->ret = (uint8_t)faad_check_CRC(&ld_sbr, (uint16_t)faad_get_processed_bits(&ld_sbr) - 8); |
1469 | | |
1470 | | /* SBR data was corrupted, disable it until the next header */ |
1471 | | if (hDecoder->sbr[0]->ret != 0) |
1472 | | { |
1473 | | hDecoder->sbr[0]->header_count = 0; |
1474 | | } |
1475 | | |
1476 | | faad_endbits(&ld_sbr); |
1477 | | |
1478 | | if (revbuffer) |
1479 | | faad_free(revbuffer); |
1480 | | } |
1481 | | #endif |
1482 | | #endif |
1483 | | |
1484 | | if (this_layer_stereo) |
1485 | | { |
1486 | | hInfo->error = reconstruct_channel_pair(hDecoder, ics1, ics2, &cpe, spec_data1, spec_data2); |
1487 | | if (hInfo->error > 0) |
1488 | | return; |
1489 | | } else { |
1490 | | hInfo->error = reconstruct_single_channel(hDecoder, ics1, &cpe, spec_data1); |
1491 | | if (hInfo->error > 0) |
1492 | | return; |
1493 | | } |
1494 | | |
1495 | | /* map output channels position to internal data channels */ |
1496 | | if (hDecoder->element_output_channels[hDecoder->fr_ch_ele] == 2) |
1497 | | { |
1498 | | /* this might be faulty when pce_set is true */ |
1499 | | hDecoder->internal_channel[channels] = channels; |
1500 | | hDecoder->internal_channel[channels+1] = channels+1; |
1501 | | } else { |
1502 | | hDecoder->internal_channel[channels] = channels; |
1503 | | } |
1504 | | |
1505 | | hDecoder->fr_channels += hDecoder->element_output_channels[hDecoder->fr_ch_ele]; |
1506 | | hDecoder->fr_ch_ele++; |
1507 | | |
1508 | | return; |
1509 | | } |
1510 | | |
1511 | | /* Table 4.4.15 */ |
1512 | | static int8_t DRM_aac_scalable_main_header(NeAACDecStruct *hDecoder, ic_stream *ics1, ic_stream *ics2, |
1513 | | bitfile *ld, uint8_t this_layer_stereo) |
1514 | | { |
1515 | | uint8_t retval = 0; |
1516 | | uint8_t ics_reserved_bit; |
1517 | | |
1518 | | ics_reserved_bit = faad_get1bit(ld |
1519 | | DEBUGVAR(1,300,"aac_scalable_main_header(): ics_reserved_bits")); |
1520 | | if (ics_reserved_bit != 0) |
1521 | | return 32; |
1522 | | ics1->window_sequence = (uint8_t)faad_getbits(ld, 2 |
1523 | | DEBUGVAR(1,301,"aac_scalable_main_header(): window_sequence")); |
1524 | | ics1->window_shape = faad_get1bit(ld |
1525 | | DEBUGVAR(1,302,"aac_scalable_main_header(): window_shape")); |
1526 | | |
1527 | | if (ics1->window_sequence == EIGHT_SHORT_SEQUENCE) |
1528 | | { |
1529 | | ics1->max_sfb = (uint8_t)faad_getbits(ld, 4 |
1530 | | DEBUGVAR(1,303,"aac_scalable_main_header(): max_sfb (short)")); |
1531 | | ics1->scale_factor_grouping = (uint8_t)faad_getbits(ld, 7 |
1532 | | DEBUGVAR(1,304,"aac_scalable_main_header(): scale_factor_grouping")); |
1533 | | } else { |
1534 | | ics1->max_sfb = (uint8_t)faad_getbits(ld, 6 |
1535 | | DEBUGVAR(1,305,"aac_scalable_main_header(): max_sfb (long)")); |
1536 | | } |
1537 | | |
1538 | | /* get the grouping information */ |
1539 | | if ((retval = window_grouping_info(hDecoder, ics1)) > 0) |
1540 | | return retval; |
1541 | | |
1542 | | /* should be an error */ |
1543 | | /* check the range of max_sfb */ |
1544 | | if (ics1->max_sfb > ics1->num_swb) |
1545 | | return 16; |
1546 | | |
1547 | | if (this_layer_stereo) |
1548 | | { |
1549 | | ics1->ms_mask_present = (uint8_t)faad_getbits(ld, 2 |
1550 | | DEBUGVAR(1,306,"aac_scalable_main_header(): ms_mask_present")); |
1551 | | if (ics1->ms_mask_present == 3) |
1552 | | { |
1553 | | /* bitstream error */ |
1554 | | return 32; |
1555 | | } |
1556 | | if (ics1->ms_mask_present == 1) |
1557 | | { |
1558 | | uint8_t g, sfb; |
1559 | | for (g = 0; g < ics1->num_window_groups; g++) |
1560 | | { |
1561 | | for (sfb = 0; sfb < ics1->max_sfb; sfb++) |
1562 | | { |
1563 | | ics1->ms_used[g][sfb] = faad_get1bit(ld |
1564 | | DEBUGVAR(1,307,"aac_scalable_main_header(): faad_get1bit")); |
1565 | | } |
1566 | | } |
1567 | | } |
1568 | | |
1569 | | memcpy(ics2, ics1, sizeof(ic_stream)); |
1570 | | } else { |
1571 | | ics1->ms_mask_present = 0; |
1572 | | } |
1573 | | |
1574 | | return 0; |
1575 | | } |
1576 | | #endif |
1577 | | |
1578 | | static uint8_t side_info(NeAACDecStruct *hDecoder, element *ele, |
1579 | | bitfile *ld, ic_stream *ics, uint8_t scal_flag) |
1580 | 0 | { |
1581 | 0 | uint8_t result; |
1582 | |
|
1583 | 0 | ics->global_gain = (uint8_t)faad_getbits(ld, 8 |
1584 | 0 | DEBUGVAR(1,67,"individual_channel_stream(): global_gain")); |
1585 | |
|
1586 | 0 | if (!ele->common_window && !scal_flag) |
1587 | 0 | { |
1588 | 0 | if ((result = ics_info(hDecoder, ics, ld, ele->common_window)) > 0) |
1589 | 0 | return result; |
1590 | 0 | } |
1591 | | |
1592 | 0 | if ((result = section_data(hDecoder, ics, ld)) > 0) |
1593 | 0 | return result; |
1594 | | |
1595 | 0 | if ((result = scale_factor_data(hDecoder, ics, ld)) > 0) |
1596 | 0 | return result; |
1597 | | |
1598 | 0 | if (!scal_flag) |
1599 | 0 | { |
1600 | | /** |
1601 | | ** NOTE: It could be that pulse data is available in scalable AAC too, |
1602 | | ** as said in Amendment 1, this could be only the case for ER AAC, |
1603 | | ** though. (have to check this out later) |
1604 | | **/ |
1605 | | /* get pulse data */ |
1606 | 0 | if ((ics->pulse_data_present = faad_get1bit(ld |
1607 | 0 | DEBUGVAR(1,68,"individual_channel_stream(): pulse_data_present"))) & 1) |
1608 | 0 | { |
1609 | 0 | if ((result = pulse_data(ics, &(ics->pul), ld)) > 0) |
1610 | 0 | return result; |
1611 | 0 | } |
1612 | | |
1613 | | /* get tns data */ |
1614 | 0 | if ((ics->tns_data_present = faad_get1bit(ld |
1615 | 0 | DEBUGVAR(1,69,"individual_channel_stream(): tns_data_present"))) & 1) |
1616 | 0 | { |
1617 | 0 | #ifdef ERROR_RESILIENCE |
1618 | 0 | if (hDecoder->object_type < ER_OBJECT_START) |
1619 | 0 | #endif |
1620 | 0 | tns_data(ics, &(ics->tns), ld); |
1621 | 0 | } |
1622 | | |
1623 | | /* get gain control data */ |
1624 | 0 | if ((ics->gain_control_data_present = faad_get1bit(ld |
1625 | 0 | DEBUGVAR(1,70,"individual_channel_stream(): gain_control_data_present"))) & 1) |
1626 | 0 | { |
1627 | | #ifdef SSR_DEC |
1628 | | if (hDecoder->object_type != SSR) |
1629 | | return 1; |
1630 | | else |
1631 | | gain_control_data(ld, ics); |
1632 | | #else |
1633 | 0 | return 1; |
1634 | 0 | #endif |
1635 | 0 | } |
1636 | 0 | } |
1637 | | |
1638 | 0 | #ifdef ERROR_RESILIENCE |
1639 | 0 | if (hDecoder->aacSpectralDataResilienceFlag) |
1640 | 0 | { |
1641 | 0 | ics->length_of_reordered_spectral_data = (uint16_t)faad_getbits(ld, 14 |
1642 | 0 | DEBUGVAR(1,147,"individual_channel_stream(): length_of_reordered_spectral_data")); |
1643 | |
|
1644 | 0 | if (hDecoder->channelConfiguration == 2) |
1645 | 0 | { |
1646 | 0 | if (ics->length_of_reordered_spectral_data > 6144) |
1647 | 0 | ics->length_of_reordered_spectral_data = 6144; |
1648 | 0 | } else { |
1649 | 0 | if (ics->length_of_reordered_spectral_data > 12288) |
1650 | 0 | ics->length_of_reordered_spectral_data = 12288; |
1651 | 0 | } |
1652 | |
|
1653 | 0 | ics->length_of_longest_codeword = (uint8_t)faad_getbits(ld, 6 |
1654 | 0 | DEBUGVAR(1,148,"individual_channel_stream(): length_of_longest_codeword")); |
1655 | 0 | if (ics->length_of_longest_codeword >= 49) |
1656 | 0 | ics->length_of_longest_codeword = 49; |
1657 | 0 | } |
1658 | | |
1659 | | /* RVLC spectral data is put here */ |
1660 | 0 | if (hDecoder->aacScalefactorDataResilienceFlag) |
1661 | 0 | { |
1662 | 0 | if ((result = rvlc_decode_scale_factors(ics, ld)) > 0) |
1663 | 0 | return result; |
1664 | 0 | } |
1665 | 0 | #endif |
1666 | | |
1667 | 0 | return 0; |
1668 | 0 | } |
1669 | | |
1670 | | /* Table 4.4.24 */ |
1671 | | static uint8_t individual_channel_stream(NeAACDecStruct *hDecoder, element *ele, |
1672 | | bitfile *ld, ic_stream *ics, uint8_t scal_flag, |
1673 | | int16_t *spec_data) |
1674 | 0 | { |
1675 | 0 | uint8_t result; |
1676 | |
|
1677 | 0 | result = side_info(hDecoder, ele, ld, ics, scal_flag); |
1678 | 0 | if (result > 0) |
1679 | 0 | return result; |
1680 | | |
1681 | 0 | if (hDecoder->object_type >= ER_OBJECT_START) |
1682 | 0 | { |
1683 | 0 | if (ics->tns_data_present) |
1684 | 0 | tns_data(ics, &(ics->tns), ld); |
1685 | 0 | } |
1686 | |
|
1687 | | #ifdef DRM |
1688 | | /* CRC check */ |
1689 | | if (hDecoder->object_type == DRM_ER_LC) |
1690 | | { |
1691 | | if ((result = (uint8_t)faad_check_CRC(ld, (uint16_t)faad_get_processed_bits(ld) - 8)) > 0) |
1692 | | return result; |
1693 | | } |
1694 | | #endif |
1695 | |
|
1696 | 0 | #ifdef ERROR_RESILIENCE |
1697 | 0 | if (hDecoder->aacSpectralDataResilienceFlag) |
1698 | 0 | { |
1699 | | /* error resilient spectral data decoding */ |
1700 | 0 | if ((result = reordered_spectral_data(hDecoder, ics, ld, spec_data)) > 0) |
1701 | 0 | { |
1702 | 0 | return result; |
1703 | 0 | } |
1704 | 0 | } else { |
1705 | 0 | #endif |
1706 | | /* decode the spectral data */ |
1707 | 0 | if ((result = spectral_data(hDecoder, ics, ld, spec_data)) > 0) |
1708 | 0 | { |
1709 | 0 | return result; |
1710 | 0 | } |
1711 | 0 | #ifdef ERROR_RESILIENCE |
1712 | 0 | } |
1713 | 0 | #endif |
1714 | | |
1715 | | /* pulse coding reconstruction */ |
1716 | 0 | if (ics->pulse_data_present) |
1717 | 0 | { |
1718 | 0 | if (ics->window_sequence != EIGHT_SHORT_SEQUENCE) |
1719 | 0 | { |
1720 | 0 | if ((result = pulse_decode(ics, spec_data, hDecoder->frameLength)) > 0) |
1721 | 0 | return result; |
1722 | 0 | } else { |
1723 | 0 | return 2; /* pulse coding not allowed for short blocks */ |
1724 | 0 | } |
1725 | 0 | } |
1726 | | |
1727 | 0 | return 0; |
1728 | 0 | } |
1729 | | |
1730 | | /* Table 4.4.25 */ |
1731 | | static uint8_t section_data(NeAACDecStruct *hDecoder, ic_stream *ics, bitfile *ld) |
1732 | 0 | { |
1733 | 0 | uint8_t g; |
1734 | 0 | uint8_t sect_esc_val, sect_bits; |
1735 | 0 | uint8_t sect_lim; /* 51 or 120, anyways less than 127. */ |
1736 | |
|
1737 | 0 | if (ics->window_sequence == EIGHT_SHORT_SEQUENCE) { |
1738 | 0 | sect_bits = 3; |
1739 | 0 | sect_lim = 8 * 15; |
1740 | 0 | } else { |
1741 | 0 | sect_bits = 5; |
1742 | 0 | sect_lim = MAX_SFB; |
1743 | 0 | } |
1744 | 0 | sect_esc_val = (1u<<sect_bits) - 1; |
1745 | |
|
1746 | | #if 0 |
1747 | | printf("\ntotal sfb %d\n", ics->max_sfb); |
1748 | | printf(" sect top cb\n"); |
1749 | | #endif |
1750 | |
|
1751 | 0 | for (g = 0; g < ics->num_window_groups; g++) |
1752 | 0 | { |
1753 | 0 | uint8_t k = 0; |
1754 | 0 | uint8_t i = 0; |
1755 | |
|
1756 | 0 | while (k < ics->max_sfb) |
1757 | 0 | { |
1758 | 0 | #ifdef ERROR_RESILIENCE |
1759 | 0 | uint8_t vcb11 = 0; |
1760 | 0 | #endif |
1761 | 0 | uint8_t sfb; |
1762 | 0 | uint8_t sect_len_incr; |
1763 | 0 | uint8_t sect_len = 0; |
1764 | 0 | uint8_t sect_cb_bits = 4; |
1765 | | |
1766 | | /* if "faad_getbits" detects error and returns "0", "k" is never |
1767 | | incremented and we cannot leave the while loop */ |
1768 | 0 | if (ld->error != 0) |
1769 | 0 | return 14; |
1770 | 0 | if (i >= sect_lim) |
1771 | 0 | return 15; |
1772 | | |
1773 | 0 | #ifdef ERROR_RESILIENCE |
1774 | 0 | if (hDecoder->aacSectionDataResilienceFlag) |
1775 | 0 | sect_cb_bits = 5; |
1776 | 0 | #endif |
1777 | |
|
1778 | 0 | ics->sect_cb[g][i] = (uint8_t)faad_getbits(ld, sect_cb_bits |
1779 | 0 | DEBUGVAR(1,71,"section_data(): sect_cb")); |
1780 | |
|
1781 | 0 | if (ics->sect_cb[g][i] == 12) |
1782 | 0 | return 32; |
1783 | | |
1784 | | #if 0 |
1785 | | printf("%d\n", ics->sect_cb[g][i]); |
1786 | | #endif |
1787 | | |
1788 | 0 | #ifndef DRM |
1789 | 0 | if (ics->sect_cb[g][i] == NOISE_HCB) |
1790 | 0 | ics->noise_used = 1; |
1791 | | #else |
1792 | | /* PNS not allowed in DRM */ |
1793 | | if (ics->sect_cb[g][i] == NOISE_HCB) |
1794 | | return 29; |
1795 | | #endif |
1796 | 0 | if (ics->sect_cb[g][i] == INTENSITY_HCB2 || ics->sect_cb[g][i] == INTENSITY_HCB) |
1797 | 0 | ics->is_used = 1; |
1798 | |
|
1799 | 0 | #ifdef ERROR_RESILIENCE |
1800 | 0 | if (hDecoder->aacSectionDataResilienceFlag) |
1801 | 0 | { |
1802 | 0 | if ((ics->sect_cb[g][i] == 11) || |
1803 | 0 | ((ics->sect_cb[g][i] >= 16) && (ics->sect_cb[g][i] <= 32))) |
1804 | 0 | { |
1805 | 0 | vcb11 = 1; |
1806 | 0 | } |
1807 | 0 | } |
1808 | 0 | if (vcb11) |
1809 | 0 | { |
1810 | 0 | sect_len_incr = 1; |
1811 | 0 | } else { |
1812 | 0 | #endif |
1813 | 0 | sect_len_incr = (uint8_t)faad_getbits(ld, sect_bits |
1814 | 0 | DEBUGVAR(1,72,"section_data(): sect_len_incr")); |
1815 | 0 | #ifdef ERROR_RESILIENCE |
1816 | 0 | } |
1817 | 0 | #endif |
1818 | 0 | while (sect_len_incr == sect_esc_val /* && |
1819 | 0 | (k+sect_len < ics->max_sfb)*/) |
1820 | 0 | { |
1821 | 0 | sect_len += sect_len_incr; |
1822 | 0 | if (sect_len > sect_lim) |
1823 | 0 | return 15; |
1824 | 0 | sect_len_incr = (uint8_t)faad_getbits(ld, sect_bits |
1825 | 0 | DEBUGVAR(1,72,"section_data(): sect_len_incr")); |
1826 | 0 | } |
1827 | | |
1828 | 0 | sect_len += sect_len_incr; |
1829 | |
|
1830 | 0 | ics->sect_start[g][i] = k; |
1831 | 0 | ics->sect_end[g][i] = k + sect_len; |
1832 | |
|
1833 | | #if 0 |
1834 | | printf("%d\n", ics->sect_start[g][i]); |
1835 | | #endif |
1836 | | #if 0 |
1837 | | printf("%d\n", ics->sect_end[g][i]); |
1838 | | #endif |
1839 | |
|
1840 | 0 | if (sect_len > sect_lim) |
1841 | 0 | return 15; |
1842 | 0 | if (k + sect_len > sect_lim) |
1843 | 0 | return 15; |
1844 | | |
1845 | 0 | for (sfb = k; sfb < k + sect_len; sfb++) |
1846 | 0 | { |
1847 | 0 | ics->sfb_cb[g][sfb] = ics->sect_cb[g][i]; |
1848 | | #if 0 |
1849 | | printf("%d\n", ics->sfb_cb[g][sfb]); |
1850 | | #endif |
1851 | 0 | } |
1852 | |
|
1853 | | #if 0 |
1854 | | printf(" %6d %6d %6d\n", |
1855 | | i, |
1856 | | ics->sect_end[g][i], |
1857 | | ics->sect_cb[g][i]); |
1858 | | #endif |
1859 | |
|
1860 | 0 | k += sect_len; /* k <= sect_lim */ |
1861 | 0 | i++; |
1862 | 0 | } |
1863 | 0 | ics->num_sec[g] = i; |
1864 | | |
1865 | | /* the sum of all sect_len_incr elements for a given window |
1866 | | * group shall equal max_sfb */ |
1867 | 0 | if (k != ics->max_sfb) |
1868 | 0 | { |
1869 | 0 | return 32; |
1870 | 0 | } |
1871 | | #if 0 |
1872 | | printf("%d\n", ics->num_sec[g]); |
1873 | | #endif |
1874 | 0 | } |
1875 | | |
1876 | | #if 0 |
1877 | | printf("\n"); |
1878 | | #endif |
1879 | | |
1880 | 0 | return 0; |
1881 | 0 | } |
1882 | | |
1883 | | /* |
1884 | | * decode_scale_factors() |
1885 | | * decodes the scalefactors from the bitstream |
1886 | | */ |
1887 | | /* |
1888 | | * All scalefactors (and also the stereo positions and pns energies) are |
1889 | | * transmitted using Huffman coded DPCM relative to the previous active |
1890 | | * scalefactor (respectively previous stereo position or previous pns energy, |
1891 | | * see subclause 4.6.2 and 4.6.3). The first active scalefactor is |
1892 | | * differentially coded relative to the global gain. |
1893 | | */ |
1894 | | static uint8_t decode_scale_factors(ic_stream *ics, bitfile *ld) |
1895 | 0 | { |
1896 | 0 | uint8_t g, sfb; |
1897 | 0 | int16_t t; |
1898 | |
|
1899 | 0 | int16_t scale_factor = ics->global_gain; |
1900 | 0 | int16_t is_position = 0; |
1901 | 0 | int16_t scale_factor_max = 255; |
1902 | | #ifdef FIXED_POINT |
1903 | | /* TODO: consider rolling out to regular build. */ |
1904 | | #ifdef FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION |
1905 | | /* The value is inexact, adjusted to current fuzzer findings. */ |
1906 | | scale_factor_max = 165; |
1907 | | #endif // FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION |
1908 | | #endif // FIXED_POINT |
1909 | 0 | #ifndef DRM |
1910 | 0 | int8_t noise_pcm_flag = 1; |
1911 | 0 | int16_t noise_energy = ics->global_gain - 90; |
1912 | 0 | #endif |
1913 | |
|
1914 | 0 | for (g = 0; g < ics->num_window_groups; g++) |
1915 | 0 | { |
1916 | 0 | for (sfb = 0; sfb < ics->max_sfb; sfb++) |
1917 | 0 | { |
1918 | 0 | switch (ics->sfb_cb[g][sfb]) |
1919 | 0 | { |
1920 | 0 | case ZERO_HCB: /* zero book */ |
1921 | 0 | ics->scale_factors[g][sfb] = 0; |
1922 | | //#define SF_PRINT |
1923 | | #ifdef SF_PRINT |
1924 | | printf("%d\n", ics->scale_factors[g][sfb]); |
1925 | | #endif |
1926 | 0 | break; |
1927 | 0 | case INTENSITY_HCB: /* intensity books */ |
1928 | 0 | case INTENSITY_HCB2: |
1929 | | |
1930 | | /* decode intensity position */ |
1931 | 0 | t = huffman_scale_factor(ld); |
1932 | 0 | is_position += (t - 60); |
1933 | 0 | ics->scale_factors[g][sfb] = is_position; |
1934 | | #ifdef SF_PRINT |
1935 | | printf("%d\n", ics->scale_factors[g][sfb]); |
1936 | | #endif |
1937 | |
|
1938 | 0 | break; |
1939 | 0 | case NOISE_HCB: /* noise books */ |
1940 | |
|
1941 | 0 | #ifndef DRM |
1942 | | /* decode noise energy */ |
1943 | 0 | if (noise_pcm_flag) |
1944 | 0 | { |
1945 | 0 | noise_pcm_flag = 0; |
1946 | 0 | t = (int16_t)faad_getbits(ld, 9 |
1947 | 0 | DEBUGVAR(1,73,"scale_factor_data(): first noise")) - 256; |
1948 | 0 | } else { |
1949 | 0 | t = huffman_scale_factor(ld); |
1950 | 0 | t -= 60; |
1951 | 0 | } |
1952 | 0 | noise_energy += t; |
1953 | 0 | ics->scale_factors[g][sfb] = noise_energy; |
1954 | | #ifdef SF_PRINT |
1955 | | printf("%d\n", ics->scale_factors[g][sfb]); |
1956 | | #endif |
1957 | | #else |
1958 | | /* PNS not allowed in DRM */ |
1959 | | return 29; |
1960 | | #endif |
1961 | |
|
1962 | 0 | break; |
1963 | 0 | default: /* spectral books */ |
1964 | | |
1965 | | /* ics->scale_factors[g][sfb] must be between 0 and 255 */ |
1966 | |
|
1967 | 0 | ics->scale_factors[g][sfb] = 0; |
1968 | | |
1969 | | /* decode scale factor */ |
1970 | 0 | t = huffman_scale_factor(ld); |
1971 | 0 | scale_factor += (t - 60); |
1972 | 0 | if (scale_factor < 0 || scale_factor > 255) |
1973 | 0 | return 4; |
1974 | 0 | ics->scale_factors[g][sfb] = min(scale_factor, scale_factor_max); |
1975 | | #ifdef SF_PRINT |
1976 | | printf("%d\n", ics->scale_factors[g][sfb]); |
1977 | | #endif |
1978 | |
|
1979 | 0 | break; |
1980 | 0 | } |
1981 | 0 | } |
1982 | 0 | } |
1983 | | |
1984 | 0 | return 0; |
1985 | 0 | } |
1986 | | |
1987 | | /* Table 4.4.26 */ |
1988 | | static uint8_t scale_factor_data(NeAACDecStruct *hDecoder, ic_stream *ics, bitfile *ld) |
1989 | 0 | { |
1990 | 0 | uint8_t ret = 0; |
1991 | | #ifdef PROFILE |
1992 | | int64_t count = faad_get_ts(); |
1993 | | #endif |
1994 | |
|
1995 | 0 | #ifdef ERROR_RESILIENCE |
1996 | 0 | if (!hDecoder->aacScalefactorDataResilienceFlag) |
1997 | 0 | { |
1998 | 0 | #endif |
1999 | 0 | ret = decode_scale_factors(ics, ld); |
2000 | 0 | #ifdef ERROR_RESILIENCE |
2001 | 0 | } else { |
2002 | | /* In ER AAC the parameters for RVLC are seperated from the actual |
2003 | | data that holds the scale_factors. |
2004 | | Strangely enough, 2 parameters for HCR are put inbetween them. |
2005 | | */ |
2006 | 0 | ret = rvlc_scale_factor_data(ics, ld); |
2007 | 0 | } |
2008 | 0 | #endif |
2009 | |
|
2010 | | #ifdef PROFILE |
2011 | | count = faad_get_ts() - count; |
2012 | | hDecoder->scalefac_cycles += count; |
2013 | | #endif |
2014 | |
|
2015 | 0 | return ret; |
2016 | 0 | } |
2017 | | |
2018 | | /* Table 4.4.27 */ |
2019 | | static void tns_data(ic_stream *ics, tns_info *tns, bitfile *ld) |
2020 | 0 | { |
2021 | 0 | uint8_t w, filt, i, coef_bits; |
2022 | 0 | uint8_t n_filt_bits = 2; |
2023 | 0 | uint8_t length_bits = 6; |
2024 | 0 | uint8_t order_bits = 5; |
2025 | |
|
2026 | 0 | if (ics->window_sequence == EIGHT_SHORT_SEQUENCE) |
2027 | 0 | { |
2028 | 0 | n_filt_bits = 1; |
2029 | 0 | length_bits = 4; |
2030 | 0 | order_bits = 3; |
2031 | 0 | } |
2032 | |
|
2033 | 0 | for (w = 0; w < ics->num_windows; w++) |
2034 | 0 | { |
2035 | 0 | uint8_t start_coef_bits = 3; |
2036 | 0 | tns->n_filt[w] = (uint8_t)faad_getbits(ld, n_filt_bits |
2037 | 0 | DEBUGVAR(1,74,"tns_data(): n_filt")); |
2038 | | #if 0 |
2039 | | printf("%d\n", tns->n_filt[w]); |
2040 | | #endif |
2041 | |
|
2042 | 0 | if (tns->n_filt[w]) |
2043 | 0 | { |
2044 | 0 | if ((tns->coef_res[w] = faad_get1bit(ld |
2045 | 0 | DEBUGVAR(1,75,"tns_data(): coef_res"))) & 1) |
2046 | 0 | start_coef_bits = 4; |
2047 | | #if 0 |
2048 | | printf("%d\n", tns->coef_res[w]); |
2049 | | #endif |
2050 | 0 | } |
2051 | |
|
2052 | 0 | for (filt = 0; filt < tns->n_filt[w]; filt++) |
2053 | 0 | { |
2054 | 0 | tns->length[w][filt] = (uint8_t)faad_getbits(ld, length_bits |
2055 | 0 | DEBUGVAR(1,76,"tns_data(): length")); |
2056 | | #if 0 |
2057 | | printf("%d\n", tns->length[w][filt]); |
2058 | | #endif |
2059 | 0 | tns->order[w][filt] = (uint8_t)faad_getbits(ld, order_bits |
2060 | 0 | DEBUGVAR(1,77,"tns_data(): order")); |
2061 | | #if 0 |
2062 | | printf("%d\n", tns->order[w][filt]); |
2063 | | #endif |
2064 | 0 | if (tns->order[w][filt]) |
2065 | 0 | { |
2066 | 0 | tns->direction[w][filt] = faad_get1bit(ld |
2067 | 0 | DEBUGVAR(1,78,"tns_data(): direction")); |
2068 | | #if 0 |
2069 | | printf("%d\n", tns->direction[w][filt]); |
2070 | | #endif |
2071 | 0 | tns->coef_compress[w][filt] = faad_get1bit(ld |
2072 | 0 | DEBUGVAR(1,79,"tns_data(): coef_compress")); |
2073 | | #if 0 |
2074 | | printf("%d\n", tns->coef_compress[w][filt]); |
2075 | | #endif |
2076 | |
|
2077 | 0 | coef_bits = start_coef_bits - tns->coef_compress[w][filt]; |
2078 | 0 | for (i = 0; i < tns->order[w][filt]; i++) |
2079 | 0 | { |
2080 | 0 | tns->coef[w][filt][i] = (uint8_t)faad_getbits(ld, coef_bits |
2081 | 0 | DEBUGVAR(1,80,"tns_data(): coef")); |
2082 | | #if 0 |
2083 | | printf("%d\n", tns->coef[w][filt][i]); |
2084 | | #endif |
2085 | 0 | } |
2086 | 0 | } |
2087 | 0 | } |
2088 | 0 | } |
2089 | 0 | } |
2090 | | |
2091 | | #ifdef LTP_DEC |
2092 | | /* Table 4.4.28 */ |
2093 | | static uint8_t ltp_data(NeAACDecStruct *hDecoder, ic_stream *ics, ltp_info *ltp, bitfile *ld) |
2094 | 0 | { |
2095 | 0 | uint8_t sfb, w; |
2096 | |
|
2097 | 0 | ltp->lag = 0; |
2098 | |
|
2099 | 0 | #ifdef LD_DEC |
2100 | 0 | if (hDecoder->object_type == LD) |
2101 | 0 | { |
2102 | 0 | ltp->lag_update = (uint8_t)faad_getbits(ld, 1 |
2103 | 0 | DEBUGVAR(1,142,"ltp_data(): lag_update")); |
2104 | |
|
2105 | 0 | if (ltp->lag_update) |
2106 | 0 | { |
2107 | 0 | ltp->lag = (uint16_t)faad_getbits(ld, 10 |
2108 | 0 | DEBUGVAR(1,81,"ltp_data(): lag")); |
2109 | 0 | } |
2110 | 0 | } else { |
2111 | 0 | #endif |
2112 | 0 | ltp->lag = (uint16_t)faad_getbits(ld, 11 |
2113 | 0 | DEBUGVAR(1,81,"ltp_data(): lag")); |
2114 | 0 | #ifdef LD_DEC |
2115 | 0 | } |
2116 | 0 | #endif |
2117 | | |
2118 | | /* Check length of lag */ |
2119 | 0 | if (ltp->lag > (hDecoder->frameLength << 1)) |
2120 | 0 | return 18; |
2121 | | |
2122 | 0 | ltp->coef = (uint8_t)faad_getbits(ld, 3 |
2123 | 0 | DEBUGVAR(1,82,"ltp_data(): coef")); |
2124 | |
|
2125 | 0 | if (ics->window_sequence == EIGHT_SHORT_SEQUENCE) |
2126 | 0 | { |
2127 | 0 | for (w = 0; w < ics->num_windows; w++) |
2128 | 0 | { |
2129 | 0 | if ((ltp->short_used[w] = faad_get1bit(ld |
2130 | 0 | DEBUGVAR(1,83,"ltp_data(): short_used"))) & 1) |
2131 | 0 | { |
2132 | 0 | ltp->short_lag_present[w] = faad_get1bit(ld |
2133 | 0 | DEBUGVAR(1,84,"ltp_data(): short_lag_present")); |
2134 | 0 | if (ltp->short_lag_present[w]) |
2135 | 0 | { |
2136 | 0 | ltp->short_lag[w] = (uint8_t)faad_getbits(ld, 4 |
2137 | 0 | DEBUGVAR(1,85,"ltp_data(): short_lag")); |
2138 | 0 | } |
2139 | 0 | } |
2140 | 0 | } |
2141 | 0 | } else { |
2142 | 0 | ltp->last_band = (ics->max_sfb < MAX_LTP_SFB ? ics->max_sfb : MAX_LTP_SFB); |
2143 | |
|
2144 | 0 | for (sfb = 0; sfb < ltp->last_band; sfb++) |
2145 | 0 | { |
2146 | 0 | ltp->long_used[sfb] = faad_get1bit(ld |
2147 | 0 | DEBUGVAR(1,86,"ltp_data(): long_used")); |
2148 | 0 | } |
2149 | 0 | } |
2150 | |
|
2151 | 0 | return 0; |
2152 | 0 | } |
2153 | | #endif |
2154 | | |
2155 | | /* Table 4.4.29 */ |
2156 | | static uint8_t spectral_data(NeAACDecStruct *hDecoder, ic_stream *ics, bitfile *ld, |
2157 | | int16_t *spectral_data) |
2158 | 0 | { |
2159 | 0 | int8_t i; |
2160 | 0 | uint8_t g; |
2161 | 0 | uint16_t inc, k, p = 0; |
2162 | 0 | uint8_t groups = 0; |
2163 | 0 | uint8_t sect_cb; |
2164 | 0 | uint8_t result; |
2165 | 0 | uint16_t nshort = hDecoder->frameLength/8; |
2166 | |
|
2167 | | #ifdef PROFILE |
2168 | | int64_t count = faad_get_ts(); |
2169 | | #endif |
2170 | |
|
2171 | 0 | for(g = 0; g < ics->num_window_groups; g++) |
2172 | 0 | { |
2173 | 0 | p = groups*nshort; |
2174 | |
|
2175 | 0 | for (i = 0; i < ics->num_sec[g]; i++) |
2176 | 0 | { |
2177 | 0 | sect_cb = ics->sect_cb[g][i]; |
2178 | |
|
2179 | 0 | inc = (sect_cb >= FIRST_PAIR_HCB) ? 2 : 4; |
2180 | |
|
2181 | 0 | switch (sect_cb) |
2182 | 0 | { |
2183 | 0 | case ZERO_HCB: |
2184 | 0 | case NOISE_HCB: |
2185 | 0 | case INTENSITY_HCB: |
2186 | 0 | case INTENSITY_HCB2: |
2187 | | //#define SD_PRINT |
2188 | | #ifdef SD_PRINT |
2189 | | { |
2190 | | int j; |
2191 | | for (j = ics->sect_sfb_offset[g][ics->sect_start[g][i]]; j < ics->sect_sfb_offset[g][ics->sect_end[g][i]]; j++) |
2192 | | { |
2193 | | printf("%d\n", 0); |
2194 | | } |
2195 | | } |
2196 | | #endif |
2197 | | //#define SFBO_PRINT |
2198 | | #ifdef SFBO_PRINT |
2199 | | printf("%d\n", ics->sect_sfb_offset[g][ics->sect_start[g][i]]); |
2200 | | #endif |
2201 | 0 | p += (ics->sect_sfb_offset[g][ics->sect_end[g][i]] - |
2202 | 0 | ics->sect_sfb_offset[g][ics->sect_start[g][i]]); |
2203 | 0 | break; |
2204 | 0 | default: |
2205 | | #ifdef SFBO_PRINT |
2206 | | printf("%d\n", ics->sect_sfb_offset[g][ics->sect_start[g][i]]); |
2207 | | #endif |
2208 | 0 | for (k = ics->sect_sfb_offset[g][ics->sect_start[g][i]]; |
2209 | 0 | k < ics->sect_sfb_offset[g][ics->sect_end[g][i]]; k += inc) |
2210 | 0 | { |
2211 | 0 | if ((result = huffman_spectral_data(sect_cb, ld, &spectral_data[p])) > 0) |
2212 | 0 | return result; |
2213 | | #ifdef SD_PRINT |
2214 | | { |
2215 | | int j; |
2216 | | for (j = p; j < p+inc; j++) |
2217 | | { |
2218 | | printf("%d\n", spectral_data[j]); |
2219 | | } |
2220 | | } |
2221 | | #endif |
2222 | 0 | p += inc; |
2223 | 0 | } |
2224 | 0 | break; |
2225 | 0 | } |
2226 | 0 | } |
2227 | 0 | groups += ics->window_group_length[g]; |
2228 | 0 | } |
2229 | | |
2230 | | #ifdef PROFILE |
2231 | | count = faad_get_ts() - count; |
2232 | | hDecoder->spectral_cycles += count; |
2233 | | #endif |
2234 | | |
2235 | 0 | return 0; |
2236 | 0 | } |
2237 | | |
2238 | | #ifndef DRM |
2239 | | /* Table 4.4.30 */ |
2240 | | static uint16_t extension_payload(bitfile *ld, drc_info *drc, uint16_t count) |
2241 | 0 | { |
2242 | 0 | uint16_t i, n, dataElementLength; |
2243 | 0 | uint8_t dataElementLengthPart; |
2244 | 0 | uint8_t align = 4, data_element_version, loopCounter; |
2245 | |
|
2246 | 0 | uint8_t extension_type = (uint8_t)faad_getbits(ld, 4 |
2247 | 0 | DEBUGVAR(1,87,"extension_payload(): extension_type")); |
2248 | |
|
2249 | 0 | switch (extension_type) |
2250 | 0 | { |
2251 | 0 | case EXT_DYNAMIC_RANGE: |
2252 | 0 | drc->present = 1; |
2253 | 0 | n = dynamic_range_info(ld, drc); |
2254 | 0 | return n; |
2255 | 0 | case EXT_FILL_DATA: |
2256 | 0 | /* fill_nibble = */ faad_getbits(ld, 4 |
2257 | 0 | DEBUGVAR(1,136,"extension_payload(): fill_nibble")); /* must be '0000' */ |
2258 | 0 | for (i = 0; i < count-1; i++) |
2259 | 0 | { |
2260 | 0 | /* fill_byte[i] = */ faad_getbits(ld, 8 |
2261 | 0 | DEBUGVAR(1,88,"extension_payload(): fill_byte")); /* must be '10100101' */ |
2262 | 0 | } |
2263 | 0 | return count; |
2264 | 0 | case EXT_DATA_ELEMENT: |
2265 | 0 | data_element_version = (uint8_t)faad_getbits(ld, 4 |
2266 | 0 | DEBUGVAR(1,400,"extension_payload(): data_element_version")); |
2267 | 0 | switch (data_element_version) |
2268 | 0 | { |
2269 | 0 | case ANC_DATA: |
2270 | 0 | loopCounter = 0; |
2271 | 0 | dataElementLength = 0; |
2272 | 0 | do { |
2273 | 0 | dataElementLengthPart = (uint8_t)faad_getbits(ld, 8 |
2274 | 0 | DEBUGVAR(1,401,"extension_payload(): dataElementLengthPart")); |
2275 | 0 | dataElementLength += dataElementLengthPart; |
2276 | 0 | loopCounter++; |
2277 | 0 | } while (dataElementLengthPart == 255); |
2278 | |
|
2279 | 0 | for (i = 0; i < dataElementLength; i++) |
2280 | 0 | { |
2281 | 0 | /* data_element_byte[i] = */ faad_getbits(ld, 8 |
2282 | 0 | DEBUGVAR(1,402,"extension_payload(): data_element_byte")); |
2283 | 0 | return (dataElementLength+loopCounter+1); |
2284 | 0 | } |
2285 | 0 | default: |
2286 | 0 | align = 0; |
2287 | 0 | } |
2288 | 0 | case EXT_FIL: |
2289 | 0 | default: |
2290 | 0 | faad_getbits(ld, align |
2291 | 0 | DEBUGVAR(1,88,"extension_payload(): fill_nibble")); |
2292 | 0 | for (i = 0; i < count-1; i++) |
2293 | 0 | { |
2294 | 0 | /* other_bits[i] = */ faad_getbits(ld, 8 |
2295 | 0 | DEBUGVAR(1,89,"extension_payload(): fill_bit")); |
2296 | 0 | } |
2297 | 0 | return count; |
2298 | 0 | } |
2299 | 0 | } |
2300 | | |
2301 | | /* Table 4.4.31 */ |
2302 | | static uint8_t dynamic_range_info(bitfile *ld, drc_info *drc) |
2303 | 0 | { |
2304 | 0 | uint8_t i, n = 1; |
2305 | 0 | uint8_t band_incr; |
2306 | |
|
2307 | 0 | drc->num_bands = 1; |
2308 | |
|
2309 | 0 | if (faad_get1bit(ld |
2310 | 0 | DEBUGVAR(1,90,"dynamic_range_info(): has instance_tag")) & 1) |
2311 | 0 | { |
2312 | 0 | drc->pce_instance_tag = (uint8_t)faad_getbits(ld, 4 |
2313 | 0 | DEBUGVAR(1,91,"dynamic_range_info(): pce_instance_tag")); |
2314 | 0 | /* drc->drc_tag_reserved_bits = */ faad_getbits(ld, 4 |
2315 | 0 | DEBUGVAR(1,92,"dynamic_range_info(): drc_tag_reserved_bits")); |
2316 | 0 | n++; |
2317 | 0 | } |
2318 | |
|
2319 | 0 | drc->excluded_chns_present = faad_get1bit(ld |
2320 | 0 | DEBUGVAR(1,93,"dynamic_range_info(): excluded_chns_present")); |
2321 | 0 | if (drc->excluded_chns_present == 1) |
2322 | 0 | { |
2323 | 0 | n += excluded_channels(ld, drc); |
2324 | 0 | } |
2325 | |
|
2326 | 0 | if (faad_get1bit(ld |
2327 | 0 | DEBUGVAR(1,94,"dynamic_range_info(): has bands data")) & 1) |
2328 | 0 | { |
2329 | 0 | band_incr = (uint8_t)faad_getbits(ld, 4 |
2330 | 0 | DEBUGVAR(1,95,"dynamic_range_info(): band_incr")); |
2331 | 0 | /* drc->drc_bands_reserved_bits = */ faad_getbits(ld, 4 |
2332 | 0 | DEBUGVAR(1,96,"dynamic_range_info(): drc_bands_reserved_bits")); |
2333 | 0 | n++; |
2334 | 0 | drc->num_bands += band_incr; |
2335 | |
|
2336 | 0 | for (i = 0; i < drc->num_bands; i++) |
2337 | 0 | { |
2338 | 0 | drc->band_top[i] = (uint8_t)faad_getbits(ld, 8 |
2339 | 0 | DEBUGVAR(1,97,"dynamic_range_info(): band_top")); |
2340 | 0 | n++; |
2341 | 0 | } |
2342 | 0 | } |
2343 | |
|
2344 | 0 | if (faad_get1bit(ld |
2345 | 0 | DEBUGVAR(1,98,"dynamic_range_info(): has prog_ref_level")) & 1) |
2346 | 0 | { |
2347 | 0 | drc->prog_ref_level = (uint8_t)faad_getbits(ld, 7 |
2348 | 0 | DEBUGVAR(1,99,"dynamic_range_info(): prog_ref_level")); |
2349 | 0 | /* drc->prog_ref_level_reserved_bits = */ faad_get1bit(ld |
2350 | 0 | DEBUGVAR(1,100,"dynamic_range_info(): prog_ref_level_reserved_bits")); |
2351 | 0 | n++; |
2352 | 0 | } |
2353 | |
|
2354 | 0 | for (i = 0; i < drc->num_bands; i++) |
2355 | 0 | { |
2356 | 0 | drc->dyn_rng_sgn[i] = faad_get1bit(ld |
2357 | 0 | DEBUGVAR(1,101,"dynamic_range_info(): dyn_rng_sgn")); |
2358 | 0 | drc->dyn_rng_ctl[i] = (uint8_t)faad_getbits(ld, 7 |
2359 | 0 | DEBUGVAR(1,102,"dynamic_range_info(): dyn_rng_ctl")); |
2360 | 0 | n++; |
2361 | 0 | } |
2362 | |
|
2363 | 0 | return n; |
2364 | 0 | } |
2365 | | |
2366 | | /* Table 4.4.32 */ |
2367 | | static uint8_t excluded_channels(bitfile *ld, drc_info *drc) |
2368 | 0 | { |
2369 | 0 | uint8_t i, n = 0; |
2370 | 0 | uint8_t num_excl_chan = 7; |
2371 | |
|
2372 | 0 | for (i = 0; i < 7; i++) |
2373 | 0 | { |
2374 | 0 | drc->exclude_mask[i] = faad_get1bit(ld |
2375 | 0 | DEBUGVAR(1,103,"excluded_channels(): exclude_mask")); |
2376 | 0 | } |
2377 | 0 | n++; |
2378 | |
|
2379 | 0 | while ((drc->additional_excluded_chns[n-1] = faad_get1bit(ld |
2380 | 0 | DEBUGVAR(1,104,"excluded_channels(): additional_excluded_chns"))) == 1) |
2381 | 0 | { |
2382 | 0 | if (i >= MAX_CHANNELS - num_excl_chan - 7) |
2383 | 0 | return n; |
2384 | 0 | for (i = num_excl_chan; i < num_excl_chan+7; i++) |
2385 | 0 | { |
2386 | 0 | drc->exclude_mask[i] = faad_get1bit(ld |
2387 | 0 | DEBUGVAR(1,105,"excluded_channels(): exclude_mask")); |
2388 | 0 | } |
2389 | 0 | n++; |
2390 | 0 | num_excl_chan += 7; |
2391 | 0 | } |
2392 | | |
2393 | 0 | return n; |
2394 | 0 | } |
2395 | | #endif |
2396 | | |
2397 | | /* Annex A: Audio Interchange Formats */ |
2398 | | |
2399 | | /* Table 1.A.2 */ |
2400 | | void get_adif_header(adif_header *adif, bitfile *ld) |
2401 | 0 | { |
2402 | 0 | uint8_t i; |
2403 | | |
2404 | | /* adif_id[0] = */ faad_getbits(ld, 8 |
2405 | 0 | DEBUGVAR(1,106,"get_adif_header(): adif_id[0]")); |
2406 | 0 | /* adif_id[1] = */ faad_getbits(ld, 8 |
2407 | 0 | DEBUGVAR(1,107,"get_adif_header(): adif_id[1]")); |
2408 | 0 | /* adif_id[2] = */ faad_getbits(ld, 8 |
2409 | 0 | DEBUGVAR(1,108,"get_adif_header(): adif_id[2]")); |
2410 | 0 | /* adif_id[3] = */ faad_getbits(ld, 8 |
2411 | 0 | DEBUGVAR(1,109,"get_adif_header(): adif_id[3]")); |
2412 | 0 | adif->copyright_id_present = faad_get1bit(ld |
2413 | 0 | DEBUGVAR(1,110,"get_adif_header(): copyright_id_present")); |
2414 | 0 | if(adif->copyright_id_present) |
2415 | 0 | { |
2416 | 0 | for (i = 0; i < 72/8; i++) |
2417 | 0 | { |
2418 | 0 | adif->copyright_id[i] = (int8_t)faad_getbits(ld, 8 |
2419 | 0 | DEBUGVAR(1,111,"get_adif_header(): copyright_id")); |
2420 | 0 | } |
2421 | 0 | adif->copyright_id[i] = 0; |
2422 | 0 | } |
2423 | 0 | adif->original_copy = faad_get1bit(ld |
2424 | 0 | DEBUGVAR(1,112,"get_adif_header(): original_copy")); |
2425 | 0 | adif->home = faad_get1bit(ld |
2426 | 0 | DEBUGVAR(1,113,"get_adif_header(): home")); |
2427 | 0 | adif->bitstream_type = faad_get1bit(ld |
2428 | 0 | DEBUGVAR(1,114,"get_adif_header(): bitstream_type")); |
2429 | 0 | adif->bitrate = faad_getbits(ld, 23 |
2430 | 0 | DEBUGVAR(1,115,"get_adif_header(): bitrate")); |
2431 | 0 | adif->num_program_config_elements = (uint8_t)faad_getbits(ld, 4 |
2432 | 0 | DEBUGVAR(1,116,"get_adif_header(): num_program_config_elements")); |
2433 | |
|
2434 | 0 | for (i = 0; i < adif->num_program_config_elements + 1; i++) |
2435 | 0 | { |
2436 | 0 | if(adif->bitstream_type == 0) |
2437 | 0 | { |
2438 | 0 | adif->adif_buffer_fullness = faad_getbits(ld, 20 |
2439 | 0 | DEBUGVAR(1,117,"get_adif_header(): adif_buffer_fullness")); |
2440 | 0 | } else { |
2441 | 0 | adif->adif_buffer_fullness = 0; |
2442 | 0 | } |
2443 | |
|
2444 | 0 | program_config_element(&adif->pce[i], ld); |
2445 | 0 | } |
2446 | 0 | } |
2447 | | |
2448 | | /* Table 1.A.5 */ |
2449 | | uint8_t adts_frame(adts_header *adts, bitfile *ld) |
2450 | 0 | { |
2451 | | /* faad_byte_align(ld); */ |
2452 | 0 | if (adts_fixed_header(adts, ld)) |
2453 | 0 | return 5; |
2454 | 0 | adts_variable_header(adts, ld); |
2455 | 0 | adts_error_check(adts, ld); |
2456 | |
|
2457 | 0 | return 0; |
2458 | 0 | } |
2459 | | |
2460 | | /* Table 1.A.6 */ |
2461 | | static uint8_t adts_fixed_header(adts_header *adts, bitfile *ld) |
2462 | 0 | { |
2463 | 0 | uint16_t i; |
2464 | 0 | uint8_t sync_err = 1; |
2465 | | |
2466 | | /* try to recover from sync errors */ |
2467 | 0 | for (i = 0; i < 768; i++) |
2468 | 0 | { |
2469 | 0 | adts->syncword = (uint16_t)faad_showbits(ld, 12); |
2470 | 0 | if (adts->syncword != 0xFFF) |
2471 | 0 | { |
2472 | 0 | faad_getbits(ld, 8 |
2473 | 0 | DEBUGVAR(0,0,"")); |
2474 | 0 | } else { |
2475 | 0 | sync_err = 0; |
2476 | 0 | faad_getbits(ld, 12 |
2477 | 0 | DEBUGVAR(1,118,"adts_fixed_header(): syncword")); |
2478 | 0 | break; |
2479 | 0 | } |
2480 | 0 | } |
2481 | 0 | if (sync_err) |
2482 | 0 | return 5; |
2483 | | |
2484 | 0 | adts->id = faad_get1bit(ld |
2485 | 0 | DEBUGVAR(1,119,"adts_fixed_header(): id")); |
2486 | 0 | adts->layer = (uint8_t)faad_getbits(ld, 2 |
2487 | 0 | DEBUGVAR(1,120,"adts_fixed_header(): layer")); |
2488 | 0 | adts->protection_absent = faad_get1bit(ld |
2489 | 0 | DEBUGVAR(1,121,"adts_fixed_header(): protection_absent")); |
2490 | 0 | adts->profile = (uint8_t)faad_getbits(ld, 2 |
2491 | 0 | DEBUGVAR(1,122,"adts_fixed_header(): profile")); |
2492 | 0 | adts->sf_index = (uint8_t)faad_getbits(ld, 4 |
2493 | 0 | DEBUGVAR(1,123,"adts_fixed_header(): sf_index")); |
2494 | 0 | adts->private_bit = faad_get1bit(ld |
2495 | 0 | DEBUGVAR(1,124,"adts_fixed_header(): private_bit")); |
2496 | 0 | adts->channel_configuration = (uint8_t)faad_getbits(ld, 3 |
2497 | 0 | DEBUGVAR(1,125,"adts_fixed_header(): channel_configuration")); |
2498 | 0 | adts->original = faad_get1bit(ld |
2499 | 0 | DEBUGVAR(1,126,"adts_fixed_header(): original")); |
2500 | 0 | adts->home = faad_get1bit(ld |
2501 | 0 | DEBUGVAR(1,127,"adts_fixed_header(): home")); |
2502 | |
|
2503 | 0 | if (adts->old_format == 1) |
2504 | 0 | { |
2505 | | /* Removed in corrigendum 14496-3:2002 */ |
2506 | 0 | if (adts->id == 0) |
2507 | 0 | { |
2508 | 0 | adts->emphasis = (uint8_t)faad_getbits(ld, 2 |
2509 | 0 | DEBUGVAR(1,128,"adts_fixed_header(): emphasis")); |
2510 | 0 | } |
2511 | 0 | } |
2512 | |
|
2513 | 0 | return 0; |
2514 | 0 | } |
2515 | | |
2516 | | /* Table 1.A.7 */ |
2517 | | static void adts_variable_header(adts_header *adts, bitfile *ld) |
2518 | 0 | { |
2519 | 0 | adts->copyright_identification_bit = faad_get1bit(ld |
2520 | 0 | DEBUGVAR(1,129,"adts_variable_header(): copyright_identification_bit")); |
2521 | 0 | adts->copyright_identification_start = faad_get1bit(ld |
2522 | 0 | DEBUGVAR(1,130,"adts_variable_header(): copyright_identification_start")); |
2523 | 0 | adts->aac_frame_length = (uint16_t)faad_getbits(ld, 13 |
2524 | 0 | DEBUGVAR(1,131,"adts_variable_header(): aac_frame_length")); |
2525 | 0 | adts->adts_buffer_fullness = (uint16_t)faad_getbits(ld, 11 |
2526 | 0 | DEBUGVAR(1,132,"adts_variable_header(): adts_buffer_fullness")); |
2527 | 0 | adts->no_raw_data_blocks_in_frame = (uint8_t)faad_getbits(ld, 2 |
2528 | 0 | DEBUGVAR(1,133,"adts_variable_header(): no_raw_data_blocks_in_frame")); |
2529 | 0 | } |
2530 | | |
2531 | | /* Table 1.A.8 */ |
2532 | | static void adts_error_check(adts_header *adts, bitfile *ld) |
2533 | 0 | { |
2534 | 0 | if (adts->protection_absent == 0) |
2535 | 0 | { |
2536 | 0 | adts->crc_check = (uint16_t)faad_getbits(ld, 16 |
2537 | 0 | DEBUGVAR(1,134,"adts_error_check(): crc_check")); |
2538 | 0 | } |
2539 | 0 | } |
2540 | | |
2541 | | /* LATM parsing functions */ |
2542 | | #if 0 |
2543 | | |
2544 | | static uint32_t latm_get_value(bitfile *ld) |
2545 | | { |
2546 | | uint32_t l, value; |
2547 | | uint8_t bytesForValue; |
2548 | | |
2549 | | bytesForValue = (uint8_t)faad_getbits(ld, 2); |
2550 | | value = 0; |
2551 | | for(l=0; l<bytesForValue; l++) |
2552 | | value = (value << 8) | (uint8_t)faad_getbits(ld, 8); |
2553 | | |
2554 | | return value; |
2555 | | } |
2556 | | |
2557 | | static uint32_t latmParsePayload(latm_header *latm, bitfile *ld) |
2558 | | { |
2559 | | //assuming there's only one program with a single layer and 1 subFrame, |
2560 | | //allStreamsSametimeframing is set, |
2561 | | uint32_t framelen; |
2562 | | uint8_t tmp; |
2563 | | |
2564 | | //this should be the payload length field for the current configuration |
2565 | | framelen = 0; |
2566 | | if(latm->framelen_type==0) |
2567 | | { |
2568 | | do |
2569 | | { |
2570 | | tmp = (uint8_t)faad_getbits(ld, 8); |
2571 | | framelen += tmp; |
2572 | | } while(tmp==0xff); |
2573 | | } |
2574 | | else if(latm->framelen_type==1) |
2575 | | framelen=latm->frameLength; |
2576 | | |
2577 | | return framelen; |
2578 | | } |
2579 | | |
2580 | | static uint32_t latmAudioMuxElement(latm_header *latm, bitfile *ld) |
2581 | | { |
2582 | | uint32_t ascLen, asc_bits=0; |
2583 | | uint32_t x1, y1, m, n, i; |
2584 | | program_config pce; |
2585 | | mp4AudioSpecificConfig mp4ASC; |
2586 | | |
2587 | | latm->useSameStreamMux = (uint8_t)faad_getbits(ld, 1); |
2588 | | if(!latm->useSameStreamMux) |
2589 | | { |
2590 | | //parseSameStreamMuxConfig |
2591 | | latm->version = (uint8_t) faad_getbits(ld, 1); |
2592 | | if(latm->version) |
2593 | | latm->versionA = (uint8_t) faad_getbits(ld, 1); |
2594 | | if(latm->versionA) |
2595 | | { |
2596 | | //dunno the payload format for versionA |
2597 | | fprintf(stderr, "versionA not supported\n"); |
2598 | | return 0; |
2599 | | } |
2600 | | if(latm->version) //read taraBufferFullness |
2601 | | latm_get_value(ld); |
2602 | | latm->allStreamsSameTimeFraming = (uint8_t)faad_getbits(ld, 1); |
2603 | | latm->numSubFrames = (uint8_t)faad_getbits(ld, 6) + 1; |
2604 | | latm->numPrograms = (uint8_t)faad_getbits(ld, 4) + 1; |
2605 | | latm->numLayers = faad_getbits(ld, 3) + 1; |
2606 | | if(latm->numPrograms>1 || !latm->allStreamsSameTimeFraming || latm->numSubFrames>1 || latm->numLayers>1) |
2607 | | { |
2608 | | fprintf(stderr, "\r\nUnsupported LATM configuration: %d programs/ %d subframes, %d layers, allstreams: %d\n", |
2609 | | latm->numPrograms, latm->numSubFrames, latm->numLayers, latm->allStreamsSameTimeFraming); |
2610 | | return 0; |
2611 | | } |
2612 | | ascLen = 0; |
2613 | | if(latm->version) |
2614 | | ascLen = latm_get_value(ld); |
2615 | | |
2616 | | x1 = faad_get_processed_bits(ld); |
2617 | | if(AudioSpecificConfigFromBitfile(ld, &mp4ASC, &pce, 0, 1) < 0) |
2618 | | return 0; |
2619 | | |
2620 | | //horrid hack to unread the ASC bits and store them in latm->ASC |
2621 | | //the correct code would rely on an ideal faad_ungetbits() |
2622 | | y1 = faad_get_processed_bits(ld); |
2623 | | if((y1-x1) <= MAX_ASC_BYTES*8) |
2624 | | { |
2625 | | faad_rewindbits(ld); |
2626 | | m = x1; |
2627 | | while(m>0) |
2628 | | { |
2629 | | n = min(m, 32); |
2630 | | faad_getbits(ld, n); |
2631 | | m -= n; |
2632 | | } |
2633 | | |
2634 | | i = 0; |
2635 | | m = latm->ASCbits = y1 - x1; |
2636 | | while(m > 0) |
2637 | | { |
2638 | | n = min(m, 8); |
2639 | | latm->ASC[i++] = (uint8_t) faad_getbits(ld, n); |
2640 | | m -= n; |
2641 | | } |
2642 | | } |
2643 | | |
2644 | | asc_bits = y1-x1; |
2645 | | |
2646 | | if(ascLen>asc_bits) |
2647 | | faad_getbits(ld, ascLen-asc_bits); |
2648 | | |
2649 | | latm->framelen_type = (uint8_t) faad_getbits(ld, 3); |
2650 | | if(latm->framelen_type == 0) |
2651 | | { |
2652 | | latm->frameLength = 0; |
2653 | | faad_getbits(ld, 8); //buffer fullness for frame_len_type==0, useless |
2654 | | } |
2655 | | else if(latm->framelen_type == 1) |
2656 | | { |
2657 | | latm->frameLength = faad_getbits(ld, 9); |
2658 | | if(latm->frameLength==0) |
2659 | | { |
2660 | | fprintf(stderr, "Invalid frameLength: 0\r\n"); |
2661 | | return 0; |
2662 | | } |
2663 | | latm->frameLength = (latm->frameLength+20)*8; |
2664 | | } |
2665 | | else |
2666 | | { //hellish CELP or HCVX stuff, discard |
2667 | | fprintf(stderr, "Unsupported CELP/HCVX framelentype: %d\n", latm->framelen_type); |
2668 | | return 0; |
2669 | | } |
2670 | | |
2671 | | latm->otherDataLenBits = 0; |
2672 | | if(faad_getbits(ld, 1)) |
2673 | | { //other data present |
2674 | | int esc, tmp; |
2675 | | if(latm->version) |
2676 | | latm->otherDataLenBits = latm_get_value(ld); |
2677 | | else do |
2678 | | { |
2679 | | esc = faad_getbits(ld, 1); |
2680 | | tmp = faad_getbits(ld, 8); |
2681 | | latm->otherDataLenBits = (latm->otherDataLenBits << 8) + tmp; |
2682 | | } while(esc); |
2683 | | } |
2684 | | if(faad_getbits(ld, 1)) //crc |
2685 | | faad_getbits(ld, 8); |
2686 | | latm->inited = 1; |
2687 | | } |
2688 | | |
2689 | | //read payload |
2690 | | if(latm->inited) |
2691 | | return latmParsePayload(latm, ld); |
2692 | | else |
2693 | | return 0; |
2694 | | } |
2695 | | |
2696 | | uint32_t faad_latm_frame(latm_header *latm, bitfile *ld) |
2697 | | { |
2698 | | uint16_t len; |
2699 | | uint32_t initpos, endpos, firstpos, ret; |
2700 | | |
2701 | | firstpos = faad_get_processed_bits(ld); |
2702 | | while (ld->bytes_left) |
2703 | | { |
2704 | | faad_byte_align(ld); |
2705 | | if(faad_showbits(ld, 11) != 0x2B7) |
2706 | | { |
2707 | | faad_getbits(ld, 8); |
2708 | | continue; |
2709 | | } |
2710 | | faad_getbits(ld, 11); |
2711 | | len = faad_getbits(ld, 13); |
2712 | | if(!len) |
2713 | | continue; |
2714 | | initpos = faad_get_processed_bits(ld); |
2715 | | ret = latmAudioMuxElement(latm, ld); |
2716 | | endpos = faad_get_processed_bits(ld); |
2717 | | if(ret>0) |
2718 | | return (len*8)-(endpos-initpos); |
2719 | | //faad_getbits(ld, initpos-endpos); //go back to initpos, but is valid a getbits(-N) ? |
2720 | | } |
2721 | | return 0xFFFFFFFF; |
2722 | | } |
2723 | | #endif |