diff options
author | Jef <jef@targetspot.com> | 2024-09-24 08:54:57 -0400 |
---|---|---|
committer | Jef <jef@targetspot.com> | 2024-09-24 08:54:57 -0400 |
commit | 20d28e80a5c861a9d5f449ea911ab75b4f37ad0d (patch) | |
tree | 12f17f78986871dd2cfb0a56e5e93b545c1ae0d0 /Src/f263/BitReader.cpp | |
parent | 537bcbc86291b32fc04ae4133ce4d7cac8ebe9a7 (diff) | |
download | winamp-20d28e80a5c861a9d5f449ea911ab75b4f37ad0d.tar.gz |
Initial community commit
Diffstat (limited to 'Src/f263/BitReader.cpp')
-rw-r--r-- | Src/f263/BitReader.cpp | 108 |
1 files changed, 108 insertions, 0 deletions
diff --git a/Src/f263/BitReader.cpp b/Src/f263/BitReader.cpp new file mode 100644 index 00000000..e3c369d3 --- /dev/null +++ b/Src/f263/BitReader.cpp @@ -0,0 +1,108 @@ +#include "BitReader.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; +} |