dbitstream.cpp

来自「这是G.723和G.729的音频编解码的源代码」· C++ 代码 · 共 120 行

CPP
120
字号

#include "stdafx.h"
#include "Dbitstream.h"
#include "commonvar.h"

DBitStream::DBitStream(BYTE *CompressData)
{	
	BitPosition=7;
	BYTEPosition=0;
	InputBuffer=CompressData;
	CurrentReadByte=InputBuffer[BYTEPosition++];
}

_inline int DBitStream::ReadOneBit(void)
{	int Value;
	Value=CurrentReadByte&bit_set_mask[BitPosition--];
	if (BitPosition<0)
		{CurrentReadByte=InputBuffer[BYTEPosition++];
		 BitPosition=7;
		}
	if (Value)
		return 1;
	else return 0;
}

int DBitStream::ReadVarible(int BitCount)
{
	register int Value,BitLeft;
	int OldBitPosition,OldReadByte,OldBytePosition;
	register BYTE AndByte;

	OldBitPosition=BitPosition;
	OldReadByte=CurrentReadByte;
	OldBytePosition=BYTEPosition;

	if (BitCount<=BitPosition)
		{AndByte=(BYTE)(msk[BitCount]<<(BitPosition-BitCount+1));
		 Value=(CurrentReadByte&AndByte)>>(BitPosition-BitCount+1);
		 BitPosition-=BitCount;
		}
	else if (BitCount==(BitPosition+1))
		{AndByte=(BYTE)(msk[BitCount]<<(BitPosition-BitCount+1));
		 Value=CurrentReadByte&AndByte;
		 BitPosition=7;
		 CurrentReadByte=InputBuffer[BYTEPosition++];
		}
	else
		{Value=CurrentReadByte&msk[BitPosition+1];
		 BitLeft=BitCount-BitPosition-1;
		 Value<<=BitLeft;
		 BitPosition=7;
		 CurrentReadByte=InputBuffer[BYTEPosition++];
		 while (BitLeft>=8)
			{BitLeft-=8;
			 Value|=(CurrentReadByte<<BitLeft);
			 CurrentReadByte=InputBuffer[BYTEPosition++];
		 	}
		 if (BitLeft)
			{AndByte=(BYTE)(msk[BitLeft]<<(8-BitLeft));
			 Value|=(CurrentReadByte&AndByte)>>(8-BitLeft);
			 BitPosition=7-BitLeft;
			}
		}
	BitPosition=OldBitPosition;
	CurrentReadByte=OldReadByte;
	BYTEPosition=OldBytePosition;
	return Value;
}

void DBitStream::FlushBits(int BitCount)
{
	while (BitCount--)
		{BitPosition--;
		 if (BitPosition<0)
			{CurrentReadByte=InputBuffer[BYTEPosition++];
			 BitPosition=7;
			}
		}
}
		 
int DBitStream::GetOneBit(void)
{
	return ReadOneBit();
}

int DBitStream::GetVarible(int BitCount)
{
	register int Value,BitLeft;
	register BYTE AndByte;
	if (BitCount<=BitPosition)
		{AndByte=(BYTE)(msk[BitCount]<<(BitPosition-BitCount+1));
		 Value=(CurrentReadByte&AndByte)>>(BitPosition-BitCount+1);
		 BitPosition-=BitCount;
		}
	else if (BitCount==(BitPosition+1))
		{AndByte=(BYTE)(msk[BitCount]<<(BitPosition-BitCount+1));
		 Value=CurrentReadByte&AndByte;
		 BitPosition=7;
		 CurrentReadByte=InputBuffer[BYTEPosition++];
		}
	else
		{Value=CurrentReadByte&msk[BitPosition+1];
		 BitLeft=BitCount-BitPosition-1;
		 Value<<=BitLeft;
		 BitPosition=7;
		 CurrentReadByte=InputBuffer[BYTEPosition++];
		 while (BitLeft>=8)
			{BitLeft-=8;
			 Value|=(CurrentReadByte<<BitLeft);
			 CurrentReadByte=InputBuffer[BYTEPosition++];
		 	}
		 if (BitLeft)
			{AndByte=(BYTE)(msk[BitLeft]<<(8-BitLeft));
			 Value|=(CurrentReadByte&AndByte)>>(8-BitLeft);
			 BitPosition=7-BitLeft;
			}
		}
	return Value;
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?