Mercurial > mplayer.hg
annotate libfaad2/decoder.c @ 32127:24299859359f
swscale-test: move conversion from ref to source back to doTest()
The source format parameters are kept in static variables and conversion from
ref to source is only made when any parameter changes.
author | ramiro |
---|---|
date | Sun, 12 Sep 2010 18:14:42 +0000 |
parents | 86888a4c406e |
children |
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 | |
25836
bc425ba00960
added code to check and handle the presence of LATM streams in the init() and decode() functions
nicodvb
parents:
25835
diff
changeset
|
198 static int latmCheck(latm_header *latm, bitfile *ld) |
bc425ba00960
added code to check and handle the presence of LATM streams in the init() and decode() functions
nicodvb
parents:
25835
diff
changeset
|
199 { |
bc425ba00960
added code to check and handle the presence of LATM streams in the init() and decode() functions
nicodvb
parents:
25835
diff
changeset
|
200 uint32_t good=0, bad=0, bits, m; |
bc425ba00960
added code to check and handle the presence of LATM streams in the init() and decode() functions
nicodvb
parents:
25835
diff
changeset
|
201 |
bc425ba00960
added code to check and handle the presence of LATM streams in the init() and decode() functions
nicodvb
parents:
25835
diff
changeset
|
202 while(!ld->error && !ld->no_more_reading) |
bc425ba00960
added code to check and handle the presence of LATM streams in the init() and decode() functions
nicodvb
parents:
25835
diff
changeset
|
203 { |
bc425ba00960
added code to check and handle the presence of LATM streams in the init() and decode() functions
nicodvb
parents:
25835
diff
changeset
|
204 bits = faad_latm_frame(latm, ld); |
bc425ba00960
added code to check and handle the presence of LATM streams in the init() and decode() functions
nicodvb
parents:
25835
diff
changeset
|
205 if(bits==-1U) |
bc425ba00960
added code to check and handle the presence of LATM streams in the init() and decode() functions
nicodvb
parents:
25835
diff
changeset
|
206 bad++; |
bc425ba00960
added code to check and handle the presence of LATM streams in the init() and decode() functions
nicodvb
parents:
25835
diff
changeset
|
207 else |
bc425ba00960
added code to check and handle the presence of LATM streams in the init() and decode() functions
nicodvb
parents:
25835
diff
changeset
|
208 { |
bc425ba00960
added code to check and handle the presence of LATM streams in the init() and decode() functions
nicodvb
parents:
25835
diff
changeset
|
209 good++; |
bc425ba00960
added code to check and handle the presence of LATM streams in the init() and decode() functions
nicodvb
parents:
25835
diff
changeset
|
210 while(bits>0) |
bc425ba00960
added code to check and handle the presence of LATM streams in the init() and decode() functions
nicodvb
parents:
25835
diff
changeset
|
211 { |
bc425ba00960
added code to check and handle the presence of LATM streams in the init() and decode() functions
nicodvb
parents:
25835
diff
changeset
|
212 m = min(bits, 8); |
bc425ba00960
added code to check and handle the presence of LATM streams in the init() and decode() functions
nicodvb
parents:
25835
diff
changeset
|
213 faad_getbits(ld, m); |
bc425ba00960
added code to check and handle the presence of LATM streams in the init() and decode() functions
nicodvb
parents:
25835
diff
changeset
|
214 bits -= m; |
bc425ba00960
added code to check and handle the presence of LATM streams in the init() and decode() functions
nicodvb
parents:
25835
diff
changeset
|
215 } |
bc425ba00960
added code to check and handle the presence of LATM streams in the init() and decode() functions
nicodvb
parents:
25835
diff
changeset
|
216 } |
bc425ba00960
added code to check and handle the presence of LATM streams in the init() and decode() functions
nicodvb
parents:
25835
diff
changeset
|
217 } |
bc425ba00960
added code to check and handle the presence of LATM streams in the init() and decode() functions
nicodvb
parents:
25835
diff
changeset
|
218 |
bc425ba00960
added code to check and handle the presence of LATM streams in the init() and decode() functions
nicodvb
parents:
25835
diff
changeset
|
219 return (good>0); |
bc425ba00960
added code to check and handle the presence of LATM streams in the init() and decode() functions
nicodvb
parents:
25835
diff
changeset
|
220 } |
bc425ba00960
added code to check and handle the presence of LATM streams in the init() and decode() functions
nicodvb
parents:
25835
diff
changeset
|
221 |
bc425ba00960
added code to check and handle the presence of LATM streams in the init() and decode() functions
nicodvb
parents:
25835
diff
changeset
|
222 |
13453
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
223 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
|
224 uint32_t buffer_size, |
31477 | 225 uint32_t *samplerate, uint8_t *channels, int latm_stream) |
10725 | 226 { |
227 uint32_t bits = 0; | |
228 bitfile ld; | |
229 adif_header adif; | |
230 adts_header adts; | |
231 | |
10989 | 232 if ((hDecoder == NULL) || (samplerate == NULL) || (channels == NULL)) |
233 return -1; | |
234 | |
10725 | 235 hDecoder->sf_index = get_sr_index(hDecoder->config.defSampleRate); |
236 hDecoder->object_type = hDecoder->config.defObjectType; | |
10989 | 237 *samplerate = get_sample_rate(hDecoder->sf_index); |
10725 | 238 *channels = 1; |
239 | |
240 if (buffer != NULL) | |
241 { | |
25836
bc425ba00960
added code to check and handle the presence of LATM streams in the init() and decode() functions
nicodvb
parents:
25835
diff
changeset
|
242 int is_latm; |
bc425ba00960
added code to check and handle the presence of LATM streams in the init() and decode() functions
nicodvb
parents:
25835
diff
changeset
|
243 latm_header *l = &hDecoder->latm_config; |
10725 | 244 faad_initbits(&ld, buffer, buffer_size); |
245 | |
25836
bc425ba00960
added code to check and handle the presence of LATM streams in the init() and decode() functions
nicodvb
parents:
25835
diff
changeset
|
246 memset(l, 0, sizeof(latm_header)); |
bc425ba00960
added code to check and handle the presence of LATM streams in the init() and decode() functions
nicodvb
parents:
25835
diff
changeset
|
247 is_latm = latmCheck(l, &ld); |
bc425ba00960
added code to check and handle the presence of LATM streams in the init() and decode() functions
nicodvb
parents:
25835
diff
changeset
|
248 l->inited = 0; |
bc425ba00960
added code to check and handle the presence of LATM streams in the init() and decode() functions
nicodvb
parents:
25835
diff
changeset
|
249 l->frameLength = 0; |
bc425ba00960
added code to check and handle the presence of LATM streams in the init() and decode() functions
nicodvb
parents:
25835
diff
changeset
|
250 faad_rewindbits(&ld); |
bc425ba00960
added code to check and handle the presence of LATM streams in the init() and decode() functions
nicodvb
parents:
25835
diff
changeset
|
251 if(is_latm && l->ASCbits>0) |
bc425ba00960
added code to check and handle the presence of LATM streams in the init() and decode() functions
nicodvb
parents:
25835
diff
changeset
|
252 { |
bc425ba00960
added code to check and handle the presence of LATM streams in the init() and decode() functions
nicodvb
parents:
25835
diff
changeset
|
253 int32_t x; |
bc425ba00960
added code to check and handle the presence of LATM streams in the init() and decode() functions
nicodvb
parents:
25835
diff
changeset
|
254 hDecoder->latm_header_present = 1; |
bc425ba00960
added code to check and handle the presence of LATM streams in the init() and decode() functions
nicodvb
parents:
25835
diff
changeset
|
255 x = NeAACDecInit2(hDecoder, &l->ASC, (l->ASCbits+7)/8, samplerate, channels); |
bc425ba00960
added code to check and handle the presence of LATM streams in the init() and decode() functions
nicodvb
parents:
25835
diff
changeset
|
256 if(x!=0) |
bc425ba00960
added code to check and handle the presence of LATM streams in the init() and decode() functions
nicodvb
parents:
25835
diff
changeset
|
257 hDecoder->latm_header_present = 0; |
bc425ba00960
added code to check and handle the presence of LATM streams in the init() and decode() functions
nicodvb
parents:
25835
diff
changeset
|
258 return x; |
bc425ba00960
added code to check and handle the presence of LATM streams in the init() and decode() functions
nicodvb
parents:
25835
diff
changeset
|
259 } |
31477 | 260 else if (latm_stream) { |
261 return -1; | |
262 } | |
25836
bc425ba00960
added code to check and handle the presence of LATM streams in the init() and decode() functions
nicodvb
parents:
25835
diff
changeset
|
263 else |
10725 | 264 /* Check if an ADIF header is present */ |
265 if ((buffer[0] == 'A') && (buffer[1] == 'D') && | |
266 (buffer[2] == 'I') && (buffer[3] == 'F')) | |
267 { | |
268 hDecoder->adif_header_present = 1; | |
269 | |
270 get_adif_header(&adif, &ld); | |
271 faad_byte_align(&ld); | |
272 | |
273 hDecoder->sf_index = adif.pce[0].sf_index; | |
10989 | 274 hDecoder->object_type = adif.pce[0].object_type + 1; |
10725 | 275 |
10989 | 276 *samplerate = get_sample_rate(hDecoder->sf_index); |
10725 | 277 *channels = adif.pce[0].channels; |
278 | |
279 memcpy(&(hDecoder->pce), &(adif.pce[0]), sizeof(program_config)); | |
280 hDecoder->pce_set = 1; | |
281 | |
282 bits = bit2byte(faad_get_processed_bits(&ld)); | |
283 | |
284 /* Check if an ADTS header is present */ | |
285 } else if (faad_showbits(&ld, 12) == 0xfff) { | |
286 hDecoder->adts_header_present = 1; | |
287 | |
10989 | 288 adts.old_format = hDecoder->config.useOldADTSFormat; |
10725 | 289 adts_frame(&adts, &ld); |
290 | |
291 hDecoder->sf_index = adts.sf_index; | |
10989 | 292 hDecoder->object_type = adts.profile + 1; |
10725 | 293 |
10989 | 294 *samplerate = get_sample_rate(hDecoder->sf_index); |
10725 | 295 *channels = (adts.channel_configuration > 6) ? |
296 2 : adts.channel_configuration; | |
297 } | |
298 | |
299 if (ld.error) | |
300 { | |
301 faad_endbits(&ld); | |
302 return -1; | |
303 } | |
304 faad_endbits(&ld); | |
305 } | |
306 hDecoder->channelConfiguration = *channels; | |
307 | |
13453
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
308 #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
|
309 /* 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
|
310 if (*channels == 1) |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
311 { |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
312 /* 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
|
313 *channels = 2; |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
314 } |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
315 #endif |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
316 |
10989 | 317 #ifdef SBR_DEC |
318 /* implicit signalling */ | |
12527 | 319 if (*samplerate <= 24000 && !(hDecoder->config.dontUpSampleImplicitSBR)) |
10989 | 320 { |
321 *samplerate *= 2; | |
322 hDecoder->forceUpSampling = 1; | |
13453
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
323 } 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
|
324 hDecoder->downSampledSBR = 1; |
10989 | 325 } |
326 #endif | |
327 | |
10725 | 328 /* must be done before frameLength is divided by 2 for LD */ |
329 #ifdef SSR_DEC | |
330 if (hDecoder->object_type == SSR) | |
331 hDecoder->fb = ssr_filter_bank_init(hDecoder->frameLength/SSR_BANDS); | |
332 else | |
333 #endif | |
334 hDecoder->fb = filter_bank_init(hDecoder->frameLength); | |
335 | |
336 #ifdef LD_DEC | |
337 if (hDecoder->object_type == LD) | |
338 hDecoder->frameLength >>= 1; | |
339 #endif | |
340 | |
341 if (can_decode_ot(hDecoder->object_type) < 0) | |
342 return -1; | |
343 | |
344 return bits; | |
345 } | |
346 | |
347 /* 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
|
348 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
|
349 uint32_t SizeOfDecoderSpecificInfo, |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
350 uint32_t *samplerate, uint8_t *channels) |
10725 | 351 { |
352 int8_t rc; | |
353 mp4AudioSpecificConfig mp4ASC; | |
354 | |
355 if((hDecoder == NULL) | |
356 || (pBuffer == NULL) | |
357 || (SizeOfDecoderSpecificInfo < 2) | |
358 || (samplerate == NULL) | |
359 || (channels == NULL)) | |
360 { | |
361 return -1; | |
362 } | |
363 | |
10989 | 364 hDecoder->adif_header_present = 0; |
365 hDecoder->adts_header_present = 0; | |
366 | |
10725 | 367 /* decode the audio specific config */ |
368 rc = AudioSpecificConfig2(pBuffer, SizeOfDecoderSpecificInfo, &mp4ASC, | |
25835
645cbba10a57
added AudioSpecificConfigFromBitfile() -that reads from an initizialized
nicodvb
parents:
18141
diff
changeset
|
369 &(hDecoder->pce), hDecoder->latm_header_present); |
10725 | 370 |
371 /* copy the relevant info to the decoder handle */ | |
372 *samplerate = mp4ASC.samplingFrequency; | |
373 if (mp4ASC.channelsConfiguration) | |
374 { | |
375 *channels = mp4ASC.channelsConfiguration; | |
376 } else { | |
377 *channels = hDecoder->pce.channels; | |
378 hDecoder->pce_set = 1; | |
379 } | |
13453
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
380 #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
|
381 /* 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
|
382 if (*channels == 1) |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
383 { |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
384 /* 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
|
385 *channels = 2; |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
386 } |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
387 #endif |
10725 | 388 hDecoder->sf_index = mp4ASC.samplingFrequencyIndex; |
389 hDecoder->object_type = mp4ASC.objectTypeIndex; | |
10989 | 390 #ifdef ERROR_RESILIENCE |
10725 | 391 hDecoder->aacSectionDataResilienceFlag = mp4ASC.aacSectionDataResilienceFlag; |
392 hDecoder->aacScalefactorDataResilienceFlag = mp4ASC.aacScalefactorDataResilienceFlag; | |
393 hDecoder->aacSpectralDataResilienceFlag = mp4ASC.aacSpectralDataResilienceFlag; | |
10989 | 394 #endif |
10725 | 395 #ifdef SBR_DEC |
396 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
|
397 hDecoder->downSampledSBR = mp4ASC.downSampledSBR; |
12527 | 398 if (hDecoder->config.dontUpSampleImplicitSBR == 0) |
399 hDecoder->forceUpSampling = mp4ASC.forceUpSampling; | |
400 else | |
401 hDecoder->forceUpSampling = 0; | |
10725 | 402 |
403 /* 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
|
404 if (((hDecoder->sbr_present_flag == 1)&&(!hDecoder->downSampledSBR)) || hDecoder->forceUpSampling == 1) |
10725 | 405 { |
406 hDecoder->sf_index = get_sr_index(mp4ASC.samplingFrequency / 2); | |
407 } | |
408 #endif | |
409 | |
410 if (rc != 0) | |
411 { | |
412 return rc; | |
413 } | |
414 hDecoder->channelConfiguration = mp4ASC.channelsConfiguration; | |
415 if (mp4ASC.frameLengthFlag) | |
12527 | 416 #ifdef ALLOW_SMALL_FRAMELENGTH |
10725 | 417 hDecoder->frameLength = 960; |
12527 | 418 #else |
419 return -1; | |
420 #endif | |
10725 | 421 |
422 /* must be done before frameLength is divided by 2 for LD */ | |
423 #ifdef SSR_DEC | |
424 if (hDecoder->object_type == SSR) | |
425 hDecoder->fb = ssr_filter_bank_init(hDecoder->frameLength/SSR_BANDS); | |
426 else | |
427 #endif | |
428 hDecoder->fb = filter_bank_init(hDecoder->frameLength); | |
429 | |
430 #ifdef LD_DEC | |
431 if (hDecoder->object_type == LD) | |
432 hDecoder->frameLength >>= 1; | |
433 #endif | |
434 | |
435 return 0; | |
436 } | |
437 | |
12527 | 438 #ifdef DRM |
13453
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
439 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
|
440 uint8_t channels) |
10725 | 441 { |
12527 | 442 if (hDecoder == NULL) |
443 return 1; /* error */ | |
444 | |
13453
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
445 NeAACDecClose(*hDecoder); |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
446 |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
447 *hDecoder = NeAACDecOpen(); |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
448 |
10725 | 449 /* 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
|
450 (*hDecoder)->config.defObjectType = DRM_ER_LC; |
10725 | 451 |
13453
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
452 (*hDecoder)->config.defSampleRate = samplerate; |
10989 | 453 #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
|
454 (*hDecoder)->aacSectionDataResilienceFlag = 1; /* VCB11 */ |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
455 (*hDecoder)->aacScalefactorDataResilienceFlag = 0; /* no RVLC */ |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
456 (*hDecoder)->aacSpectralDataResilienceFlag = 1; /* HCR */ |
10989 | 457 #endif |
13453
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
458 (*hDecoder)->frameLength = 960; |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
459 (*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
|
460 (*hDecoder)->object_type = (*hDecoder)->config.defObjectType; |
10989 | 461 |
462 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
|
463 (*hDecoder)->channelConfiguration = 2; |
10989 | 464 else |
13453
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
465 (*hDecoder)->channelConfiguration = 1; |
10989 | 466 |
467 #ifdef SBR_DEC | |
468 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
|
469 (*hDecoder)->sbr_present_flag = 0; |
10989 | 470 else |
29264
e83eef58b30a
Remove all kind of trailing whitespaces from all MPlayer's files.
bircoph
parents:
25836
diff
changeset
|
471 (*hDecoder)->sbr_present_flag = 1; |
e83eef58b30a
Remove all kind of trailing whitespaces from all MPlayer's files.
bircoph
parents:
25836
diff
changeset
|
472 #endif |
10725 | 473 |
13453
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
474 (*hDecoder)->fb = filter_bank_init((*hDecoder)->frameLength); |
10725 | 475 |
476 return 0; | |
477 } | |
12527 | 478 #endif |
10725 | 479 |
13453
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
480 void NEAACDECAPI NeAACDecClose(NeAACDecHandle hDecoder) |
10725 | 481 { |
482 uint8_t i; | |
483 | |
484 if (hDecoder == NULL) | |
485 return; | |
486 | |
12527 | 487 #ifdef PROFILE |
488 printf("AAC decoder total: %I64d cycles\n", hDecoder->cycles); | |
489 printf("requant: %I64d cycles\n", hDecoder->requant_cycles); | |
490 printf("spectral_data: %I64d cycles\n", hDecoder->spectral_cycles); | |
491 printf("scalefactors: %I64d cycles\n", hDecoder->scalefac_cycles); | |
492 printf("output: %I64d cycles\n", hDecoder->output_cycles); | |
493 #endif | |
494 | |
10725 | 495 for (i = 0; i < MAX_CHANNELS; i++) |
496 { | |
12527 | 497 if (hDecoder->time_out[i]) faad_free(hDecoder->time_out[i]); |
498 if (hDecoder->fb_intermed[i]) faad_free(hDecoder->fb_intermed[i]); | |
10725 | 499 #ifdef SSR_DEC |
12527 | 500 if (hDecoder->ssr_overlap[i]) faad_free(hDecoder->ssr_overlap[i]); |
501 if (hDecoder->prev_fmd[i]) faad_free(hDecoder->prev_fmd[i]); | |
10725 | 502 #endif |
503 #ifdef MAIN_DEC | |
12527 | 504 if (hDecoder->pred_stat[i]) faad_free(hDecoder->pred_stat[i]); |
10725 | 505 #endif |
506 #ifdef LTP_DEC | |
12527 | 507 if (hDecoder->lt_pred_stat[i]) faad_free(hDecoder->lt_pred_stat[i]); |
10725 | 508 #endif |
509 } | |
510 | |
511 #ifdef SSR_DEC | |
512 if (hDecoder->object_type == SSR) | |
513 ssr_filter_bank_end(hDecoder->fb); | |
514 else | |
515 #endif | |
516 filter_bank_end(hDecoder->fb); | |
517 | |
518 drc_end(hDecoder->drc); | |
519 | |
12527 | 520 if (hDecoder->sample_buffer) faad_free(hDecoder->sample_buffer); |
10725 | 521 |
522 #ifdef SBR_DEC | |
12527 | 523 for (i = 0; i < MAX_SYNTAX_ELEMENTS; i++) |
10725 | 524 { |
525 if (hDecoder->sbr[i]) | |
526 sbrDecodeEnd(hDecoder->sbr[i]); | |
527 } | |
528 #endif | |
529 | |
12527 | 530 if (hDecoder) faad_free(hDecoder); |
10725 | 531 } |
532 | |
13453
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
533 void NEAACDECAPI NeAACDecPostSeekReset(NeAACDecHandle hDecoder, int32_t frame) |
10725 | 534 { |
535 if (hDecoder) | |
536 { | |
537 hDecoder->postSeekResetFlag = 1; | |
538 | |
539 if (frame != -1) | |
540 hDecoder->frame = frame; | |
541 } | |
542 } | |
543 | |
13453
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
544 static void create_channel_config(NeAACDecHandle hDecoder, NeAACDecFrameInfo *hInfo) |
10725 | 545 { |
546 hInfo->num_front_channels = 0; | |
547 hInfo->num_side_channels = 0; | |
548 hInfo->num_back_channels = 0; | |
549 hInfo->num_lfe_channels = 0; | |
550 memset(hInfo->channel_position, 0, MAX_CHANNELS*sizeof(uint8_t)); | |
551 | |
552 if (hDecoder->downMatrix) | |
553 { | |
554 hInfo->num_front_channels = 2; | |
555 hInfo->channel_position[0] = FRONT_CHANNEL_LEFT; | |
556 hInfo->channel_position[1] = FRONT_CHANNEL_RIGHT; | |
557 return; | |
558 } | |
559 | |
560 /* check if there is a PCE */ | |
561 if (hDecoder->pce_set) | |
562 { | |
563 uint8_t i, chpos = 0; | |
564 uint8_t chdir, back_center = 0; | |
565 | |
566 hInfo->num_front_channels = hDecoder->pce.num_front_channels; | |
567 hInfo->num_side_channels = hDecoder->pce.num_side_channels; | |
568 hInfo->num_back_channels = hDecoder->pce.num_back_channels; | |
569 hInfo->num_lfe_channels = hDecoder->pce.num_lfe_channels; | |
570 | |
571 chdir = hInfo->num_front_channels; | |
572 if (chdir & 1) | |
573 { | |
574 hInfo->channel_position[chpos++] = FRONT_CHANNEL_CENTER; | |
575 chdir--; | |
576 } | |
577 for (i = 0; i < chdir; i += 2) | |
578 { | |
579 hInfo->channel_position[chpos++] = FRONT_CHANNEL_LEFT; | |
580 hInfo->channel_position[chpos++] = FRONT_CHANNEL_RIGHT; | |
581 } | |
582 | |
583 for (i = 0; i < hInfo->num_side_channels; i += 2) | |
584 { | |
585 hInfo->channel_position[chpos++] = SIDE_CHANNEL_LEFT; | |
586 hInfo->channel_position[chpos++] = SIDE_CHANNEL_RIGHT; | |
587 } | |
588 | |
589 chdir = hInfo->num_back_channels; | |
590 if (chdir & 1) | |
591 { | |
592 back_center = 1; | |
593 chdir--; | |
594 } | |
595 for (i = 0; i < chdir; i += 2) | |
596 { | |
597 hInfo->channel_position[chpos++] = BACK_CHANNEL_LEFT; | |
598 hInfo->channel_position[chpos++] = BACK_CHANNEL_RIGHT; | |
599 } | |
600 if (back_center) | |
601 { | |
602 hInfo->channel_position[chpos++] = BACK_CHANNEL_CENTER; | |
603 } | |
604 | |
605 for (i = 0; i < hInfo->num_lfe_channels; i++) | |
606 { | |
607 hInfo->channel_position[chpos++] = LFE_CHANNEL; | |
608 } | |
609 | |
610 } else { | |
611 switch (hDecoder->channelConfiguration) | |
612 { | |
613 case 1: | |
614 hInfo->num_front_channels = 1; | |
615 hInfo->channel_position[0] = FRONT_CHANNEL_CENTER; | |
616 break; | |
617 case 2: | |
618 hInfo->num_front_channels = 2; | |
619 hInfo->channel_position[0] = FRONT_CHANNEL_LEFT; | |
620 hInfo->channel_position[1] = FRONT_CHANNEL_RIGHT; | |
621 break; | |
622 case 3: | |
623 hInfo->num_front_channels = 3; | |
624 hInfo->channel_position[0] = FRONT_CHANNEL_CENTER; | |
625 hInfo->channel_position[1] = FRONT_CHANNEL_LEFT; | |
626 hInfo->channel_position[2] = FRONT_CHANNEL_RIGHT; | |
627 break; | |
628 case 4: | |
629 hInfo->num_front_channels = 3; | |
630 hInfo->num_back_channels = 1; | |
631 hInfo->channel_position[0] = FRONT_CHANNEL_CENTER; | |
632 hInfo->channel_position[1] = FRONT_CHANNEL_LEFT; | |
633 hInfo->channel_position[2] = FRONT_CHANNEL_RIGHT; | |
634 hInfo->channel_position[3] = BACK_CHANNEL_CENTER; | |
635 break; | |
636 case 5: | |
637 hInfo->num_front_channels = 3; | |
638 hInfo->num_back_channels = 2; | |
639 hInfo->channel_position[0] = FRONT_CHANNEL_CENTER; | |
640 hInfo->channel_position[1] = FRONT_CHANNEL_LEFT; | |
641 hInfo->channel_position[2] = FRONT_CHANNEL_RIGHT; | |
642 hInfo->channel_position[3] = BACK_CHANNEL_LEFT; | |
643 hInfo->channel_position[4] = BACK_CHANNEL_RIGHT; | |
644 break; | |
645 case 6: | |
646 hInfo->num_front_channels = 3; | |
647 hInfo->num_back_channels = 2; | |
648 hInfo->num_lfe_channels = 1; | |
649 hInfo->channel_position[0] = FRONT_CHANNEL_CENTER; | |
650 hInfo->channel_position[1] = FRONT_CHANNEL_LEFT; | |
651 hInfo->channel_position[2] = FRONT_CHANNEL_RIGHT; | |
652 hInfo->channel_position[3] = BACK_CHANNEL_LEFT; | |
653 hInfo->channel_position[4] = BACK_CHANNEL_RIGHT; | |
654 hInfo->channel_position[5] = LFE_CHANNEL; | |
655 break; | |
656 case 7: | |
657 hInfo->num_front_channels = 3; | |
658 hInfo->num_side_channels = 2; | |
659 hInfo->num_back_channels = 2; | |
660 hInfo->num_lfe_channels = 1; | |
661 hInfo->channel_position[0] = FRONT_CHANNEL_CENTER; | |
662 hInfo->channel_position[1] = FRONT_CHANNEL_LEFT; | |
663 hInfo->channel_position[2] = FRONT_CHANNEL_RIGHT; | |
664 hInfo->channel_position[3] = SIDE_CHANNEL_LEFT; | |
665 hInfo->channel_position[4] = SIDE_CHANNEL_RIGHT; | |
666 hInfo->channel_position[5] = BACK_CHANNEL_LEFT; | |
667 hInfo->channel_position[6] = BACK_CHANNEL_RIGHT; | |
668 hInfo->channel_position[7] = LFE_CHANNEL; | |
669 break; | |
670 default: /* channelConfiguration == 0 || channelConfiguration > 7 */ | |
671 { | |
672 uint8_t i; | |
673 uint8_t ch = hDecoder->fr_channels - hDecoder->has_lfe; | |
674 if (ch & 1) /* there's either a center front or a center back channel */ | |
675 { | |
676 uint8_t ch1 = (ch-1)/2; | |
677 if (hDecoder->first_syn_ele == ID_SCE) | |
678 { | |
679 hInfo->num_front_channels = ch1 + 1; | |
680 hInfo->num_back_channels = ch1; | |
681 hInfo->channel_position[0] = FRONT_CHANNEL_CENTER; | |
682 for (i = 1; i <= ch1; i+=2) | |
683 { | |
684 hInfo->channel_position[i] = FRONT_CHANNEL_LEFT; | |
685 hInfo->channel_position[i+1] = FRONT_CHANNEL_RIGHT; | |
686 } | |
687 for (i = ch1+1; i < ch; i+=2) | |
688 { | |
689 hInfo->channel_position[i] = BACK_CHANNEL_LEFT; | |
690 hInfo->channel_position[i+1] = BACK_CHANNEL_RIGHT; | |
691 } | |
692 } else { | |
693 hInfo->num_front_channels = ch1; | |
694 hInfo->num_back_channels = ch1 + 1; | |
695 for (i = 0; i < ch1; i+=2) | |
696 { | |
697 hInfo->channel_position[i] = FRONT_CHANNEL_LEFT; | |
698 hInfo->channel_position[i+1] = FRONT_CHANNEL_RIGHT; | |
699 } | |
700 for (i = ch1; i < ch-1; i+=2) | |
701 { | |
702 hInfo->channel_position[i] = BACK_CHANNEL_LEFT; | |
703 hInfo->channel_position[i+1] = BACK_CHANNEL_RIGHT; | |
704 } | |
705 hInfo->channel_position[ch-1] = BACK_CHANNEL_CENTER; | |
706 } | |
707 } else { | |
708 uint8_t ch1 = (ch)/2; | |
709 hInfo->num_front_channels = ch1; | |
710 hInfo->num_back_channels = ch1; | |
711 if (ch1 & 1) | |
712 { | |
713 hInfo->channel_position[0] = FRONT_CHANNEL_CENTER; | |
714 for (i = 1; i <= ch1; i+=2) | |
715 { | |
716 hInfo->channel_position[i] = FRONT_CHANNEL_LEFT; | |
717 hInfo->channel_position[i+1] = FRONT_CHANNEL_RIGHT; | |
718 } | |
719 for (i = ch1+1; i < ch-1; i+=2) | |
720 { | |
721 hInfo->channel_position[i] = BACK_CHANNEL_LEFT; | |
722 hInfo->channel_position[i+1] = BACK_CHANNEL_RIGHT; | |
723 } | |
724 hInfo->channel_position[ch-1] = BACK_CHANNEL_CENTER; | |
725 } else { | |
726 for (i = 0; i < ch1; i+=2) | |
727 { | |
728 hInfo->channel_position[i] = FRONT_CHANNEL_LEFT; | |
729 hInfo->channel_position[i+1] = FRONT_CHANNEL_RIGHT; | |
730 } | |
731 for (i = ch1; i < ch; i+=2) | |
732 { | |
733 hInfo->channel_position[i] = BACK_CHANNEL_LEFT; | |
734 hInfo->channel_position[i+1] = BACK_CHANNEL_RIGHT; | |
735 } | |
736 } | |
737 } | |
738 hInfo->num_lfe_channels = hDecoder->has_lfe; | |
739 for (i = ch; i < hDecoder->fr_channels; i++) | |
740 { | |
741 hInfo->channel_position[i] = LFE_CHANNEL; | |
742 } | |
743 } | |
744 break; | |
745 } | |
746 } | |
747 } | |
748 | |
13453
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
749 void* NEAACDECAPI NeAACDecDecode(NeAACDecHandle hDecoder, |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
750 NeAACDecFrameInfo *hInfo, |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
751 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
|
752 { |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
753 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
|
754 } |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
755 |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
756 void* NEAACDECAPI NeAACDecDecode2(NeAACDecHandle hDecoder, |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
757 NeAACDecFrameInfo *hInfo, |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
758 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
|
759 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
|
760 { |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
761 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
|
762 { |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
763 hInfo->error = 27; |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
764 return NULL; |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
765 } |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
766 |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
767 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
|
768 sample_buffer, sample_buffer_size); |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
769 } |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
770 |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
771 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
|
772 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
|
773 void **sample_buffer2, uint32_t sample_buffer_size) |
10725 | 774 { |
12527 | 775 uint8_t channels = 0; |
10725 | 776 uint8_t output_channels = 0; |
12527 | 777 bitfile ld; |
10989 | 778 uint32_t bitsconsumed; |
12527 | 779 uint16_t frame_len; |
780 void *sample_buffer; | |
25836
bc425ba00960
added code to check and handle the presence of LATM streams in the init() and decode() functions
nicodvb
parents:
25835
diff
changeset
|
781 uint32_t startbit=0, endbit=0, payload_bits=0; |
12527 | 782 |
783 #ifdef PROFILE | |
784 int64_t count = faad_get_ts(); | |
10989 | 785 #endif |
10725 | 786 |
10989 | 787 /* safety checks */ |
12527 | 788 if ((hDecoder == NULL) || (hInfo == NULL) || (buffer == NULL)) |
10989 | 789 { |
790 return NULL; | |
791 } | |
10725 | 792 |
13453
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
793 #if 0 |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
794 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
|
795 #endif |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
796 |
10989 | 797 frame_len = hDecoder->frameLength; |
10725 | 798 |
799 | |
13453
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
800 memset(hInfo, 0, sizeof(NeAACDecFrameInfo)); |
10989 | 801 memset(hDecoder->internal_channel, 0, MAX_CHANNELS*sizeof(hDecoder->internal_channel[0])); |
10725 | 802 |
803 /* initialize the bitstream */ | |
12527 | 804 faad_initbits(&ld, buffer, buffer_size); |
10725 | 805 |
13453
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
806 #if 0 |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
807 { |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
808 int i; |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
809 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
|
810 { |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
811 uint8_t *buf; |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
812 uint32_t temp = 0; |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
813 buf = faad_getbitbuffer(&ld, 32); |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
814 //temp = getdword((void*)buf); |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
815 temp = *((uint32_t*)buf); |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
816 printf("0x%.8X\n", temp); |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
817 free(buf); |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
818 } |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
819 faad_endbits(&ld); |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
820 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
|
821 } |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
822 #endif |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
823 |
25836
bc425ba00960
added code to check and handle the presence of LATM streams in the init() and decode() functions
nicodvb
parents:
25835
diff
changeset
|
824 if(hDecoder->latm_header_present) |
bc425ba00960
added code to check and handle the presence of LATM streams in the init() and decode() functions
nicodvb
parents:
25835
diff
changeset
|
825 { |
bc425ba00960
added code to check and handle the presence of LATM streams in the init() and decode() functions
nicodvb
parents:
25835
diff
changeset
|
826 payload_bits = faad_latm_frame(&hDecoder->latm_config, &ld); |
bc425ba00960
added code to check and handle the presence of LATM streams in the init() and decode() functions
nicodvb
parents:
25835
diff
changeset
|
827 startbit = faad_get_processed_bits(&ld); |
bc425ba00960
added code to check and handle the presence of LATM streams in the init() and decode() functions
nicodvb
parents:
25835
diff
changeset
|
828 if(payload_bits == -1U) |
bc425ba00960
added code to check and handle the presence of LATM streams in the init() and decode() functions
nicodvb
parents:
25835
diff
changeset
|
829 { |
bc425ba00960
added code to check and handle the presence of LATM streams in the init() and decode() functions
nicodvb
parents:
25835
diff
changeset
|
830 hInfo->error = 1; |
bc425ba00960
added code to check and handle the presence of LATM streams in the init() and decode() functions
nicodvb
parents:
25835
diff
changeset
|
831 goto error; |
bc425ba00960
added code to check and handle the presence of LATM streams in the init() and decode() functions
nicodvb
parents:
25835
diff
changeset
|
832 } |
bc425ba00960
added code to check and handle the presence of LATM streams in the init() and decode() functions
nicodvb
parents:
25835
diff
changeset
|
833 } |
bc425ba00960
added code to check and handle the presence of LATM streams in the init() and decode() functions
nicodvb
parents:
25835
diff
changeset
|
834 |
10725 | 835 #ifdef DRM |
12527 | 836 if (hDecoder->object_type == DRM_ER_LC) |
10725 | 837 { |
12527 | 838 /* 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
|
839 if (0) //(hDecoder->channelConfiguration == 2) |
12527 | 840 { |
841 hInfo->error = 8; // Throw CRC error | |
842 goto error; | |
843 } | |
844 | |
845 faad_getbits(&ld, 8 | |
13453
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
846 DEBUGVAR(1,1,"NeAACDecDecode(): skip CRC")); |
10725 | 847 } |
848 #endif | |
849 | |
850 if (hDecoder->adts_header_present) | |
851 { | |
12527 | 852 adts_header adts; |
853 | |
10989 | 854 adts.old_format = hDecoder->config.useOldADTSFormat; |
12527 | 855 if ((hInfo->error = adts_frame(&adts, &ld)) > 0) |
10725 | 856 goto error; |
857 | |
858 /* MPEG2 does byte_alignment() here, | |
859 * but ADTS header is always multiple of 8 bits in MPEG2 | |
860 * so not needed to actually do it. | |
861 */ | |
862 } | |
863 | |
864 #ifdef ANALYSIS | |
865 dbg_count = 0; | |
866 #endif | |
867 | |
12527 | 868 /* decode the complete bitstream */ |
869 #ifdef SCALABLE_DEC | |
870 if ((hDecoder->object_type == 6) || (hDecoder->object_type == DRM_ER_LC)) | |
871 { | |
872 aac_scalable_main_element(hDecoder, hInfo, &ld, &hDecoder->pce, hDecoder->drc); | |
873 } else { | |
874 #endif | |
875 raw_data_block(hDecoder, hInfo, &ld, &hDecoder->pce, hDecoder->drc); | |
876 #ifdef SCALABLE_DEC | |
877 } | |
878 #endif | |
10725 | 879 |
25836
bc425ba00960
added code to check and handle the presence of LATM streams in the init() and decode() functions
nicodvb
parents:
25835
diff
changeset
|
880 if(hDecoder->latm_header_present) |
bc425ba00960
added code to check and handle the presence of LATM streams in the init() and decode() functions
nicodvb
parents:
25835
diff
changeset
|
881 { |
bc425ba00960
added code to check and handle the presence of LATM streams in the init() and decode() functions
nicodvb
parents:
25835
diff
changeset
|
882 endbit = faad_get_processed_bits(&ld); |
bc425ba00960
added code to check and handle the presence of LATM streams in the init() and decode() functions
nicodvb
parents:
25835
diff
changeset
|
883 if(endbit-startbit > payload_bits) |
bc425ba00960
added code to check and handle the presence of LATM streams in the init() and decode() functions
nicodvb
parents:
25835
diff
changeset
|
884 fprintf(stderr, "\r\nERROR, too many payload bits read: %u > %d. Please. report with a link to a sample\n", |
bc425ba00960
added code to check and handle the presence of LATM streams in the init() and decode() functions
nicodvb
parents:
25835
diff
changeset
|
885 endbit-startbit, payload_bits); |
bc425ba00960
added code to check and handle the presence of LATM streams in the init() and decode() functions
nicodvb
parents:
25835
diff
changeset
|
886 if(hDecoder->latm_config.otherDataLenBits > 0) |
bc425ba00960
added code to check and handle the presence of LATM streams in the init() and decode() functions
nicodvb
parents:
25835
diff
changeset
|
887 faad_getbits(&ld, hDecoder->latm_config.otherDataLenBits); |
bc425ba00960
added code to check and handle the presence of LATM streams in the init() and decode() functions
nicodvb
parents:
25835
diff
changeset
|
888 faad_byte_align(&ld); |
bc425ba00960
added code to check and handle the presence of LATM streams in the init() and decode() functions
nicodvb
parents:
25835
diff
changeset
|
889 } |
bc425ba00960
added code to check and handle the presence of LATM streams in the init() and decode() functions
nicodvb
parents:
25835
diff
changeset
|
890 |
10725 | 891 channels = hDecoder->fr_channels; |
892 | |
893 if (hInfo->error > 0) | |
894 goto error; | |
895 | |
12527 | 896 /* safety check */ |
897 if (channels == 0 || channels > MAX_CHANNELS) | |
898 { | |
899 /* invalid number of channels */ | |
900 hInfo->error = 12; | |
901 goto error; | |
902 } | |
10725 | 903 |
904 /* no more bit reading after this */ | |
12527 | 905 bitsconsumed = faad_get_processed_bits(&ld); |
10989 | 906 hInfo->bytesconsumed = bit2byte(bitsconsumed); |
12527 | 907 if (ld.error) |
10725 | 908 { |
909 hInfo->error = 14; | |
910 goto error; | |
911 } | |
12527 | 912 faad_endbits(&ld); |
10989 | 913 |
914 | |
25836
bc425ba00960
added code to check and handle the presence of LATM streams in the init() and decode() functions
nicodvb
parents:
25835
diff
changeset
|
915 if (!hDecoder->adts_header_present && !hDecoder->adif_header_present && !hDecoder->latm_header_present) |
10725 | 916 { |
13453
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
917 if (hDecoder->channelConfiguration == 0) |
10725 | 918 hDecoder->channelConfiguration = channels; |
919 | |
920 if (channels == 8) /* 7.1 */ | |
921 hDecoder->channelConfiguration = 7; | |
922 if (channels == 7) /* not a standard channelConfiguration */ | |
923 hDecoder->channelConfiguration = 0; | |
924 } | |
925 | |
926 if ((channels == 5 || channels == 6) && hDecoder->config.downMatrix) | |
927 { | |
928 hDecoder->downMatrix = 1; | |
929 output_channels = 2; | |
930 } else { | |
931 output_channels = channels; | |
932 } | |
933 | |
13453
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
934 #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
|
935 hDecoder->upMatrix = 0; |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
936 /* 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
|
937 if (output_channels == 1) |
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 /* 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
|
940 hDecoder->upMatrix = 1; |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
941 output_channels = 2; |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
942 } |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
943 #endif |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
944 |
10725 | 945 /* Make a channel configuration based on either a PCE or a channelConfiguration */ |
946 create_channel_config(hDecoder, hInfo); | |
947 | |
948 /* number of samples in this frame */ | |
949 hInfo->samples = frame_len*output_channels; | |
950 /* number of channels in this frame */ | |
951 hInfo->channels = output_channels; | |
952 /* samplerate */ | |
10989 | 953 hInfo->samplerate = get_sample_rate(hDecoder->sf_index); |
954 /* object type */ | |
955 hInfo->object_type = hDecoder->object_type; | |
956 /* sbr */ | |
957 hInfo->sbr = NO_SBR; | |
958 /* header type */ | |
959 hInfo->header_type = RAW; | |
960 if (hDecoder->adif_header_present) | |
961 hInfo->header_type = ADIF; | |
962 if (hDecoder->adts_header_present) | |
963 hInfo->header_type = ADTS; | |
25836
bc425ba00960
added code to check and handle the presence of LATM streams in the init() and decode() functions
nicodvb
parents:
25835
diff
changeset
|
964 if (hDecoder->latm_header_present) |
bc425ba00960
added code to check and handle the presence of LATM streams in the init() and decode() functions
nicodvb
parents:
25835
diff
changeset
|
965 hInfo->header_type = LATM; |
18141 | 966 #if (defined(PS_DEC) || defined(DRM_PS)) |
967 hInfo->ps = hDecoder->ps_used_global; | |
968 #endif | |
10725 | 969 |
970 /* check if frame has channel elements */ | |
971 if (channels == 0) | |
972 { | |
973 hDecoder->frame++; | |
974 return NULL; | |
975 } | |
976 | |
12527 | 977 /* allocate the buffer for the final samples */ |
978 if ((hDecoder->sample_buffer == NULL) || | |
979 (hDecoder->alloced_channels != output_channels)) | |
10725 | 980 { |
12527 | 981 static const uint8_t str[] = { sizeof(int16_t), sizeof(int32_t), sizeof(int32_t), |
982 sizeof(float32_t), sizeof(double), sizeof(int16_t), sizeof(int16_t), | |
983 sizeof(int16_t), sizeof(int16_t), 0, 0, 0 | |
984 }; | |
985 uint8_t stride = str[hDecoder->config.outputFormat-1]; | |
10725 | 986 #ifdef SBR_DEC |
13453
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
987 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
|
988 { |
12527 | 989 stride = 2 * stride; |
13453
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
990 } |
10725 | 991 #endif |
13453
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
992 /* 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
|
993 if (sample_buffer_size == 0) |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
994 { |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
995 if (hDecoder->sample_buffer) |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
996 faad_free(hDecoder->sample_buffer); |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
997 hDecoder->sample_buffer = NULL; |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
998 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
|
999 } 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
|
1000 /* 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
|
1001 hInfo->error = 27; |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
1002 return NULL; |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
1003 } |
12527 | 1004 hDecoder->alloced_channels = output_channels; |
10725 | 1005 } |
1006 | |
13453
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
1007 if (sample_buffer_size == 0) |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
1008 { |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
1009 sample_buffer = hDecoder->sample_buffer; |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
1010 } else { |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
1011 sample_buffer = *sample_buffer2; |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
1012 } |
10725 | 1013 |
1014 #ifdef SBR_DEC | |
10989 | 1015 if ((hDecoder->sbr_present_flag == 1) || (hDecoder->forceUpSampling == 1)) |
10725 | 1016 { |
12527 | 1017 uint8_t ele; |
10989 | 1018 |
12527 | 1019 /* 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
|
1020 if (!hDecoder->downSampledSBR) |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
1021 { |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
1022 frame_len *= 2; |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
1023 hInfo->samples *= 2; |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
1024 hInfo->samplerate *= 2; |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
1025 } |
12527 | 1026 |
1027 /* check if every element was provided with SBR data */ | |
1028 for (ele = 0; ele < hDecoder->fr_ch_ele; ele++) | |
1029 { | |
1030 if (hDecoder->sbr[ele] == NULL) | |
1031 { | |
1032 hInfo->error = 25; | |
1033 goto error; | |
1034 } | |
1035 } | |
1036 | |
10989 | 1037 /* sbr */ |
1038 if (hDecoder->sbr_present_flag == 1) | |
1039 { | |
1040 hInfo->object_type = HE_AAC; | |
1041 hInfo->sbr = SBR_UPSAMPLED; | |
1042 } else { | |
1043 hInfo->sbr = NO_SBR_UPSAMPLED; | |
1044 } | |
13453
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
1045 if (hDecoder->downSampledSBR) |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
1046 { |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
1047 hInfo->sbr = SBR_DOWNSAMPLED; |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
1048 } |
10725 | 1049 } |
1050 #endif | |
1051 | |
12527 | 1052 sample_buffer = output_to_PCM(hDecoder, hDecoder->time_out, sample_buffer, |
1053 output_channels, frame_len, hDecoder->config.outputFormat); | |
1054 | |
1055 | |
10725 | 1056 hDecoder->postSeekResetFlag = 0; |
1057 | |
1058 hDecoder->frame++; | |
1059 #ifdef LD_DEC | |
12527 | 1060 if (hDecoder->object_type != LD) |
10725 | 1061 { |
1062 #endif | |
1063 if (hDecoder->frame <= 1) | |
1064 hInfo->samples = 0; | |
1065 #ifdef LD_DEC | |
1066 } else { | |
1067 /* LD encoders will give lower delay */ | |
1068 if (hDecoder->frame <= 0) | |
1069 hInfo->samples = 0; | |
1070 } | |
1071 #endif | |
1072 | |
1073 /* cleanup */ | |
1074 #ifdef ANALYSIS | |
1075 fflush(stdout); | |
1076 #endif | |
1077 | |
12527 | 1078 #ifdef PROFILE |
1079 count = faad_get_ts() - count; | |
1080 hDecoder->cycles += count; | |
1081 #endif | |
1082 | |
10725 | 1083 return sample_buffer; |
1084 | |
1085 error: | |
12527 | 1086 |
1087 faad_endbits(&ld); | |
10725 | 1088 |
1089 /* cleanup */ | |
1090 #ifdef ANALYSIS | |
1091 fflush(stdout); | |
1092 #endif | |
1093 | |
1094 return NULL; | |
1095 } |