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 *****************************************************************************/
updateBitBufWordPtr(HANDLE_BIT_BUF hBitBuf,UWord8 ** pBitBufWord,Word16 cnt)31 static 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 *****************************************************************************/
CreateBitBuffer(HANDLE_BIT_BUF hBitBuf,UWord8 * pBitBufBase,Word16 bitBufSize)54 HANDLE_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 *****************************************************************************/
DeleteBitBuffer(HANDLE_BIT_BUF * hBitBuf)82 void 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 *****************************************************************************/
ResetBitBuf(HANDLE_BIT_BUF hBitBuf,UWord8 * pBitBufBase,Word16 bitBufSize)95 void 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 *****************************************************************************/
CopyBitBuf(HANDLE_BIT_BUF hBitBufSrc,HANDLE_BIT_BUF hBitBufDst)117 void 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 *****************************************************************************/
GetBitsAvail(HANDLE_BIT_BUF hBitBuf)129 Word16 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 *****************************************************************************/
WriteBits(HANDLE_BIT_BUF hBitBuf,UWord32 writeValue,Word16 noBitsToWrite)140 Word16 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