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