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