/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 | 7.56k | { |
112 | 7.56k | program_config pce; |
113 | | |
114 | | /* 1024 or 960 */ |
115 | 7.56k | mp4ASC->frameLengthFlag = faad_get1bit(ld |
116 | 7.56k | DEBUGVAR(1,138,"GASpecificConfig(): FrameLengthFlag")); |
117 | | #ifndef ALLOW_SMALL_FRAMELENGTH |
118 | | if (mp4ASC->frameLengthFlag == 1) |
119 | | return -3; |
120 | | #endif |
121 | | |
122 | 7.56k | mp4ASC->dependsOnCoreCoder = faad_get1bit(ld |
123 | 7.56k | DEBUGVAR(1,139,"GASpecificConfig(): DependsOnCoreCoder")); |
124 | 7.56k | if (mp4ASC->dependsOnCoreCoder == 1) |
125 | 2.08k | { |
126 | 2.08k | mp4ASC->coreCoderDelay = (uint16_t)faad_getbits(ld, 14 |
127 | 2.08k | DEBUGVAR(1,140,"GASpecificConfig(): CoreCoderDelay")); |
128 | 2.08k | } |
129 | | |
130 | 7.56k | mp4ASC->extensionFlag = faad_get1bit(ld DEBUGVAR(1,141,"GASpecificConfig(): ExtensionFlag")); |
131 | 7.56k | if (mp4ASC->channelsConfiguration == 0) |
132 | 1.32k | { |
133 | 1.32k | if (program_config_element(&pce, ld)) |
134 | 14 | return -3; |
135 | | //mp4ASC->channelsConfiguration = pce.channels; |
136 | | |
137 | 1.31k | if (pce_out != NULL) |
138 | 1.12k | memcpy(pce_out, &pce, sizeof(program_config)); |
139 | | |
140 | | /* |
141 | | if (pce.num_valid_cc_elements) |
142 | | return -3; |
143 | | */ |
144 | 1.31k | } |
145 | | |
146 | 7.55k | #ifdef ERROR_RESILIENCE |
147 | 7.55k | if (mp4ASC->extensionFlag == 1) |
148 | 5.02k | { |
149 | | /* Error resilience not supported yet */ |
150 | 5.02k | if (mp4ASC->objectTypeIndex >= ER_OBJECT_START) |
151 | 4.25k | { |
152 | 4.25k | mp4ASC->aacSectionDataResilienceFlag = faad_get1bit(ld |
153 | 4.25k | DEBUGVAR(1,144,"GASpecificConfig(): aacSectionDataResilienceFlag")); |
154 | 4.25k | mp4ASC->aacScalefactorDataResilienceFlag = faad_get1bit(ld |
155 | 4.25k | DEBUGVAR(1,145,"GASpecificConfig(): aacScalefactorDataResilienceFlag")); |
156 | 4.25k | mp4ASC->aacSpectralDataResilienceFlag = faad_get1bit(ld |
157 | 4.25k | DEBUGVAR(1,146,"GASpecificConfig(): aacSpectralDataResilienceFlag")); |
158 | 4.25k | } |
159 | | /* 1 bit: extensionFlag3 */ |
160 | 5.02k | faad_getbits(ld, 1); |
161 | 5.02k | } |
162 | 7.55k | #endif |
163 | | |
164 | 7.55k | return 0; |
165 | 7.56k | } |
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 | 8.89k | { |
176 | 8.89k | uint8_t i; |
177 | | |
178 | 8.89k | memset(pce, 0, sizeof(program_config)); |
179 | | |
180 | 8.89k | pce->channels = 0; |
181 | | |
182 | 8.89k | pce->element_instance_tag = (uint8_t)faad_getbits(ld, 4 |
183 | 8.89k | DEBUGVAR(1,10,"program_config_element(): element_instance_tag")); |
184 | | |
185 | 8.89k | pce->object_type = (uint8_t)faad_getbits(ld, 2 |
186 | 8.89k | DEBUGVAR(1,11,"program_config_element(): object_type")); |
187 | 8.89k | pce->sf_index = (uint8_t)faad_getbits(ld, 4 |
188 | 8.89k | DEBUGVAR(1,12,"program_config_element(): sf_index")); |
189 | 8.89k | pce->num_front_channel_elements = (uint8_t)faad_getbits(ld, 4 |
190 | 8.89k | DEBUGVAR(1,13,"program_config_element(): num_front_channel_elements")); |
191 | 8.89k | pce->num_side_channel_elements = (uint8_t)faad_getbits(ld, 4 |
192 | 8.89k | DEBUGVAR(1,14,"program_config_element(): num_side_channel_elements")); |
193 | 8.89k | pce->num_back_channel_elements = (uint8_t)faad_getbits(ld, 4 |
194 | 8.89k | DEBUGVAR(1,15,"program_config_element(): num_back_channel_elements")); |
195 | 8.89k | pce->num_lfe_channel_elements = (uint8_t)faad_getbits(ld, 2 |
196 | 8.89k | DEBUGVAR(1,16,"program_config_element(): num_lfe_channel_elements")); |
197 | 8.89k | pce->num_assoc_data_elements = (uint8_t)faad_getbits(ld, 3 |
198 | 8.89k | DEBUGVAR(1,17,"program_config_element(): num_assoc_data_elements")); |
199 | 8.89k | pce->num_valid_cc_elements = (uint8_t)faad_getbits(ld, 4 |
200 | 8.89k | DEBUGVAR(1,18,"program_config_element(): num_valid_cc_elements")); |
201 | | |
202 | 8.89k | pce->mono_mixdown_present = faad_get1bit(ld |
203 | 8.89k | DEBUGVAR(1,19,"program_config_element(): mono_mixdown_present")); |
204 | 8.89k | if (pce->mono_mixdown_present == 1) |
205 | 2.67k | { |
206 | 2.67k | pce->mono_mixdown_element_number = (uint8_t)faad_getbits(ld, 4 |
207 | 2.67k | DEBUGVAR(1,20,"program_config_element(): mono_mixdown_element_number")); |
208 | 2.67k | } |
209 | | |
210 | 8.89k | pce->stereo_mixdown_present = faad_get1bit(ld |
211 | 8.89k | DEBUGVAR(1,21,"program_config_element(): stereo_mixdown_present")); |
212 | 8.89k | if (pce->stereo_mixdown_present == 1) |
213 | 2.75k | { |
214 | 2.75k | pce->stereo_mixdown_element_number = (uint8_t)faad_getbits(ld, 4 |
215 | 2.75k | DEBUGVAR(1,22,"program_config_element(): stereo_mixdown_element_number")); |
216 | 2.75k | } |
217 | | |
218 | 8.89k | pce->matrix_mixdown_idx_present = faad_get1bit(ld |
219 | 8.89k | DEBUGVAR(1,23,"program_config_element(): matrix_mixdown_idx_present")); |
220 | 8.89k | if (pce->matrix_mixdown_idx_present == 1) |
221 | 2.40k | { |
222 | 2.40k | pce->matrix_mixdown_idx = (uint8_t)faad_getbits(ld, 2 |
223 | 2.40k | DEBUGVAR(1,24,"program_config_element(): matrix_mixdown_idx")); |
224 | 2.40k | pce->pseudo_surround_enable = faad_get1bit(ld |
225 | 2.40k | DEBUGVAR(1,25,"program_config_element(): pseudo_surround_enable")); |
226 | 2.40k | } |
227 | | |
228 | 43.0k | for (i = 0; i < pce->num_front_channel_elements; i++) |
229 | 34.1k | { |
230 | 34.1k | pce->front_element_is_cpe[i] = faad_get1bit(ld |
231 | 34.1k | DEBUGVAR(1,26,"program_config_element(): front_element_is_cpe")); |
232 | 34.1k | pce->front_element_tag_select[i] = (uint8_t)faad_getbits(ld, 4 |
233 | 34.1k | DEBUGVAR(1,27,"program_config_element(): front_element_tag_select")); |
234 | | |
235 | 34.1k | if (pce->front_element_is_cpe[i] & 1) |
236 | 12.1k | { |
237 | 12.1k | pce->cpe_channel[pce->front_element_tag_select[i]] = pce->channels; |
238 | 12.1k | pce->num_front_channels += 2; |
239 | 12.1k | pce->channels += 2; |
240 | 21.9k | } else { |
241 | 21.9k | pce->sce_channel[pce->front_element_tag_select[i]] = pce->channels; |
242 | 21.9k | pce->num_front_channels++; |
243 | 21.9k | pce->channels++; |
244 | 21.9k | } |
245 | 34.1k | } |
246 | | |
247 | 42.7k | for (i = 0; i < pce->num_side_channel_elements; i++) |
248 | 33.8k | { |
249 | 33.8k | pce->side_element_is_cpe[i] = faad_get1bit(ld |
250 | 33.8k | DEBUGVAR(1,28,"program_config_element(): side_element_is_cpe")); |
251 | 33.8k | pce->side_element_tag_select[i] = (uint8_t)faad_getbits(ld, 4 |
252 | 33.8k | DEBUGVAR(1,29,"program_config_element(): side_element_tag_select")); |
253 | | |
254 | 33.8k | if (pce->side_element_is_cpe[i] & 1) |
255 | 11.9k | { |
256 | 11.9k | pce->cpe_channel[pce->side_element_tag_select[i]] = pce->channels; |
257 | 11.9k | pce->num_side_channels += 2; |
258 | 11.9k | pce->channels += 2; |
259 | 21.9k | } else { |
260 | 21.9k | pce->sce_channel[pce->side_element_tag_select[i]] = pce->channels; |
261 | 21.9k | pce->num_side_channels++; |
262 | 21.9k | pce->channels++; |
263 | 21.9k | } |
264 | 33.8k | } |
265 | | |
266 | 45.5k | for (i = 0; i < pce->num_back_channel_elements; i++) |
267 | 36.6k | { |
268 | 36.6k | pce->back_element_is_cpe[i] = faad_get1bit(ld |
269 | 36.6k | DEBUGVAR(1,30,"program_config_element(): back_element_is_cpe")); |
270 | 36.6k | pce->back_element_tag_select[i] = (uint8_t)faad_getbits(ld, 4 |
271 | 36.6k | DEBUGVAR(1,31,"program_config_element(): back_element_tag_select")); |
272 | | |
273 | 36.6k | if (pce->back_element_is_cpe[i] & 1) |
274 | 14.1k | { |
275 | 14.1k | pce->cpe_channel[pce->back_element_tag_select[i]] = pce->channels; |
276 | 14.1k | pce->channels += 2; |
277 | 14.1k | pce->num_back_channels += 2; |
278 | 22.5k | } else { |
279 | 22.5k | pce->sce_channel[pce->back_element_tag_select[i]] = pce->channels; |
280 | 22.5k | pce->num_back_channels++; |
281 | 22.5k | pce->channels++; |
282 | 22.5k | } |
283 | 36.6k | } |
284 | | |
285 | 16.2k | for (i = 0; i < pce->num_lfe_channel_elements; i++) |
286 | 7.34k | { |
287 | 7.34k | pce->lfe_element_tag_select[i] = (uint8_t)faad_getbits(ld, 4 |
288 | 7.34k | DEBUGVAR(1,32,"program_config_element(): lfe_element_tag_select")); |
289 | | |
290 | 7.34k | pce->sce_channel[pce->lfe_element_tag_select[i]] = pce->channels; |
291 | 7.34k | pce->num_lfe_channels++; |
292 | 7.34k | pce->channels++; |
293 | 7.34k | } |
294 | | |
295 | 21.7k | for (i = 0; i < pce->num_assoc_data_elements; i++) |
296 | 12.8k | pce->assoc_data_element_tag_select[i] = (uint8_t)faad_getbits(ld, 4 |
297 | 12.8k | DEBUGVAR(1,33,"program_config_element(): assoc_data_element_tag_select")); |
298 | | |
299 | 37.4k | for (i = 0; i < pce->num_valid_cc_elements; i++) |
300 | 28.5k | { |
301 | 28.5k | pce->cc_element_is_ind_sw[i] = faad_get1bit(ld |
302 | 28.5k | DEBUGVAR(1,34,"program_config_element(): cc_element_is_ind_sw")); |
303 | 28.5k | pce->valid_cc_element_tag_select[i] = (uint8_t)faad_getbits(ld, 4 |
304 | 28.5k | DEBUGVAR(1,35,"program_config_element(): valid_cc_element_tag_select")); |
305 | 28.5k | } |
306 | | |
307 | 8.89k | faad_byte_align(ld); |
308 | | |
309 | 8.89k | pce->comment_field_bytes = (uint8_t)faad_getbits(ld, 8 |
310 | 8.89k | DEBUGVAR(1,36,"program_config_element(): comment_field_bytes")); |
311 | | |
312 | 90.8k | for (i = 0; i < pce->comment_field_bytes; i++) |
313 | 81.9k | { |
314 | 81.9k | pce->comment_field_data[i] = (uint8_t)faad_getbits(ld, 8 |
315 | 81.9k | DEBUGVAR(1,37,"program_config_element(): comment_field_data")); |
316 | 81.9k | } |
317 | 8.89k | pce->comment_field_data[i] = 0; |
318 | | |
319 | 8.89k | if (pce->channels > MAX_CHANNELS) |
320 | 545 | return 22; |
321 | | |
322 | 8.35k | return 0; |
323 | 8.89k | } |
324 | | |
325 | | static void decode_sce_lfe(NeAACDecStruct *hDecoder, |
326 | | NeAACDecFrameInfo *hInfo, bitfile *ld, |
327 | | uint8_t id_syn_ele) |
328 | 511k | { |
329 | 511k | uint8_t channels = hDecoder->fr_channels; |
330 | 511k | 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 | 511k | if (channels+2 > MAX_CHANNELS) |
336 | 4.15k | { |
337 | 4.15k | hInfo->error = 12; |
338 | 4.15k | return; |
339 | 4.15k | } |
340 | 507k | if (hDecoder->fr_ch_ele+1 > MAX_SYNTAX_ELEMENTS) |
341 | 7.13k | { |
342 | 7.13k | hInfo->error = 13; |
343 | 7.13k | return; |
344 | 7.13k | } |
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 | 500k | if (hDecoder->element_id[hDecoder->fr_ch_ele] != INVALID_ELEMENT_ID && |
351 | 500k | hDecoder->element_id[hDecoder->fr_ch_ele] != id_syn_ele) |
352 | 333 | { |
353 | | /* element inconsistency */ |
354 | 333 | hInfo->error = 21; |
355 | 333 | return; |
356 | 333 | } |
357 | | |
358 | | /* save the syntax element id */ |
359 | 500k | hDecoder->element_id[hDecoder->fr_ch_ele] = id_syn_ele; |
360 | | |
361 | | /* decode the element */ |
362 | 500k | hInfo->error = single_lfe_channel_element(hDecoder, ld, channels, &tag); |
363 | | |
364 | | /* map output channels position to internal data channels */ |
365 | 500k | if (hDecoder->element_output_channels[hDecoder->fr_ch_ele] == 2) |
366 | 131k | { |
367 | | /* this might be faulty when pce_set is true */ |
368 | 131k | hDecoder->internal_channel[channels] = channels; |
369 | 131k | hDecoder->internal_channel[channels+1] = channels+1; |
370 | 368k | } else { |
371 | 368k | if (hDecoder->pce_set) |
372 | 20.2k | { |
373 | 20.2k | if (hDecoder->pce.channels > MAX_CHANNELS) |
374 | 18 | { |
375 | 18 | hInfo->error = 22; |
376 | 18 | return; |
377 | 18 | } |
378 | 20.2k | hDecoder->internal_channel[hDecoder->pce.sce_channel[tag]] = channels; |
379 | 348k | } else { |
380 | 348k | hDecoder->internal_channel[channels] = channels; |
381 | 348k | } |
382 | 368k | } |
383 | | |
384 | 500k | hDecoder->fr_channels += hDecoder->element_output_channels[hDecoder->fr_ch_ele]; |
385 | 500k | hDecoder->fr_ch_ele++; |
386 | 500k | } |
387 | | |
388 | | static void decode_cpe(NeAACDecStruct *hDecoder, NeAACDecFrameInfo *hInfo, bitfile *ld, |
389 | | uint8_t id_syn_ele) |
390 | 66.7k | { |
391 | 66.7k | uint8_t channels = hDecoder->fr_channels; |
392 | 66.7k | uint8_t tag = 0; |
393 | | |
394 | 66.7k | if (channels+2 > MAX_CHANNELS) |
395 | 350 | { |
396 | 350 | hInfo->error = 12; |
397 | 350 | return; |
398 | 350 | } |
399 | 66.4k | if (hDecoder->fr_ch_ele+1 > MAX_SYNTAX_ELEMENTS) |
400 | 6 | { |
401 | 6 | hInfo->error = 13; |
402 | 6 | return; |
403 | 6 | } |
404 | 66.4k | if (hDecoder->pce_set && (hDecoder->pce.channels > MAX_CHANNELS)) |
405 | 9 | { |
406 | 9 | hInfo->error = 22; |
407 | 9 | return; |
408 | 9 | } |
409 | | |
410 | | /* for CPE the number of output channels is always 2 */ |
411 | 66.4k | if (hDecoder->element_output_channels[hDecoder->fr_ch_ele] == 0) |
412 | 55.7k | { |
413 | | /* element_output_channels not set yet */ |
414 | 55.7k | hDecoder->element_output_channels[hDecoder->fr_ch_ele] = 2; |
415 | 55.7k | } else if (hDecoder->element_output_channels[hDecoder->fr_ch_ele] != 2) { |
416 | | /* element inconsistency */ |
417 | 60 | hInfo->error = 21; |
418 | 60 | return; |
419 | 60 | } |
420 | | |
421 | 66.3k | if (hDecoder->element_id[hDecoder->fr_ch_ele] != INVALID_ELEMENT_ID && |
422 | 66.3k | hDecoder->element_id[hDecoder->fr_ch_ele] != id_syn_ele) |
423 | 86 | { |
424 | | /* element inconsistency */ |
425 | 86 | hInfo->error = 21; |
426 | 86 | return; |
427 | 86 | } |
428 | | |
429 | | /* save the syntax element id */ |
430 | 66.2k | hDecoder->element_id[hDecoder->fr_ch_ele] = id_syn_ele; |
431 | | |
432 | | /* decode the element */ |
433 | 66.2k | hInfo->error = channel_pair_element(hDecoder, ld, channels, &tag); |
434 | | |
435 | | /* map output channel position to internal data channels */ |
436 | 66.2k | if (hDecoder->pce_set) |
437 | 4.99k | { |
438 | 4.99k | hDecoder->internal_channel[hDecoder->pce.cpe_channel[tag]] = channels; |
439 | 4.99k | hDecoder->internal_channel[hDecoder->pce.cpe_channel[tag]+1] = channels+1; |
440 | 61.2k | } else { |
441 | 61.2k | hDecoder->internal_channel[channels] = channels; |
442 | 61.2k | hDecoder->internal_channel[channels+1] = channels+1; |
443 | 61.2k | } |
444 | | |
445 | 66.2k | hDecoder->fr_channels += 2; |
446 | 66.2k | hDecoder->fr_ch_ele++; |
447 | 66.2k | } |
448 | | |
449 | | void raw_data_block(NeAACDecStruct *hDecoder, NeAACDecFrameInfo *hInfo, |
450 | | bitfile *ld, program_config *pce, drc_info *drc) |
451 | 27.6k | { |
452 | 27.6k | uint8_t id_syn_ele; |
453 | 27.6k | uint8_t ele_this_frame = 0; |
454 | | |
455 | 27.6k | hDecoder->fr_channels = 0; |
456 | 27.6k | hDecoder->fr_ch_ele = 0; |
457 | 27.6k | hDecoder->first_syn_ele = 25; |
458 | 27.6k | hDecoder->has_lfe = 0; |
459 | | |
460 | 27.6k | #ifdef ERROR_RESILIENCE |
461 | 27.6k | if (hDecoder->object_type < ER_OBJECT_START) |
462 | 18.2k | { |
463 | 18.2k | #endif |
464 | | /* Table 4.4.3: raw_data_block() */ |
465 | 2.57M | while ((id_syn_ele = (uint8_t)faad_getbits(ld, LEN_SE_ID |
466 | 2.57M | DEBUGVAR(1,4,"NeAACDecDecode(): id_syn_ele"))) != ID_END) |
467 | 2.57M | { |
468 | 2.57M | switch (id_syn_ele) { |
469 | 499k | case ID_SCE: |
470 | 499k | ele_this_frame++; |
471 | 499k | if (hDecoder->first_syn_ele == 25) hDecoder->first_syn_ele = id_syn_ele; |
472 | 499k | decode_sce_lfe(hDecoder, hInfo, ld, id_syn_ele); |
473 | 499k | if (hInfo->error > 0) |
474 | 13.4k | return; |
475 | 485k | break; |
476 | 485k | case ID_CPE: |
477 | 54.0k | ele_this_frame++; |
478 | 54.0k | if (hDecoder->first_syn_ele == 25) hDecoder->first_syn_ele = id_syn_ele; |
479 | 54.0k | decode_cpe(hDecoder, hInfo, ld, id_syn_ele); |
480 | 54.0k | if (hInfo->error > 0) |
481 | 1.77k | return; |
482 | 52.2k | break; |
483 | 52.2k | case ID_LFE: |
484 | | #ifdef DRM |
485 | | hInfo->error = 32; |
486 | | #else |
487 | | ele_this_frame++; |
488 | | hDecoder->has_lfe++; |
489 | | decode_sce_lfe(hDecoder, hInfo, ld, id_syn_ele); |
490 | | #endif |
491 | 4.29k | if (hInfo->error > 0) |
492 | 363 | return; |
493 | 3.93k | break; |
494 | 3.93k | case ID_CCE: /* not implemented yet, but skip the bits */ |
495 | | #ifdef DRM |
496 | | hInfo->error = 32; |
497 | | #else |
498 | | ele_this_frame++; |
499 | | #ifdef COUPLING_DEC |
500 | | hInfo->error = coupling_channel_element(hDecoder, ld); |
501 | | #else |
502 | | hInfo->error = 6; |
503 | | #endif |
504 | | #endif |
505 | 452 | if (hInfo->error > 0) |
506 | 452 | return; |
507 | 0 | break; |
508 | 2.00M | case ID_DSE: |
509 | 2.00M | ele_this_frame++; |
510 | 2.00M | data_stream_element(hDecoder, ld); |
511 | 2.00M | break; |
512 | 2.94k | case ID_PCE: |
513 | 2.94k | if (ele_this_frame != 0) |
514 | 224 | { |
515 | 224 | hInfo->error = 31; |
516 | 224 | return; |
517 | 224 | } |
518 | 2.72k | 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 | 2.72k | program_config_element(pce, ld); |
522 | | //if ((hInfo->error = program_config_element(pce, ld)) > 0) |
523 | | // return; |
524 | | //hDecoder->pce_set = 1; |
525 | 2.72k | break; |
526 | 9.83k | case ID_FIL: |
527 | 9.83k | 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 | 9.83k | if ((hInfo->error = fill_element(hDecoder, ld, drc |
532 | 9.83k | #ifdef SBR_DEC |
533 | 9.83k | , INVALID_SBR_ELEMENT |
534 | 9.83k | #endif |
535 | 9.83k | )) > 0) |
536 | 167 | return; |
537 | 9.66k | break; |
538 | 2.57M | } |
539 | 2.55M | if (ld->error != 0) |
540 | 0 | { |
541 | 0 | hInfo->error = 32; |
542 | 0 | return; |
543 | 0 | } |
544 | 2.55M | } |
545 | 18.2k | #ifdef ERROR_RESILIENCE |
546 | 18.2k | } else { |
547 | | /* Table 262: er_raw_data_block() */ |
548 | 9.35k | switch (hDecoder->channelConfiguration) |
549 | 9.35k | { |
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 | 3.64k | case 2: |
556 | 3.64k | decode_cpe(hDecoder, hInfo, ld, ID_CPE); |
557 | 3.64k | if (hInfo->error > 0) |
558 | 808 | return; |
559 | 2.84k | break; |
560 | 2.84k | case 3: |
561 | 658 | decode_sce_lfe(hDecoder, hInfo, ld, ID_SCE); |
562 | 658 | if (hInfo->error > 0) |
563 | 135 | return; |
564 | 523 | decode_cpe(hDecoder, hInfo, ld, ID_CPE); |
565 | 523 | if (hInfo->error > 0) |
566 | 42 | return; |
567 | 481 | break; |
568 | 1.11k | case 4: |
569 | 1.11k | decode_sce_lfe(hDecoder, hInfo, ld, ID_SCE); |
570 | 1.11k | if (hInfo->error > 0) |
571 | 183 | return; |
572 | 929 | decode_cpe(hDecoder, hInfo, ld, ID_CPE); |
573 | 929 | if (hInfo->error > 0) |
574 | 60 | return; |
575 | 869 | decode_sce_lfe(hDecoder, hInfo, ld, ID_SCE); |
576 | 869 | if (hInfo->error > 0) |
577 | 17 | return; |
578 | 852 | break; |
579 | 1.52k | case 5: |
580 | 1.52k | decode_sce_lfe(hDecoder, hInfo, ld, ID_SCE); |
581 | 1.52k | if (hInfo->error > 0) |
582 | 275 | return; |
583 | 1.24k | decode_cpe(hDecoder, hInfo, ld, ID_CPE); |
584 | 1.24k | if (hInfo->error > 0) |
585 | 55 | return; |
586 | 1.19k | decode_cpe(hDecoder, hInfo, ld, ID_CPE); |
587 | 1.19k | if (hInfo->error > 0) |
588 | 28 | return; |
589 | 1.16k | break; |
590 | 1.16k | case 6: |
591 | 819 | decode_sce_lfe(hDecoder, hInfo, ld, ID_SCE); |
592 | 819 | if (hInfo->error > 0) |
593 | 112 | return; |
594 | 707 | decode_cpe(hDecoder, hInfo, ld, ID_CPE); |
595 | 707 | if (hInfo->error > 0) |
596 | 53 | return; |
597 | 654 | decode_cpe(hDecoder, hInfo, ld, ID_CPE); |
598 | 654 | if (hInfo->error > 0) |
599 | 20 | return; |
600 | 634 | decode_sce_lfe(hDecoder, hInfo, ld, ID_LFE); |
601 | 634 | if (hInfo->error > 0) |
602 | 31 | return; |
603 | 603 | break; |
604 | 1.57k | case 7: /* 8 channels */ |
605 | 1.57k | decode_sce_lfe(hDecoder, hInfo, ld, ID_SCE); |
606 | 1.57k | if (hInfo->error > 0) |
607 | 222 | return; |
608 | 1.35k | decode_cpe(hDecoder, hInfo, ld, ID_CPE); |
609 | 1.35k | if (hInfo->error > 0) |
610 | 75 | return; |
611 | 1.28k | decode_cpe(hDecoder, hInfo, ld, ID_CPE); |
612 | 1.28k | if (hInfo->error > 0) |
613 | 33 | return; |
614 | 1.24k | decode_cpe(hDecoder, hInfo, ld, ID_CPE); |
615 | 1.24k | if (hInfo->error > 0) |
616 | 70 | return; |
617 | 1.17k | decode_sce_lfe(hDecoder, hInfo, ld, ID_LFE); |
618 | 1.17k | if (hInfo->error > 0) |
619 | 76 | return; |
620 | 1.10k | break; |
621 | 1.10k | default: |
622 | 17 | hInfo->error = 7; |
623 | 17 | return; |
624 | 9.35k | } |
625 | | #if 0 |
626 | | cnt = bits_to_decode() / 8; |
627 | | while (cnt >= 1) |
628 | | { |
629 | | cnt -= extension_payload(cnt); |
630 | | } |
631 | | #endif |
632 | 9.35k | } |
633 | 2.89k | #endif |
634 | | |
635 | | /* new in corrigendum 14496-3:2002 */ |
636 | | #ifdef DRM |
637 | 2.89k | if (hDecoder->object_type != DRM_ER_LC |
638 | | #if 0 |
639 | | && !hDecoder->latm_header_present |
640 | | #endif |
641 | 2.89k | ) |
642 | 2.89k | #endif |
643 | 2.89k | { |
644 | 2.89k | faad_byte_align(ld); |
645 | 2.89k | } |
646 | | |
647 | 5.94k | return; |
648 | 27.6k | } Line | Count | Source | 451 | 9.28k | { | 452 | 9.28k | uint8_t id_syn_ele; | 453 | 9.28k | uint8_t ele_this_frame = 0; | 454 | | | 455 | 9.28k | hDecoder->fr_channels = 0; | 456 | 9.28k | hDecoder->fr_ch_ele = 0; | 457 | 9.28k | hDecoder->first_syn_ele = 25; | 458 | 9.28k | hDecoder->has_lfe = 0; | 459 | | | 460 | 9.28k | #ifdef ERROR_RESILIENCE | 461 | 9.28k | if (hDecoder->object_type < ER_OBJECT_START) | 462 | 6.44k | { | 463 | 6.44k | #endif | 464 | | /* Table 4.4.3: raw_data_block() */ | 465 | 571k | while ((id_syn_ele = (uint8_t)faad_getbits(ld, LEN_SE_ID | 466 | 571k | DEBUGVAR(1,4,"NeAACDecDecode(): id_syn_ele"))) != ID_END) | 467 | 570k | { | 468 | 570k | switch (id_syn_ele) { | 469 | 124k | case ID_SCE: | 470 | 124k | ele_this_frame++; | 471 | 124k | if (hDecoder->first_syn_ele == 25) hDecoder->first_syn_ele = id_syn_ele; | 472 | 124k | decode_sce_lfe(hDecoder, hInfo, ld, id_syn_ele); | 473 | 124k | if (hInfo->error > 0) | 474 | 4.44k | return; | 475 | 119k | break; | 476 | 119k | case ID_CPE: | 477 | 23.3k | ele_this_frame++; | 478 | 23.3k | if (hDecoder->first_syn_ele == 25) hDecoder->first_syn_ele = id_syn_ele; | 479 | 23.3k | decode_cpe(hDecoder, hInfo, ld, id_syn_ele); | 480 | 23.3k | if (hInfo->error > 0) | 481 | 766 | return; | 482 | 22.6k | break; | 483 | 22.6k | case ID_LFE: | 484 | 110 | #ifdef DRM | 485 | 110 | hInfo->error = 32; | 486 | | #else | 487 | | ele_this_frame++; | 488 | | hDecoder->has_lfe++; | 489 | | decode_sce_lfe(hDecoder, hInfo, ld, id_syn_ele); | 490 | | #endif | 491 | 110 | if (hInfo->error > 0) | 492 | 110 | return; | 493 | 0 | break; | 494 | 169 | case ID_CCE: /* not implemented yet, but skip the bits */ | 495 | 169 | #ifdef DRM | 496 | 169 | hInfo->error = 32; | 497 | | #else | 498 | | ele_this_frame++; | 499 | | #ifdef COUPLING_DEC | 500 | | hInfo->error = coupling_channel_element(hDecoder, ld); | 501 | | #else | 502 | | hInfo->error = 6; | 503 | | #endif | 504 | | #endif | 505 | 169 | if (hInfo->error > 0) | 506 | 169 | return; | 507 | 0 | break; | 508 | 420k | case ID_DSE: | 509 | 420k | ele_this_frame++; | 510 | 420k | data_stream_element(hDecoder, ld); | 511 | 420k | break; | 512 | 393 | case ID_PCE: | 513 | 393 | if (ele_this_frame != 0) | 514 | 113 | { | 515 | 113 | hInfo->error = 31; | 516 | 113 | return; | 517 | 113 | } | 518 | 280 | 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 | 280 | program_config_element(pce, ld); | 522 | | //if ((hInfo->error = program_config_element(pce, ld)) > 0) | 523 | | // return; | 524 | | //hDecoder->pce_set = 1; | 525 | 280 | break; | 526 | 2.09k | case ID_FIL: | 527 | 2.09k | 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 | 2.09k | if ((hInfo->error = fill_element(hDecoder, ld, drc | 532 | 2.09k | #ifdef SBR_DEC | 533 | 2.09k | , INVALID_SBR_ELEMENT | 534 | 2.09k | #endif | 535 | 2.09k | )) > 0) | 536 | 118 | return; | 537 | 1.97k | break; | 538 | 570k | } | 539 | 564k | if (ld->error != 0) | 540 | 0 | { | 541 | 0 | hInfo->error = 32; | 542 | 0 | return; | 543 | 0 | } | 544 | 564k | } | 545 | 6.44k | #ifdef ERROR_RESILIENCE | 546 | 6.44k | } else { | 547 | | /* Table 262: er_raw_data_block() */ | 548 | 2.83k | switch (hDecoder->channelConfiguration) | 549 | 2.83k | { | 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 | 1.00k | case 2: | 556 | 1.00k | decode_cpe(hDecoder, hInfo, ld, ID_CPE); | 557 | 1.00k | if (hInfo->error > 0) | 558 | 161 | return; | 559 | 846 | break; | 560 | 846 | case 3: | 561 | 165 | decode_sce_lfe(hDecoder, hInfo, ld, ID_SCE); | 562 | 165 | if (hInfo->error > 0) | 563 | 35 | return; | 564 | 130 | decode_cpe(hDecoder, hInfo, ld, ID_CPE); | 565 | 130 | if (hInfo->error > 0) | 566 | 7 | return; | 567 | 123 | break; | 568 | 364 | case 4: | 569 | 364 | decode_sce_lfe(hDecoder, hInfo, ld, ID_SCE); | 570 | 364 | if (hInfo->error > 0) | 571 | 47 | return; | 572 | 317 | decode_cpe(hDecoder, hInfo, ld, ID_CPE); | 573 | 317 | if (hInfo->error > 0) | 574 | 18 | return; | 575 | 299 | decode_sce_lfe(hDecoder, hInfo, ld, ID_SCE); | 576 | 299 | if (hInfo->error > 0) | 577 | 4 | return; | 578 | 295 | break; | 579 | 668 | case 5: | 580 | 668 | decode_sce_lfe(hDecoder, hInfo, ld, ID_SCE); | 581 | 668 | if (hInfo->error > 0) | 582 | 117 | return; | 583 | 551 | decode_cpe(hDecoder, hInfo, ld, ID_CPE); | 584 | 551 | if (hInfo->error > 0) | 585 | 21 | return; | 586 | 530 | decode_cpe(hDecoder, hInfo, ld, ID_CPE); | 587 | 530 | if (hInfo->error > 0) | 588 | 9 | return; | 589 | 521 | break; | 590 | 521 | case 6: | 591 | 204 | decode_sce_lfe(hDecoder, hInfo, ld, ID_SCE); | 592 | 204 | if (hInfo->error > 0) | 593 | 38 | return; | 594 | 166 | decode_cpe(hDecoder, hInfo, ld, ID_CPE); | 595 | 166 | if (hInfo->error > 0) | 596 | 13 | return; | 597 | 153 | decode_cpe(hDecoder, hInfo, ld, ID_CPE); | 598 | 153 | if (hInfo->error > 0) | 599 | 6 | return; | 600 | 147 | decode_sce_lfe(hDecoder, hInfo, ld, ID_LFE); | 601 | 147 | if (hInfo->error > 0) | 602 | 15 | return; | 603 | 132 | break; | 604 | 421 | case 7: /* 8 channels */ | 605 | 421 | decode_sce_lfe(hDecoder, hInfo, ld, ID_SCE); | 606 | 421 | if (hInfo->error > 0) | 607 | 50 | return; | 608 | 371 | decode_cpe(hDecoder, hInfo, ld, ID_CPE); | 609 | 371 | if (hInfo->error > 0) | 610 | 31 | return; | 611 | 340 | decode_cpe(hDecoder, hInfo, ld, ID_CPE); | 612 | 340 | if (hInfo->error > 0) | 613 | 7 | return; | 614 | 333 | decode_cpe(hDecoder, hInfo, ld, ID_CPE); | 615 | 333 | if (hInfo->error > 0) | 616 | 49 | return; | 617 | 284 | decode_sce_lfe(hDecoder, hInfo, ld, ID_LFE); | 618 | 284 | if (hInfo->error > 0) | 619 | 29 | return; | 620 | 255 | break; | 621 | 255 | default: | 622 | 5 | hInfo->error = 7; | 623 | 5 | return; | 624 | 2.83k | } | 625 | | #if 0 | 626 | | cnt = bits_to_decode() / 8; | 627 | | while (cnt >= 1) | 628 | | { | 629 | | cnt -= extension_payload(cnt); | 630 | | } | 631 | | #endif | 632 | 2.83k | } | 633 | 2.89k | #endif | 634 | | | 635 | | /* new in corrigendum 14496-3:2002 */ | 636 | 2.89k | #ifdef DRM | 637 | 2.89k | if (hDecoder->object_type != DRM_ER_LC | 638 | | #if 0 | 639 | | && !hDecoder->latm_header_present | 640 | | #endif | 641 | 2.89k | ) | 642 | 2.89k | #endif | 643 | 2.89k | { | 644 | 2.89k | faad_byte_align(ld); | 645 | 2.89k | } | 646 | | | 647 | 2.89k | return; | 648 | 9.28k | } |
Line | Count | Source | 451 | 18.3k | { | 452 | 18.3k | uint8_t id_syn_ele; | 453 | 18.3k | uint8_t ele_this_frame = 0; | 454 | | | 455 | 18.3k | hDecoder->fr_channels = 0; | 456 | 18.3k | hDecoder->fr_ch_ele = 0; | 457 | 18.3k | hDecoder->first_syn_ele = 25; | 458 | 18.3k | hDecoder->has_lfe = 0; | 459 | | | 460 | 18.3k | #ifdef ERROR_RESILIENCE | 461 | 18.3k | if (hDecoder->object_type < ER_OBJECT_START) | 462 | 11.8k | { | 463 | 11.8k | #endif | 464 | | /* Table 4.4.3: raw_data_block() */ | 465 | 2.00M | while ((id_syn_ele = (uint8_t)faad_getbits(ld, LEN_SE_ID | 466 | 2.00M | DEBUGVAR(1,4,"NeAACDecDecode(): id_syn_ele"))) != ID_END) | 467 | 2.00M | { | 468 | 2.00M | switch (id_syn_ele) { | 469 | 374k | case ID_SCE: | 470 | 374k | ele_this_frame++; | 471 | 374k | if (hDecoder->first_syn_ele == 25) hDecoder->first_syn_ele = id_syn_ele; | 472 | 374k | decode_sce_lfe(hDecoder, hInfo, ld, id_syn_ele); | 473 | 374k | if (hInfo->error > 0) | 474 | 9.04k | return; | 475 | 365k | break; | 476 | 365k | case ID_CPE: | 477 | 30.6k | ele_this_frame++; | 478 | 30.6k | if (hDecoder->first_syn_ele == 25) hDecoder->first_syn_ele = id_syn_ele; | 479 | 30.6k | decode_cpe(hDecoder, hInfo, ld, id_syn_ele); | 480 | 30.6k | if (hInfo->error > 0) | 481 | 1.00k | return; | 482 | 29.6k | break; | 483 | 29.6k | case ID_LFE: | 484 | | #ifdef DRM | 485 | | hInfo->error = 32; | 486 | | #else | 487 | 4.18k | ele_this_frame++; | 488 | 4.18k | hDecoder->has_lfe++; | 489 | 4.18k | decode_sce_lfe(hDecoder, hInfo, ld, id_syn_ele); | 490 | 4.18k | #endif | 491 | 4.18k | if (hInfo->error > 0) | 492 | 253 | return; | 493 | 3.93k | break; | 494 | 3.93k | case ID_CCE: /* not implemented yet, but skip the bits */ | 495 | | #ifdef DRM | 496 | | hInfo->error = 32; | 497 | | #else | 498 | 283 | ele_this_frame++; | 499 | | #ifdef COUPLING_DEC | 500 | | hInfo->error = coupling_channel_element(hDecoder, ld); | 501 | | #else | 502 | 283 | hInfo->error = 6; | 503 | 283 | #endif | 504 | 283 | #endif | 505 | 283 | if (hInfo->error > 0) | 506 | 283 | return; | 507 | 0 | break; | 508 | 1.58M | case ID_DSE: | 509 | 1.58M | ele_this_frame++; | 510 | 1.58M | data_stream_element(hDecoder, ld); | 511 | 1.58M | break; | 512 | 2.55k | case ID_PCE: | 513 | 2.55k | if (ele_this_frame != 0) | 514 | 111 | { | 515 | 111 | hInfo->error = 31; | 516 | 111 | return; | 517 | 111 | } | 518 | 2.44k | 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 | 2.44k | program_config_element(pce, ld); | 522 | | //if ((hInfo->error = program_config_element(pce, ld)) > 0) | 523 | | // return; | 524 | | //hDecoder->pce_set = 1; | 525 | 2.44k | break; | 526 | 7.73k | case ID_FIL: | 527 | 7.73k | 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 | 7.73k | if ((hInfo->error = fill_element(hDecoder, ld, drc | 532 | 7.73k | #ifdef SBR_DEC | 533 | 7.73k | , INVALID_SBR_ELEMENT | 534 | 7.73k | #endif | 535 | 7.73k | )) > 0) | 536 | 49 | return; | 537 | 7.68k | break; | 538 | 2.00M | } | 539 | 1.99M | if (ld->error != 0) | 540 | 0 | { | 541 | 0 | hInfo->error = 32; | 542 | 0 | return; | 543 | 0 | } | 544 | 1.99M | } | 545 | 11.8k | #ifdef ERROR_RESILIENCE | 546 | 11.8k | } else { | 547 | | /* Table 262: er_raw_data_block() */ | 548 | 6.51k | switch (hDecoder->channelConfiguration) | 549 | 6.51k | { | 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 | 2.64k | case 2: | 556 | 2.64k | decode_cpe(hDecoder, hInfo, ld, ID_CPE); | 557 | 2.64k | if (hInfo->error > 0) | 558 | 647 | return; | 559 | 1.99k | break; | 560 | 1.99k | case 3: | 561 | 493 | decode_sce_lfe(hDecoder, hInfo, ld, ID_SCE); | 562 | 493 | if (hInfo->error > 0) | 563 | 100 | return; | 564 | 393 | decode_cpe(hDecoder, hInfo, ld, ID_CPE); | 565 | 393 | if (hInfo->error > 0) | 566 | 35 | return; | 567 | 358 | break; | 568 | 748 | case 4: | 569 | 748 | decode_sce_lfe(hDecoder, hInfo, ld, ID_SCE); | 570 | 748 | if (hInfo->error > 0) | 571 | 136 | return; | 572 | 612 | decode_cpe(hDecoder, hInfo, ld, ID_CPE); | 573 | 612 | if (hInfo->error > 0) | 574 | 42 | return; | 575 | 570 | decode_sce_lfe(hDecoder, hInfo, ld, ID_SCE); | 576 | 570 | if (hInfo->error > 0) | 577 | 13 | return; | 578 | 557 | break; | 579 | 853 | case 5: | 580 | 853 | decode_sce_lfe(hDecoder, hInfo, ld, ID_SCE); | 581 | 853 | if (hInfo->error > 0) | 582 | 158 | return; | 583 | 695 | decode_cpe(hDecoder, hInfo, ld, ID_CPE); | 584 | 695 | if (hInfo->error > 0) | 585 | 34 | return; | 586 | 661 | decode_cpe(hDecoder, hInfo, ld, ID_CPE); | 587 | 661 | if (hInfo->error > 0) | 588 | 19 | return; | 589 | 642 | break; | 590 | 642 | case 6: | 591 | 615 | decode_sce_lfe(hDecoder, hInfo, ld, ID_SCE); | 592 | 615 | if (hInfo->error > 0) | 593 | 74 | return; | 594 | 541 | decode_cpe(hDecoder, hInfo, ld, ID_CPE); | 595 | 541 | if (hInfo->error > 0) | 596 | 40 | return; | 597 | 501 | decode_cpe(hDecoder, hInfo, ld, ID_CPE); | 598 | 501 | if (hInfo->error > 0) | 599 | 14 | return; | 600 | 487 | decode_sce_lfe(hDecoder, hInfo, ld, ID_LFE); | 601 | 487 | if (hInfo->error > 0) | 602 | 16 | return; | 603 | 471 | break; | 604 | 1.15k | case 7: /* 8 channels */ | 605 | 1.15k | decode_sce_lfe(hDecoder, hInfo, ld, ID_SCE); | 606 | 1.15k | if (hInfo->error > 0) | 607 | 172 | return; | 608 | 984 | decode_cpe(hDecoder, hInfo, ld, ID_CPE); | 609 | 984 | if (hInfo->error > 0) | 610 | 44 | return; | 611 | 940 | decode_cpe(hDecoder, hInfo, ld, ID_CPE); | 612 | 940 | if (hInfo->error > 0) | 613 | 26 | return; | 614 | 914 | decode_cpe(hDecoder, hInfo, ld, ID_CPE); | 615 | 914 | if (hInfo->error > 0) | 616 | 21 | return; | 617 | 893 | decode_sce_lfe(hDecoder, hInfo, ld, ID_LFE); | 618 | 893 | if (hInfo->error > 0) | 619 | 47 | return; | 620 | 846 | break; | 621 | 846 | default: | 622 | 12 | hInfo->error = 7; | 623 | 12 | return; | 624 | 6.51k | } | 625 | | #if 0 | 626 | | cnt = bits_to_decode() / 8; | 627 | | while (cnt >= 1) | 628 | | { | 629 | | cnt -= extension_payload(cnt); | 630 | | } | 631 | | #endif | 632 | 6.51k | } | 633 | 5.94k | #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 | 5.94k | { | 644 | 5.94k | faad_byte_align(ld); | 645 | 5.94k | } | 646 | | | 647 | 5.94k | return; | 648 | 18.3k | } |
|
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 | 500k | { |
655 | 500k | uint8_t retval = 0; |
656 | 500k | element sce = {0}; |
657 | 500k | ic_stream *ics = &(sce.ics1); |
658 | 500k | ALIGN int16_t spec_data[1024] = {0}; |
659 | | |
660 | 500k | sce.element_instance_tag = (uint8_t)faad_getbits(ld, LEN_TAG |
661 | 500k | DEBUGVAR(1,38,"single_lfe_channel_element(): element_instance_tag")); |
662 | | |
663 | 500k | *tag = sce.element_instance_tag; |
664 | 500k | sce.channel = channel; |
665 | 500k | sce.paired_channel = -1; |
666 | | |
667 | 500k | retval = individual_channel_stream(hDecoder, &sce, ld, ics, 0, spec_data); |
668 | 500k | if (retval > 0) |
669 | 2.50k | return retval; |
670 | | |
671 | | /* IS not allowed in single channel */ |
672 | 497k | if (ics->is_used) |
673 | 223 | return 32; |
674 | | |
675 | 497k | #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 | 497k | if (faad_showbits(ld, LEN_SE_ID) == ID_FIL) |
679 | 50.9k | { |
680 | 50.9k | faad_flushbits(ld, LEN_SE_ID); |
681 | | |
682 | | /* one sbr_info describes a channel_element not a channel! */ |
683 | 50.9k | if ((retval = fill_element(hDecoder, ld, hDecoder->drc, hDecoder->fr_ch_ele)) > 0) |
684 | 51 | { |
685 | 51 | return retval; |
686 | 51 | } |
687 | 50.9k | } |
688 | 497k | #endif |
689 | | |
690 | | /* noiseless coding is done, spectral reconstruction is done now */ |
691 | 497k | retval = reconstruct_single_channel(hDecoder, ics, &sce, spec_data); |
692 | 497k | if (retval > 0) |
693 | 392 | return retval; |
694 | | |
695 | 496k | return 0; |
696 | 497k | } |
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 | 27.0k | { |
702 | 27.0k | ALIGN int16_t spec_data1[1024] = {0}; |
703 | 27.0k | ALIGN int16_t spec_data2[1024] = {0}; |
704 | 27.0k | element cpe = {0}; |
705 | 27.0k | ic_stream *ics1 = &(cpe.ics1); |
706 | 27.0k | ic_stream *ics2 = &(cpe.ics2); |
707 | 27.0k | uint8_t result; |
708 | | |
709 | 27.0k | cpe.channel = channels; |
710 | 27.0k | cpe.paired_channel = channels+1; |
711 | | |
712 | 27.0k | cpe.element_instance_tag = (uint8_t)faad_getbits(ld, LEN_TAG |
713 | 27.0k | DEBUGVAR(1,39,"channel_pair_element(): element_instance_tag")); |
714 | 27.0k | *tag = cpe.element_instance_tag; |
715 | | |
716 | 27.0k | if ((cpe.common_window = faad_get1bit(ld |
717 | 27.0k | DEBUGVAR(1,40,"channel_pair_element(): common_window"))) & 1) |
718 | 13.8k | { |
719 | | /* both channels have common ics information */ |
720 | 13.8k | if ((result = ics_info(hDecoder, ics1, ld, cpe.common_window)) > 0) |
721 | 99 | return result; |
722 | | |
723 | 13.7k | ics1->ms_mask_present = (uint8_t)faad_getbits(ld, 2 |
724 | 13.7k | DEBUGVAR(1,41,"channel_pair_element(): ms_mask_present")); |
725 | 13.7k | if (ics1->ms_mask_present == 3) |
726 | 31 | { |
727 | | /* bitstream error */ |
728 | 31 | return 32; |
729 | 31 | } |
730 | 13.7k | if (ics1->ms_mask_present == 1) |
731 | 3.19k | { |
732 | 3.19k | uint8_t g, sfb; |
733 | 10.1k | for (g = 0; g < ics1->num_window_groups; g++) |
734 | 6.95k | { |
735 | 15.3k | for (sfb = 0; sfb < ics1->max_sfb; sfb++) |
736 | 8.42k | { |
737 | 8.42k | ics1->ms_used[g][sfb] = faad_get1bit(ld |
738 | 8.42k | DEBUGVAR(1,42,"channel_pair_element(): faad_get1bit")); |
739 | 8.42k | } |
740 | 6.95k | } |
741 | 3.19k | } |
742 | | |
743 | 13.7k | #ifdef ERROR_RESILIENCE |
744 | 13.7k | if ((hDecoder->object_type >= ER_OBJECT_START) && (ics1->predictor_data_present)) |
745 | 71 | { |
746 | 71 | if (( |
747 | | #ifdef LTP_DEC |
748 | | ics1->ltp.data_present = |
749 | | #endif |
750 | 71 | faad_get1bit(ld DEBUGVAR(1,50,"channel_pair_element(): ltp.data_present"))) & 1) |
751 | 5 | { |
752 | | #ifdef LTP_DEC |
753 | | if ((result = ltp_data(hDecoder, ics1, &(ics1->ltp), ld)) > 0) |
754 | | { |
755 | | return result; |
756 | | } |
757 | | #else |
758 | 5 | return 26; |
759 | 5 | #endif |
760 | 5 | } |
761 | 71 | } |
762 | 13.7k | #endif |
763 | | |
764 | 13.7k | memcpy(ics2, ics1, sizeof(ic_stream)); |
765 | 13.7k | } else { |
766 | 13.1k | ics1->ms_mask_present = 0; |
767 | 13.1k | } |
768 | | |
769 | 26.8k | if ((result = individual_channel_stream(hDecoder, &cpe, ld, ics1, |
770 | 26.8k | 0, spec_data1)) > 0) |
771 | 421 | { |
772 | 421 | return result; |
773 | 421 | } |
774 | | |
775 | 26.4k | #ifdef ERROR_RESILIENCE |
776 | 26.4k | if (cpe.common_window && (hDecoder->object_type >= ER_OBJECT_START) && |
777 | 26.4k | (ics1->predictor_data_present)) |
778 | 47 | { |
779 | 47 | if (( |
780 | | #ifdef LTP_DEC |
781 | | ics1->ltp2.data_present = |
782 | | #endif |
783 | 47 | faad_get1bit(ld DEBUGVAR(1,50,"channel_pair_element(): ltp.data_present"))) & 1) |
784 | 4 | { |
785 | | #ifdef LTP_DEC |
786 | | if ((result = ltp_data(hDecoder, ics1, &(ics1->ltp2), ld)) > 0) |
787 | | { |
788 | | return result; |
789 | | } |
790 | | #else |
791 | 4 | return 26; |
792 | 4 | #endif |
793 | 4 | } |
794 | 47 | } |
795 | 26.4k | #endif |
796 | | |
797 | 26.4k | if ((result = individual_channel_stream(hDecoder, &cpe, ld, ics2, |
798 | 26.4k | 0, spec_data2)) > 0) |
799 | 214 | { |
800 | 214 | return result; |
801 | 214 | } |
802 | | |
803 | 26.2k | #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 | 26.2k | if (faad_showbits(ld, LEN_SE_ID) == ID_FIL) |
807 | 15.4k | { |
808 | 15.4k | faad_flushbits(ld, LEN_SE_ID); |
809 | | |
810 | | /* one sbr_info describes a channel_element not a channel! */ |
811 | 15.4k | if ((result = fill_element(hDecoder, ld, hDecoder->drc, hDecoder->fr_ch_ele)) > 0) |
812 | 25 | { |
813 | 25 | return result; |
814 | 25 | } |
815 | 15.4k | } |
816 | 26.2k | #endif |
817 | | |
818 | | /* noiseless coding is done, spectral reconstruction is done now */ |
819 | 26.2k | if ((result = reconstruct_channel_pair(hDecoder, ics1, ics2, &cpe, |
820 | 26.2k | spec_data1, spec_data2)) > 0) |
821 | 38 | { |
822 | 38 | return result; |
823 | 38 | } |
824 | | |
825 | 26.1k | return 0; |
826 | 26.2k | } |
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 | 598k | { |
832 | 598k | uint8_t retval = 0; |
833 | 598k | uint8_t ics_reserved_bit; |
834 | | |
835 | 598k | ics_reserved_bit = faad_get1bit(ld |
836 | 598k | DEBUGVAR(1,43,"ics_info(): ics_reserved_bit")); |
837 | 598k | if (ics_reserved_bit != 0) |
838 | 1.15k | return 32; |
839 | 597k | ics->window_sequence = (uint8_t)faad_getbits(ld, 2 |
840 | 597k | DEBUGVAR(1,44,"ics_info(): window_sequence")); |
841 | 597k | ics->window_shape = faad_get1bit(ld |
842 | 597k | DEBUGVAR(1,45,"ics_info(): window_shape")); |
843 | | |
844 | | #ifdef LD_DEC |
845 | | /* No block switching in LD */ |
846 | 434k | if ((hDecoder->object_type == LD) && (ics->window_sequence != ONLY_LONG_SEQUENCE)) |
847 | 34 | return 32; |
848 | 434k | #endif |
849 | | |
850 | 597k | if (ics->window_sequence == EIGHT_SHORT_SEQUENCE) |
851 | 59.3k | { |
852 | 59.3k | ics->max_sfb = (uint8_t)faad_getbits(ld, 4 |
853 | 59.3k | DEBUGVAR(1,46,"ics_info(): max_sfb (short)")); |
854 | 59.3k | ics->scale_factor_grouping = (uint8_t)faad_getbits(ld, 7 |
855 | 59.3k | DEBUGVAR(1,47,"ics_info(): scale_factor_grouping")); |
856 | 538k | } else { |
857 | 538k | ics->max_sfb = (uint8_t)faad_getbits(ld, 6 |
858 | 538k | DEBUGVAR(1,48,"ics_info(): max_sfb (long)")); |
859 | 538k | } |
860 | | |
861 | | /* get the grouping information */ |
862 | 597k | if ((retval = window_grouping_info(hDecoder, ics)) > 0) |
863 | 310 | return retval; |
864 | | |
865 | | |
866 | | /* should be an error */ |
867 | | /* check the range of max_sfb */ |
868 | 597k | if (ics->max_sfb > ics->num_swb) |
869 | 0 | return 16; |
870 | | |
871 | 597k | if (ics->window_sequence != EIGHT_SHORT_SEQUENCE) |
872 | 537k | { |
873 | 537k | if ((ics->predictor_data_present = faad_get1bit(ld |
874 | 537k | DEBUGVAR(1,49,"ics_info(): predictor_data_present"))) & 1) |
875 | 40.8k | { |
876 | 40.8k | if (hDecoder->object_type == MAIN) /* MPEG2 style AAC predictor */ |
877 | 16.0k | { |
878 | 16.0k | uint8_t sfb; |
879 | 16.0k | uint8_t predictor_reset, predictor_reset_group_number, prediction_used; |
880 | 16.0k | uint8_t limit = min(ics->max_sfb, max_pred_sfb(hDecoder->sf_index)); |
881 | | |
882 | 16.0k | predictor_reset = faad_get1bit(ld DEBUGVAR(1,53,"ics_info(): pred.predictor_reset")); |
883 | 16.0k | if (predictor_reset) |
884 | 14.1k | { |
885 | 14.1k | predictor_reset_group_number = |
886 | 14.1k | (uint8_t)faad_getbits(ld, 5 DEBUGVAR(1,54,"ics_info(): pred.predictor_reset_group_number")); |
887 | 14.1k | } else { |
888 | 1.94k | predictor_reset_group_number = 0; |
889 | 1.94k | } |
890 | | |
891 | 47.3k | for (sfb = 0; sfb < limit; sfb++) |
892 | 31.3k | { |
893 | 31.3k | prediction_used = faad_get1bit(ld DEBUGVAR(1,55,"ics_info(): pred.prediction_used")); |
894 | | #ifdef MAIN_DEC |
895 | | ics->pred.prediction_used[sfb] = prediction_used; |
896 | | #endif |
897 | 31.3k | } |
898 | | #ifdef MAIN_DEC |
899 | | ics->pred.limit = limit; |
900 | | ics->pred.predictor_reset = predictor_reset; |
901 | | 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 | 16.0k | } |
907 | | #ifdef LTP_DEC |
908 | 17.8k | else { /* Long Term Prediction */ |
909 | 17.8k | if (hDecoder->object_type < ER_OBJECT_START) |
910 | 16.1k | { |
911 | 16.1k | if ((ics->ltp.data_present = faad_get1bit(ld |
912 | 16.1k | DEBUGVAR(1,50,"ics_info(): ltp.data_present"))) & 1) |
913 | 11.1k | { |
914 | 11.1k | if ((retval = ltp_data(hDecoder, ics, &(ics->ltp), ld)) > 0) |
915 | 8 | { |
916 | 8 | return retval; |
917 | 8 | } |
918 | 11.1k | } |
919 | 16.1k | if (common_window) |
920 | 2.83k | { |
921 | 2.83k | if ((ics->ltp2.data_present = faad_get1bit(ld |
922 | 2.83k | DEBUGVAR(1,51,"ics_info(): ltp2.data_present"))) & 1) |
923 | 1.88k | { |
924 | 1.88k | if ((retval = ltp_data(hDecoder, ics, &(ics->ltp2), ld)) > 0) |
925 | 6 | { |
926 | 6 | return retval; |
927 | 6 | } |
928 | 1.88k | } |
929 | 2.83k | } |
930 | 16.1k | } |
931 | 17.8k | #ifdef ERROR_RESILIENCE |
932 | 17.8k | if (!common_window && (hDecoder->object_type >= ER_OBJECT_START)) |
933 | 1.33k | { |
934 | 1.33k | if ((ics->ltp.data_present = faad_get1bit(ld |
935 | 1.33k | DEBUGVAR(1,50,"ics_info(): ltp.data_present"))) & 1) |
936 | 538 | { |
937 | 538 | if ((retval = ltp_data(hDecoder, ics, &(ics->ltp), ld)) > 0) |
938 | 7 | { |
939 | 7 | return retval; |
940 | 7 | } |
941 | 538 | } |
942 | 1.33k | } |
943 | 17.8k | #endif /* ERROR_RESILIENCE */ |
944 | 17.8k | } |
945 | | #else /* LTP_DEC */ |
946 | | (void)common_window; |
947 | | #endif /* LTP_DEC */ |
948 | 40.8k | } |
949 | 537k | } |
950 | | |
951 | 434k | return retval; |
952 | 434k | } Line | Count | Source | 831 | 163k | { | 832 | 163k | uint8_t retval = 0; | 833 | 163k | uint8_t ics_reserved_bit; | 834 | | | 835 | 163k | ics_reserved_bit = faad_get1bit(ld | 836 | 163k | DEBUGVAR(1,43,"ics_info(): ics_reserved_bit")); | 837 | 163k | if (ics_reserved_bit != 0) | 838 | 367 | return 32; | 839 | 162k | ics->window_sequence = (uint8_t)faad_getbits(ld, 2 | 840 | 162k | DEBUGVAR(1,44,"ics_info(): window_sequence")); | 841 | 162k | ics->window_shape = faad_get1bit(ld | 842 | 162k | DEBUGVAR(1,45,"ics_info(): window_shape")); | 843 | | | 844 | | #ifdef LD_DEC | 845 | | /* No block switching in LD */ | 846 | | if ((hDecoder->object_type == LD) && (ics->window_sequence != ONLY_LONG_SEQUENCE)) | 847 | | return 32; | 848 | | #endif | 849 | | | 850 | 162k | if (ics->window_sequence == EIGHT_SHORT_SEQUENCE) | 851 | 23.2k | { | 852 | 23.2k | ics->max_sfb = (uint8_t)faad_getbits(ld, 4 | 853 | 23.2k | DEBUGVAR(1,46,"ics_info(): max_sfb (short)")); | 854 | 23.2k | ics->scale_factor_grouping = (uint8_t)faad_getbits(ld, 7 | 855 | 23.2k | DEBUGVAR(1,47,"ics_info(): scale_factor_grouping")); | 856 | 139k | } else { | 857 | 139k | ics->max_sfb = (uint8_t)faad_getbits(ld, 6 | 858 | 139k | DEBUGVAR(1,48,"ics_info(): max_sfb (long)")); | 859 | 139k | } | 860 | | | 861 | | /* get the grouping information */ | 862 | 162k | if ((retval = window_grouping_info(hDecoder, ics)) > 0) | 863 | 94 | return retval; | 864 | | | 865 | | | 866 | | /* should be an error */ | 867 | | /* check the range of max_sfb */ | 868 | 162k | if (ics->max_sfb > ics->num_swb) | 869 | 0 | return 16; | 870 | | | 871 | 162k | if (ics->window_sequence != EIGHT_SHORT_SEQUENCE) | 872 | 139k | { | 873 | 139k | if ((ics->predictor_data_present = faad_get1bit(ld | 874 | 139k | DEBUGVAR(1,49,"ics_info(): predictor_data_present"))) & 1) | 875 | 12.3k | { | 876 | 12.3k | if (hDecoder->object_type == MAIN) /* MPEG2 style AAC predictor */ | 877 | 5.36k | { | 878 | 5.36k | uint8_t sfb; | 879 | 5.36k | uint8_t predictor_reset, predictor_reset_group_number, prediction_used; | 880 | 5.36k | uint8_t limit = min(ics->max_sfb, max_pred_sfb(hDecoder->sf_index)); | 881 | | | 882 | 5.36k | predictor_reset = faad_get1bit(ld DEBUGVAR(1,53,"ics_info(): pred.predictor_reset")); | 883 | 5.36k | if (predictor_reset) | 884 | 5.12k | { | 885 | 5.12k | predictor_reset_group_number = | 886 | 5.12k | (uint8_t)faad_getbits(ld, 5 DEBUGVAR(1,54,"ics_info(): pred.predictor_reset_group_number")); | 887 | 5.12k | } else { | 888 | 239 | predictor_reset_group_number = 0; | 889 | 239 | } | 890 | | | 891 | 24.5k | for (sfb = 0; sfb < limit; sfb++) | 892 | 19.1k | { | 893 | 19.1k | prediction_used = faad_get1bit(ld DEBUGVAR(1,55,"ics_info(): pred.prediction_used")); | 894 | | #ifdef MAIN_DEC | 895 | | ics->pred.prediction_used[sfb] = prediction_used; | 896 | | #endif | 897 | 19.1k | } | 898 | | #ifdef MAIN_DEC | 899 | | ics->pred.limit = limit; | 900 | | ics->pred.predictor_reset = predictor_reset; | 901 | | ics->pred.predictor_reset_group_number = predictor_reset_group_number; | 902 | | #else | 903 | 5.36k | (void)predictor_reset_group_number; | 904 | 5.36k | (void)prediction_used; | 905 | 5.36k | #endif | 906 | 5.36k | } | 907 | | #ifdef LTP_DEC | 908 | | else { /* Long Term Prediction */ | 909 | | if (hDecoder->object_type < ER_OBJECT_START) | 910 | | { | 911 | | if ((ics->ltp.data_present = faad_get1bit(ld | 912 | | DEBUGVAR(1,50,"ics_info(): ltp.data_present"))) & 1) | 913 | | { | 914 | | if ((retval = ltp_data(hDecoder, ics, &(ics->ltp), ld)) > 0) | 915 | | { | 916 | | return retval; | 917 | | } | 918 | | } | 919 | | if (common_window) | 920 | | { | 921 | | if ((ics->ltp2.data_present = faad_get1bit(ld | 922 | | DEBUGVAR(1,51,"ics_info(): ltp2.data_present"))) & 1) | 923 | | { | 924 | | if ((retval = ltp_data(hDecoder, ics, &(ics->ltp2), ld)) > 0) | 925 | | { | 926 | | return retval; | 927 | | } | 928 | | } | 929 | | } | 930 | | } | 931 | | #ifdef ERROR_RESILIENCE | 932 | | if (!common_window && (hDecoder->object_type >= ER_OBJECT_START)) | 933 | | { | 934 | | if ((ics->ltp.data_present = faad_get1bit(ld | 935 | | DEBUGVAR(1,50,"ics_info(): ltp.data_present"))) & 1) | 936 | | { | 937 | | if ((retval = ltp_data(hDecoder, ics, &(ics->ltp), ld)) > 0) | 938 | | { | 939 | | return retval; | 940 | | } | 941 | | } | 942 | | } | 943 | | #endif /* ERROR_RESILIENCE */ | 944 | | } | 945 | | #else /* LTP_DEC */ | 946 | 12.3k | (void)common_window; | 947 | 12.3k | #endif /* LTP_DEC */ | 948 | 12.3k | } | 949 | 139k | } | 950 | | | 951 | 162k | return retval; | 952 | 162k | } |
Line | Count | Source | 831 | 435k | { | 832 | 435k | uint8_t retval = 0; | 833 | 435k | uint8_t ics_reserved_bit; | 834 | | | 835 | 435k | ics_reserved_bit = faad_get1bit(ld | 836 | 435k | DEBUGVAR(1,43,"ics_info(): ics_reserved_bit")); | 837 | 435k | if (ics_reserved_bit != 0) | 838 | 784 | return 32; | 839 | 434k | ics->window_sequence = (uint8_t)faad_getbits(ld, 2 | 840 | 434k | DEBUGVAR(1,44,"ics_info(): window_sequence")); | 841 | 434k | ics->window_shape = faad_get1bit(ld | 842 | 434k | DEBUGVAR(1,45,"ics_info(): window_shape")); | 843 | | | 844 | 434k | #ifdef LD_DEC | 845 | | /* No block switching in LD */ | 846 | 434k | if ((hDecoder->object_type == LD) && (ics->window_sequence != ONLY_LONG_SEQUENCE)) | 847 | 34 | return 32; | 848 | 434k | #endif | 849 | | | 850 | 434k | if (ics->window_sequence == EIGHT_SHORT_SEQUENCE) | 851 | 36.0k | { | 852 | 36.0k | ics->max_sfb = (uint8_t)faad_getbits(ld, 4 | 853 | 36.0k | DEBUGVAR(1,46,"ics_info(): max_sfb (short)")); | 854 | 36.0k | ics->scale_factor_grouping = (uint8_t)faad_getbits(ld, 7 | 855 | 36.0k | DEBUGVAR(1,47,"ics_info(): scale_factor_grouping")); | 856 | 398k | } else { | 857 | 398k | ics->max_sfb = (uint8_t)faad_getbits(ld, 6 | 858 | 398k | DEBUGVAR(1,48,"ics_info(): max_sfb (long)")); | 859 | 398k | } | 860 | | | 861 | | /* get the grouping information */ | 862 | 434k | if ((retval = window_grouping_info(hDecoder, ics)) > 0) | 863 | 216 | return retval; | 864 | | | 865 | | | 866 | | /* should be an error */ | 867 | | /* check the range of max_sfb */ | 868 | 434k | if (ics->max_sfb > ics->num_swb) | 869 | 0 | return 16; | 870 | | | 871 | 434k | if (ics->window_sequence != EIGHT_SHORT_SEQUENCE) | 872 | 398k | { | 873 | 398k | if ((ics->predictor_data_present = faad_get1bit(ld | 874 | 398k | DEBUGVAR(1,49,"ics_info(): predictor_data_present"))) & 1) | 875 | 28.5k | { | 876 | 28.5k | if (hDecoder->object_type == MAIN) /* MPEG2 style AAC predictor */ | 877 | 10.6k | { | 878 | 10.6k | uint8_t sfb; | 879 | 10.6k | uint8_t predictor_reset, predictor_reset_group_number, prediction_used; | 880 | 10.6k | uint8_t limit = min(ics->max_sfb, max_pred_sfb(hDecoder->sf_index)); | 881 | | | 882 | 10.6k | predictor_reset = faad_get1bit(ld DEBUGVAR(1,53,"ics_info(): pred.predictor_reset")); | 883 | 10.6k | if (predictor_reset) | 884 | 8.98k | { | 885 | 8.98k | predictor_reset_group_number = | 886 | 8.98k | (uint8_t)faad_getbits(ld, 5 DEBUGVAR(1,54,"ics_info(): pred.predictor_reset_group_number")); | 887 | 8.98k | } else { | 888 | 1.70k | predictor_reset_group_number = 0; | 889 | 1.70k | } | 890 | | | 891 | 22.8k | for (sfb = 0; sfb < limit; sfb++) | 892 | 12.1k | { | 893 | 12.1k | prediction_used = faad_get1bit(ld DEBUGVAR(1,55,"ics_info(): pred.prediction_used")); | 894 | 12.1k | #ifdef MAIN_DEC | 895 | 12.1k | ics->pred.prediction_used[sfb] = prediction_used; | 896 | 12.1k | #endif | 897 | 12.1k | } | 898 | 10.6k | #ifdef MAIN_DEC | 899 | 10.6k | ics->pred.limit = limit; | 900 | 10.6k | ics->pred.predictor_reset = predictor_reset; | 901 | 10.6k | 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 | 10.6k | } | 907 | 17.8k | #ifdef LTP_DEC | 908 | 17.8k | else { /* Long Term Prediction */ | 909 | 17.8k | if (hDecoder->object_type < ER_OBJECT_START) | 910 | 16.1k | { | 911 | 16.1k | if ((ics->ltp.data_present = faad_get1bit(ld | 912 | 16.1k | DEBUGVAR(1,50,"ics_info(): ltp.data_present"))) & 1) | 913 | 11.1k | { | 914 | 11.1k | if ((retval = ltp_data(hDecoder, ics, &(ics->ltp), ld)) > 0) | 915 | 8 | { | 916 | 8 | return retval; | 917 | 8 | } | 918 | 11.1k | } | 919 | 16.1k | if (common_window) | 920 | 2.83k | { | 921 | 2.83k | if ((ics->ltp2.data_present = faad_get1bit(ld | 922 | 2.83k | DEBUGVAR(1,51,"ics_info(): ltp2.data_present"))) & 1) | 923 | 1.88k | { | 924 | 1.88k | if ((retval = ltp_data(hDecoder, ics, &(ics->ltp2), ld)) > 0) | 925 | 6 | { | 926 | 6 | return retval; | 927 | 6 | } | 928 | 1.88k | } | 929 | 2.83k | } | 930 | 16.1k | } | 931 | 17.8k | #ifdef ERROR_RESILIENCE | 932 | 17.8k | if (!common_window && (hDecoder->object_type >= ER_OBJECT_START)) | 933 | 1.33k | { | 934 | 1.33k | if ((ics->ltp.data_present = faad_get1bit(ld | 935 | 1.33k | DEBUGVAR(1,50,"ics_info(): ltp.data_present"))) & 1) | 936 | 538 | { | 937 | 538 | if ((retval = ltp_data(hDecoder, ics, &(ics->ltp), ld)) > 0) | 938 | 7 | { | 939 | 7 | return retval; | 940 | 7 | } | 941 | 538 | } | 942 | 1.33k | } | 943 | 17.8k | #endif /* ERROR_RESILIENCE */ | 944 | 17.8k | } | 945 | | #else /* LTP_DEC */ | 946 | | (void)common_window; | 947 | | #endif /* LTP_DEC */ | 948 | 28.5k | } | 949 | 398k | } | 950 | | | 951 | 434k | return retval; | 952 | 434k | } |
|
953 | | |
954 | | /* Table 4.4.7 */ |
955 | | static uint8_t pulse_data(ic_stream *ics, pulse_info *pul, bitfile *ld) |
956 | 19.8k | { |
957 | 19.8k | uint8_t i; |
958 | | |
959 | 19.8k | pul->number_pulse = (uint8_t)faad_getbits(ld, 2 |
960 | 19.8k | DEBUGVAR(1,56,"pulse_data(): number_pulse")); |
961 | 19.8k | pul->pulse_start_sfb = (uint8_t)faad_getbits(ld, 6 |
962 | 19.8k | DEBUGVAR(1,57,"pulse_data(): pulse_start_sfb")); |
963 | | |
964 | | /* check the range of pulse_start_sfb */ |
965 | 19.8k | if (pul->pulse_start_sfb > ics->num_swb) |
966 | 163 | return 16; |
967 | | |
968 | 60.9k | for (i = 0; i < pul->number_pulse+1; i++) |
969 | 41.2k | { |
970 | 41.2k | pul->pulse_offset[i] = (uint8_t)faad_getbits(ld, 5 |
971 | 41.2k | DEBUGVAR(1,58,"pulse_data(): pulse_offset")); |
972 | | #if 0 |
973 | | printf("%d\n", pul->pulse_offset[i]); |
974 | | #endif |
975 | 41.2k | pul->pulse_amp[i] = (uint8_t)faad_getbits(ld, 4 |
976 | 41.2k | DEBUGVAR(1,59,"pulse_data(): pulse_amp")); |
977 | | #if 0 |
978 | | printf("%d\n", pul->pulse_amp[i]); |
979 | | #endif |
980 | 41.2k | } |
981 | | |
982 | 19.7k | return 0; |
983 | 19.8k | } |
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 | 2.00M | { |
1082 | 2.00M | uint8_t byte_aligned; |
1083 | 2.00M | uint16_t i, count; |
1084 | 2.00M | (void)hDecoder; /* TODO: remove parameter; rename method; why result is unused? */ |
1085 | | |
1086 | 2.00M | /* element_instance_tag = */ faad_getbits(ld, LEN_TAG |
1087 | 2.00M | DEBUGVAR(1,60,"data_stream_element(): element_instance_tag")); |
1088 | 2.00M | byte_aligned = faad_get1bit(ld |
1089 | 2.00M | DEBUGVAR(1,61,"data_stream_element(): byte_aligned")); |
1090 | 2.00M | count = (uint16_t)faad_getbits(ld, 8 |
1091 | 2.00M | DEBUGVAR(1,62,"data_stream_element(): count")); |
1092 | 2.00M | if (count == 255) |
1093 | 22.7k | { |
1094 | 22.7k | count += (uint16_t)faad_getbits(ld, 8 |
1095 | 22.7k | DEBUGVAR(1,63,"data_stream_element(): extra count")); |
1096 | 22.7k | } |
1097 | 2.00M | if (byte_aligned) |
1098 | 1.43M | faad_byte_align(ld); |
1099 | | |
1100 | 56.0M | for (i = 0; i < count; i++) |
1101 | 54.0M | { |
1102 | 54.0M | faad_getbits(ld, LEN_BYTE |
1103 | 54.0M | DEBUGVAR(1,64,"data_stream_element(): data_stream_byte")); |
1104 | 54.0M | } |
1105 | | |
1106 | 2.00M | return count; |
1107 | 2.00M | } |
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 | 35.9k | { |
1116 | 35.9k | uint16_t count; |
1117 | 35.9k | #ifdef SBR_DEC |
1118 | 35.9k | uint8_t bs_extension_type; |
1119 | 35.9k | #endif |
1120 | | |
1121 | 35.9k | count = (uint16_t)faad_getbits(ld, 4 |
1122 | 35.9k | DEBUGVAR(1,65,"fill_element(): count")); |
1123 | 35.9k | if (count == 15) |
1124 | 3.41k | { |
1125 | 3.41k | count += (uint16_t)faad_getbits(ld, 8 |
1126 | 3.41k | DEBUGVAR(1,66,"fill_element(): extra count")) - 1; |
1127 | 3.41k | } |
1128 | | |
1129 | 35.9k | if (count > 0) |
1130 | 33.8k | { |
1131 | 33.8k | #ifdef SBR_DEC |
1132 | 33.8k | bs_extension_type = (uint8_t)faad_showbits(ld, 4); |
1133 | | |
1134 | 33.8k | if ((bs_extension_type == EXT_SBR_DATA) || |
1135 | 33.8k | (bs_extension_type == EXT_SBR_DATA_CRC)) |
1136 | 33.6k | { |
1137 | 33.6k | if (sbr_ele == INVALID_SBR_ELEMENT) |
1138 | 40 | return 24; |
1139 | | |
1140 | 33.6k | if (!hDecoder->sbr[sbr_ele]) |
1141 | 28.9k | { |
1142 | 28.9k | hDecoder->sbr[sbr_ele] = sbrDecodeInit(hDecoder->frameLength, |
1143 | 28.9k | hDecoder->element_id[sbr_ele], 2*get_sample_rate(hDecoder->sf_index), |
1144 | 28.9k | hDecoder->downSampledSBR |
1145 | 28.9k | #ifdef DRM |
1146 | 28.9k | , 0 |
1147 | 28.9k | #endif |
1148 | 28.9k | ); |
1149 | 28.9k | } |
1150 | 33.6k | if (!hDecoder->sbr[sbr_ele]) |
1151 | 0 | return 19; |
1152 | | |
1153 | 33.6k | hDecoder->sbr_present_flag = 1; |
1154 | | |
1155 | | /* parse the SBR data */ |
1156 | 33.6k | hDecoder->sbr[sbr_ele]->ret = sbr_extension_data(ld, hDecoder->sbr[sbr_ele], count, |
1157 | 33.6k | 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 | 33.6k | #if (defined(PS_DEC) || defined(DRM_PS)) |
1167 | 33.6k | if (hDecoder->sbr[sbr_ele]->ps_used) |
1168 | 5.79k | { |
1169 | 5.79k | hDecoder->ps_used[sbr_ele] = 1; |
1170 | | |
1171 | | /* set element independent flag to 1 as well */ |
1172 | 5.79k | hDecoder->ps_used_global = 1; |
1173 | 5.79k | } |
1174 | 33.6k | #endif |
1175 | 33.6k | } else { |
1176 | 148 | #endif |
1177 | | #ifndef DRM |
1178 | | while (count > 0) |
1179 | | { |
1180 | | uint16_t payload_bytes = extension_payload(ld, drc, count); |
1181 | | if (payload_bytes <= count) { |
1182 | | count -= payload_bytes; |
1183 | | } else { |
1184 | | count = 0; |
1185 | | } |
1186 | | } |
1187 | | #else |
1188 | 148 | (void)drc; |
1189 | 148 | return 30; |
1190 | 148 | #endif |
1191 | 148 | #ifdef SBR_DEC |
1192 | 148 | } |
1193 | 33.8k | #endif |
1194 | 33.8k | } |
1195 | | |
1196 | 35.7k | return 0; |
1197 | 35.9k | } |
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 | 989 | { |
1300 | 989 | uint8_t channels = hDecoder->fr_channels = 0; |
1301 | 989 | uint8_t this_layer_stereo = (hDecoder->channelConfiguration > 1) ? 1 : 0; |
1302 | 989 | element cpe = {0}; |
1303 | 989 | ic_stream *ics1 = &(cpe.ics1); |
1304 | 989 | ic_stream *ics2 = &(cpe.ics2); |
1305 | 989 | ALIGN int16_t spec_data1[1024] = {0}; |
1306 | 989 | ALIGN int16_t spec_data2[1024] = {0}; |
1307 | | |
1308 | 989 | (void)drc; /* TODO: remove unused parameter? */ |
1309 | 989 | (void)pce; /* TODO: remove unused parameter? */ |
1310 | | |
1311 | 989 | hDecoder->fr_ch_ele = 0; |
1312 | | |
1313 | 989 | hInfo->error = DRM_aac_scalable_main_header(hDecoder, ics1, ics2, ld, this_layer_stereo); |
1314 | 989 | if (hInfo->error > 0) |
1315 | 23 | return; |
1316 | | |
1317 | 966 | cpe.common_window = 1; |
1318 | 966 | if (this_layer_stereo) |
1319 | 279 | { |
1320 | 279 | hDecoder->element_id[0] = ID_CPE; |
1321 | 279 | if (hDecoder->element_output_channels[hDecoder->fr_ch_ele] == 0) |
1322 | 198 | hDecoder->element_output_channels[hDecoder->fr_ch_ele] = 2; |
1323 | 687 | } else { |
1324 | 687 | hDecoder->element_id[0] = ID_SCE; |
1325 | 687 | } |
1326 | | |
1327 | 966 | if (this_layer_stereo) |
1328 | 279 | { |
1329 | 279 | cpe.channel = 0; |
1330 | 279 | cpe.paired_channel = 1; |
1331 | 279 | } |
1332 | | |
1333 | | |
1334 | | /* Stereo2 / Mono1 */ |
1335 | 966 | 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 | 966 | if(faad_get1bit(ld)) { |
1341 | 12 | hInfo->error = 26; |
1342 | 12 | return; |
1343 | 12 | } |
1344 | | #else |
1345 | | faad_get1bit(ld); |
1346 | | #endif |
1347 | | |
1348 | 954 | hInfo->error = side_info(hDecoder, &cpe, ld, ics1, 1); |
1349 | 954 | if (hInfo->error > 0) |
1350 | 89 | return; |
1351 | 865 | if (this_layer_stereo) |
1352 | 230 | { |
1353 | | /* Stereo3 */ |
1354 | 230 | ics2->tns_data_present = faad_get1bit(ld); |
1355 | | #ifdef LTP_DEC |
1356 | | ics1->ltp.data_present = |
1357 | | #endif |
1358 | 230 | faad_get1bit(ld); |
1359 | 230 | hInfo->error = side_info(hDecoder, &cpe, ld, ics2, 1); |
1360 | 230 | if (hInfo->error > 0) |
1361 | 33 | return; |
1362 | 230 | } |
1363 | | /* Stereo4 / Mono2 */ |
1364 | 832 | if (ics1->tns_data_present) |
1365 | 141 | tns_data(ics1, &(ics1->tns), ld); |
1366 | 832 | if (this_layer_stereo) |
1367 | 197 | { |
1368 | | /* Stereo5 */ |
1369 | 197 | if (ics2->tns_data_present) |
1370 | 72 | tns_data(ics2, &(ics2->tns), ld); |
1371 | 197 | } |
1372 | | |
1373 | 832 | #ifdef DRM |
1374 | | /* CRC check */ |
1375 | 832 | if (hDecoder->object_type == DRM_ER_LC) |
1376 | 832 | { |
1377 | 832 | if ((hInfo->error = (uint8_t)faad_check_CRC(ld, (uint16_t)faad_get_processed_bits(ld) - 8)) > 0) |
1378 | 203 | return; |
1379 | 832 | } |
1380 | 629 | #endif |
1381 | | |
1382 | | /* Stereo6 / Mono3 */ |
1383 | | /* error resilient spectral data decoding */ |
1384 | 629 | if ((hInfo->error = reordered_spectral_data(hDecoder, ics1, ld, spec_data1)) > 0) |
1385 | 24 | { |
1386 | 24 | return; |
1387 | 24 | } |
1388 | 605 | if (this_layer_stereo) |
1389 | 63 | { |
1390 | | /* Stereo7 */ |
1391 | | /* error resilient spectral data decoding */ |
1392 | 63 | if ((hInfo->error = reordered_spectral_data(hDecoder, ics2, ld, spec_data2)) > 0) |
1393 | 3 | { |
1394 | 3 | return; |
1395 | 3 | } |
1396 | 63 | } |
1397 | | |
1398 | | |
1399 | 602 | #ifdef DRM |
1400 | 602 | #ifdef SBR_DEC |
1401 | | /* In case of DRM we need to read the SBR info before channel reconstruction */ |
1402 | 602 | if ((hDecoder->sbr_present_flag == 1) && (hDecoder->object_type == DRM_ER_LC)) |
1403 | 558 | { |
1404 | 558 | bitfile ld_sbr = {0}; |
1405 | 558 | uint32_t i; |
1406 | 558 | uint16_t count = 0; |
1407 | 558 | uint8_t *revbuffer; |
1408 | 558 | uint8_t *prevbufstart; |
1409 | 558 | uint8_t *pbufend; |
1410 | | |
1411 | | /* all forward bitreading should be finished at this point */ |
1412 | 558 | uint32_t bitsconsumed = faad_get_processed_bits(ld); |
1413 | 558 | uint32_t buffer_size = faad_origbitbuffer_size(ld); |
1414 | 558 | uint8_t *buffer = (uint8_t*)faad_origbitbuffer(ld); |
1415 | | |
1416 | 558 | if (bitsconsumed + 8 > buffer_size*8) |
1417 | 88 | { |
1418 | 88 | hInfo->error = 14; |
1419 | 88 | return; |
1420 | 88 | } |
1421 | | |
1422 | 470 | if (!hDecoder->sbr[0]) |
1423 | 376 | { |
1424 | 376 | hDecoder->sbr[0] = sbrDecodeInit(hDecoder->frameLength, hDecoder->element_id[0], |
1425 | 376 | 2*get_sample_rate(hDecoder->sf_index), 0 /* ds SBR */, 1); |
1426 | 376 | } |
1427 | 470 | if (!hDecoder->sbr[0]) |
1428 | 0 | { |
1429 | 0 | hInfo->error = 19; |
1430 | 0 | return; |
1431 | 0 | } |
1432 | | |
1433 | | /* Reverse bit reading of SBR data in DRM audio frame */ |
1434 | 470 | revbuffer = (uint8_t*)faad_malloc(buffer_size*sizeof(uint8_t)); |
1435 | 470 | prevbufstart = revbuffer; |
1436 | 470 | pbufend = &buffer[buffer_size - 1]; |
1437 | 8.83M | for (i = 0; i < buffer_size; i++) |
1438 | 8.83M | *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 | 470 | count = (uint16_t)bit2byte(buffer_size*8 - bitsconsumed); |
1444 | 470 | faad_initbits(&ld_sbr, revbuffer, count); |
1445 | | |
1446 | 470 | hDecoder->sbr[0]->sample_rate = get_sample_rate(hDecoder->sf_index); |
1447 | 470 | hDecoder->sbr[0]->sample_rate *= 2; |
1448 | | |
1449 | 470 | faad_getbits(&ld_sbr, 8); /* Skip 8-bit CRC */ |
1450 | | |
1451 | 470 | hDecoder->sbr[0]->ret = sbr_extension_data(&ld_sbr, hDecoder->sbr[0], count, hDecoder->postSeekResetFlag); |
1452 | 470 | #if (defined(PS_DEC) || defined(DRM_PS)) |
1453 | 470 | if (hDecoder->sbr[0]->ps_used) |
1454 | 249 | { |
1455 | 249 | hDecoder->ps_used[0] = 1; |
1456 | 249 | hDecoder->ps_used_global = 1; |
1457 | 249 | } |
1458 | 470 | #endif |
1459 | | |
1460 | 470 | if (ld_sbr.error) |
1461 | 6 | { |
1462 | 6 | hDecoder->sbr[0]->ret = 1; |
1463 | 6 | } |
1464 | | |
1465 | | /* check CRC */ |
1466 | | /* no need to check it if there was already an error */ |
1467 | 470 | if (hDecoder->sbr[0]->ret == 0) |
1468 | 257 | 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 | 470 | if (hDecoder->sbr[0]->ret != 0) |
1472 | 266 | { |
1473 | 266 | hDecoder->sbr[0]->header_count = 0; |
1474 | 266 | } |
1475 | | |
1476 | 470 | faad_endbits(&ld_sbr); |
1477 | | |
1478 | 470 | if (revbuffer) |
1479 | 470 | faad_free(revbuffer); |
1480 | 470 | } |
1481 | 514 | #endif |
1482 | 514 | #endif |
1483 | | |
1484 | 514 | if (this_layer_stereo) |
1485 | 57 | { |
1486 | 57 | hInfo->error = reconstruct_channel_pair(hDecoder, ics1, ics2, &cpe, spec_data1, spec_data2); |
1487 | 57 | if (hInfo->error > 0) |
1488 | 9 | return; |
1489 | 457 | } else { |
1490 | 457 | hInfo->error = reconstruct_single_channel(hDecoder, ics1, &cpe, spec_data1); |
1491 | 457 | if (hInfo->error > 0) |
1492 | 3 | return; |
1493 | 457 | } |
1494 | | |
1495 | | /* map output channels position to internal data channels */ |
1496 | 502 | if (hDecoder->element_output_channels[hDecoder->fr_ch_ele] == 2) |
1497 | 502 | { |
1498 | | /* this might be faulty when pce_set is true */ |
1499 | 502 | hDecoder->internal_channel[channels] = channels; |
1500 | 502 | hDecoder->internal_channel[channels+1] = channels+1; |
1501 | 502 | } else { |
1502 | 0 | hDecoder->internal_channel[channels] = channels; |
1503 | 0 | } |
1504 | | |
1505 | 502 | hDecoder->fr_channels += hDecoder->element_output_channels[hDecoder->fr_ch_ele]; |
1506 | 502 | hDecoder->fr_ch_ele++; |
1507 | | |
1508 | 502 | return; |
1509 | 514 | } |
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 | 989 | { |
1515 | 989 | uint8_t retval = 0; |
1516 | 989 | uint8_t ics_reserved_bit; |
1517 | | |
1518 | 989 | ics_reserved_bit = faad_get1bit(ld |
1519 | 989 | DEBUGVAR(1,300,"aac_scalable_main_header(): ics_reserved_bits")); |
1520 | 989 | if (ics_reserved_bit != 0) |
1521 | 12 | return 32; |
1522 | 977 | ics1->window_sequence = (uint8_t)faad_getbits(ld, 2 |
1523 | 977 | DEBUGVAR(1,301,"aac_scalable_main_header(): window_sequence")); |
1524 | 977 | ics1->window_shape = faad_get1bit(ld |
1525 | 977 | DEBUGVAR(1,302,"aac_scalable_main_header(): window_shape")); |
1526 | | |
1527 | 977 | if (ics1->window_sequence == EIGHT_SHORT_SEQUENCE) |
1528 | 246 | { |
1529 | 246 | ics1->max_sfb = (uint8_t)faad_getbits(ld, 4 |
1530 | 246 | DEBUGVAR(1,303,"aac_scalable_main_header(): max_sfb (short)")); |
1531 | 246 | ics1->scale_factor_grouping = (uint8_t)faad_getbits(ld, 7 |
1532 | 246 | DEBUGVAR(1,304,"aac_scalable_main_header(): scale_factor_grouping")); |
1533 | 731 | } else { |
1534 | 731 | ics1->max_sfb = (uint8_t)faad_getbits(ld, 6 |
1535 | 731 | DEBUGVAR(1,305,"aac_scalable_main_header(): max_sfb (long)")); |
1536 | 731 | } |
1537 | | |
1538 | | /* get the grouping information */ |
1539 | 977 | if ((retval = window_grouping_info(hDecoder, ics1)) > 0) |
1540 | 7 | return retval; |
1541 | | |
1542 | | /* should be an error */ |
1543 | | /* check the range of max_sfb */ |
1544 | 970 | if (ics1->max_sfb > ics1->num_swb) |
1545 | 0 | return 16; |
1546 | | |
1547 | 970 | if (this_layer_stereo) |
1548 | 283 | { |
1549 | 283 | ics1->ms_mask_present = (uint8_t)faad_getbits(ld, 2 |
1550 | 283 | DEBUGVAR(1,306,"aac_scalable_main_header(): ms_mask_present")); |
1551 | 283 | if (ics1->ms_mask_present == 3) |
1552 | 4 | { |
1553 | | /* bitstream error */ |
1554 | 4 | return 32; |
1555 | 4 | } |
1556 | 279 | if (ics1->ms_mask_present == 1) |
1557 | 79 | { |
1558 | 79 | uint8_t g, sfb; |
1559 | 301 | for (g = 0; g < ics1->num_window_groups; g++) |
1560 | 222 | { |
1561 | 1.85k | for (sfb = 0; sfb < ics1->max_sfb; sfb++) |
1562 | 1.63k | { |
1563 | 1.63k | ics1->ms_used[g][sfb] = faad_get1bit(ld |
1564 | 1.63k | DEBUGVAR(1,307,"aac_scalable_main_header(): faad_get1bit")); |
1565 | 1.63k | } |
1566 | 222 | } |
1567 | 79 | } |
1568 | | |
1569 | 279 | memcpy(ics2, ics1, sizeof(ic_stream)); |
1570 | 687 | } else { |
1571 | 687 | ics1->ms_mask_present = 0; |
1572 | 687 | } |
1573 | | |
1574 | 966 | return 0; |
1575 | 970 | } |
1576 | | #endif |
1577 | | |
1578 | | static uint8_t side_info(NeAACDecStruct *hDecoder, element *ele, |
1579 | | bitfile *ld, ic_stream *ics, uint8_t scal_flag) |
1580 | 631k | { |
1581 | 631k | uint8_t result; |
1582 | | |
1583 | 631k | ics->global_gain = (uint8_t)faad_getbits(ld, 8 |
1584 | 631k | DEBUGVAR(1,67,"individual_channel_stream(): global_gain")); |
1585 | | |
1586 | 631k | if (!ele->common_window && !scal_flag) |
1587 | 565k | { |
1588 | 565k | if ((result = ics_info(hDecoder, ics, ld, ele->common_window)) > 0) |
1589 | 1.19k | return result; |
1590 | 565k | } |
1591 | | |
1592 | 630k | if ((result = section_data(hDecoder, ics, ld)) > 0) |
1593 | 2.25k | return result; |
1594 | | |
1595 | 628k | if ((result = scale_factor_data(hDecoder, ics, ld)) > 0) |
1596 | 43 | return result; |
1597 | | |
1598 | 628k | if (!scal_flag) |
1599 | 627k | { |
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 | 627k | if ((ics->pulse_data_present = faad_get1bit(ld |
1607 | 627k | DEBUGVAR(1,68,"individual_channel_stream(): pulse_data_present"))) & 1) |
1608 | 19.8k | { |
1609 | 19.8k | if ((result = pulse_data(ics, &(ics->pul), ld)) > 0) |
1610 | 163 | return result; |
1611 | 19.8k | } |
1612 | | |
1613 | | /* get tns data */ |
1614 | 626k | if ((ics->tns_data_present = faad_get1bit(ld |
1615 | 626k | DEBUGVAR(1,69,"individual_channel_stream(): tns_data_present"))) & 1) |
1616 | 36.7k | { |
1617 | 36.7k | #ifdef ERROR_RESILIENCE |
1618 | 36.7k | if (hDecoder->object_type < ER_OBJECT_START) |
1619 | 35.1k | #endif |
1620 | 35.1k | tns_data(ics, &(ics->tns), ld); |
1621 | 36.7k | } |
1622 | | |
1623 | | /* get gain control data */ |
1624 | 626k | if ((ics->gain_control_data_present = faad_get1bit(ld |
1625 | 626k | DEBUGVAR(1,70,"individual_channel_stream(): gain_control_data_present"))) & 1) |
1626 | 232 | { |
1627 | | #ifdef SSR_DEC |
1628 | | if (hDecoder->object_type != SSR) |
1629 | | return 1; |
1630 | | else |
1631 | | gain_control_data(ld, ics); |
1632 | | #else |
1633 | 232 | return 1; |
1634 | 232 | #endif |
1635 | 232 | } |
1636 | 626k | } |
1637 | | |
1638 | 627k | #ifdef ERROR_RESILIENCE |
1639 | 627k | if (hDecoder->aacSpectralDataResilienceFlag) |
1640 | 15.4k | { |
1641 | 15.4k | ics->length_of_reordered_spectral_data = (uint16_t)faad_getbits(ld, 14 |
1642 | 15.4k | DEBUGVAR(1,147,"individual_channel_stream(): length_of_reordered_spectral_data")); |
1643 | | |
1644 | 15.4k | if (hDecoder->channelConfiguration == 2) |
1645 | 3.20k | { |
1646 | 3.20k | if (ics->length_of_reordered_spectral_data > 6144) |
1647 | 979 | ics->length_of_reordered_spectral_data = 6144; |
1648 | 12.2k | } else { |
1649 | 12.2k | if (ics->length_of_reordered_spectral_data > 12288) |
1650 | 227 | ics->length_of_reordered_spectral_data = 12288; |
1651 | 12.2k | } |
1652 | | |
1653 | 15.4k | ics->length_of_longest_codeword = (uint8_t)faad_getbits(ld, 6 |
1654 | 15.4k | DEBUGVAR(1,148,"individual_channel_stream(): length_of_longest_codeword")); |
1655 | 15.4k | if (ics->length_of_longest_codeword >= 49) |
1656 | 650 | ics->length_of_longest_codeword = 49; |
1657 | 15.4k | } |
1658 | | |
1659 | | /* RVLC spectral data is put here */ |
1660 | 627k | if (hDecoder->aacScalefactorDataResilienceFlag) |
1661 | 24.3k | { |
1662 | 24.3k | if ((result = rvlc_decode_scale_factors(ics, ld)) > 0) |
1663 | 74 | return result; |
1664 | 24.3k | } |
1665 | 627k | #endif |
1666 | | |
1667 | 627k | return 0; |
1668 | 627k | } |
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 | 630k | { |
1675 | 630k | uint8_t result; |
1676 | | |
1677 | 630k | result = side_info(hDecoder, ele, ld, ics, scal_flag); |
1678 | 630k | if (result > 0) |
1679 | 3.83k | return result; |
1680 | | |
1681 | 626k | if (hDecoder->object_type >= ER_OBJECT_START) |
1682 | 31.8k | { |
1683 | 31.8k | if (ics->tns_data_present) |
1684 | 1.59k | tns_data(ics, &(ics->tns), ld); |
1685 | 31.8k | } |
1686 | | |
1687 | | #ifdef DRM |
1688 | | /* CRC check */ |
1689 | 175k | if (hDecoder->object_type == DRM_ER_LC) |
1690 | 0 | { |
1691 | 0 | if ((result = (uint8_t)faad_check_CRC(ld, (uint16_t)faad_get_processed_bits(ld) - 8)) > 0) |
1692 | 0 | return result; |
1693 | 0 | } |
1694 | 175k | #endif |
1695 | | |
1696 | 175k | #ifdef ERROR_RESILIENCE |
1697 | 626k | if (hDecoder->aacSpectralDataResilienceFlag) |
1698 | 14.5k | { |
1699 | | /* error resilient spectral data decoding */ |
1700 | 14.5k | if ((result = reordered_spectral_data(hDecoder, ics, ld, spec_data)) > 0) |
1701 | 299 | { |
1702 | 299 | return result; |
1703 | 299 | } |
1704 | 612k | } else { |
1705 | 612k | #endif |
1706 | | /* decode the spectral data */ |
1707 | 612k | if ((result = spectral_data(hDecoder, ics, ld, spec_data)) > 0) |
1708 | 127 | { |
1709 | 127 | return result; |
1710 | 127 | } |
1711 | 612k | #ifdef ERROR_RESILIENCE |
1712 | 612k | } |
1713 | 626k | #endif |
1714 | | |
1715 | | /* pulse coding reconstruction */ |
1716 | 626k | if (ics->pulse_data_present) |
1717 | 19.6k | { |
1718 | 19.6k | if (ics->window_sequence != EIGHT_SHORT_SEQUENCE) |
1719 | 19.5k | { |
1720 | 19.5k | if ((result = pulse_decode(ics, spec_data, hDecoder->frameLength)) > 0) |
1721 | 35 | return result; |
1722 | 19.5k | } else { |
1723 | 58 | return 2; /* pulse coding not allowed for short blocks */ |
1724 | 58 | } |
1725 | 19.6k | } |
1726 | | |
1727 | 626k | return 0; |
1728 | 626k | } syntax.c:individual_channel_stream Line | Count | Source | 1674 | 176k | { | 1675 | 176k | uint8_t result; | 1676 | | | 1677 | 176k | result = side_info(hDecoder, ele, ld, ics, scal_flag); | 1678 | 176k | if (result > 0) | 1679 | 1.26k | return result; | 1680 | | | 1681 | 175k | if (hDecoder->object_type >= ER_OBJECT_START) | 1682 | 9.74k | { | 1683 | 9.74k | if (ics->tns_data_present) | 1684 | 417 | tns_data(ics, &(ics->tns), ld); | 1685 | 9.74k | } | 1686 | | | 1687 | 175k | #ifdef DRM | 1688 | | /* CRC check */ | 1689 | 175k | if (hDecoder->object_type == DRM_ER_LC) | 1690 | 0 | { | 1691 | 0 | if ((result = (uint8_t)faad_check_CRC(ld, (uint16_t)faad_get_processed_bits(ld) - 8)) > 0) | 1692 | 0 | return result; | 1693 | 0 | } | 1694 | 175k | #endif | 1695 | | | 1696 | 175k | #ifdef ERROR_RESILIENCE | 1697 | 175k | if (hDecoder->aacSpectralDataResilienceFlag) | 1698 | 4.05k | { | 1699 | | /* error resilient spectral data decoding */ | 1700 | 4.05k | if ((result = reordered_spectral_data(hDecoder, ics, ld, spec_data)) > 0) | 1701 | 84 | { | 1702 | 84 | return result; | 1703 | 84 | } | 1704 | 171k | } else { | 1705 | 171k | #endif | 1706 | | /* decode the spectral data */ | 1707 | 171k | if ((result = spectral_data(hDecoder, ics, ld, spec_data)) > 0) | 1708 | 44 | { | 1709 | 44 | return result; | 1710 | 44 | } | 1711 | 171k | #ifdef ERROR_RESILIENCE | 1712 | 171k | } | 1713 | 175k | #endif | 1714 | | | 1715 | | /* pulse coding reconstruction */ | 1716 | 175k | if (ics->pulse_data_present) | 1717 | 6.64k | { | 1718 | 6.64k | if (ics->window_sequence != EIGHT_SHORT_SEQUENCE) | 1719 | 6.61k | { | 1720 | 6.61k | if ((result = pulse_decode(ics, spec_data, hDecoder->frameLength)) > 0) | 1721 | 4 | return result; | 1722 | 6.61k | } else { | 1723 | 22 | return 2; /* pulse coding not allowed for short blocks */ | 1724 | 22 | } | 1725 | 6.64k | } | 1726 | | | 1727 | 175k | return 0; | 1728 | 175k | } |
syntax.c:individual_channel_stream Line | Count | Source | 1674 | 454k | { | 1675 | 454k | uint8_t result; | 1676 | | | 1677 | 454k | result = side_info(hDecoder, ele, ld, ics, scal_flag); | 1678 | 454k | if (result > 0) | 1679 | 2.57k | return result; | 1680 | | | 1681 | 451k | if (hDecoder->object_type >= ER_OBJECT_START) | 1682 | 22.1k | { | 1683 | 22.1k | if (ics->tns_data_present) | 1684 | 1.17k | tns_data(ics, &(ics->tns), ld); | 1685 | 22.1k | } | 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 | 451k | #ifdef ERROR_RESILIENCE | 1697 | 451k | if (hDecoder->aacSpectralDataResilienceFlag) | 1698 | 10.5k | { | 1699 | | /* error resilient spectral data decoding */ | 1700 | 10.5k | if ((result = reordered_spectral_data(hDecoder, ics, ld, spec_data)) > 0) | 1701 | 215 | { | 1702 | 215 | return result; | 1703 | 215 | } | 1704 | 440k | } else { | 1705 | 440k | #endif | 1706 | | /* decode the spectral data */ | 1707 | 440k | if ((result = spectral_data(hDecoder, ics, ld, spec_data)) > 0) | 1708 | 83 | { | 1709 | 83 | return result; | 1710 | 83 | } | 1711 | 440k | #ifdef ERROR_RESILIENCE | 1712 | 440k | } | 1713 | 451k | #endif | 1714 | | | 1715 | | /* pulse coding reconstruction */ | 1716 | 451k | if (ics->pulse_data_present) | 1717 | 12.9k | { | 1718 | 12.9k | if (ics->window_sequence != EIGHT_SHORT_SEQUENCE) | 1719 | 12.9k | { | 1720 | 12.9k | if ((result = pulse_decode(ics, spec_data, hDecoder->frameLength)) > 0) | 1721 | 31 | return result; | 1722 | 12.9k | } else { | 1723 | 36 | return 2; /* pulse coding not allowed for short blocks */ | 1724 | 36 | } | 1725 | 12.9k | } | 1726 | | | 1727 | 451k | return 0; | 1728 | 451k | } |
|
1729 | | |
1730 | | /* Table 4.4.25 */ |
1731 | | static uint8_t section_data(NeAACDecStruct *hDecoder, ic_stream *ics, bitfile *ld) |
1732 | 177k | { |
1733 | 177k | uint8_t g; |
1734 | 177k | uint8_t sect_esc_val, sect_bits; |
1735 | 177k | uint8_t sect_lim; /* 51 or 120, anyways less than 127. */ |
1736 | | |
1737 | 177k | if (ics->window_sequence == EIGHT_SHORT_SEQUENCE) { |
1738 | 25.3k | sect_bits = 3; |
1739 | 25.3k | sect_lim = 8 * 15; |
1740 | 151k | } else { |
1741 | 151k | sect_bits = 5; |
1742 | 151k | sect_lim = MAX_SFB; |
1743 | 151k | } |
1744 | 177k | 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 | 496k | for (g = 0; g < ics->num_window_groups; g++) |
1752 | 319k | { |
1753 | 319k | uint8_t k = 0; |
1754 | 319k | uint8_t i = 0; |
1755 | | |
1756 | 408k | while (k < ics->max_sfb) |
1757 | 89.1k | { |
1758 | 89.1k | #ifdef ERROR_RESILIENCE |
1759 | 89.1k | uint8_t vcb11 = 0; |
1760 | 89.1k | #endif |
1761 | 89.1k | uint8_t sfb; |
1762 | 89.1k | uint8_t sect_len_incr; |
1763 | 89.1k | uint8_t sect_len = 0; |
1764 | 89.1k | 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 | 89.1k | if (ld->error != 0) |
1769 | 0 | return 14; |
1770 | 89.1k | if (i >= sect_lim) |
1771 | 442 | return 15; |
1772 | | |
1773 | 88.7k | #ifdef ERROR_RESILIENCE |
1774 | 88.7k | if (hDecoder->aacSectionDataResilienceFlag) |
1775 | 28.5k | sect_cb_bits = 5; |
1776 | 88.7k | #endif |
1777 | | |
1778 | 88.7k | ics->sect_cb[g][i] = (uint8_t)faad_getbits(ld, sect_cb_bits |
1779 | 88.7k | DEBUGVAR(1,71,"section_data(): sect_cb")); |
1780 | | |
1781 | 88.7k | if (ics->sect_cb[g][i] == 12) |
1782 | 80 | return 32; |
1783 | | |
1784 | | #if 0 |
1785 | | printf("%d\n", ics->sect_cb[g][i]); |
1786 | | #endif |
1787 | | |
1788 | | #ifndef DRM |
1789 | | if (ics->sect_cb[g][i] == NOISE_HCB) |
1790 | | ics->noise_used = 1; |
1791 | | #else |
1792 | | /* PNS not allowed in DRM */ |
1793 | 88.6k | if (ics->sect_cb[g][i] == NOISE_HCB) |
1794 | 27 | return 29; |
1795 | 88.5k | #endif |
1796 | 88.5k | if (ics->sect_cb[g][i] == INTENSITY_HCB2 || ics->sect_cb[g][i] == INTENSITY_HCB) |
1797 | 3.33k | ics->is_used = 1; |
1798 | | |
1799 | 88.5k | #ifdef ERROR_RESILIENCE |
1800 | 88.5k | if (hDecoder->aacSectionDataResilienceFlag) |
1801 | 28.5k | { |
1802 | 28.5k | if ((ics->sect_cb[g][i] == 11) || |
1803 | 28.5k | ((ics->sect_cb[g][i] >= 16) && (ics->sect_cb[g][i] <= 32))) |
1804 | 7.49k | { |
1805 | 7.49k | vcb11 = 1; |
1806 | 7.49k | } |
1807 | 28.5k | } |
1808 | 88.5k | if (vcb11) |
1809 | 7.49k | { |
1810 | 7.49k | sect_len_incr = 1; |
1811 | 81.0k | } else { |
1812 | 81.0k | #endif |
1813 | 81.0k | sect_len_incr = (uint8_t)faad_getbits(ld, sect_bits |
1814 | 81.0k | DEBUGVAR(1,72,"section_data(): sect_len_incr")); |
1815 | 81.0k | #ifdef ERROR_RESILIENCE |
1816 | 81.0k | } |
1817 | 88.5k | #endif |
1818 | 89.3k | while (sect_len_incr == sect_esc_val /* && |
1819 | 88.5k | (k+sect_len < ics->max_sfb)*/) |
1820 | 781 | { |
1821 | 781 | sect_len += sect_len_incr; |
1822 | 781 | if (sect_len > sect_lim) |
1823 | 22 | return 15; |
1824 | 759 | sect_len_incr = (uint8_t)faad_getbits(ld, sect_bits |
1825 | 759 | DEBUGVAR(1,72,"section_data(): sect_len_incr")); |
1826 | 759 | } |
1827 | | |
1828 | 88.5k | sect_len += sect_len_incr; |
1829 | | |
1830 | 88.5k | ics->sect_start[g][i] = k; |
1831 | 88.5k | 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 | 88.5k | if (sect_len > sect_lim) |
1841 | 10 | return 15; |
1842 | 88.5k | if (k + sect_len > sect_lim) |
1843 | 12 | return 15; |
1844 | | |
1845 | 278k | for (sfb = k; sfb < k + sect_len; sfb++) |
1846 | 190k | { |
1847 | 190k | 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 | 190k | } |
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 | 88.5k | k += sect_len; /* k <= sect_lim */ |
1861 | 88.5k | i++; |
1862 | 88.5k | } |
1863 | 319k | 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 | 319k | if (k != ics->max_sfb) |
1868 | 228 | { |
1869 | 228 | return 32; |
1870 | 228 | } |
1871 | | #if 0 |
1872 | | printf("%d\n", ics->num_sec[g]); |
1873 | | #endif |
1874 | 319k | } |
1875 | | |
1876 | | #if 0 |
1877 | | printf("\n"); |
1878 | | #endif |
1879 | | |
1880 | 176k | return 0; |
1881 | 177k | } |
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 | 168k | { |
1896 | 168k | uint8_t g, sfb; |
1897 | 168k | int16_t t; |
1898 | | |
1899 | 168k | int16_t scale_factor = ics->global_gain; |
1900 | 168k | int16_t is_position = 0; |
1901 | 168k | int16_t scale_factor_max = 255; |
1902 | 168k | #ifdef FIXED_POINT |
1903 | | /* TODO: consider rolling out to regular build. */ |
1904 | 168k | #ifdef FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION |
1905 | | /* The value is inexact, adjusted to current fuzzer findings. */ |
1906 | 168k | scale_factor_max = 165; |
1907 | 168k | #endif // FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION |
1908 | 168k | #endif // FIXED_POINT |
1909 | | #ifndef DRM |
1910 | | int8_t noise_pcm_flag = 1; |
1911 | | int16_t noise_energy = ics->global_gain - 90; |
1912 | | #endif |
1913 | | |
1914 | 476k | for (g = 0; g < ics->num_window_groups; g++) |
1915 | 308k | { |
1916 | 466k | for (sfb = 0; sfb < ics->max_sfb; sfb++) |
1917 | 158k | { |
1918 | 158k | switch (ics->sfb_cb[g][sfb]) |
1919 | 158k | { |
1920 | 101k | case ZERO_HCB: /* zero book */ |
1921 | 101k | 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 | 101k | break; |
1927 | 5.44k | case INTENSITY_HCB: /* intensity books */ |
1928 | 8.41k | case INTENSITY_HCB2: |
1929 | | |
1930 | | /* decode intensity position */ |
1931 | 8.41k | t = huffman_scale_factor(ld); |
1932 | 8.41k | is_position += (t - 60); |
1933 | 8.41k | ics->scale_factors[g][sfb] = is_position; |
1934 | | #ifdef SF_PRINT |
1935 | | printf("%d\n", ics->scale_factors[g][sfb]); |
1936 | | #endif |
1937 | | |
1938 | 8.41k | break; |
1939 | 0 | case NOISE_HCB: /* noise books */ |
1940 | |
|
1941 | | #ifndef DRM |
1942 | | /* decode noise energy */ |
1943 | | if (noise_pcm_flag) |
1944 | | { |
1945 | | noise_pcm_flag = 0; |
1946 | | t = (int16_t)faad_getbits(ld, 9 |
1947 | | DEBUGVAR(1,73,"scale_factor_data(): first noise")) - 256; |
1948 | | } else { |
1949 | | t = huffman_scale_factor(ld); |
1950 | | t -= 60; |
1951 | | } |
1952 | | noise_energy += t; |
1953 | | 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 | 0 | return 29; |
1960 | 0 | #endif |
1961 | | |
1962 | 0 | break; |
1963 | 48.7k | default: /* spectral books */ |
1964 | | |
1965 | | /* ics->scale_factors[g][sfb] must be between 0 and 255 */ |
1966 | | |
1967 | 48.7k | ics->scale_factors[g][sfb] = 0; |
1968 | | |
1969 | | /* decode scale factor */ |
1970 | 48.7k | t = huffman_scale_factor(ld); |
1971 | 48.7k | scale_factor += (t - 60); |
1972 | 48.7k | if (scale_factor < 0 || scale_factor > 255) |
1973 | 16 | return 4; |
1974 | 48.6k | 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 | 48.6k | break; |
1980 | 158k | } |
1981 | 158k | } |
1982 | 308k | } |
1983 | | |
1984 | 168k | return 0; |
1985 | 168k | } |
1986 | | |
1987 | | /* Table 4.4.26 */ |
1988 | | static uint8_t scale_factor_data(NeAACDecStruct *hDecoder, ic_stream *ics, bitfile *ld) |
1989 | 628k | { |
1990 | 628k | uint8_t ret = 0; |
1991 | | #ifdef PROFILE |
1992 | | int64_t count = faad_get_ts(); |
1993 | | #endif |
1994 | | |
1995 | 628k | #ifdef ERROR_RESILIENCE |
1996 | 628k | if (!hDecoder->aacScalefactorDataResilienceFlag) |
1997 | 603k | { |
1998 | 603k | #endif |
1999 | 603k | ret = decode_scale_factors(ics, ld); |
2000 | 603k | #ifdef ERROR_RESILIENCE |
2001 | 603k | } 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 | 24.3k | ret = rvlc_scale_factor_data(ics, ld); |
2007 | 24.3k | } |
2008 | 628k | #endif |
2009 | | |
2010 | | #ifdef PROFILE |
2011 | | count = faad_get_ts() - count; |
2012 | | hDecoder->scalefac_cycles += count; |
2013 | | #endif |
2014 | | |
2015 | 628k | return ret; |
2016 | 628k | } |
2017 | | |
2018 | | /* Table 4.4.27 */ |
2019 | | static void tns_data(ic_stream *ics, tns_info *tns, bitfile *ld) |
2020 | 36.9k | { |
2021 | 36.9k | uint8_t w, filt, i, coef_bits; |
2022 | 36.9k | uint8_t n_filt_bits = 2; |
2023 | 36.9k | uint8_t length_bits = 6; |
2024 | 36.9k | uint8_t order_bits = 5; |
2025 | | |
2026 | 36.9k | if (ics->window_sequence == EIGHT_SHORT_SEQUENCE) |
2027 | 5.43k | { |
2028 | 5.43k | n_filt_bits = 1; |
2029 | 5.43k | length_bits = 4; |
2030 | 5.43k | order_bits = 3; |
2031 | 5.43k | } |
2032 | | |
2033 | 111k | for (w = 0; w < ics->num_windows; w++) |
2034 | 74.9k | { |
2035 | 74.9k | uint8_t start_coef_bits = 3; |
2036 | 74.9k | tns->n_filt[w] = (uint8_t)faad_getbits(ld, n_filt_bits |
2037 | 74.9k | DEBUGVAR(1,74,"tns_data(): n_filt")); |
2038 | | #if 0 |
2039 | | printf("%d\n", tns->n_filt[w]); |
2040 | | #endif |
2041 | | |
2042 | 74.9k | if (tns->n_filt[w]) |
2043 | 21.7k | { |
2044 | 21.7k | if ((tns->coef_res[w] = faad_get1bit(ld |
2045 | 21.7k | DEBUGVAR(1,75,"tns_data(): coef_res"))) & 1) |
2046 | 5.93k | start_coef_bits = 4; |
2047 | | #if 0 |
2048 | | printf("%d\n", tns->coef_res[w]); |
2049 | | #endif |
2050 | 21.7k | } |
2051 | | |
2052 | 109k | for (filt = 0; filt < tns->n_filt[w]; filt++) |
2053 | 35.0k | { |
2054 | 35.0k | tns->length[w][filt] = (uint8_t)faad_getbits(ld, length_bits |
2055 | 35.0k | DEBUGVAR(1,76,"tns_data(): length")); |
2056 | | #if 0 |
2057 | | printf("%d\n", tns->length[w][filt]); |
2058 | | #endif |
2059 | 35.0k | tns->order[w][filt] = (uint8_t)faad_getbits(ld, order_bits |
2060 | 35.0k | DEBUGVAR(1,77,"tns_data(): order")); |
2061 | | #if 0 |
2062 | | printf("%d\n", tns->order[w][filt]); |
2063 | | #endif |
2064 | 35.0k | if (tns->order[w][filt]) |
2065 | 21.3k | { |
2066 | 21.3k | tns->direction[w][filt] = faad_get1bit(ld |
2067 | 21.3k | DEBUGVAR(1,78,"tns_data(): direction")); |
2068 | | #if 0 |
2069 | | printf("%d\n", tns->direction[w][filt]); |
2070 | | #endif |
2071 | 21.3k | tns->coef_compress[w][filt] = faad_get1bit(ld |
2072 | 21.3k | DEBUGVAR(1,79,"tns_data(): coef_compress")); |
2073 | | #if 0 |
2074 | | printf("%d\n", tns->coef_compress[w][filt]); |
2075 | | #endif |
2076 | | |
2077 | 21.3k | coef_bits = start_coef_bits - tns->coef_compress[w][filt]; |
2078 | 141k | for (i = 0; i < tns->order[w][filt]; i++) |
2079 | 120k | { |
2080 | 120k | tns->coef[w][filt][i] = (uint8_t)faad_getbits(ld, coef_bits |
2081 | 120k | DEBUGVAR(1,80,"tns_data(): coef")); |
2082 | | #if 0 |
2083 | | printf("%d\n", tns->coef[w][filt][i]); |
2084 | | #endif |
2085 | 120k | } |
2086 | 21.3k | } |
2087 | 35.0k | } |
2088 | 74.9k | } |
2089 | 36.9k | } |
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 | 13.9k | { |
2095 | 13.9k | uint8_t sfb, w; |
2096 | | |
2097 | 13.9k | ltp->lag = 0; |
2098 | | |
2099 | 13.9k | #ifdef LD_DEC |
2100 | 13.9k | if (hDecoder->object_type == LD) |
2101 | 520 | { |
2102 | 520 | ltp->lag_update = (uint8_t)faad_getbits(ld, 1 |
2103 | 520 | DEBUGVAR(1,142,"ltp_data(): lag_update")); |
2104 | | |
2105 | 520 | if (ltp->lag_update) |
2106 | 254 | { |
2107 | 254 | ltp->lag = (uint16_t)faad_getbits(ld, 10 |
2108 | 254 | DEBUGVAR(1,81,"ltp_data(): lag")); |
2109 | 254 | } |
2110 | 13.3k | } else { |
2111 | 13.3k | #endif |
2112 | 13.3k | ltp->lag = (uint16_t)faad_getbits(ld, 11 |
2113 | 13.3k | DEBUGVAR(1,81,"ltp_data(): lag")); |
2114 | 13.3k | #ifdef LD_DEC |
2115 | 13.3k | } |
2116 | 13.9k | #endif |
2117 | | |
2118 | | /* Check length of lag */ |
2119 | 13.9k | if (ltp->lag > (hDecoder->frameLength << 1)) |
2120 | 34 | return 18; |
2121 | | |
2122 | 13.8k | ltp->coef = (uint8_t)faad_getbits(ld, 3 |
2123 | 13.8k | DEBUGVAR(1,82,"ltp_data(): coef")); |
2124 | | |
2125 | 13.8k | 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 | 13.8k | } else { |
2142 | 13.8k | ltp->last_band = (ics->max_sfb < MAX_LTP_SFB ? ics->max_sfb : MAX_LTP_SFB); |
2143 | | |
2144 | 37.3k | for (sfb = 0; sfb < ltp->last_band; sfb++) |
2145 | 23.5k | { |
2146 | 23.5k | ltp->long_used[sfb] = faad_get1bit(ld |
2147 | 23.5k | DEBUGVAR(1,86,"ltp_data(): long_used")); |
2148 | 23.5k | } |
2149 | 13.8k | } |
2150 | | |
2151 | 13.8k | return 0; |
2152 | 13.9k | } |
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 | 612k | { |
2159 | 612k | int8_t i; |
2160 | 612k | uint8_t g; |
2161 | 612k | uint16_t inc, k, p = 0; |
2162 | 612k | uint8_t groups = 0; |
2163 | 612k | uint8_t sect_cb; |
2164 | 612k | uint8_t result; |
2165 | 612k | uint16_t nshort = hDecoder->frameLength/8; |
2166 | | |
2167 | | #ifdef PROFILE |
2168 | | int64_t count = faad_get_ts(); |
2169 | | #endif |
2170 | | |
2171 | 1.57M | for(g = 0; g < ics->num_window_groups; g++) |
2172 | 964k | { |
2173 | 964k | p = groups*nshort; |
2174 | | |
2175 | 1.05M | for (i = 0; i < ics->num_sec[g]; i++) |
2176 | 90.0k | { |
2177 | 90.0k | sect_cb = ics->sect_cb[g][i]; |
2178 | | |
2179 | 90.0k | inc = (sect_cb >= FIRST_PAIR_HCB) ? 2 : 4; |
2180 | | |
2181 | 90.0k | switch (sect_cb) |
2182 | 90.0k | { |
2183 | 33.2k | case ZERO_HCB: |
2184 | 36.6k | case NOISE_HCB: |
2185 | 38.7k | case INTENSITY_HCB: |
2186 | 40.3k | 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 | 40.3k | p += (ics->sect_sfb_offset[g][ics->sect_end[g][i]] - |
2202 | 40.3k | ics->sect_sfb_offset[g][ics->sect_start[g][i]]); |
2203 | 40.3k | break; |
2204 | 49.7k | default: |
2205 | | #ifdef SFBO_PRINT |
2206 | | printf("%d\n", ics->sect_sfb_offset[g][ics->sect_start[g][i]]); |
2207 | | #endif |
2208 | 49.7k | for (k = ics->sect_sfb_offset[g][ics->sect_start[g][i]]; |
2209 | 709k | k < ics->sect_sfb_offset[g][ics->sect_end[g][i]]; k += inc) |
2210 | 660k | { |
2211 | 660k | if ((result = huffman_spectral_data(sect_cb, ld, &spectral_data[p])) > 0) |
2212 | 127 | 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 | 659k | p += inc; |
2223 | 659k | } |
2224 | 49.5k | break; |
2225 | 90.0k | } |
2226 | 90.0k | } |
2227 | 964k | groups += ics->window_group_length[g]; |
2228 | 964k | } |
2229 | | |
2230 | | #ifdef PROFILE |
2231 | | count = faad_get_ts() - count; |
2232 | | hDecoder->spectral_cycles += count; |
2233 | | #endif |
2234 | | |
2235 | 611k | return 0; |
2236 | 612k | } |
2237 | | |
2238 | | #ifndef DRM |
2239 | | /* Table 4.4.30 */ |
2240 | | static uint16_t extension_payload(bitfile *ld, drc_info *drc, uint16_t count) |
2241 | 20.9k | { |
2242 | 20.9k | uint16_t i, n, dataElementLength; |
2243 | 20.9k | uint8_t dataElementLengthPart; |
2244 | 20.9k | uint8_t align = 4, data_element_version, loopCounter; |
2245 | | |
2246 | 20.9k | uint8_t extension_type = (uint8_t)faad_getbits(ld, 4 |
2247 | 20.9k | DEBUGVAR(1,87,"extension_payload(): extension_type")); |
2248 | | |
2249 | 20.9k | switch (extension_type) |
2250 | 20.9k | { |
2251 | 11.7k | case EXT_DYNAMIC_RANGE: |
2252 | 11.7k | drc->present = 1; |
2253 | 11.7k | n = dynamic_range_info(ld, drc); |
2254 | 11.7k | return n; |
2255 | 1.14k | case EXT_FILL_DATA: |
2256 | 1.14k | /* fill_nibble = */ faad_getbits(ld, 4 |
2257 | 1.14k | DEBUGVAR(1,136,"extension_payload(): fill_nibble")); /* must be '0000' */ |
2258 | 84.1k | for (i = 0; i < count-1; i++) |
2259 | 83.0k | { |
2260 | 83.0k | /* fill_byte[i] = */ faad_getbits(ld, 8 |
2261 | 83.0k | DEBUGVAR(1,88,"extension_payload(): fill_byte")); /* must be '10100101' */ |
2262 | 83.0k | } |
2263 | 1.14k | return count; |
2264 | 2.39k | case EXT_DATA_ELEMENT: |
2265 | 2.39k | data_element_version = (uint8_t)faad_getbits(ld, 4 |
2266 | 2.39k | DEBUGVAR(1,400,"extension_payload(): data_element_version")); |
2267 | 2.39k | switch (data_element_version) |
2268 | 2.39k | { |
2269 | 1.13k | case ANC_DATA: |
2270 | 1.13k | loopCounter = 0; |
2271 | 1.13k | dataElementLength = 0; |
2272 | 5.22k | do { |
2273 | 5.22k | dataElementLengthPart = (uint8_t)faad_getbits(ld, 8 |
2274 | 5.22k | DEBUGVAR(1,401,"extension_payload(): dataElementLengthPart")); |
2275 | 5.22k | dataElementLength += dataElementLengthPart; |
2276 | 5.22k | loopCounter++; |
2277 | 5.22k | } while (dataElementLengthPart == 255); |
2278 | | |
2279 | 1.13k | for (i = 0; i < dataElementLength; i++) |
2280 | 996 | { |
2281 | 996 | /* data_element_byte[i] = */ faad_getbits(ld, 8 |
2282 | 996 | DEBUGVAR(1,402,"extension_payload(): data_element_byte")); |
2283 | 996 | return (dataElementLength+loopCounter+1); |
2284 | 996 | } |
2285 | 1.39k | default: |
2286 | 1.39k | align = 0; |
2287 | 2.39k | } |
2288 | 2.38k | case EXT_FIL: |
2289 | 7.03k | default: |
2290 | 7.03k | faad_getbits(ld, align |
2291 | 7.03k | DEBUGVAR(1,88,"extension_payload(): fill_nibble")); |
2292 | 561k | for (i = 0; i < count-1; i++) |
2293 | 554k | { |
2294 | 554k | /* other_bits[i] = */ faad_getbits(ld, 8 |
2295 | 554k | DEBUGVAR(1,89,"extension_payload(): fill_bit")); |
2296 | 554k | } |
2297 | 7.03k | return count; |
2298 | 20.9k | } |
2299 | 20.9k | } |
2300 | | |
2301 | | /* Table 4.4.31 */ |
2302 | | static uint8_t dynamic_range_info(bitfile *ld, drc_info *drc) |
2303 | 11.7k | { |
2304 | 11.7k | uint8_t i, n = 1; |
2305 | 11.7k | uint8_t band_incr; |
2306 | | |
2307 | 11.7k | drc->num_bands = 1; |
2308 | | |
2309 | 11.7k | if (faad_get1bit(ld |
2310 | 11.7k | DEBUGVAR(1,90,"dynamic_range_info(): has instance_tag")) & 1) |
2311 | 4.22k | { |
2312 | 4.22k | drc->pce_instance_tag = (uint8_t)faad_getbits(ld, 4 |
2313 | 4.22k | DEBUGVAR(1,91,"dynamic_range_info(): pce_instance_tag")); |
2314 | 4.22k | /* drc->drc_tag_reserved_bits = */ faad_getbits(ld, 4 |
2315 | 4.22k | DEBUGVAR(1,92,"dynamic_range_info(): drc_tag_reserved_bits")); |
2316 | 4.22k | n++; |
2317 | 4.22k | } |
2318 | | |
2319 | 11.7k | drc->excluded_chns_present = faad_get1bit(ld |
2320 | 11.7k | DEBUGVAR(1,93,"dynamic_range_info(): excluded_chns_present")); |
2321 | 11.7k | if (drc->excluded_chns_present == 1) |
2322 | 4.87k | { |
2323 | 4.87k | n += excluded_channels(ld, drc); |
2324 | 4.87k | } |
2325 | | |
2326 | 11.7k | if (faad_get1bit(ld |
2327 | 11.7k | DEBUGVAR(1,94,"dynamic_range_info(): has bands data")) & 1) |
2328 | 3.07k | { |
2329 | 3.07k | band_incr = (uint8_t)faad_getbits(ld, 4 |
2330 | 3.07k | DEBUGVAR(1,95,"dynamic_range_info(): band_incr")); |
2331 | 3.07k | /* drc->drc_bands_reserved_bits = */ faad_getbits(ld, 4 |
2332 | 3.07k | DEBUGVAR(1,96,"dynamic_range_info(): drc_bands_reserved_bits")); |
2333 | 3.07k | n++; |
2334 | 3.07k | drc->num_bands += band_incr; |
2335 | | |
2336 | 31.6k | for (i = 0; i < drc->num_bands; i++) |
2337 | 28.6k | { |
2338 | 28.6k | drc->band_top[i] = (uint8_t)faad_getbits(ld, 8 |
2339 | 28.6k | DEBUGVAR(1,97,"dynamic_range_info(): band_top")); |
2340 | 28.6k | n++; |
2341 | 28.6k | } |
2342 | 3.07k | } |
2343 | | |
2344 | 11.7k | if (faad_get1bit(ld |
2345 | 11.7k | DEBUGVAR(1,98,"dynamic_range_info(): has prog_ref_level")) & 1) |
2346 | 5.70k | { |
2347 | 5.70k | drc->prog_ref_level = (uint8_t)faad_getbits(ld, 7 |
2348 | 5.70k | DEBUGVAR(1,99,"dynamic_range_info(): prog_ref_level")); |
2349 | 5.70k | /* drc->prog_ref_level_reserved_bits = */ faad_get1bit(ld |
2350 | 5.70k | DEBUGVAR(1,100,"dynamic_range_info(): prog_ref_level_reserved_bits")); |
2351 | 5.70k | n++; |
2352 | 5.70k | } |
2353 | | |
2354 | 49.0k | for (i = 0; i < drc->num_bands; i++) |
2355 | 37.2k | { |
2356 | 37.2k | drc->dyn_rng_sgn[i] = faad_get1bit(ld |
2357 | 37.2k | DEBUGVAR(1,101,"dynamic_range_info(): dyn_rng_sgn")); |
2358 | 37.2k | drc->dyn_rng_ctl[i] = (uint8_t)faad_getbits(ld, 7 |
2359 | 37.2k | DEBUGVAR(1,102,"dynamic_range_info(): dyn_rng_ctl")); |
2360 | 37.2k | n++; |
2361 | 37.2k | } |
2362 | | |
2363 | 11.7k | return n; |
2364 | 11.7k | } |
2365 | | |
2366 | | /* Table 4.4.32 */ |
2367 | | static uint8_t excluded_channels(bitfile *ld, drc_info *drc) |
2368 | 4.87k | { |
2369 | 4.87k | uint8_t i, n = 0; |
2370 | 4.87k | uint8_t num_excl_chan = 7; |
2371 | | |
2372 | 39.0k | for (i = 0; i < 7; i++) |
2373 | 34.1k | { |
2374 | 34.1k | drc->exclude_mask[i] = faad_get1bit(ld |
2375 | 34.1k | DEBUGVAR(1,103,"excluded_channels(): exclude_mask")); |
2376 | 34.1k | } |
2377 | 4.87k | n++; |
2378 | | |
2379 | 18.3k | while ((drc->additional_excluded_chns[n-1] = faad_get1bit(ld |
2380 | 18.3k | DEBUGVAR(1,104,"excluded_channels(): additional_excluded_chns"))) == 1) |
2381 | 15.8k | { |
2382 | 15.8k | if (i >= MAX_CHANNELS - num_excl_chan - 7) |
2383 | 2.38k | return n; |
2384 | 108k | for (i = num_excl_chan; i < num_excl_chan+7; i++) |
2385 | 94.5k | { |
2386 | 94.5k | drc->exclude_mask[i] = faad_get1bit(ld |
2387 | 94.5k | DEBUGVAR(1,105,"excluded_channels(): exclude_mask")); |
2388 | 94.5k | } |
2389 | 13.5k | n++; |
2390 | 13.5k | num_excl_chan += 7; |
2391 | 13.5k | } |
2392 | | |
2393 | 2.49k | return n; |
2394 | 4.87k | } |
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 | 389 | { |
2402 | 389 | uint8_t i; |
2403 | | |
2404 | | /* adif_id[0] = */ faad_getbits(ld, 8 |
2405 | 389 | DEBUGVAR(1,106,"get_adif_header(): adif_id[0]")); |
2406 | 389 | /* adif_id[1] = */ faad_getbits(ld, 8 |
2407 | 389 | DEBUGVAR(1,107,"get_adif_header(): adif_id[1]")); |
2408 | 389 | /* adif_id[2] = */ faad_getbits(ld, 8 |
2409 | 389 | DEBUGVAR(1,108,"get_adif_header(): adif_id[2]")); |
2410 | 389 | /* adif_id[3] = */ faad_getbits(ld, 8 |
2411 | 389 | DEBUGVAR(1,109,"get_adif_header(): adif_id[3]")); |
2412 | 389 | adif->copyright_id_present = faad_get1bit(ld |
2413 | 389 | DEBUGVAR(1,110,"get_adif_header(): copyright_id_present")); |
2414 | 389 | if(adif->copyright_id_present) |
2415 | 117 | { |
2416 | 1.17k | for (i = 0; i < 72/8; i++) |
2417 | 1.05k | { |
2418 | 1.05k | adif->copyright_id[i] = (int8_t)faad_getbits(ld, 8 |
2419 | 1.05k | DEBUGVAR(1,111,"get_adif_header(): copyright_id")); |
2420 | 1.05k | } |
2421 | 117 | adif->copyright_id[i] = 0; |
2422 | 117 | } |
2423 | 389 | adif->original_copy = faad_get1bit(ld |
2424 | 389 | DEBUGVAR(1,112,"get_adif_header(): original_copy")); |
2425 | 389 | adif->home = faad_get1bit(ld |
2426 | 389 | DEBUGVAR(1,113,"get_adif_header(): home")); |
2427 | 389 | adif->bitstream_type = faad_get1bit(ld |
2428 | 389 | DEBUGVAR(1,114,"get_adif_header(): bitstream_type")); |
2429 | 389 | adif->bitrate = faad_getbits(ld, 23 |
2430 | 389 | DEBUGVAR(1,115,"get_adif_header(): bitrate")); |
2431 | 389 | adif->num_program_config_elements = (uint8_t)faad_getbits(ld, 4 |
2432 | 389 | DEBUGVAR(1,116,"get_adif_header(): num_program_config_elements")); |
2433 | | |
2434 | 5.23k | for (i = 0; i < adif->num_program_config_elements + 1; i++) |
2435 | 4.84k | { |
2436 | 4.84k | if(adif->bitstream_type == 0) |
2437 | 2.03k | { |
2438 | 2.03k | adif->adif_buffer_fullness = faad_getbits(ld, 20 |
2439 | 2.03k | DEBUGVAR(1,117,"get_adif_header(): adif_buffer_fullness")); |
2440 | 2.81k | } else { |
2441 | 2.81k | adif->adif_buffer_fullness = 0; |
2442 | 2.81k | } |
2443 | | |
2444 | 4.84k | program_config_element(&adif->pce[i], ld); |
2445 | 4.84k | } |
2446 | 389 | } |
2447 | | |
2448 | | /* Table 1.A.5 */ |
2449 | | uint8_t adts_frame(adts_header *adts, bitfile *ld) |
2450 | 17.2k | { |
2451 | | /* faad_byte_align(ld); */ |
2452 | 17.2k | if (adts_fixed_header(adts, ld)) |
2453 | 15.9k | return 5; |
2454 | 1.28k | adts_variable_header(adts, ld); |
2455 | 1.28k | adts_error_check(adts, ld); |
2456 | | |
2457 | 1.28k | return 0; |
2458 | 17.2k | } |
2459 | | |
2460 | | /* Table 1.A.6 */ |
2461 | | static uint8_t adts_fixed_header(adts_header *adts, bitfile *ld) |
2462 | 17.2k | { |
2463 | 17.2k | uint16_t i; |
2464 | 17.2k | uint8_t sync_err = 1; |
2465 | | |
2466 | | /* try to recover from sync errors */ |
2467 | 12.2M | for (i = 0; i < 768; i++) |
2468 | 12.2M | { |
2469 | 12.2M | adts->syncword = (uint16_t)faad_showbits(ld, 12); |
2470 | 12.2M | if (adts->syncword != 0xFFF) |
2471 | 12.2M | { |
2472 | 12.2M | faad_getbits(ld, 8 |
2473 | 12.2M | DEBUGVAR(0,0,"")); |
2474 | 12.2M | } else { |
2475 | 1.28k | sync_err = 0; |
2476 | 1.28k | faad_getbits(ld, 12 |
2477 | 1.28k | DEBUGVAR(1,118,"adts_fixed_header(): syncword")); |
2478 | 1.28k | break; |
2479 | 1.28k | } |
2480 | 12.2M | } |
2481 | 17.2k | if (sync_err) |
2482 | 15.9k | return 5; |
2483 | | |
2484 | 1.28k | adts->id = faad_get1bit(ld |
2485 | 1.28k | DEBUGVAR(1,119,"adts_fixed_header(): id")); |
2486 | 1.28k | adts->layer = (uint8_t)faad_getbits(ld, 2 |
2487 | 1.28k | DEBUGVAR(1,120,"adts_fixed_header(): layer")); |
2488 | 1.28k | adts->protection_absent = faad_get1bit(ld |
2489 | 1.28k | DEBUGVAR(1,121,"adts_fixed_header(): protection_absent")); |
2490 | 1.28k | adts->profile = (uint8_t)faad_getbits(ld, 2 |
2491 | 1.28k | DEBUGVAR(1,122,"adts_fixed_header(): profile")); |
2492 | 1.28k | adts->sf_index = (uint8_t)faad_getbits(ld, 4 |
2493 | 1.28k | DEBUGVAR(1,123,"adts_fixed_header(): sf_index")); |
2494 | 1.28k | adts->private_bit = faad_get1bit(ld |
2495 | 1.28k | DEBUGVAR(1,124,"adts_fixed_header(): private_bit")); |
2496 | 1.28k | adts->channel_configuration = (uint8_t)faad_getbits(ld, 3 |
2497 | 1.28k | DEBUGVAR(1,125,"adts_fixed_header(): channel_configuration")); |
2498 | 1.28k | adts->original = faad_get1bit(ld |
2499 | 1.28k | DEBUGVAR(1,126,"adts_fixed_header(): original")); |
2500 | 1.28k | adts->home = faad_get1bit(ld |
2501 | 1.28k | DEBUGVAR(1,127,"adts_fixed_header(): home")); |
2502 | | |
2503 | 1.28k | 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 | 1.28k | return 0; |
2514 | 17.2k | } |
2515 | | |
2516 | | /* Table 1.A.7 */ |
2517 | | static void adts_variable_header(adts_header *adts, bitfile *ld) |
2518 | 1.28k | { |
2519 | 1.28k | adts->copyright_identification_bit = faad_get1bit(ld |
2520 | 1.28k | DEBUGVAR(1,129,"adts_variable_header(): copyright_identification_bit")); |
2521 | 1.28k | adts->copyright_identification_start = faad_get1bit(ld |
2522 | 1.28k | DEBUGVAR(1,130,"adts_variable_header(): copyright_identification_start")); |
2523 | 1.28k | adts->aac_frame_length = (uint16_t)faad_getbits(ld, 13 |
2524 | 1.28k | DEBUGVAR(1,131,"adts_variable_header(): aac_frame_length")); |
2525 | 1.28k | adts->adts_buffer_fullness = (uint16_t)faad_getbits(ld, 11 |
2526 | 1.28k | DEBUGVAR(1,132,"adts_variable_header(): adts_buffer_fullness")); |
2527 | 1.28k | adts->no_raw_data_blocks_in_frame = (uint8_t)faad_getbits(ld, 2 |
2528 | 1.28k | DEBUGVAR(1,133,"adts_variable_header(): no_raw_data_blocks_in_frame")); |
2529 | 1.28k | } |
2530 | | |
2531 | | /* Table 1.A.8 */ |
2532 | | static void adts_error_check(adts_header *adts, bitfile *ld) |
2533 | 1.28k | { |
2534 | 1.28k | if (adts->protection_absent == 0) |
2535 | 225 | { |
2536 | 225 | adts->crc_check = (uint16_t)faad_getbits(ld, 16 |
2537 | 225 | DEBUGVAR(1,134,"adts_error_check(): crc_check")); |
2538 | 225 | } |
2539 | 1.28k | } |
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 |