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

📄 h263encoder.cpp

📁 这是G.723和G.729的音频编解码的源代码
💻 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 + -