home *** CD-ROM | disk | FTP | other *** search
- /* bit_res.cpp
-
- Implementation of Bit Reservoir for Layer III
-
- Adapted from the public c code by Jeff Tsay. */
-
-
- #ifdef __WIN32__
- #define STRICT
- #include <windows.h>
- #endif // __WIN32__
-
- #include "all.h"
- #include "bit_res.h"
-
- Bit_Reserve::Bit_Reserve()
- {
- uint32 shifted_one = 1;
-
- offset = 0;
- totbit = 0;
- buf_byte_idx = 0;
- buf = new uint32[BUFSIZE];
- buf_bit_idx = 8;
- putmask = new uint32[32];
-
- putmask[0] = 0;
-
- for (int32 i=1; i<32; i++)
- {
- putmask[i] = putmask[i-1] + shifted_one;
- shifted_one <<= 1;
- }
- }
-
- Bit_Reserve::~Bit_Reserve ()
- {
- delete [] putmask;
- delete [] buf;
- }
-
- uint32 Bit_Reserve::hgetbits(uint32 N)
- // read N bits from the bit stream
- {
- totbit += N;
-
- uint32 val = 0;
- int32 j = N;
-
- while (j > 0) {
-
- if (buf_bit_idx == 0) {
- buf_bit_idx = 8;
- buf_byte_idx++;
- /* if (buf_byte_idx > offset)
- { printf("Buffer overflow !!\n");exit(3); } */
- }
-
- int32 k = (j < buf_bit_idx) ? j : buf_bit_idx;
-
- // BUFSIZE = 4096 = 2^12, so
- // buf_byte_idx%BUFSIZE == buf_byte_idx & 0xfff
- int32 tmp = buf[buf_byte_idx & 0xfff] & putmask[buf_bit_idx];
- buf_bit_idx -= k;
- tmp = tmp >> buf_bit_idx;
- j -=k;
- val |= tmp << j;
- }
- return(val);
- }
-
-
- void Bit_Reserve::hputbuf(int32 val)
- // write 8 bits into the bit stream
- {
- buf[offset & 0xfff] = val;
- offset++;
- }
-
- void Bit_Reserve::rewindNbits(int32 N)
- {
- totbit -= N;
- buf_bit_idx += N;
- while(buf_bit_idx >= 8)
- { buf_bit_idx -= 8;
- buf_byte_idx--;
- }
- }
-
- void Bit_Reserve::rewindNbytes(int32 N)
- {
- totbit -= (N << 3);
- buf_byte_idx -= N;
- }
-