Files

68 lines
1.5 KiB
C++
Raw Permalink Normal View History

#include "CBitStreamInWrapper.h"
2025-12-17 13:44:30 -05:00
#include "IInputStream.h"
CBitStreamInWrapper::CBitStreamInWrapper(IInputStream *pStream, EChunkSize ChunkSize /*= e32Bit*/)
: mpSourceStream(pStream)
, mChunkSize(ChunkSize)
{
}
void CBitStreamInWrapper::SetChunkSize(EChunkSize Size)
{
mChunkSize = Size;
}
2025-12-17 13:44:30 -05:00
long CBitStreamInWrapper::ReadBits(uint32_t NumBits, bool ExtendSignBit /*= true*/)
{
uint32_t BitsRemaining = NumBits;
uint32_t Out = 0;
uint32_t Shift = 0;
while (BitsRemaining > 0)
{
if (mBitsRemaining < BitsRemaining)
{
BitsRemaining -= mBitsRemaining;
Out |= (mBitPool << Shift);
Shift += mBitsRemaining;
ReplenishPool();
}
else
{
long Mask = (1 << BitsRemaining) - 1;
Out |= (mBitPool & Mask) << Shift;
mBitPool >>= BitsRemaining;
mBitsRemaining -= BitsRemaining;
BitsRemaining = 0;
}
}
if (ExtendSignBit)
{
bool Sign = ((Out >> (NumBits - 1) & 0x1) == 1);
if (Sign) Out |= (-1 << NumBits);
}
return Out;
}
bool CBitStreamInWrapper::ReadBit()
{
return (ReadBits(1, false) != 0);
}
// ************ PRIVATE ************
void CBitStreamInWrapper::ReplenishPool()
{
2018-12-16 13:52:10 -07:00
if (mChunkSize == k8Bit)
mBitPool = mpSourceStream->ReadU8();
2018-12-16 13:52:10 -07:00
else if (mChunkSize == k16Bit)
mBitPool = mpSourceStream->ReadU16();
2018-12-16 13:52:10 -07:00
else if (mChunkSize == k32Bit)
mBitPool = mpSourceStream->ReadU32();
mBitsRemaining = mChunkSize;
}