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 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