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