117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong/* 217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong ** Copyright 2003-2010, VisualOn, Inc. 317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong ** 417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong ** Licensed under the Apache License, Version 2.0 (the "License"); 517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong ** you may not use this file except in compliance with the License. 617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong ** You may obtain a copy of the License at 717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong ** 817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong ** http://www.apache.org/licenses/LICENSE-2.0 917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong ** 1017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong ** Unless required by applicable law or agreed to in writing, software 1117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong ** distributed under the License is distributed on an "AS IS" BASIS, 1217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong ** See the License for the specific language governing permissions and 1417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong ** limitations under the License. 1517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong */ 1617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong/******************************************************************************* 1717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong File: bitbuffer.c 1817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong 1917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong Content: Bit Buffer Management functions 2017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong 2117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong*******************************************************************************/ 2217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong 2317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong#include "bitbuffer.h" 2417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong 2517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong/***************************************************************************** 2617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong* 2717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong* function name: updateBitBufWordPtr 2817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong* description: update Bit Buffer pointer 2917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong* 3017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong*****************************************************************************/ 3117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dongstatic void updateBitBufWordPtr(HANDLE_BIT_BUF hBitBuf, 3217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong UWord8 **pBitBufWord, 3317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong Word16 cnt) 3417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong{ 3517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong *pBitBufWord += cnt; 3617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong 3717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong 3817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong if(*pBitBufWord > hBitBuf->pBitBufEnd) { 3917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong *pBitBufWord -= (hBitBuf->pBitBufEnd - hBitBuf->pBitBufBase + 1); 4017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong } 4117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong 4217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong if(*pBitBufWord < hBitBuf->pBitBufBase) { 4317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong *pBitBufWord += (hBitBuf->pBitBufEnd - hBitBuf->pBitBufBase + 1); 4417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong } 4517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong} 4617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong 4717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong 4817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong/***************************************************************************** 4917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong* 5017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong* function name: CreateBitBuffer 5117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong* description: create and init Bit Buffer Management 5217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong* 5317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong*****************************************************************************/ 5417299ab50ceb70d904e610e3b2d7fb2361a11e03James DongHANDLE_BIT_BUF CreateBitBuffer(HANDLE_BIT_BUF hBitBuf, 5517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong UWord8 *pBitBufBase, 5617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong Word16 bitBufSize) 5717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong{ 5817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong assert(bitBufSize*8 <= 32768); 5917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong 6017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong hBitBuf->pBitBufBase = pBitBufBase; 6117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong hBitBuf->pBitBufEnd = pBitBufBase + bitBufSize - 1; 6217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong 6317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong hBitBuf->pWriteNext = pBitBufBase; 6417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong 6517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong hBitBuf->cache = 0; 6617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong 6717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong hBitBuf->wBitPos = 0; 6817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong hBitBuf->cntBits = 0; 6917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong 7017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong hBitBuf->size = (bitBufSize << 3); 7117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong hBitBuf->isValid = 1; 7217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong 7317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong return hBitBuf; 7417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong} 7517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong 7617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong/***************************************************************************** 7717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong* 7817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong* function name: DeleteBitBuffer 7917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong* description: uninit Bit Buffer Management 8017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong* 8117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong*****************************************************************************/ 8217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dongvoid DeleteBitBuffer(HANDLE_BIT_BUF *hBitBuf) 8317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong{ 8417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong if(*hBitBuf) 8517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong (*hBitBuf)->isValid = 0; 8617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong *hBitBuf = NULL; 8717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong} 8817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong 8917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong/***************************************************************************** 9017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong* 9117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong* function name: ResetBitBuf 9217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong* description: reset Bit Buffer Management 9317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong* 9417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong*****************************************************************************/ 9517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dongvoid ResetBitBuf(HANDLE_BIT_BUF hBitBuf, 9617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong UWord8 *pBitBufBase, 9717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong Word16 bitBufSize) 9817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong{ 9917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong hBitBuf->pBitBufBase = pBitBufBase; 10017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong hBitBuf->pBitBufEnd = pBitBufBase + bitBufSize - 1; 10117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong 10217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong 10317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong hBitBuf->pWriteNext = pBitBufBase; 10417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong 10517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong hBitBuf->wBitPos = 0; 10617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong hBitBuf->cntBits = 0; 10717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong 10817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong hBitBuf->cache = 0; 10917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong} 11017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong 11117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong/***************************************************************************** 11217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong* 11317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong* function name: CopyBitBuf 11417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong* description: copy Bit Buffer Management 11517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong* 11617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong*****************************************************************************/ 11717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dongvoid CopyBitBuf(HANDLE_BIT_BUF hBitBufSrc, 11817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong HANDLE_BIT_BUF hBitBufDst) 11917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong{ 12017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong *hBitBufDst = *hBitBufSrc; 12117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong} 12217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong 12317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong/***************************************************************************** 12417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong* 12517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong* function name: GetBitsAvail 12617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong* description: get available bits 12717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong* 12817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong*****************************************************************************/ 12917299ab50ceb70d904e610e3b2d7fb2361a11e03James DongWord16 GetBitsAvail(HANDLE_BIT_BUF hBitBuf) 13017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong{ 13117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong return hBitBuf->cntBits; 13217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong} 13317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong 13417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong/***************************************************************************** 13517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong* 13617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong* function name: WriteBits 13717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong* description: write bits to the buffer 13817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong* 13917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong*****************************************************************************/ 14017299ab50ceb70d904e610e3b2d7fb2361a11e03James DongWord16 WriteBits(HANDLE_BIT_BUF hBitBuf, 14117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong Word32 writeValue, 14217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong Word16 noBitsToWrite) 14317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong{ 14417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong Word16 wBitPos; 14517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong 14617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong assert(noBitsToWrite <= (Word16)sizeof(Word32)*8); 14717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong 14817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong if(noBitsToWrite == 0) 14917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong return noBitsToWrite; 15017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong 15117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong hBitBuf->cntBits += noBitsToWrite; 15217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong 15317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong wBitPos = hBitBuf->wBitPos; 15417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong wBitPos += noBitsToWrite; 15517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong writeValue <<= 32 - wBitPos; 15617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong writeValue |= hBitBuf->cache; 15717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong 15817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong while (wBitPos >= 8) 15917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong { 16017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong UWord8 tmp; 16117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong tmp = (UWord8)((writeValue >> 24) & 0xFF); 16217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong 16317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong *hBitBuf->pWriteNext++ = tmp; 16417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong writeValue <<= 8; 16517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong wBitPos -= 8; 16617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong } 16717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong 16817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong hBitBuf->wBitPos = wBitPos; 16917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong hBitBuf->cache = writeValue; 17017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong 17117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong return noBitsToWrite; 17217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong} 173