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: long_term_synthesis.c
21dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
22dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
23dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber------------------------------------------------------------------------------
24dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber REVISION HISTORY
25dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
26dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Description: Made the following changes based on the review comments.
27dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber              1. Separated "shift_factor>=0" on line 395 to "shift_factor>0"
28dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                 and "shift_factor=0" two cases.
29dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber              2. Added comments on line 393 to explain why factor 2 is being
30dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                 used to calculate shift_factor.
31dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber              3. Added comments for short window implementation.
32dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber              4. Changed "*(pPredicted_spectral++) = *pPredicted_spectral>>2"
33dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                 to "*(pPredicted++)>>=2" although they are the same.
34dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber              5. Changed pseudo code "X+=Y" to "X=X+Y".
35dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber              6. Fixed ending comment of "for" loop.
36dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber              7. Passed in the size of the array and deleted some of the
37dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                 include files.
38dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
39dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Description: Unroll the loops.
40dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
41dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Description: Changed index "wnd" in previous line 584 with "wnd_offset"
42dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber              and made other correspondent changes to the code.
43dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
44dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
45dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Description: Based on Ken's suggestion, modified the function with the
46dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber              passing-in Q format as scalefactor band basis in order to
47dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber              simplify TNS block functions.
48dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
49dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Description: Optimization.
50dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
51dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Description: Made changes based on review comments.
52dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber              1. Changed misspellings.
53dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber              2. Changed win_sfb_top[] from two dimensional array to one
54dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber              dimensional array and correspondently changed the code.
55dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber              3. Changed function prototype to remove some redundant
56dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber              informations.
57dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber              4. Fixed the adjusting Q format part code.
58dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber              5. Fixed lines 825, 826 with correct updating pointers.
59dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
60dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Description: Due to TNS and LTP Q format issue, added code to adjust
61dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber              predicted_spectral() to maximum resolution before perform
62dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber              long term synthesis.
63dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
64dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Description: Modified based on review comments.
65dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
66dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Description: Changed "max" data type from UInt to UInt32.
67dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
68dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Description: Changed so that nothing is done for the case of "all zero"
69dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber data coming from the output of Trans4m_time_2_freq. Also, included more
70dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber efficient calculation of the abs(x).  And, I updated the pseudocode.
71dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
72dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Description: Use an auxiliary variable temp, to avoid using the same
73dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    pointer and a post-increment pointer in the same line. This may not
74dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    work with all compilers.
75dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
76dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Who:                                   Date:
77dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Description:
78dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
79dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber------------------------------------------------------------------------------
80dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber INPUT AND OUTPUT DEFINITIONS
81dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
82dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Inputs:
83dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    win_seq = type of window sequence (WINDOW_SEQUENCE).
84dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    sfb_per_win = number of scalefactor bands for each window, 1024 for
85dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                  long window, 128 for short window, type of Int.
86dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    win_sfb_top = buffer (Int16) containing the top coefficient per
87dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                  scalefactor band for each window.
88dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    win_prediction_used = buffer (Int) containing the prediction flag
89dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                          information for short windows. Each item in the
90dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                          buffer toggles prediction on(1)/off(0) for each
91dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                          window separately.
92dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    sfb_prediction_used = buffer (Int) containing the prediction flag
93dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                          information for scalefactor band(sfb). Each item
94dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                          toggle prediction on(1)/off(0) on each scalefactor
95dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                          band of every window.
96dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    current_frame = channel buffer (Int32) containing the dequantized
97dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    spectral coefficients or errors of current frame.
98dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    q_format = buffer (Int) containing Q format for each scalefactor band of
99dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber               input current_frame.
100dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    predicted_spectral = buffer (Int32) containing predicted spectral
101dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                         components of current frame.
102dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    pred_q_format = Q format (Int) for predicted spectral components of
103dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    current frame.
104dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    coef_per_win = number of coefficients per window for short windows.
105dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                   type of Int.
106dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    short_window_num = number of short windows, type of Int.
107dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    reconstruct_sfb_num = number of scalefactor bands used for reconstruction
108dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                          for short windows, type of Int.
109dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
110dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Local Stores/Buffers/Pointers Needed:
111dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    None
112dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
113dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Global Stores/Buffers/Pointers Needed:
114dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    None
115dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
116dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Outputs:
117dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    None
118dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
119dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Pointers and Buffers Modified:
120dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    current_frame contents are the dequantized spectrum with a prediction
121dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    vector added when prediction is turned on.
122dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
123dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    q_format contents are updated with the new Q format (Int) for each
124dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    scalefactor band of output current_frame buffer.
125dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
126dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Local Stores Modified:
127dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    None
128dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
129dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Global Stores Modified:
130dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    None
131dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
132dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber------------------------------------------------------------------------------
133dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber FUNCTION DESCRIPTION
134dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
135dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber This function performs long term synthesis using transmitted spectral
136dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber coeffients or errors and predicted spectral components.
137dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
138dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Long term synthesis is part of long term prediction (LTP) which is used to
139dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber reduce the redundancy of a signal between successive coding frames. The
140dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber functionality of long term synthesis is to reconstruct the frequency domain
141dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber spectral by adding the predicted spectral components and the transmitted
142dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber spectral error when prediction is turned on.
143dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
144dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber------------------------------------------------------------------------------
145dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber REQUIREMENTS
146dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
147dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber None
148dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
149dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber------------------------------------------------------------------------------
150dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber REFERENCES
151dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
152dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber (1) ISO/IEC 14496-3:1999(E)
153dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber     Part 3: Audio
154dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        Subpart 4.6.6   Long Term Prediction (LTP)
155dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
156dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber (2) MPEG-2 NBC Audio Decoder
157dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber     "This software module was originally developed by Nokia in the course
158dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber     of development of the MPEG-2 AAC/MPEG-4 Audio standard ISO/IEC13818-7,
159dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber     14496-1, 2 and 3. This software module is an implementation of a part
160dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber     of one or more MPEG-2 AAC/MPEG-4 Audio tools as specified by the MPEG-2
161dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber     aac/MPEG-4 Audio standard. ISO/IEC  gives users of the MPEG-2aac/MPEG-4
162dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber     Audio standards free license to this software module or modifications
163dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber     thereof for use in hardware or software products claiming conformance
164dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber     to the MPEG-2 aac/MPEG-4 Audio  standards. Those intending to use this
165dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber     software module in hardware or software products are advised that this
166dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber     use may infringe existing patents. The original developer of this
167dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber     software module, the subsequent editors and their companies, and ISO/IEC
168dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber     have no liability for use of this software module or modifications
169dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber     thereof in an implementation. Copyright is not released for non MPEG-2
170dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber     aac/MPEG-4 Audio conforming products. The original developer retains
171dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber     full right to use the code for the developer's own purpose, assign or
172dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber     donate the code to a third party and to inhibit third party from using
173dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber     the code for non MPEG-2 aac/MPEG-4 Audio conforming products. This
174dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber     copyright notice must be included in all copies or derivative works.
175dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber     Copyright (c)1997.
176dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
177dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber------------------------------------------------------------------------------
178dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber PSEUDO-CODE
179dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
180dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    pPredicted_spectral = &predicted_spectral[0];
181dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    pPredicted_spectral_start = pPredicted_spectral;
182dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    pSfb_prediction_used = &sfb_prediction_used[0];
183dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
184dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    IF (win_seq != EIGHT_SHORT_SEQUENCE)
185dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    THEN
186dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
187dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        sfb_offset = 0;
188dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
189dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        pWinSfbTop = &pWin_sfb_top[0];
190dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
191dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        pQ_format = &q_format[0];
192dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
193dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        FOR (i = sfb_per_frame; i>0; i--)
194dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
195dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            IF (*(pSfb_prediction_used++) != FALSE)
196dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            THEN
197dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
198dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                pPredicted_offset = pPredicted_spectral_start +
199dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                                            sfb_offset;
200dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                pCurrent_frame = &current_frame[sfb_offset];
201dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
202dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                quarter_sfb_width = (*pWinSfbTop - sfb_offset) >> 2;
203dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
204dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                max = 0;
205dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
206dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                pPredicted_spectral = pPredicted_offset;
207dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
208dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                FOR (j = (*pWinSfbTop - sfb_offset); j>0 ; j--)
209dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
210dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    tmpInt32 = *(pPredicted_spectral++);
211dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
212dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    IF (tmpInt32 < 0)
213dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    THEN
214dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
215dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        tmpInt32 = -tmpInt32;
216dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
217dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    ENDIF
218dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
219dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    max |= tmpInt32;
220dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
221dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                ENDFOR
222dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
223dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                tmpInt = 0;
224dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
225dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                IF (max != 0)
226dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                THEN
227dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
228dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    WHILE (max < 0x40000000L)
229dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
230dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        max <<= 1;
231dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        tmpInt++;
232dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
233dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    ENDWHILE
234dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
235dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    pPredicted_spectral = pPredicted_offset;
236dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
237dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    FOR (j = quarter_sfb_width; j>0 ; j--)
238dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
239dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        *(pPredicted_spectral++) <<= tmpInt;
240dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        *(pPredicted_spectral++) <<= tmpInt;
241dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        *(pPredicted_spectral++) <<= tmpInt;
242dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        *(pPredicted_spectral++) <<= tmpInt;
243dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
244dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    ENDFOR
245dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
246dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    adjusted_pred_q = pred_q_format + tmpInt;
247dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
248dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    pPredicted_spectral = pPredicted_offset;
249dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
250dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    shift_factor = *(pQ_format) - adjusted_pred_q;
251dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
252dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    IF ((shift_factor >= 0) && (shift_factor < 31))
253dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    THEN
254dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
255dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        shift_factor = shift_factor + 1;
256dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
257dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        FOR (j = quarter_sfb_width; j>0 ; j--)
258dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
259dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            *(pCurrent_frame++) =
260dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                (*pCurrent_frame>>shift_factor)
261dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                              + (*(pPredicted_spectral++)>>1);
262dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            *(pCurrent_frame++) =
263dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                (*pCurrent_frame>>shift_factor)
264dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                              + (*(pPredicted_spectral++)>>1);
265dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            *(pCurrent_frame++) =
266dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                (*pCurrent_frame>>shift_factor)
267dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                              + (*(pPredicted_spectral++)>>1);
268dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            *(pCurrent_frame++) =
269dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                (*pCurrent_frame>>shift_factor)
270dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                              + (*(pPredicted_spectral++)>>1);
271dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
272dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        ENDFOR
273dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
274dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        *(pQ_format) = adjusted_pred_q - 1;
275dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
276dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    ELSEIF (shift_factor >= 31)
277dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    THEN
278dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
279dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        FOR (j = quarter_sfb_width; j>0 ; j--)
280dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
281dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            *(pCurrent_frame++) = *(pPredicted_spectral++);
282dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            *(pCurrent_frame++) = *(pPredicted_spectral++);
283dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            *(pCurrent_frame++) = *(pPredicted_spectral++);
284dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            *(pCurrent_frame++) = *(pPredicted_spectral++);
285dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
286dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        ENDFOR
287dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
288dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        *(pQ_format) = adjusted_pred_q;
289dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
290dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    ELSEIF ((shift_factor < 0) && (shift_factor > -31))
291dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    THEN
292dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
293dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        shift_factor = 1 - shift_factor;
294dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
295dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        FOR (j = quarter_sfb_width; j>0 ; j--)
296dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
297dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            *(pCurrent_frame++) = (*pCurrent_frame>>1) +
298dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                (*(pPredicted_spectral++)>>shift_factor);
299dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            *(pCurrent_frame++) = (*pCurrent_frame>>1) +
300dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                (*(pPredicted_spectral++)>>shift_factor);
301dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            *(pCurrent_frame++) = (*pCurrent_frame>>1) +
302dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                (*(pPredicted_spectral++)>>shift_factor);
303dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            *(pCurrent_frame++) = (*pCurrent_frame>>1) +
304dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                (*(pPredicted_spectral++)>>shift_factor);
305dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
306dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        ENDFOR
307dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
308dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        *(pQ_format) = *(pQ_format) - 1;
309dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
310dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    ENDIF
311dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
312dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                ENDIF
313dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
314dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            ENDIF [ IF (*(pSfb_prediction_used++) != FALSE) ]
315dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
316dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            sfb_offset = *pWinSfbTop;
317dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            pWinSfbTop = pWinSfbTop + 1;
318dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            pQ_format = pQ_format + 1;
319dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
320dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        ENDFOR [ FOR (i = sfb_per_frame; i>0; i--) ]
321dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
322dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    ELSE
323dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
324dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        pCurrent_frame_start = &current_frame[0];
325dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
326dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        pQ_format_start = &q_format[0];
327dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
328dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        num_sfb = sfb_per_win[0];
329dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
330dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        FOR (wnd=0; wnd<short_window_num; wnd++)
331dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
332dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            pWinSfbTop = &pWin_sfb_top[0];
333dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
334dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            pQ_format = pQ_format_start;
335dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
336dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            IF (win_prediction_used[wnd] != FALSE)
337dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            THEN
338dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
339dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                sfb_offset = 0;
340dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
341dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                FOR (i = reconstruct_sfb_num; i > 0; i--)
342dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
343dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    pPredicted_offset = pPredicted_spectral_start +
344dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                                                sfb_offset;
345dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    pCurrent_frame = pCurrent_frame_start + sfb_offset;
346dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
347dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    quarter_sfb_width = (*pWinSfbTop - sfb_offset) >> 2;
348dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
349dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    max = 0;
350dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
351dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    pPredicted_spectral = pPredicted_offset;
352dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
353dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    FOR (j = (*pWinSfbTop - sfb_offset); j>0 ; j--)
354dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
355dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        tmpInt32 = *(pPredicted_spectral++);
356dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
357dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        IF (tmpInt32 < 0)
358dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        THEN
359dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
360dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            tmpInt32 = -tmpInt32;
361dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
362dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        ENDIF
363dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
364dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        max |= tmpInt32;
365dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
366dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    ENDFOR
367dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
368dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    tmpInt = 0;
369dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
370dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    IF (max != 0)
371dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    THEN
372dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
373dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        WHILE (max < 0x40000000L)
374dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
375dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            max <<= 1;
376dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            tmpInt++;
377dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
378dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        ENDWHILE
379dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
380dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
381dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        pPredicted_spectral = pPredicted_offset;
382dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
383dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        FOR (j = quarter_sfb_width; j>0 ; j--)
384dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
385dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            *(pPredicted_spectral++) <<= tmpInt;
386dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            *(pPredicted_spectral++) <<= tmpInt;
387dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            *(pPredicted_spectral++) <<= tmpInt;
388dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            *(pPredicted_spectral++) <<= tmpInt;
389dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
390dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        ENDFOR
391dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
392dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        adjusted_pred_q = pred_q_format + tmpInt;
393dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
394dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        pPredicted_spectral = pPredicted_offset;
395dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
396dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        shift_factor = *(pQ_format) - adjusted_pred_q;
397dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
398dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        IF ((shift_factor >= 0) && (shift_factor < 31))
399dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        THEN
400dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
401dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            shift_factor = shift_factor + 1;
402dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
403dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            FOR (j = quarter_sfb_width; j>0 ; j--)
404dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
405dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                *(pCurrent_frame++) =
406dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                    (*pCurrent_frame>>shift_factor) +
407dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                                (*(pPredicted_spectral++)>>1);
408dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                *(pCurrent_frame++) =
409dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                    (*pCurrent_frame>>shift_factor) +
410dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                                (*(pPredicted_spectral++)>>1);
411dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                *(pCurrent_frame++) =
412dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                    (*pCurrent_frame>>shift_factor) +
413dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                                (*(pPredicted_spectral++)>>1);
414dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                *(pCurrent_frame++) =
415dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                    (*pCurrent_frame>>shift_factor) +
416dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                                (*(pPredicted_spectral++)>>1);
417dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
418dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            ENDFOR
419dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
420dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            *(pQ_format) = adjusted_pred_q - 1;
421dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
422dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        ELSEIF (shift_factor >= 31)
423dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        THEN
424dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
425dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            FOR (j = quarter_sfb_width; j>0 ; j--)
426dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
427dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                *(pCurrent_frame++) = *(pPredicted_spectral++);
428dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                *(pCurrent_frame++) = *(pPredicted_spectral++);
429dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                *(pCurrent_frame++) = *(pPredicted_spectral++);
430dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                *(pCurrent_frame++) = *(pPredicted_spectral++);
431dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
432dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            ENDFOR
433dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
434dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            *(pQ_format) = adjusted_pred_q;
435dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
436dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        ELSEIF ((shift_factor < 0) && (shift_factor > -31))
437dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        THEN
438dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
439dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            shift_factor = 1 - shift_factor;
440dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
441dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            FOR (j = quarter_sfb_width; j>0 ; j--)
442dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
443dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                *(pCurrent_frame++) = (*pCurrent_frame>>1) +
444dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                    (*(pPredicted_spectral++)>>shift_factor);
445dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                *(pCurrent_frame++) = (*pCurrent_frame>>1) +
446dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                    (*(pPredicted_spectral++)>>shift_factor);
447dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                *(pCurrent_frame++) = (*pCurrent_frame>>1) +
448dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                    (*(pPredicted_spectral++)>>shift_factor);
449dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                *(pCurrent_frame++) = (*pCurrent_frame>>1) +
450dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                    (*(pPredicted_spectral++)>>shift_factor);
451dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
452dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            ENDFOR
453dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
454dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            *(pQ_format) = *(pQ_format) - 1;
455dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
456dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        ENDIF
457dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
458dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    ENDIF
459dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
460dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    sfb_offset = *pWinSfbTop;
461dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    pWinSfbTop = pWinSfbTop + 1;
462dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    pQ_format = pQ_format + 1;
463dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
464dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                ENDFOR [ FOR (i = reconstruct_sfb_num; i > 0; i--) ]
465dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
466dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            ENDIF [ IF (win_prediction_used[wnd] != FALSE) ]
467dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
468dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            pPredicted_spectral_start = pPredicted_spectral_start + num_sfb;
469dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            pCurrent_frame_start = pCurrent_frame_start + num_sfb;
470dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            wnd_offset = wnd_offset + num_sfb;
471dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            pQ_format_start = pQ_format_start + num_sfb;
472dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
473dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        ENDFOR [ FOR (wnd=0; wnd<short_window_num; wnd++) ]
474dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
475dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    ENDIF [ IF (win_seq != EIGHT_SHORT_SEQUENCE) ]
476dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
477dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    RETURN
478dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
479dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber------------------------------------------------------------------------------
480dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber RESOURCES USED
481dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber   When the code is written for a specific target processor the
482dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber     the resources used should be documented below.
483dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
484dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber STACK USAGE: [stack count for this module] + [variable to represent
485dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber          stack usage for each subroutine called]
486dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
487dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber     where: [stack usage variable] = stack usage for [subroutine
488dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber         name] (see [filename].ext)
489dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
490dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber DATA MEMORY USED: x words
491dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
492dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber PROGRAM MEMORY USED: x words
493dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
494dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber CLOCK CYCLES: [cycle count equation for this module] + [variable
495dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber           used to represent cycle count for each subroutine
496dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber           called]
497dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
498dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber     where: [cycle count variable] = cycle count for [subroutine
499dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        name] (see [filename].ext)
500dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
501dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber------------------------------------------------------------------------------
502dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber*/
503dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
504dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
505dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*----------------------------------------------------------------------------
506dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; INCLUDES
507dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber----------------------------------------------------------------------------*/
508dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#include "pv_audio_type_defs.h"
509dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#include "e_window_sequence.h"
510dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#include "long_term_synthesis.h"
511dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
512dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*----------------------------------------------------------------------------
513dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; MACROS
514dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; Define module specific macros here
515dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber----------------------------------------------------------------------------*/
516dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
517dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*----------------------------------------------------------------------------
518dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; DEFINES
519dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; Include all pre-processor statements here. Include conditional
520dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; compile variables also.
521dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber----------------------------------------------------------------------------*/
522dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
523dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*----------------------------------------------------------------------------
524dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; LOCAL FUNCTION DEFINITIONS
525dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; Function Prototype declaration
526dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber----------------------------------------------------------------------------*/
527dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
528dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*----------------------------------------------------------------------------
529dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; LOCAL STORE/BUFFER/POINTER DEFINITIONS
530dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; Variable declaration - defined here and used outside this module
531dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber----------------------------------------------------------------------------*/
532dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
533dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*----------------------------------------------------------------------------
534dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; EXTERNAL FUNCTION REFERENCES
535dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; Declare functions defined elsewhere and referenced in this module
536dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber----------------------------------------------------------------------------*/
537dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
538dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*----------------------------------------------------------------------------
539dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; EXTERNAL GLOBAL STORE/BUFFER/POINTER REFERENCES
540dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; Declare variables used in this module but defined elsewhere
541dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber----------------------------------------------------------------------------*/
542dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
543dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*----------------------------------------------------------------------------
544dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; FUNCTION CODE
545dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber----------------------------------------------------------------------------*/
546dacaa73ae5010b66f4224d70a520945e5b653544Andreas Hubervoid long_term_synthesis(
547dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    WINDOW_SEQUENCE     win_seq,
548dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int                 sfb_per_win,
549dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int16               win_sfb_top[],
550dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int                 win_prediction_used[],
551dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int                 sfb_prediction_used[],
552dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int32               current_frame[],
553dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int                 q_format[],         /* for each sfb */
554dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int32               predicted_spectral[],
555dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int                 pred_q_format,      /* for predicted_spectral[] */
556dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int                 coef_per_win,
557dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int                 short_window_num,
558dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int                 reconstruct_sfb_num)
559dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber{
560dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    /*----------------------------------------------------------------------------
561dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    ; Define all local variables
562dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    ----------------------------------------------------------------------------*/
563dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    /* Scalefactor band offset */
564dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int sfb_offset;
565dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
566dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    /* Window index */
567dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int wnd;
568dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
569dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    /* Pointer to array containing predicted samples */
570dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int32 *pPredicted_spectral;
571dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
572dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    /* Pointer to the beginning of array containing predicted samples */
573dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int32 *pPredicted_spectral_start;
574dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
575dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int32 *pPredicted_offset;
576dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
577dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    /* Pointer to array containing current spectral components for a channel*/
578dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int32 *pCurrent_frame;
579dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
580dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    /* Another pointer to array containing current spectral components */
581dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int32 *pCurrent_frame_start;
582dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
583dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    /* Pointer to prediction flag for each scalefactor band */
584dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int *pSfb_prediction_used;
585dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
586dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    /* Pointer to top coef per scalefactor band */
587dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int16 *pWinSfbTop;
588dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
589dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    /* Pointer to q_format array */
590dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int *pQ_format;
591dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int *pQ_format_start;
592dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int32   temp;
593dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
594dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int i;
595dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int j;
596dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
597dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int quarter_sfb_width;
598dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int num_sfb;
599dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int shift_factor;
600dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
601dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    UInt32  max;
602dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int32   tmpInt32;
603dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
604dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int tmpInt;
605dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int adjusted_pred_q;
606dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int pred_shift;
607dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
608dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    /*----------------------------------------------------------------------------
609dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    ; Function body here
610dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    ----------------------------------------------------------------------------*/
611dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    /* Initialize pointers */
612dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    pPredicted_spectral = &predicted_spectral[0];
613dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    pPredicted_spectral_start = pPredicted_spectral;
614dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
615dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    /*
616dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber     * NOTE:
617dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber     * sfb_prediction_used[] start from 0 or 1 depending on nok_lt_decode.c;
618dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber     * currently we agree to make it start from 0;
619dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber     */
620dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    pSfb_prediction_used = &sfb_prediction_used[0];
621dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
622dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    /*********************************/
623dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    /* LTP synthesis for long window */
624dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    /*********************************/
625dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    if (win_seq != EIGHT_SHORT_SEQUENCE)
626dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    {
627dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
628dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        /*******************************************************/
629dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        /* Reconstruction of current frequency domain spectrum */
630dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        /*******************************************************/
631dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
632dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        /* Initialize scalefactor band offset */
633dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        sfb_offset = 0;
634dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
635dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        /*
636dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber         * Reconstruction is processed on scalefactor band basis.
637dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber         * 1. When prediction is turned on, all the predicted spectral
638dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber         * components will be used for reconstruction.
639dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber         * 2. When prediction is turned off, reconstruction is not
640dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber         * needed. Spectral components of current frame will directly
641dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber         * come from the transmitted data.
642dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber         */
643dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        pWinSfbTop = &win_sfb_top[0];
644dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
645dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        pQ_format = &q_format[0];
646dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
647dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        for (i = sfb_per_win; i > 0; i--)
648dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        {
649dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            /* Check prediction flag for each scalefactor band. */
650dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            if (*(pSfb_prediction_used++) != FALSE)
651dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            {
652dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                /*
653dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                 * Prediction is on. Do reconstruction routine.
654dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                 * Reconstruct spectral component of current
655dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                 * frame by adding the predicted spectral
656dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                 * components and the quantized prediction
657dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                 * errors that reconstructed from transmitted
658dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                 * data when prediction is turned on.
659dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                 */
660dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
661dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                /* Set pointers to the offset of scalefactor bands */
662dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                pPredicted_offset = pPredicted_spectral_start +
663dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                    sfb_offset;
664dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                pCurrent_frame = &current_frame[sfb_offset];
665dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
666dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                /*
667dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                 * (*pWinSfbTop - sfb_offset) is number of coefficients
668dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                 * of the scalefactor band.
669dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                 * ">>2" is used to set up for later unrolling the loop.
670dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                 */
671dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                quarter_sfb_width = (*pWinSfbTop - sfb_offset) >> 2;
672dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
673dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                /*
674dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                 * Adjust pred_q_format and predicted_spectral() to
675dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                 * maximum resolution.
676dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                 */
677dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                max = 0;
678dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
679dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                pPredicted_spectral = pPredicted_offset;
680dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
681dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                /* Find the maximum absolute value */
682dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                for (j = (*pWinSfbTop - sfb_offset); j > 0 ; j--)
683dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                {
684dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    tmpInt32 = *(pPredicted_spectral++);
685dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
686dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    /*
687dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                     * Note: overflow is protected here even though
688dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                     * tmpInt32 = 0x80000000 is very rare case.
689dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                     *
690dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                     *  if (tmpInt32 == LONG_MIN)
691dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                     *  {
692dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                     *      tmpInt32 = LONG_MAX;
693dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                     *  }
694dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                     *  if (tmpInt32 < 0)
695dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                     *  {
696dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                     *      tmpInt32 = -tmpInt32;
697dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                     *  }
698dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                     */
699dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
700dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    max |= tmpInt32 ^(tmpInt32 >> 31);
701dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                }
702dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
703dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                /*
704dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                 * IF the LTP data is all zeros
705dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                 * (max == 0) - do nothing for this sfb.
706dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                 */
707dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
708dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                if (max != 0)
709dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                {
710dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    /* Find the number of bits to reach the max resolution */
711dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    tmpInt = 0;
712dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
713dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    while (max < 0x40000000L)
714dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    {
715dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        max <<= 1;
716dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        tmpInt++;
717dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    }
718dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
719dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    /*
720dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                     * The following codes are combinded into shift factor
721dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                     * adjusting and reconstruction section.
722dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                     *
723dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                     * pPredicted_spectral = pPredicted_offset;
724dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                     * for(j = quarter_sfb_width; j>0 ; j--)
725dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                     * {
726dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                     *      *(pPredicted_spectral++) <<= tmpInt;
727dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                     *      *(pPredicted_spectral++) <<= tmpInt;
728dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                     *      *(pPredicted_spectral++) <<= tmpInt;
729dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                     *      *(pPredicted_spectral++) <<= tmpInt;
730dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                     * }
731dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                     *
732dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                     */
733dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
734dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    /* Adjust Q format for predicted_spectral() */
735dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    adjusted_pred_q = pred_q_format + tmpInt;
736dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
737dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    /*
738dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                     * Adjust Q format to prevent overflow that may occur during
739dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                     * frequency domain reconstruction.
740dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                     *
741dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                     */
742dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    pPredicted_spectral = pPredicted_offset;
743dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
744dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    shift_factor = *(pQ_format) - adjusted_pred_q;
745dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
746dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    if ((shift_factor >= 0) && (shift_factor < 31))
747dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    {
748dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        shift_factor = shift_factor + 1;
749dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        pred_shift = tmpInt - 1;
750dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
751dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        if (pred_shift >= 0)
752dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        {
753dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            for (j = quarter_sfb_width; j > 0 ; j--)
754dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            {
755dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                temp = *pCurrent_frame >> shift_factor;
756dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                *(pCurrent_frame++) = temp
757dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                                      + (*(pPredicted_spectral++) << pred_shift);
758dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                temp = *pCurrent_frame >> shift_factor;
759dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                *(pCurrent_frame++) = temp
760dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                                      + (*(pPredicted_spectral++) << pred_shift);
761dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                temp = *pCurrent_frame >> shift_factor;
762dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                *(pCurrent_frame++) = temp
763dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                                      + (*(pPredicted_spectral++) << pred_shift);
764dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                temp = *pCurrent_frame >> shift_factor;
765dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                *(pCurrent_frame++) = temp
766dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                                      + (*(pPredicted_spectral++) << pred_shift);
767dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            }
768dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        }
769dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        else
770dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        {
771dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            for (j = quarter_sfb_width; j > 0 ; j--)
772dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            {
773dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                temp = *pCurrent_frame >> shift_factor;
774dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                *(pCurrent_frame++) = temp
775dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                                      + (*(pPredicted_spectral++) >> 1);
776dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                temp = *pCurrent_frame >> shift_factor;
777dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                *(pCurrent_frame++) = temp
778dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                                      + (*(pPredicted_spectral++) >> 1);
779dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                temp = *pCurrent_frame >> shift_factor;
780dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                *(pCurrent_frame++) = temp
781dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                                      + (*(pPredicted_spectral++) >> 1);
782dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                temp = *pCurrent_frame >> shift_factor;
783dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                *(pCurrent_frame++) = temp
784dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                                      + (*(pPredicted_spectral++) >> 1);
785dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            }
786dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        }
787dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
788dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        /* Updated new Q format for current scalefactor band */
789dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        *(pQ_format) = adjusted_pred_q  - 1;
790dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    }
791dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    else if (shift_factor >= 31)
792dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    {
793dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        for (j = quarter_sfb_width; j > 0 ; j--)
794dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        {
795dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            *(pCurrent_frame++) =
796dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                *(pPredicted_spectral++) << tmpInt;
797dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            *(pCurrent_frame++) =
798dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                *(pPredicted_spectral++) << tmpInt;
799dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            *(pCurrent_frame++) =
800dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                *(pPredicted_spectral++) << tmpInt;
801dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            *(pCurrent_frame++) =
802dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                *(pPredicted_spectral++) << tmpInt;
803dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        }
804dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
805dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        /* Updated new Q format for current scalefactor band */
806dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        *(pQ_format) = adjusted_pred_q ;
807dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    }
808dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    else if ((shift_factor < 0) && (shift_factor > -31))
809dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    {
810dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        shift_factor = 1 - shift_factor;
811dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        pred_shift = tmpInt - shift_factor;
812dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
813dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        if (pred_shift >= 0)
814dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        {
815dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            for (j = quarter_sfb_width; j > 0 ; j--)
816dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            {
817dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                temp = *pCurrent_frame >> 1;
818dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                *(pCurrent_frame++) =  temp +
819dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                                       (*(pPredicted_spectral++) << pred_shift);
820dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                temp = *pCurrent_frame >> 1;
821dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                *(pCurrent_frame++) =  temp +
822dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                                       (*(pPredicted_spectral++) << pred_shift);
823dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                temp = *pCurrent_frame >> 1;
824dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                *(pCurrent_frame++) =  temp +
825dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                                       (*(pPredicted_spectral++) << pred_shift);
826dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                temp = *pCurrent_frame >> 1;
827dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                *(pCurrent_frame++) =  temp +
828dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                                       (*(pPredicted_spectral++) << pred_shift);
829dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            }
830dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        }
831dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        else
832dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        {
833dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            pred_shift = -pred_shift;
834dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
835dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            for (j = quarter_sfb_width; j > 0 ; j--)
836dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            {
837dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                temp = *pCurrent_frame >> 1;
838dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                *(pCurrent_frame++) =  temp +
839dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                                       (*(pPredicted_spectral++) >> pred_shift);
840dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                temp = *pCurrent_frame >> 1;
841dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                *(pCurrent_frame++) =  temp +
842dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                                       (*(pPredicted_spectral++) >> pred_shift);
843dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                temp = *pCurrent_frame >> 1;
844dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                *(pCurrent_frame++) =  temp +
845dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                                       (*(pPredicted_spectral++) >> pred_shift);
846dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                temp = *pCurrent_frame >> 1;
847dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                *(pCurrent_frame++) =  temp +
848dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                                       (*(pPredicted_spectral++) >> pred_shift);
849dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            }
850dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        }
851dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
852dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        /*
853dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                         * Updated new Q format for current scalefactor band
854dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                         *
855dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                         * This is NOT a pointer decrement
856dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                         */
857dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        (*pQ_format)--;
858dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    }
859dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
860dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                } /* if (max != 0) */
861dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
862dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                /*
863dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                 * For case (shift_factor <= -31), *pCurrent_frame and
864dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                 * *pQ_format do not need to be updated.
865dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                 */
866dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
867dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            } /* if (*(pSfb_prediction_used++) != FALSE) */
868dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
869dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            /* Updated to next scalefactor band. */
870dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            sfb_offset = *(pWinSfbTop++);
871dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
872dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            /* Updated pointer to next scalefactor band's Q-format */
873dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            pQ_format++;
874dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
875dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        } /* for (i = sfb_per_frame; i>0; i--) */
876dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
877dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    } /* if (win_seq!=EIGHT_SHORT_SEQUENCE) */
878dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
879dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    /**********************************/
880dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    /* LTP synthesis for short window */
881dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    /**********************************/
882dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    else
883dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    {
884dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        /******************************************************/
885dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        /*Reconstruction of current frequency domain spectrum */
886dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        /******************************************************/
887dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        pCurrent_frame_start = &current_frame[0];
888dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
889dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        pQ_format_start = &q_format[0];
890dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
891dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        num_sfb = sfb_per_win;
892dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
893dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        /* Reconstruction is processed on window basis */
894dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        for (wnd = 0; wnd < short_window_num; wnd++)
895dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        {
896dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            pWinSfbTop = &win_sfb_top[0];
897dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
898dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            pQ_format = pQ_format_start;
899dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
900dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            /* Check if prediction flag is on for each window */
901dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            if (win_prediction_used[wnd] != FALSE)
902dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            {
903dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                /* Initialize scalefactor band offset */
904dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                sfb_offset = 0;
905dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
906dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                /*
907dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                 * Reconstruction is processed on scalefactor band basis.
908dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                 * 1. When prediction is turned on, all the predicted
909dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                 * spectral components will be used for reconstruction.
910dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                 * 2. When prediction is turned off, reconstruction is
911dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                 * not needed. Spectral components of current frame
912dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                 * will directly come from the transmitted data.
913dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                 */
914dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
915dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                /*
916dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                 * According to ISO/IEC 14496-3 pg.91
917dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                 * Only the spectral components in first eight scalefactor
918dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                 * bands are added to the quantized prediction error.
919dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                 */
920dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                for (i = reconstruct_sfb_num; i > 0; i--)
921dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                {
922dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    /* Set pointer to the offset of scalefactor bands */
923dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    pPredicted_offset = pPredicted_spectral_start +
924dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                        sfb_offset;
925dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    pCurrent_frame = pCurrent_frame_start + sfb_offset;
926dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
927dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    /*
928dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                     * Prediction is on. Do reconstruction routine.
929dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                     * Reconstruct spectral component of
930dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                     * current frame by adding the predicted
931dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                     * spectral components and the quantized
932dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                     * prediction errors that reconstructed
933dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                     * from transmitted data when prediction
934dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                     * is turned on.
935dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                     */
936dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
937dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    /*
938dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                     * (*pWinSfbTop - sfb_offset) is number of coefficients
939dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                     * of the scalefactor band.
940dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                     * ">>2" is used to set up for later unrolling the loop.
941dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                     */
942dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    quarter_sfb_width = (*pWinSfbTop - sfb_offset) >> 2;
943dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
944dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    /*
945dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                     * Adjust pred_q_format and predicted_spectral() to
946dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                     * maximum resolution.
947dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                     */
948dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    max = 0;
949dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    pPredicted_spectral = pPredicted_offset;
950dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
951dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    /* Find the maximum absolute value */
952dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    for (j = (*pWinSfbTop - sfb_offset); j > 0 ; j--)
953dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    {
954dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        tmpInt32 = *(pPredicted_spectral++);
955dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
956dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
957dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        /*
958dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                         * Note: overflow is protected here even though
959dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                         * tmpInt32 = 0x80000000 is very rare case.
960dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                         *
961dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                         *  if (tmpInt32 == LONG_MIN)
962dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                         *  {
963dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                         *      tmpInt32 = LONG_MAX;
964dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                         *  }
965dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                         *  if (tmpInt32 < 0)
966dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                         *  {
967dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                         *      tmpInt32 = -tmpInt32;
968dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                         *  }
969dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                         */
970dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
971dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        max |= tmpInt32 ^(tmpInt32 >> 31);
972dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    }
973dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
974dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    if (max != 0)
975dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    {
976dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        /* Find the number of bits to reach
977dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                         * the max resolution
978dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                         */
979dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        tmpInt = 0;
980dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
981dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        while (max < 0x40000000L)
982dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        {
983dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            max <<= 1;
984dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            tmpInt++;
985dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        }
986dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        /*
987dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                         * The following codes are combined into shift factor
988dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                         * adjusting and reconstruction section.
989dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                         *
990dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                         * pPredicted_spectral = pPredicted_offset;
991dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                         * for(j = quarter_sfb_width; j>0 ; j--)
992dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                         * {
993dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                         *      *(pPredicted_spectral++) <<= tmpInt;
994dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                         *      *(pPredicted_spectral++) <<= tmpInt;
995dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                         *      *(pPredicted_spectral++) <<= tmpInt;
996dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                         *      *(pPredicted_spectral++) <<= tmpInt;
997dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                         * }
998dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                         *
999dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                         */
1000dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1001dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        /* Adjust Q format for predicted_spectral() */
1002dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        adjusted_pred_q = pred_q_format + tmpInt;
1003dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1004dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        /*
1005dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                         * Adjust Q format to prevent overflow that may occur
1006dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                         * during frequency domain reconstruction.
1007dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                         */
1008dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        pPredicted_spectral = pPredicted_offset;
1009dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1010dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        shift_factor = *(pQ_format) - adjusted_pred_q;
1011dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1012dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        if ((shift_factor >= 0) && (shift_factor < 31))
1013dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        {
1014dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            shift_factor = shift_factor + 1;
1015dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1016dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            pred_shift = tmpInt - 1;
1017dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1018dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            if (pred_shift >= 0)
1019dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            {
1020dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                for (j = quarter_sfb_width; j > 0 ; j--)
1021dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                {
1022dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                    temp = *pCurrent_frame >> shift_factor;
1023dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                    *(pCurrent_frame++) = temp
1024dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                                          + (*(pPredicted_spectral++) << pred_shift);
1025dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                    temp = *pCurrent_frame >> shift_factor;
1026dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                    *(pCurrent_frame++) = temp
1027dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                                          + (*(pPredicted_spectral++) << pred_shift);
1028dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                    temp = *pCurrent_frame >> shift_factor;
1029dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                    *(pCurrent_frame++) = temp
1030dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                                          + (*(pPredicted_spectral++) << pred_shift);
1031dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                    temp = *pCurrent_frame >> shift_factor;
1032dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                    *(pCurrent_frame++) = temp
1033dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                                          + (*(pPredicted_spectral++) << pred_shift);
1034dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1035dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                }
1036dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            }
1037dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            else
1038dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            {
1039dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                for (j = quarter_sfb_width; j > 0 ; j--)
1040dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                {
1041dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                    temp = *pCurrent_frame >> shift_factor;
1042dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                    *(pCurrent_frame++) = temp
1043dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                                          + (*(pPredicted_spectral++) >> 1);
1044dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                    temp = *pCurrent_frame >> shift_factor;
1045dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                    *(pCurrent_frame++) = temp
1046dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                                          + (*(pPredicted_spectral++) >> 1);
1047dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                    temp = *pCurrent_frame >> shift_factor;
1048dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                    *(pCurrent_frame++) = temp
1049dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                                          + (*(pPredicted_spectral++) >> 1);
1050dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                    temp = *pCurrent_frame >> shift_factor;
1051dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                    *(pCurrent_frame++) = temp
1052dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                                          + (*(pPredicted_spectral++) >> 1);
1053dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                }
1054dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            }
1055dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1056dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            /* Updated new Q format for current scalefactor band*/
1057dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            *(pQ_format) = adjusted_pred_q - 1;
1058dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        }
1059dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        else if (shift_factor >= 31)
1060dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        {
1061dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            for (j = quarter_sfb_width; j > 0 ; j--)
1062dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            {
1063dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                *(pCurrent_frame++) =
1064dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                    *(pPredicted_spectral++) << tmpInt;
1065dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                *(pCurrent_frame++) =
1066dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                    *(pPredicted_spectral++) << tmpInt;
1067dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                *(pCurrent_frame++) =
1068dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                    *(pPredicted_spectral++) << tmpInt;
1069dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                *(pCurrent_frame++) =
1070dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                    *(pPredicted_spectral++) << tmpInt;
1071dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            }
1072dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1073dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            /* Updated new Q format for current scalefactor band*/
1074dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            *(pQ_format) = adjusted_pred_q;
1075dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        }
1076dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        else if ((shift_factor < 0) && (shift_factor > -31))
1077dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        {
1078dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            shift_factor = 1 - shift_factor;
1079dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1080dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            pred_shift = tmpInt - shift_factor;
1081dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1082dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            if (pred_shift >= 0)
1083dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            {
1084dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                for (j = quarter_sfb_width; j > 0 ; j--)
1085dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                {
1086dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                    temp = *pCurrent_frame >> 1;
1087dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                    *(pCurrent_frame++) =  temp +
1088dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                                           (*(pPredicted_spectral++) << pred_shift);
1089dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                    temp = *pCurrent_frame >> 1;
1090dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                    *(pCurrent_frame++) =  temp +
1091dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                                           (*(pPredicted_spectral++) << pred_shift);
1092dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                    temp = *pCurrent_frame >> 1;
1093dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                    *(pCurrent_frame++) =  temp +
1094dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                                           (*(pPredicted_spectral++) << pred_shift);
1095dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                    temp = *pCurrent_frame >> 1;
1096dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                    *(pCurrent_frame++) =  temp +
1097dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                                           (*(pPredicted_spectral++) << pred_shift);
1098dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1099dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                }
1100dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            }
1101dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            else
1102dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            {
1103dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                pred_shift = -pred_shift;
1104dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1105dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                for (j = quarter_sfb_width; j > 0 ; j--)
1106dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                {
1107dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                    temp = *pCurrent_frame >> 1;
1108dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                    *(pCurrent_frame++) =  temp +
1109dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                                           (*(pPredicted_spectral++) >> pred_shift);
1110dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                    temp = *pCurrent_frame >> 1;
1111dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                    *(pCurrent_frame++) =  temp +
1112dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                                           (*(pPredicted_spectral++) >> pred_shift);
1113dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                    temp = *pCurrent_frame >> 1;
1114dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                    *(pCurrent_frame++) =  temp +
1115dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                                           (*(pPredicted_spectral++) >> pred_shift);
1116dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                    temp = *pCurrent_frame >> 1;
1117dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                    *(pCurrent_frame++) =  temp +
1118dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                                           (*(pPredicted_spectral++) >> pred_shift);
1119dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                }
1120dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            }
1121dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1122dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            /* Updated new Q format for current scalefactor band*/
1123dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            *(pQ_format) = *(pQ_format) - 1;
1124dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        }
1125dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1126dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        /*
1127dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                         * For case (shift_factor <= -31), *pCurrent_frame and
1128dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                         * *pQ_format do not need to be updated.
1129dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                         */
1130dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1131dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    } /* if (max != 0) */
1132dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1133dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    /* Updated to next scalefactor band. */
1134dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    sfb_offset = *(pWinSfbTop++);
1135dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1136dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    /* Updated pointer to next scalefactor band's Q-format */
1137dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    pQ_format++;
1138dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1139dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                } /* for (i = reconstruct_sfb_num; i > 0; i--) */
1140dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1141dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            } /* if (win_prediction_used[wnd] != FALSE) */
1142dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1143dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            /* Updated to next window */
1144dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            pPredicted_spectral_start += coef_per_win;
1145dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            pCurrent_frame_start += coef_per_win;
1146dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            pQ_format_start += num_sfb;
1147dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1148dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        } /* for (wnd=0; wnd<short_window_num; wnd++) */
1149dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1150dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    } /* else */
1151dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1152dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    /*----------------------------------------------------------------------------
1153dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    ; Return nothing or data or data pointer
1154dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    ----------------------------------------------------------------------------*/
1155dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    return;
1156dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber} /* long_term_synthesis */
1157dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1158dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1159