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