123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109 |
- #include "BitReader.h"
- #include <string.h>
- static uint32_t mask[8]=
- {
- 0x1,
- 0x3,
- 0x7,
- 0xF,
- 0x1F,
- 0x3F,
- 0x7F,
- 0xFF
- };
- static uint32_t msk[33] =
- {
- 0x00000000,0x00000001,0x00000003,0x00000007,
- 0x0000000f,0x0000001f,0x0000003f,0x0000007f,
- 0x000000ff,0x000001ff,0x000003ff,0x000007ff,
- 0x00000fff,0x00001fff,0x00003fff,0x00007fff,
- 0x0000ffff,0x0001ffff,0x0003ffff,0x0007ffff,
- 0x000fffff,0x001fffff,0x003fffff,0x007fffff,
- 0x00ffffff,0x01ffffff,0x03ffffff,0x07ffffff,
- 0x0fffffff,0x1fffffff,0x3fffffff,0x7fffffff,
- 0xffffffff
- };
- void BitReader::alignbyte()
- {
- flushbits(numBits&7);
- }
- void BitReader::getbytes(void *data, uint32_t n)
- {
- memcpy(data, this->data, n);
- flushbits(n*8);
- }
- uint8_t BitReader::getbits1()
- {
- uint8_t byte = data[0];
- uint32_t count = (numBits-1) & 7;
- byte &= mask[count];
- byte >>= count;
- numBits--;
- if ((numBits % 8) == 0)
- data++;
- return byte;
- }
- uint32_t BitReader::getbits(uint32_t n)
- {
- uint32_t val = showbits(n);
- flushbits(n);
- return val;
- }
- uint8_t BitReader::showbits1() const
- {
- uint8_t byte = data[0];
- uint32_t count = (numBits-1) & 7;
- byte &= mask[count];
- byte >>= count;
- return byte;
- }
- uint32_t BitReader::showbits(uint32_t n) const
- {
- uint32_t val;
- switch((numBits+7) >> 3)
- {
- case 0:
- return 0;
- case 1:
- val=(data[0]<<24);
- break;
- case 2:
- val=(data[0]<<24) | (data[1]<<16);
- break;
- case 3:
- val=(data[0]<<24) | (data[1]<<16) | (data[2]<<8);
- break;
- default:
- val=(data[0]<<24) | (data[1]<<16) | (data[2]<<8) | data[3];
- break;
- }
- uint32_t c = ((numBits-1) & 7) + 25;
- return (val>>(c-n)) & msk[n];
- }
- void BitReader::flushbits(uint32_t n)
- {
- uint32_t oldpos = (numBits+7)>>3;
- numBits-=n;
- uint32_t newpos = (numBits+7)>>3;
- data += (oldpos - newpos);
- }
- bool BitReader::empty()
- {
- return numBits==0;
- }
- uint32_t BitReader::size() const
- {
- return numBits;
- }
|