1250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber/* ------------------------------------------------------------------
2250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber * Copyright (C) 1998-2009 PacketVideo
3250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber *
4250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber * Licensed under the Apache License, Version 2.0 (the "License");
5250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber * you may not use this file except in compliance with the License.
6250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber * You may obtain a copy of the License at
7250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber *
8250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber *      http://www.apache.org/licenses/LICENSE-2.0
9250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber *
10250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber * Unless required by applicable law or agreed to in writing, software
11250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber * distributed under the License is distributed on an "AS IS" BASIS,
12250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
13250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber * express or implied.
14250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber * See the License for the specific language governing permissions
15250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber * and limitations under the License.
16250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber * -------------------------------------------------------------------
17250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber */
18250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber/*
19250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber------------------------------------------------------------------------------
20250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
21250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber   PacketVideo Corp.
22250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber   MP3 Decoder Library
23250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
24250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber   Filename: pvmp3_getbits.cpp
25250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
26250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
27250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber     Date: 09/21/2007
28250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
29250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber------------------------------------------------------------------------------
30250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber REVISION HISTORY
31250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
32250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
33250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber Description:
34250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
35250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber------------------------------------------------------------------------------
36250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber INPUT AND OUTPUT DEFINITIONS
37250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
38250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber Inputs:
39250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
40250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    tmp3Bits *inputStream,     structure holding the input stream parameters
41250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    int32     neededBits       number of bits to read from the bit stream
42250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
43250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber Outputs:
44250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
45250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    word parsed from teh bitstream, with size neededBits-bits,
46250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
47250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber------------------------------------------------------------------------------
48250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber FUNCTION DESCRIPTION
49250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
50250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
51250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber------------------------------------------------------------------------------
52250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber REQUIREMENTS
53250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
54250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
55250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber------------------------------------------------------------------------------
56250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber REFERENCES
57250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber [1] ISO MPEG Audio Subgroup Software Simulation Group (1996)
58250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber     ISO 13818-3 MPEG-2 Audio Decoder - Lower Sampling Frequency Extension
59250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
60250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
61250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber------------------------------------------------------------------------------
62250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber PSEUDO-CODE
63250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
64250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber------------------------------------------------------------------------------
65250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber*/
66250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
67250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber/*----------------------------------------------------------------------------
68250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber; INCLUDES
69250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber----------------------------------------------------------------------------*/
70250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber#include "pvmp3_getbits.h"
71250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
72250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber/*----------------------------------------------------------------------------
73250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber; MACROS
74250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber; Define module specific macros here
75250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber----------------------------------------------------------------------------*/
76250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
77250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
78250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber/*----------------------------------------------------------------------------
79250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber; DEFINES
80250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber; Include all pre-processor statements here. Include conditional
81250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber; compile variables also.
82250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber----------------------------------------------------------------------------*/
83250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
84250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
85250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber/*----------------------------------------------------------------------------
86250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber; LOCAL FUNCTION DEFINITIONS
87250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber; Function Prototype declaration
88250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber----------------------------------------------------------------------------*/
89250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
90250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber/*----------------------------------------------------------------------------
91250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber; LOCAL STORE/BUFFER/POINTER DEFINITIONS
92250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber; Variable declaration - defined here and used outside this module
93250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber----------------------------------------------------------------------------*/
94250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
95250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber/*----------------------------------------------------------------------------
96250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber; EXTERNAL FUNCTION REFERENCES
97250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber; Declare functions defined elsewhere and referenced in this module
98250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber----------------------------------------------------------------------------*/
99250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
100250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber/*----------------------------------------------------------------------------
101250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber; EXTERNAL GLOBAL STORE/BUFFER/POINTER REFERENCES
102250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber; Declare variables used in this module but defined elsewhere
103250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber----------------------------------------------------------------------------*/
104250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
105250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
106250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber/*----------------------------------------------------------------------------
107250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber; FUNCTION CODE
108250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber----------------------------------------------------------------------------*/
109250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
110250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huberuint32 getNbits(tmp3Bits *ptBitStream,
111250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                int32 neededBits) /* number of bits to read from the bitstream (up to 25) */
112250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber{
113250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
114250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    uint32    offset;
115250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    uint32    bitIndex;
116250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    uint8     Elem;         /* Needs to be same type as pInput->pBuffer */
117250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    uint8     Elem1;
118250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    uint8     Elem2;
119250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    uint8     Elem3;
120250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    uint32   returnValue = 0;
121250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
122250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    if (!neededBits)
123250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    {
124250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber        return (returnValue);
125250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    }
126250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
127250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    offset = (ptBitStream->usedBits) >> INBUF_ARRAY_INDEX_SHIFT;
128250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
129250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    Elem  = *(ptBitStream->pBuffer + module(offset  , BUFSIZE));
130250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    Elem1 = *(ptBitStream->pBuffer + module(offset + 1, BUFSIZE));
131250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    Elem2 = *(ptBitStream->pBuffer + module(offset + 2, BUFSIZE));
132250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    Elem3 = *(ptBitStream->pBuffer + module(offset + 3, BUFSIZE));
133250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
134250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
135250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    returnValue = (((uint32)(Elem)) << 24) |
136250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                  (((uint32)(Elem1)) << 16) |
137250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                  (((uint32)(Elem2)) << 8) |
138250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                  ((uint32)(Elem3));
139250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
140250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    /* Remove extra high bits by shifting up */
141250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    bitIndex = module(ptBitStream->usedBits, INBUF_BIT_WIDTH);
142250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
143250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    /* This line is faster than to mask off the high bits. */
144250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    returnValue <<= bitIndex;
145250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
146250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    /* Move the field down. */
147250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    returnValue >>= (32 - neededBits);
148250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
149250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    ptBitStream->usedBits += neededBits;
150250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
151250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    return (returnValue);
152250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber}
153250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
154250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber/*----------------------------------------------------------------------------
155250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber; FUNCTION CODE
156250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber----------------------------------------------------------------------------*/
157250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
158250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huberuint16 getUpTo9bits(tmp3Bits *ptBitStream,
159250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                    int32 neededBits) /* number of bits to read from the bit stream 2 to 9 */
160250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber{
161250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
162250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    uint32    offset;
163250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    uint32    bitIndex;
164250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    uint8    Elem;         /* Needs to be same type as pInput->pBuffer */
165250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    uint8    Elem1;
166250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    uint16   returnValue;
167250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
168250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    offset = (ptBitStream->usedBits) >> INBUF_ARRAY_INDEX_SHIFT;
169250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
170250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    Elem  = *(ptBitStream->pBuffer + module(offset  , BUFSIZE));
171250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    Elem1 = *(ptBitStream->pBuffer + module(offset + 1, BUFSIZE));
172250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
173250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
174250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    returnValue = (((uint16)(Elem)) << 8) |
175250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                  ((uint16)(Elem1));
176250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
177250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    /* Remove extra high bits by shifting up */
178250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    bitIndex = module(ptBitStream->usedBits, INBUF_BIT_WIDTH);
179250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
180250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    ptBitStream->usedBits += neededBits;
181250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    /* This line is faster than to mask off the high bits. */
182250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    returnValue = (returnValue << (bitIndex));
183250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
184250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    /* Move the field down. */
185250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
186250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    return (uint16)(returnValue >> (16 - neededBits));
187250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
188250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber}
189250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
190250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber/*----------------------------------------------------------------------------
191250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber; FUNCTION CODE
192250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber----------------------------------------------------------------------------*/
193250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
194250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huberuint32 getUpTo17bits(tmp3Bits *ptBitStream,
195250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                     int32 neededBits) /* number of bits to read from the bit stream 2 to 8 */
196250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber{
197250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
198250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    uint32    offset;
199250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    uint32    bitIndex;
200250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    uint8     Elem;         /* Needs to be same type as pInput->pBuffer */
201250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    uint8     Elem1;
202250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    uint8     Elem2;
203250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    uint32   returnValue;
204250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
205250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    offset = (ptBitStream->usedBits) >> INBUF_ARRAY_INDEX_SHIFT;
206250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
207250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    Elem  = *(ptBitStream->pBuffer + module(offset  , BUFSIZE));
208250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    Elem1 = *(ptBitStream->pBuffer + module(offset + 1, BUFSIZE));
209250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    Elem2 = *(ptBitStream->pBuffer + module(offset + 2, BUFSIZE));
210250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
211250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
212250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    returnValue = (((uint32)(Elem)) << 16) |
213250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                  (((uint32)(Elem1)) << 8) |
214250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                  ((uint32)(Elem2));
215250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
216250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    /* Remove extra high bits by shifting up */
217250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    bitIndex = module(ptBitStream->usedBits, INBUF_BIT_WIDTH);
218250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
219250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    ptBitStream->usedBits += neededBits;
220250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    /* This line is faster than to mask off the high bits. */
221250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    returnValue = 0xFFFFFF & (returnValue << (bitIndex));
222250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
223250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    /* Move the field down. */
224250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
225250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    return (uint32)(returnValue >> (24 - neededBits));
226250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
227250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber}
228250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
229250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber/*----------------------------------------------------------------------------
230250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber; FUNCTION CODE
231250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber----------------------------------------------------------------------------*/
232250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
233250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huberuint8 get1bit(tmp3Bits *ptBitStream)  /* number of bits to read from the bit stream */
234250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber{
235250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
236250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    uint32    offset;
237250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    uint32    bitIndex;
238250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    uint8   returnValue;
239250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
240250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    offset = (ptBitStream->usedBits) >> INBUF_ARRAY_INDEX_SHIFT;
241250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
242250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    returnValue  = *(ptBitStream->pBuffer + module(offset  , BUFSIZE));
243250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
244250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    /* Remove extra high bits by shifting up */
245250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    bitIndex = module(ptBitStream->usedBits, INBUF_BIT_WIDTH);
246250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    ptBitStream->usedBits++;
247250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
248250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    /* This line is faster than to mask off the high bits. */
249250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    returnValue = (returnValue << (bitIndex));
250250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
251250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    return (uint8)(returnValue >> 7);
252250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
253250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber}
254250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
255250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
256250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
257250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
258