⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dbitstream.cpp

📁 这是G.723和G.729的音频编解码的源代码
💻 CPP
字号:

#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 + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -