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

📄 h263decode.cpp

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

#include "stdafx.h"
#include "color.h"
#include "DBitstream.h"
#include "sactable.h"
#include "sad.h"
#include "Dh263class.h"

DH263Picture::DH263Picture(void)
{	
   ZeroMemory(DMV,sizeof(DMV));
	ZeroMemory(DMVAP,sizeof(DMVAP));
	ZeroMemory(DMVPB,sizeof(DMVPB));

	nTotalFrame=0;
	CurRecon.hImage=GlobalAlloc(GHND,101376+53688+8);
	CurRecon.Image=(BYTE *)GlobalLock(CurRecon.hImage);
	if ((int)CurRecon.Image%8)
		CurRecon.Image+=(8-(int)CurRecon.Image%8);

	PrevRecon.hImage=GlobalAlloc(GHND,101376+53688+8);
	PrevRecon.Image=(BYTE *)GlobalLock(PrevRecon.hImage);
	if ((int)PrevRecon.Image%8)
		PrevRecon.Image+=(8-(int)PrevRecon.Image%8);

	BRecon.hImage=GlobalAlloc(GHND,101376+53688+8);
	BRecon.Image=(BYTE *)GlobalLock(BRecon.hImage);
	if ((int)BRecon.Image%8)
		BRecon.Image+=(8-(int)BRecon.Image%8);

	PictureBits.TotalBits=0;
	PictureBits.PSCBits=22;
	PictureBits.TRBits=8;
	PictureBits.SourceFormatBits=3;
	PictureBits.CPMBits=1;
	PictureBits.PLCIBits=2;
	PictureBits.PQUANTBits=5;
	PictureBits.TRBBits=3;
	PictureBits.DBQUANTBits=2;
	PictureBits.PEIBits=1;
	PictureBits.PSPAREBits=8;
	PictureBits.EOSBits=22;

	Group=new DH263GOB;
	m_pDeblock=new CDeblock;
}

DH263Picture::~DH263Picture()
{	GlobalUnlock(CurRecon.hImage);
	GlobalFree(CurRecon.hImage);
	GlobalUnlock(PrevRecon.hImage);
	GlobalFree(PrevRecon.hImage);
	GlobalUnlock(BRecon.hImage);
	GlobalFree(BRecon.hImage);

	if(Group)
		delete Group;
	if(m_pDeblock)
		delete m_pDeblock;
}

void DH263Picture::SwapPtr(YUVData &Swap1,YUVData &Swap2)
{	BYTE *TempPtr;

	TempPtr=Swap1.Image;
	Swap1.Image=Swap2.Image;
	Swap2.Image=TempPtr;

	Swap1.Y=Swap1.Image;
	Swap1.U=Swap1.Image+ImageSize;
	Swap1.V=Swap1.Image+ImageSize+ImageSize/4;

	Swap2.Y=Swap2.Image;
	Swap2.U=Swap2.Image+ImageSize;
	Swap2.V=Swap2.Image+ImageSize+ImageSize/4;
}

void DH263Picture::DecodePicture(void)
{	DBitStream *DecodeStream=new DBitStream(CompressData);
	if (!DecodePictureHeader(DecodeStream))
		{if(DecodeStream) delete DecodeStream;
		 return ;
		}	
	DH263MB TempMB(Width,Height,this);
	MB=&TempMB;
	MB->Pic=PictureInfo;

	if (PictureInfo.PictureType==PCT_INTRA)
		DecodeINTRAPicture(CurRecon,DecodeStream);
	else 
	{
		if (!PictureInfo.PBMode)
			DecodeINTERPicture(CurRecon,PrevRecon,DecodeStream);
		else
			DecodePBPicture(CurRecon,PrevRecon,BRecon,DecodeStream);
	}
	m_pDeblock->DeblockPlaneYUV411(CurRecon.Image,PictureInfo.PQUANT,Width,Height);
	if(DecodeStream)
		delete DecodeStream;
}


int DH263Picture::DecodePictureHeader(DBitStream * InputStream)
{
	int code,DiffFrame;
	static int PrevTR=0;

	do
		{PictureInfo.PSC=InputStream->ReadVarible(PictureBits.PSCBits);
		 if (PictureInfo.PSC==PC_PSC)
			{InputStream->FlushBits(PictureBits.PSCBits);
			 break;
			}
		 else 
			 InputStream->FlushBits(1);
		}while (1);

	PictureInfo.TR=InputStream->GetVarible(PictureBits.TRBits);
	code=InputStream->GetOneBit();//PTYPE Bit 1
	if (code!=0)
		return FALSE;
	code=InputStream->GetOneBit();//PTYPE Bit 2
	if (code!=1)
		return FALSE;
	PictureInfo.SplitScreen=InputStream->GetOneBit();//PTYPE Bit 3
	PictureInfo.DocumentCamera=InputStream->GetOneBit();//PTYPE Bit 4
	PictureInfo.FreezePicture=InputStream->GetOneBit();//PTYPE Bit 5
	PictureInfo.SourceFormat=InputStream->GetVarible(PictureBits.SourceFormatBits);
	if (PictureInfo.SourceFormat != 1)
		return FALSE;
	Width=FormatInfo[PictureInfo.SourceFormat].Pixels;
	Height=FormatInfo[PictureInfo.SourceFormat].Lines;
	ImageSize=FormatInfo[PictureInfo.SourceFormat].TotalBytes;

	CurRecon.Y=CurRecon.Image;
	CurRecon.U=CurRecon.Image+ImageSize;
	CurRecon.V=CurRecon.Image+ImageSize+ImageSize/4;
	PrevRecon.Y=PrevRecon.Image;
	PrevRecon.U=PrevRecon.Image+ImageSize;
	PrevRecon.V=PrevRecon.Image+ImageSize+ImageSize/4;
	BRecon.Y=BRecon.Image;
	BRecon.U=BRecon.Image+ImageSize;
	BRecon.V=BRecon.Image+ImageSize+ImageSize/4;

	PictureInfo.PictureType=InputStream->GetOneBit();//PTYPE Bit 9
	PictureInfo.UMVMode=InputStream->GetOneBit();//PTYPE Bit 10
	PictureInfo.SACMode=InputStream->GetOneBit();//PTYPE Bit 11
	PictureInfo.APMode=InputStream->GetOneBit();//PTYPE Bit 12
	PictureInfo.PBMode=InputStream->GetOneBit();//PTYPE Bit 13

	PictureInfo.PQUANT=InputStream->GetVarible(PictureBits.PQUANTBits);
	
	PictureInfo.CPM=InputStream->GetOneBit();

	if (PictureInfo.CPM)
		PictureInfo.PLCI=InputStream->GetVarible(PictureBits.PLCIBits);
	if (PictureInfo.PBMode)
		{PictureInfo.TRB=InputStream->GetVarible(PictureBits.TRBBits);
		 PictureInfo.DBQUANT=InputStream->GetVarible(PictureBits.DBQUANTBits);
		}
	PictureInfo.PEI=InputStream->GetOneBit();
	while (PictureInfo.PEI)
		{PictureInfo.PSPARE=InputStream->GetVarible(PictureBits.PSPAREBits);
		 PictureInfo.PEI=InputStream->GetOneBit();
		}

	DiffFrame=(int)PictureInfo.TR-PrevTR;
	if (DiffFrame<0)
		DiffFrame+=256;
	nTotalFrame+=DiffFrame;
	PrevTR=PictureInfo.TR;

	return TRUE;
}

int DH263Picture::DecodeINTRAPicture(YUVData Loss,DBitStream *DecodeStream)
{	int i,j,GN=0;
	BOOL GOBFlag=TRUE;
	SAD *SADeco;
	if (PictureInfo.SACMode)
		SADeco=new SAD(DecodeStream);
	MB->MBBits.DQUANTBits=2;

	MB->QP=PictureInfo.PQUANT;
	for (j=0; j<HMB;j++)
		{if (j&&GOBFlag)
			{GN=Group->DecodeGOBHeader(PictureInfo.CPM,DecodeStream);
			 MB->QP=Group->GOBInfo.GQUANT;
			}
		 if (GN!=j)
			{GOBFlag=FALSE;
			 continue;
			}
		 else
			 GOBFlag=TRUE;
		 if (PictureInfo.SACMode)
			SADeco->DecodeReset();

		 for (i=0;i<WMB;i++)
			{MB->CBP=0;
			 memset(MB->QCoeff,0,384*sizeof(short));
			 if (!PictureInfo.SACMode)
				{MB->DecodeMBHeader(DecodeStream,0,0);
				 MB->DecodeCoeff(DecodeStream);
				}
			 else
				{MB->SACDecodeMBHeader(SADeco,0,0);
				 MB->SACDecodeCoeff(SADeco);
				}
			 MB->DecodeMBData();
			 MB->FillRecon(Loss,j*MB_SIZE,i*MB_SIZE);
			}
		}
	DecodeStream->FlushBits(PictureBits.EOSBits);
	if (PictureInfo.SACMode) delete SADeco;
	return TRUE;
}

⌨️ 快捷键说明

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