📄 h263encoder.cpp
字号:
#include "stdafx.h"
#include "color.h"
#include "sactable.h"
#include "CBitstream.h"
#include "sac.h"
#include "Ch263class.h"
#include "h263encoder.h"
CH263Encoder::CH263Encoder()
{
m_nQuant=4;
m_nSourceFormat=SF_QCIF;
m_nCompressOption=CF_SAC|CF_UMV;
m_bPBMode=(m_nCompressOption&CF_PB)?1:0;
m_bHavePBFirstFrame=FALSE;
m_nIntraFrameInterval=30;
m_nNotIntraFrameCount=0;
m_nFrameCount=1;
m_pNoiseFilter=new CNoiseFilter;
Initialize();
}
CH263Encoder::~CH263Encoder()
{
if(m_pNoiseFilter)
delete m_pNoiseFilter;
}
void CH263Encoder::SetCompressOption(int nCompressOption)
{
if(m_nCompressOption!=nCompressOption)
{
PictureInfo.UMVMode=(nCompressOption&CF_UMV)?1:0;
PictureInfo.SACMode=(nCompressOption&CF_SAC)?1:0;
PictureInfo.APMode=(nCompressOption&CF_AP)?1:0;
PictureInfo.PBMode=(nCompressOption&CF_PB)?1:0;
MB->Pic=PictureInfo;
m_nCompressOption=nCompressOption;
m_bPBMode=PictureInfo.PBMode;
}
}
BOOL CH263Encoder::SetSourceFormat(int nSourceFormat)
{
if(nSourceFormat<0)return FALSE;
if(nSourceFormat>3)return FALSE;
if(m_nSourceFormat!=nSourceFormat)
{
m_nSourceFormat=nSourceFormat;
FreePicture();
InitPicture(m_nSourceFormat,m_nCompressOption,m_nQuant);
}
return TRUE;
}
BOOL CH263Encoder::SetQuant(int nQuant)
{
if(nQuant<1)return FALSE;
if(nQuant>31)return FALSE;
if(m_nQuant!=nQuant)
{
m_nQuant=nQuant;
PictureInfo.PQUANT=nQuant;
MB->Pic=PictureInfo;
}
return TRUE;
}
int CH263Encoder::EncodeAFrame(BYTE* pbyInputPicture,int nInputLength)
{
int nPictureDataLength=ImageSize+ImageSize/2;
if(nInputLength<nPictureDataLength)return -1;
if((m_nSourceFormat < 0) || (m_nSourceFormat >= 5))
return 0;
//PB Frame
if(m_bHavePBFirstFrame)
{
//encode pb frame
m_pNoiseFilter->PlaneYUV411Filter(pbyInputPicture,CurImage.Image,FormatInfo[m_nSourceFormat].Pixels,FormatInfo[m_nSourceFormat].Lines);
//CopyMemory(CurImage.Image,pbyInputPicture,nPictureDataLength);
EncodePicture(2,m_nFrameCount);
SwapPtr(CurRecon,PrevRecon);
m_bHavePBFirstFrame=FALSE;
if(m_nNotIntraFrameCount)
{
m_nNotIntraFrameCount++;
m_nNotIntraFrameCount%=m_nIntraFrameInterval;
}
m_nFrameCount++;
return DataLength;
}
//Intra Frame
if(m_nNotIntraFrameCount==0)
{
//encode intra frame
m_pNoiseFilter->PlaneYUV411Filter(pbyInputPicture,CurImage.Image,FormatInfo[m_nSourceFormat].Pixels,FormatInfo[m_nSourceFormat].Lines);
//CopyMemory(CurImage.Image,pbyInputPicture,nPictureDataLength);
EncodePicture(0,m_nFrameCount);
m_nNotIntraFrameCount++;
m_nNotIntraFrameCount%=m_nIntraFrameInterval;
m_nFrameCount++;
SwapPtr(CurRecon,PrevRecon);
return DataLength;
}
//Inter Frame
if(!m_bPBMode)
{
m_pNoiseFilter->PlaneYUV411Filter(pbyInputPicture,CurImage.Image,FormatInfo[m_nSourceFormat].Pixels,FormatInfo[m_nSourceFormat].Lines);
//CopyMemory(CurImage.Image,pbyInputPicture,nPictureDataLength);
EncodePicture(1,m_nFrameCount);
m_nNotIntraFrameCount++;
m_nNotIntraFrameCount%=m_nIntraFrameInterval;
m_nFrameCount++;
SwapPtr(CurRecon,PrevRecon);
return DataLength;
}
//input PBFrame first frame
m_pNoiseFilter->PlaneYUV411Filter(pbyInputPicture,BImage.Image,FormatInfo[m_nSourceFormat].Pixels,FormatInfo[m_nSourceFormat].Lines);
//CopyMemory(BImage.Image,pbyInputPicture,nPictureDataLength);
m_nNotIntraFrameCount++;
m_nNotIntraFrameCount%=m_nIntraFrameInterval;
m_bHavePBFirstFrame=TRUE;
m_nFrameCount++;
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -