1dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/* ------------------------------------------------------------------
2dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * Copyright (C) 1998-2009 PacketVideo
3dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *
4dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * Licensed under the Apache License, Version 2.0 (the "License");
5dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * you may not use this file except in compliance with the License.
6dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * You may obtain a copy of the License at
7dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *
8dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *      http://www.apache.org/licenses/LICENSE-2.0
9dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *
10dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * Unless required by applicable law or agreed to in writing, software
11dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * distributed under the License is distributed on an "AS IS" BASIS,
12dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
13dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * express or implied.
14dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * See the License for the specific language governing permissions
15dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * and limitations under the License.
16dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * -------------------------------------------------------------------
17dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber */
18dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*
19dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
20dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Pathname: getbits.h
21dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
22dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber------------------------------------------------------------------------------
23dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber REVISION HISTORY
24dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
25dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Description: Update comments for the structure
26dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
27dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Description: Move structur to another file
28dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
29dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Who:                                            Date: MM/DD/YYYY
30dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Description:
31dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
32dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
33dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber------------------------------------------------------------------------------
34dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber INCLUDE DESCRIPTION
35dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
36dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Header file for the function getbits().
37dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
38dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber------------------------------------------------------------------------------
39dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber*/
40dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
41dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*----------------------------------------------------------------------------
42dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; CONTINUE ONLY IF NOT ALREADY DEFINED
43dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber----------------------------------------------------------------------------*/
44dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#ifndef GETBITS_H
45dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#define GETBITS_H
46dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
47dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#ifdef __cplusplus
48dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huberextern "C"
49dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber{
50dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#endif
51dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
52dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    /*----------------------------------------------------------------------------
53dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    ; INCLUDES
54dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    ----------------------------------------------------------------------------*/
55dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#include "pv_audio_type_defs.h"
56dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#include "ibstream.h"
57dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
58dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    /*----------------------------------------------------------------------------
59dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    ; MACROS
60dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    ; Define module specific macros here
61dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    ----------------------------------------------------------------------------*/
62dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
63dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    /*----------------------------------------------------------------------------
64dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    ; DEFINES
65dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    ; Include all pre-processor statements here.
66dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    ----------------------------------------------------------------------------*/
67dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
68dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    /*----------------------------------------------------------------------------
69dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    ; EXTERNAL VARIABLES REFERENCES
70dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    ; Declare variables used in this module but defined elsewhere
71dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    ----------------------------------------------------------------------------*/
72dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
73dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    /*----------------------------------------------------------------------------
74dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    ; SIMPLE TYPEDEF'S
75dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    ----------------------------------------------------------------------------*/
76dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
77dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    /*----------------------------------------------------------------------------
78dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    ; ENUMERATED TYPEDEF'S
79dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    ----------------------------------------------------------------------------*/
80dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
81dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    /*----------------------------------------------------------------------------
82dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    ; STRUCTURES TYPEDEF'S
83dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    ----------------------------------------------------------------------------*/
84dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
85dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    /*----------------------------------------------------------------------------
86dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    ; GLOBAL FUNCTION DEFINITIONS
87dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    ; Function Prototype declaration
88dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    ----------------------------------------------------------------------------*/
89dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
90dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#define INBUF_ARRAY_INDEX_SHIFT  (3)
91dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#define INBUF_BIT_WIDTH         (1<<(INBUF_ARRAY_INDEX_SHIFT))
92dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#define INBUF_BIT_MODULO_MASK   ((INBUF_BIT_WIDTH)-1)
93dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
94dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#define MAX_GETBITS             (25)
95dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
96dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#define  CHECK_INPUT_BUFFER_LIMITS  1
97dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
98dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    __inline UInt32 getbits(
99dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        const UInt  neededBits,
100dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        BITS       *pInputStream)
101dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    {
102dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        UInt32   returnValue = 0;
103dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        UInt     offset;
104dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        UInt     bitIndex;
105dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        UChar    *pElem;        /* Needs to be same type as pInput->pBuffer */
106dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
107dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        offset = (pInputStream->usedBits) >> INBUF_ARRAY_INDEX_SHIFT;
108dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
109dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        pElem = pInputStream->pBuffer + offset;
110dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
111dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#if CHECK_INPUT_BUFFER_LIMITS
112dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
113dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        offset =  pInputStream->inputBufferCurrentLength - offset;
114dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        /*  check if access to input buffer does not go beyond boundaries */
115dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        if (offset > 3)
116dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        {
117dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            returnValue = (((UInt32) * (pElem)) << 24) |
118dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                          (((UInt32) * (pElem + 1)) << 16) |
119dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                          (((UInt32) * (pElem + 2)) << 8) |
120dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                          ((UInt32) * (pElem + 3));
121dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        }
122dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        else  /*  then access only available bytes  */
123dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        {
124dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            /*  Access to the bitstream beyond frame boundaries are not allowed,
125dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber             *  Here, only what was available before the end of the frame will
126dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber             *  be processed. Non-accessible bytes will be filled in with zeros.
127dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber             *  Zero values guarantees that the data structures are filled in with values
128dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber             *  that eventually will signal an error (like invalid parameters) or that allow
129dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber             *  completion of the parsing routine.
130dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber             *  Overrun is detected on file pvmp4audiodecodeframe.cpp.
131dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber             */
132dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            switch (offset)
133dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            {
134dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                case 3:
135dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    returnValue  = (((UInt32) * (pElem + 2)) << 8);
136dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                case 2:
137dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    returnValue |= (((UInt32) * (pElem + 1)) << 16);
138dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                case 1:
139dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    returnValue |= (((UInt32) * (pElem)) << 24);
140dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                default:
141dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    break;
142dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            }
143dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        }
144dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
145dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
146dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#else
147dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
148dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        returnValue = (((UInt32) * (pElem)) << 24) |
149dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                      (((UInt32) * (pElem + 1)) << 16) |
150dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                      (((UInt32) * (pElem + 2)) << 8) |
151dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                      ((UInt32) * (pElem + 3));
152dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#endif
153dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
154dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        /* Remove extra high bits by shifting up */
155dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        bitIndex = (UInt)((pInputStream->usedBits) & INBUF_BIT_MODULO_MASK);
156dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
157dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        /* This line is faster way to mask off the high bits. */
158dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        returnValue = returnValue << (bitIndex);
159dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
160dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        /* Move the field down. */
161dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        returnValue = returnValue >> (32 - neededBits);
162dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
163dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        pInputStream->usedBits += neededBits;
164dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
165dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        return (returnValue);
166dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
167dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    }
168dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
169dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
170dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
171dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    __inline UInt get1bits(
172dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        BITS       *pInputStream)
173dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    {
174dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        UInt     returnValue;
175dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        UInt     offset;
176dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        UInt     bitIndex;
177dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        UChar    *pElem;        /* Needs to be same type as pInput->pBuffer */
178dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
179dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        offset = (pInputStream->usedBits) >> INBUF_ARRAY_INDEX_SHIFT;
180dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
181dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        pElem = pInputStream->pBuffer + offset;
182dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
183dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#if CHECK_INPUT_BUFFER_LIMITS
184dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        returnValue = (offset < pInputStream->inputBufferCurrentLength) ? ((UInt) * (pElem)) : 0;
185dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#else
186dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        returnValue = ((UInt32) * (pElem));
187dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#endif
188dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
189dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
190dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        /* Remove extra high bits by shifting up */
191dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        bitIndex = (UInt)((pInputStream->usedBits++) & INBUF_BIT_MODULO_MASK);
192dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
193dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        /* This line is faster way to mask off the high bits. */
194dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        returnValue = 0xFF & (returnValue << (bitIndex));
195dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
196dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        /* Move the field down. */
197dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
198dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        return ((UInt)(returnValue >> 7));
199dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
200dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    }
201dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
202dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
203dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
204dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    __inline UInt get9_n_lessbits(
205dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        const UInt  neededBits,
206dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        BITS       *pInputStream)
207dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
208dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    {
209dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        UInt     returnValue;
210dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        UInt     offset;
211dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        UInt     bitIndex;
212dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        UChar    *pElem;        /* Needs to be same type as pInput->pBuffer */
213dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
214dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        offset = (pInputStream->usedBits) >> INBUF_ARRAY_INDEX_SHIFT;
215dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
216dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        pElem = pInputStream->pBuffer + offset;
217dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
218dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#if CHECK_INPUT_BUFFER_LIMITS
219dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
220dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
221dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        offset =  pInputStream->inputBufferCurrentLength - offset;
222dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        /*  check if access to input buffer does not go beyond boundaries */
223dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        if (offset > 1)
224dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        {
225dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            returnValue = (((UInt32) * (pElem)) << 8) |
226dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                          ((UInt32) * (pElem + 1));
227dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        }
228dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        else  /*  then access only available bytes  */
229dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        {
230dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            /*  Access to the bitstream beyond frame boundaries are not allowed,
231dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber             *  Here, only what was available before the end of the frame will
232dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber             *  be processed. Non-accessible bytes will be filled in with zeros.
233dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber             *  Zero values guarantees that the data structures are filled in with values
234dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber             *  that eventually will signal an error (like invalid parameters) or that allow
235dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber             *  completion of the parsing routine.
236dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber             *  Overrun is detected on file pvmp4audiodecodeframe.cpp
237dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber             */
238dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            switch (offset)
239dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            {
240dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                case 1:
241dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    returnValue  = (((UInt32) * (pElem)) << 8);
242dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    break;
243dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                default:
244dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    returnValue = 0;
245dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    break;
246dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            }
247dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        }
248dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
249dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
250dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#else
251dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        returnValue = (((UInt32) * (pElem)) << 8) |
252dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                      ((UInt32) * (pElem + 1)) ;
253dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#endif
254dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
255dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        /* Remove extra high bits by shifting up */
256dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        bitIndex = (UInt)((pInputStream->usedBits) & INBUF_BIT_MODULO_MASK);
257dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
258dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        pInputStream->usedBits += neededBits;
259dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
260dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        /* This line is faster way to mask off the high bits. */
261dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        returnValue = 0xFFFF & (returnValue << (bitIndex));
262dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
263dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        /* Move the field down. */
264dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
265dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        return (UInt)(returnValue >> (16 - neededBits));
266dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
267dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    }
268dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
269dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    __inline UInt32 get17_n_lessbits(
270dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        const UInt  neededBits,
271dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        BITS       *pInputStream)
272dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    {
273dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        UInt32   returnValue;
274dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        UInt     offset;
275dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        UInt     bitIndex;
276dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        UChar    *pElem;        /* Needs to be same type as pInput->pBuffer */
277dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
278dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        offset = (pInputStream->usedBits) >> INBUF_ARRAY_INDEX_SHIFT;
279dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
280dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        pElem = pInputStream->pBuffer + offset;
281dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
282dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#if CHECK_INPUT_BUFFER_LIMITS
283dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
284dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        offset =  pInputStream->inputBufferCurrentLength - offset;
285dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        /*  check if access to input buffer does not go beyond boundaries */
286dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
287dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        if (offset > 2)
288dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        {
289dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            returnValue = (((UInt32) * (pElem)) << 16) |
290dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                          (((UInt32) * (pElem + 1)) << 8) |
291dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                          ((UInt32)  * (pElem + 2));
292dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        }
293dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        else   /*  then access only available bytes  */
294dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        {
295dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            /*  Access to the bitstream beyond frame boundaries are not allowed,
296dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber             *  Here, only what was available before the end of the frame will
297dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber             *  be processed. Non-accessible bytes will be filled in with zeros.
298dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber             *  Zero values guarantees that the data structures are filled in with values
299dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber             *  that eventually will signal an error (like invalid parameters) or that allow
300dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber             *  completion of the parsing routine.
301dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber             *  Overrun is detected on file pvmp4audiodecodeframe.cpp
302dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber             */
303dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            returnValue = 0;
304dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            switch (offset)
305dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            {
306dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                case 2:
307dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    returnValue  = (((UInt32) * (pElem + 1)) << 8);
308dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                case 1:
309dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    returnValue |= (((UInt32) * (pElem)) << 16);
310dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                default:
311dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    break;
312dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            }
313dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        }
314dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
315dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#else
316dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
317dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        returnValue = (((UInt32) * (pElem)) << 16) |
318dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                      (((UInt32) * (pElem + 1)) << 8) |
319dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                      ((UInt32)  * (pElem + 2));
320dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#endif
321dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
322dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        /* Remove extra high bits by shifting up */
323dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        bitIndex = (UInt)((pInputStream->usedBits) & INBUF_BIT_MODULO_MASK);
324dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
325dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        /* This line is faster way to mask off the high bits. */
326dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        returnValue = 0xFFFFFF & (returnValue << (bitIndex));
327dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
328dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        /* Move the field down. */
329dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        returnValue = returnValue >> (24 - neededBits);
330dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
331dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        pInputStream->usedBits += neededBits;
332dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
333dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        return (returnValue);
334dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
335dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    }
336dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
337dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#ifdef __cplusplus
338dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber}
339dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#endif
340dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
341dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*----------------------------------------------------------------------------
342dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; END
343dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber----------------------------------------------------------------------------*/
344dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#endif /* GETBITS_H*/
345dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
346dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
347