1/* 2 ** Copyright 2003-2010, VisualOn, Inc. 3 ** 4 ** Licensed under the Apache License, Version 2.0 (the "License"); 5 ** you may not use this file except in compliance with the License. 6 ** You may obtain a copy of the License at 7 ** 8 ** http://www.apache.org/licenses/LICENSE-2.0 9 ** 10 ** Unless required by applicable law or agreed to in writing, software 11 ** distributed under the License is distributed on an "AS IS" BASIS, 12 ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 ** See the License for the specific language governing permissions and 14 ** limitations under the License. 15 */ 16/******************************************************************************* 17 File: bitbuffer.c 18 19 Content: Bit Buffer Management functions 20 21*******************************************************************************/ 22 23#include "bitbuffer.h" 24 25/***************************************************************************** 26* 27* function name: updateBitBufWordPtr 28* description: update Bit Buffer pointer 29* 30*****************************************************************************/ 31static void updateBitBufWordPtr(HANDLE_BIT_BUF hBitBuf, 32 UWord8 **pBitBufWord, 33 Word16 cnt) 34{ 35 *pBitBufWord += cnt; 36 37 38 if(*pBitBufWord > hBitBuf->pBitBufEnd) { 39 *pBitBufWord -= (hBitBuf->pBitBufEnd - hBitBuf->pBitBufBase + 1); 40 } 41 42 if(*pBitBufWord < hBitBuf->pBitBufBase) { 43 *pBitBufWord += (hBitBuf->pBitBufEnd - hBitBuf->pBitBufBase + 1); 44 } 45} 46 47 48/***************************************************************************** 49* 50* function name: CreateBitBuffer 51* description: create and init Bit Buffer Management 52* 53*****************************************************************************/ 54HANDLE_BIT_BUF CreateBitBuffer(HANDLE_BIT_BUF hBitBuf, 55 UWord8 *pBitBufBase, 56 Word16 bitBufSize) 57{ 58 assert(bitBufSize*8 <= 32768); 59 60 hBitBuf->pBitBufBase = pBitBufBase; 61 hBitBuf->pBitBufEnd = pBitBufBase + bitBufSize - 1; 62 63 hBitBuf->pWriteNext = pBitBufBase; 64 65 hBitBuf->cache = 0; 66 67 hBitBuf->wBitPos = 0; 68 hBitBuf->cntBits = 0; 69 70 hBitBuf->size = (bitBufSize << 3); 71 hBitBuf->isValid = 1; 72 73 return hBitBuf; 74} 75 76/***************************************************************************** 77* 78* function name: DeleteBitBuffer 79* description: uninit Bit Buffer Management 80* 81*****************************************************************************/ 82void DeleteBitBuffer(HANDLE_BIT_BUF *hBitBuf) 83{ 84 if(*hBitBuf) 85 (*hBitBuf)->isValid = 0; 86 *hBitBuf = NULL; 87} 88 89/***************************************************************************** 90* 91* function name: ResetBitBuf 92* description: reset Bit Buffer Management 93* 94*****************************************************************************/ 95void ResetBitBuf(HANDLE_BIT_BUF hBitBuf, 96 UWord8 *pBitBufBase, 97 Word16 bitBufSize) 98{ 99 hBitBuf->pBitBufBase = pBitBufBase; 100 hBitBuf->pBitBufEnd = pBitBufBase + bitBufSize - 1; 101 102 103 hBitBuf->pWriteNext = pBitBufBase; 104 105 hBitBuf->wBitPos = 0; 106 hBitBuf->cntBits = 0; 107 108 hBitBuf->cache = 0; 109} 110 111/***************************************************************************** 112* 113* function name: CopyBitBuf 114* description: copy Bit Buffer Management 115* 116*****************************************************************************/ 117void CopyBitBuf(HANDLE_BIT_BUF hBitBufSrc, 118 HANDLE_BIT_BUF hBitBufDst) 119{ 120 *hBitBufDst = *hBitBufSrc; 121} 122 123/***************************************************************************** 124* 125* function name: GetBitsAvail 126* description: get available bits 127* 128*****************************************************************************/ 129Word16 GetBitsAvail(HANDLE_BIT_BUF hBitBuf) 130{ 131 return hBitBuf->cntBits; 132} 133 134/***************************************************************************** 135* 136* function name: WriteBits 137* description: write bits to the buffer 138* 139*****************************************************************************/ 140Word16 WriteBits(HANDLE_BIT_BUF hBitBuf, 141 UWord32 writeValue, 142 Word16 noBitsToWrite) 143{ 144 Word16 wBitPos; 145 146 assert(noBitsToWrite <= (Word16)sizeof(Word32)*8); 147 148 if(noBitsToWrite == 0) 149 return noBitsToWrite; 150 151 hBitBuf->cntBits += noBitsToWrite; 152 153 wBitPos = hBitBuf->wBitPos; 154 wBitPos += noBitsToWrite; 155 writeValue &= ~(0xffffffff << noBitsToWrite); // Mask out everything except the lowest noBitsToWrite bits 156 writeValue <<= 32 - wBitPos; 157 writeValue |= hBitBuf->cache; 158 159 while (wBitPos >= 8) 160 { 161 UWord8 tmp; 162 tmp = (UWord8)((writeValue >> 24) & 0xFF); 163 164 *hBitBuf->pWriteNext++ = tmp; 165 writeValue <<= 8; 166 wBitPos -= 8; 167 } 168 169 hBitBuf->wBitPos = wBitPos; 170 hBitBuf->cache = writeValue; 171 172 return noBitsToWrite; 173} 174