Files
LibCommon/Source/Common/FileIO/CBitStreamInWrapper.cpp
T

68 lines
1.5 KiB
C++
Raw 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*/)
{
2018-12-09 02:38:38 -07:00
uint32 BitsRemaining = NumBits;
uint32 Out = 0;
uint32 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->ReadByte();
2018-12-16 13:52:10 -07:00
else if (mChunkSize == k16Bit)
mBitPool = mpSourceStream->ReadShort();
2018-12-16 13:52:10 -07:00
else if (mChunkSize == k32Bit)
mBitPool = mpSourceStream->ReadLong();
mBitsRemaining = mChunkSize;
}