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: trans4m_freq_2_time_fxp.c
21dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber  Function: trans4m_freq_2_time_fxp
22dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
23dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
24dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber------------------------------------------------------------------------------
25dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber REVISION HISTORY
26dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
27dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Description:
28dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    changed to decrement loop
29dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    change wnd_shape from structure to passing parameters
30dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    modified window tables from UInt to UInt16 to assure proper operation
31dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    without dubious typecast
32dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    changed logic to hit most common states first.
33dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    modified Time_data from Int to Int32 to hold
34dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    possible overflow before saturation process.
35dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
36dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Description:
37dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Increase processing on some loop by using more pointers
38dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    changed interface to avoid passing a pointer for wnd_shape_prev_bk, this
39dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    element is not change in this function because of this function use
40dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    in the LTP module
41dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
42dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Description:
43dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Added rounding to multiplication
44dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
45dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Description:
46dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Update input description and eliminate unneeded comments
47dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
48dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Description:
49dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    LONG_START_WINDOW was using SHORT_WINDOW instead of
50dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    HALF_SHORT_WINDOW, causing a for loop to exceed its count
51dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
52dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Description:
53dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Modified structure of code so exp is not tested before it
54dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    is initialized.  Also, new structure avoids double-testing
55dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    of exp_freq = ALL_ZEROS_BUFFER.
56dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
57dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Description:
58dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    The result of a shift is undefined if the right operand is greater than
59dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    or equal to the number of bits in the left expression's type
60dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    To avoid undefined shift by 32, a check of the shift has been
61dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    added, so the function proceeds only when the exponent is less
62dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    than 32. By design the shift up is related to the global gain,
63dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    and controlled by the encoder, so saturation is not allowed.
64dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    In both short and long window, processing is skip if an all zero
65dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    input buffer or excessive down shift is detected.
66dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
67dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Description:
68dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Changes according to code review comments. Also, modified if-else
69dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    structure so the imdct_fxp is not called with an all zero input buffer
70dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
71dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Description:
72dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Replaced function buffer_normalization by buffer_adaptation, to ease
73dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    use of 16 bits. Function buffer_normalization becomes  obsolete.
74dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
75dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Description:
76dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Modified call to imdct_fxp to reflect extended precision use. Added
77dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    routine buffer_adaptation to extract 16 MSB and keep highest.
78dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    precision. Modify casting to ensure proper operations for different
79dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    platforms
80dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
81dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Description:
82dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Eliminate double access to memory by loading data directly to the
83dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    time array. Also reduced cycle count and added precision by combining
84dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    downshifting in only one operation. Added adaptive rounding factor.
85dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Change exponent threshold when operations are waived. It is use to be 32
86dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    but by combining downshifting, this new threshold is now 16. This may
87dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    avoid unneeded calculations for extremely small numbers.
88dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
89dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Description:
90dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Per review comments:
91dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        - Added comments to clarify buffer_adaptation function
92dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        - Deleted  reference to include file "buffer_normalization.h"
93dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        - Modified IF-ELSE so long_windows case is considered first
94dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        - Eliminated extra IF when computing the rounding, so when exp ==0
95dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber          less cycles are used shifting than in an extra if-else
96dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        - Corrected negative shift when computing rounding factor
97dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        - Added condition when exp > 16 (for long windows)
98dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
99dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Description:
100dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Modified IF-ELSE structure so now ALL_ZEROS_BUFFER condition is share
101dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    with exp > 16 condition. This avoid code duplication for both cases.
102dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
103dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Description:
104dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        - Modified function interface to add output_buffer
105dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        - Eliminated the 32 bit version of the current output, calculations
106dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber          are placed directly in output_buffer. In this way the buffer
107dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber          Time_data needs only to be 1024 Int32, instead of 2048 (per channel).
108dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber          Also, added the limit macro inside the function (this reduces access
109dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber          to memory).
110dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        - Updated Pseudo - Code
111dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
112dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Description:
113dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Per review comments:
114dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber          Corrected line sizes and mispelling,  added comments and swap
115dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber          order or switch statement for ONLY_LONG_SEQUENCE.
116dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
117dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Description:
118dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Eliminated adaptive rounding due to potential saturation.
119dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
120dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Description:
121dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Eliminated use of buffer adaptation by shifting this functionality inside
122dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    the imdct_fxp() routine. Also modified the call to imdct_fxp to accomodate
123dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    new function interface.
124dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Modified macro limit() to save cycles when testing the most common case:
125dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    no saturation.
126dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
127dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Description:
128dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Changed new function interface for imdct_fxp().
129dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
130dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Description:
131dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Replaced for-loop with memset and memcopy.
132dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
133dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Who:                         Date:
134dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Description:
135dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
136dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber------------------------------------------------------------------------------
137dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber INPUT AND OUTPUT DEFINITIONS
138dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
139dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Inputs:
140dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Frequency_data    =  vector with spectral information, size 2048
141dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                         type Int32
142dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
143dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Time_data         =  buffer with data from previous Frequency to Time
144dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                         conversion, used for overlap and add, size 1024
145dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                         type Int32
146dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
147dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Output_buffer     =  place holder for current output,  size 1024
148dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                         type Int16
149dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
150dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    wnd_seq           =  window sequence
151dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                         type WINDOW_SEQUENCE
152dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
153dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    wnd_shape_prev_bk =  previous window shape type
154dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                         type Int
155dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
156dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    wnd_shape_this_bk =  current window shape type
157dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                         type Int
158dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
159dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Q_format          =  Q format for the input frequency data
160dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                         type Int
161dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
162dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    freq_2_time_buffer[] =  scratch memory for computing FFT
163dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                         type Int32
164dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
165dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
166dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Local Stores/Buffers/Pointers Needed:
167dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    None
168dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
169dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Global Stores/Buffers/Pointers Needed:
170dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    None
171dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
172dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Outputs:
173dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    None
174dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
175dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Pointers and Buffers Modified:
176dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Output_buffer
177dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Time_data
178dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Frequency_data
179dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    pWnd_shape_prev_bk
180dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
181dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Local Stores Modified:
182dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    None
183dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
184dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Global Stores Modified:
185dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    None
186dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
187dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber------------------------------------------------------------------------------
188dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber FUNCTION DESCRIPTION
189dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
190dacaa73ae5010b66f4224d70a520945e5b653544Andreas HuberThe time/frequency representation of the signal is mapped onto the time
191dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huberdomain by feeding it into the filterbank module. This module consists of
192dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huberan inverse modified discrete cosine transform (IMDCT), and a window and an
193dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huberoverlap-add function. In order to adapt the time/frequency resolution of the
194dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huberfilterbank to the characteristics of the input signal, a block switching tool
195dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huberis also adopted. N represents the window length, where N is a function of the
196dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huberwindow_sequence. For each channel, the N/2 time-frequency values are
197dacaa73ae5010b66f4224d70a520945e5b653544Andreas Hubertransformed into the N time domain values via the IMDCT. After applying the
198dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huberwindow function, for each channel, the first half of the sequence is added to
199dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huberthe second half of the previous block windowed sequence to reconstruct the
200dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huberoutput samples for each channel outi,n.
201dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
202dacaa73ae5010b66f4224d70a520945e5b653544Andreas HuberThe adaptation of the time-frequency resolution of the filterbank to the
203dacaa73ae5010b66f4224d70a520945e5b653544Andreas Hubercharacteristics of the input signal is done by shifting between transforms
204dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huberwhose input lengths are either 2048 or 256 samples. By enabling the block
205dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huberswitching tool, the following transitions are meaningful:
206dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
207dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huberfrom ONLY_LONG_SEQUENCE to   { LONG_START_SEQUENCE
208dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                               ONLY_LONG_SEQUENCE
209dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
210dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huberfrom LONG_START_SEQUENCE to  { LONG_STOP_SEQUENCE
211dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                               EIGHT_SHORT_SEQUENCE
212dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
213dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huberfrom LONG_STOP_SEQUENCE to   { LONG_START_SEQUENCE
214dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                               ONLY_LONG_SEQUENCE
215dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
216dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huberfrom EIGHT_SHORT_SEQUENCE to { LONG_STOP_SEQUENCE
217dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                               EIGHT_SHORT_SEQUENCE
218dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
219dacaa73ae5010b66f4224d70a520945e5b653544Andreas HuberWindow shape decisions are made by the encoder on a frame-by-frame-basis.
220dacaa73ae5010b66f4224d70a520945e5b653544Andreas HuberThe window selected is applicable to the second half of the window function
221dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huberonly, since the first half is constrained to use the appropriate window
222dacaa73ae5010b66f4224d70a520945e5b653544Andreas Hubershape from the preceding frame.
223dacaa73ae5010b66f4224d70a520945e5b653544Andreas HuberThe 2048 time-domain values x'(i)(n), (i window, n sample) to be windowed are
224dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huberthe last 1024 values of the previous window_sequence concatenated with 1024
225dacaa73ae5010b66f4224d70a520945e5b653544Andreas Hubervalues of the current block. The formula below shows this fact:
226dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
227dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                     |  x(i-1)(n+1024)      for    0 < n < 1024
228dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            x'(i)(n) {
229dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                     |  x(i)(n)             for 1024 < n < 2048
230dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
231dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
232dacaa73ae5010b66f4224d70a520945e5b653544Andreas HuberBuffer Time_data data from previous Frequency to Time conversion, used
233dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huberfor overlap and add
234dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
235dacaa73ae5010b66f4224d70a520945e5b653544Andreas HuberOnce the window shape is selected, the window_shape syntax element is
236dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huberinitialized. Together with the chosen window_sequence all information needed
237dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huberfor windowing exist.
238dacaa73ae5010b66f4224d70a520945e5b653544Andreas HuberWith the window halves described below all window_sequences can be assembled.
239dacaa73ae5010b66f4224d70a520945e5b653544Andreas HuberFor window_shape == 1, the window coefficients are given by the Kaiser -
240dacaa73ae5010b66f4224d70a520945e5b653544Andreas HuberBessel derived (KBD) window.
241dacaa73ae5010b66f4224d70a520945e5b653544Andreas HuberOtherwise, for window_shape == 0, a sine window is employed.
242dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
243dacaa73ae5010b66f4224d70a520945e5b653544Andreas HuberThe window length N can be 2048 or 256 for the KBD and the sine window.
244dacaa73ae5010b66f4224d70a520945e5b653544Andreas HuberAll four window_sequences explained below have a total length of 2048
245dacaa73ae5010b66f4224d70a520945e5b653544Andreas Hubersamples.
246dacaa73ae5010b66f4224d70a520945e5b653544Andreas HuberFor all kinds of window_sequences the window_shape of the left half of
247dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huberthe first transform window is determined by the window shape of the previous
248dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huberblock.
249dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
250dacaa73ae5010b66f4224d70a520945e5b653544Andreas HuberIn the case of EIGHT_SHORT_SEQUENCE the processing is done in-place and
251dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huberin descendent order to avoid using extra memory.
252dacaa73ae5010b66f4224d70a520945e5b653544Andreas HuberThe ordering is as follows:
253dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
254dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                            Pn: Previous data for window n
255dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                            Cn:  Current data for window n
256dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
257dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
258dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                                128 freq.
259dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                                 samples
260dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                  FREQ                          ++++++
261dacaa73ae5010b66f4224d70a520945e5b653544Andreas HuberIN                         ===========================
262dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                                    \
263dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                                      \
264dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                                        ->  256 time
265dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                                             samples
266dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
267dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                                           P8    C8
268dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber           8                                            #######++++++
269dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                                    P7     C7
270dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber           7                                     #######++++++
271dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber           :                                :
272dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber           :                                :
273dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            P2    C2
274dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber           2             #######++++++
275dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                     P1    C1
276dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber           1      #######++++++
277dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                                                          TIME
278dacaa73ae5010b66f4224d70a520945e5b653544Andreas HuberOUT          ==============================================================
279dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
280dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber------------------------------------------------------------------------------
281dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber REQUIREMENTS
282dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
283dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    This module shall implement a scheme to switch between window types
284dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
285dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber------------------------------------------------------------------------------
286dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber REFERENCES
287dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
288dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    [1] ISO 14496-3:1999, pag 111
289dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
290dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber------------------------------------------------------------------------------
291dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber PSEUDO-CODE
292dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
293dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
294dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
295dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    IF ( wnd_seq == EIGHT_SHORT_SEQUENCE)
296dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    THEN
297dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
298dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        FOR ( i=0; i<LONG_WINDOW; i++)
299dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            Time_data[LONG_WINDOW + i] = 0;
300dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        ENDFOR
301dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
302dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        FOR ( wnd=NUM_SHORT_WINDOWS-1; wnd>=0; wnd--)
303dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
304dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            pFreqInfo = &Frequency_data[ wnd*SHORT_WINDOW];
305dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
306dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            CALL IMDCT( pFreqInfo, SHORT_BLOCK1);
307dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            MODIFYING(pFreqInfo)
308dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
309dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
310dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            IF (wnd == 0)
311dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            THEN
312dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                pShort_Window_1 = &Short_Window[wnd_shape_prev_bk][0];
313dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            ELSE
314dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                pShort_Window_1 = &Short_Window[wnd_shape_this_bk][0];
315dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            ENDIF
316dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
317dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            pShort_Window_2   =
318dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    &Short_Window[wnd_shape->this_bk][SHORT_WINDOW_m_1];
319dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
320dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            FOR( i=0, j=SHORT_WINDOW; i<SHORT_WINDOW; i++, j--)
321dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                pFreqInfo[             i]  *= pShort_Window_1[i];
322dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                pFreqInfo[SHORT_WINDOW+i]  *= pShort_Window_2[j];
323dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            ENDFOR
324dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
325dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
326dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            FOR( i=0; i<SHORT_BLOCK1; i++)
327dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                Time_data[W_L_STOP_1 + SHORT_WINDOW*wnd + i] += pFreqInfo[i];
328dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            ENDFOR
329dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
330dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        ENDFOR
331dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
332dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        FOR ( i=0; i<LONG_WINDOW; i++)
333dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            temp              = Time_data[i];
334dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            Output_buffer[i]  = Time_data[i];
335dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            Time_data[i]      = temp;
336dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        ENDFOR
337dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    ELSE
338dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
339dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        CALL IMDCT( Frequency_data, LONG_BLOCK1)
340dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            MODIFYING(Frequency_data)
341dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
342dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        SWITCH ( wnd_seq)
343dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
344dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            CASE ( ONLY_LONG_SEQUENCE)
345dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
346dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                pLong_Window_1 = &Long_Window[wnd_shape_prev_bk][0];
347dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                pLong_Window_2 =
348dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        &Long_Window[wnd_shape_this_bk][LONG_WINDOW_m_1];
349dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
350dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                FOR (i=0; i<LONG_WINDOW; i++)
351dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    Frequency_data[            i] *= *pLong_Window_1++;
352dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    Frequency_data[LONG_WINDOW+i] *= *pLong_Window_2--;
353dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                ENDFOR
354dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
355dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                BREAK
356dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
357dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            CASE ( LONG_START_SEQUENCE)
358dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
359dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                pLong_Window_1 = &Long_Window[wnd_shape_prev_bk][0];
360dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
361dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                FOR ( i=0; i<LONG_WINDOW; i++)
362dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    Frequency_data[ i] *= *pLong_Window_1++;
363dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                ENDFOR
364dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
365dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                pShort_Window_1   =
366dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        &Short_Window[wnd_shape_this_bk][SHORT_WINDOW_m_1];
367dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
368dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                FOR ( i=0; i<SHORT_WINDOW; i++)
369dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    Frequency_data[W_L_START_1 + i] *= *pShort_Window_1--;
370dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                ENDFOR
371dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
372dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                FOR ( i=W_L_START_2; i<LONG_BLOCK1; i++)
373dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    Frequency_data[W_L_START_2 + i] = 0;
374dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                ENDFOR
375dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
376dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                BREAK
377dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
378dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
379dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            CASE ( LONG_STOP_SEQUENCE )
380dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
381dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                FOR ( i=0; i<W_L_STOP_1; i++)
382dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    Frequency_data[ i] = 0;
383dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                ENDFOR
384dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
385dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                pShort_Window_1   = &Short_Window[wnd_shape_prev_bk][0];
386dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
387dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                FOR ( i=0; i<SHORT_WINDOW; i++)
388dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    Frequency_data[W_L_STOP_1+ i] *= *pShort_Window_1++;
389dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                ENDFOR
390dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
391dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                pLong_Window_1 =
392dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        &Long_Window[wnd_shape_this_bk][LONG_WINDOW_m_1];
393dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
394dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                FOR ( i=0; i<LONG_WINDOW; i++)
395dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    Frequency_data[LONG_WINDOW + i]  *=  *pLong_Window_1--;
396dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                ENDFOR
397dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
398dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                BREAK
399dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
400dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        }
401dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
402dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
403dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        FOR ( i=0; i<LONG_WINDOW; i++)
404dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            Output_buffer[i]  = Frequency_data[i]  + Time_data[i];
405dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            Time_data[i] = Frequency_data[LONG_WINDOW+i];
406dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        ENDFOR
407dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
408dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    }
409dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
410dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    ENDIF
411dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
412dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
413dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
414dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber------------------------------------------------------------------------------
415dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber RESOURCES USED
416dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber   When the code is written for a specific target processor the
417dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber     the resources used should be documented below.
418dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
419dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber STACK USAGE: [stack count for this module] + [variable to represent
420dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber          stack usage for each subroutine called]
421dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
422dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber     where: [stack usage variable] = stack usage for [subroutine
423dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber         name] (see [filename].ext)
424dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
425dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber DATA MEMORY USED: x words
426dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
427dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber PROGRAM MEMORY USED: x words
428dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
429dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber CLOCK CYCLES: [cycle count equation for this module] + [variable
430dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber           used to represent cycle count for each subroutine
431dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber           called]
432dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
433dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber     where: [cycle count variable] = cycle count for [subroutine
434dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        name] (see [filename].ext)
435dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
436dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber------------------------------------------------------------------------------
437dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber*/
438dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
439dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
440dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*----------------------------------------------------------------------------
441dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; INCLUDES
442dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber----------------------------------------------------------------------------*/
443dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
444dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#include "pv_audio_type_defs.h"
445dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#include "aac_mem_funcs.h"
446dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#include "window_block_fxp.h"
447dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#include "imdct_fxp.h"
448dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
449dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#include "fxp_mul32.h"
450dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
451dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
452dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*----------------------------------------------------------------------------
453dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; MACROS
454dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; limit(x) saturates any number that exceeds a 16-bit representation into a
455dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; 16 bit number.
456dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber----------------------------------------------------------------------------*/
457dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
458dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#define  ROUNDING_SCALED     (ROUNDING<<(16 - SCALING))
459dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
460dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
461dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#if defined(PV_ARM_V5)
462dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
463dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
464dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber__inline Int16 sat(Int32 y)
465dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber{
466dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int32 x;
467dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int32 z;
468dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    __asm
469dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    {
470dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        mov x, ROUNDING_SCALED
471dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        mov y, y, lsl #(15-SCALING)
472dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        qdadd z, x, y
473dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        mov y, z, lsr #16
474dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    }
475dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    return((Int16)y);
476dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber}
477dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
478dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#define  limiter( y, x)   y = sat(x);
479dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
480dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
481dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
482dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#elif defined(PV_ARM_GCC_V5)
483dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
484dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
485dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber__inline Int16 sat(Int32 y)
486dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber{
487dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    register Int32 x;
488dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    register Int32 ra = (Int32)y;
489dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    register Int32 z = ROUNDING_SCALED;
490dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
491dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
492dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    asm volatile(
493dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        "mov %0, %1, lsl #5\n\t"    // (15-SCALING) assembler does not take symbols
494dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        "qdadd %0, %2, %0\n\t"
495dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        "mov %0, %0, lsr #16"
496dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    : "=&r*i"(x)
497dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                : "r"(ra),
498dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                "r"(z));
499dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
500dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    return ((Int16)x);
501dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber}
502dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
503dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#define  limiter( y, x)   y = sat(x);
504dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
505dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
506dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#elif defined(PV_ARM_MSC_EVC_V5)
507dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
508dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
509dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#define  limiter( y, x)       z = x<< (15-SCALING); \
510dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                              y = _DAddSatInt( ROUNDING_SCALED, z)>>16;
511dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
512dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
513dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#else
514dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
515dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#define  limiter( y, x)   z = ((x + ROUNDING )>>SCALING); \
516dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                          if ((z>>15) != (z>>31))         \
517dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                          {                                    \
518dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                              z = (z >> 31) ^ INT16_MAX;       \
519dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                          } \
520dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                          y = (Int16)(z);
521dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
522dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#endif
523dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
524dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
525dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*----------------------------------------------------------------------------
526dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; DEFINES
527dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; Include all pre-processor statements here. Include conditional
528dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; compile variables also.
529dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber----------------------------------------------------------------------------*/
530dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
531dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*----------------------------------------------------------------------------
532dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; LOCAL FUNCTION DEFINITIONS
533dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; Function Prototype declaration
534dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber----------------------------------------------------------------------------*/
535dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
536dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
537dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*----------------------------------------------------------------------------
538dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; LOCAL VARIABLE DEFINITIONS
539dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; Variable declaration - defined here and used outside this module
540dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber----------------------------------------------------------------------------*/
541dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
542dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*----------------------------------------------------------------------------
543dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; EXTERNAL FUNCTION REFERENCES
544dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; Declare functions defined elsewhere and referenced in this module
545dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber----------------------------------------------------------------------------*/
546dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
547dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*----------------------------------------------------------------------------
548dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; EXTERNAL VARIABLES REFERENCES
549dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; Declare variables used in this module but defined elsewhere
550dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber----------------------------------------------------------------------------*/
551dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
552dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*----------------------------------------------------------------------------
553dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; EXTERNAL GLOBAL STORE/BUFFER/POINTER REFERENCES
554dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; Declare variables used in this module but defined elsewhere
555dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber----------------------------------------------------------------------------*/
556dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
557dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*----------------------------------------------------------------------------
558dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; FUNCTION CODE
559dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber----------------------------------------------------------------------------*/
560dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
561dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#ifdef AAC_PLUS
562dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
563dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
564dacaa73ae5010b66f4224d70a520945e5b653544Andreas Hubervoid trans4m_freq_2_time_fxp_1(
565dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int32               Frequency_data[],
566dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int32               Time_data[],
567dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int16               Output_buffer[],
568dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    WINDOW_SEQUENCE     wnd_seq,
569dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int                 wnd_shape_prev_bk,
570dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int                 wnd_shape_this_bk,
571dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int                 Q_format,
572dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int32               abs_max_per_window[],
573dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int32               freq_2_time_buffer[])
574dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
575dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber{
576dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int exp;
577dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int shift;
578dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
579dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int  i;
580dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int  wnd;
581dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#if !(defined( PV_ARM_GCC_V5)||(PV_ARM_V5))
582dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int32 z;
583dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#endif
584dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
585dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int16 *pFreqInfo;
586dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int32 temp;
587dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int32 test;
588dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
589dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int16 *pFreq_2_Time_data_1;
590dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int16 *pFreq_2_Time_data_2;
591dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
592dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    const Int16 *pLong_Window_1;
593dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    const Int16 *pLong_Window_2;
594dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    const Int16 *pShort_Window_1;
595dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    const Int16 *pShort_Window_2;
596dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
597dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int32 *pOverlap_and_Add_Buffer_1;
598dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int32 *pOverlap_and_Add_Buffer_2;
599dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
600dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int16  *pOutput_buffer;
601dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int16  *pOutput_buffer_2;
602dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
603dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    const Int16 * Long_Window_fxp[NUM_WINDOW_SHAPES];
604dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    const Int16 * Short_Window_fxp[NUM_WINDOW_SHAPES];
605dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
606dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Long_Window_fxp[0] = Long_Window_sine_fxp;
607dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Long_Window_fxp[1] = Long_Window_KBD_fxp;
608dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Short_Window_fxp[0] = Short_Window_sine_fxp;
609dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Short_Window_fxp[1] = Short_Window_KBD_fxp;
610dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
611dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
612dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    if (wnd_seq != EIGHT_SHORT_SEQUENCE)
613dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    {
614dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
615dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        pFreqInfo = (Int16 *)Frequency_data;
616dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
617dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
618dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        exp = imdct_fxp(
619dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                  (Int32 *)pFreqInfo,
620dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                  freq_2_time_buffer,
621dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                  LONG_BLOCK1,
622dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                  Q_format,
623dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                  abs_max_per_window[0]);
624dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
625dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
626dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
627dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        /*
628dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber         *  The C Programming Language, Second Edition, Kernighan & Ritchie,
629dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber         *  page 206.
630dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber         *  "The result [of a shift] is undefined if the right operand is
631dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber         *  negative, or greater than or equal to the number of bits in the
632dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber         *  left expression's type"
633dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber         *   => avoid shift by 32 or 16
634dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber         */
635dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
636dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        if (exp < 16)
637dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        {
638dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
639dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            pFreq_2_Time_data_1 = pFreqInfo;
640dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
641dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            switch (wnd_seq)
642dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            {
643dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
644dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                case ONLY_LONG_SEQUENCE:
645dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                default:
646dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
647dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    pOutput_buffer = Output_buffer;
648dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
649dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    pOverlap_and_Add_Buffer_1 = Time_data;
650dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
651dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    {
652dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        const Int16 *pLong_Window_2 = &Long_Window_fxp[wnd_shape_this_bk][LONG_WINDOW_m_1];
653dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
654dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        Int32 * pFreq2T = (Int32 *)pFreqInfo;
655dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        Int32 * win = (Int32 *) & Long_Window_fxp[wnd_shape_prev_bk][0];
656dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        Int shift = exp + 15 - SCALING;
657dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
658dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
659dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        Int32 * pFreq2T_2 = &pFreq2T[HALF_LONG_WINDOW];
660dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
661dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
662dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        for (i = HALF_LONG_WINDOW; i != 0; i--)
663dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        {
664dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            Int16 win1, win2;
665dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            Int32  temp2, test2;
666dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
667dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            Int32  winx;
668dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
669dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            temp2 = *(pFreq2T++);
670dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            winx = *(win++);
671dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
672dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            test  = *(pOverlap_and_Add_Buffer_1++);
673dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            test2 = *(pOverlap_and_Add_Buffer_1--);
674dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            temp  =   fxp_mul_16_by_16bb(temp2, winx) >> shift;
675dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            temp2 =   fxp_mul_16_by_16tt(temp2, winx) >> shift;
676dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            limiter(*(pOutput_buffer++), (temp + test));
677dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            limiter(*(pOutput_buffer++), (temp2 + test2));
678dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
679dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            temp2 = *(pFreq2T_2++);
680dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
681dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            win1  = *(pLong_Window_2--);
682dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            win2  = *(pLong_Window_2--);
683dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            temp  = fxp_mul_16_by_16bb(temp2, win1) >> shift;
684dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            test2 = fxp_mul_16_by_16tb(temp2, win2) >> shift;
685dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            *(pOverlap_and_Add_Buffer_1++) = temp;
686dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            *(pOverlap_and_Add_Buffer_1++) = test2;
687dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
688dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        }
689dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    }
690dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
691dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    break;
692dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
693dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                case LONG_START_SEQUENCE:
694dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
695dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
696dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    pFreq_2_Time_data_2 =
697dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        &pFreq_2_Time_data_1[ HALF_LONG_WINDOW];
698dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
699dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    pLong_Window_1 = &Long_Window_fxp[wnd_shape_prev_bk][0];
700dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    pLong_Window_2 = &pLong_Window_1[ HALF_LONG_WINDOW];
701dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
702dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    pOverlap_and_Add_Buffer_1 = &Time_data[0];
703dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    pOverlap_and_Add_Buffer_2 = &Time_data[HALF_LONG_WINDOW];
704dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
705dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    pOutput_buffer   = Output_buffer;
706dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    pOutput_buffer_2 = pOutput_buffer + HALF_LONG_WINDOW;
707dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
708dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
709dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    shift = exp + 15 - SCALING;
710dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
711dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    for (i = HALF_LONG_WINDOW; i != 0; i--)
712dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    {
713dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
714dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        Int16 win1, win2;
715dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        Int16  dat1, dat2;
716dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        Int32  test1, test2;
717dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
718dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        dat1   = *(pFreq_2_Time_data_1++);
719dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        win1   = *(pLong_Window_1++);
720dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        test1  = *(pOverlap_and_Add_Buffer_1++);
721dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
722dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        dat2  =  *(pFreq_2_Time_data_2++);
723dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        win2  = *(pLong_Window_2++);
724dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        test2 = *(pOverlap_and_Add_Buffer_2++);
725dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
726dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        limiter(*(pOutput_buffer++), (test1 + (fxp_mul_16_by_16(dat1, win1) >> shift)));
727dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
728dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        limiter(*(pOutput_buffer_2++), (test2 + (fxp_mul_16_by_16(dat2, win2) >> shift)));
729dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
730dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    }
731dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
732dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    /*
733dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                     *  data unchanged from  LONG_WINDOW to W_L_START_1
734dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                     *  only scaled accordingly
735dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                     */
736dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
737dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    pOverlap_and_Add_Buffer_1 = &Time_data[0];
738dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    pFreq_2_Time_data_1       = &pFreqInfo[LONG_WINDOW];
739dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
740dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    exp -= SCALING;
741dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
742dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    if (exp >= 0)
743dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    {
744dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
745dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        for (i = (W_L_START_1 - LONG_WINDOW) >> 1; i != 0; i--)
746dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        {
747dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            *(pOverlap_and_Add_Buffer_1++) =
748dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                *(pFreq_2_Time_data_1++) >> exp;
749dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            *(pOverlap_and_Add_Buffer_1++) =
750dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                *(pFreq_2_Time_data_1++) >> exp;
751dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
752dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        }
753dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
754dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    }
755dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    else if (exp < 0)
756dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    {
757dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
758dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        Int shift = -exp;
759dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        for (i = (W_L_START_1 - LONG_WINDOW) >> 1; i != 0 ; i--)
760dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        {
761dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            Int32 temp2 = ((Int32) * (pFreq_2_Time_data_1++)) << shift;
762dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            *(pOverlap_and_Add_Buffer_1++) = temp2;
763dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            temp2 = ((Int32) * (pFreq_2_Time_data_1++)) << shift;
764dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            *(pOverlap_and_Add_Buffer_1++) = temp2;
765dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        }
766dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
767dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    }
768dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    else
769dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    {
770dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
771dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        for (i = (W_L_START_1 - LONG_WINDOW) >> 1; i != 0; i--)
772dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        {
773dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            *(pOverlap_and_Add_Buffer_1++) =
774dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                *(pFreq_2_Time_data_1++);
775dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            *(pOverlap_and_Add_Buffer_1++) =
776dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                *(pFreq_2_Time_data_1++);
777dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
778dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        }
779dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
780dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    }
781dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
782dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
783dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    pFreq_2_Time_data_1  = &pFreqInfo[W_L_START_1];
784dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    pFreq_2_Time_data_2  =
785dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        &pFreq_2_Time_data_1[HALF_SHORT_WINDOW];
786dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
787dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    pShort_Window_1   =
788dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        &Short_Window_fxp[wnd_shape_this_bk][SHORT_WINDOW_m_1];
789dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
790dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    pShort_Window_2   = pShort_Window_1 - HALF_SHORT_WINDOW;
791dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
792dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    pOverlap_and_Add_Buffer_2 = pOverlap_and_Add_Buffer_1 +
793dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                                HALF_SHORT_WINDOW;
794dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
795dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
796dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    for (i = HALF_SHORT_WINDOW; i != 0; i--)
797dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    {
798dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        Int16 win1, win2;
799dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        Int16  dat1, dat2;
800dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        Int32  temp2;
801dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        dat1  = (*pFreq_2_Time_data_1++);
802dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        dat2  = (*pFreq_2_Time_data_2++);
803dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        win1  = *(pShort_Window_1--);
804dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        win2  = *(pShort_Window_2--);
805dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
806dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        temp   =   fxp_mul_16_by_16(dat1, win1) >> shift;
807dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        *(pOverlap_and_Add_Buffer_1++) = temp;
808dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
809dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        temp2 =   fxp_mul_16_by_16(dat2, win2) >> shift;
810dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        *(pOverlap_and_Add_Buffer_2++) = temp2;
811dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
812dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
813dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    }
814dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
815dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
816dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    pOverlap_and_Add_Buffer_1 += HALF_SHORT_WINDOW;
817dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
818dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    pv_memset(
819dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        pOverlap_and_Add_Buffer_1,
820dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        0,
821dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        (LONG_BLOCK1 - W_L_START_2)
822dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        *sizeof(*pOverlap_and_Add_Buffer_1));
823dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
824dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
825dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    break;
826dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
827dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
828dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                case LONG_STOP_SEQUENCE:
829dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
830dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    pOverlap_and_Add_Buffer_1 = &Time_data[ W_L_STOP_2];
831dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
832dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    pOutput_buffer         = &Output_buffer[W_L_STOP_2];
833dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
834dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    pFreq_2_Time_data_1      = &pFreqInfo[W_L_STOP_2];
835dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
836dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    exp -= SCALING; /*  !!!! */
837dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
838dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    if (exp > 0)
839dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    {
840dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        Int16 tmp1 = (*(pFreq_2_Time_data_1++) >> exp);
841dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        temp = *(pOverlap_and_Add_Buffer_1++);
842dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
843dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        for (i = (LONG_WINDOW - W_L_STOP_2); i != 0; i--)
844dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        {
845dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            limiter(*(pOutput_buffer++), (temp + tmp1));
846dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
847dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            tmp1 = *(pFreq_2_Time_data_1++) >> exp;
848dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            temp = *(pOverlap_and_Add_Buffer_1++);
849dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
850dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        }
851dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    }
852dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    else if (exp < 0)
853dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    {
854dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        shift = -exp;
855dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        Int32 temp1 = ((Int32) * (pFreq_2_Time_data_1++)) << shift;
856dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        temp = *(pOverlap_and_Add_Buffer_1++);
857dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
858dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        for (i = (LONG_WINDOW - W_L_STOP_2); i != 0; i--)
859dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        {
860dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            limiter(*(pOutput_buffer++), (temp + temp1));
861dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
862dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            temp1 = ((Int32) * (pFreq_2_Time_data_1++)) << shift;
863dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            temp = *(pOverlap_and_Add_Buffer_1++);
864dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
865dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        }
866dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    }
867dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    else
868dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    {
869dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        Int16 tmp1 = *(pFreq_2_Time_data_1++);
870dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        temp = *(pOverlap_and_Add_Buffer_1++);
871dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
872dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        for (i = (LONG_WINDOW - W_L_STOP_2); i != 0; i--)
873dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        {
874dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            limiter(*(pOutput_buffer++), (temp + tmp1));
875dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
876dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            tmp1 = *(pFreq_2_Time_data_1++);
877dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            temp = *(pOverlap_and_Add_Buffer_1++);
878dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
879dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        }
880dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    }
881dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
882dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
883dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    pShort_Window_1 = &Short_Window_fxp[wnd_shape_prev_bk][0];
884dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    pShort_Window_2 = &pShort_Window_1[HALF_SHORT_WINDOW];
885dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
886dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    pFreq_2_Time_data_1 = &pFreqInfo[W_L_STOP_1];
887dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    pFreq_2_Time_data_2 =
888dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        &pFreq_2_Time_data_1[HALF_SHORT_WINDOW];
889dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
890dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    pOverlap_and_Add_Buffer_1 = &Time_data[ W_L_STOP_1];
891dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    pOverlap_and_Add_Buffer_2 = pOverlap_and_Add_Buffer_1
892dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                                + HALF_SHORT_WINDOW;
893dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
894dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    pOutput_buffer   = &Output_buffer[W_L_STOP_1];
895dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    pOutput_buffer_2 = pOutput_buffer + HALF_SHORT_WINDOW;
896dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
897dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    exp += SCALING;  /* +8 back to what it was */
898dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
899dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    shift = exp + 15 - SCALING;
900dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
901dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
902dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    for (i = HALF_SHORT_WINDOW; i != 0; i--)
903dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    {
904dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        Int16 win1;
905dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        Int16  dat1;
906dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
907dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        dat1 = *(pFreq_2_Time_data_1++);
908dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        win1 = *(pShort_Window_1++);
909dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        temp = *(pOverlap_and_Add_Buffer_1++);
910dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
911dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        test  = fxp_mul_16_by_16(dat1, win1);
912dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
913dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        limiter(*(pOutput_buffer++), (temp + (test >> shift)));
914dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
915dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        dat1 = *(pFreq_2_Time_data_2++);
916dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        win1 = *(pShort_Window_2++);
917dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        temp = *(pOverlap_and_Add_Buffer_2++);
918dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        test =  fxp_mul_16_by_16(dat1, win1);
919dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        limiter(*(pOutput_buffer_2++), (temp + (test >> shift)));
920dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
921dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    }
922dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
923dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
924dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    pFreq_2_Time_data_2 = &pFreqInfo[LONG_WINDOW];
925dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
926dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    pOverlap_and_Add_Buffer_1 = Time_data;
927dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
928dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    pOutput_buffer = Output_buffer;
929dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
930dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    pLong_Window_2   =
931dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        &Long_Window_fxp[wnd_shape_this_bk][LONG_WINDOW_m_1];
932dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
933dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
934dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    /*
935dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                     *  Copy previous time in current buffer, also copy overlap
936dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                     *  and add buffer
937dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                     */
938dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
939dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    for (i = W_L_STOP_1; i != 0; i--)
940dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    {
941dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        Int16 win1;
942dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        Int16 dat1;
943dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
944dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        win1 = *(pLong_Window_2--);
945dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        dat1 = *pFreq_2_Time_data_2++;
946dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
947dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        limiter(*(pOutput_buffer++), *(pOverlap_and_Add_Buffer_1));
948dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
949dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
950dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        temp = fxp_mul_16_by_16(dat1, win1) >> shift;
951dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        *(pOverlap_and_Add_Buffer_1++) = temp ;
952dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
953dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    }
954dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
955dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    for (i = (LONG_WINDOW - W_L_STOP_1); i != 0; i--)
956dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    {
957dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        temp = fxp_mul_16_by_16(*pFreq_2_Time_data_2++, *(pLong_Window_2--)) >> shift;
958dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        *(pOverlap_and_Add_Buffer_1++) = temp ;
959dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    }
960dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
961dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
962dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    break;
963dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
964dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
965dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
966dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            } /* switch (wnd_seq) */
967dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
968dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        }   /*  if (exp < 16)  */
969dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
970dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        else
971dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        {
972dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            /* all zeros buffer or excessive down shift */
973dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
974dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            /* Overlap and add, setup buffer for next iteration */
975dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            pOverlap_and_Add_Buffer_1 = &Time_data[0];
976dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
977dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            pOutput_buffer = Output_buffer;
978dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
979dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            temp  = (*pOverlap_and_Add_Buffer_1++);
980dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
981dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            for (i = LONG_WINDOW; i != 0; i--)
982dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            {
983dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
984dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                limiter(*(pOutput_buffer++), temp);
985dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
986dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                temp = (*pOverlap_and_Add_Buffer_1++);
987dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
988dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            }
989dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
990dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            pv_memset(Time_data, 0, LONG_WINDOW*sizeof(Time_data[0]));
991dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
992dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
993dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        }
994dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
995dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    }
996dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    else
997dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    {
998dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
999dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        Int32 *pScrath_mem;
1000dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        Int32 *pScrath_mem_entry;
1001dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        Int32  *pFrequency_data = Frequency_data;
1002dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1003dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        Int32 * pOverlap_and_Add_Buffer_1;
1004dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        Int32 * pOverlap_and_Add_Buffer_2;
1005dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        Int32 * pOverlap_and_Add_Buffer_1x;
1006dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        Int32 * pOverlap_and_Add_Buffer_2x;
1007dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1008dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        /*
1009dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber         *  Frequency_data is 2*LONG_WINDOW length but only
1010dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber         *  the first LONG_WINDOW elements are filled in,
1011dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber         *  then the second part can be used as scratch mem,
1012dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber         *  then grab data from one window at a time in
1013dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber         *  reverse order.
1014dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber         *  The upper LONG_WINDOW Int32 are used to hold the
1015dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber         *  computed overlap and add, used in the next call to
1016dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber         *  this function, and also as sctrach memory
1017dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber         */
1018dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1019dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        /*
1020dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber         *  Frequency_data usage for the case EIGHT_SHORT_SEQUENCE
1021dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1022dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber          |<----- Input Freq. data ----->|< Overlap & Add ->| Unused |-Scratch-|
1023dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber          |                              |  Store for next  |        |  memory |
1024dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber          |                              |  call            |        |         |
1025dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber          |                              |                  |        |         |
1026dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber          |//////////////////////////////|\\\\\\\\\\\\\\\\\\|--------|+++++++++|
1027dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber          |                              |                  |        |         |
1028dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber          0                         LONG_WINDOW        LONG_WINDOW   |   2*LONG_WINDOW
1029dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                                            +        |         |
1030dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                                       W_L_STOP_2    |         |
1031dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                                                     |<--   -->|
1032dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                                                      SHORT_WINDOW +
1033dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                                                    HALF_SHORT_WINDOW
1034dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber          *
1035dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber          */
1036dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1037dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        pOverlap_and_Add_Buffer_1  = &pFrequency_data[
1038dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                         LONG_WINDOW + 3*SHORT_WINDOW + HALF_SHORT_WINDOW];
1039dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1040dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        /*
1041dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber         *  Initialize to zero, only the firt short window used in overlap
1042dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber         *  and add
1043dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber         */
1044dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        pv_memset(
1045dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            pOverlap_and_Add_Buffer_1,
1046dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            0,
1047dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            SHORT_WINDOW*sizeof(*pOverlap_and_Add_Buffer_1));
1048dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1049dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        /*
1050dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber         *  Showt windows are evaluated in decresing order. Windows from 7
1051dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber         *  to 0 are break down in four cases: window numbers 7 to 5, 4, 3,
1052dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber         *  and 2 to 0.
1053dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber         *  The data from short windows 3 and 4 is situated at the boundary
1054dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber         *  between the 'overlap and add' buffer and the output buffer.
1055dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber         */
1056dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        for (wnd = NUM_SHORT_WINDOWS - 1; wnd >= NUM_SHORT_WINDOWS / 2 + 1; wnd--)
1057dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        {
1058dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1059dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            pFreqInfo = (Int16 *) & pFrequency_data[ wnd*SHORT_WINDOW];
1060dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1061dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            exp = imdct_fxp(
1062dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                      (Int32 *)pFreqInfo,
1063dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                      freq_2_time_buffer,
1064dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                      SHORT_BLOCK1,
1065dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                      Q_format,
1066dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                      abs_max_per_window[wnd]);
1067dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1068dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            pOverlap_and_Add_Buffer_1 =
1069dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                &pFrequency_data[ W_L_STOP_1 + SHORT_WINDOW*wnd];
1070dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1071dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1072dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            pOverlap_and_Add_Buffer_2 =
1073dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                pOverlap_and_Add_Buffer_1 + SHORT_WINDOW;
1074dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1075dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            /*
1076dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber             *  If all element are zero or if the exponent is bigger than
1077dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber             *  16 ( it becomes an undefined shift) ->  skip
1078dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber             */
1079dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1080dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            if (exp < 16)
1081dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            {
1082dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1083dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1084dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                pFreq_2_Time_data_1 = &pFreqInfo[0];
1085dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                pFreq_2_Time_data_2 = &pFreqInfo[SHORT_WINDOW];
1086dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1087dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1088dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                /*
1089dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                 *  Each of the eight short blocks is windowed separately.
1090dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                 *  Window shape decisions are made on a frame-by-frame
1091dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                 *  basis.
1092dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                 */
1093dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1094dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                pShort_Window_1 = &Short_Window_fxp[wnd_shape_this_bk][0];
1095dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1096dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                pShort_Window_2   =
1097dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    &Short_Window_fxp[wnd_shape_this_bk][SHORT_WINDOW_m_1];
1098dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1099dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1100dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1101dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1102dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                /*
1103dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                 * For short windows from 7 to 5
1104dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                 *                                      |   =========================
1105dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                 *                                      |   |     5     6     7
1106dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                 *               _--_  _--_  _--_  _--_ | _-|-_  _--_  _--_  _--_
1107dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                 *              /    \/    \/    \/    \|/  |  \/    \/    \/    \
1108dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                 *             /     /\    /\    /\    /|\  |  /\    /\    /\     \
1109dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                 *            /     /  \  /  \  /  \  / | \ | /  \  /  \  /  \     \
1110dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                 *           /     /    \/    \/    \/  |  \|/    \/    \     \     \
1111dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                 *      --------------------------------|---[///////////////////////]--------
1112dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                 *
1113dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                 */
1114dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1115dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1116dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                shift = exp + 15 - SCALING;
1117dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1118dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1119dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                for (i = SHORT_WINDOW; i != 0; i--)
1120dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                {
1121dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    Int16 win1, win2;
1122dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    Int16  dat1, dat2;
1123dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1124dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    dat2 = *(pFreq_2_Time_data_2++);
1125dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    win2 = *(pShort_Window_2--);
1126dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    temp = *pOverlap_and_Add_Buffer_2;
1127dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    dat1 = *(pFreq_2_Time_data_1++);
1128dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    win1 = *(pShort_Window_1++);
1129dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1130dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    *(pOverlap_and_Add_Buffer_2++) =  temp + (fxp_mul_16_by_16(dat2, win2) >> shift);
1131dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1132dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    *(pOverlap_and_Add_Buffer_1++)  =  fxp_mul_16_by_16(dat1, win1) >> shift;
1133dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1134dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                }
1135dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1136dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            }   /* if (exp < 16) */
1137dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            else
1138dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            {
1139dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                pv_memset(
1140dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    pOverlap_and_Add_Buffer_1,
1141dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    0,
1142dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    SHORT_WINDOW*sizeof(*pOverlap_and_Add_Buffer_1));
1143dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            }
1144dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1145dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1146dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        }/* for ( wnd=NUM_SHORT_WINDOWS-1; wnd>=NUM_SHORT_WINDOWS/2; wnd--) */
1147dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1148dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1149dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        wnd = NUM_SHORT_WINDOWS / 2;
1150dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1151dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        pFreqInfo = (Int16 *) & pFrequency_data[ wnd*SHORT_WINDOW];
1152dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1153dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        /*
1154dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber         *  scratch memory is allocated in an unused part of memory
1155dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber         */
1156dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1157dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1158dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        pScrath_mem = &pFrequency_data[ 2*LONG_WINDOW - HALF_SHORT_WINDOW];
1159dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1160dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        pOverlap_and_Add_Buffer_1 = &pFrequency_data[ LONG_WINDOW];
1161dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1162dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        pOverlap_and_Add_Buffer_2 = pOverlap_and_Add_Buffer_1
1163dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                    + HALF_SHORT_WINDOW;
1164dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1165dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1166dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        exp = imdct_fxp(
1167dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                  (Int32 *)pFreqInfo,
1168dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                  freq_2_time_buffer,
1169dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                  SHORT_BLOCK1,
1170dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                  Q_format,
1171dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                  abs_max_per_window[wnd]);
1172dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1173dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        /*
1174dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber         *  If all element are zero or if the exponent is bigger than
1175dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber         *  16 ( it becomes an undefined shift) ->  skip
1176dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber         */
1177dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1178dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1179dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        if (exp < 16)
1180dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        {
1181dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1182dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            pFreq_2_Time_data_1 = &pFreqInfo[0];
1183dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            pFreq_2_Time_data_2 = &pFreqInfo[SHORT_WINDOW];
1184dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1185dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            pShort_Window_1 = &Short_Window_fxp[wnd_shape_this_bk][0];
1186dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1187dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            pShort_Window_2 =
1188dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                &Short_Window_fxp[wnd_shape_this_bk][SHORT_WINDOW_m_1];
1189dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1190dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1191dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            /*
1192dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber             * For short window 4
1193dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber             *                                    ====|===========
1194dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber             *                                        |   4
1195dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber             *                                    |   |   |      |
1196dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber             *                _--_  _--_  _--_  _-|-_ | _-|-_  _-|-_  _--_  _--_
1197dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber             *               /    \/    \/    \/  |  \|/  |  \/  |  \/    \/    \
1198dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber             *              /     /\    /\    /\  |  /|\  |  /\  |  /\    /\     \
1199dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber             *             /     /  \  /  \  /  \ | / | \ | /  \ | /  \  /  \     \
1200dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber             *            /     /    \/    \/    \|/  |  \|/    \|/    \/    \     \
1201dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber             *      ------------------------------[\\\|\\\|//////]-------------------
1202dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber             *           |                        | A | B |   C  |
1203dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber             *           |
1204dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber             *        W_L_STOP_1
1205dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber             */
1206dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1207dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            shift = exp + 15 - SCALING;
1208dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            {
1209dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                Int16 win1;
1210dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                Int16  dat1;
1211dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                /* -------- segment A ---------------*/
1212dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                dat1 = *(pFreq_2_Time_data_1++);
1213dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                win1 = *(pShort_Window_1++);
1214dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                for (i = HALF_SHORT_WINDOW; i != 0; i--)
1215dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                {
1216dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    *(pScrath_mem++)  =  fxp_mul_16_by_16(dat1, win1) >> (shift);
1217dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    dat1 = *(pFreq_2_Time_data_1++);
1218dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    win1 = *(pShort_Window_1++);
1219dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                }
1220dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1221dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                /* -------- segment B ---------------*/
1222dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                for (i = HALF_SHORT_WINDOW; i != 0; i--)
1223dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                {
1224dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    *(pOverlap_and_Add_Buffer_1++)  =  fxp_mul_16_by_16(dat1, win1) >> shift;
1225dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1226dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    dat1 = *(pFreq_2_Time_data_1++);
1227dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    win1 = *(pShort_Window_1++);
1228dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                }
1229dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1230dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                /* -------- segment C ---------------*/
1231dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                temp = *pOverlap_and_Add_Buffer_2;
1232dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                dat1 = *(pFreq_2_Time_data_2++);
1233dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                win1 = *(pShort_Window_2--);
1234dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1235dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                for (i = SHORT_WINDOW; i != 0; i--)
1236dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                {
1237dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    *(pOverlap_and_Add_Buffer_2++)  =  temp + (fxp_mul_16_by_16(dat1, win1) >> shift);
1238dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1239dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    temp = *pOverlap_and_Add_Buffer_2;
1240dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    dat1 = *(pFreq_2_Time_data_2++);
1241dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    win1 = *(pShort_Window_2--);
1242dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                }
1243dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            }
1244dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1245dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        }   /* if (exp < 16) */
1246dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        else
1247dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        {
1248dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            pv_memset(
1249dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                pScrath_mem,
1250dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                0,
1251dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                HALF_SHORT_WINDOW*sizeof(*pScrath_mem));
1252dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1253dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            pv_memset(
1254dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                pOverlap_and_Add_Buffer_1,
1255dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                0,
1256dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                HALF_SHORT_WINDOW*sizeof(*pOverlap_and_Add_Buffer_1));
1257dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        }
1258dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1259dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1260dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        wnd = NUM_SHORT_WINDOWS / 2 - 1;
1261dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1262dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        pFreqInfo = (Int16 *) & pFrequency_data[ wnd*SHORT_WINDOW];
1263dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1264dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        pScrath_mem_entry =
1265dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            &pFrequency_data[2*LONG_WINDOW - HALF_SHORT_WINDOW - SHORT_WINDOW];
1266dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        pScrath_mem = pScrath_mem_entry;
1267dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1268dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        pOverlap_and_Add_Buffer_1 = &pFrequency_data[ LONG_WINDOW];
1269dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1270dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        /* point to end of buffer less HALF_SHORT_WINDOW */
1271dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1272dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        pOutput_buffer_2 = &Output_buffer[LONG_WINDOW - HALF_SHORT_WINDOW];
1273dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        pOutput_buffer   = pOutput_buffer_2;
1274dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1275dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        pOverlap_and_Add_Buffer_1x = &Time_data[W_L_STOP_1 + SHORT_WINDOW*(wnd+1)];  /* !!!! */
1276dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1277dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        exp = imdct_fxp(
1278dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                  (Int32 *)pFreqInfo,
1279dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                  freq_2_time_buffer,
1280dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                  SHORT_BLOCK1,
1281dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                  Q_format,
1282dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                  abs_max_per_window[wnd]);
1283dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1284dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        /*
1285dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber         *  If all element are zero or if the exponent is bigger than
1286dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber         *  16 ( it becomes an undefined shift) ->  skip
1287dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber         */
1288dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1289dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        if (exp < 16)
1290dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        {
1291dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1292dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            pFreq_2_Time_data_1 = &pFreqInfo[0];
1293dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            pFreq_2_Time_data_2 = &pFreqInfo[SHORT_WINDOW];
1294dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1295dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1296dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            /*
1297dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber             * For short window 3
1298dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber             *                             ===========|====
1299dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber             *                                    3   |
1300dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber             *                             |      |   |   |
1301dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber             *               _--_  _--_  _-|-_  _-|-_ | _-|-_  _--_  _--_  _--_
1302dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber             *              /    \/    \/  |  \/  |  \|/  |  \/    \/    \/    \
1303dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber             *             /     /\    /\  |  /\  |  /|\  |  /\    /\    /\     \
1304dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber             *            /     /  \  /  \ | /  \ | / | \ | /  \  /  \  /  \     \
1305dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber             *           /     /    \/    \|/    \|/  |  \|/    \/    \     \     \
1306dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber             *     -----|------------------[\\\\\\|///|///]--------------------------
1307dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber             *          |                  |   A  | B | C |
1308dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber             *
1309dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber             *      W_L_STOP_1
1310dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber             */
1311dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1312dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1313dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            pShort_Window_1 = &Short_Window_fxp[wnd_shape_this_bk][0];
1314dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1315dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            pShort_Window_2 =
1316dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                &Short_Window_fxp[wnd_shape_this_bk][SHORT_WINDOW_m_1];
1317dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1318dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            shift = exp + 15 - SCALING;
1319dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1320dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1321dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            Int16 win1;
1322dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            Int16  dat1;
1323dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            /* -------- segment A ---------------*/
1324dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            dat1 = *(pFreq_2_Time_data_1++);
1325dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            win1 = *(pShort_Window_1++);
1326dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            for (i = SHORT_WINDOW; i != 0; i--)
1327dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            {
1328dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                *(pScrath_mem++)  =  fxp_mul_16_by_16(dat1, win1) >> shift;
1329dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                dat1 = *(pFreq_2_Time_data_1++);
1330dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                win1 = *(pShort_Window_1++);
1331dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            }
1332dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1333dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            dat1 = *(pFreq_2_Time_data_2++);
1334dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            win1 = *(pShort_Window_2--);
1335dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1336dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            /* -------- segment B ---------------*/
1337dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            for (i = HALF_SHORT_WINDOW; i != 0; i--)
1338dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            {
1339dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                test = fxp_mul_16_by_16(dat1, win1) >> shift;
1340dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1341dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                temp =  *(pScrath_mem++) + test;
1342dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1343dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1344dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                test = *(pOverlap_and_Add_Buffer_1x++);  /* !!!! */
1345dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1346dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                limiter(*(pOutput_buffer++), (temp + test));
1347dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1348dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                dat1 = *(pFreq_2_Time_data_2++);
1349dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                win1 = *(pShort_Window_2--);
1350dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1351dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            }
1352dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1353dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            /* -------- segment C ---------------*/
1354dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            for (i = HALF_SHORT_WINDOW; i != 0; i--)
1355dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            {
1356dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                temp = fxp_mul_16_by_16(dat1, win1) >> (shift);
1357dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1358dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                *(pOverlap_and_Add_Buffer_1++) += temp;
1359dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1360dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                dat1 = *(pFreq_2_Time_data_2++);
1361dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                win1 = *(pShort_Window_2--);
1362dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            }
1363dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1364dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        }   /* if (exp < 16) */
1365dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        else
1366dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        {
1367dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1368dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            pv_memset(
1369dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                pScrath_mem,
1370dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                0,
1371dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                SHORT_WINDOW*sizeof(*pScrath_mem));
1372dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1373dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            pScrath_mem += SHORT_WINDOW;
1374dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1375dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            temp = *(pScrath_mem++);
1376dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            for (i = HALF_SHORT_WINDOW; i != 0; i--)
1377dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            {
1378dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                limiter(*(pOutput_buffer++), temp);
1379dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                temp = *(pScrath_mem++);
1380dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1381dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1382dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            }
1383dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        }
1384dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1385dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1386dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        for (wnd = NUM_SHORT_WINDOWS / 2 - 2; wnd >= 0; wnd--)
1387dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        {
1388dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1389dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1390dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            pOutput_buffer_2 -= SHORT_WINDOW;
1391dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            pOutput_buffer = pOutput_buffer_2;
1392dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1393dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            /*
1394dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber             * The same memory is used as scratch in every iteration
1395dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber             */
1396dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            pScrath_mem = pScrath_mem_entry;
1397dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1398dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            pOverlap_and_Add_Buffer_2x =
1399dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                &Time_data[W_L_STOP_1 + SHORT_WINDOW*(wnd+1)];
1400dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1401dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            pFreqInfo = (Int16 *) & pFrequency_data[ wnd*SHORT_WINDOW];
1402dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1403dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1404dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1405dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            exp = imdct_fxp(
1406dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                      (Int32 *)pFreqInfo,
1407dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                      freq_2_time_buffer,
1408dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                      SHORT_BLOCK1,
1409dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                      Q_format,
1410dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                      abs_max_per_window[wnd]);
1411dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1412dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            /*
1413dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber             *  If all element are zero or if the exponent is bigger than
1414dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber             *  16 ( it becomes an undefined shift) ->  skip
1415dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber             */
1416dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1417dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            if (exp < 16)
1418dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            {
1419dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1420dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                pFreq_2_Time_data_1 = &pFreqInfo[0];
1421dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                pFreq_2_Time_data_2 = &pFreqInfo[SHORT_WINDOW];
1422dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1423dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1424dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                /*
1425dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                 *  Each of the eight short blocks is windowed separately.
1426dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                 *  Window shape decisions are made on a frame-by-frame
1427dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                 *  basis.
1428dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                 */
1429dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1430dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                pShort_Window_1 = &Short_Window_fxp[wnd_shape_this_bk][0];
1431dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1432dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                if (wnd == 0)
1433dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                {
1434dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    pShort_Window_1 =
1435dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        &Short_Window_fxp[wnd_shape_prev_bk][0];
1436dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                }
1437dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1438dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                pShort_Window_2   =
1439dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    &Short_Window_fxp[wnd_shape_this_bk][SHORT_WINDOW_m_1];
1440dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1441dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1442dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                /*
1443dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                 * For short windows from 2 to 0
1444dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                 *
1445dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                 *          =========================
1446dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                 *                                       |
1447dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                 *                0     1     2      |   |
1448dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                 *               _--_  _--_  _--_  _-|-_ | _--_  _--_  _--_  _--_
1449dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                 *              /    \/    \/    \/  |  \|/    \/    \/    \/    \
1450dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                 *             /     /\    /\    /\  |  /|\    /\    /\    /\     \
1451dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                 *            /     /  \  /  \  /  \ | / | \  /  \  /  \  /  \     \
1452dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                 *           /     /    \/    \/    \|/  |  \/    \/    \     \     \
1453dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                 *      ----[\\\\\\\\\\\\\\\\\\\\\\\\]---|-----------------------------
1454dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                 *          |
1455dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                 *
1456dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                 *      W_L_STOP_1
1457dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                 */
1458dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1459dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                shift = exp + 15 - SCALING;
1460dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1461dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                Int16 dat1 = *(pFreq_2_Time_data_2++);
1462dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                Int16 win1 = *(pShort_Window_2--);
1463dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1464dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                temp  =  *(pScrath_mem);
1465dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                for (i = SHORT_WINDOW; i != 0; i--)
1466dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                {
1467dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    test  =  fxp_mul_16_by_16(dat1, win1) >> shift;
1468dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1469dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    temp += test;
1470dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1471dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    dat1 = *(pFreq_2_Time_data_1++);
1472dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    win1 = *(pShort_Window_1++);
1473dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1474dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    limiter(*(pOutput_buffer++), (temp + *(pOverlap_and_Add_Buffer_2x++)));
1475dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1476dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1477dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    *(pScrath_mem++) = fxp_mul_16_by_16(dat1, win1) >> shift;
1478dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    dat1 = *(pFreq_2_Time_data_2++);
1479dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    win1 = *(pShort_Window_2--);
1480dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    temp  =  *(pScrath_mem);
1481dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1482dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                }
1483dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1484dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            }   /* if (exp < 16) */
1485dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            else
1486dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            {
1487dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                test  = *(pScrath_mem);
1488dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                temp  = *(pOverlap_and_Add_Buffer_2x++);
1489dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1490dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                for (i = SHORT_WINDOW; i != 0; i--)
1491dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                {
1492dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    limiter(*(pOutput_buffer++), (temp + test));
1493dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1494dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    *(pScrath_mem++) = 0;
1495dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    test  =  *(pScrath_mem);
1496dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    temp  = *(pOverlap_and_Add_Buffer_2x++);
1497dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1498dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                }
1499dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            }
1500dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1501dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        }   /* for ( wnd=NUM_SHORT_WINDOWS/2-1; wnd>=0; wnd--) */
1502dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1503dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        pOverlap_and_Add_Buffer_2x =  &Time_data[W_L_STOP_1];
1504dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1505dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        pScrath_mem = pScrath_mem_entry;
1506dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1507dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        pOutput_buffer_2 -= SHORT_WINDOW;
1508dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        pOutput_buffer = pOutput_buffer_2;
1509dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1510dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        test  = *(pScrath_mem++);
1511dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        temp  = *(pOverlap_and_Add_Buffer_2x++);
1512dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1513dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        for (i = SHORT_WINDOW; i != 0; i--)
1514dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        {
1515dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            limiter(*(pOutput_buffer++), (temp + test));
1516dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1517dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            test  = *(pScrath_mem++);
1518dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            temp  = *(pOverlap_and_Add_Buffer_2x++);
1519dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1520dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        }
1521dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1522dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        pOverlap_and_Add_Buffer_1x = Time_data;
1523dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1524dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        pOutput_buffer = Output_buffer;
1525dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1526dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1527dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        temp = *(pOverlap_and_Add_Buffer_1x++);
1528dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1529dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        for (i = W_L_STOP_1; i != 0; i--)
1530dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        {
1531dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            limiter(*(pOutput_buffer++), temp);
1532dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1533dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            temp = *(pOverlap_and_Add_Buffer_1x++);
1534dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        }
1535dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1536dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        pOverlap_and_Add_Buffer_1x = &Time_data[0];
1537dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1538dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        pOverlap_and_Add_Buffer_2 = &pFrequency_data[LONG_WINDOW];
1539dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1540dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        /*
1541dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber         *  update overlap and add buffer,
1542dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber         *  so is ready for next iteration
1543dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber         */
1544dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1545dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        for (int i = 0; i < W_L_STOP_2; i++)
1546dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        {
1547dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            temp = *(pOverlap_and_Add_Buffer_2++);
1548dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            *(pOverlap_and_Add_Buffer_1x++) = temp;
1549dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        }
1550dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1551dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        pv_memset(
1552dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            pOverlap_and_Add_Buffer_1x,
1553dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            0,
1554dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            W_L_STOP_1*sizeof(*pOverlap_and_Add_Buffer_1x));
1555dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1556dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    } /* if ( wnd_seq != EIGHT_SHORT_SEQUENCE) */
1557dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1558dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber}
1559dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1560dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#endif
1561dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*----------------------------------------------------------------------------
1562dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; FUNCTION CODE
1563dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber----------------------------------------------------------------------------*/
1564dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1565dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1566dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1567dacaa73ae5010b66f4224d70a520945e5b653544Andreas Hubervoid trans4m_freq_2_time_fxp_2(
1568dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int32               Frequency_data[],
1569dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int32               Time_data[],
1570dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    WINDOW_SEQUENCE     wnd_seq,
1571dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int                 wnd_shape_prev_bk,
1572dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int                 wnd_shape_this_bk,
1573dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int                 Q_format,
1574dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int32               abs_max_per_window[],
1575dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int32               freq_2_time_buffer[],
1576dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int16               *Interleaved_output)
1577dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1578dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber{
1579dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1580dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int exp;
1581dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int shift;
1582dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1583dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int  i;
1584dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int  wnd;
1585dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#if !(defined( PV_ARM_GCC_V5)||(PV_ARM_V5))
1586dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int32 z;
1587dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#endif
1588dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int16 *pFreqInfo;
1589dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int32 temp;
1590dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int32 test;
1591dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1592dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int16 *pFreq_2_Time_data_1;
1593dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int16 *pFreq_2_Time_data_2;
1594dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1595dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    const Int16 *pLong_Window_1;
1596dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    const Int16 *pLong_Window_2;
1597dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    const Int16 *pShort_Window_1;
1598dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    const Int16 *pShort_Window_2;
1599dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1600dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int32 *pOverlap_and_Add_Buffer_1;
1601dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int32 *pOverlap_and_Add_Buffer_2;
1602dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1603dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int16  *pInterleaved_output;
1604dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int16  *pInterleaved_output_2;
1605dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1606dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1607dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    const Int16 * Long_Window_fxp[NUM_WINDOW_SHAPES];
1608dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    const Int16 * Short_Window_fxp[NUM_WINDOW_SHAPES];
1609dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1610dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Long_Window_fxp[0] = Long_Window_sine_fxp;
1611dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Long_Window_fxp[1] = Long_Window_KBD_fxp;
1612dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Short_Window_fxp[0] = Short_Window_sine_fxp;
1613dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Short_Window_fxp[1] = Short_Window_KBD_fxp;
1614dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1615dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    if (wnd_seq != EIGHT_SHORT_SEQUENCE)
1616dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    {
1617dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1618dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        pFreqInfo = (Int16 *)Frequency_data;
1619dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1620dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1621dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        exp = imdct_fxp(
1622dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                  (Int32 *)pFreqInfo,
1623dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                  freq_2_time_buffer,
1624dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                  LONG_BLOCK1,
1625dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                  Q_format,
1626dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                  abs_max_per_window[0]);
1627dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1628dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1629dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        /*
1630dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber         *  The C Programming Language, Second Edition, Kernighan & Ritchie,
1631dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber         *  page 206.
1632dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber         *  "The result [of a shift] is undefined if the right operand is
1633dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber         *  negative, or greater than or equal to the number of bits in the
1634dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber         *  left expression's type"
1635dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber         *   => avoid shift by 32 or 16
1636dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber         */
1637dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1638dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        if (exp < 16)
1639dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        {
1640dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1641dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            pFreq_2_Time_data_1 = pFreqInfo;
1642dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1643dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1644dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            switch (wnd_seq)
1645dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            {
1646dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1647dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                case ONLY_LONG_SEQUENCE:
1648dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                default:
1649dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1650dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                {
1651dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    pOverlap_and_Add_Buffer_1 = Time_data;
1652dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1653dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    pInterleaved_output = Interleaved_output;
1654dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1655dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    {
1656dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1657dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        const Int16 *pLong_Window_2 = &Long_Window_fxp[wnd_shape_this_bk][LONG_WINDOW_m_1];
1658dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1659dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        Int32 * pFreq2T   = (Int32 *)pFreqInfo;
1660dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        Int32 * pFreq2T_2 = &pFreq2T[HALF_LONG_WINDOW];
1661dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        Int32 * win = (Int32 *) & Long_Window_fxp[wnd_shape_prev_bk][0];
1662dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1663dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        Int shift = exp + 15 - SCALING;
1664dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1665dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        for (i = HALF_LONG_WINDOW; i != 0; i--)
1666dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        {
1667dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            Int16 win1, win2;
1668dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            Int32  temp2, test2;
1669dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1670dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            Int32  winx;
1671dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1672dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            temp2 = *(pFreq2T++);
1673dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            winx = *(win++);
1674dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1675dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            test  = *(pOverlap_and_Add_Buffer_1++);
1676dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            test2 = *(pOverlap_and_Add_Buffer_1--);
1677dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            temp  =   fxp_mul_16_by_16bb(temp2, winx) >> shift;
1678dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            temp2 =   fxp_mul_16_by_16tt(temp2, winx) >> shift;
1679dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1680dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            limiter(*(pInterleaved_output), (temp + test));
1681dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1682dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            limiter(*(pInterleaved_output + 2), (temp2 + test2));
1683dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            pInterleaved_output += 4;
1684dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1685dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            temp2 = *(pFreq2T_2++);
1686dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1687dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            win1  = *(pLong_Window_2--);
1688dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            win2  = *(pLong_Window_2--);
1689dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            temp  = fxp_mul_16_by_16bb(temp2, win1) >> shift;
1690dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            test2 = fxp_mul_16_by_16tb(temp2, win2) >> shift;
1691dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1692dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            *(pOverlap_and_Add_Buffer_1++) = temp;
1693dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            *(pOverlap_and_Add_Buffer_1++) = test2;
1694dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        }
1695dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1696dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    }
1697dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1698dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                }
1699dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1700dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                break;
1701dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1702dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                case LONG_START_SEQUENCE:
1703dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1704dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    pFreq_2_Time_data_2 =
1705dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        &pFreq_2_Time_data_1[ HALF_LONG_WINDOW];
1706dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1707dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    pLong_Window_1 = &Long_Window_fxp[wnd_shape_prev_bk][0];
1708dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    pLong_Window_2 = &pLong_Window_1[ HALF_LONG_WINDOW];
1709dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1710dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    pOverlap_and_Add_Buffer_1 = &Time_data[0];
1711dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    pOverlap_and_Add_Buffer_2 = &Time_data[HALF_LONG_WINDOW];
1712dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1713dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1714dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    pInterleaved_output   = Interleaved_output;
1715dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    pInterleaved_output_2 = pInterleaved_output + (2 * HALF_LONG_WINDOW);
1716dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1717dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1718dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    /*
1719dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                     *  process first  LONG_WINDOW elements
1720dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                     */
1721dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1722dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    shift = exp + 15 - SCALING;
1723dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1724dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    for (i = HALF_LONG_WINDOW; i != 0; i--)
1725dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    {
1726dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        Int16 win1, win2;
1727dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        Int16  dat1, dat2;
1728dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        Int32  test1, test2;
1729dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1730dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        dat1   = *(pFreq_2_Time_data_1++);
1731dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        win1   = *(pLong_Window_1++);
1732dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        test1  = *(pOverlap_and_Add_Buffer_1++);
1733dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1734dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        dat2  =  *(pFreq_2_Time_data_2++);
1735dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        win2  = *(pLong_Window_2++);
1736dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        test2 = *(pOverlap_and_Add_Buffer_2++);
1737dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1738dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        limiter(*(pInterleaved_output), (test1 + (fxp_mul_16_by_16(dat1, win1) >> shift)));
1739dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1740dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        pInterleaved_output   += 2;
1741dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1742dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        limiter(*(pInterleaved_output_2), (test2 + (fxp_mul_16_by_16(dat2, win2) >> shift)));
1743dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1744dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        pInterleaved_output_2    += 2;
1745dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    }
1746dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1747dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1748dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    /*
1749dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                     *  data unchanged from  LONG_WINDOW to W_L_START_1
1750dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                     *  only scaled accordingly
1751dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                     */
1752dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1753dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    pOverlap_and_Add_Buffer_1 = &Time_data[0];
1754dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    pFreq_2_Time_data_1       = &pFreqInfo[LONG_WINDOW];
1755dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1756dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    exp -= SCALING;
1757dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1758dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    if (exp >= 0)
1759dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    {
1760dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1761dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        for (i = (W_L_START_1 - LONG_WINDOW) >> 1; i != 0; i--)
1762dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        {
1763dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            *(pOverlap_and_Add_Buffer_1++) =
1764dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                *(pFreq_2_Time_data_1++) >> exp;
1765dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            *(pOverlap_and_Add_Buffer_1++) =
1766dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                *(pFreq_2_Time_data_1++) >> exp;
1767dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1768dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        }
1769dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1770dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    }
1771dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    else if (exp < 0)
1772dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    {
1773dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1774dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        Int shift = -exp;
1775dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        for (i = (W_L_START_1 - LONG_WINDOW) >> 1; i != 0 ; i--)
1776dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        {
1777dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            Int32 temp2 = ((Int32) * (pFreq_2_Time_data_1++)) << shift;
1778dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            *(pOverlap_and_Add_Buffer_1++) = temp2;
1779dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            temp2 = ((Int32) * (pFreq_2_Time_data_1++)) << shift;
1780dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            *(pOverlap_and_Add_Buffer_1++) = temp2;
1781dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        }
1782dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1783dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    }
1784dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    else
1785dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    {
1786dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1787dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        for (i = (W_L_START_1 - LONG_WINDOW) >> 1; i != 0; i--)
1788dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        {
1789dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            *(pOverlap_and_Add_Buffer_1++) =
1790dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                *(pFreq_2_Time_data_1++);
1791dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            *(pOverlap_and_Add_Buffer_1++) =
1792dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                *(pFreq_2_Time_data_1++);
1793dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1794dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        }
1795dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1796dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    }
1797dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1798dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1799dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    pFreq_2_Time_data_1  = &pFreqInfo[W_L_START_1];
1800dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    pFreq_2_Time_data_2  =
1801dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        &pFreq_2_Time_data_1[HALF_SHORT_WINDOW];
1802dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1803dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    pShort_Window_1   =
1804dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        &Short_Window_fxp[wnd_shape_this_bk][SHORT_WINDOW_m_1];
1805dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1806dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    pShort_Window_2   = pShort_Window_1 - HALF_SHORT_WINDOW;
1807dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1808dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    pOverlap_and_Add_Buffer_2 = pOverlap_and_Add_Buffer_1 +
1809dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                                HALF_SHORT_WINDOW;
1810dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1811dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    {
1812dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        Int16 win1, win2;
1813dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        Int16  dat1, dat2;
1814dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        Int32  temp2;
1815dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1816dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        for (i = HALF_SHORT_WINDOW; i != 0; i--)
1817dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        {
1818dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1819dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            dat1  = (*pFreq_2_Time_data_1++);
1820dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            dat2  = (*pFreq_2_Time_data_2++);
1821dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            win1  = *(pShort_Window_1--);
1822dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            win2  = *(pShort_Window_2--);
1823dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1824dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            temp   =   fxp_mul_16_by_16(dat1, win1) >> shift;
1825dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            *(pOverlap_and_Add_Buffer_1++) = temp;
1826dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1827dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            temp2 =   fxp_mul_16_by_16(dat2, win2) >> shift;
1828dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            *(pOverlap_and_Add_Buffer_2++) = temp2;
1829dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1830dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        }
1831dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    }
1832dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1833dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    pOverlap_and_Add_Buffer_1 += HALF_SHORT_WINDOW;
1834dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1835dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1836dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    pv_memset(
1837dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        pOverlap_and_Add_Buffer_1,
1838dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        0,
1839dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        (LONG_BLOCK1 - W_L_START_2)
1840dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        *sizeof(*pOverlap_and_Add_Buffer_1));
1841dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1842dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1843dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    break;
1844dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1845dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1846dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                case LONG_STOP_SEQUENCE:
1847dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1848dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    pOverlap_and_Add_Buffer_1 = &Time_data[ W_L_STOP_2];
1849dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1850dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    pInterleaved_output    = &Interleaved_output[2*W_L_STOP_2];
1851dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1852dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    pFreq_2_Time_data_1      = &pFreqInfo[W_L_STOP_2];
1853dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1854dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    exp -= SCALING;
1855dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1856dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1857dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    if (exp > 0)
1858dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    {
1859dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        Int16 tmp1 = (*(pFreq_2_Time_data_1++) >> exp);
1860dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        temp = *(pOverlap_and_Add_Buffer_1++);
1861dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1862dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        for (i = (LONG_WINDOW - W_L_STOP_2); i != 0; i--)
1863dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        {
1864dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            limiter(*(pInterleaved_output), (temp + tmp1));
1865dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1866dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            pInterleaved_output += 2;
1867dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            tmp1 = *(pFreq_2_Time_data_1++) >> exp;
1868dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            temp = *(pOverlap_and_Add_Buffer_1++);
1869dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        }
1870dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    }
1871dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    else if (exp < 0)
1872dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    {
1873dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        shift = -exp;
1874dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1875dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        Int32 temp1 = ((Int32) * (pFreq_2_Time_data_1++)) << shift;
1876dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        temp = *(pOverlap_and_Add_Buffer_1++);
1877dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1878dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        for (i = (LONG_WINDOW - W_L_STOP_2); i != 0; i--)
1879dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        {
1880dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            limiter(*(pInterleaved_output), (temp + temp1));
1881dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1882dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            pInterleaved_output += 2;
1883dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            temp1 = ((Int32) * (pFreq_2_Time_data_1++)) << shift;
1884dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            temp = *(pOverlap_and_Add_Buffer_1++);
1885dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        }
1886dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    }
1887dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    else
1888dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    {
1889dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        Int16 tmp1 = *(pFreq_2_Time_data_1++);
1890dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        temp = *(pOverlap_and_Add_Buffer_1++);
1891dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        for (i = (LONG_WINDOW - W_L_STOP_2); i != 0; i--)
1892dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        {
1893dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            limiter(*(pInterleaved_output), (temp + tmp1));
1894dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1895dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            pInterleaved_output += 2;
1896dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            tmp1 = *(pFreq_2_Time_data_1++);
1897dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            temp = *(pOverlap_and_Add_Buffer_1++);
1898dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        }
1899dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    }
1900dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1901dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1902dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1903dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    pShort_Window_1 = &Short_Window_fxp[wnd_shape_prev_bk][0];
1904dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    pShort_Window_2 = &pShort_Window_1[HALF_SHORT_WINDOW];
1905dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1906dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    pFreq_2_Time_data_1 = &pFreqInfo[W_L_STOP_1];
1907dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    pFreq_2_Time_data_2 =
1908dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        &pFreq_2_Time_data_1[HALF_SHORT_WINDOW];
1909dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1910dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    pOverlap_and_Add_Buffer_1 = &Time_data[ W_L_STOP_1];
1911dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    pOverlap_and_Add_Buffer_2 = pOverlap_and_Add_Buffer_1
1912dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                                + HALF_SHORT_WINDOW;
1913dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1914dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1915dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    pInterleaved_output   = &Interleaved_output[2*W_L_STOP_1];
1916dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    pInterleaved_output_2 = pInterleaved_output + (2 * HALF_SHORT_WINDOW);
1917dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1918dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    exp += SCALING;  /* +8 back to what it was */
1919dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    shift = exp + 15 - SCALING;
1920dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1921dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1922dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    for (i = HALF_SHORT_WINDOW; i != 0; i--)
1923dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    {
1924dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1925dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        Int16 win1;
1926dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        Int16 dat1;
1927dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1928dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        dat1 = *(pFreq_2_Time_data_1++);
1929dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        win1 = *(pShort_Window_1++);
1930dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        temp = *(pOverlap_and_Add_Buffer_1++);
1931dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1932dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        test  = fxp_mul_16_by_16(dat1, win1);
1933dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1934dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        limiter(*(pInterleaved_output), (temp + (test >> shift)));
1935dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1936dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        pInterleaved_output += 2;
1937dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1938dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        dat1 = *(pFreq_2_Time_data_2++);
1939dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        win1 = *(pShort_Window_2++);
1940dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        temp = *(pOverlap_and_Add_Buffer_2++);
1941dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        test =  fxp_mul_16_by_16(dat1, win1);
1942dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1943dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        limiter(*(pInterleaved_output_2), (temp + (test >> shift)));
1944dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1945dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        pInterleaved_output_2 += 2;
1946dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1947dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    }
1948dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1949dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1950dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1951dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    pFreq_2_Time_data_2 = &pFreqInfo[LONG_WINDOW];
1952dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1953dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    pOverlap_and_Add_Buffer_1 = Time_data;
1954dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1955dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1956dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    pInterleaved_output = Interleaved_output;
1957dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1958dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    pLong_Window_2   =
1959dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        &Long_Window_fxp[wnd_shape_this_bk][LONG_WINDOW_m_1];
1960dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1961dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1962dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    /*
1963dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                     *  Copy previous time in current buffer, also copy overlap
1964dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                     *  and add buffer
1965dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                     */
1966dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1967dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    for (i = W_L_STOP_1; i != 0; i--)
1968dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    {
1969dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1970dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        Int16 win1;
1971dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        Int16 dat1;
1972dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1973dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        win1 = *(pLong_Window_2--);
1974dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        dat1 = *pFreq_2_Time_data_2++;
1975dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1976dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        limiter(*(pInterleaved_output), *(pOverlap_and_Add_Buffer_1));
1977dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1978dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        pInterleaved_output += 2;
1979dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1980dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        temp = fxp_mul_16_by_16(dat1, win1) >> shift;
1981dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        *(pOverlap_and_Add_Buffer_1++) = temp ;
1982dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1983dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    }
1984dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1985dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    for (i = (LONG_WINDOW - W_L_STOP_1); i != 0; i--)
1986dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    {
1987dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1988dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        temp = fxp_mul_16_by_16(*pFreq_2_Time_data_2++, *(pLong_Window_2--)) >> shift;
1989dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        *(pOverlap_and_Add_Buffer_1++) = temp ;
1990dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1991dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    }
1992dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1993dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    break;
1994dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1995dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1996dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1997dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            } /* switch (wnd_seq) */
1998dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
1999dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        }   /*  if (exp < 16)  */
2000dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
2001dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        else
2002dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        {
2003dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            /* all zeros buffer or excessive down shift */
2004dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
2005dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            /* Overlap and add, setup buffer for next iteration */
2006dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            pOverlap_and_Add_Buffer_1 = &Time_data[0];
2007dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
2008dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            pInterleaved_output = Interleaved_output;
2009dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
2010dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
2011dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            temp  = (*pOverlap_and_Add_Buffer_1++);
2012dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            for (i = LONG_WINDOW; i != 0; i--)
2013dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            {
2014dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
2015dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                limiter(*(pInterleaved_output), temp);
2016dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
2017dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                pInterleaved_output += 2;
2018dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                temp  = (*pOverlap_and_Add_Buffer_1++);
2019dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            }
2020dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            pv_memset(Time_data, 0, LONG_WINDOW*sizeof(Time_data[0]));
2021dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        }
2022dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
2023dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    }
2024dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    else
2025dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    {
2026dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
2027dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        Int32 *pScrath_mem;
2028dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        Int32 *pScrath_mem_entry;
2029dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        Int32  *pFrequency_data = Frequency_data;
2030dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
2031dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        Int32 * pOverlap_and_Add_Buffer_1;
2032dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        Int32 * pOverlap_and_Add_Buffer_2;
2033dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        Int32 * pOverlap_and_Add_Buffer_1x;
2034dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        Int32 * pOverlap_and_Add_Buffer_2x;
2035dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
2036dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
2037dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        /*
2038dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber         *  Frequency_data is 2*LONG_WINDOW length but only
2039dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber         *  the first LONG_WINDOW elements are filled in,
2040dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber         *  then the second part can be used as scratch mem,
2041dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber         *  then grab data from one window at a time in
2042dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber         *  reverse order.
2043dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber         *  The upper LONG_WINDOW Int32 are used to hold the
2044dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber         *  computed overlap and add, used in the next call to
2045dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber         *  this function, and also as sctrach memory
2046dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber         */
2047dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
2048dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        /*
2049dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber         *  Frequency_data usage for the case EIGHT_SHORT_SEQUENCE
2050dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
2051dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber          |<----- Input Freq. data ----->|< Overlap & Add ->| Unused |-Scratch-|
2052dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber          |                              |  Store for next  |        |  memory |
2053dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber          |                              |  call            |        |         |
2054dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber          |                              |                  |        |         |
2055dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber          |//////////////////////////////|\\\\\\\\\\\\\\\\\\|--------|+++++++++|
2056dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber          |                              |                  |        |         |
2057dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber          0                         LONG_WINDOW        LONG_WINDOW   |   2*LONG_WINDOW
2058dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                                            +        |         |
2059dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                                       W_L_STOP_2    |         |
2060dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                                                     |<--   -->|
2061dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                                                      SHORT_WINDOW +
2062dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                                                    HALF_SHORT_WINDOW
2063dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber          *
2064dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber          */
2065dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
2066dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        pOverlap_and_Add_Buffer_1  = &pFrequency_data[
2067dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                         LONG_WINDOW + 3*SHORT_WINDOW + HALF_SHORT_WINDOW];
2068dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
2069dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        /*
2070dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber         *  Initialize to zero, only the firt short window used in overlap
2071dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber         *  and add
2072dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber         */
2073dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        pv_memset(
2074dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            pOverlap_and_Add_Buffer_1,
2075dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            0,
2076dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            SHORT_WINDOW*sizeof(*pOverlap_and_Add_Buffer_1));
2077dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
2078dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        /*
2079dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber         *  Showt windows are evaluated in decresing order. Windows from 7
2080dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber         *  to 0 are break down in four cases: window numbers 7 to 5, 4, 3,
2081dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber         *  and 2 to 0.
2082dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber         *  The data from short windows 3 and 4 is situated at the boundary
2083dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber         *  between the 'overlap and add' buffer and the output buffer.
2084dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber         */
2085dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        for (wnd = NUM_SHORT_WINDOWS - 1; wnd >= NUM_SHORT_WINDOWS / 2 + 1; wnd--)
2086dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        {
2087dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
2088dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            pFreqInfo = (Int16 *) & pFrequency_data[ wnd*SHORT_WINDOW];
2089dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
2090dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            exp = imdct_fxp(
2091dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                      (Int32 *)pFreqInfo,
2092dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                      freq_2_time_buffer,
2093dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                      SHORT_BLOCK1,
2094dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                      Q_format,
2095dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                      abs_max_per_window[wnd]);
2096dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
2097dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            /*  W_L_STOP_1 == (LONG_WINDOW - SHORT_WINDOW)>>1 */
2098dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            pOverlap_and_Add_Buffer_1 =
2099dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                &pFrequency_data[ W_L_STOP_1 + SHORT_WINDOW*wnd];
2100dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
2101dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
2102dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            pOverlap_and_Add_Buffer_2 =
2103dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                pOverlap_and_Add_Buffer_1 + SHORT_WINDOW;
2104dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
2105dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            /*
2106dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber             *  If all element are zero or if the exponent is bigger than
2107dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber             *  16 ( it becomes an undefined shift) ->  skip
2108dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber             */
2109dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
2110dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            if (exp < 16)
2111dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            {
2112dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
2113dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
2114dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                pFreq_2_Time_data_1 = &pFreqInfo[0];
2115dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                pFreq_2_Time_data_2 = &pFreqInfo[SHORT_WINDOW];
2116dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
2117dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
2118dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                /*
2119dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                 *  Each of the eight short blocks is windowed separately.
2120dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                 *  Window shape decisions are made on a frame-by-frame
2121dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                 *  basis.
2122dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                 */
2123dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
2124dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                pShort_Window_1 = &Short_Window_fxp[wnd_shape_this_bk][0];
2125dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
2126dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                pShort_Window_2   =
2127dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    &Short_Window_fxp[wnd_shape_this_bk][SHORT_WINDOW_m_1];
2128dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
2129dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
2130dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
2131dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
2132dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                /*
2133dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                 * For short windows from 7 to 5
2134dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                 *                                      |   =========================
2135dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                 *                                      |   |     5     6     7
2136dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                 *               _--_  _--_  _--_  _--_ | _-|-_  _--_  _--_  _--_
2137dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                 *              /    \/    \/    \/    \|/  |  \/    \/    \/    \
2138dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                 *             /     /\    /\    /\    /|\  |  /\    /\    /\     \
2139dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                 *            /     /  \  /  \  /  \  / | \ | /  \  /  \  /  \     \
2140dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                 *           /     /    \/    \/    \/  |  \|/    \/    \     \     \
2141dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                 *      --------------------------------|---[///////////////////////]--------
2142dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                 *
2143dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                 */
2144dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
2145dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
2146dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                shift = exp + 15 - SCALING;
2147dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
2148dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
2149dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                for (i = SHORT_WINDOW; i != 0; i--)
2150dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                {
2151dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    Int16 win1, win2;
2152dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    Int16  dat1, dat2;
2153dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
2154dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    dat2 = *(pFreq_2_Time_data_2++);
2155dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    win2 = *(pShort_Window_2--);
2156dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    temp = *pOverlap_and_Add_Buffer_2;
2157dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    dat1 = *(pFreq_2_Time_data_1++);
2158dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    win1 = *(pShort_Window_1++);
2159dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
2160dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    *(pOverlap_and_Add_Buffer_2++) =  temp + (fxp_mul_16_by_16(dat2, win2) >> shift);
2161dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
2162dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    *(pOverlap_and_Add_Buffer_1++)  =  fxp_mul_16_by_16(dat1, win1) >> shift;
2163dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
2164dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                }
2165dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
2166dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            }   /* if (exp < 16) */
2167dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            else
2168dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            {
2169dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                pv_memset(
2170dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    pOverlap_and_Add_Buffer_1,
2171dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    0,
2172dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    SHORT_WINDOW*sizeof(*pOverlap_and_Add_Buffer_1));
2173dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            }
2174dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
2175dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
2176dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        }/* for ( wnd=NUM_SHORT_WINDOWS-1; wnd>=NUM_SHORT_WINDOWS/2; wnd--) */
2177dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
2178dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
2179dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        wnd = NUM_SHORT_WINDOWS / 2;
2180dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
2181dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        pFreqInfo = (Int16 *) & pFrequency_data[ wnd*SHORT_WINDOW];
2182dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
2183dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        /*
2184dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber         *  scratch memory is allocated in an unused part of memory
2185dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber         */
2186dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
2187dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
2188dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        pScrath_mem = &pFrequency_data[ 2*LONG_WINDOW - HALF_SHORT_WINDOW];
2189dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
2190dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        pOverlap_and_Add_Buffer_1 = &pFrequency_data[ LONG_WINDOW];
2191dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
2192dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        pOverlap_and_Add_Buffer_2 = pOverlap_and_Add_Buffer_1
2193dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                    + HALF_SHORT_WINDOW;
2194dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
2195dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
2196dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        exp = imdct_fxp(
2197dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                  (Int32 *)pFreqInfo,
2198dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                  freq_2_time_buffer,
2199dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                  SHORT_BLOCK1,
2200dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                  Q_format,
2201dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                  abs_max_per_window[wnd]);
2202dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
2203dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        /*
2204dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber         *  If all element are zero or if the exponent is bigger than
2205dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber         *  16 ( it becomes an undefined shift) ->  skip
2206dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber         */
2207dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
2208dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
2209dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        if (exp < 16)
2210dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        {
2211dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
2212dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            pFreq_2_Time_data_1 = &pFreqInfo[0];
2213dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            pFreq_2_Time_data_2 = &pFreqInfo[SHORT_WINDOW];
2214dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
2215dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            pShort_Window_1 = &Short_Window_fxp[wnd_shape_this_bk][0];
2216dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
2217dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            pShort_Window_2 =
2218dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                &Short_Window_fxp[wnd_shape_this_bk][SHORT_WINDOW_m_1];
2219dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
2220dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
2221dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            /*
2222dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber             * For short window 4
2223dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber             *                                    ====|===========
2224dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber             *                                        |   4
2225dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber             *                                    |   |   |      |
2226dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber             *                _--_  _--_  _--_  _-|-_ | _-|-_  _-|-_  _--_  _--_
2227dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber             *               /    \/    \/    \/  |  \|/  |  \/  |  \/    \/    \
2228dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber             *              /     /\    /\    /\  |  /|\  |  /\  |  /\    /\     \
2229dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber             *             /     /  \  /  \  /  \ | / | \ | /  \ | /  \  /  \     \
2230dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber             *            /     /    \/    \/    \|/  |  \|/    \|/    \/    \     \
2231dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber             *      ------------------------------[\\\|\\\|//////]-------------------
2232dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber             *           |                        | A | B |   C  |
2233dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber             *           |
2234dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber             *        W_L_STOP_1
2235dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber             */
2236dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
2237dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            shift = exp + 15 - SCALING;
2238dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            {
2239dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                Int16 win1;
2240dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                Int16  dat1;
2241dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                /* -------- segment A ---------------*/
2242dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                dat1 = *(pFreq_2_Time_data_1++);
2243dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                win1 = *(pShort_Window_1++);
2244dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                for (i = HALF_SHORT_WINDOW; i != 0; i--)
2245dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                {
2246dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    *(pScrath_mem++)  =  fxp_mul_16_by_16(dat1, win1) >> shift;
2247dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    dat1 = *(pFreq_2_Time_data_1++);
2248dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    win1 = *(pShort_Window_1++);
2249dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                }
2250dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
2251dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                /* -------- segment B ---------------*/
2252dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                for (i = HALF_SHORT_WINDOW; i != 0; i--)
2253dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                {
2254dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    *(pOverlap_and_Add_Buffer_1++)  =  fxp_mul_16_by_16(dat1, win1) >> shift;
2255dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
2256dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    dat1 = *(pFreq_2_Time_data_1++);
2257dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    win1 = *(pShort_Window_1++);
2258dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                }
2259dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
2260dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                /* -------- segment C ---------------*/
2261dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                temp = *pOverlap_and_Add_Buffer_2;
2262dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                dat1 = *(pFreq_2_Time_data_2++);
2263dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                win1 = *(pShort_Window_2--);
2264dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
2265dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                for (i = SHORT_WINDOW; i != 0; i--)
2266dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                {
2267dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    *(pOverlap_and_Add_Buffer_2++)  =  temp + (fxp_mul_16_by_16(dat1, win1) >> shift);
2268dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
2269dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    temp = *pOverlap_and_Add_Buffer_2;
2270dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    dat1 = *(pFreq_2_Time_data_2++);
2271dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    win1 = *(pShort_Window_2--);
2272dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                }
2273dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            }
2274dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
2275dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        }   /* if (exp < 16) */
2276dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        else
2277dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        {
2278dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            pv_memset(
2279dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                pScrath_mem,
2280dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                0,
2281dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                HALF_SHORT_WINDOW*sizeof(*pScrath_mem));
2282dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
2283dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            pv_memset(
2284dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                pOverlap_and_Add_Buffer_1,
2285dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                0,
2286dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                HALF_SHORT_WINDOW*sizeof(*pOverlap_and_Add_Buffer_1));
2287dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        }
2288dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
2289dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
2290dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        wnd = NUM_SHORT_WINDOWS / 2 - 1;
2291dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
2292dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        pFreqInfo = (Int16 *) & pFrequency_data[ wnd*SHORT_WINDOW];
2293dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
2294dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        pScrath_mem_entry =
2295dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            &pFrequency_data[2*LONG_WINDOW - HALF_SHORT_WINDOW - SHORT_WINDOW];
2296dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
2297dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
2298dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        pScrath_mem = pScrath_mem_entry;
2299dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
2300dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        pOverlap_and_Add_Buffer_1 = &pFrequency_data[ LONG_WINDOW];
2301dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
2302dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        /* point to end of buffer less HALF_SHORT_WINDOW */
2303dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
2304dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        pInterleaved_output_2 = &Interleaved_output[2*(LONG_WINDOW - HALF_SHORT_WINDOW)];
2305dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        pInterleaved_output = pInterleaved_output_2;
2306dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
2307dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        pOverlap_and_Add_Buffer_1x = &Time_data[W_L_STOP_1 + SHORT_WINDOW*(wnd+1)];
2308dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
2309dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
2310dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        exp = imdct_fxp(
2311dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                  (Int32 *)pFreqInfo,
2312dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                  freq_2_time_buffer,
2313dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                  SHORT_BLOCK1,
2314dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                  Q_format,
2315dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                  abs_max_per_window[wnd]);
2316dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
2317dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        /*
2318dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber         *  If all element are zero or if the exponent is bigger than
2319dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber         *  16 ( it becomes an undefined shift) ->  skip
2320dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber         */
2321dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
2322dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        if (exp < 16)
2323dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        {
2324dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
2325dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            pFreq_2_Time_data_1 = &pFreqInfo[0];
2326dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            pFreq_2_Time_data_2 = &pFreqInfo[SHORT_WINDOW];
2327dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
2328dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
2329dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            /*
2330dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber             * For short window 3
2331dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber             *                             ===========|====
2332dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber             *                                    3   |
2333dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber             *                             |      |   |   |
2334dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber             *               _--_  _--_  _-|-_  _-|-_ | _-|-_  _--_  _--_  _--_
2335dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber             *              /    \/    \/  |  \/  |  \|/  |  \/    \/    \/    \
2336dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber             *             /     /\    /\  |  /\  |  /|\  |  /\    /\    /\     \
2337dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber             *            /     /  \  /  \ | /  \ | / | \ | /  \  /  \  /  \     \
2338dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber             *           /     /    \/    \|/    \|/  |  \|/    \/    \     \     \
2339dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber             *     -----|------------------[\\\\\\|///|///]--------------------------
2340dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber             *          |                  |   A  | B | C |
2341dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber             *
2342dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber             *      W_L_STOP_1
2343dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber             */
2344dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
2345dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
2346dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            pShort_Window_1 = &Short_Window_fxp[wnd_shape_this_bk][0];
2347dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
2348dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            pShort_Window_2 =
2349dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                &Short_Window_fxp[wnd_shape_this_bk][SHORT_WINDOW_m_1];
2350dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
2351dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            shift = exp + 15 - SCALING;
2352dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
2353dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            Int16 win1;
2354dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            Int16  dat1;
2355dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            /* -------- segment A ---------------*/
2356dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            dat1 = *(pFreq_2_Time_data_1++);
2357dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            win1 = *(pShort_Window_1++);
2358dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            for (i = SHORT_WINDOW; i != 0; i--)
2359dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            {
2360dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                *(pScrath_mem++)  =  fxp_mul_16_by_16(dat1, win1) >> shift;
2361dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                dat1 = *(pFreq_2_Time_data_1++);
2362dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                win1 = *(pShort_Window_1++);
2363dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            }
2364dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
2365dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            dat1 = *(pFreq_2_Time_data_2++);
2366dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            win1 = *(pShort_Window_2--);
2367dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
2368dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
2369dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            /* -------- segment B ---------------*/
2370dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            for (i = HALF_SHORT_WINDOW; i != 0; i--)
2371dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            {
2372dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                test = fxp_mul_16_by_16(dat1, win1) >> shift;
2373dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
2374dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                temp =  *(pScrath_mem++) + test;
2375dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
2376dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                test = *(pOverlap_and_Add_Buffer_1x++);
2377dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                limiter(*(pInterleaved_output), (temp + test));
2378dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
2379dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
2380dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                pInterleaved_output += 2;
2381dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                dat1 = *(pFreq_2_Time_data_2++);
2382dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                win1 = *(pShort_Window_2--);
2383dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
2384dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            }
2385dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
2386dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            /* -------- segment C ---------------*/
2387dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            for (i = HALF_SHORT_WINDOW; i != 0; i--)
2388dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            {
2389dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
2390dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                temp = fxp_mul_16_by_16(dat1, win1) >> shift;
2391dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
2392dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                *(pOverlap_and_Add_Buffer_1++) += temp;
2393dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
2394dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                dat1 = *(pFreq_2_Time_data_2++);
2395dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                win1 = *(pShort_Window_2--);
2396dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            }
2397dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
2398dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
2399dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        }   /* if (exp < 16) */
2400dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        else
2401dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        {
2402dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
2403dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            pv_memset(
2404dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                pScrath_mem,
2405dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                0,
2406dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                SHORT_WINDOW*sizeof(*pScrath_mem));
2407dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
2408dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            pScrath_mem += SHORT_WINDOW;
2409dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
2410dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            temp = *(pScrath_mem++);
2411dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            for (i = HALF_SHORT_WINDOW; i != 0; i--)
2412dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            {
2413dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                limiter(*(pInterleaved_output), (temp));
2414dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
2415dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                pInterleaved_output += 2;
2416dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                temp = *(pScrath_mem++);
2417dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
2418dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            }
2419dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        }
2420dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
2421dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
2422dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        for (wnd = NUM_SHORT_WINDOWS / 2 - 2; wnd >= 0; wnd--)
2423dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        {
2424dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
2425dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
2426dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            pInterleaved_output_2 -= (SHORT_WINDOW * 2);
2427dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            pInterleaved_output = pInterleaved_output_2;
2428dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
2429dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            /*
2430dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber             * The same memory is used as scratch in every iteration
2431dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber             */
2432dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            pScrath_mem = pScrath_mem_entry;
2433dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
2434dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            pOverlap_and_Add_Buffer_2x =
2435dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                &Time_data[W_L_STOP_1 + SHORT_WINDOW*(wnd+1)];
2436dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
2437dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            pFreqInfo = (Int16 *) & pFrequency_data[ wnd*SHORT_WINDOW];
2438dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
2439dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
2440dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
2441dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            exp = imdct_fxp(
2442dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                      (Int32 *)pFreqInfo,
2443dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                      freq_2_time_buffer,
2444dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                      SHORT_BLOCK1,
2445dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                      Q_format,
2446dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                      abs_max_per_window[wnd]);
2447dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
2448dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            /*
2449dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber             *  If all element are zero or if the exponent is bigger than
2450dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber             *  16 ( it becomes an undefined shift) ->  skip
2451dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber             */
2452dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
2453dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            if (exp < 16)
2454dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            {
2455dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
2456dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                pFreq_2_Time_data_1 = &pFreqInfo[0];
2457dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                pFreq_2_Time_data_2 = &pFreqInfo[SHORT_WINDOW];
2458dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
2459dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
2460dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                /*
2461dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                 *  Each of the eight short blocks is windowed separately.
2462dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                 *  Window shape decisions are made on a frame-by-frame
2463dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                 *  basis.
2464dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                 */
2465dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
2466dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                pShort_Window_1 = &Short_Window_fxp[wnd_shape_this_bk][0];
2467dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
2468dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                if (wnd == 0)
2469dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                {
2470dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    pShort_Window_1 =
2471dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        &Short_Window_fxp[wnd_shape_prev_bk][0];
2472dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                }
2473dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
2474dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                pShort_Window_2   =
2475dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    &Short_Window_fxp[wnd_shape_this_bk][SHORT_WINDOW_m_1];
2476dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
2477dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
2478dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                /*
2479dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                 * For short windows from 2 to 0
2480dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                 *
2481dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                 *          =========================
2482dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                 *                                       |
2483dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                 *                0     1     2      |   |
2484dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                 *               _--_  _--_  _--_  _-|-_ | _--_  _--_  _--_  _--_
2485dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                 *              /    \/    \/    \/  |  \|/    \/    \/    \/    \
2486dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                 *             /     /\    /\    /\  |  /|\    /\    /\    /\     \
2487dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                 *            /     /  \  /  \  /  \ | / | \  /  \  /  \  /  \     \
2488dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                 *           /     /    \/    \/    \|/  |  \/    \/    \     \     \
2489dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                 *      ----[\\\\\\\\\\\\\\\\\\\\\\\\]---|-----------------------------
2490dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                 *          |
2491dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                 *
2492dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                 *      W_L_STOP_1
2493dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                 */
2494dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
2495dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                shift = exp + 15 - SCALING;
2496dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
2497dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                Int16 dat1 = *(pFreq_2_Time_data_2++);
2498dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                Int16 win1 = *(pShort_Window_2--);
2499dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
2500dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                temp  =  *(pScrath_mem);
2501dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                for (i = SHORT_WINDOW; i != 0; i--)
2502dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                {
2503dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    test  =  fxp_mul_16_by_16(dat1, win1) >> shift;
2504dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
2505dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    temp += test;
2506dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    dat1 = *(pFreq_2_Time_data_1++);
2507dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    win1 = *(pShort_Window_1++);
2508dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
2509dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    limiter(*(pInterleaved_output), (temp + *(pOverlap_and_Add_Buffer_2x++)));
2510dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
2511dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    pInterleaved_output += 2;
2512dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
2513dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    *(pScrath_mem++) = fxp_mul_16_by_16(dat1, win1) >> shift;
2514dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    dat1 = *(pFreq_2_Time_data_2++);
2515dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    win1 = *(pShort_Window_2--);
2516dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    temp  =  *(pScrath_mem);
2517dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
2518dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                }
2519dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
2520dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            }   /* if (exp < 16) */
2521dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            else
2522dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            {
2523dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                test  = *(pScrath_mem);
2524dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                temp  = *(pOverlap_and_Add_Buffer_2x++);
2525dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
2526dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                for (i = SHORT_WINDOW; i != 0; i--)
2527dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                {
2528dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    limiter(*(pInterleaved_output), (temp + test));
2529dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
2530dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    pInterleaved_output += 2;
2531dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
2532dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    *(pScrath_mem++) = 0;
2533dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    test  =  *(pScrath_mem);
2534dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    temp  = *(pOverlap_and_Add_Buffer_2x++);
2535dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                }
2536dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            }
2537dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
2538dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        }   /* for ( wnd=NUM_SHORT_WINDOWS/2-1; wnd>=0; wnd--) */
2539dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
2540dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        pOverlap_and_Add_Buffer_2x =  &Time_data[W_L_STOP_1];
2541dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
2542dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        pScrath_mem = pScrath_mem_entry;
2543dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
2544dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        pInterleaved_output_2 -= (SHORT_WINDOW * 2);
2545dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        pInterleaved_output    = pInterleaved_output_2;
2546dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
2547dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        test  = *(pScrath_mem++);
2548dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        temp  = *(pOverlap_and_Add_Buffer_2x++);
2549dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
2550dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        for (i = SHORT_WINDOW; i != 0; i--)
2551dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        {
2552dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            limiter(*(pInterleaved_output), (temp + test));
2553dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
2554dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            pInterleaved_output += 2;
2555dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            test  = *(pScrath_mem++);
2556dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            temp  = *(pOverlap_and_Add_Buffer_2x++);
2557dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
2558dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        }
2559dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
2560dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        pOverlap_and_Add_Buffer_1x = Time_data;
2561dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
2562dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        pInterleaved_output = Interleaved_output;
2563dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
2564dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
2565dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        temp = *(pOverlap_and_Add_Buffer_1x++);
2566dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        for (i = W_L_STOP_1; i != 0; i--)
2567dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        {
2568dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            limiter(*(pInterleaved_output), temp);
2569dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
2570dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            pInterleaved_output += 2;
2571dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            temp = *(pOverlap_and_Add_Buffer_1x++);
2572dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
2573dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        }
2574dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
2575dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        pOverlap_and_Add_Buffer_1x = &Time_data[0];
2576dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
2577dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        pOverlap_and_Add_Buffer_2 = &pFrequency_data[LONG_WINDOW];
2578dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
2579dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        /*
2580dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber         *  update overlap and add buffer,
2581dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber         *  so is ready for next iteration
2582dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber         */
2583dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
2584dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        for (int i = 0; i < W_L_STOP_2; i++)
2585dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        {
2586dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            temp = *(pOverlap_and_Add_Buffer_2++);
2587dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            *(pOverlap_and_Add_Buffer_1x++) = temp;
2588dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        }
2589dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
2590dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        pv_memset(
2591dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            pOverlap_and_Add_Buffer_1x,
2592dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            0,
2593dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            W_L_STOP_1*sizeof(*pOverlap_and_Add_Buffer_1x));
2594dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
2595dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    } /* if ( wnd_seq != EIGHT_SHORT_SEQUENCE) */
2596dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
2597dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
2598dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
2599dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
2600dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber}   /* trans4m_freq_2_time_fxp */
2601dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
2602dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
2603dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
2604dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
2605