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