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