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: lt_decode.c
21f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
22f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
23f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber------------------------------------------------------------------------------
24f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
25f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber REVISION HISTORY
26f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
27f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber Description:  Modified from original shareware code
28f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
29f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber Description:  Modified to pass variables by reference to eliminate use
30f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber               of global variables.
31f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
32f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber Description:  First round of optimizations.
33f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
34f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber Description:  pInputStream is now the 2nd parameter to this function.
35f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
36f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber Description:  Changed to work with MT's new get_ics_info.c function, which
37f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber only calls lt_decode if LTP is enabled.  This removes one grab from the
38f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber bitstream and one "if" from this code.  Also, changed setting of weight.
39f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber Now, rather than setting the actual weight, I only set the index into
40f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber a table in this function.
41f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
42f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber Description: Replace some instances of getbits to get9_n_lessbits
43f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber              when the number of bits read is 9 or less and get1bits
44f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber              when only 1 bit is read.
45f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
46f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber Who:                                   Date:
47f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber Description:
48f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber------------------------------------------------------------------------------
49f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber INPUT AND OUTPUT DEFINITIONS
50f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
51f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber Inputs:
52f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    win_type        Type of window (SHORT or LONG)
53f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                    [WINDOW_TYPE]
54f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
55f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    max_sfb         Maximum number of active scalefactor bands
56f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                    [Int]
57f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
58f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    pLt_pred        Pointer to structure containing information for
59f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                    long-term prediction.
60f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                    [LT_PRED_STATUS *]
61f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
62f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    pInputStream    Pointer to structure containing bitstream
63f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                    information.
64f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                    [BITS *]
65f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
66f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber Local Stores/Buffers/Pointers Needed:
67f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    None
68f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
69f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber Global Stores/Buffers/Pointers Needed:
70f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    None
71f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
72f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber Outputs:
73f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    None
74f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
75f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber Pointers and Buffers Modified:
76f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    pLt_pred->weight_index - updated with index into weight table for LTP.
77f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
78f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber Local Stores Modified:
79f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    None
80f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
81f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber Global Stores Modified:
82f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    None
83f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
84f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber------------------------------------------------------------------------------
85f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber FUNCTION DESCRIPTION
86f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
87f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber This function decodes the bitstream elements for long term prediction
88f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
89f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber------------------------------------------------------------------------------
90f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber REQUIREMENTS
91f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
92f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
93f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber------------------------------------------------------------------------------
94f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber REFERENCES
95f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
96f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber (1) MPEG-2 NBC Audio Decoder
97f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber   "This software module was originally developed by Nokia
98f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber   in the course of development of the MPEG-2 AAC/MPEG-4 Audio standard
99f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber   ISO/IEC13818-7, 14496-1, 2 and 3.  This software module is an implementation
100f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber   of a part of one or more MPEG-2 AAC/MPEG-4 Audio tools as specified by the
101f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber   MPEG-2 aac/MPEG-4 Audio standard. ISO/IEC  gives users of the
102f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber   MPEG-2aac/MPEG-4 Audio standards free license to this software module or
103f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber   modifications thereof for use in hardware or software products claiming
104f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber   conformance to the MPEG-2 aac/MPEG-4 Audio  standards. Those intending to
105f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber   use this software module in hardware or software products are advised that
106f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber   this use may infringe existing patents. The original developer of this
107f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber   software module, the subsequent editors and their companies, and ISO/IEC
108f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber   have no liability for use of this software module or modifications thereof
109f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber   in an implementation. Copyright is not released for non MPEG-2 aac/MPEG-4
110f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber   Audio conforming products. The original developer retains full right to use
111f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber   the code for the developer's own purpose, assign or donate the code to a
112f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber   third party and to inhibit third party from using the code for non
113f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber   MPEG-2 aac/MPEG-4 Audio conforming products. This copyright notice
114f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber   must be included in all copies or derivative works."
115f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber   Copyright (c)1997.
116f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
117f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber------------------------------------------------------------------------------
118f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber PSEUDO-CODE
119f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
120f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    pDelay[0] = (Int) getbits(
121f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                        LEN_LTP_LAG,
122f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                        pInputStream);
123f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
124f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    temp_reg  = (Int) getbits(
125f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                        LEN_LTP_COEF,
126f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                        pInputStream);
127f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
128f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    pLt_pred->weight = codebook[temp_reg];
129f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
130f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    last_band = max_sfb;
131f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
132f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    IF (win_type != EIGHT_SHORT_SEQUENCE)
133f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
134f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber        IF (last_band > MAX_LT_PRED_LONG_SFB)
135f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
136f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber            last_band = MAX_LT_PRED_LONG_SFB;
137f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
138f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber        ENDIF
139f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
140f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber        FOR (m = last_band; m > 0; m--)
141f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
142f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber            *(pSfbPredictionUsed++) = (Int) getbits(
143f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                                               LEN_LTP_LONG_USED,
144f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                                               pInputStream);
145f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber        ENDFOR
146f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
147f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber        FOR (m = (max_sfb - last_band); m > 0; m--)
148f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
149f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber            *(pSfbPredictionUsed++) = 0;
150f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
151f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber        ENDFOR
152f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
153f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    ELSE
154f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
155f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber        IF (last_band > MAX_LT_PRED_SHORT_SFB)
156f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
157f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber            last_band = MAX_LT_PRED_SHORT_SFB;
158f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
159f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber        ENDIF
160f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
161f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber        prev_subblock = pDelay[0];
162f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
163f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber        pWinPredictionUsed++;
164f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
165f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber        pTempPtr = &pSfbPredictionUsed[0];
166f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
167f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber        FOR (m = NUM_SHORT_WINDOWS; m > 0;)
168f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
169f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber            m--;
170f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber            temp_reg = (Int) getbits(
171f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                                LEN_LTP_SHORT_USED,
172f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                                pInputStream);
173f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
174f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber            *(pWinPredictionUsed++) = temp_reg;
175f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
176f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber            IF (temp_reg != FALSE)
177f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber            {
178f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                *(pDelay++) = prev_subblock;
179f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
180f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                FOR (k = last_band; k > 0; k--)
181f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                {
182f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                    *(pTempPtr++) = 1;
183f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                }
184f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                break;
185f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber            ELSE
186f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber            {
187f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                pDelay++;
188f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                pTempPtr += last_band;
189f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber            }
190f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
191f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber        ENDFOR (m = NUM_SHORT_WINDOWS; m > 0;)
192f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
193f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber        prev_subblock += LTP_LAG_OFFSET;
194f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
195f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber        FOR (; m > 0; m--)
196f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
197f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber            temp_reg = (Int) getbits (
198f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                                LEN_LTP_SHORT_USED,
199f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                                pInputStream);
200f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
201f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber            *(pWinPredictionUsed++) = temp_reg;
202f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
203f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber            IF (temp_reg != FALSE)
204f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
205f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                temp_reg = (Int) getbits(
206f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                                    LEN_LTP_SHORT_LAG_PRESENT,
207f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                                    pInputStream);
208f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                IF (temp_reg != 0)
209f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
210f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                    temp_reg  = (Int) getbits(
211f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                                         LEN_LTP_SHORT_LAG,
212f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                                         pInputStream);
213f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
214f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                    *(pDelay++) = prev_subblock - temp_reg;
215f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
216f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                ELSE
217f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
218f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                    *(pDelay++) = prev_subblock - LTP_LAG_OFFSET;
219f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
220f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                ENDIF
221f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
222f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                FOR (k = last_band; k > 0; k--)
223f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                    *(pTempPtr++) = 1;
224f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                ENDFOR
225f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
226f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber            ELSE
227f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
228f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                pDelay++;
229f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                pTempPtr += last_band;
230f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
231f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber            ENDIF
232f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
233f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber        ENDFOR (; m > 0; m--)
234f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
235f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    ENDIF (win_type != EIGHT_SHORT_SEQUENCE)
236f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
237f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber------------------------------------------------------------------------------
238f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber RESOURCES USED
239f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber   When the code is written for a specific target processor the
240f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber     the resources used should be documented below.
241f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
242f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber STACK USAGE: [stack count for this module] + [variable to represent
243f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber          stack usage for each subroutine called]
244f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
245f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber     where: [stack usage variable] = stack usage for [subroutine
246f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber         name] (see [filename].ext)
247f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
248f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber DATA MEMORY USED: x words
249f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
250f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber PROGRAM MEMORY USED: x words
251f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
252f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber CLOCK CYCLES: [cycle count equation for this module] + [variable
253f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber           used to represent cycle count for each subroutine
254f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber           called]
255f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
256f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber     where: [cycle count variable] = cycle count for [subroutine
257f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber        name] (see [filename].ext)
258f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
259f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber------------------------------------------------------------------------------
260f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber*/
261f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
262f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber/*----------------------------------------------------------------------------
263f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber; INCLUDES
264f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber----------------------------------------------------------------------------*/
265f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber#include "pv_audio_type_defs.h"
266f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber#include "lt_decode.h"
267f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber#include "ltp_common_internal.h"
268f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber#include "window_block_fxp.h"
269f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber#include "e_window_sequence.h"
270f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber#include "s_lt_pred_status.h"
271f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber#include "s_bits.h"
272f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber#include "ibstream.h"
273f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
274f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber/*----------------------------------------------------------------------------
275f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber; MACROS
276f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber; Define module specific macros here
277f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber----------------------------------------------------------------------------*/
278f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
279f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber/*----------------------------------------------------------------------------
280f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber; DEFINES
281f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber; Include all pre-processor statements here. Include conditional
282f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber; compile variables also.
283f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber----------------------------------------------------------------------------*/
284f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
285f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber/*----------------------------------------------------------------------------
286f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber; LOCAL FUNCTION DEFINITIONS
287f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber; Function Prototype declaration
288f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber----------------------------------------------------------------------------*/
289f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
290f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber/*----------------------------------------------------------------------------
291f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber; LOCAL STORE/BUFFER/POINTER DEFINITIONS
292f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber; Variable declaration - defined here and used outside this module
293f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber----------------------------------------------------------------------------*/
294f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
295f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber/*----------------------------------------------------------------------------
296f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber; EXTERNAL FUNCTION REFERENCES
297f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber; Declare functions defined elsewhere and referenced in this module
298f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber----------------------------------------------------------------------------*/
299f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
300f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber/*----------------------------------------------------------------------------
301f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber; EXTERNAL GLOBAL STORE/BUFFER/POINTER REFERENCES
302f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber; Declare variables used in this module but defined elsewhere
303f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber----------------------------------------------------------------------------*/
304f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
305f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber/*----------------------------------------------------------------------------
306f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber; FUNCTION CODE
307f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber----------------------------------------------------------------------------*/
308f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Hubervoid lt_decode(
309f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    const WINDOW_SEQUENCE  win_type,
310f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    BITS            *pInputStream,
311f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    const Int              max_sfb,
312f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    LT_PRED_STATUS  *pLt_pred)
313f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber{
314f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    Int wnd_num;
315f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    Int k;
316f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    Int last_band;
317f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    Int prev_subblock;
318f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    Int prev_subblock_nonzero;
319f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    Int temp_reg;
320f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
321f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    Bool *pWinPredictionUsed = pLt_pred->win_prediction_used;
322f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    Bool *pSfbPredictionUsed = pLt_pred->sfb_prediction_used;
323f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    Int  *pTempPtr;
324f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    Int  *pDelay = pLt_pred->delay;
325f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
326f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    pDelay[0] = (Int) get17_n_lessbits(
327f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                    LEN_LTP_LAG,  /* 11 bits */
328f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                    pInputStream);
329f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
330f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    pLt_pred->weight_index  = (Int) get9_n_lessbits(
331f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                                  LEN_LTP_COEF, /*  3 bits */
332f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                                  pInputStream);
333f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
334f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    last_band = max_sfb;
335f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
336f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    if (win_type != EIGHT_SHORT_SEQUENCE)
337f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    {
338f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
339f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber        /* last_band = min(MAX_LT_PRED_LONG_SFB, max_sfb) MAX_SCFAC_BANDS */
340f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber        if (last_band > MAX_LT_PRED_LONG_SFB)
341f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber        {
342f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber            last_band = MAX_LT_PRED_LONG_SFB;
343f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber        }
344f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
345f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber        for (k = last_band; k > 0; k--)
346f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber        {
347f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber            *(pSfbPredictionUsed++) = (Int) get1bits(pInputStream);
348f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber        }
349f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
350f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber        /*
351f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber         * This is not a call to memset, because
352f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber         * (max_sfb - last_band) should typically be a small value.
353f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber         */
354f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber        for (k = (max_sfb - last_band); k > 0; k--)
355f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber        {
356f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber            *(pSfbPredictionUsed++) = FALSE;
357f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber        }
358f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    }
359f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    else /* (win_type == EIGHT_SHORT_SEQUENCE) */
360f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    {
361f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber        /* last_band = min(MAX_LT_PRED_SHORT_SFB, max_sfb) */
362f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
363f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber        if (last_band > MAX_LT_PRED_SHORT_SFB)
364f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber        {
365f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber            last_band = MAX_LT_PRED_SHORT_SFB;
366f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber        }
367f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
368f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber        /*
369f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber         * The following two coding constructs are equivalent...
370f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber         *
371f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber         *  first_time == 1
372f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber         *  for (wnd_num=NUM_SHORT_WINDOWS; wnd_num > 0; wnd_num--)
373f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber         *  {
374f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber         *     if (condition)
375f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber         *     {
376f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber         *       if (first_time == 1)
377f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber         *       {
378f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber         *           CODE SECTION A
379f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber         *           first_time = 0;
380f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber         *       }
381f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber         *       else
382f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber         *       {
383f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber         *           CODE SECTION B
384f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber         *       }
385f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber         *     }
386f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber         *  }
387f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber         *
388f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber         * -----------------------------------EQUIVALENT TO------------
389f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber         *
390f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber         *  wnd_num=NUM_SHORT_WINDOWS;
391f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber         *
392f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber         *  do
393f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber         *  {
394f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber         *     wnd_num--;
395f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber         *     if (condition)
396f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber         *     {
397f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber         *         CODE SECTION A
398f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber         *         break;
399f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber         *     }
400f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber         *  } while( wnd_num > 0)
401f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber         *
402f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber         *  while (wnd_num > 0)
403f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber         *  {
404f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber         *     if (condition)
405f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber         *     {
406f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber         *         CODE SECTION B
407f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber         *     }
408f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber         *     wnd_num--;
409f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber         *  }
410f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber         *
411f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber         */
412f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
413f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber        prev_subblock = pDelay[0];
414f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
415f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber        pTempPtr = &pSfbPredictionUsed[0];
416f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
417f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber        wnd_num = NUM_SHORT_WINDOWS;
418f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
419f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber        prev_subblock_nonzero = prev_subblock;
420f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber        prev_subblock += LTP_LAG_OFFSET;
421f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
422f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber        do
423f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber        {
424f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber            /*
425f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber             * Place decrement of wnd_num here, to insure
426f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber             * that the decrement occurs before the
427f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber             * break out of the do-while loop.
428f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber             */
429f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber            wnd_num--;
430f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
431f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber            temp_reg = (Int) get1bits(pInputStream);
432f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
433f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber            *(pWinPredictionUsed++) = temp_reg;
434f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
435f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber            if (temp_reg != FALSE)
436f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber            {
437f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                *(pDelay++) = prev_subblock_nonzero;
438f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
439f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                for (k = last_band; k > 0; k--)
440f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                {
441f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                    *(pTempPtr++) = TRUE;
442f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                }
443f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                for (k = (max_sfb - last_band); k > 0; k--)
444f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                {
445f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                    *(pTempPtr++) = FALSE;
446f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                }
447f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                break;
448f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
449f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber            } /* if(pWinPredictionUsed) */
450f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber            else
451f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber            {
452f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                pDelay++;
453f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                pTempPtr += max_sfb;
454f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber            }
455f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
456f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber        }
457f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber        while (wnd_num > 0);
458f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
459f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber        /*
460f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber         * This while loop picks up where the previous one left off.
461f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber         * Notice that the code functions differently inside the loop
462f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber         */
463f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
464f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber        while (wnd_num > 0)
465f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber        {
466f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber            temp_reg = (Int) get1bits(pInputStream);
467f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
468f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber            *(pWinPredictionUsed++) = temp_reg;
469f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
470f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber            if (temp_reg != FALSE)
471f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber            {
472f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                temp_reg = (Int) get1bits(pInputStream);
473f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                if (temp_reg != 0)
474f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                {
475f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                    temp_reg  = (Int) get9_n_lessbits(
476f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                                    LEN_LTP_SHORT_LAG,
477f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                                    pInputStream);
478f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
479f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                    *(pDelay++) = prev_subblock - temp_reg;
480f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                }
481f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                else
482f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                {
483f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                    *(pDelay++) = prev_subblock_nonzero;
484f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                }
485f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                for (k = last_band; k > 0; k--)
486f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                {
487f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                    *(pTempPtr++) = TRUE;
488f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                }
489f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                for (k = (max_sfb - last_band); k > 0; k--)
490f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                {
491f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                    *(pTempPtr++) = FALSE;
492f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                }
493f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
494f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber            } /* if (temp_reg) */
495f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber            else
496f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber            {
497f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                pDelay++;
498f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                pTempPtr += max_sfb;
499f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber            }
500f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
501f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber            wnd_num--;
502f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
503f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber        } /* while(wnd_num) */
504f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
505f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    } /* else (win_type == EIGHT_SHORT_SEQUENCE) */
506f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
507f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber} /* lt_decode */
508