1d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber/* ------------------------------------------------------------------
2d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber * Copyright (C) 1998-2009 PacketVideo
3d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber *
4d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber * Licensed under the Apache License, Version 2.0 (the "License");
5d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber * you may not use this file except in compliance with the License.
6d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber * You may obtain a copy of the License at
7d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber *
8d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber *      http://www.apache.org/licenses/LICENSE-2.0
9d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber *
10d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber * Unless required by applicable law or agreed to in writing, software
11d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber * distributed under the License is distributed on an "AS IS" BASIS,
12d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
13d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber * express or implied.
14d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber * See the License for the specific language governing permissions
15d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber * and limitations under the License.
16d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber * -------------------------------------------------------------------
17d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber */
18d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber/*
19d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber------------------------------------------------------------------------------
20d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
21d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber   PacketVideo Corp.
22d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber   MP3 Decoder Library
23d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
24d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber   Filename: pvmp3_get_side_info.cpp
25d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
26d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber     Date: 09/21/2007
27d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
28d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber------------------------------------------------------------------------------
29d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber REVISION HISTORY
30d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
31d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
32d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber Description:
33d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
34d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber------------------------------------------------------------------------------
35d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber INPUT AND OUTPUT DEFINITIONS
36d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
37d9618f23226f46c752e56f712bc4b505117d8b4bAndreas HuberInput
38d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    mp3SideInfo     *si,
39d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    mp3Header       *info,             mp3 header information
40d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    uint32          *crc               initialized crc value (if enabled)
41d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
42d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
43d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber Returns
44d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
45d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    mp3SideInfo     *si,               side information
46d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
47d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
48d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber------------------------------------------------------------------------------
49d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber FUNCTION DESCRIPTION
50d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
51d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    acquires side information
52d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
53d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber------------------------------------------------------------------------------
54d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber REQUIREMENTS
55d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
56d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
57d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber------------------------------------------------------------------------------
58d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber REFERENCES
59d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
60d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber [1] ISO MPEG Audio Subgroup Software Simulation Group (1996)
61d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber     ISO 13818-3 MPEG-2 Audio Decoder - Lower Sampling Frequency Extension
62d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
63d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber------------------------------------------------------------------------------
64d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber PSEUDO-CODE
65d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
66d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber------------------------------------------------------------------------------
67d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber*/
68d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
69d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
70d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber/*----------------------------------------------------------------------------
71d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber; INCLUDES
72d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber----------------------------------------------------------------------------*/
73d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
74d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber#include "pvmp3_get_side_info.h"
75d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber#include "pvmp3_crc.h"
76d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
77d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
78d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber/*----------------------------------------------------------------------------
79d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber; MACROS
80d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber; Define module specific macros here
81d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber----------------------------------------------------------------------------*/
82d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
83d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
84d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber/*----------------------------------------------------------------------------
85d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber; DEFINES
86d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber; Include all pre-processor statements here. Include conditional
87d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber; compile variables also.
88d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber----------------------------------------------------------------------------*/
89d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
90d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber/*----------------------------------------------------------------------------
91d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber; LOCAL FUNCTION DEFINITIONS
92d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber; Function Prototype declaration
93d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber----------------------------------------------------------------------------*/
94d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
95d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber/*----------------------------------------------------------------------------
96d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber; LOCAL STORE/BUFFER/POINTER DEFINITIONS
97d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber; Variable declaration - defined here and used outside this module
98d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber----------------------------------------------------------------------------*/
99d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
100d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber/*----------------------------------------------------------------------------
101d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber; EXTERNAL FUNCTION REFERENCES
102d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber; Declare functions defined elsewhere and referenced in this module
103d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber----------------------------------------------------------------------------*/
104d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
105d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber/*----------------------------------------------------------------------------
106d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber; EXTERNAL GLOBAL STORE/BUFFER/POINTER REFERENCES
107d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber; Declare variables used in this module but defined elsewhere
108d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber----------------------------------------------------------------------------*/
109d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
110d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber/*----------------------------------------------------------------------------
111d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber; FUNCTION CODE
112d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber----------------------------------------------------------------------------*/
113d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
114d9618f23226f46c752e56f712bc4b505117d8b4bAndreas HuberERROR_CODE pvmp3_get_side_info(tmp3Bits    *inputStream,
115d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                               mp3SideInfo *si,
116d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                               mp3Header   *info,
117d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                               uint32      *crc)
118d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber{
119d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    int32 ch, gr;
120d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    uint32 tmp;
121d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
122d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    int stereo  = (info->mode == MPG_MD_MONO) ? 1 : 2;
123d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
124d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    if (info->version_x == MPEG_1)
125d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    {
126d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        if (stereo == 1)
127d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        {
128d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            tmp = getbits_crc(inputStream, 14, crc, info->error_protection);
129d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            si->main_data_begin = (tmp << 18) >> 23;    /* 9 */
130d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            si->private_bits    = (tmp << 23) >> 27;    /* 5 */
131d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        }
132d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        else
133d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        {
134d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            tmp = getbits_crc(inputStream, 12, crc, info->error_protection);
135d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            si->main_data_begin = (tmp << 20) >> 23;    /* 9 */
136d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            si->private_bits    = (tmp << 23) >> 29;    /* 3 */
137d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
138d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        }
139d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
140d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        for (ch = 0; ch < stereo; ch++)
141d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        {
142d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            tmp = getbits_crc(inputStream, 4, crc, info->error_protection);
143d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            si->ch[ch].scfsi[0] = (tmp << 28) >> 31;    /* 1 */
144d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            si->ch[ch].scfsi[1] = (tmp << 29) >> 31;    /* 1 */
145d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            si->ch[ch].scfsi[2] = (tmp << 30) >> 31;    /* 1 */
146d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            si->ch[ch].scfsi[3] =  tmp & 1;         /* 1 */
147d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        }
148d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
149d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        for (gr = 0; gr < 2 ; gr++)
150d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        {
151d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            for (ch = 0; ch < stereo; ch++)
152d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            {
153d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                si->ch[ch].gran[gr].part2_3_length    = getbits_crc(inputStream, 12, crc, info->error_protection);
154d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                tmp = getbits_crc(inputStream, 22, crc, info->error_protection);
155d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
156d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                si->ch[ch].gran[gr].big_values            = (tmp << 10) >> 23;   /* 9 */
157d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                si->ch[ch].gran[gr].global_gain           = ((tmp << 19) >> 24) - 210;   /* 8 */
158d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                si->ch[ch].gran[gr].scalefac_compress     = (tmp << 27) >> 28;   /* 4 */
159d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                si->ch[ch].gran[gr].window_switching_flag = tmp & 1;         /* 1 */
160d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
161d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                if (si->ch[ch].gran[gr].window_switching_flag)
162d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                {
163d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                    tmp = getbits_crc(inputStream, 22, crc, info->error_protection);
164d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
165d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                    si->ch[ch].gran[gr].block_type       = (tmp << 10) >> 30;   /* 2 */;
166d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                    si->ch[ch].gran[gr].mixed_block_flag = (tmp << 12) >> 31;   /* 1 */;
167d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
168d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                    si->ch[ch].gran[gr].table_select[0]  = (tmp << 13) >> 27;   /* 5 */;
169d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                    si->ch[ch].gran[gr].table_select[1]  = (tmp << 18) >> 27;   /* 5 */;
170d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
171d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                    si->ch[ch].gran[gr].subblock_gain[0] = (tmp << 23) >> 29;   /* 3 */;
172d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                    si->ch[ch].gran[gr].subblock_gain[1] = (tmp << 26) >> 29;   /* 3 */;
173d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                    si->ch[ch].gran[gr].subblock_gain[2] = (tmp << 29) >> 29;   /* 3 */;
174d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
175d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                    /* Set region_count parameters since they are implicit in this case. */
176d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
177d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                    if (si->ch[ch].gran[gr].block_type == 0)
178d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                    {
179d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                        return(SIDE_INFO_ERROR);
180d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                    }
181d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                    else if ((si->ch[ch].gran[gr].block_type       == 2)
182d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                             && (si->ch[ch].gran[gr].mixed_block_flag == 0))
183d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                    {
184d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                        si->ch[ch].gran[gr].region0_count = 8; /* MI 9; */
185d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                        si->ch[ch].gran[gr].region1_count = 12;
186d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                    }
187d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                    else
188d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                    {
189d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                        si->ch[ch].gran[gr].region0_count = 7; /* MI 8; */
190d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                        si->ch[ch].gran[gr].region1_count = 13;
191d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                    }
192d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                }
193d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                else
194d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                {
195d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                    tmp = getbits_crc(inputStream, 22, crc, info->error_protection);
196d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
197d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                    si->ch[ch].gran[gr].table_select[0] = (tmp << 10) >> 27;   /* 5 */;
198d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                    si->ch[ch].gran[gr].table_select[1] = (tmp << 15) >> 27;   /* 5 */;
199d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                    si->ch[ch].gran[gr].table_select[2] = (tmp << 20) >> 27;   /* 5 */;
200d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
201d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                    si->ch[ch].gran[gr].region0_count   = (tmp << 25) >> 28;   /* 4 */;
202d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                    si->ch[ch].gran[gr].region1_count   = (tmp << 29) >> 29;   /* 3 */;
203d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
204d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                    si->ch[ch].gran[gr].block_type      = 0;
205d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                }
206d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
207d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                tmp = getbits_crc(inputStream, 3, crc, info->error_protection);
208d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                si->ch[ch].gran[gr].preflag            = (tmp << 29) >> 31;    /* 1 */
209d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                si->ch[ch].gran[gr].scalefac_scale     = (tmp << 30) >> 31;    /* 1 */
210d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                si->ch[ch].gran[gr].count1table_select =  tmp & 1;         /* 1 */
211d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            }
212d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        }
213d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    }
214d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    else /* Layer 3 LSF */
215d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    {
216d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        si->main_data_begin = getbits_crc(inputStream,      8, crc, info->error_protection);
217d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        si->private_bits    = getbits_crc(inputStream, stereo, crc, info->error_protection);
218d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
219d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        for (ch = 0; ch < stereo; ch++)
220d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        {
221d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            tmp = getbits_crc(inputStream, 21, crc, info->error_protection);
222d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            si->ch[ch].gran[0].part2_3_length    = (tmp << 11) >> 20;  /* 12 */
223d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            si->ch[ch].gran[0].big_values        = (tmp << 23) >> 23;  /*  9 */
224d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
225d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            tmp = getbits_crc(inputStream, 18, crc, info->error_protection);
226d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            si->ch[ch].gran[0].global_gain           = ((tmp << 14) >> 24) - 210;   /* 8 */
227d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            si->ch[ch].gran[0].scalefac_compress     = (tmp << 22) >> 23;   /* 9 */
228d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            si->ch[ch].gran[0].window_switching_flag = tmp & 1;         /* 1 */
229d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
230d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            if (si->ch[ch].gran[0].window_switching_flag)
231d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            {
232d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
233d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                tmp = getbits_crc(inputStream, 22, crc, info->error_protection);
234d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
235d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                si->ch[ch].gran[0].block_type       = (tmp << 10) >> 30;   /* 2 */;
236d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                si->ch[ch].gran[0].mixed_block_flag = (tmp << 12) >> 31;   /* 1 */;
237d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
238d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                si->ch[ch].gran[0].table_select[0]  = (tmp << 13) >> 27;   /* 5 */;
239d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                si->ch[ch].gran[0].table_select[1]  = (tmp << 18) >> 27;   /* 5 */;
240d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
241d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                si->ch[ch].gran[0].subblock_gain[0] = (tmp << 23) >> 29;   /* 3 */;
242d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                si->ch[ch].gran[0].subblock_gain[1] = (tmp << 26) >> 29;   /* 3 */;
243d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                si->ch[ch].gran[0].subblock_gain[2] = (tmp << 29) >> 29;   /* 3 */;
244d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
245d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                /* Set region_count parameters since they are implicit in this case. */
246d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
247d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                if (si->ch[ch].gran[0].block_type == 0)
248d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                {
249d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                    return(SIDE_INFO_ERROR);
250d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                }
251d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                else if ((si->ch[ch].gran[0].block_type       == 2)
252d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                         && (si->ch[ch].gran[0].mixed_block_flag == 0))
253d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                {
254d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                    si->ch[ch].gran[0].region0_count = 8; /* MI 9; */
255d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                    si->ch[ch].gran[0].region1_count = 12;
256d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                }
257d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                else
258d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                {
259d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                    si->ch[ch].gran[0].region0_count = 7; /* MI 8; */
260d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                    si->ch[ch].gran[0].region1_count = 13;
261d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                }
262d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            }
263d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            else
264d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            {
265d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                tmp = getbits_crc(inputStream, 22, crc, info->error_protection);
266d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
267d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                si->ch[ch].gran[0].table_select[0] = (tmp << 10) >> 27;   /* 5 */;
268d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                si->ch[ch].gran[0].table_select[1] = (tmp << 15) >> 27;   /* 5 */;
269d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                si->ch[ch].gran[0].table_select[2] = (tmp << 20) >> 27;   /* 5 */;
270d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
271d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                si->ch[ch].gran[0].region0_count   = (tmp << 25) >> 28;   /* 4 */;
272d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                si->ch[ch].gran[0].region1_count   = (tmp << 29) >> 29;   /* 3 */;
273d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
274d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                si->ch[ch].gran[0].block_type      = 0;
275d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            }
276d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
277d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            tmp = getbits_crc(inputStream, 2, crc, info->error_protection);
278d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            si->ch[ch].gran[0].scalefac_scale     =  tmp >> 1;  /* 1 */
279d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            si->ch[ch].gran[0].count1table_select =  tmp & 1;  /* 1 */
280d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
281d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        }
282d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    }
283d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    return (NO_DECODING_ERROR);
284d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber}
285d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
286