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

📄 h263pencode.cpp

📁 H.263的编码程序,加了CPU指令优化,VC版.
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// H263PEncode.cpp: implementation of the H263PEncode class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "block.h"
#include "mot_est.h"
#include "H263PEncode.h"
#include "init.h"
#include "picture.h"
#include "Exceptions.h"
#include "stat.h"
#include "image.h"
#include "cpu.h"
#include "ratectrl.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif


//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CH263Encoder::CH263Encoder()
{

	m_EncOption.m_iPicFormat		= _QCIF;
	m_EncOption.m_iVideoFormat      = YUV420;
	m_EncOption.m_iQuantI			= 5;
	m_EncOption.m_iQuantP			= 5;
	m_EncOption.m_iQuantB           = 5;
	m_EncOption.m_iPRate			= 300;
	m_EncOption.m_iBFrame			= 2;
	m_EncOption.m_iFrameRate		= 30;
	m_EncOption.m_iRefBufSize		= 4;
	m_EncOption.m_iMVSearchMethod	= MVFAST;
	m_EncOption.m_iMVSearchWin		= 15;
	m_EncOption.m_iUseAP			= 0; 
	m_EncOption.m_iUseDF			= 0;
	m_EncOption.m_iUseRPS			= 0;
	m_EncOption.m_iUseBFrame		= 0;
	m_EncOption.m_iUseAIC           = 0;
	m_EncOption.m_iUseGob			= 0;
	m_EncOption.m_iUseVersion2		= 1;
	m_EncOption.m_iUseBlock         = 200;  //could not be set to zero because function putbits has been altered.
	m_EncOption.m_iUseRC            = 0;
	m_EncOption.m_pCBContext        = NULL;

}

CH263Encoder::~CH263Encoder()
{

}

BOOL CH263Encoder::GetOption(Enc_Option &option)
{
	option = m_EncOption;

	return true;
}
/*!
*********************************************************
*    Open encoder: Set picture format, picture size, 
*    allocate memory needed, and open stream file.
*    initilize encoder parameters, including global parameters 
*    and parameters in frame level.
*    get source frame pointer 
*********************************************************/
BOOL CH263Encoder::EncOpen(Enc_Option &option)
{
	// allocate memory
	m_pEncStatus = (H263VencStatus *) malloc(sizeof(H263VencStatus));
	m_pMCStatus  = (MCParam *) malloc(sizeof(MCParam));

	m_pStream = &(m_pEncStatus->putstrmctrl);
	m_pEncStatus->cpusupport = cputest();
	m_pEncStatus->VideoFormat = option.m_iVideoFormat;


/////////////////////////////////////////////////////////////////////////
	switch(m_pEncStatus->cpusupport)
	{
	case 1: //Pet II
		m_pEncStatus->method.DCT = fdct_mmx;
		m_pEncStatus->method.IDCT = idct_c;
		m_pEncStatus->method.pred_lum = pred_lum_c;
		m_pEncStatus->method.pred_lum_bid = pred_lum_bid_c;
		m_pEncStatus->method.pred_obmc = pred_obmc_c;
		m_pEncStatus->method.pred_chrom = pred_chrom_mmx;
		m_pEncStatus->method.pred_chrom_bid = pred_chrom_bid_mmx;
		m_pEncStatus->method.make_diff = make_diff_mmx;
		m_pEncStatus->method.recon_pic = recon_pic_c;
		m_pEncStatus->method.Quant_blk_I = Quant_blk_I_c;
		m_pEncStatus->method.DeQuant_blk_I = DeQuant_blk_I_mmx;
		m_pEncStatus->method.Quant_blk_P = Quant_blk_P_c;
		m_pEncStatus->method.DeQuant_blk_P = DeQuant_blk_P_mmx;
		m_pEncStatus->method.block_copy1 = block_copy1_mmx;
		m_pEncStatus->method.block_copy2 = block_copy2_mmx;
		m_pEncStatus->method.block_copy3 = block_copy3_mmx;
		m_pEncStatus->method.interpolate_lum = interpolate_lum_c;
		m_pEncStatus->method.me_sad_a = me_sad_a_c;
		m_pEncStatus->method.me_sad_b = me_sad_b_c;
        m_pEncStatus->method.findbiSAD = findbiSAD_c;
		break;

	case 2://Pet III
		m_pEncStatus->method.DCT = fdct_mmx;
		m_pEncStatus->method.IDCT = idct_mmx;
		m_pEncStatus->method.pred_lum = pred_lum_sse;
		m_pEncStatus->method.pred_lum_bid = pred_lum_bid_sse;
		m_pEncStatus->method.pred_obmc = pred_obmc_sse;
		m_pEncStatus->method.pred_chrom = pred_chrom_sse;
		m_pEncStatus->method.pred_chrom_bid = pred_chrom_bid_sse;
		m_pEncStatus->method.make_diff = make_diff_mmx;
		m_pEncStatus->method.recon_pic = recon_pic_sse;
		m_pEncStatus->method.Quant_blk_I = Quant_blk_I_sse;
		m_pEncStatus->method.DeQuant_blk_I = DeQuant_blk_I_mmx;
		m_pEncStatus->method.Quant_blk_P = Quant_blk_P_sse;
		m_pEncStatus->method.DeQuant_blk_P = DeQuant_blk_P_mmx;
		m_pEncStatus->method.block_copy1 = block_copy1_mmx;
		m_pEncStatus->method.block_copy2 = block_copy2_mmx;
		m_pEncStatus->method.block_copy3 = block_copy3_mmx;
		m_pEncStatus->method.interpolate_lum = interpolate_lum_sse;
		m_pEncStatus->method.me_sad_a = me_sad_a_sse;
		m_pEncStatus->method.me_sad_b = me_sad_b_sse;
        m_pEncStatus->method.findbiSAD = findbiSAD_sse;



		break;
		
	case 3://pet IV
		m_pEncStatus->method.DCT = fdct_mmx;
		m_pEncStatus->method.IDCT = idct_mmx;
		m_pEncStatus->method.pred_lum = pred_lum_sse;
		m_pEncStatus->method.pred_lum_bid = pred_lum_bid_sse;
		m_pEncStatus->method.pred_obmc = pred_obmc_sse;
		m_pEncStatus->method.pred_chrom = pred_chrom_sse;
		m_pEncStatus->method.pred_chrom_bid = pred_chrom_bid_sse;
		m_pEncStatus->method.make_diff = make_diff_mmx;
		m_pEncStatus->method.recon_pic = recon_pic_sse;
		m_pEncStatus->method.Quant_blk_I = Quant_blk_I_sse;
		m_pEncStatus->method.DeQuant_blk_I = DeQuant_blk_I_mmx;
		m_pEncStatus->method.Quant_blk_P = Quant_blk_P_sse;
		m_pEncStatus->method.DeQuant_blk_P = DeQuant_blk_P_mmx;
		m_pEncStatus->method.block_copy1 = block_copy1_mmx;
		m_pEncStatus->method.block_copy2 = block_copy2_mmx;
		m_pEncStatus->method.block_copy3 = block_copy3_mmx;
		m_pEncStatus->method.interpolate_lum = interpolate_lum_sse;
		m_pEncStatus->method.me_sad_a = me_sad_a_sse;
		m_pEncStatus->method.me_sad_b = me_sad_b_sse;
        m_pEncStatus->method.findbiSAD = findbiSAD_sse;

		break;

	default://pet 
		m_pEncStatus->method.DCT = fdct_c;
		m_pEncStatus->method.IDCT = idct_c;	
		m_pEncStatus->method.pred_lum = pred_lum_c;
		m_pEncStatus->method.pred_lum_bid = pred_lum_bid_c;
		m_pEncStatus->method.pred_obmc = pred_obmc_c;
		m_pEncStatus->method.pred_chrom = pred_chrom_c;
		m_pEncStatus->method.pred_chrom_bid = pred_chrom_bid_c;
		m_pEncStatus->method.make_diff = make_diff_c;
		m_pEncStatus->method.recon_pic = recon_pic_c;
		m_pEncStatus->method.Quant_blk_I = Quant_blk_I_c;
		m_pEncStatus->method.DeQuant_blk_I = DeQuant_blk_I_c;
		m_pEncStatus->method.Quant_blk_P = Quant_blk_P_c;
		m_pEncStatus->method.DeQuant_blk_P = DeQuant_blk_P_c;
		m_pEncStatus->method.block_copy1 = block_copy1_c;
		m_pEncStatus->method.block_copy2 = block_copy2_c;
		m_pEncStatus->method.block_copy3 = block_copy3_c;
		m_pEncStatus->method.interpolate_lum = interpolate_lum_c;
		m_pEncStatus->method.me_sad_a = me_sad_a_c;
		m_pEncStatus->method.me_sad_b = me_sad_b_c;
        m_pEncStatus->method.findbiSAD = findbiSAD_c;



	}

/////////////////////////////////////////////////////////////////////////


	//Source Format
	switch(option.m_iPicFormat)
	{
	case _QCIF:
		{
			m_pEncStatus->pels = 176;
			m_pEncStatus->lines = 144;
			m_pEncStatus->gobsync = 1;
			break;
		}
	case _CIF:
		{
			m_pEncStatus->pels = 352;
			m_pEncStatus->lines = 288;
			m_pEncStatus->gobsync = 1;
			break;
		}
	case _4CIF:
		{
			m_pEncStatus->pels = 704;
			m_pEncStatus->lines = 576;
			m_pEncStatus->gobsync = 2;
			break;
		}
	case _16CIF:
		{
			m_pEncStatus->pels = 1408;
			m_pEncStatus->lines = 1152;
			m_pEncStatus->gobsync = 4;
			break;
		}
	case _CPFMT:
		{
			m_pEncStatus->pels = option.m_iPicWidth;
			m_pEncStatus->lines = option.m_iPicHeight;
			m_pEncStatus->gobsync = 1;
			break;
		}
	default:
		{
			printf (E_OPENENC_FORMAT);

⌨️ 快捷键说明

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