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