Home | History | Annotate | Download | only in src
      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: CreateBitBuffer
     28 * description:  create and init Bit Buffer Management
     29 *
     30 *****************************************************************************/
     31 HANDLE_BIT_BUF CreateBitBuffer(HANDLE_BIT_BUF hBitBuf,
     32                                UWord8 *pBitBufBase,
     33                                Word16  bitBufSize)
     34 {
     35   assert(bitBufSize*8 <= 32768);
     36 
     37   hBitBuf->pBitBufBase = pBitBufBase;
     38   hBitBuf->pBitBufEnd  = pBitBufBase + bitBufSize - 1;
     39 
     40   hBitBuf->pWriteNext  = pBitBufBase;
     41 
     42   hBitBuf->cache       = 0;
     43 
     44   hBitBuf->wBitPos     = 0;
     45   hBitBuf->cntBits     = 0;
     46 
     47   hBitBuf->size        = (bitBufSize << 3);
     48   hBitBuf->isValid     = 1;
     49 
     50   return hBitBuf;
     51 }
     52 
     53 /*****************************************************************************
     54 *
     55 * function name: DeleteBitBuffer
     56 * description:  uninit Bit Buffer Management
     57 *
     58 *****************************************************************************/
     59 void DeleteBitBuffer(HANDLE_BIT_BUF *hBitBuf)
     60 {
     61   if(*hBitBuf)
     62 	(*hBitBuf)->isValid = 0;
     63   *hBitBuf = NULL;
     64 }
     65 
     66 /*****************************************************************************
     67 *
     68 * function name: ResetBitBuf
     69 * description:  reset Bit Buffer Management
     70 *
     71 *****************************************************************************/
     72 void ResetBitBuf(HANDLE_BIT_BUF hBitBuf,
     73                  UWord8 *pBitBufBase,
     74                  Word16  bitBufSize)
     75 {
     76   hBitBuf->pBitBufBase = pBitBufBase;
     77   hBitBuf->pBitBufEnd  = pBitBufBase + bitBufSize - 1;
     78 
     79 
     80   hBitBuf->pWriteNext  = pBitBufBase;
     81 
     82   hBitBuf->wBitPos     = 0;
     83   hBitBuf->cntBits     = 0;
     84 
     85   hBitBuf->cache	   = 0;
     86 }
     87 
     88 /*****************************************************************************
     89 *
     90 * function name: CopyBitBuf
     91 * description:  copy Bit Buffer Management
     92 *
     93 *****************************************************************************/
     94 void CopyBitBuf(HANDLE_BIT_BUF hBitBufSrc,
     95                 HANDLE_BIT_BUF hBitBufDst)
     96 {
     97   *hBitBufDst = *hBitBufSrc;
     98 }
     99 
    100 /*****************************************************************************
    101 *
    102 * function name: GetBitsAvail
    103 * description:  get available bits
    104 *
    105 *****************************************************************************/
    106 Word16 GetBitsAvail(HANDLE_BIT_BUF hBitBuf)
    107 {
    108   return hBitBuf->cntBits;
    109 }
    110 
    111 /*****************************************************************************
    112 *
    113 * function name: WriteBits
    114 * description:  write bits to the buffer
    115 *
    116 *****************************************************************************/
    117 Word16 WriteBits(HANDLE_BIT_BUF hBitBuf,
    118                  UWord32 writeValue,
    119                  Word16 noBitsToWrite)
    120 {
    121   Word16 wBitPos;
    122 
    123   assert(noBitsToWrite <= (Word16)sizeof(Word32)*8);
    124 
    125   if(noBitsToWrite == 0)
    126 	  return noBitsToWrite;
    127 
    128   hBitBuf->cntBits += noBitsToWrite;
    129 
    130   wBitPos = hBitBuf->wBitPos;
    131   wBitPos += noBitsToWrite;
    132   writeValue &= ~(0xffffffff << noBitsToWrite); // Mask out everything except the lowest noBitsToWrite bits
    133   writeValue <<= 32 - wBitPos;
    134   writeValue |= hBitBuf->cache;
    135 
    136   while (wBitPos >= 8)
    137   {
    138 	  UWord8 tmp;
    139 	  tmp = (UWord8)((writeValue >> 24) & 0xFF);
    140 
    141 	  *hBitBuf->pWriteNext++ = tmp;
    142 	  writeValue <<= 8;
    143 	  wBitPos -= 8;
    144   }
    145 
    146   hBitBuf->wBitPos = wBitPos;
    147   hBitBuf->cache = writeValue;
    148 
    149   return noBitsToWrite;
    150 }
    151