📄 xvid_enc_dec.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 + -