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 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 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 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