1/****************************************************************************** 2 * 3 * Copyright (C) 2014 The Android Open Source Project 4 * Copyright 2003 - 2004 Open Interface North America, Inc. All rights reserved. 5 * 6 * Licensed under the Apache License, Version 2.0 (the "License"); 7 * you may not use this file except in compliance with the License. 8 * You may obtain a copy of the License at: 9 * 10 * http://www.apache.org/licenses/LICENSE-2.0 11 * 12 * Unless required by applicable law or agreed to in writing, software 13 * distributed under the License is distributed on an "AS IS" BASIS, 14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 15 * See the License for the specific language governing permissions and 16 * limitations under the License. 17 * 18 ******************************************************************************/ 19 20/********************************************************************************** 21 $Revision: #1 $ 22***********************************************************************************/ 23 24/** 25@file 26Functions for manipulating input bitstreams. 27 28@ingroup codec_internal 29*/ 30 31/** 32@addtogroup codec_internal 33@{ 34*/ 35 36#include "oi_stddefs.h" 37#include "oi_bitstream.h" 38#include "oi_assert.h" 39 40PRIVATE void OI_BITSTREAM_ReadInit(OI_BITSTREAM *bs, 41 const OI_BYTE *buffer) 42{ 43 bs->value = ((OI_INT32)buffer[0] << 16) | ((OI_INT32)buffer[1] << 8) | (buffer[2]); 44 bs->ptr.r = buffer + 3; 45 bs->bitPtr = 8; 46} 47 48PRIVATE OI_UINT32 OI_BITSTREAM_ReadUINT(OI_BITSTREAM *bs, OI_UINT bits) 49{ 50 OI_UINT32 result; 51 52 OI_BITSTREAM_READUINT(result, bits, bs->ptr.r, bs->value, bs->bitPtr); 53 54 return result; 55} 56 57PRIVATE OI_UINT8 OI_BITSTREAM_ReadUINT4Aligned(OI_BITSTREAM *bs) 58{ 59 OI_UINT32 result; 60 61 OI_ASSERT(bs->bitPtr < 16); 62 OI_ASSERT(bs->bitPtr % 4 == 0); 63 64 if (bs->bitPtr == 8) { 65 result = bs->value << 8; 66 bs->bitPtr = 12; 67 } else { 68 result = bs->value << 12; 69 bs->value = (bs->value << 8) | *bs->ptr.r++; 70 bs->bitPtr = 8; 71 } 72 result >>= 28; 73 OI_ASSERT(result < (1u << 4)); 74 return (OI_UINT8)result; 75} 76 77PRIVATE OI_UINT8 OI_BITSTREAM_ReadUINT8Aligned(OI_BITSTREAM *bs) 78{ 79 OI_UINT32 result; 80 OI_ASSERT(bs->bitPtr == 8); 81 82 result = bs->value >> 16; 83 bs->value = (bs->value << 8) | *bs->ptr.r++; 84 85 return (OI_UINT8)result; 86} 87 88/** 89@} 90*/ 91 92 93