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