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

📄 xvid_enc_dec.cpp

📁 用vc++实现的xvid编码器实现的压缩解压缩
💻 CPP
字号:
#include "xvid_enc_dec.h"
#include "dbg.h"

/*#ifdef _DEBUG
#define new _CRTDBG_NEW
#endif*/

void xvid_enc::enc_init(){
	CriticalSectionLock lock(m_Lock);
	XVID_INIT_PARAM xinit;
	XVID_ENC_PARAM xparam;

	xinit.cpu_flags = 0;

	xvid_init(NULL, 0, &xinit, NULL);

	xparam.width = m_xdim;
	xparam.height = m_ydim;
	if ((m_framerate - (int)m_framerate) < SMALL_EPS)
	{
		xparam.fincr = 1;
		xparam.fbase = (int)m_framerate;
	}
	else
	{
		xparam.fincr = FRAMERATE_INCR;
		xparam.fbase = (int)(FRAMERATE_INCR * m_framerate);
	}
 //	  xparam.rc_reaction_delay_factor = 16;
 //   xparam.rc_averaging_period = 100;
 //   xparam.rc_buffer = 10;
	xparam.rc_reaction_delay_factor = -1;
    xparam.rc_averaging_period = -1;
    xparam.rc_buffer = -1;
	xparam.rc_bitrate = m_bitrate;
	xparam.min_quantizer = ARG_MINQUANT;
	xparam.max_quantizer = ARG_MAXQUANT;
	xparam.max_key_interval = (int)m_keyrate * 5 + 10;

	xvid_encore(NULL, XVID_ENC_CREATE, &xparam, NULL);
	m_enchandle = xparam.handle;
}
xvid_enc::xvid_enc(int x_dim,int y_dim,float framerate,int bitrate,int keyrate):
m_xdim(x_dim),
m_ydim(y_dim),
m_framerate(framerate),
m_bitrate(bitrate),
m_keyrate(keyrate)
{
	enc_init();
}
xvid_enc::~xvid_enc()
{
	CriticalSectionLock lock(m_Lock);
	try{
		xvid_encore(m_enchandle, XVID_ENC_DESTROY, NULL, NULL);
	}catch(...){
	}
}
int xvid_enc::enc_main(unsigned char *image, unsigned char* bitstream,int *streamlength, int *frametype,int quant,unsigned colorspace,bool greyscale)
{
	CriticalSectionLock lock(m_Lock);
	int xerr;

	XVID_ENC_FRAME xframe;
	XVID_ENC_STATS xstats;

	xframe.bitstream = bitstream;
	xframe.length = -1; 	/* this is written by the routine */

	xframe.image = image;
	xframe.colorspace = colorspace;	/* defined in <xvid.h> */

	xframe.intra = *frametype; /* let the codec decide between I-frame (1) and P-frame (0) */

	xframe.quant = quant;	/* is quant != 0, use a fixed quant (and ignore bitrate) */

	xframe.motion = motion_presets[ARG_QUALITY];
	if(greyscale){
		xframe.general = greyscale_presets[ARG_QUALITY];
	}else{
		xframe.general = general_presets[ARG_QUALITY];
	}
	xframe.quant_intra_matrix = xframe.quant_inter_matrix = NULL;

	try{
		xerr = xvid_encore(m_enchandle, XVID_ENC_ENCODE, &xframe, &xstats);
		if(xerr != 0){
			rpt_msg("enc(%d) error\n",m_enchandle);
			xvid_encore(m_enchandle, XVID_ENC_DESTROY, NULL, NULL);
			enc_init();
		}
	}catch(...){
		rpt_msg("enc(%d) error in encing\n",m_enchandle);
		try{
			xvid_encore(m_enchandle, XVID_ENC_DESTROY, NULL, NULL);
		}catch(...){
		}
		enc_init();
	}

	*frametype = xframe.intra;
	*streamlength = xframe.length;

	return xerr;
}

void xvid_dec::dec_init(){
	CriticalSectionLock lock(m_Lock);
    XVID_INIT_PARAM xinit;
    XVID_DEC_PARAM xparam;

	xinit.cpu_flags = 0;

    xvid_init(NULL, 0, &xinit, NULL);
    xparam.width = m_xdim;
    xparam.height = m_ydim;

    xvid_decore(NULL, XVID_DEC_CREATE, &xparam, NULL);
    m_dechandle = xparam.handle;
}
xvid_dec::xvid_dec(int x_dim,int y_dim):
m_stride(x_dim),
m_xdim(x_dim),
m_ydim(y_dim)
{
	dec_init();
}
xvid_dec::~xvid_dec()
{
	CriticalSectionLock lock(m_Lock);
	try{
		xvid_decore(m_dechandle, XVID_DEC_DESTROY, NULL, NULL);
	}catch(...){
	}
}
int xvid_dec::dec_main(unsigned char *bitstream,int streamlength,unsigned char *image,unsigned colorspace)
{
	CriticalSectionLock lock(m_Lock);
	int xerr;
	XVID_DEC_FRAME xframe;

	xframe.bitstream = bitstream;
	xframe.length = streamlength;
	xframe.image = image;
	xframe.stride = m_stride;
	xframe.colorspace = colorspace;

	try{
		xerr = xvid_decore(m_dechandle, XVID_DEC_DECODE, &xframe, NULL);
		if(xerr != 0){
			rpt_msg("dec(%d) error\n",m_dechandle);
			xvid_decore(m_dechandle, XVID_DEC_DESTROY, NULL, NULL);
			dec_init();
		}
	}catch(...){
		rpt_msg("dec(%d) error in decing\n",m_dechandle);
		try{
			xvid_decore(m_dechandle, XVID_DEC_DESTROY, NULL, NULL);
		}catch(...){
		}
		dec_init();
	}

//	*ostream_size = xframe.length;

	return xerr;
}

⌨️ 快捷键说明

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