📄 h263decode.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 + -