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: ./src/get_ics_info.c
21f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
22f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber------------------------------------------------------------------------------
23f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber REVISION HISTORY
24f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
25f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber Description:  Modified from original shareware code
26f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
27f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber Description:  Modified to pass variables by reference to eliminate use
28f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber               of global variables.
29f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
30f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber Description:  Clean up code.
31f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
32f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber Description:  Fix comments before review, remove lpflag[]
33f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
34f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber Description:  Update per review comments, and match ISO/IEC 14496-3
35f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
36f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber Description:  Update per peer review comments.
37f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
38f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber Description:  Remove "rollback" of used bits, since lt_decode is to change.
39f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
40f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber Description: Replace some instances of getbits to get9_n_lessbits
41f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber              when the number of bits read is 9 or less and get1bits
42f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber              when only 1 bit is read.
43f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
44f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber Who:                                   Date:
45f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber Description:
46f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
47f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber------------------------------------------------------------------------------
48f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber INPUT AND OUTPUT DEFINITIONS
49f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
50f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber Inputs:
51f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    audioObjectType = MP4 Audio Object Type for the current song. Only if
52f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                    this is set to LTP (MP4AUDIO_LTP) will long term
53f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                    prediction bits be retrieved. Data type
54f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                    tMP4AudioObjectType, which is an enumeration, which in
55f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                    turn is an Int.
56f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
57f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    pInputStream  = pointer to a BITS structure, used by the function getbits
58f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                    to provide data. This is the second parameter to this
59f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                    function to match its position in getbits().
60f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                    Data type pointer to BITS structure
61f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
62f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    common_window = field read in huffdecode, which tells whether information
63f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                    is shared between the left and right channel. Long term
64f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                    prediction (LTP) data is NOT shared even if its a common
65f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                    window, so this flag is needed to see if another set of
66f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                    LTP possibly needs to be read. If this flag is false,
67f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                    pSecondLTPStatus is not touched, it could be NULL if
68f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                    need be. Data type Bool, which is Int.
69f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
70f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    pWindowSequence = pointer to where the the window type of the current
71f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                    frame and channel should be placed, of data type
72f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                    WINDOW_SEQUENCE, which is Int. It can take on one
73f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                    of four values: ONLY_LONG_SEQUENCE, LONG_START_SEQUENCE,
74f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                    EIGHT_SHORT_SEQUENCE, LONG_STOP_SEQUENCE,
75f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
76f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    pWindowShape =  pointer to where the window shape for the current frame
77f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                    and channel should be placed, of data type WINDOW_SHAPE,
78f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                    which is Int. It can take on the one of these two values:
79f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                    SINE_WINDOW, KAISER_BESSEL_WINDOW. It is used in the
80f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                    "filterbank" section of decoding.
81f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
82f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    group         = array that holds the index of the first window in each
83f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                    group. Data type array of Int, eight elements.
84f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
85f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    p_max_sfb     = pointer to where the maximum number of scale factor bands
86f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                    for the current frame and channel will be placed. Data
87f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                    type of pointer to Int.
88f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
89f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    p_winmap      = array of pointers to all of the possible four window
90f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                    configurations. This parameter did not need to be pointers,
91f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                    and could be changed in the future. Data type array of pointers
92f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                    to FrameInfo structures, length 4.
93f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
94f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    pFirstLTPStatus = pointer to a structure where the first LTP
95f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                    information will be stored. It would be confusing and wrong
96f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                    to call this left LTP status since if common_window = FALSE,
97f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                    this function will be called twice - once for the left, once
98f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                    for the right. It could be done, but extra conditional code
99f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                    would need to be done.
100f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                    Data type pointer to LT_PRED_STATUS structure.
101f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
102f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    pSecondLTPStatus = pointer to where the right channel of LTP
103f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                    information will be stored only if common_window is non-zero.
104f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                    Data type pointer to LT_PRED_STATUS structure.
105f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
106f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber Local Stores/Buffers/Pointers Needed: None.
107f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
108f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber Global Stores/Buffers/Pointers Needed: None.
109f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
110f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber Outputs:
111f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    status  = 0 implies no error occurred, non-zero otherwise.
112f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
113f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber Pointers and Buffers Modified:
114f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    pInputStream contents are modified in such a way that the number of bits
115f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber        read increases.
116f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    pWindowSequence contents are updated with the current window for this
117f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber        frame and channel
118f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    group[] contents will be modified to grouping information. See getgroup
119f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber        source code for a better description of what this is.
120f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    p_max_sfb contents will be updated with the maximum scale factor bands
121f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber        for this frame and channel.
122f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    pFirstLTPStatus contents may be updated if the stream has long term
123f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber        prediction information.
124f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    pSecondLTPStatus contents may be updated if common_window != 0 and LTP data
125f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber        is present.
126f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
127f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
128f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber Local Stores Modified: None
129f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
130f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber Global Stores Modified: None
131f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
132f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber------------------------------------------------------------------------------
133f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber FUNCTION DESCRIPTION
134f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
135f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber This function retrieves the individual channel stream (ICS) information
136f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber from the bitstream. The information read for the current
137f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber frame and channel is:
138f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber - window sequence
139f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber - window shape for use in the filter bank
140f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber - number of scale factor bands
141f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber - long term predication (LTP) information
142f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber - grouping information
143f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
144f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber This function does NOT support MPEG2 style AAC Frequency Domain Predictor,
145f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber not to be confused with LTP (Long Term Prediction). If such data is found
146f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber to be on the file an error is generated.
147f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
148f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber------------------------------------------------------------------------------
149f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber REQUIREMENTS
150f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
151f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber This function is not to use static or global data.
152f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
153f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber------------------------------------------------------------------------------
154f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber REFERENCES
155f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
156f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber  (1) ISO/IEC 14496-3:1999(E) Titled "Information technology - Coding
157f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber      of audio-visual objects Part 3: Audio Subpart 4:"
158f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber      Table 4.4.6 - Syntax of ics_info(), page 16.
159f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
160f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
161f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber (2) MPEG-2 NBC Audio Decoder
162f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber   "This software module was originally developed by AT&T, Dolby
163f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber   Laboratories, Fraunhofer Gesellschaft IIS in the course of development
164f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber   of the MPEG-2 NBC/MPEG-4 Audio standard ISO/IEC 13818-7, 14496-1,2 and
165f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber   3. This software module is an implementation of a part of one or more
166f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber   MPEG-2 NBC/MPEG-4 Audio tools as specified by the MPEG-2 NBC/MPEG-4
167f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber   Audio standard. ISO/IEC  gives users of the MPEG-2 NBC/MPEG-4 Audio
168f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber   standards free license to this software module or modifications thereof
169f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber   for use in hardware or software products claiming conformance to the
170f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber   MPEG-2 NBC/MPEG-4 Audio  standards. Those intending to use this software
171f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber   module in hardware or software products are advised that this use may
172f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber   infringe existing patents. The original developer of this software
173f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber   module and his/her company, the subsequent editors and their companies,
174f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber   and ISO/IEC have no liability for use of this software module or
175f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber   modifications thereof in an implementation. Copyright is not released
176f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber   for non MPEG-2 NBC/MPEG-4 Audio conforming products.The original
177f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber   developer retains full right to use the code for his/her own purpose,
178f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber   assign or donate the code to a third party and to inhibit third party
179f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber   from using the code for non MPEG-2 NBC/MPEG-4 Audio conforming products.
180f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber   This copyright notice must be included in all copies or derivative
181f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber   works."
182f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber   Copyright(c)1996.
183f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
184f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber------------------------------------------------------------------------------
185f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber PSEUDO-CODE
186f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
187f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    status = 0;
188f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    first_ltp_data_present = FALSE;
189f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    second_ltp_data_present = FALSE;
190f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
191f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
192f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    CALL getbits(
193f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber        neededBits = LEN_ICS_RESERV + LEN_WIN_SEQ + LEN_WIN_SH,
194f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber        pInputStream = pInputStream)
195f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    MODIFYING( pInputStream )
196f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    RETURNING( temp = returnValue )
197f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
198f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    windowSequence = (temp >> LEN_WIN_SH) & ((0x1<<LEN_WIN_SEQ)-1);
199f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
200f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    *pWindowShape = (temp) & ((0x1<<LEN_WIN_SH)-1);
201f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
202f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    IF (windowSequence == EIGHT_SHORT_SEQUENCE)
203f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    THEN
204f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber        CALL getbits(
205f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber            neededBits = LEN_MAX_SFBS,
206f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber            pInputStream = pInputStream)
207f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber        MODIFYING(pInputStream)
208f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber        RETURNING(local_max_sfb = returnValue)
209f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
210f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber        CALL getgroup(
211f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber            group = group,
212f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber            pInputStream = pInputStream)
213f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber        MODIFYING(group)
214f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber        MODIFYING(pInputStream)
215f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber        RETURNING(nothing)
216f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
217f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
218f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    ELSE
219f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
220f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber        group[0] = 1;
221f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
222f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber        CALL getbits(
223f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber            neededBits = LEN_MAX_SFBL + LEN_PREDICTOR_DATA_PRESENT,
224f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber            pInputStream = pInputStream)
225f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber        MODIFYING(pInputStream)
226f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber        RETURNING(temp = returnValue)
227f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
228f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber        predictor_data_present =
229f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber            (Bool) getbits(
230f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                LEN_BOOLEAN,
231f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                pInputStream);
232f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
233f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber        local_max_sfb = (Int)(temp >> LEN_PREDICTOR_DATA_PRESENT);
234f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
235f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber        predictor_data_present =
236f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber            (Bool) (temp & ((0x1 << LEN_PREDICTOR_DATA_PRESENT)-1));
237f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
238f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber        IF (local_max_sfb > allowed_max_sfb)
239f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber        THEN
240f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber            status = 1
241f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber        ELSEIF (audioObjectType == MP4AUDIO_LTP)
242f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber        THEN
243f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber            IF (predictor_data_present != FALSE)
244f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber            THEN
245f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                CALL getbits(
246f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                    neededBits = LEN_LTP_DATA_PRESENT,
247f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                    pInputStream = pInputStream)
248f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                MODIFYING(pInputStream)
249f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                RETURNING(first_ltp_data_present = returnValue)
250f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
251f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                IF (ltp_data_present != FALSE)
252f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                THEN
253f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
254f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                    CALL lt_decode(
255f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                        win_type = windowSequence,
256f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                        pInputStream  = pInputStream,
257f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                        max_sfb = local_max_sfb,
258f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                        pLt_pred = pFirstLTPStatus)
259f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                    MODIFYING(pInputStream)
260f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                    MODIFYING(pFirstLTPStatus)
261f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                    RETURNING(nothing)
262f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
263f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                ENDIF
264f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
265f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                IF (common_window != FALSE)
266f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                THEN
267f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                    CALL getbits(
268f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                        neededBits = LEN_LTP_DATA_PRESENT,
269f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                        pInputStream = pInputStream)
270f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                    MODIFYING(pInputStream)
271f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                    RETURNING(second_ltp_data_present = returnValue)
272f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
273f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                    IF (second_ltp_data_present != FALSE)
274f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                    THEN
275f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
276f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                        CALL lt_decode(
277f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                            win_type = windowSequence,
278f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                            pInputStream  = pInputStream,
279f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                            max_sfb = local_max_sfb,
280f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                            pLt_pred = pSecondLTPStatus)
281f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                        MODIFYING(pInputStream)
282f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                        MODIFYING(pSecondLTPStatus)
283f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                        RETURNING(nothing)
284f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                    ENDIF
285f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                ENDIF
286f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber            ENDIF
287f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber        ELSE
288f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber            IF  (predictor_data_present != FALSE)
289f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber            THEN
290f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                status = 1
291f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber            ENDIF
292f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber        END IF
293f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    ENDIF
294f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
295f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    pFirstLTPStatus->ltp_data_present = first_ltp_data_present;
296f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
297f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    IF (common_window != FALSE)
298f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    THEN
299f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber        pSecondLTPStatus->ltp_data_present = second_ltp_data_present;
300f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    ENDIF
301f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
302f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    pFrameInfo = p_winmap[*p_wnd];
303f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    IF (local_max_sfb > pFrameInfo->sfb_per_frame)
304f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    THEN
305f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber        status = 1;
306f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    ENDIF
307f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
308f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    *(p_max_sfb) = local_max_sfb;
309f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
310f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    MODIFY(*(pWindowSequence))
311f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    MODIFY(*(pWinShape))
312f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    MODIFY(*(p_max_sfb))
313f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    MODIFY(group[])
314f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    MODIFY(*pInputStream)
315f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    MODIFY(*pFirstLTPStatus)
316f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    MODIFY(*pSecondLTPStatus)
317f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    RETURN (status);
318f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
319f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
320f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
321f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber------------------------------------------------------------------------------
322f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber RESOURCES USED
323f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber   When the code is written for a specific target processor the
324f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber     the resources used should be documented below.
325f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
326f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber STACK USAGE: [stack count for this module] + [variable to represent
327f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber          stack usage for each subroutine called]
328f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
329f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber     where: [stack usage variable] = stack usage for [subroutine
330f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber         name] (see [filename].ext)
331f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
332f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber DATA MEMORY USED: x words
333f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
334f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber PROGRAM MEMORY USED: x words
335f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
336f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber CLOCK CYCLES: [cycle count equation for this module] + [variable
337f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber           used to represent cycle count for each subroutine
338f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber           called]
339f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
340f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber     where: [cycle count variable] = cycle count for [subroutine
341f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber        name] (see [filename].ext)
342f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
343f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber------------------------------------------------------------------------------
344f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber*/
345f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
346f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
347f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber/*----------------------------------------------------------------------------
348f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber; INCLUDES
349f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber----------------------------------------------------------------------------*/
350f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber#include "pv_audio_type_defs.h"
351f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
352f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber#include "e_rawbitstreamconst.h"
353f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber#include "e_tmp4audioobjecttype.h"
354f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
355f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber#include "s_bits.h"
356f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber#include "s_frameinfo.h"
357f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber#include "s_lt_pred_status.h"
358f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
359f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber#include "ibstream.h"
360f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber#include "lt_decode.h"
361f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber#include "ltp_common_internal.h" /* For LEN_LTP_DATA_PRESENT constant */
362f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
363f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber#include "get_ics_info.h"
364f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber#include "huffman.h"        /* For the declaration of getgroup */
365f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
366f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber/*----------------------------------------------------------------------------
367f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber; MACROS
368f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber; Define module specific macros here
369f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber----------------------------------------------------------------------------*/
370f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
371f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber/*----------------------------------------------------------------------------
372f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber; DEFINES
373f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber; Include all pre-processor statements here. Include conditional
374f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber; compile variables also.
375f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber----------------------------------------------------------------------------*/
376f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
377f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber#define LEN_PREDICTOR_DATA_PRESENT (1)
378f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
379f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber/*----------------------------------------------------------------------------
380f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber; LOCAL FUNCTION DEFINITIONS
381f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber; Function Prototype declaration
382f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber----------------------------------------------------------------------------*/
383f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
384f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber/*----------------------------------------------------------------------------
385f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber; LOCAL VARIABLE DEFINITIONS
386f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber; Variable declaration - defined here and used outside this module
387f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber----------------------------------------------------------------------------*/
388f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
389f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber/*----------------------------------------------------------------------------
390f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber; EXTERNAL FUNCTION REFERENCES
391f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber; Declare functions defined elsewhere and referenced in this module
392f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber----------------------------------------------------------------------------*/
393f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
394f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber/*----------------------------------------------------------------------------
395f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber; EXTERNAL VARIABLES REFERENCES
396f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber; Declare variables used in this module but defined elsewhere
397f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber----------------------------------------------------------------------------*/
398f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
399f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber/*----------------------------------------------------------------------------
400f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber; FUNCTION CODE
401f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber----------------------------------------------------------------------------*/
402f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
403f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas HuberInt get_ics_info(
404f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    const tMP4AudioObjectType  audioObjectType,
405f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    BITS                      *pInputStream,
406f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    const Bool                 common_window,
407f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    WINDOW_SEQUENCE           *pWindowSequence,
408f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    WINDOW_SHAPE              *pWindowShape,
409f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    Int                        group[],
410f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    Int                       *p_max_sfb,
411f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    FrameInfo                 *p_winmap[],
412f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    LT_PRED_STATUS            *pFirstLTPStatus,
413f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    LT_PRED_STATUS            *pSecondLTPStatus)
414f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber{
415f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    WINDOW_SEQUENCE       windowSequence;
416f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    UInt                  temp;
417f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    Bool                  predictor_data_present;
418f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    UInt                   local_max_sfb;
419f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    UInt                   allowed_max_sfb;
420f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    Int                   status = SUCCESS;
421f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    Bool                  first_ltp_data_present = FALSE;
422f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    Bool                  second_ltp_data_present = FALSE;
423f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
424f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    /*
425f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber     * The following three calls to getbits have been replaced with one
426f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber     * call for speed:
427f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber     *
428f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber     *                  getbits(LEN_ICS_RESERV, pInputStream);
429f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber     * windowSequence = getbits(LEN_WIN_SEQ, pInputStream);
430f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber     * *pWindowShape  = getbits(LEN_WIN_SH, pInputStream);
431f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber     *
432f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber     */
433f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
434f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    temp =
435f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber        get9_n_lessbits(
436f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber            LEN_ICS_RESERV + LEN_WIN_SEQ + LEN_WIN_SH,
437f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber            pInputStream);
438f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
439f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
440f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    windowSequence = (WINDOW_SEQUENCE)((temp >> LEN_WIN_SH) & ((0x1 << LEN_WIN_SEQ) - 1));
441f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
442f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    *pWindowShape = (WINDOW_SHAPE)((temp) & ((0x1 << LEN_WIN_SH) - 1));
443f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
444f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    /*
445f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber     * This pointer should not be NULL as long as the initialization code
446f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber     * has been run, so the test for NULL has been removed.
447f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber     */
448f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    allowed_max_sfb = p_winmap[windowSequence]->sfb_per_win[0];
449f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
450f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    if (windowSequence == EIGHT_SHORT_SEQUENCE)
451f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    {
452f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber        local_max_sfb =  get9_n_lessbits(LEN_MAX_SFBS,
453f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                                         pInputStream);
454f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
455f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber        getgroup(
456f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber            group,
457f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber            pInputStream);
458f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
459f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber        if (local_max_sfb > allowed_max_sfb)
460f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber        {
461f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber            status = 1;  /* ERROR CODE - needs to be updated */
462f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber        }
463f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
464f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    } /* end of TRUE of if (windowSequence == EIGHT_SHORT_SEQUENCE) */
465f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    else
466f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    {
467f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber        /* There is only one group for long windows. */
468f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber        group[0] = 1;
469f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
470f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber        /*
471f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber         * The window is long, get the maximum scale factor bands,
472f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber         * and get long term prediction info.
473f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber         *
474f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber         * Reference [1] states that the audioObjectType is first tested,
475f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber         * then the predictor_data_present is read on either branch of the
476f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber         * if (audioObjectType == MP4AUDIO_LTP). Instead, this code combines
477f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber         * the two calls on both branches into one before the
478f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber         * if, and then in turn combines with another call to getbits, all
479f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber         * in the name of speed.
480f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber         *
481f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber         * This would be the individual calls, without checking the number
482f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber         * of scale factor bands:
483f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber         *
484f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber         *   local_max_sfb =
485f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber         *      (Int) getbits(
486f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber         *          LEN_MAX_SFBL,
487f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber         *           pInputStream);
488f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber         *
489f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber         *  if (audioObjectType == MP4AUDIO_LTP)
490f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber         *  {
491f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber         *        predictor_data_present =
492f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber         *           (Bool) getbits(
493f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber         *              LEN_PREDICTOR_DATA_PRESENT,
494f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber         *              pInputStream);
495f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber         *
496f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber         *     .....   (read LTP data)
497f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber         *
498f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber         *    }
499f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber         *    else
500f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber         *    {
501f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber         *
502f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber         *        predictor_data_present =
503f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber         *           (Bool) getbits(
504f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber         *              LEN_PREDICTOR_DATA_PRESENT,
505f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber         *              pInputStream);
506f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber         *
507f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber         *     .....   (its an error for this library)
508f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber         *     }
509f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber         */
510f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber        temp =
511f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber            get9_n_lessbits(
512f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                LEN_MAX_SFBL + LEN_PREDICTOR_DATA_PRESENT,
513f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                pInputStream);
514f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
515f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber        local_max_sfb = (Int)(temp >> LEN_PREDICTOR_DATA_PRESENT);
516f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
517f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber        predictor_data_present =
518f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber            (Bool)(temp & ((0x1 << LEN_PREDICTOR_DATA_PRESENT) - 1));
519f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
520f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber        if (local_max_sfb > allowed_max_sfb)
521f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber        {
522f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber            status = 1;  /* ERROR CODE - needs to be updated */
523f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber        }
524f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber        else if (audioObjectType == MP4AUDIO_LTP)
525f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber        {
526f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber            /*
527f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber             * Note that the predictor data bit has already been
528f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber             * read.
529f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber             */
530f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
531f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber            /*
532f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber             * If the object type is LTP, the predictor data is
533f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber             * LTP. If the object type is not LTP, the predictor data
534f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber             * is so called "frequency predictor data", which is not
535f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber             * supported by this implementation. Refer to (1)
536f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber             */
537f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber            if (predictor_data_present != FALSE)
538f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber            {
539f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                first_ltp_data_present =
540f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                    (Bool) get1bits(/*                        LEN_LTP_DATA_PRESENT,*/
541f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                        pInputStream);
542f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
543f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                if (first_ltp_data_present != FALSE)
544f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                {
545f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                    lt_decode(
546f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                        windowSequence,
547f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                        pInputStream,
548f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                        local_max_sfb,
549f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                        pFirstLTPStatus);
550f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                }
551f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                if (common_window != FALSE)
552f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                {
553f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                    second_ltp_data_present =
554f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                        (Bool) get1bits(/*                            LEN_LTP_DATA_PRESENT,*/
555f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                            pInputStream);
556f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
557f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                    if (second_ltp_data_present != FALSE)
558f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                    {
559f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                        lt_decode(
560f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                            windowSequence,
561f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                            pInputStream,
562f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                            local_max_sfb,
563f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                            pSecondLTPStatus);
564f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                    }
565f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                } /* if (common_window != FALSE) */
566f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
567f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber            } /* if (predictor_data_present != FALSE) */
568f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
569f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber        } /* else if (audioObjectType == MP4AUDIO_LTP) */
570f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber        else
571f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber        {
572f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber            /*
573f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber             * Note that the predictor data bit has already been
574f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber             * read.
575f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber             */
576f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
577f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber            /*
578f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber             * The object type is not LTP. If there is data, its
579f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber             * frequency predictor data, not supported by this
580f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber             * implementation.
581f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber             */
582f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber            if (predictor_data_present != FALSE)
583f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber            {
584f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                status = 1; /* ERROR CODE UPDATE LATER */
585f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber            } /* if (predictor_data_present != FALSE) */
586f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
587f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber        } /* end of "else" clause of if (audioObjectType == MP4AUDIO_LTP) */
588f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
589f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    } /*  if (windowSequence == EIGHT_SHORT_SEQUENCE) [FALSE branch] */
590f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
591f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
592f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    /*
593f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber     * Save all local copies.
594f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber     */
595f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    pFirstLTPStatus->ltp_data_present = first_ltp_data_present;
596f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    if (common_window != FALSE)
597f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    {
598f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber        pSecondLTPStatus->ltp_data_present = second_ltp_data_present;
599f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    }
600f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
601f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    *p_max_sfb = local_max_sfb;
602f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
603f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    *pWindowSequence = windowSequence;
604f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
605f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    return (status);
606f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
607f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber}  /* get_ics_info */
608f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
609