1*df25739fSMilanka Ringwald /****************************************************************************** 2*df25739fSMilanka Ringwald * 3*df25739fSMilanka Ringwald * Copyright (C) 2014 The Android Open Source Project 4*df25739fSMilanka Ringwald * Copyright 2003 - 2004 Open Interface North America, Inc. All rights reserved. 5*df25739fSMilanka Ringwald * 6*df25739fSMilanka Ringwald * Licensed under the Apache License, Version 2.0 (the "License"); 7*df25739fSMilanka Ringwald * you may not use this file except in compliance with the License. 8*df25739fSMilanka Ringwald * You may obtain a copy of the License at: 9*df25739fSMilanka Ringwald * 10*df25739fSMilanka Ringwald * http://www.apache.org/licenses/LICENSE-2.0 11*df25739fSMilanka Ringwald * 12*df25739fSMilanka Ringwald * Unless required by applicable law or agreed to in writing, software 13*df25739fSMilanka Ringwald * distributed under the License is distributed on an "AS IS" BASIS, 14*df25739fSMilanka Ringwald * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 15*df25739fSMilanka Ringwald * See the License for the specific language governing permissions and 16*df25739fSMilanka Ringwald * limitations under the License. 17*df25739fSMilanka Ringwald * 18*df25739fSMilanka Ringwald ******************************************************************************/ 19*df25739fSMilanka Ringwald #ifndef _OI_BITSTREAM_H 20*df25739fSMilanka Ringwald #define _OI_BITSTREAM_H 21*df25739fSMilanka Ringwald 22*df25739fSMilanka Ringwald /********************************************************************************** 23*df25739fSMilanka Ringwald $Revision: #1 $ 24*df25739fSMilanka Ringwald ***********************************************************************************/ 25*df25739fSMilanka Ringwald 26*df25739fSMilanka Ringwald 27*df25739fSMilanka Ringwald /** 28*df25739fSMilanka Ringwald @file 29*df25739fSMilanka Ringwald Function prototypes and macro definitions for manipulating input and output 30*df25739fSMilanka Ringwald bitstreams. 31*df25739fSMilanka Ringwald 32*df25739fSMilanka Ringwald @ingroup codec_internal 33*df25739fSMilanka Ringwald */ 34*df25739fSMilanka Ringwald 35*df25739fSMilanka Ringwald /** 36*df25739fSMilanka Ringwald @addtogroup codec_internal 37*df25739fSMilanka Ringwald @{ 38*df25739fSMilanka Ringwald */ 39*df25739fSMilanka Ringwald 40*df25739fSMilanka Ringwald #include "oi_codec_sbc_private.h" 41*df25739fSMilanka Ringwald #include "oi_stddefs.h" 42*df25739fSMilanka Ringwald 43*df25739fSMilanka Ringwald INLINE void OI_BITSTREAM_ReadInit(OI_BITSTREAM *bs, const OI_BYTE *buffer); 44*df25739fSMilanka Ringwald 45*df25739fSMilanka Ringwald INLINE void OI_BITSTREAM_WriteInit(OI_BITSTREAM *bs, OI_BYTE *buffer); 46*df25739fSMilanka Ringwald 47*df25739fSMilanka Ringwald INLINE OI_UINT32 OI_BITSTREAM_ReadUINT(OI_BITSTREAM *bs, OI_UINT bits); 48*df25739fSMilanka Ringwald 49*df25739fSMilanka Ringwald INLINE OI_UINT8 OI_BITSTREAM_ReadUINT4Aligned(OI_BITSTREAM *bs); 50*df25739fSMilanka Ringwald 51*df25739fSMilanka Ringwald INLINE OI_UINT8 OI_BITSTREAM_ReadUINT8Aligned(OI_BITSTREAM *bs); 52*df25739fSMilanka Ringwald 53*df25739fSMilanka Ringwald INLINE void OI_BITSTREAM_WriteUINT(OI_BITSTREAM *bs, 54*df25739fSMilanka Ringwald OI_UINT16 value, 55*df25739fSMilanka Ringwald OI_UINT bits); 56*df25739fSMilanka Ringwald 57*df25739fSMilanka Ringwald /* 58*df25739fSMilanka Ringwald * Use knowledge that the bitstream is aligned to optimize the write of a byte 59*df25739fSMilanka Ringwald */ 60*df25739fSMilanka Ringwald PRIVATE void OI_BITSTREAM_WriteUINT8Aligned(OI_BITSTREAM *bs, 61*df25739fSMilanka Ringwald OI_UINT8 datum); 62*df25739fSMilanka Ringwald 63*df25739fSMilanka Ringwald /* 64*df25739fSMilanka Ringwald * Use knowledge that the bitstream is aligned to optimize the write pair of nibbles 65*df25739fSMilanka Ringwald */ 66*df25739fSMilanka Ringwald PRIVATE void OI_BITSTREAM_Write2xUINT4Aligned(OI_BITSTREAM *bs, 67*df25739fSMilanka Ringwald OI_UINT8 datum1, 68*df25739fSMilanka Ringwald OI_UINT8 datum2); 69*df25739fSMilanka Ringwald 70*df25739fSMilanka Ringwald /** Internally the bitstream looks ahead in the stream. When 71*df25739fSMilanka Ringwald * OI_SBC_ReadScalefactors() goes to temporarily break the abstraction, it will 72*df25739fSMilanka Ringwald * need to know where the "logical" pointer is in the stream. 73*df25739fSMilanka Ringwald */ 74*df25739fSMilanka Ringwald #define OI_BITSTREAM_GetWritePtr(bs) ((bs)->ptr.w - 3) 75*df25739fSMilanka Ringwald #define OI_BITSTREAM_GetReadPtr(bs) ((bs)->ptr.r - 3) 76*df25739fSMilanka Ringwald 77*df25739fSMilanka Ringwald /** This is declared here as a macro because decoder.c breaks the bitsream 78*df25739fSMilanka Ringwald * encapsulation for efficiency reasons. 79*df25739fSMilanka Ringwald */ 80*df25739fSMilanka Ringwald #define OI_BITSTREAM_READUINT(result, bits, ptr, value, bitPtr) \ 81*df25739fSMilanka Ringwald do { \ 82*df25739fSMilanka Ringwald OI_ASSERT((bits) <= 16); \ 83*df25739fSMilanka Ringwald OI_ASSERT((bitPtr) < 16); \ 84*df25739fSMilanka Ringwald OI_ASSERT((bitPtr) >= 8); \ 85*df25739fSMilanka Ringwald \ 86*df25739fSMilanka Ringwald result = (value) << (bitPtr); \ 87*df25739fSMilanka Ringwald result >>= 32 - (bits); \ 88*df25739fSMilanka Ringwald \ 89*df25739fSMilanka Ringwald bitPtr += (bits); \ 90*df25739fSMilanka Ringwald while (bitPtr >= 16) { \ 91*df25739fSMilanka Ringwald value = (((value) << 8) | *ptr++) & 0xffffffff; \ 92*df25739fSMilanka Ringwald bitPtr -= 8; \ 93*df25739fSMilanka Ringwald } \ 94*df25739fSMilanka Ringwald OI_ASSERT((bits == 0) || (result < (1u << (bits)))); \ 95*df25739fSMilanka Ringwald } while (0) 96*df25739fSMilanka Ringwald 97*df25739fSMilanka Ringwald 98*df25739fSMilanka Ringwald #define OI_BITSTREAM_WRITEUINT(ptr, value, bitPtr, datum, bits) \ 99*df25739fSMilanka Ringwald do {\ 100*df25739fSMilanka Ringwald bitPtr -= bits;\ 101*df25739fSMilanka Ringwald value |= datum << bitPtr;\ 102*df25739fSMilanka Ringwald \ 103*df25739fSMilanka Ringwald while (bitPtr <= 16) {\ 104*df25739fSMilanka Ringwald bitPtr += 8;\ 105*df25739fSMilanka Ringwald *ptr++ = (OI_UINT8)(value >> 24);\ 106*df25739fSMilanka Ringwald value <<= 8;\ 107*df25739fSMilanka Ringwald }\ 108*df25739fSMilanka Ringwald } while (0) 109*df25739fSMilanka Ringwald 110*df25739fSMilanka Ringwald #define OI_BITSTREAM_WRITEFLUSH(ptr, value, bitPtr) \ 111*df25739fSMilanka Ringwald do {\ 112*df25739fSMilanka Ringwald while (bitPtr < 32) {\ 113*df25739fSMilanka Ringwald bitPtr += 8;\ 114*df25739fSMilanka Ringwald *ptr++ = (OI_UINT8)(value >> 24);\ 115*df25739fSMilanka Ringwald value <<= 8;\ 116*df25739fSMilanka Ringwald }\ 117*df25739fSMilanka Ringwald } while (0) 118*df25739fSMilanka Ringwald 119*df25739fSMilanka Ringwald /** 120*df25739fSMilanka Ringwald @} 121*df25739fSMilanka Ringwald */ 122*df25739fSMilanka Ringwald 123*df25739fSMilanka Ringwald #endif /* _OI_BITSTREAM_H */ 124