Mercurial > mplayer.hg
annotate libfaad2/decoder.c @ 25835:645cbba10a57
added AudioSpecificConfigFromBitfile() -that reads from an initizialized
bitstream- and reimplemented AudioSpecificConfig() in terms of the former.
Also, introduced a short_form parameter that indicates if the core
function must pretend not to know the size of the header (another craziness
in AAC)
author | nicodvb |
---|---|
date | Sat, 26 Jan 2008 18:42:17 +0000 |
parents | 59b6fa5b4201 |
children | bc425ba00960 |
rev | line source |
---|---|
10725 | 1 /* |
2 ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding | |
12527 | 3 ** Copyright (C) 2003-2004 M. Bakker, Ahead Software AG, http://www.nero.com |
4 ** | |
10725 | 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. | |
12527 | 9 ** |
10725 | 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. | |
12527 | 14 ** |
10725 | 15 ** You should have received a copy of the GNU General Public License |
12527 | 16 ** along with this program; if not, write to the Free Software |
10725 | 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 ** Commercial non-GPL licensing of this software is possible. | |
23 ** For more info contact Ahead Software through Mpeg4AAClicense@nero.com. | |
24 ** | |
18141 | 25 ** $Id: decoder.c,v 1.107 2004/09/08 09:43:11 gcp Exp $ |
10725 | 26 **/ |
27 | |
28 #include "common.h" | |
29 #include "structs.h" | |
30 | |
31 #include <stdlib.h> | |
32 #include <string.h> | |
33 | |
34 #include "decoder.h" | |
35 #include "mp4.h" | |
36 #include "syntax.h" | |
37 #include "error.h" | |
38 #include "output.h" | |
12527 | 39 #include "filtbank.h" |
40 #include "drc.h" | |
41 #ifdef SBR_DEC | |
42 #include "sbr_dec.h" | |
43 #include "sbr_syntax.h" | |
44 #endif | |
10725 | 45 #ifdef SSR_DEC |
46 #include "ssr.h" | |
47 #endif | |
48 | |
49 #ifdef ANALYSIS | |
50 uint16_t dbg_count; | |
51 #endif | |
52 | |
13453
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
53 /* static function declarations */ |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
54 static void* aac_frame_decode(NeAACDecHandle hDecoder, NeAACDecFrameInfo *hInfo, |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
55 uint8_t *buffer, uint32_t buffer_size, |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
56 void **sample_buffer, uint32_t sample_buffer_size); |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
57 static void create_channel_config(NeAACDecHandle hDecoder, NeAACDecFrameInfo *hInfo); |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
58 |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
59 |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
60 char* NEAACDECAPI NeAACDecGetErrorMessage(uint8_t errcode) |
10725 | 61 { |
62 if (errcode >= NUM_ERROR_MESSAGES) | |
63 return NULL; | |
64 return err_msg[errcode]; | |
65 } | |
66 | |
13453
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
67 uint32_t NEAACDECAPI NeAACDecGetCapabilities(void) |
10725 | 68 { |
69 uint32_t cap = 0; | |
70 | |
71 /* can't do without it */ | |
72 cap += LC_DEC_CAP; | |
73 | |
74 #ifdef MAIN_DEC | |
75 cap += MAIN_DEC_CAP; | |
76 #endif | |
77 #ifdef LTP_DEC | |
78 cap += LTP_DEC_CAP; | |
79 #endif | |
80 #ifdef LD_DEC | |
81 cap += LD_DEC_CAP; | |
82 #endif | |
83 #ifdef ERROR_RESILIENCE | |
84 cap += ERROR_RESILIENCE_CAP; | |
85 #endif | |
86 #ifdef FIXED_POINT | |
87 cap += FIXED_POINT_CAP; | |
88 #endif | |
89 | |
90 return cap; | |
91 } | |
92 | |
13453
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
93 NeAACDecHandle NEAACDECAPI NeAACDecOpen(void) |
10725 | 94 { |
95 uint8_t i; | |
13453
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
96 NeAACDecHandle hDecoder = NULL; |
10725 | 97 |
13453
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
98 if ((hDecoder = (NeAACDecHandle)faad_malloc(sizeof(NeAACDecStruct))) == NULL) |
10725 | 99 return NULL; |
100 | |
13453
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
101 memset(hDecoder, 0, sizeof(NeAACDecStruct)); |
10725 | 102 |
103 hDecoder->config.outputFormat = FAAD_FMT_16BIT; | |
104 hDecoder->config.defObjectType = MAIN; | |
105 hDecoder->config.defSampleRate = 44100; /* Default: 44.1kHz */ | |
12527 | 106 hDecoder->config.downMatrix = 0; |
10725 | 107 hDecoder->adts_header_present = 0; |
108 hDecoder->adif_header_present = 0; | |
25835
645cbba10a57
added AudioSpecificConfigFromBitfile() -that reads from an initizialized
nicodvb
parents:
18141
diff
changeset
|
109 hDecoder->latm_header_present = 0; |
10725 | 110 #ifdef ERROR_RESILIENCE |
111 hDecoder->aacSectionDataResilienceFlag = 0; | |
112 hDecoder->aacScalefactorDataResilienceFlag = 0; | |
113 hDecoder->aacSpectralDataResilienceFlag = 0; | |
114 #endif | |
115 hDecoder->frameLength = 1024; | |
116 | |
117 hDecoder->frame = 0; | |
118 hDecoder->sample_buffer = NULL; | |
119 | |
120 for (i = 0; i < MAX_CHANNELS; i++) | |
121 { | |
122 hDecoder->window_shape_prev[i] = 0; | |
123 hDecoder->time_out[i] = NULL; | |
12527 | 124 hDecoder->fb_intermed[i] = NULL; |
10725 | 125 #ifdef SSR_DEC |
126 hDecoder->ssr_overlap[i] = NULL; | |
127 hDecoder->prev_fmd[i] = NULL; | |
128 #endif | |
129 #ifdef MAIN_DEC | |
130 hDecoder->pred_stat[i] = NULL; | |
131 #endif | |
132 #ifdef LTP_DEC | |
133 hDecoder->ltp_lag[i] = 0; | |
134 hDecoder->lt_pred_stat[i] = NULL; | |
135 #endif | |
136 } | |
137 | |
138 #ifdef SBR_DEC | |
12527 | 139 for (i = 0; i < MAX_SYNTAX_ELEMENTS; i++) |
10725 | 140 { |
141 hDecoder->sbr[i] = NULL; | |
142 } | |
143 #endif | |
144 | |
145 hDecoder->drc = drc_init(REAL_CONST(1.0), REAL_CONST(1.0)); | |
146 | |
147 return hDecoder; | |
148 } | |
149 | |
13453
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
150 NeAACDecConfigurationPtr NEAACDECAPI NeAACDecGetCurrentConfiguration(NeAACDecHandle hDecoder) |
10725 | 151 { |
10989 | 152 if (hDecoder) |
153 { | |
13453
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
154 NeAACDecConfigurationPtr config = &(hDecoder->config); |
10725 | 155 |
12527 | 156 return config; |
10989 | 157 } |
158 | |
159 return NULL; | |
10725 | 160 } |
161 | |
13453
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
162 uint8_t NEAACDECAPI NeAACDecSetConfiguration(NeAACDecHandle hDecoder, |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
163 NeAACDecConfigurationPtr config) |
10725 | 164 { |
10989 | 165 if (hDecoder && config) |
166 { | |
167 /* check if we can decode this object type */ | |
168 if (can_decode_ot(config->defObjectType) < 0) | |
169 return 0; | |
12527 | 170 hDecoder->config.defObjectType = config->defObjectType; |
10989 | 171 |
172 /* samplerate: anything but 0 should be possible */ | |
173 if (config->defSampleRate == 0) | |
174 return 0; | |
12527 | 175 hDecoder->config.defSampleRate = config->defSampleRate; |
10989 | 176 |
177 /* check output format */ | |
13453
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
178 #ifdef FIXED_POINT |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
179 if ((config->outputFormat < 1) || (config->outputFormat > 4)) |
10989 | 180 return 0; |
13453
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
181 #else |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
182 if ((config->outputFormat < 1) || (config->outputFormat > 5)) |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
183 return 0; |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
184 #endif |
12527 | 185 hDecoder->config.outputFormat = config->outputFormat; |
10989 | 186 |
187 if (config->downMatrix > 1) | |
13453
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
188 return 0; |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
189 hDecoder->config.downMatrix = config->downMatrix; |
10725 | 190 |
12527 | 191 /* OK */ |
192 return 1; | |
10989 | 193 } |
194 | |
195 return 0; | |
10725 | 196 } |
197 | |
13453
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
198 int32_t NEAACDECAPI NeAACDecInit(NeAACDecHandle hDecoder, uint8_t *buffer, |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
199 uint32_t buffer_size, |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
200 uint32_t *samplerate, uint8_t *channels) |
10725 | 201 { |
202 uint32_t bits = 0; | |
203 bitfile ld; | |
204 adif_header adif; | |
205 adts_header adts; | |
206 | |
10989 | 207 if ((hDecoder == NULL) || (samplerate == NULL) || (channels == NULL)) |
208 return -1; | |
209 | |
10725 | 210 hDecoder->sf_index = get_sr_index(hDecoder->config.defSampleRate); |
211 hDecoder->object_type = hDecoder->config.defObjectType; | |
10989 | 212 *samplerate = get_sample_rate(hDecoder->sf_index); |
10725 | 213 *channels = 1; |
214 | |
215 if (buffer != NULL) | |
216 { | |
217 faad_initbits(&ld, buffer, buffer_size); | |
218 | |
219 /* Check if an ADIF header is present */ | |
220 if ((buffer[0] == 'A') && (buffer[1] == 'D') && | |
221 (buffer[2] == 'I') && (buffer[3] == 'F')) | |
222 { | |
223 hDecoder->adif_header_present = 1; | |
224 | |
225 get_adif_header(&adif, &ld); | |
226 faad_byte_align(&ld); | |
227 | |
228 hDecoder->sf_index = adif.pce[0].sf_index; | |
10989 | 229 hDecoder->object_type = adif.pce[0].object_type + 1; |
10725 | 230 |
10989 | 231 *samplerate = get_sample_rate(hDecoder->sf_index); |
10725 | 232 *channels = adif.pce[0].channels; |
233 | |
234 memcpy(&(hDecoder->pce), &(adif.pce[0]), sizeof(program_config)); | |
235 hDecoder->pce_set = 1; | |
236 | |
237 bits = bit2byte(faad_get_processed_bits(&ld)); | |
238 | |
239 /* Check if an ADTS header is present */ | |
240 } else if (faad_showbits(&ld, 12) == 0xfff) { | |
241 hDecoder->adts_header_present = 1; | |
242 | |
10989 | 243 adts.old_format = hDecoder->config.useOldADTSFormat; |
10725 | 244 adts_frame(&adts, &ld); |
245 | |
246 hDecoder->sf_index = adts.sf_index; | |
10989 | 247 hDecoder->object_type = adts.profile + 1; |
10725 | 248 |
10989 | 249 *samplerate = get_sample_rate(hDecoder->sf_index); |
10725 | 250 *channels = (adts.channel_configuration > 6) ? |
251 2 : adts.channel_configuration; | |
252 } | |
253 | |
254 if (ld.error) | |
255 { | |
256 faad_endbits(&ld); | |
257 return -1; | |
258 } | |
259 faad_endbits(&ld); | |
260 } | |
261 hDecoder->channelConfiguration = *channels; | |
262 | |
13453
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
263 #if (defined(PS_DEC) || defined(DRM_PS)) |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
264 /* check if we have a mono file */ |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
265 if (*channels == 1) |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
266 { |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
267 /* upMatrix to 2 channels for implicit signalling of PS */ |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
268 *channels = 2; |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
269 } |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
270 #endif |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
271 |
10989 | 272 #ifdef SBR_DEC |
273 /* implicit signalling */ | |
12527 | 274 if (*samplerate <= 24000 && !(hDecoder->config.dontUpSampleImplicitSBR)) |
10989 | 275 { |
276 *samplerate *= 2; | |
277 hDecoder->forceUpSampling = 1; | |
13453
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
278 } else if (*samplerate > 24000 && !(hDecoder->config.dontUpSampleImplicitSBR)) { |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
279 hDecoder->downSampledSBR = 1; |
10989 | 280 } |
281 #endif | |
282 | |
10725 | 283 /* must be done before frameLength is divided by 2 for LD */ |
284 #ifdef SSR_DEC | |
285 if (hDecoder->object_type == SSR) | |
286 hDecoder->fb = ssr_filter_bank_init(hDecoder->frameLength/SSR_BANDS); | |
287 else | |
288 #endif | |
289 hDecoder->fb = filter_bank_init(hDecoder->frameLength); | |
290 | |
291 #ifdef LD_DEC | |
292 if (hDecoder->object_type == LD) | |
293 hDecoder->frameLength >>= 1; | |
294 #endif | |
295 | |
296 if (can_decode_ot(hDecoder->object_type) < 0) | |
297 return -1; | |
298 | |
299 return bits; | |
300 } | |
301 | |
302 /* Init the library using a DecoderSpecificInfo */ | |
13453
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
303 int8_t NEAACDECAPI NeAACDecInit2(NeAACDecHandle hDecoder, uint8_t *pBuffer, |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
304 uint32_t SizeOfDecoderSpecificInfo, |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
305 uint32_t *samplerate, uint8_t *channels) |
10725 | 306 { |
307 int8_t rc; | |
308 mp4AudioSpecificConfig mp4ASC; | |
309 | |
310 if((hDecoder == NULL) | |
311 || (pBuffer == NULL) | |
312 || (SizeOfDecoderSpecificInfo < 2) | |
313 || (samplerate == NULL) | |
314 || (channels == NULL)) | |
315 { | |
316 return -1; | |
317 } | |
318 | |
10989 | 319 hDecoder->adif_header_present = 0; |
320 hDecoder->adts_header_present = 0; | |
321 | |
10725 | 322 /* decode the audio specific config */ |
323 rc = AudioSpecificConfig2(pBuffer, SizeOfDecoderSpecificInfo, &mp4ASC, | |
25835
645cbba10a57
added AudioSpecificConfigFromBitfile() -that reads from an initizialized
nicodvb
parents:
18141
diff
changeset
|
324 &(hDecoder->pce), hDecoder->latm_header_present); |
10725 | 325 |
326 /* copy the relevant info to the decoder handle */ | |
327 *samplerate = mp4ASC.samplingFrequency; | |
328 if (mp4ASC.channelsConfiguration) | |
329 { | |
330 *channels = mp4ASC.channelsConfiguration; | |
331 } else { | |
332 *channels = hDecoder->pce.channels; | |
333 hDecoder->pce_set = 1; | |
334 } | |
13453
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
335 #if (defined(PS_DEC) || defined(DRM_PS)) |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
336 /* check if we have a mono file */ |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
337 if (*channels == 1) |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
338 { |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
339 /* upMatrix to 2 channels for implicit signalling of PS */ |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
340 *channels = 2; |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
341 } |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
342 #endif |
10725 | 343 hDecoder->sf_index = mp4ASC.samplingFrequencyIndex; |
344 hDecoder->object_type = mp4ASC.objectTypeIndex; | |
10989 | 345 #ifdef ERROR_RESILIENCE |
10725 | 346 hDecoder->aacSectionDataResilienceFlag = mp4ASC.aacSectionDataResilienceFlag; |
347 hDecoder->aacScalefactorDataResilienceFlag = mp4ASC.aacScalefactorDataResilienceFlag; | |
348 hDecoder->aacSpectralDataResilienceFlag = mp4ASC.aacSpectralDataResilienceFlag; | |
10989 | 349 #endif |
10725 | 350 #ifdef SBR_DEC |
351 hDecoder->sbr_present_flag = mp4ASC.sbr_present_flag; | |
13453
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
352 hDecoder->downSampledSBR = mp4ASC.downSampledSBR; |
12527 | 353 if (hDecoder->config.dontUpSampleImplicitSBR == 0) |
354 hDecoder->forceUpSampling = mp4ASC.forceUpSampling; | |
355 else | |
356 hDecoder->forceUpSampling = 0; | |
10725 | 357 |
358 /* AAC core decoder samplerate is 2 times as low */ | |
13453
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
359 if (((hDecoder->sbr_present_flag == 1)&&(!hDecoder->downSampledSBR)) || hDecoder->forceUpSampling == 1) |
10725 | 360 { |
361 hDecoder->sf_index = get_sr_index(mp4ASC.samplingFrequency / 2); | |
362 } | |
363 #endif | |
364 | |
365 if (rc != 0) | |
366 { | |
367 return rc; | |
368 } | |
369 hDecoder->channelConfiguration = mp4ASC.channelsConfiguration; | |
370 if (mp4ASC.frameLengthFlag) | |
12527 | 371 #ifdef ALLOW_SMALL_FRAMELENGTH |
10725 | 372 hDecoder->frameLength = 960; |
12527 | 373 #else |
374 return -1; | |
375 #endif | |
10725 | 376 |
377 /* must be done before frameLength is divided by 2 for LD */ | |
378 #ifdef SSR_DEC | |
379 if (hDecoder->object_type == SSR) | |
380 hDecoder->fb = ssr_filter_bank_init(hDecoder->frameLength/SSR_BANDS); | |
381 else | |
382 #endif | |
383 hDecoder->fb = filter_bank_init(hDecoder->frameLength); | |
384 | |
385 #ifdef LD_DEC | |
386 if (hDecoder->object_type == LD) | |
387 hDecoder->frameLength >>= 1; | |
388 #endif | |
389 | |
390 return 0; | |
391 } | |
392 | |
12527 | 393 #ifdef DRM |
13453
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
394 int8_t NEAACDECAPI NeAACDecInitDRM(NeAACDecHandle *hDecoder, uint32_t samplerate, |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
395 uint8_t channels) |
10725 | 396 { |
12527 | 397 if (hDecoder == NULL) |
398 return 1; /* error */ | |
399 | |
13453
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
400 NeAACDecClose(*hDecoder); |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
401 |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
402 *hDecoder = NeAACDecOpen(); |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
403 |
10725 | 404 /* Special object type defined for DRM */ |
13453
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
405 (*hDecoder)->config.defObjectType = DRM_ER_LC; |
10725 | 406 |
13453
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
407 (*hDecoder)->config.defSampleRate = samplerate; |
10989 | 408 #ifdef ERROR_RESILIENCE // This shoudl always be defined for DRM |
13453
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
409 (*hDecoder)->aacSectionDataResilienceFlag = 1; /* VCB11 */ |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
410 (*hDecoder)->aacScalefactorDataResilienceFlag = 0; /* no RVLC */ |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
411 (*hDecoder)->aacSpectralDataResilienceFlag = 1; /* HCR */ |
10989 | 412 #endif |
13453
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
413 (*hDecoder)->frameLength = 960; |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
414 (*hDecoder)->sf_index = get_sr_index((*hDecoder)->config.defSampleRate); |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
415 (*hDecoder)->object_type = (*hDecoder)->config.defObjectType; |
10989 | 416 |
417 if ((channels == DRMCH_STEREO) || (channels == DRMCH_SBR_STEREO)) | |
13453
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
418 (*hDecoder)->channelConfiguration = 2; |
10989 | 419 else |
13453
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
420 (*hDecoder)->channelConfiguration = 1; |
10989 | 421 |
422 #ifdef SBR_DEC | |
423 if ((channels == DRMCH_MONO) || (channels == DRMCH_STEREO)) | |
13453
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
424 (*hDecoder)->sbr_present_flag = 0; |
10989 | 425 else |
13453
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
426 (*hDecoder)->sbr_present_flag = 1; |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
427 #endif |
10725 | 428 |
13453
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
429 (*hDecoder)->fb = filter_bank_init((*hDecoder)->frameLength); |
10725 | 430 |
431 return 0; | |
432 } | |
12527 | 433 #endif |
10725 | 434 |
13453
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
435 void NEAACDECAPI NeAACDecClose(NeAACDecHandle hDecoder) |
10725 | 436 { |
437 uint8_t i; | |
438 | |
439 if (hDecoder == NULL) | |
440 return; | |
441 | |
12527 | 442 #ifdef PROFILE |
443 printf("AAC decoder total: %I64d cycles\n", hDecoder->cycles); | |
444 printf("requant: %I64d cycles\n", hDecoder->requant_cycles); | |
445 printf("spectral_data: %I64d cycles\n", hDecoder->spectral_cycles); | |
446 printf("scalefactors: %I64d cycles\n", hDecoder->scalefac_cycles); | |
447 printf("output: %I64d cycles\n", hDecoder->output_cycles); | |
448 #endif | |
449 | |
10725 | 450 for (i = 0; i < MAX_CHANNELS; i++) |
451 { | |
12527 | 452 if (hDecoder->time_out[i]) faad_free(hDecoder->time_out[i]); |
453 if (hDecoder->fb_intermed[i]) faad_free(hDecoder->fb_intermed[i]); | |
10725 | 454 #ifdef SSR_DEC |
12527 | 455 if (hDecoder->ssr_overlap[i]) faad_free(hDecoder->ssr_overlap[i]); |
456 if (hDecoder->prev_fmd[i]) faad_free(hDecoder->prev_fmd[i]); | |
10725 | 457 #endif |
458 #ifdef MAIN_DEC | |
12527 | 459 if (hDecoder->pred_stat[i]) faad_free(hDecoder->pred_stat[i]); |
10725 | 460 #endif |
461 #ifdef LTP_DEC | |
12527 | 462 if (hDecoder->lt_pred_stat[i]) faad_free(hDecoder->lt_pred_stat[i]); |
10725 | 463 #endif |
464 } | |
465 | |
466 #ifdef SSR_DEC | |
467 if (hDecoder->object_type == SSR) | |
468 ssr_filter_bank_end(hDecoder->fb); | |
469 else | |
470 #endif | |
471 filter_bank_end(hDecoder->fb); | |
472 | |
473 drc_end(hDecoder->drc); | |
474 | |
12527 | 475 if (hDecoder->sample_buffer) faad_free(hDecoder->sample_buffer); |
10725 | 476 |
477 #ifdef SBR_DEC | |
12527 | 478 for (i = 0; i < MAX_SYNTAX_ELEMENTS; i++) |
10725 | 479 { |
480 if (hDecoder->sbr[i]) | |
481 sbrDecodeEnd(hDecoder->sbr[i]); | |
482 } | |
483 #endif | |
484 | |
12527 | 485 if (hDecoder) faad_free(hDecoder); |
10725 | 486 } |
487 | |
13453
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
488 void NEAACDECAPI NeAACDecPostSeekReset(NeAACDecHandle hDecoder, int32_t frame) |
10725 | 489 { |
490 if (hDecoder) | |
491 { | |
492 hDecoder->postSeekResetFlag = 1; | |
493 | |
494 if (frame != -1) | |
495 hDecoder->frame = frame; | |
496 } | |
497 } | |
498 | |
13453
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
499 static void create_channel_config(NeAACDecHandle hDecoder, NeAACDecFrameInfo *hInfo) |
10725 | 500 { |
501 hInfo->num_front_channels = 0; | |
502 hInfo->num_side_channels = 0; | |
503 hInfo->num_back_channels = 0; | |
504 hInfo->num_lfe_channels = 0; | |
505 memset(hInfo->channel_position, 0, MAX_CHANNELS*sizeof(uint8_t)); | |
506 | |
507 if (hDecoder->downMatrix) | |
508 { | |
509 hInfo->num_front_channels = 2; | |
510 hInfo->channel_position[0] = FRONT_CHANNEL_LEFT; | |
511 hInfo->channel_position[1] = FRONT_CHANNEL_RIGHT; | |
512 return; | |
513 } | |
514 | |
515 /* check if there is a PCE */ | |
516 if (hDecoder->pce_set) | |
517 { | |
518 uint8_t i, chpos = 0; | |
519 uint8_t chdir, back_center = 0; | |
520 | |
521 hInfo->num_front_channels = hDecoder->pce.num_front_channels; | |
522 hInfo->num_side_channels = hDecoder->pce.num_side_channels; | |
523 hInfo->num_back_channels = hDecoder->pce.num_back_channels; | |
524 hInfo->num_lfe_channels = hDecoder->pce.num_lfe_channels; | |
525 | |
526 chdir = hInfo->num_front_channels; | |
527 if (chdir & 1) | |
528 { | |
529 hInfo->channel_position[chpos++] = FRONT_CHANNEL_CENTER; | |
530 chdir--; | |
531 } | |
532 for (i = 0; i < chdir; i += 2) | |
533 { | |
534 hInfo->channel_position[chpos++] = FRONT_CHANNEL_LEFT; | |
535 hInfo->channel_position[chpos++] = FRONT_CHANNEL_RIGHT; | |
536 } | |
537 | |
538 for (i = 0; i < hInfo->num_side_channels; i += 2) | |
539 { | |
540 hInfo->channel_position[chpos++] = SIDE_CHANNEL_LEFT; | |
541 hInfo->channel_position[chpos++] = SIDE_CHANNEL_RIGHT; | |
542 } | |
543 | |
544 chdir = hInfo->num_back_channels; | |
545 if (chdir & 1) | |
546 { | |
547 back_center = 1; | |
548 chdir--; | |
549 } | |
550 for (i = 0; i < chdir; i += 2) | |
551 { | |
552 hInfo->channel_position[chpos++] = BACK_CHANNEL_LEFT; | |
553 hInfo->channel_position[chpos++] = BACK_CHANNEL_RIGHT; | |
554 } | |
555 if (back_center) | |
556 { | |
557 hInfo->channel_position[chpos++] = BACK_CHANNEL_CENTER; | |
558 } | |
559 | |
560 for (i = 0; i < hInfo->num_lfe_channels; i++) | |
561 { | |
562 hInfo->channel_position[chpos++] = LFE_CHANNEL; | |
563 } | |
564 | |
565 } else { | |
566 switch (hDecoder->channelConfiguration) | |
567 { | |
568 case 1: | |
569 hInfo->num_front_channels = 1; | |
570 hInfo->channel_position[0] = FRONT_CHANNEL_CENTER; | |
571 break; | |
572 case 2: | |
573 hInfo->num_front_channels = 2; | |
574 hInfo->channel_position[0] = FRONT_CHANNEL_LEFT; | |
575 hInfo->channel_position[1] = FRONT_CHANNEL_RIGHT; | |
576 break; | |
577 case 3: | |
578 hInfo->num_front_channels = 3; | |
579 hInfo->channel_position[0] = FRONT_CHANNEL_CENTER; | |
580 hInfo->channel_position[1] = FRONT_CHANNEL_LEFT; | |
581 hInfo->channel_position[2] = FRONT_CHANNEL_RIGHT; | |
582 break; | |
583 case 4: | |
584 hInfo->num_front_channels = 3; | |
585 hInfo->num_back_channels = 1; | |
586 hInfo->channel_position[0] = FRONT_CHANNEL_CENTER; | |
587 hInfo->channel_position[1] = FRONT_CHANNEL_LEFT; | |
588 hInfo->channel_position[2] = FRONT_CHANNEL_RIGHT; | |
589 hInfo->channel_position[3] = BACK_CHANNEL_CENTER; | |
590 break; | |
591 case 5: | |
592 hInfo->num_front_channels = 3; | |
593 hInfo->num_back_channels = 2; | |
594 hInfo->channel_position[0] = FRONT_CHANNEL_CENTER; | |
595 hInfo->channel_position[1] = FRONT_CHANNEL_LEFT; | |
596 hInfo->channel_position[2] = FRONT_CHANNEL_RIGHT; | |
597 hInfo->channel_position[3] = BACK_CHANNEL_LEFT; | |
598 hInfo->channel_position[4] = BACK_CHANNEL_RIGHT; | |
599 break; | |
600 case 6: | |
601 hInfo->num_front_channels = 3; | |
602 hInfo->num_back_channels = 2; | |
603 hInfo->num_lfe_channels = 1; | |
604 hInfo->channel_position[0] = FRONT_CHANNEL_CENTER; | |
605 hInfo->channel_position[1] = FRONT_CHANNEL_LEFT; | |
606 hInfo->channel_position[2] = FRONT_CHANNEL_RIGHT; | |
607 hInfo->channel_position[3] = BACK_CHANNEL_LEFT; | |
608 hInfo->channel_position[4] = BACK_CHANNEL_RIGHT; | |
609 hInfo->channel_position[5] = LFE_CHANNEL; | |
610 break; | |
611 case 7: | |
612 hInfo->num_front_channels = 3; | |
613 hInfo->num_side_channels = 2; | |
614 hInfo->num_back_channels = 2; | |
615 hInfo->num_lfe_channels = 1; | |
616 hInfo->channel_position[0] = FRONT_CHANNEL_CENTER; | |
617 hInfo->channel_position[1] = FRONT_CHANNEL_LEFT; | |
618 hInfo->channel_position[2] = FRONT_CHANNEL_RIGHT; | |
619 hInfo->channel_position[3] = SIDE_CHANNEL_LEFT; | |
620 hInfo->channel_position[4] = SIDE_CHANNEL_RIGHT; | |
621 hInfo->channel_position[5] = BACK_CHANNEL_LEFT; | |
622 hInfo->channel_position[6] = BACK_CHANNEL_RIGHT; | |
623 hInfo->channel_position[7] = LFE_CHANNEL; | |
624 break; | |
625 default: /* channelConfiguration == 0 || channelConfiguration > 7 */ | |
626 { | |
627 uint8_t i; | |
628 uint8_t ch = hDecoder->fr_channels - hDecoder->has_lfe; | |
629 if (ch & 1) /* there's either a center front or a center back channel */ | |
630 { | |
631 uint8_t ch1 = (ch-1)/2; | |
632 if (hDecoder->first_syn_ele == ID_SCE) | |
633 { | |
634 hInfo->num_front_channels = ch1 + 1; | |
635 hInfo->num_back_channels = ch1; | |
636 hInfo->channel_position[0] = FRONT_CHANNEL_CENTER; | |
637 for (i = 1; i <= ch1; i+=2) | |
638 { | |
639 hInfo->channel_position[i] = FRONT_CHANNEL_LEFT; | |
640 hInfo->channel_position[i+1] = FRONT_CHANNEL_RIGHT; | |
641 } | |
642 for (i = ch1+1; i < ch; i+=2) | |
643 { | |
644 hInfo->channel_position[i] = BACK_CHANNEL_LEFT; | |
645 hInfo->channel_position[i+1] = BACK_CHANNEL_RIGHT; | |
646 } | |
647 } else { | |
648 hInfo->num_front_channels = ch1; | |
649 hInfo->num_back_channels = ch1 + 1; | |
650 for (i = 0; i < ch1; i+=2) | |
651 { | |
652 hInfo->channel_position[i] = FRONT_CHANNEL_LEFT; | |
653 hInfo->channel_position[i+1] = FRONT_CHANNEL_RIGHT; | |
654 } | |
655 for (i = ch1; i < ch-1; i+=2) | |
656 { | |
657 hInfo->channel_position[i] = BACK_CHANNEL_LEFT; | |
658 hInfo->channel_position[i+1] = BACK_CHANNEL_RIGHT; | |
659 } | |
660 hInfo->channel_position[ch-1] = BACK_CHANNEL_CENTER; | |
661 } | |
662 } else { | |
663 uint8_t ch1 = (ch)/2; | |
664 hInfo->num_front_channels = ch1; | |
665 hInfo->num_back_channels = ch1; | |
666 if (ch1 & 1) | |
667 { | |
668 hInfo->channel_position[0] = FRONT_CHANNEL_CENTER; | |
669 for (i = 1; i <= ch1; i+=2) | |
670 { | |
671 hInfo->channel_position[i] = FRONT_CHANNEL_LEFT; | |
672 hInfo->channel_position[i+1] = FRONT_CHANNEL_RIGHT; | |
673 } | |
674 for (i = ch1+1; i < ch-1; i+=2) | |
675 { | |
676 hInfo->channel_position[i] = BACK_CHANNEL_LEFT; | |
677 hInfo->channel_position[i+1] = BACK_CHANNEL_RIGHT; | |
678 } | |
679 hInfo->channel_position[ch-1] = BACK_CHANNEL_CENTER; | |
680 } else { | |
681 for (i = 0; i < ch1; i+=2) | |
682 { | |
683 hInfo->channel_position[i] = FRONT_CHANNEL_LEFT; | |
684 hInfo->channel_position[i+1] = FRONT_CHANNEL_RIGHT; | |
685 } | |
686 for (i = ch1; i < ch; i+=2) | |
687 { | |
688 hInfo->channel_position[i] = BACK_CHANNEL_LEFT; | |
689 hInfo->channel_position[i+1] = BACK_CHANNEL_RIGHT; | |
690 } | |
691 } | |
692 } | |
693 hInfo->num_lfe_channels = hDecoder->has_lfe; | |
694 for (i = ch; i < hDecoder->fr_channels; i++) | |
695 { | |
696 hInfo->channel_position[i] = LFE_CHANNEL; | |
697 } | |
698 } | |
699 break; | |
700 } | |
701 } | |
702 } | |
703 | |
13453
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
704 void* NEAACDECAPI NeAACDecDecode(NeAACDecHandle hDecoder, |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
705 NeAACDecFrameInfo *hInfo, |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
706 uint8_t *buffer, uint32_t buffer_size) |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
707 { |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
708 return aac_frame_decode(hDecoder, hInfo, buffer, buffer_size, NULL, 0); |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
709 } |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
710 |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
711 void* NEAACDECAPI NeAACDecDecode2(NeAACDecHandle hDecoder, |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
712 NeAACDecFrameInfo *hInfo, |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
713 uint8_t *buffer, uint32_t buffer_size, |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
714 void **sample_buffer, uint32_t sample_buffer_size) |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
715 { |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
716 if ((sample_buffer == NULL) || (sample_buffer_size == 0)) |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
717 { |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
718 hInfo->error = 27; |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
719 return NULL; |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
720 } |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
721 |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
722 return aac_frame_decode(hDecoder, hInfo, buffer, buffer_size, |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
723 sample_buffer, sample_buffer_size); |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
724 } |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
725 |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
726 static void* aac_frame_decode(NeAACDecHandle hDecoder, NeAACDecFrameInfo *hInfo, |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
727 uint8_t *buffer, uint32_t buffer_size, |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
728 void **sample_buffer2, uint32_t sample_buffer_size) |
10725 | 729 { |
12527 | 730 uint8_t channels = 0; |
10725 | 731 uint8_t output_channels = 0; |
12527 | 732 bitfile ld; |
10989 | 733 uint32_t bitsconsumed; |
12527 | 734 uint16_t frame_len; |
735 void *sample_buffer; | |
736 | |
737 #ifdef PROFILE | |
738 int64_t count = faad_get_ts(); | |
10989 | 739 #endif |
10725 | 740 |
10989 | 741 /* safety checks */ |
12527 | 742 if ((hDecoder == NULL) || (hInfo == NULL) || (buffer == NULL)) |
10989 | 743 { |
744 return NULL; | |
745 } | |
10725 | 746 |
13453
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
747 #if 0 |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
748 printf("%d\n", buffer_size*8); |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
749 #endif |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
750 |
10989 | 751 frame_len = hDecoder->frameLength; |
10725 | 752 |
753 | |
13453
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
754 memset(hInfo, 0, sizeof(NeAACDecFrameInfo)); |
10989 | 755 memset(hDecoder->internal_channel, 0, MAX_CHANNELS*sizeof(hDecoder->internal_channel[0])); |
10725 | 756 |
757 /* initialize the bitstream */ | |
12527 | 758 faad_initbits(&ld, buffer, buffer_size); |
10725 | 759 |
13453
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
760 #if 0 |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
761 { |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
762 int i; |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
763 for (i = 0; i < ((buffer_size+3)>>2); i++) |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
764 { |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
765 uint8_t *buf; |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
766 uint32_t temp = 0; |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
767 buf = faad_getbitbuffer(&ld, 32); |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
768 //temp = getdword((void*)buf); |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
769 temp = *((uint32_t*)buf); |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
770 printf("0x%.8X\n", temp); |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
771 free(buf); |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
772 } |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
773 faad_endbits(&ld); |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
774 faad_initbits(&ld, buffer, buffer_size); |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
775 } |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
776 #endif |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
777 |
10725 | 778 #ifdef DRM |
12527 | 779 if (hDecoder->object_type == DRM_ER_LC) |
10725 | 780 { |
12527 | 781 /* We do not support stereo right now */ |
13453
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
782 if (0) //(hDecoder->channelConfiguration == 2) |
12527 | 783 { |
784 hInfo->error = 8; // Throw CRC error | |
785 goto error; | |
786 } | |
787 | |
788 faad_getbits(&ld, 8 | |
13453
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
789 DEBUGVAR(1,1,"NeAACDecDecode(): skip CRC")); |
10725 | 790 } |
791 #endif | |
792 | |
793 if (hDecoder->adts_header_present) | |
794 { | |
12527 | 795 adts_header adts; |
796 | |
10989 | 797 adts.old_format = hDecoder->config.useOldADTSFormat; |
12527 | 798 if ((hInfo->error = adts_frame(&adts, &ld)) > 0) |
10725 | 799 goto error; |
800 | |
801 /* MPEG2 does byte_alignment() here, | |
802 * but ADTS header is always multiple of 8 bits in MPEG2 | |
803 * so not needed to actually do it. | |
804 */ | |
805 } | |
806 | |
807 #ifdef ANALYSIS | |
808 dbg_count = 0; | |
809 #endif | |
810 | |
12527 | 811 /* decode the complete bitstream */ |
812 #ifdef SCALABLE_DEC | |
813 if ((hDecoder->object_type == 6) || (hDecoder->object_type == DRM_ER_LC)) | |
814 { | |
815 aac_scalable_main_element(hDecoder, hInfo, &ld, &hDecoder->pce, hDecoder->drc); | |
816 } else { | |
817 #endif | |
818 raw_data_block(hDecoder, hInfo, &ld, &hDecoder->pce, hDecoder->drc); | |
819 #ifdef SCALABLE_DEC | |
820 } | |
821 #endif | |
10725 | 822 |
823 channels = hDecoder->fr_channels; | |
824 | |
825 if (hInfo->error > 0) | |
826 goto error; | |
827 | |
12527 | 828 /* safety check */ |
829 if (channels == 0 || channels > MAX_CHANNELS) | |
830 { | |
831 /* invalid number of channels */ | |
832 hInfo->error = 12; | |
833 goto error; | |
834 } | |
10725 | 835 |
836 /* no more bit reading after this */ | |
12527 | 837 bitsconsumed = faad_get_processed_bits(&ld); |
10989 | 838 hInfo->bytesconsumed = bit2byte(bitsconsumed); |
12527 | 839 if (ld.error) |
10725 | 840 { |
841 hInfo->error = 14; | |
842 goto error; | |
843 } | |
12527 | 844 faad_endbits(&ld); |
10989 | 845 |
846 | |
10725 | 847 if (!hDecoder->adts_header_present && !hDecoder->adif_header_present) |
848 { | |
13453
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
849 if (hDecoder->channelConfiguration == 0) |
10725 | 850 hDecoder->channelConfiguration = channels; |
851 | |
852 if (channels == 8) /* 7.1 */ | |
853 hDecoder->channelConfiguration = 7; | |
854 if (channels == 7) /* not a standard channelConfiguration */ | |
855 hDecoder->channelConfiguration = 0; | |
856 } | |
857 | |
858 if ((channels == 5 || channels == 6) && hDecoder->config.downMatrix) | |
859 { | |
860 hDecoder->downMatrix = 1; | |
861 output_channels = 2; | |
862 } else { | |
863 output_channels = channels; | |
864 } | |
865 | |
13453
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
866 #if (defined(PS_DEC) || defined(DRM_PS)) |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
867 hDecoder->upMatrix = 0; |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
868 /* check if we have a mono file */ |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
869 if (output_channels == 1) |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
870 { |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
871 /* upMatrix to 2 channels for implicit signalling of PS */ |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
872 hDecoder->upMatrix = 1; |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
873 output_channels = 2; |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
874 } |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
875 #endif |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
876 |
10725 | 877 /* Make a channel configuration based on either a PCE or a channelConfiguration */ |
878 create_channel_config(hDecoder, hInfo); | |
879 | |
880 /* number of samples in this frame */ | |
881 hInfo->samples = frame_len*output_channels; | |
882 /* number of channels in this frame */ | |
883 hInfo->channels = output_channels; | |
884 /* samplerate */ | |
10989 | 885 hInfo->samplerate = get_sample_rate(hDecoder->sf_index); |
886 /* object type */ | |
887 hInfo->object_type = hDecoder->object_type; | |
888 /* sbr */ | |
889 hInfo->sbr = NO_SBR; | |
890 /* header type */ | |
891 hInfo->header_type = RAW; | |
892 if (hDecoder->adif_header_present) | |
893 hInfo->header_type = ADIF; | |
894 if (hDecoder->adts_header_present) | |
895 hInfo->header_type = ADTS; | |
18141 | 896 #if (defined(PS_DEC) || defined(DRM_PS)) |
897 hInfo->ps = hDecoder->ps_used_global; | |
898 #endif | |
10725 | 899 |
900 /* check if frame has channel elements */ | |
901 if (channels == 0) | |
902 { | |
903 hDecoder->frame++; | |
904 return NULL; | |
905 } | |
906 | |
12527 | 907 /* allocate the buffer for the final samples */ |
908 if ((hDecoder->sample_buffer == NULL) || | |
909 (hDecoder->alloced_channels != output_channels)) | |
10725 | 910 { |
12527 | 911 static const uint8_t str[] = { sizeof(int16_t), sizeof(int32_t), sizeof(int32_t), |
912 sizeof(float32_t), sizeof(double), sizeof(int16_t), sizeof(int16_t), | |
913 sizeof(int16_t), sizeof(int16_t), 0, 0, 0 | |
914 }; | |
915 uint8_t stride = str[hDecoder->config.outputFormat-1]; | |
10725 | 916 #ifdef SBR_DEC |
13453
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
917 if (((hDecoder->sbr_present_flag == 1)&&(!hDecoder->downSampledSBR)) || (hDecoder->forceUpSampling == 1)) |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
918 { |
12527 | 919 stride = 2 * stride; |
13453
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
920 } |
10725 | 921 #endif |
13453
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
922 /* check if we want to use internal sample_buffer */ |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
923 if (sample_buffer_size == 0) |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
924 { |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
925 if (hDecoder->sample_buffer) |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
926 faad_free(hDecoder->sample_buffer); |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
927 hDecoder->sample_buffer = NULL; |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
928 hDecoder->sample_buffer = faad_malloc(frame_len*output_channels*stride); |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
929 } else if (sample_buffer_size < frame_len*output_channels*stride) { |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
930 /* provided sample buffer is not big enough */ |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
931 hInfo->error = 27; |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
932 return NULL; |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
933 } |
12527 | 934 hDecoder->alloced_channels = output_channels; |
10725 | 935 } |
936 | |
13453
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
937 if (sample_buffer_size == 0) |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
938 { |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
939 sample_buffer = hDecoder->sample_buffer; |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
940 } else { |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
941 sample_buffer = *sample_buffer2; |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
942 } |
10725 | 943 |
944 #ifdef SBR_DEC | |
10989 | 945 if ((hDecoder->sbr_present_flag == 1) || (hDecoder->forceUpSampling == 1)) |
10725 | 946 { |
12527 | 947 uint8_t ele; |
10989 | 948 |
12527 | 949 /* this data is different when SBR is used or when the data is upsampled */ |
13453
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
950 if (!hDecoder->downSampledSBR) |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
951 { |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
952 frame_len *= 2; |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
953 hInfo->samples *= 2; |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
954 hInfo->samplerate *= 2; |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
955 } |
12527 | 956 |
957 /* check if every element was provided with SBR data */ | |
958 for (ele = 0; ele < hDecoder->fr_ch_ele; ele++) | |
959 { | |
960 if (hDecoder->sbr[ele] == NULL) | |
961 { | |
962 hInfo->error = 25; | |
963 goto error; | |
964 } | |
965 } | |
966 | |
10989 | 967 /* sbr */ |
968 if (hDecoder->sbr_present_flag == 1) | |
969 { | |
970 hInfo->object_type = HE_AAC; | |
971 hInfo->sbr = SBR_UPSAMPLED; | |
972 } else { | |
973 hInfo->sbr = NO_SBR_UPSAMPLED; | |
974 } | |
13453
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
975 if (hDecoder->downSampledSBR) |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
976 { |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
977 hInfo->sbr = SBR_DOWNSAMPLED; |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
978 } |
10725 | 979 } |
980 #endif | |
981 | |
12527 | 982 sample_buffer = output_to_PCM(hDecoder, hDecoder->time_out, sample_buffer, |
983 output_channels, frame_len, hDecoder->config.outputFormat); | |
984 | |
985 | |
10725 | 986 hDecoder->postSeekResetFlag = 0; |
987 | |
988 hDecoder->frame++; | |
989 #ifdef LD_DEC | |
12527 | 990 if (hDecoder->object_type != LD) |
10725 | 991 { |
992 #endif | |
993 if (hDecoder->frame <= 1) | |
994 hInfo->samples = 0; | |
995 #ifdef LD_DEC | |
996 } else { | |
997 /* LD encoders will give lower delay */ | |
998 if (hDecoder->frame <= 0) | |
999 hInfo->samples = 0; | |
1000 } | |
1001 #endif | |
1002 | |
1003 /* cleanup */ | |
1004 #ifdef ANALYSIS | |
1005 fflush(stdout); | |
1006 #endif | |
1007 | |
12527 | 1008 #ifdef PROFILE |
1009 count = faad_get_ts() - count; | |
1010 hDecoder->cycles += count; | |
1011 #endif | |
1012 | |
10725 | 1013 return sample_buffer; |
1014 | |
1015 error: | |
12527 | 1016 |
1017 faad_endbits(&ld); | |
10725 | 1018 |
1019 /* cleanup */ | |
1020 #ifdef ANALYSIS | |
1021 fflush(stdout); | |
1022 #endif | |
1023 | |
1024 return NULL; | |
1025 } |