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 PacketVideo Corp.
22 MP3 Decoder Library
23
24 Filename: pvmp3_huffman_decoding.cpp
25
26 Funtions:
27 pvmp3_huffman_quad_decoding
28 pvmp3_huffman_pair_decoding
29 pvmp3_huffman_pair_decoding_linbits
30
31 Date: 09/21/2007
32
33 ------------------------------------------------------------------------------
34 REVISION HISTORY
35
36
37 Description:
38
39 ------------------------------------------------------------------------------
40 INPUT AND OUTPUT DEFINITIONS
41
42 Inputs:
43 struct huffcodetab *h, pointer to huffman code record
44 int32 *x, returns decoded x value
45 int32 *y, returns decoded y value
46 int32 *v, returns decoded v value (only in quad function)
47 int32 *w, returns decoded w value (only in quad function)
48 tbits *pMainData bit stream
49
50 Outputs:
51
52
53 ------------------------------------------------------------------------------
54 FUNCTION DESCRIPTION
55
56 These functions are used to decode huffman codewords from the input
57 bitstream using combined binary search and look-up table approach.
58
59 ------------------------------------------------------------------------------
60 REQUIREMENTS
61
62
63 ------------------------------------------------------------------------------
64 REFERENCES
65 [1] ISO MPEG Audio Subgroup Software Simulation Group (1996)
66 ISO 13818-3 MPEG-2 Audio Decoder - Lower Sampling Frequency Extension
67
68
69 ------------------------------------------------------------------------------
70 PSEUDO-CODE
71
72 ------------------------------------------------------------------------------
73 */
74
75
76 /*----------------------------------------------------------------------------
77 ; INCLUDES
78 ----------------------------------------------------------------------------*/
79 #include "pvmp3_dec_defs.h"
80 #include "pv_mp3_huffman.h"
81 #include "pvmp3_getbits.h"
82
83
84 /*----------------------------------------------------------------------------
85 ; MACROS
86 ; Define module specific macros here
87 ----------------------------------------------------------------------------*/
88
89
90 /*----------------------------------------------------------------------------
91 ; DEFINES
92 ; Include all pre-processor statements here. Include conditional
93 ; compile variables also.
94 ----------------------------------------------------------------------------*/
95
96
97 /*----------------------------------------------------------------------------
98 ; LOCAL FUNCTION DEFINITIONS
99 ; Function Prototype declaration
100 ----------------------------------------------------------------------------*/
101
102 /*----------------------------------------------------------------------------
103 ; LOCAL STORE/BUFFER/POINTER DEFINITIONS
104 ; Variable declaration - defined here and used outside this module
105 ----------------------------------------------------------------------------*/
106
107 /*----------------------------------------------------------------------------
108 ; EXTERNAL FUNCTION REFERENCES
109 ; Declare functions defined elsewhere and referenced in this module
110 ----------------------------------------------------------------------------*/
111
112 /*----------------------------------------------------------------------------
113 ; EXTERNAL GLOBAL STORE/BUFFER/POINTER REFERENCES
114 ; Declare variables used in this module but defined elsewhere
115 ----------------------------------------------------------------------------*/
116
117 /*----------------------------------------------------------------------------
118 ; FUNCTION CODE
119 ----------------------------------------------------------------------------*/
120
121
pvmp3_huffman_quad_decoding(struct huffcodetab * h,int32 * is,tmp3Bits * pMainData)122 void pvmp3_huffman_quad_decoding(struct huffcodetab *h,
123 int32 *is,
124 tmp3Bits *pMainData)
125 {
126
127 int32 x;
128 int32 y;
129 int32 v;
130 int32 w;
131
132 y = (*h->pdec_huff_tab)(pMainData);
133
134
135 if (y)
136 {
137 v = (y >> 3);
138
139 if (v)
140 {
141 if (get1bit(pMainData))
142 {
143 v = -v;
144 }
145 }
146 w = (y >> 2) & 1;
147 if (w)
148 {
149 if (get1bit(pMainData))
150 {
151 w = -w;
152 }
153 }
154 x = (y >> 1) & 1;
155 if (x)
156 {
157 if (get1bit(pMainData))
158 {
159 x = -x;
160 }
161 }
162 y = y & 1;
163 if (y)
164 {
165 if (get1bit(pMainData))
166 {
167 y = -y;
168 }
169 }
170
171 }
172 else
173 {
174 v = 0;
175 w = 0;
176 x = 0;
177
178 }
179
180 *is = v;
181 *(is + 1) = w;
182 *(is + 2) = x;
183 *(is + 3) = y;
184
185 }
186
187
188
pvmp3_huffman_pair_decoding(struct huffcodetab * h,int32 * is,tmp3Bits * pMainData)189 void pvmp3_huffman_pair_decoding(struct huffcodetab *h, /* pointer to huffman code record */
190 int32 *is,
191 tmp3Bits *pMainData)
192 {
193 /* Lookup in Huffman table. */
194 int32 x;
195 int32 y;
196
197 uint16 cw = (*h->pdec_huff_tab)(pMainData);
198
199 /* Process sign and escape encodings for dual tables. */
200
201
202 if (cw)
203 {
204 x = cw >> 4;
205
206 if (x)
207 {
208 if (get1bit(pMainData))
209 {
210 x = -x;
211 }
212 y = cw & 0xf;
213 if (y && get1bit(pMainData))
214 {
215 y = -y;
216 }
217
218 }
219 else
220 {
221 y = cw & 0xf;
222 if (get1bit(pMainData))
223 {
224 y = -y;
225 }
226 }
227
228 *is = x;
229 *(is + 1) = y;
230 }
231 else
232 {
233 *is = 0;
234 *(is + 1) = 0;
235 }
236
237
238
239 }
240
241
242
243
pvmp3_huffman_pair_decoding_linbits(struct huffcodetab * h,int32 * is,tmp3Bits * pMainData)244 void pvmp3_huffman_pair_decoding_linbits(struct huffcodetab *h, /* pointer to huffman code record */
245 int32 *is,
246 tmp3Bits *pMainData)
247 {
248 int32 x;
249 int32 y;
250
251 uint16 cw;
252 /* Lookup in Huffman table. */
253
254
255 cw = (*h->pdec_huff_tab)(pMainData);
256 x = cw >> 4;
257
258 /* Process sign and escape encodings for dual tables. */
259
260
261 if (15 == (uint32)x)
262 {
263 int32 tmp = getUpTo17bits(pMainData, (h->linbits + 1));
264 x += tmp >> 1;
265 if (tmp&1)
266 {
267 x = -x;
268 }
269 }
270 else if (x)
271 {
272 if (get1bit(pMainData))
273 {
274 x = -x;
275 }
276 }
277
278 y = cw & 0xf;
279 if (15 == (uint32)y)
280 {
281 int32 tmp = getUpTo17bits(pMainData, (h->linbits + 1));
282 y += tmp >> 1;
283 if (tmp&1)
284 {
285 y = -y;
286 }
287 }
288 else if (y)
289 {
290 if (get1bit(pMainData))
291 {
292 y = -y;
293 }
294 }
295
296 *is = x;
297 *(is + 1) = y;
298
299 }
300
301
302
303
304
305