bitbuffer.c revision 5e9afe434d8207fb0af6e191cca671ab74cfe878
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*****************************************************************************/
31static 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*****************************************************************************/
54HANDLE_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*****************************************************************************/
82void 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*****************************************************************************/
95void 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*****************************************************************************/
117void 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*****************************************************************************/
129Word16 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*****************************************************************************/
140Word16 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 <<= 32 - wBitPos;
156  writeValue |= hBitBuf->cache;
157
158  while (wBitPos >= 8)
159  {
160	  UWord8 tmp;
161	  tmp = (UWord8)((writeValue >> 24) & 0xFF);
162
163	  *hBitBuf->pWriteNext++ = tmp;
164	  writeValue <<= 8;
165	  wBitPos -= 8;
166  }
167
168  hBitBuf->wBitPos = wBitPos;
169  hBitBuf->cache = writeValue;
170
171  return noBitsToWrite;
172}
173