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