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_getbits.cpp
25d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
26d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
27d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber     Date: 09/21/2007
28d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
29d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber------------------------------------------------------------------------------
30d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber REVISION HISTORY
31d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
32d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
33d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber Description:
34d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
35d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber------------------------------------------------------------------------------
36d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber INPUT AND OUTPUT DEFINITIONS
37d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
38d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber Inputs:
39d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
40d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    tmp3Bits *inputStream,     structure holding the input stream parameters
41d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    int32     neededBits       number of bits to read from the bit stream
42d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
43d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber Outputs:
44d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
45d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    word parsed from teh bitstream, with size neededBits-bits,
46d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
47d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber------------------------------------------------------------------------------
48d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber FUNCTION DESCRIPTION
49d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
50d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
51d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber------------------------------------------------------------------------------
52d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber REQUIREMENTS
53d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
54d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
55d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber------------------------------------------------------------------------------
56d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber REFERENCES
57d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber [1] ISO MPEG Audio Subgroup Software Simulation Group (1996)
58d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber     ISO 13818-3 MPEG-2 Audio Decoder - Lower Sampling Frequency Extension
59d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
60d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
61d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber------------------------------------------------------------------------------
62d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber PSEUDO-CODE
63d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
64d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber------------------------------------------------------------------------------
65d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber*/
66d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
67d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber/*----------------------------------------------------------------------------
68d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber; INCLUDES
69d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber----------------------------------------------------------------------------*/
70d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber#include "pvmp3_getbits.h"
71d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
72d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber/*----------------------------------------------------------------------------
73d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber; MACROS
74d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber; Define module specific macros here
75d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber----------------------------------------------------------------------------*/
76d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
77d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
78d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber/*----------------------------------------------------------------------------
79d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber; DEFINES
80d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber; Include all pre-processor statements here. Include conditional
81d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber; compile variables also.
82d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber----------------------------------------------------------------------------*/
83d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
84d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
85d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber/*----------------------------------------------------------------------------
86d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber; LOCAL FUNCTION DEFINITIONS
87d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber; Function Prototype declaration
88d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber----------------------------------------------------------------------------*/
89d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
90d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber/*----------------------------------------------------------------------------
91d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber; LOCAL STORE/BUFFER/POINTER DEFINITIONS
92d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber; Variable declaration - defined here and used outside this module
93d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber----------------------------------------------------------------------------*/
94d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
95d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber/*----------------------------------------------------------------------------
96d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber; EXTERNAL FUNCTION REFERENCES
97d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber; Declare functions defined elsewhere and referenced in this module
98d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber----------------------------------------------------------------------------*/
99d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
100d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber/*----------------------------------------------------------------------------
101d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber; EXTERNAL GLOBAL STORE/BUFFER/POINTER REFERENCES
102d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber; Declare variables used in this module but defined elsewhere
103d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber----------------------------------------------------------------------------*/
104d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
105d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
106d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber/*----------------------------------------------------------------------------
107d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber; FUNCTION CODE
108d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber----------------------------------------------------------------------------*/
109d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
110d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huberuint32 getNbits(tmp3Bits *ptBitStream,
111d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                int32 neededBits) /* number of bits to read from the bitstream (up to 25) */
112d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber{
113d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
114d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    uint32    offset;
115d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    uint32    bitIndex;
116d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    uint8     Elem;         /* Needs to be same type as pInput->pBuffer */
117d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    uint8     Elem1;
118d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    uint8     Elem2;
119d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    uint8     Elem3;
120d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    uint32   returnValue = 0;
121d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
122d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    if (!neededBits)
123d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    {
124d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        return (returnValue);
125d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    }
126d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
127d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    offset = (ptBitStream->usedBits) >> INBUF_ARRAY_INDEX_SHIFT;
128d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
129d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    Elem  = *(ptBitStream->pBuffer + module(offset  , BUFSIZE));
130d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    Elem1 = *(ptBitStream->pBuffer + module(offset + 1, BUFSIZE));
131d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    Elem2 = *(ptBitStream->pBuffer + module(offset + 2, BUFSIZE));
132d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    Elem3 = *(ptBitStream->pBuffer + module(offset + 3, BUFSIZE));
133d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
134d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
135d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    returnValue = (((uint32)(Elem)) << 24) |
136d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                  (((uint32)(Elem1)) << 16) |
137d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                  (((uint32)(Elem2)) << 8) |
138d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                  ((uint32)(Elem3));
139d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
140d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    /* Remove extra high bits by shifting up */
141d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    bitIndex = module(ptBitStream->usedBits, INBUF_BIT_WIDTH);
142d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
143d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    /* This line is faster than to mask off the high bits. */
144d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    returnValue <<= bitIndex;
145d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
146d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    /* Move the field down. */
147d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    returnValue >>= (32 - neededBits);
148d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
149d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    ptBitStream->usedBits += neededBits;
150d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
151d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    return (returnValue);
152d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber}
153d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
154d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber/*----------------------------------------------------------------------------
155d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber; FUNCTION CODE
156d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber----------------------------------------------------------------------------*/
157d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
158d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huberuint16 getUpTo9bits(tmp3Bits *ptBitStream,
159d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                    int32 neededBits) /* number of bits to read from the bit stream 2 to 9 */
160d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber{
161d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
162d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    uint32    offset;
163d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    uint32    bitIndex;
164d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    uint8    Elem;         /* Needs to be same type as pInput->pBuffer */
165d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    uint8    Elem1;
166d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    uint16   returnValue;
167d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
168d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    offset = (ptBitStream->usedBits) >> INBUF_ARRAY_INDEX_SHIFT;
169d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
170d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    Elem  = *(ptBitStream->pBuffer + module(offset  , BUFSIZE));
171d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    Elem1 = *(ptBitStream->pBuffer + module(offset + 1, BUFSIZE));
172d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
173d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
174d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    returnValue = (((uint16)(Elem)) << 8) |
175d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                  ((uint16)(Elem1));
176d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
177d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    /* Remove extra high bits by shifting up */
178d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    bitIndex = module(ptBitStream->usedBits, INBUF_BIT_WIDTH);
179d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
180d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    ptBitStream->usedBits += neededBits;
181d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    /* This line is faster than to mask off the high bits. */
182d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    returnValue = (returnValue << (bitIndex));
183d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
184d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    /* Move the field down. */
185d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
186d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    return (uint16)(returnValue >> (16 - neededBits));
187d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
188d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber}
189d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
190d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber/*----------------------------------------------------------------------------
191d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber; FUNCTION CODE
192d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber----------------------------------------------------------------------------*/
193d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
194d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huberuint32 getUpTo17bits(tmp3Bits *ptBitStream,
195d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                     int32 neededBits) /* number of bits to read from the bit stream 2 to 8 */
196d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber{
197d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
198d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    uint32    offset;
199d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    uint32    bitIndex;
200d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    uint8     Elem;         /* Needs to be same type as pInput->pBuffer */
201d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    uint8     Elem1;
202d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    uint8     Elem2;
203d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    uint32   returnValue;
204d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
205d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    offset = (ptBitStream->usedBits) >> INBUF_ARRAY_INDEX_SHIFT;
206d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
207d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    Elem  = *(ptBitStream->pBuffer + module(offset  , BUFSIZE));
208d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    Elem1 = *(ptBitStream->pBuffer + module(offset + 1, BUFSIZE));
209d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    Elem2 = *(ptBitStream->pBuffer + module(offset + 2, BUFSIZE));
210d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
211d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
212d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    returnValue = (((uint32)(Elem)) << 16) |
213d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                  (((uint32)(Elem1)) << 8) |
214d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                  ((uint32)(Elem2));
215d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
216d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    /* Remove extra high bits by shifting up */
217d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    bitIndex = module(ptBitStream->usedBits, INBUF_BIT_WIDTH);
218d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
219d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    ptBitStream->usedBits += neededBits;
220d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    /* This line is faster than to mask off the high bits. */
221d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    returnValue = 0xFFFFFF & (returnValue << (bitIndex));
222d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
223d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    /* Move the field down. */
224d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
225d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    return (uint32)(returnValue >> (24 - neededBits));
226d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
227d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber}
228d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
229d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber/*----------------------------------------------------------------------------
230d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber; FUNCTION CODE
231d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber----------------------------------------------------------------------------*/
232d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
233d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huberuint8 get1bit(tmp3Bits *ptBitStream)  /* number of bits to read from the bit stream */
234d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber{
235d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
236d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    uint32    offset;
237d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    uint32    bitIndex;
238d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    uint8   returnValue;
239d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
240d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    offset = (ptBitStream->usedBits) >> INBUF_ARRAY_INDEX_SHIFT;
241d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
242d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    returnValue  = *(ptBitStream->pBuffer + module(offset  , BUFSIZE));
243d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
244d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    /* Remove extra high bits by shifting up */
245d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    bitIndex = module(ptBitStream->usedBits, INBUF_BIT_WIDTH);
246d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    ptBitStream->usedBits++;
247d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
248d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    /* This line is faster than to mask off the high bits. */
249d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    returnValue = (returnValue << (bitIndex));
250d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
251d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    return (uint8)(returnValue >> 7);
252d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
253d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber}
254d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
255d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
256d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
257d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
258