41 #define MIN(a, b) (((a) < (b)) ? (a) : (b))
48 Buffer_Size=Buffer_Size_Init=Buffer_Size_BeforeLastCall=0;
52 BitStream (
const int8u* Buffer_,
size_t Size_) {Buffer=Buffer_;
53 Buffer_Size=Buffer_Size_Init=Buffer_Size_BeforeLastCall=Size_*8;
55 BufferUnderRun=Buffer_Size?
false:
true;
59 virtual void Attach(
const int8u* Buffer_,
size_t Size_)
64 Buffer_Size=Buffer_Size_Init=Buffer_Size_BeforeLastCall=Size_*8;
66 BufferUnderRun=Buffer_Size?
false:
true;
70 virtual int32u
Get (
size_t HowMany)
73 static const int32u Mask[33]={
75 0x00000001, 0x00000003, 0x00000007, 0x0000000f,
76 0x0000001f, 0x0000003f, 0x0000007f, 0x000000ff,
77 0x000001ff, 0x000003ff, 0x000007ff, 0x00000fff,
78 0x00001fff, 0x00003fff, 0x00007fff, 0x0000ffff,
79 0x0001ffff, 0x0003ffff, 0x0007ffff, 0x000fffff,
80 0x001fffff, 0x003fffff, 0x007fffff, 0x00ffffff,
81 0x01ffffff, 0x03ffffff, 0x07ffffff, 0x0fffffff,
82 0x1fffffff, 0x3fffffff, 0x7fffffff, 0xffffffff,
85 if (HowMany==0 || HowMany>32)
87 if ((
size_t)HowMany>Buffer_Size+LastByte_Size)
95 Buffer_Size_BeforeLastCall=Buffer_Size+LastByte_Size;
97 if (HowMany<=LastByte_Size)
99 LastByte_Size-=HowMany;
100 ToReturn=LastByte>>LastByte_Size;
104 size_t NewBits=HowMany-LastByte_Size;
108 ToReturn=LastByte<<NewBits;
109 switch ((NewBits-1)/8)
112 ToReturn|=*Buffer<<NewBits;
116 ToReturn|=*Buffer<<NewBits;
120 ToReturn|=*Buffer<<NewBits;
127 LastByte_Size=
MIN(8, Buffer_Size)-NewBits;
128 Buffer_Size -=
MIN(8, Buffer_Size);
129 ToReturn|=(LastByte>>LastByte_Size)&Mask[NewBits];
131 return (int32u)(ToReturn&Mask[HowMany]);
136 return Get(1)?
true:
false;
141 return (int8u )
Get(HowMany);
146 return (int16u)
Get(HowMany);
151 return (int32u)
Get(HowMany);
158 size_t HowMany1, HowMany2;
159 int64u Value1, Value2;
164 HowMany2=HowMany-HowMany1;
165 Value1=
Get(HowMany1);
166 Value2=
Get(HowMany2);
169 return Value1*0x100000000LL+Value2;
172 virtual void Skip (
size_t HowMany)
188 if ((
size_t)HowMany>Buffer_Size+LastByte_Size)
196 Buffer_Size_BeforeLastCall=Buffer_Size+LastByte_Size;
198 if (HowMany<=LastByte_Size)
199 LastByte_Size-=HowMany;
202 size_t NewBits=HowMany-LastByte_Size;
203 switch ((NewBits-1)/8)
218 LastByte_Size=
MIN(8, Buffer_Size)-NewBits;
219 Buffer_Size -=
MIN(8, Buffer_Size);
247 size_t HowMany1, HowMany2;
252 HowMany2=HowMany-HowMany1;
260 int32u ToReturn=
Get(HowMany);
267 return Peek(1)?
true:
false;
272 return (int8u )
Peek(HowMany);
277 return (int16u)
Peek(HowMany);
282 return (int32u)
Peek(HowMany);
287 return (int32u)
Peek(HowMany);
292 return (int64u)
Peek(HowMany);
300 Buffer_BookMark=Buffer;
301 Buffer_Size_BookMark=Buffer_Size;
302 LastByte_BookMark=LastByte;
303 LastByte_Size_BookMark=LastByte_Size;
304 BufferUnderRun_BookMark=BufferUnderRun;
309 Buffer=Buffer_BookMark;
310 Buffer_Size=Buffer_Size_BookMark;
311 LastByte=LastByte_BookMark;
312 LastByte_Size=LastByte_Size_BookMark;
313 BufferUnderRun=BufferUnderRun_BookMark;
319 return (int32u)(Buffer_Size+LastByte_Size);
331 return (Buffer_Size_Init-Buffer_Size)/8;
338 return LastByte_Size;
345 return (Buffer_Size_Init-Buffer_Size_BeforeLastCall)/8;
351 size_t Buffer_Size_Init;
352 size_t Buffer_Size_BeforeLastCall;
354 size_t LastByte_Size;
358 const int8u* Buffer_BookMark;
359 size_t Buffer_Size_BookMark;
360 size_t LastByte_BookMark;
361 size_t LastByte_Size_BookMark;
362 bool BufferUnderRun_BookMark;