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
22d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber   PacketVideo Corp.
23d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber   MP3 Decoder Library
24d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
25d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber   Filename: pvmp3_huffman_decoding.cpp
26d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
27d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber Funtions:
28d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    pvmp3_huffman_quad_decoding
29d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    pvmp3_huffman_pair_decoding
30d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    pvmp3_huffman_pair_decoding_linbits
31d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
32d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber     Date: 09/21/2007
33d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
34d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber------------------------------------------------------------------------------
35d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber REVISION HISTORY
36d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
37d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
38d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber Description:
39d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
40d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber------------------------------------------------------------------------------
41d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber INPUT AND OUTPUT DEFINITIONS
42d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
43d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber Inputs:
44d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    int32 is[],
45d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    granuleInfo  *grInfo,    information for the given channel and granule
46d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    tmp3dec_file   *pVars,   decoder state structure
47d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    int32 part2_start,       index to beginning of part 2 data
48d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    mp3Header *info          mp3 header info
49d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
50d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber Outputs:
51d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    int32 is[],              uncompressed data
52d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
53d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber  Return:
54d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber     non zero frequency lines
55d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
56d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber------------------------------------------------------------------------------
57d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber FUNCTION DESCRIPTION
58d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
59d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber   These functions are used to decode huffman codewords from the input
60d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber   bitstream using combined binary search and look-up table approach.
61d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
62d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber------------------------------------------------------------------------------
63d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber REQUIREMENTS
64d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
65d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
66d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber------------------------------------------------------------------------------
67d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber REFERENCES
68d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber [1] ISO MPEG Audio Subgroup Software Simulation Group (1996)
69d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber     ISO 13818-3 MPEG-2 Audio Decoder - Lower Sampling Frequency Extension
70d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
71d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
72d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber------------------------------------------------------------------------------
73d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber PSEUDO-CODE
74d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
75d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber------------------------------------------------------------------------------
76d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber*/
77d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
78d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
79d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber/*----------------------------------------------------------------------------
80d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber; INCLUDES
81d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber----------------------------------------------------------------------------*/
82d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber#include "pv_mp3_huffman.h"
83d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber#include "s_mp3bits.h"
84d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber#include "mp3_mem_funcs.h"
85d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber#include "pvmp3_tables.h"
86d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
87d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
88d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber/*----------------------------------------------------------------------------
89d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber; MACROS
90d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber; Define module specific macros here
91d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber----------------------------------------------------------------------------*/
92d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
93d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
94d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber/*----------------------------------------------------------------------------
95d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber; DEFINES
96d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber; Include all pre-processor statements here. Include conditional
97d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber; compile variables also.
98d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber----------------------------------------------------------------------------*/
99d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
100d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
101d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber/*----------------------------------------------------------------------------
102d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber; LOCAL FUNCTION DEFINITIONS
103d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber; Function Prototype declaration
104d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber----------------------------------------------------------------------------*/
105d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
106d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber/*----------------------------------------------------------------------------
107d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber; LOCAL STORE/BUFFER/POINTER DEFINITIONS
108d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber; Variable declaration - defined here and used outside this module
109d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber----------------------------------------------------------------------------*/
110d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
111d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber/*----------------------------------------------------------------------------
112d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber; EXTERNAL FUNCTION REFERENCES
113d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber; Declare functions defined elsewhere and referenced in this module
114d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber----------------------------------------------------------------------------*/
115d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
116d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber/*----------------------------------------------------------------------------
117d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber; EXTERNAL GLOBAL STORE/BUFFER/POINTER REFERENCES
118d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber; Declare variables used in this module but defined elsewhere
119d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber----------------------------------------------------------------------------*/
120d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
121d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber/*----------------------------------------------------------------------------
122d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber; FUNCTION CODE
123d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber----------------------------------------------------------------------------*/
124d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
125d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huberint32 pvmp3_huffman_parsing(int32 is[SUBBANDS_NUMBER*FILTERBANK_BANDS],
126d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                            granuleInfo *grInfo,
127d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                            tmp3dec_file   *pVars,
128d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                            int32 part2_start,
129d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                            mp3Header *info)
130d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
131d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
132d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber{
133d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    int32 i;
134d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    int32 region1Start;
135d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    int32 region2Start;
136d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    int32 sfreq;
137d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    uint32 grBits;
138d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    void(*pt_huff)(struct huffcodetab *, int32 *, tmp3Bits *);
139d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    struct huffcodetab *h;
140d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
141d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    tmp3Bits *pMainData = &pVars->mainDataStream;
142d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
143d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
144d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    /*int32 bt = (*si).ch[ch].gr[gr].window_switching_flag && ((*si).ch[ch].gr[gr].block_type == 2);*/
145d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
146d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    sfreq = info->sampling_frequency + info->version_x + (info->version_x << 1);
147d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
148d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    /* Find region boundary for short block case. */
149d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
150d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
151d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    if ((grInfo->window_switching_flag) && (grInfo->block_type == 2))
152d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    {
153d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        if (info->version_x == MPEG_1)
154d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        {
155d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            /* Region2. */
156d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            region1Start = 12;
157d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        }
158d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        else
159d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        {
160d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            /* Region2. */
161d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            i = grInfo->region0_count + 1;
162d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            region1Start = mp3_sfBandIndex[sfreq].s[i/3];
163d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        }
164d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
165d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        region1Start += region1Start << 1;
166d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        region2Start = 576; /* No Region2 for short block case. */
167d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    }
168d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    else
169d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    {          /* Find region boundary for long block case. */
170d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        i = grInfo->region0_count + 1;
171d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        region1Start = mp3_sfBandIndex[sfreq].l[i];
172d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        region2Start = mp3_sfBandIndex[sfreq].l[i + grInfo->region1_count + 1];
173d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    }
174d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
175d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    /* Read bigvalues area. */
176d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
177d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
178d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    if (grInfo->big_values > (FILTERBANK_BANDS*SUBBANDS_NUMBER >> 1))
179d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    {
180d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        grInfo->big_values = (FILTERBANK_BANDS * SUBBANDS_NUMBER >> 1);
181d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    }
182d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
183d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    if ((grInfo->big_values << 1) > (uint32)region2Start)
184d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    {
185d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        h = &(pVars->ht[grInfo->table_select[0]]);
186d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        if (h->linbits)
187d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        {
188d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            pt_huff = pvmp3_huffman_pair_decoding_linbits;
189d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        }
190d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        else
191d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        {
192d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            pt_huff = pvmp3_huffman_pair_decoding;
193d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        }
194d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
195d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        for (i = 0; i < region1Start; i += 2)
196d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        {
197d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            (*pt_huff)(h, &is[i], pMainData);
198d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        }
199d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
200d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        h = &(pVars->ht[grInfo->table_select[1]]);
201d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        if (h->linbits)
202d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        {
203d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            pt_huff = pvmp3_huffman_pair_decoding_linbits;
204d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        }
205d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        else
206d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        {
207d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            pt_huff = pvmp3_huffman_pair_decoding;
208d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        }
209d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
210d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        for (; i < region2Start; i += 2)
211d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        {
212d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            (*pt_huff)(h, &is[i], pMainData);
213d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        }
214d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
215d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        h = &(pVars->ht[grInfo->table_select[2]]);
216d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        if (h->linbits)
217d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        {
218d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            pt_huff = pvmp3_huffman_pair_decoding_linbits;
219d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        }
220d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        else
221d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        {
222d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            pt_huff = pvmp3_huffman_pair_decoding;
223d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        }
224d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
225d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        for (; (uint32)i < (grInfo->big_values << 1); i += 2)
226d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        {
227d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            (*pt_huff)(h, &is[i], pMainData);
228d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        }
229d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    }
230d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    else if ((grInfo->big_values << 1) > (uint32)region1Start)
231d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    {
232d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        h = &(pVars->ht[grInfo->table_select[0]]);
233d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        if (h->linbits)
234d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        {
235d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            pt_huff = pvmp3_huffman_pair_decoding_linbits;
236d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        }
237d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        else
238d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        {
239d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            pt_huff = pvmp3_huffman_pair_decoding;
240d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        }
241d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        for (i = 0; i < region1Start; i += 2)
242d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        {
243d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            (*pt_huff)(h, &is[i], pMainData);
244d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        }
245d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
246d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        h = &(pVars->ht[grInfo->table_select[1]]);
247d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        if (h->linbits)
248d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        {
249d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            pt_huff = pvmp3_huffman_pair_decoding_linbits;
250d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        }
251d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        else
252d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        {
253d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            pt_huff = pvmp3_huffman_pair_decoding;
254d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        }
255d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        for (; (uint32)i < (grInfo->big_values << 1); i += 2)
256d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        {
257d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            (*pt_huff)(h, &is[i], pMainData);
258d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        }
259d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    }
260d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    else
261d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    {
262d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        h = &(pVars->ht[grInfo->table_select[0]]);
263d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        if (h->linbits)
264d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        {
265d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            pt_huff = pvmp3_huffman_pair_decoding_linbits;
266d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        }
267d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        else
268d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        {
269d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            pt_huff = pvmp3_huffman_pair_decoding;
270d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        }
271d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
272d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        for (i = 0; (uint32)i < (grInfo->big_values << 1); i += 2)
273d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        {
274d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            (*pt_huff)(h, &is[i], pMainData);
275d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        }
276d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    }
277d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
278d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
279d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
280d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    /* Read count1 area. */
281d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    h = &(pVars->ht[grInfo->count1table_select+32]);
282d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
283d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    grBits     = part2_start + grInfo->part2_3_length;
284d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
285d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    while ((pMainData->usedBits < grBits) &&
286d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            (i < FILTERBANK_BANDS*SUBBANDS_NUMBER - 4))
287d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    {
288d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        pvmp3_huffman_quad_decoding(h, &is[i], pMainData);
289d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        i += 4;
290d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    }
291d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
292d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    if ((pMainData->usedBits < grBits) &&
293d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            (i < FILTERBANK_BANDS*SUBBANDS_NUMBER))
294d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    {
295d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        pvmp3_huffman_quad_decoding(h, &is[i], pMainData);
296d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        i += 4;
297d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
298d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        if ((i - 2) >= FILTERBANK_BANDS*SUBBANDS_NUMBER)
299d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        {
300d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            i -= 2;
301d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            is[i] = 0;
302d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            is[(i+1)] = 0;
303d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        }
304d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    }
305d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
306d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    if (pMainData->usedBits > grBits)
307d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    {
308d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        i -= 4;
309d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
310d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        if (i < 0 || i > FILTERBANK_BANDS*SUBBANDS_NUMBER - 4)
311d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        {
312d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            /* illegal parameters may cause invalid access, set i to 0 */
313d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            i = 0;
314d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        }
315d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
316d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        is[i] = 0;
317d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        is[(i+1)] = 0;
318d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        is[(i+2)] = 0;
319d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        is[(i+3)] = 0;
320d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
321d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    }
322d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
323d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    pMainData->usedBits = grBits;
324d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
325d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    return (i);
326d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
327d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber}
328d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
329