• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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