1dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/* ------------------------------------------------------------------ 2dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * Copyright (C) 1998-2009 PacketVideo 3dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * 4dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * Licensed under the Apache License, Version 2.0 (the "License"); 5dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * you may not use this file except in compliance with the License. 6dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * You may obtain a copy of the License at 7dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * 8dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * http://www.apache.org/licenses/LICENSE-2.0 9dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * 10dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * Unless required by applicable law or agreed to in writing, software 11dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * distributed under the License is distributed on an "AS IS" BASIS, 12dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either 13dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * express or implied. 14dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * See the License for the specific language governing permissions 15dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * and limitations under the License. 16dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * ------------------------------------------------------------------- 17dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber */ 18dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/* 19dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 20dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Pathname: pvmp4audiodecodeframe 21dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 22dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber------------------------------------------------------------------------------ 23dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber REVISION HISTORY 24dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 25dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Description: Modified from original shareware code 26dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 27dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Description: Pulled in loop structure from console.c, so that this function 28dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber now decodes all frames in the file. 29dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 30dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Original program used several global variables. These have been 31dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber eliminated, except for situations in which the global variables 32dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber could be converted into const types. Otherwise, they are passed 33dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber by reference through the functions. 34dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 35dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Description: Begin mods for file I/O removal 36dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 37dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Description: Merged trans4m_freq_2_time, trans4m_time_2_freq, etc. 38dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 39dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Description: Removing commented out sections of code. This includes the 40dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber removal of unneeded functions init_lt_pred, reset_mc_info, 41dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 42dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Description: Copied from aac_decode_frame.c and renamed file, 43dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Made many changes. 44dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 45dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Description: Prepare for code review 46dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 47dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Description: Update per review comments: 48dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1) Add comment about leaveGetLoop 49dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 2) Remove inverseTNSCoef array 50dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 3) fix wnd_shape_this_bk to wnd_shape_prev_bk in F to T 51dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 4) Clean up comments 52dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 5) Change call to long_term_synthesis 53dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 54dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Description: Remove division for calculation of bitrate. 55dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 56dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Description: Remove update of LTP buffers if not LTP audio object type. 57dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 58dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Description: Add hasmask to call to right_ch_sfb_tools_ms 59dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 60dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Description: 61dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Modified to call ltp related routines on the left channel 62dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber before intensity is called on the right channel. The previous version 63dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber was causing a problem when IS was used on the right channel and LTP 64dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber on the left channel for the same scalefactor band. 65dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 66dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber This fix required creating a new function, apply_ms_synt, deleting another 67dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber function (right_ch_sfb_tools_noms.c), and modifying the calling order of 68dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber the other functions. 69dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 70dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Description: Made changes per review comments. 71dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 72dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Description: Changed name of right_ch_sfb_tools_ms to pns_intensity_right 73dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 74dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Description: Added cast, since pVars->inputStream.usedBits is UInt, and 75dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pExt->remainderBits is Int. 76dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 77dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pExt->remainderBits = 78dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber (Int)(pVars->inputStream.usedBits & INBUF_BIT_MODULO_MASK); 79dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 80dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Description: Modified to pass a pointer to scratch memory into 81dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber tns_setup_filter.c 82dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 83dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Description: Removed include of "s_TNSInfo.h" 84dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 85dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Description: Removed call to "tns_setup_filter" which has been eliminated 86dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber by merging its functionality into "get_tns" 87dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 88dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Description: Passing in a pointer to a q-format array, rather than 89dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber the address of a single q-format, for the inverse filter case for 90dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber apply_tns. 91dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 92dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Description: 93dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber (1) Added #include of "e_ElementId.h" 94dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Previously, this function was relying on another include file 95dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber to include "e_ElementId.h" 96dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 97dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber (2) Updated the copyright header. 98dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 99dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Description: 100dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Per review comments, declared two temporary variables 101dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 102dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pChLeftShare = pChVars[LEFT]->pShareWfxpCoef; 103dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pChRightShare = pChVars[RIGHT]->pShareWfxpCoef; 104dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 105dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Description: 106dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber long_term_synthesis should have been invoked with max_sfb 107dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber as the 2nd parameter, rather than pFrameInfo->sfb_per_win[0]. 108dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 109dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Old 110dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber long_term_synthesis( 111dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pChVars[ch]->wnd, 112dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pFrameInfo->sfb_per_win[0] ... 113dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 114dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Correction 115dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber long_term_synthesis( 116dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pChVars[ch]->wnd, 117dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pChVars[ch]->pShareWfxpCoef->max_sfb ... 118dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 119dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber This problem caused long_term_synthesis to read memory which 120dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber was not initialized in get_ics_info.c 121dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 122dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Description: 123dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber (1) Utilize scratch memory for the scratch Prog_Config. 124dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 125dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Description: (1) Modified to decode ID_END syntactic element after header 126dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 127dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Description: 128dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber (1) Reconfigured LTP buffer as a circular buffer. This saves 129dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 2048 Int16->Int16 copies per frame. 130dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 131dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Description: Updated so ltp buffers are not used as a wasteful 132dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber intermediate buffer for LC streams. Data is transferred directly 133dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber from the filterbank to the output stream. 134dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 135dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Description: Decode ADIF header if frame count is zero. 136dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber The AudioSpecificConfig is decoded by a separate API. 137dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 138dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Description: Added comments explaining how the ltp_buffer_state 139dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber variable is updated. 140dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 141dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 142dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Description: Modified code to take advantage of new trans4m_freq_2_time_fxp, 143dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber which writes the output directly into a 16-bit output buffer. This 144dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber improvement allows faster operation by reducing the amount of memory 145dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber transfers. Speed can be further improved on most platforms via use of a 146dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber DMA transfer in the function write_output.c 147dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 148dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Description: perChan[] is an array of structures in tDec_Int_File. Made 149dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber corresponding changes. 150dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 151dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Description: Included changes in interface for q_normalize() and 152dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber trans4m_freq_2_time_fxp. 153dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 154dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Description: Included changes in interface for long_term_prediction. 155dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 156dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Description: Added support for DSE (Data Streaming Channel). Added 157dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber function get_dse() and included file get_dse.h 158dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 159dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Description: Added support for the ill-case when a raw data block contains 160dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber only a terminator <ID_END>. This is illegal but is added 161dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber for convinience 162dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 163dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Description: Added support for empty audio frames, such the one containing 164dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber only DSE or FILL elements. A trap was added to stop processing 165dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber when no audio information was sent. 166dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 167dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Description: Added support for adts format files. Added saturation to 168dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber floating point version of aac+ decoding 169dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 170dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Description: 171dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 172dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber------------------------------------------------------------------------------ 173dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber INPUT AND OUTPUT DEFINITIONS 174dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 175dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Inputs: 176dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pExt = pointer to the external interface structure. See the file 177dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber PVMP4AudioDecoder_API.h for a description of each field. 178dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Data type of pointer to a tPVMP4AudioDecoderExternal 179dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber structure. 180dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 181dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pMem = void pointer to hide the internal implementation of the library 182dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber It is cast back to a tDec_Int_File structure. This structure 183dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber contains information that needs to persist between calls to 184dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber this function, or is too big to be placed on the stack, even 185dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber though the data is only needed during execution of this function 186dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Data type void pointer, internally pointer to a tDec_Int_File 187dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber structure. 188dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 189dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Local Stores/Buffers/Pointers Needed: None 190dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber (The memory set aside in pMem performs this task) 191dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 192dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Global Stores/Buffers/Pointers Needed: None 193dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 194dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Outputs: 195dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber status = 0 if no error occurred 196dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber MP4AUDEC_NONRECOVERABLE if a non-recoverable error occurred 197dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber MP4AUDEC_RECOVERABLE if a recoverable error occurred. 198dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Presently a recoverable error does not exist, but this 199dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber was a requirement. 200dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 201dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 202dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Pointers and Buffers Modified: 203dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pMem contents are modified. 204dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pExt: (more detail in the file PVMP4AudioDecoder_API.h) 205dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber inputBufferUsedLength - number of array elements used up by the stream. 206dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber remainderBits - remaining bits in the next UInt32 buffer 207dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber samplingRate - sampling rate in samples per sec 208dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber bitRate - bit rate in bits per second, varies frame to frame. 209dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber encodedChannels - channels found on the file (informative) 210dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber frameLength - length of the frame 211dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 212dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Local Stores Modified: None. 213dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 214dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Global Stores Modified: None. 215dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 216dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber------------------------------------------------------------------------------ 217dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber FUNCTION DESCRIPTION 218dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 219dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Decodes one frame of an MPEG-2/MPEG-4 encoded audio bitstream. 220dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 221dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber This function calls the various components of the decoder in the proper order. 222dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 223dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 224dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Left Channel Right Channel 225dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber | | 226dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber | | 227dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber | | 228dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber \|/ \|/ 229dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber #1 ____________________ #2 ____________________ 230dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber | | | | 231dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber | Huffman Decoding | | Huffman Decoding | 232dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber |__________________| |__________________| 233dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber | | 234dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber | | 235dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber | | 236dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber \|/ | 237dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber #3 ____________________ | 238dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber | | | 239dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber | PNS LEFT | | 240dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber |__________________| | 241dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber | | 242dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber | | 243dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber | | 244dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber \|/ \|/ 245dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber #4 ______________________________________________________________________ 246dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber | | 247dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber | Apply MS_Synt | 248dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber |____________________________________________________________________| 249dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber | | 250dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber | | 251dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber \|/ | 252dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber #5 ____________________ | 253dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber | | W 254dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber | LTP | A 255dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber |__________________| I 256dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber | T 257dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber | | 258dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber | F 259dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber \|/ O 260dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber #6 ____________________ R 261dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber | | | 262dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber | Time -> Freq | L 263dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber |__________________| E 264dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber | F 265dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber | T 266dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber | | 267dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber \|/ C 268dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber #7 ____________________ H 269dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber | | A 270dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber | TNS Inverse | N 271dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber |__________________| N 272dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber | E 273dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber | L 274dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber | | 275dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber \|/ | 276dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber #8 ____________________ | 277dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber | | | 278dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber | Long Term Synth | | 279dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber |__________________| | 280dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber | | 281dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber | \|/ 282dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber | #9 ____________________ 283dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber | | | 284dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber |--DATA ON LEFT CHANNEL MAY BE USED----->| PNS/Intensity Rt | 285dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber | |__________________| 286dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber | | 287dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber | | 288dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber | \|/ 289dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber | #10 ____________________ 290dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber W | | 291dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber A | LTP | 292dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber I |__________________| 293dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber T | 294dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber | | 295dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber F | 296dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber O \|/ 297dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber R #11 ____________________ 298dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber | | | 299dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber R | Time -> Freq | 300dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber I |__________________| 301dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber G | 302dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber H | 303dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber T | 304dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber | \|/ 305dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber C #12 ____________________ 306dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber H | | 307dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber A | TNS Inverse | 308dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber N |__________________| 309dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber N | 310dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber E | 311dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber L | 312dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber | \|/ 313dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber | #13 ____________________ 314dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber | | | 315dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber | | Long Term Synth | 316dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber | |__________________| 317dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber | | 318dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber | | 319dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber | | 320dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber \|/ \|/ 321dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#14 ____________________ #18 ____________________ 322dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber | | | | 323dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber | TNS | | TNS | 324dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber |__________________| |__________________| 325dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber | | 326dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber | | 327dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber | | 328dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber \|/ \|/ 329dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#15 ____________________ #19 ____________________ 330dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber | | | | 331dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber | qFormatNorm | | qFormatNorm | 332dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber |__________________| |__________________| 333dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber | | 334dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber | | 335dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber | | 336dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber \|/ \|/ 337dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#16 ____________________ #20 ____________________ 338dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber | | | | 339dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber | Freq / Time | | Freq / Time | 340dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber |__________________| |__________________| 341dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber | | 342dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber | | 343dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber | | 344dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber \|/ \|/ 345dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#17 ____________________ #21 ____________________ 346dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber | | | | 347dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber | Limit Buffer | | Limit Buffer | 348dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber |__________________| |__________________| 349dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber | | 350dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber | | 351dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber | | 352dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber \|/ \|/ 353dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#22 ______________________________________________________________________ 354dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber | | 355dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber | Write Output | 356dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber |____________________________________________________________________| 357dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 358dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 359dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber------------------------------------------------------------------------------ 360dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber REQUIREMENTS 361dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 362dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber PacketVideo Document # CCC-AUD-AAC-ERS-0003 363dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 364dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber------------------------------------------------------------------------------ 365dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber REFERENCES 366dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 367dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber (1) MPEG-2 NBC Audio Decoder 368dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber "This software module was originally developed by AT&T, Dolby 369dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Laboratories, Fraunhofer Gesellschaft IIS in the course of development 370dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber of the MPEG-2 NBC/MPEG-4 Audio standard ISO/IEC 13818-7, 14496-1,2 and 371dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 3. This software module is an implementation of a part of one or more 372dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber MPEG-2 NBC/MPEG-4 Audio tools as specified by the MPEG-2 NBC/MPEG-4 373dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Audio standard. ISO/IEC gives users of the MPEG-2 NBC/MPEG-4 Audio 374dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber standards free license to this software module or modifications thereof 375dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber for use in hardware or software products claiming conformance to the 376dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber MPEG-2 NBC/MPEG-4 Audio standards. Those intending to use this software 377dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber module in hardware or software products are advised that this use may 378dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber infringe existing patents. The original developer of this software 379dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber module and his/her company, the subsequent editors and their companies, 380dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber and ISO/IEC have no liability for use of this software module or 381dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber modifications thereof in an implementation. Copyright is not released 382dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber for non MPEG-2 NBC/MPEG-4 Audio conforming products.The original 383dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber developer retains full right to use the code for his/her own purpose, 384dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber assign or donate the code to a third party and to inhibit third party 385dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber from using the code for non MPEG-2 NBC/MPEG-4 Audio conforming products. 386dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber This copyright notice must be included in all copies or derivative 387dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber works." 388dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Copyright(c)1996. 389dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 390dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber------------------------------------------------------------------------------ 391dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber RESOURCES USED 392dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber When the code is written for a specific target processor the 393dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber the resources used should be documented below. 394dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 395dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber STACK USAGE: [stack count for this module] + [variable to represent 396dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber stack usage for each subroutine called] 397dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 398dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber where: [stack usage variable] = stack usage for [subroutine 399dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber name] (see [filename].ext) 400dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 401dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber DATA MEMORY USED: x words 402dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 403dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber PROGRAM MEMORY USED: x words 404dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 405dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber CLOCK CYCLES: [cycle count equation for this module] + [variable 406dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber used to represent cycle count for each subroutine 407dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber called] 408dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 409dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber where: [cycle count variable] = cycle count for [subroutine 410dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber name] (see [filename].ext) 411dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 412dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber------------------------------------------------------------------------------ 413dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber*/ 414dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 415dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 416dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*---------------------------------------------------------------------------- 417dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; INCLUDES 418dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber----------------------------------------------------------------------------*/ 419dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#include "pv_audio_type_defs.h" 420dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 421dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#include "s_tdec_int_chan.h" 422dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#include "s_tdec_int_file.h" 423dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#include "aac_mem_funcs.h" 424dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#include "sfb.h" /* Where samp_rate_info[] is declared */ 425dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#include "e_tmp4audioobjecttype.h" 426dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#include "e_elementid.h" 427dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 428dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 429dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#include "get_adif_header.h" 430dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#include "get_adts_header.h" 431dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#include "get_audio_specific_config.h" 432dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#include "ibstream.h" /* where getbits is declared */ 433dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 434dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#include "huffman.h" /* where huffdecode is declared */ 435dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#include "get_prog_config.h" 436dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#include "getfill.h" 437dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#include "pns_left.h" 438dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 439dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#include "apply_ms_synt.h" 440dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#include "pns_intensity_right.h" 441dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#include "q_normalize.h" 442dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#include "long_term_prediction.h" 443dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#include "long_term_synthesis.h" 444dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#include "ltp_common_internal.h" 445dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#include "apply_tns.h" 446dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 447dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#include "window_block_fxp.h" 448dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 449dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#include "write_output.h" 450dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 451dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#include "pvmp4audiodecoder_api.h" /* Where this function is declared */ 452dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#include "get_dse.h" 453dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 454dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#include "sbr_applied.h" 455dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#include "sbr_open.h" 456dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#include "get_sbr_bitstream.h" 457dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#include "e_sbr_element_id.h" 458dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 459dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 460dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 461dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*---------------------------------------------------------------------------- 462dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; MACROS 463dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; Define module specific macros here 464dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber----------------------------------------------------------------------------*/ 465dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 466dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*---------------------------------------------------------------------------- 467dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; DEFINES 468dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; Include all pre-processor statements here. Include conditional 469dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; compile variables also. 470dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber----------------------------------------------------------------------------*/ 471dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 472dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#define LEFT (0) 473dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#define RIGHT (1) 474dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 475dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 476dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*---------------------------------------------------------------------------- 477dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; LOCAL FUNCTION DEFINITIONS 478dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; Function Prototype declaration 479dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber----------------------------------------------------------------------------*/ 480dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 481dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*---------------------------------------------------------------------------- 482dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; LOCAL STORE/BUFFER/POINTER DEFINITIONS 483dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; Variable declaration - defined here and used outside this module 484dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber----------------------------------------------------------------------------*/ 485dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 486dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*---------------------------------------------------------------------------- 487dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; EXTERNAL FUNCTION REFERENCES 488dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; Declare functions defined elsewhere and referenced in this module 489dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber----------------------------------------------------------------------------*/ 490dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 491dacaa73ae5010b66f4224d70a520945e5b653544Andreas Hubervoid InitSbrSynFilterbank(bool bDownSampleSBR); 492dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 493dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 494dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 495dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*---------------------------------------------------------------------------- 496dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; EXTERNAL GLOBAL STORE/BUFFER/POINTER REFERENCES 497dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; Declare variables used in this module but defined elsewhere 498dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber----------------------------------------------------------------------------*/ 499dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 500dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*---------------------------------------------------------------------------- 501dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; FUNCTION CODE 502dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber----------------------------------------------------------------------------*/ 503dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 504dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 505dacaa73ae5010b66f4224d70a520945e5b653544Andreas HuberOSCL_EXPORT_REF Int PVMP4AudioDecodeFrame( 506dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber tPVMP4AudioDecoderExternal *pExt, 507dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber void *pMem) 508dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber{ 509dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int frameLength; /* Helper variable */ 510dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int ch; 511dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int id_syn_ele; 512dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber UInt initialUsedBits; /* Unsigned for C55x */ 513dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int qFormatNorm; 514dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int qPredictedSamples; 515dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Bool leaveGetLoop; 516dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber MC_Info *pMC_Info; /* Helper pointer */ 517dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber FrameInfo *pFrameInfo; /* Helper pointer */ 518dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber tDec_Int_File *pVars; /* Helper pointer */ 519dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber tDec_Int_Chan *pChVars[Chans]; /* Helper pointer */ 520dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 521dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber per_chan_share_w_fxpCoef *pChLeftShare; /* Helper pointer */ 522dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber per_chan_share_w_fxpCoef *pChRightShare; /* Helper pointer */ 523dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 524dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int status = MP4AUDEC_SUCCESS; 525dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 526dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 527dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Bool empty_frame; 528dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 529dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#ifdef AAC_PLUS 530dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 531dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber SBRDECODER_DATA *sbrDecoderData; 532dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber SBR_DEC *sbrDec; 533dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber SBRBITSTREAM *sbrBitStream; 534dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 535dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#endif 536dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* 537dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * Initialize "helper" pointers to existing memory. 538dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber */ 539dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pVars = (tDec_Int_File *)pMem; 540dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 541dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pMC_Info = &pVars->mc_info; 542dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 543dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pChVars[LEFT] = &pVars->perChan[LEFT]; 544dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pChVars[RIGHT] = &pVars->perChan[RIGHT]; 545dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 546dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pChLeftShare = pChVars[LEFT]->pShareWfxpCoef; 547dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pChRightShare = pChVars[RIGHT]->pShareWfxpCoef; 548dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 549dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 550dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#ifdef AAC_PLUS 551dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 552dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber sbrDecoderData = (SBRDECODER_DATA *) & pVars->sbrDecoderData; 553dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber sbrDec = (SBR_DEC *) & pVars->sbrDec; 554dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber sbrBitStream = (SBRBITSTREAM *) & pVars->sbrBitStr; 555dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 556dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#ifdef PARAMETRICSTEREO 557dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber sbrDecoderData->hParametricStereoDec = (HANDLE_PS_DEC) & pVars->sbrDecoderData.ParametricStereoDec; 558dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#endif 559dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 560dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#endif 561dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* 562dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * Translate input buffer variables. 563dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber */ 564dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pVars->inputStream.pBuffer = pExt->pInputBuffer; 565dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 566dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pVars->inputStream.inputBufferCurrentLength = (UInt)pExt->inputBufferCurrentLength; 567dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 568dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pVars->inputStream.availableBits = 569dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber (UInt)(pExt->inputBufferCurrentLength << INBUF_ARRAY_INDEX_SHIFT); 570dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 571dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber initialUsedBits = 572dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber (UInt)((pExt->inputBufferUsedLength << INBUF_ARRAY_INDEX_SHIFT) + 573dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pExt->remainderBits); 574dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 575dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pVars->inputStream.usedBits = initialUsedBits; 576dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 577dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if (initialUsedBits > pVars->inputStream.availableBits) 578dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 579dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber status = MP4AUDEC_INVALID_FRAME; 580dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 581dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber else if (pVars->bno == 0) 582dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 583dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* 584dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * Attempt to read in ADIF format first because it is easily identified. 585dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * If its not an ADIF bitstream, get_adif_header rewinds the "pointer" 586dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * (actually usedBits). 587dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber */ 588dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber status = 589dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber get_adif_header( 590dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pVars, 591dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber &(pVars->scratch.scratch_prog_config)); 592dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 593dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber byte_align(&pVars->inputStream); 594dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 595dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if (status == SUCCESS) 596dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 597dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pVars->prog_config.file_is_adts = FALSE; 598dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 599dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber else /* we've tried simple audio config, adif, then it should be adts */ 600dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 601dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pVars->prog_config.file_is_adts = TRUE; 602dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 603dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 604dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber else if ((pVars->bno == 1) && (pVars->prog_config.file_is_adts == FALSE)) 605dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 606dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 607dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* 608dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * There might be an ID_END element following immediately after the 609dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * AudioSpecificConfig header. This syntactic element should be read 610dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * and byte_aligned before proceeds to decode "real" AAC raw data. 611dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber */ 612dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber id_syn_ele = (Int)getbits(LEN_SE_ID, &pVars->inputStream) ; 613dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 614dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if (id_syn_ele == ID_END) 615dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 616dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 617dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber byte_align(&pVars->inputStream); 618dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 619dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pExt->inputBufferUsedLength = 620dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pVars->inputStream.usedBits >> INBUF_ARRAY_INDEX_SHIFT; 621dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 622dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pExt->remainderBits = pVars->inputStream.usedBits & INBUF_BIT_MODULO_MASK; 623dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 624dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pVars->bno++; 625dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 626dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber return(status); 627dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 628dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber else 629dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 630dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* 631dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * Rewind bitstream pointer so that the syntactic element can be 632dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * read when decoding raw bitstream 633dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber */ 634dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pVars->inputStream.usedBits -= LEN_SE_ID; 635dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 636dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 637dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 638dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 639dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if (pVars->prog_config.file_is_adts == TRUE) 640dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 641dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* 642dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * If file is adts format, let the decoder handle only on data raw 643dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * block at the time, once the last (or only) data block has been 644dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * processed, then synch on the next header 645dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber */ 646dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if (pVars->prog_config.headerless_frames) 647dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 648dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pVars->prog_config.headerless_frames--; /* raw data block counter */ 649dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 650dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber else 651dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 652dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber status = get_adts_header(pVars, 653dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber &(pVars->syncword), 654dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber &(pVars->invoke), 655dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 3); /* CorrectlyReadFramesCount */ 656dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 657dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if (status != SUCCESS) 658dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 659dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber status = MP4AUDEC_LOST_FRAME_SYNC; /* we lost track of header */ 660dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 661dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 662dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 663dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber else 664dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 665dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber byte_align(&pVars->inputStream); 666dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 667dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 668dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#ifdef AAC_PLUS 669dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber sbrBitStream->NrElements = 0; 670dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber sbrBitStream->NrElementsCore = 0; 671dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 672dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#endif 673dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 674dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* 675dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * The variable leaveGetLoop is used to signal that the following 676dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * loop can be left, which retrieves audio syntatic elements until 677dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * an ID_END is found, or an error occurs. 678dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber */ 679dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber leaveGetLoop = FALSE; 680dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber empty_frame = TRUE; 681dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 682dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber while ((leaveGetLoop == FALSE) && (status == SUCCESS)) 683dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 684dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* get audio syntactic element */ 685dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber id_syn_ele = (Int)get9_n_lessbits(LEN_SE_ID, &pVars->inputStream); 686dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 687dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* 688dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * As fractional frames are a possible input, check that parsing does not 689dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * go beyond the available bits before parsing the syntax. 690dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber */ 691dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if (pVars->inputStream.usedBits > pVars->inputStream.availableBits) 692dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 693dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber status = MP4AUDEC_INCOMPLETE_FRAME; /* possible EOF or fractional frame */ 694dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber id_syn_ele = ID_END; /* quit while-loop */ 695dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 696dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 697dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber switch (id_syn_ele) 698dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 699dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber case ID_END: /* terminator field */ 700dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber leaveGetLoop = TRUE; 701dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber break; 702dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 703dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber case ID_SCE: /* single channel */ 704dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber case ID_CPE: /* channel pair */ 705dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber empty_frame = FALSE; 706dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber status = 707dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber huffdecode( 708dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber id_syn_ele, 709dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber &(pVars->inputStream), 710dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pVars, 711dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pChVars); 712dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 713dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#ifdef AAC_PLUS 714dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if (id_syn_ele == ID_SCE) 715dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 716dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber sbrBitStream->sbrElement[sbrBitStream->NrElements].ElementID = SBR_ID_SCE; 717dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 718dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber else if (id_syn_ele == ID_CPE) 719dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 720dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber sbrBitStream->sbrElement[sbrBitStream->NrElements].ElementID = SBR_ID_CPE; 721dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 722dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber sbrBitStream->NrElementsCore++; 723dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 724dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 725dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#endif 726dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 727dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber break; 728dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 729dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber case ID_PCE: /* program config element */ 730dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* 731dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * PCE are not accepted in the middle of a 732dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * raw_data_block. If found, a possible error may happen 733dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * If a PCE is encountered during the first 2 frames, 734dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * it will be read and accepted 735dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * if its tag matches the first, with no error checking 736dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * (inside of get_prog_config) 737dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber */ 738dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 739dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if (pVars->bno <= 1) 740dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 741dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber status = get_prog_config(pVars, 742dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber &(pVars->scratch.scratch_prog_config)); 743dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 744dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber else 745dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 746dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber status = MP4AUDEC_INVALID_FRAME; 747dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 748dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber break; 749dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 750dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber case ID_FIL: /* fill element */ 751dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#ifdef AAC_PLUS 752dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber get_sbr_bitstream(sbrBitStream, &pVars->inputStream); 753dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 754dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#else 755dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber getfill(&pVars->inputStream); 756dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#endif 757dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 758dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber break; 759dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 760dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber case ID_DSE: /* Data Streaming element */ 761dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber get_dse(pVars->share.data_stream_bytes, 762dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber &pVars->inputStream); 763dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber break; 764dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 765dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber default: /* Unsupported element, including ID_LFE */ 766dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber status = -1; /* ERROR CODE needs to be updated */ 767dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber break; 768dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 769dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } /* end switch() */ 770dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 771dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } /* end while() */ 772dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 773dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber byte_align(&pVars->inputStream); 774dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 775dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* 776dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * After parsing the first frame ( bno=0 (adif), bno=1 (raw)) 777dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * verify if implicit signalling is forcing to upsample AAC with 778dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * no AAC+/eAAC+ content. If so, disable upsampling 779dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber */ 780dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 781dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#ifdef AAC_PLUS 782dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if (pVars->bno <= 1) 783dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 784dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if ((pVars->mc_info.ExtendedAudioObjectType == MP4AUDIO_AAC_LC) && 785dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber (!sbrBitStream->NrElements)) 786dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 787dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber PVMP4AudioDecoderDisableAacPlus(pExt, pMem); 788dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 789dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 790dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#endif 791dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 792dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* 793dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * There might be an empty raw data block with only a 794dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * ID_END element or non audio ID_DSE, ID_FIL 795dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * This is an "illegal" condition but this trap 796dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * avoids any further processing 797dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber */ 798dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 799dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if (empty_frame == TRUE) 800dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 801dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pExt->inputBufferUsedLength = 802dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pVars->inputStream.usedBits >> INBUF_ARRAY_INDEX_SHIFT; 803dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 804dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pExt->remainderBits = pVars->inputStream.usedBits & INBUF_BIT_MODULO_MASK; 805dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 806dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pVars->bno++; 807dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 808dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber return(status); 809dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 810dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 811dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 812dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#ifdef AAC_PLUS 813dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 814dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if (sbrBitStream->NrElements) 815dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 816dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* for every core SCE or CPE there must be an SBR element, otherwise sths. wrong */ 817dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if (sbrBitStream->NrElements != sbrBitStream->NrElementsCore) 818dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 819dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber status = MP4AUDEC_INVALID_FRAME; 820dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 821dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 822dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if (pExt->aacPlusEnabled == false) 823dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 824dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber sbrBitStream->NrElements = 0; /* disable aac processing */ 825dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 826dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 827dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber else 828dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 829dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* 830dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * This is AAC, but if aac+/eaac+ was declared in the stream, and there is not sbr content 831dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * something is wrong 832dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber */ 833dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if (pMC_Info->sbrPresentFlag || pMC_Info->psPresentFlag) 834dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 835dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber status = MP4AUDEC_INVALID_FRAME; 836dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 837dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 838dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#endif 839dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 840dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 841dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 842dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 843dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* 844dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * Signal processing section. 845dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber */ 846dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber frameLength = pVars->frameLength; 847dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 848dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if (status == SUCCESS) 849dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 850dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* 851dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * PNS and INTENSITY STEREO and MS 852dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber */ 853dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 854dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pFrameInfo = pVars->winmap[pChVars[LEFT]->wnd]; 855dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 856dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pns_left( 857dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pFrameInfo, 858dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pChLeftShare->group, 859dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pChLeftShare->cb_map, 860dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pChLeftShare->factors, 861dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pChLeftShare->lt_status.sfb_prediction_used, 862dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pChLeftShare->lt_status.ltp_data_present, 863dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pChVars[LEFT]->fxpCoef, 864dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pChLeftShare->qFormat, 865dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber &(pVars->pns_cur_noise_state)); 866dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 867dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* 868dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * apply_ms_synt can only be ran for common windows. 869dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * (where both the left and right channel share the 870dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * same grouping, window length, etc. 871dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * 872dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * pVars->hasmask will be > 0 only if 873dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * common windows are enabled for this frame. 874dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber */ 875dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 876dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if (pVars->hasmask > 0) 877dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 878dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber apply_ms_synt( 879dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pFrameInfo, 880dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pChLeftShare->group, 881dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pVars->mask, 882dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pChLeftShare->cb_map, 883dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pChVars[LEFT]->fxpCoef, 884dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pChVars[RIGHT]->fxpCoef, 885dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pChLeftShare->qFormat, 886dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pChRightShare->qFormat); 887dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 888dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 889dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber for (ch = 0; (ch < pMC_Info->nch); ch++) 890dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 891dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pFrameInfo = pVars->winmap[pChVars[ch]->wnd]; 892dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 893dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* 894dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * Note: This MP4 library assumes that if there are two channels, 895dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * then the second channel is right AND it was a coupled channel, 896dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * therefore there is no need to check the "is_cpe" flag. 897dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber */ 898dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 899dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if (ch > 0) 900dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 901dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pns_intensity_right( 902dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pVars->hasmask, 903dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pFrameInfo, 904dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pChRightShare->group, 905dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pVars->mask, 906dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pChRightShare->cb_map, 907dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pChLeftShare->factors, 908dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pChRightShare->factors, 909dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pChRightShare->lt_status.sfb_prediction_used, 910dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pChRightShare->lt_status.ltp_data_present, 911dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pChVars[LEFT]->fxpCoef, 912dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pChVars[RIGHT]->fxpCoef, 913dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pChLeftShare->qFormat, 914dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pChRightShare->qFormat, 915dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber &(pVars->pns_cur_noise_state)); 916dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 917dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 918dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if (pChVars[ch]->pShareWfxpCoef->lt_status.ltp_data_present != FALSE) 919dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 920dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* 921dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * LTP - Long Term Prediction 922dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber */ 923dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 924dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber qPredictedSamples = long_term_prediction( 925dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pChVars[ch]->wnd, 926dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pChVars[ch]->pShareWfxpCoef->lt_status. 927dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber weight_index, 928dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pChVars[ch]->pShareWfxpCoef->lt_status. 929dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber delay, 930dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pChVars[ch]->ltp_buffer, 931dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pVars->ltp_buffer_state, 932dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pChVars[ch]->time_quant, 933dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pVars->share.predictedSamples, /* Scratch */ 934dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber frameLength); 935dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 936dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber trans4m_time_2_freq_fxp( 937dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pVars->share.predictedSamples, 938dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pChVars[ch]->wnd, 939dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pChVars[ch]->wnd_shape_prev_bk, 940dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pChVars[ch]->wnd_shape_this_bk, 941dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber &qPredictedSamples, 942dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pVars->scratch.fft); /* scratch memory for FFT */ 943dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 944dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 945dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* 946dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * To solve a potential problem where a pointer tied to 947dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * the qFormat was being incremented, a pointer to 948dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * pChVars[ch]->qFormat is passed in here rather than 949dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * the address of qPredictedSamples. 950dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * 951dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * Neither values are actually needed in the case of 952dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * inverse filtering, but the pointer was being 953dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * passed (and incremented) regardless. 954dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * 955dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * So, the solution is to pass a space of memory 956dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * that a pointer can happily point to. 957dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber */ 958dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 959dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* This is the inverse filter */ 960dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber apply_tns( 961dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pVars->share.predictedSamples, /* scratch re-used for each ch */ 962dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pChVars[ch]->pShareWfxpCoef->qFormat, /* Not used by the inv_filter */ 963dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pFrameInfo, 964dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber &(pChVars[ch]->pShareWfxpCoef->tns), 965dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber TRUE, /* TRUE is FIR */ 966dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pVars->scratch.tns_inv_filter); 967dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 968dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* 969dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * For the next function long_term_synthesis, 970dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * the third param win_sfb_top[], and 971dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * the tenth param coef_per_win, 972dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * are used differently that in the rest of the project. This 973dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * is because originally the ISO code was going to have 974dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * these parameters change as the "short window" changed. 975dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * These are all now the same value for each of the eight 976dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * windows. This is why there is a [0] at the 977dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * end of each of theses parameters. 978dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * Note in particular that win_sfb_top was originally an 979dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * array of pointers to arrays, but inside long_term_synthesis 980dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * it is now a simple array. 981dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * When the rest of the project functions are changed, the 982dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * structure FrameInfo changes, and the [0]'s are removed, 983dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * this comment could go away. 984dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber */ 985dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber long_term_synthesis( 986dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pChVars[ch]->wnd, 987dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pChVars[ch]->pShareWfxpCoef->max_sfb, 988dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pFrameInfo->win_sfb_top[0], /* Look above */ 989dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pChVars[ch]->pShareWfxpCoef->lt_status.win_prediction_used, 990dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pChVars[ch]->pShareWfxpCoef->lt_status.sfb_prediction_used, 991dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pChVars[ch]->fxpCoef, /* input and output */ 992dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pChVars[ch]->pShareWfxpCoef->qFormat, /* input and output */ 993dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pVars->share.predictedSamples, 994dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber qPredictedSamples, /* q format for previous aray */ 995dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pFrameInfo->coef_per_win[0], /* Look above */ 996dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber NUM_SHORT_WINDOWS, 997dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber NUM_RECONSTRUCTED_SFB); 998dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 999dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } /* end if (pChVars[ch]->lt_status.ltp_data_present != FALSE) */ 1000dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1001dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } /* for(ch) */ 1002dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1003dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber for (ch = 0; (ch < pMC_Info->nch); ch++) 1004dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 1005dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1006dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pFrameInfo = pVars->winmap[pChVars[ch]->wnd]; 1007dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1008dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* 1009dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * TNS - Temporal Noise Shaping 1010dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber */ 1011dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1012dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* This is the forward filter 1013dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * 1014dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * A special note: Scratch memory is not used by 1015dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * the forward filter, but is passed in to maintain 1016dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * common interface for inverse and forward filter 1017dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber */ 1018dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber apply_tns( 1019dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pChVars[ch]->fxpCoef, 1020dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pChVars[ch]->pShareWfxpCoef->qFormat, 1021dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pFrameInfo, 1022dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber &(pChVars[ch]->pShareWfxpCoef->tns), 1023dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber FALSE, /* FALSE is IIR */ 1024dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pVars->scratch.tns_inv_filter); 1025dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1026dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* 1027dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * Normalize the q format across all scale factor bands 1028dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * to one value. 1029dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber */ 1030dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber qFormatNorm = 1031dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber q_normalize( 1032dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pChVars[ch]->pShareWfxpCoef->qFormat, 1033dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pFrameInfo, 1034dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pChVars[ch]->abs_max_per_window, 1035dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pChVars[ch]->fxpCoef); 1036dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1037dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* 1038dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * filterbank - converts frequency coeficients to time domain. 1039dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber */ 1040dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1041dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#ifdef AAC_PLUS 1042dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if (sbrBitStream->NrElements == 0 && pMC_Info->upsamplingFactor == 1) 1043dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 1044dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber trans4m_freq_2_time_fxp_2( 1045dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pChVars[ch]->fxpCoef, 1046dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pChVars[ch]->time_quant, 1047dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pChVars[ch]->wnd, /* window sequence */ 1048dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pChVars[ch]->wnd_shape_prev_bk, 1049dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pChVars[ch]->wnd_shape_this_bk, 1050dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber qFormatNorm, 1051dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pChVars[ch]->abs_max_per_window, 1052dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pVars->scratch.fft, 1053dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber &pExt->pOutputBuffer[ch]); 1054dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* 1055dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * Update LTP buffers if needed 1056dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber */ 1057dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1058dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if (pVars->mc_info.audioObjectType == MP4AUDIO_LTP) 1059dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 1060dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int16 * pt = &pExt->pOutputBuffer[ch]; 1061dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int16 * ptr = &(pChVars[ch]->ltp_buffer[pVars->ltp_buffer_state]); 1062dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int16 x, y; 1063dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber for (Int32 i = HALF_LONG_WINDOW; i != 0; i--) 1064dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 1065dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber x = *pt; 1066dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pt += 2; 1067dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber y = *pt; 1068dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pt += 2; 1069dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *(ptr++) = x; 1070dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *(ptr++) = y; 1071dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 1072dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 1073dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 1074dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber else 1075dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 1076dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber trans4m_freq_2_time_fxp_1( 1077dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pChVars[ch]->fxpCoef, 1078dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pChVars[ch]->time_quant, 1079dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber &(pChVars[ch]->ltp_buffer[pVars->ltp_buffer_state + 288]), 1080dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pChVars[ch]->wnd, /* window sequence */ 1081dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pChVars[ch]->wnd_shape_prev_bk, 1082dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pChVars[ch]->wnd_shape_this_bk, 1083dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber qFormatNorm, 1084dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pChVars[ch]->abs_max_per_window, 1085dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pVars->scratch.fft); 1086dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1087dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 1088dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#else 1089dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1090dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber trans4m_freq_2_time_fxp_2( 1091dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pChVars[ch]->fxpCoef, 1092dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pChVars[ch]->time_quant, 1093dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pChVars[ch]->wnd, /* window sequence */ 1094dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pChVars[ch]->wnd_shape_prev_bk, 1095dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pChVars[ch]->wnd_shape_this_bk, 1096dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber qFormatNorm, 1097dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pChVars[ch]->abs_max_per_window, 1098dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pVars->scratch.fft, 1099dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber &pExt->pOutputBuffer[ch]); 1100dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* 1101dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * Update LTP buffers only if needed 1102dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber */ 1103dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1104dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if (pVars->mc_info.audioObjectType == MP4AUDIO_LTP) 1105dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 1106dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int16 * pt = &pExt->pOutputBuffer[ch]; 1107dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int16 * ptr = &(pChVars[ch]->ltp_buffer[pVars->ltp_buffer_state]); 1108dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int16 x, y; 1109dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber for (Int32 i = HALF_LONG_WINDOW; i != 0; i--) 1110dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 1111dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber x = *pt; 1112dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pt += 2; 1113dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber y = *pt; 1114dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pt += 2; 1115dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *(ptr++) = x; 1116dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *(ptr++) = y; 1117dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 1118dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1119dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 1120dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1121dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1122dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#endif 1123dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1124dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1125dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* Update the window shape */ 1126dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pChVars[ch]->wnd_shape_prev_bk = pChVars[ch]->wnd_shape_this_bk; 1127dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1128dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } /* end for() */ 1129dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1130dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1131dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* 1132dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * Copy to the final output buffer, taking into account the desired 1133dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * channels from the calling environment, the actual channels, and 1134dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * whether the data should be interleaved or not. 1135dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * 1136dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * If the stream had only one channel, write_output will not use 1137dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * the right channel data. 1138dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * 1139dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber */ 1140dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1141dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1142dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* CONSIDER USE OF DMA OPTIMIZATIONS WITHIN THE write_output FUNCTION. 1143dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * 1144dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * It is presumed that the ltp_buffer will reside in internal (fast) 1145dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * memory, while the pExt->pOutputBuffer will reside in external 1146dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * (slow) memory. 1147dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * 1148dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber */ 1149dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1150dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1151dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#ifdef AAC_PLUS 1152dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1153dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if (sbrBitStream->NrElements || pMC_Info->upsamplingFactor == 2) 1154dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 1155dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1156dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if (pVars->bno <= 1) /* allows console to operate with ADIF and audio config */ 1157dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 1158dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if (sbrDec->outSampleRate == 0) /* do it only once (disregarding of signaling type) */ 1159dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 1160dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber sbr_open(samp_rate_info[pVars->mc_info.sampling_rate_idx].samp_rate, 1161dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber sbrDec, 1162dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber sbrDecoderData, 1163dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pVars->mc_info.bDownSampledSbr); 1164dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 1165dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1166dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 1167dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pMC_Info->upsamplingFactor = 1168dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber sbrDecoderData->SbrChannel[0].frameData.sbr_header.sampleRateMode; 1169dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1170dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1171dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* reuse right aac spectrum channel */ 1172dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 1173dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int16 *pt_left = &(pChVars[LEFT ]->ltp_buffer[pVars->ltp_buffer_state]); 1174dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int16 *pt_right = &(pChVars[RIGHT]->ltp_buffer[pVars->ltp_buffer_state]); 1175dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1176dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if (sbr_applied(sbrDecoderData, 1177dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber sbrBitStream, 1178dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pt_left, 1179dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pt_right, 1180dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pExt->pOutputBuffer, 1181dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber sbrDec, 1182dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pVars, 1183dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pMC_Info->nch) != SBRDEC_OK) 1184dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 1185dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber status = MP4AUDEC_INVALID_FRAME; 1186dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 1187dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 1188dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1189dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1190dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } /* if( pExt->aacPlusEnabled == FALSE) */ 1191dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#endif 1192dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1193dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* 1194dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * Copied mono data in both channels or just leave it as mono, 1195dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * according with desiredChannels (default is 2) 1196dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber */ 1197dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1198dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if (pExt->desiredChannels == 2) 1199dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 1200dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1201dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#if defined(AAC_PLUS) 1202dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#if defined(PARAMETRICSTEREO)&&defined(HQ_SBR) 1203dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if (pMC_Info->nch != 2 && pMC_Info->psPresentFlag != 1) 1204dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#else 1205dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if (pMC_Info->nch != 2) 1206dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#endif 1207dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#else 1208dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if (pMC_Info->nch != 2) 1209dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#endif 1210dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 1211dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* mono */ 1212dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1213dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1214dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int16 * pt = &pExt->pOutputBuffer[0]; 1215dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int16 * pt2 = &pExt->pOutputBuffer[1]; 1216dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int i; 1217dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if (pMC_Info->upsamplingFactor == 2) 1218dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 1219dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber for (i = 0; i < 1024; i++) 1220dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 1221dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *pt2 = *pt; 1222dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pt += 2; 1223dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pt2 += 2; 1224dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 1225dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pt = &pExt->pOutputBuffer_plus[0]; 1226dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pt2 = &pExt->pOutputBuffer_plus[1]; 1227dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1228dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber for (i = 0; i < 1024; i++) 1229dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 1230dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *pt2 = *pt; 1231dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pt += 2; 1232dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pt2 += 2; 1233dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 1234dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 1235dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber else 1236dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 1237dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber for (i = 0; i < 1024; i++) 1238dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 1239dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *pt2 = *pt; 1240dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pt += 2; 1241dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pt2 += 2; 1242dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 1243dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 1244dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1245dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 1246dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1247dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#if defined(AAC_PLUS) 1248dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#if defined(PARAMETRICSTEREO)&&defined(HQ_SBR) 1249dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1250dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber else if (pMC_Info->psPresentFlag == 1) 1251dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 1252dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 frameSize = 0; 1253dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if (pExt->aacPlusEnabled == false) 1254dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 1255dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* 1256dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * Decoding eaac+ when only aac is enabled, copy L into R 1257dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber */ 1258dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber frameSize = 1024; 1259dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 1260dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber else if (sbrDecoderData->SbrChannel[0].syncState != SBR_ACTIVE) 1261dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 1262dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* 1263dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * Decoding eaac+ when no PS data was found, copy upsampled L into R 1264dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber */ 1265dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber frameSize = 2048; 1266dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 1267dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1268dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int16 * pt = &pExt->pOutputBuffer[0]; 1269dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int16 * pt2 = &pExt->pOutputBuffer[1]; 1270dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int i; 1271dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber for (i = 0; i < frameSize; i++) 1272dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 1273dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *pt2 = *pt; 1274dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pt += 2; 1275dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pt2 += 2; 1276dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 1277dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 1278dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#endif 1279dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#endif 1280dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1281dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 1282dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber else 1283dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 1284dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1285dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#if defined(AAC_PLUS) 1286dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#if defined(PARAMETRICSTEREO)&&defined(HQ_SBR) 1287dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if (pMC_Info->nch != 2 && pMC_Info->psPresentFlag != 1) 1288dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#else 1289dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if (pMC_Info->nch != 2) 1290dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#endif 1291dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#else 1292dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if (pMC_Info->nch != 2) 1293dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#endif 1294dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 1295dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* mono */ 1296dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int16 * pt = &pExt->pOutputBuffer[0]; 1297dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int16 * pt2 = &pExt->pOutputBuffer[0]; 1298dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int i; 1299dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1300dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if (pMC_Info->upsamplingFactor == 2) 1301dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 1302dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber for (i = 0; i < 1024; i++) 1303dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 1304dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *pt2++ = *pt; 1305dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pt += 2; 1306dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 1307dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1308dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pt = &pExt->pOutputBuffer_plus[0]; 1309dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pt2 = &pExt->pOutputBuffer_plus[0]; 1310dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1311dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber for (i = 0; i < 1024; i++) 1312dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 1313dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *pt2++ = *pt; 1314dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pt += 2; 1315dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 1316dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 1317dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber else 1318dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 1319dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber for (i = 0; i < 1024; i++) 1320dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 1321dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *pt2++ = *pt; 1322dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pt += 2; 1323dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 1324dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 1325dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1326dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 1327dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1328dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 1329dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1330dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1331dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1332dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1333dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* pVars->ltp_buffer_state cycles between 0 and 1024. The value 1334dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * indicates the location of the data corresponding to t == -2. 1335dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * 1336dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * | t == -2 | t == -1 | pVars->ltp_buffer_state == 0 1337dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * 1338dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * | t == -1 | t == -2 | pVars->ltp_buffer_state == 1024 1339dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * 1340dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber */ 1341dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1342dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#ifdef AAC_PLUS 1343dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if (sbrBitStream->NrElements == 0 && pMC_Info->upsamplingFactor == 1) 1344dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 1345dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pVars->ltp_buffer_state ^= frameLength; 1346dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 1347dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber else 1348dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 1349dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pVars->ltp_buffer_state ^= (frameLength + 288); 1350dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 1351dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#else 1352dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pVars->ltp_buffer_state ^= frameLength; 1353dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#endif 1354dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1355dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1356dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if (pVars->bno <= 1) 1357dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 1358dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* 1359dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * to set these values only during the second call 1360dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * when they change. 1361dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber */ 1362dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pExt->samplingRate = 1363dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber samp_rate_info[pVars->mc_info.sampling_rate_idx].samp_rate; 1364dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1365dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pVars->mc_info.implicit_channeling = 0; /* disable flag, as this is allowed 1366dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * only the first time 1367dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber */ 1368dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1369dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1370dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#ifdef AAC_PLUS 1371dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1372dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if (pMC_Info->upsamplingFactor == 2) 1373dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 1374dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pExt->samplingRate *= pMC_Info->upsamplingFactor; 1375dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pExt->aacPlusUpsamplingFactor = pMC_Info->upsamplingFactor; 1376dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 1377dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1378dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#endif 1379dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1380dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pExt->extendedAudioObjectType = pMC_Info->ExtendedAudioObjectType; 1381dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pExt->audioObjectType = pMC_Info->audioObjectType; 1382dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1383dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pExt->encodedChannels = pMC_Info->nch; 1384dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pExt->frameLength = pVars->frameLength; 1385dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 1386dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1387dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pVars->bno++; 1388dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1389dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1390dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* 1391dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * Using unit analysis, the bitrate is a function of the sampling rate, bits, 1392dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * points in a frame 1393dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * 1394dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * bits samples frame 1395dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * ---- = --------- * bits * ------- 1396dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * sec sec sample 1397dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * 1398dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * To save a divide, a shift is used. Presently only the value of 1399dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * 1024 is used by this library, so make it the most accurate for that 1400dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * value. This may need to be updated later. 1401dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber */ 1402dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1403dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pExt->bitRate = (pExt->samplingRate * 1404dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber (pVars->inputStream.usedBits - initialUsedBits)) >> 10; /* LONG_WINDOW 1024 */ 1405dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1406dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pExt->bitRate >>= (pMC_Info->upsamplingFactor - 1); 1407dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1408dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1409dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } /* end if (status == SUCCESS) */ 1410dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1411dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1412dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if (status != MP4AUDEC_SUCCESS) 1413dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 1414dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* 1415dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * A non-SUCCESS decoding could be due to an error on the bitstream or 1416dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * an incomplete frame. As access to the bitstream beyond frame boundaries 1417dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * are not allowed, in those cases the bitstream reading routine return a 0 1418dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * Zero values guarantees that the data structures are filled in with values 1419dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * that eventually will signal an error (like invalid parameters) or that allow 1420dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * completion of the parsing routine. Either way, the partial frame condition 1421dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * is verified at this time. 1422dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber */ 1423dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if (pVars->prog_config.file_is_adts == TRUE) 1424dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 1425dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber status = MP4AUDEC_LOST_FRAME_SYNC; 1426dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pVars->prog_config.headerless_frames = 0; /* synchronization forced */ 1427dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 1428dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber else 1429dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 1430dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* 1431dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * Check if the decoding error was due to buffer overrun, if it was, 1432dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * update status 1433dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber */ 1434dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if (pVars->inputStream.usedBits > pVars->inputStream.availableBits) 1435dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 1436dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* all bits were used but were not enough to complete decoding */ 1437dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pVars->inputStream.usedBits = pVars->inputStream.availableBits; 1438dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1439dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber status = MP4AUDEC_INCOMPLETE_FRAME; /* possible EOF or fractional frame */ 1440dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 1441dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 1442dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 1443dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1444dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* 1445dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * Translate from units of bits back into units of words. 1446dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber */ 1447dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1448dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pExt->inputBufferUsedLength = 1449dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pVars->inputStream.usedBits >> INBUF_ARRAY_INDEX_SHIFT; 1450dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1451dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pExt->remainderBits = (Int)(pVars->inputStream.usedBits & INBUF_BIT_MODULO_MASK); 1452dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1453dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1454dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1455dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber return (status); 1456dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1457dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber} /* PVMP4AudioDecoderDecodeFrame */ 1458dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1459