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