📄 h263pencode.cpp
字号:
// 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 + -