1 /* ------------------------------------------------------------------
2 * Copyright (C) 1998-2009 PacketVideo
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
13 * express or implied.
14 * See the License for the specific language governing permissions
15 * and limitations under the License.
16 * -------------------------------------------------------------------
17 */
18 /*
19
20 Pathname: pvmp4setaudioconfigg
21
22 ------------------------------------------------------------------------------
23 REVISION HISTORY
24
25 Who: Date:
26 Description:
27
28 ------------------------------------------------------------------------------
29 INPUT AND OUTPUT DEFINITIONS
30
31 Inputs:
32 pExt = pointer to the external interface structure. See the file
33 PVMP4AudioDecoder_API.h for a description of each field.
34 Data type of pointer to a tPVMP4AudioDecoderExternal
35 structure.
36
37 pExt->pInputBuffer: pointer to input buffer containing input
38 bitstream
39
40 pExt->inputBufferCurrentLength: number of bytes in the input buffer
41
42 pExt->inputBufferUsedLength: number of bytes already consumed in
43 input buffer
44
45 pExt->remainderBits: number of bits consumed in addition to
46 pExt->inputBufferUsedLength
47
48 pMem = void pointer to hide the internal implementation of the library
49 It is cast back to a tDec_Int_File structure. This structure
50 contains information that needs to persist between calls to
51 this function, or is too big to be placed on the stack, even
52 though the data is only needed during execution of this function
53 Data type void pointer, internally pointer to a tDec_Int_File
54 structure.
55
56 Local Stores/Buffers/Pointers Needed: None
57 (The memory set aside in pMem performs this task)
58
59 Global Stores/Buffers/Pointers Needed: None
60
61 Outputs:
62 status = 0 if no error occurred
63 MP4AUDEC_NONRECOVERABLE if a non-recoverable error occurred
64 MP4AUDEC_RECOVERABLE if a recoverable error occurred.
65 Presently a recoverable error does not exist, but this
66 was a requirement.
67
68
69 Pointers and Buffers Modified:
70 pMem contents are modified.
71 pExt: (more detail in the file PVMP4AudioDecoder_API.h)
72 inputBufferUsedLength - number of array elements used up by the stream.
73 remainderBits - remaining bits in the next UInt32 buffer
74 samplingRate - sampling rate in samples per sec
75 encodedChannels - channels found on the file (informative)
76 frameLength - length of the frame
77
78 Local Stores Modified: None.
79
80 Global Stores Modified: None.
81
82 ------------------------------------------------------------------------------
83 FUNCTION DESCRIPTION
84
85
86 ------------------------------------------------------------------------------
87 REQUIREMENTS
88
89 PacketVideo Document # CCC-AUD-AAC-ERS-0003
90
91 ------------------------------------------------------------------------------
92 REFERENCES
93
94
95 ------------------------------------------------------------------------------
96 RESOURCES USED
97 When the code is written for a specific target processor the
98 the resources used should be documented below.
99
100 STACK USAGE: [stack count for this module] + [variable to represent
101 stack usage for each subroutine called]
102
103 where: [stack usage variable] = stack usage for [subroutine
104 name] (see [filename].ext)
105
106 DATA MEMORY USED: x words
107
108 PROGRAM MEMORY USED: x words
109
110 CLOCK CYCLES: [cycle count equation for this module] + [variable
111 used to represent cycle count for each subroutine
112 called]
113
114 where: [cycle count variable] = cycle count for [subroutine
115 name] (see [filename].ext)
116
117 ------------------------------------------------------------------------------
118 */
119
120
121 /*----------------------------------------------------------------------------
122 ; INCLUDES
123 ----------------------------------------------------------------------------*/
124
125 #include "pv_audio_type_defs.h"
126 #include "s_tdec_int_file.h"
127 #include "ibstream.h" /* where #define INBUF_ARRAY_INDEX_SHIFT */
128 #include "sfb.h" /* Where samp_rate_info[] is declared */
129
130 #include "get_audio_specific_config.h"
131 #include "pvmp4audiodecoder_api.h" /* Where this function is declared */
132 #include "set_mc_info.h"
133
134 /*----------------------------------------------------------------------------
135 ; MACROS
136 ; Define module specific macros here
137 ----------------------------------------------------------------------------*/
138
139 /*----------------------------------------------------------------------------
140 ; DEFINES
141 ; Include all pre-processor statements here. Include conditional
142 ; compile variables also.
143 ----------------------------------------------------------------------------*/
144
145
146 /*----------------------------------------------------------------------------
147 ; LOCAL FUNCTION DEFINITIONS
148 ; Function Prototype declaration
149 ----------------------------------------------------------------------------*/
150
151 /*----------------------------------------------------------------------------
152 ; LOCAL STORE/BUFFER/POINTER DEFINITIONS
153 ; Variable declaration - defined here and used outside this module
154 ----------------------------------------------------------------------------*/
155
156 /*----------------------------------------------------------------------------
157 ; EXTERNAL FUNCTION REFERENCES
158 ; Declare functions defined elsewhere and referenced in this module
159 ----------------------------------------------------------------------------*/
160
161 /*----------------------------------------------------------------------------
162 ; EXTERNAL GLOBAL STORE/BUFFER/POINTER REFERENCES
163 ; Declare variables used in this module but defined elsewhere
164 ----------------------------------------------------------------------------*/
165
166 /*----------------------------------------------------------------------------
167 ; FUNCTION CODE
168 ----------------------------------------------------------------------------*/
169
PVMP4SetAudioConfig(tPVMP4AudioDecoderExternal * pExt,void * pMem,Int upsamplingFactor,Int samp_rate,Int num_ch,tMP4AudioObjectType audioObjectType)170 Int PVMP4SetAudioConfig(
171 tPVMP4AudioDecoderExternal *pExt,
172 void *pMem,
173 Int upsamplingFactor,
174 Int samp_rate,
175 Int num_ch,
176 tMP4AudioObjectType audioObjectType)
177
178 {
179
180 tDec_Int_File *pVars; /* Helper pointer */
181
182 Int status = MP4AUDEC_INCOMPLETE_FRAME;
183
184 /*
185 * Initialize "helper" pointers to existing memory.
186 */
187 pVars = (tDec_Int_File *)pMem;
188 /*
189 * Translate input buffer variables.
190 */
191 pVars->inputStream.pBuffer = pExt->pInputBuffer;
192
193 pVars->inputStream.availableBits = 0;
194
195 pVars->inputStream.usedBits = 0;
196
197
198
199 /*
200 * get sampling rate index
201 */
202
203 switch (samp_rate)
204 {
205 case 96000:
206 pVars->prog_config.sampling_rate_idx = 0;
207 break;
208 case 88200:
209 pVars->prog_config.sampling_rate_idx = 1;
210 break;
211 case 64000:
212 pVars->prog_config.sampling_rate_idx = 2;
213 break;
214 case 48000:
215 pVars->prog_config.sampling_rate_idx = 3;
216 break;
217 case 44100:
218 pVars->prog_config.sampling_rate_idx = 4;
219 break;
220 case 32000:
221 pVars->prog_config.sampling_rate_idx = 5;
222 break;
223 case 24000:
224 pVars->prog_config.sampling_rate_idx = 6;
225 break;
226 case 22050:
227 pVars->prog_config.sampling_rate_idx = 7;
228 break;
229 case 16000:
230 pVars->prog_config.sampling_rate_idx = 8;
231 break;
232 case 12000:
233 pVars->prog_config.sampling_rate_idx = 9;
234 break;
235 case 11025:
236 pVars->prog_config.sampling_rate_idx = 10;
237 break;
238 case 8000:
239 pVars->prog_config.sampling_rate_idx = 11;
240 break;
241 case 7350:
242 pVars->prog_config.sampling_rate_idx = 12;
243 break;
244 default:
245 status = -1;
246
247 break;
248 }
249
250 pVars->mc_info.sbrPresentFlag = 0;
251 pVars->mc_info.psPresentFlag = 0;
252 #ifdef AAC_PLUS
253 pVars->mc_info.bDownSampledSbr = 0;
254 #endif
255 pVars->mc_info.implicit_channeling = 0;
256 pVars->mc_info.nch = num_ch;
257 pVars->mc_info.upsamplingFactor = upsamplingFactor;
258
259
260 /*
261 * Set number of channels
262 */
263
264 if (num_ch == 2)
265 {
266 pVars->prog_config.front.ele_is_cpe[0] = 1;
267 }
268 else if (num_ch == 1)
269 {
270 pVars->prog_config.front.ele_is_cpe[0] = 0;
271 }
272 else
273 {
274 status = -1; /* do not support more than two channels */
275 pVars->status = status;
276 return (status);
277 }
278
279
280 /*
281 * Set AAC bitstream
282 */
283
284 if ((audioObjectType == MP4AUDIO_AAC_LC) ||
285 (audioObjectType == MP4AUDIO_LTP))
286 {
287 pVars->aacPlusEnabled = false;
288
289 status = set_mc_info(&(pVars->mc_info),
290 audioObjectType, /* previously profile */
291 pVars->prog_config.sampling_rate_idx,
292 pVars->prog_config.front.ele_tag[0],
293 pVars->prog_config.front.ele_is_cpe[0],
294 pVars->winmap, /*pVars->pWinSeqInfo,*/
295 pVars->SFBWidth128);
296 }
297 else if ((audioObjectType == MP4AUDIO_SBR) ||
298 (audioObjectType == MP4AUDIO_PS))
299 {
300 pVars->aacPlusEnabled = true;
301
302
303 status = set_mc_info(&(pVars->mc_info),
304 MP4AUDIO_AAC_LC,
305 pVars->prog_config.sampling_rate_idx,
306 pVars->prog_config.front.ele_tag[0],
307 pVars->prog_config.front.ele_is_cpe[0],
308 pVars->winmap, /*pVars->pWinSeqInfo,*/
309 pVars->SFBWidth128);
310
311 pVars->mc_info.sbrPresentFlag = 1;
312 if (audioObjectType == MP4AUDIO_PS)
313 {
314 pVars->mc_info.psPresentFlag = 1;
315 }
316
317 if (upsamplingFactor == 1)
318 {
319 #ifdef AAC_PLUS
320 pVars->mc_info.bDownSampledSbr = 1;
321 #endif
322
323 /*
324 * Disable SBR decoding for any sbr-downsampled file whose SF is >= 24 KHz
325 */
326 if (pVars->prog_config.sampling_rate_idx < 6)
327 {
328 pVars->aacPlusEnabled = false;
329 }
330 }
331
332 }
333 else
334 {
335 status = -1;
336 }
337
338
339 /*
340 * Translate from units of bits back into units of words.
341 */
342 pExt->inputBufferUsedLength = 0;
343
344 pExt->remainderBits = 0;
345
346 pVars->bno++;
347
348 pExt->samplingRate = samp_rate * upsamplingFactor;
349
350 pExt->aacPlusEnabled = pVars->aacPlusEnabled;
351
352 /*
353 * we default to 2 channel, even for mono files, (where channels have same content)
354 * this is done to ensure support for enhanced aac+ with implicit signalling
355 */
356
357 pExt->encodedChannels = 2;
358
359 pExt->frameLength = 1024;
360 #ifdef AAC_PLUS
361 pExt->aacPlusUpsamplingFactor = upsamplingFactor;
362 #endif
363
364 pVars->status = status;
365
366 return (status);
367
368 } /* PVMP4AudioDecoderDecodeFrame */
369