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