📄 mp4decoder.cpp
字号:
#include "stdafx.h"#include "Mp4Decoder.h"
#include "xvid.h"
CMp4Decoder::CMp4Decoder()
{
CSP = XVID_CSP_BGR; BPP = 3; dec_handle = NULL;
g_first = 1;
use_assembler = 1;
m_iXdim = 176;
m_iYdim = 144;
m_iBmpHeaderSize = 54;
m_iDecBufLen = m_iXdim*m_iYdim*3 + m_iBmpHeaderSize;
}
CMp4Decoder::~CMp4Decoder()
{
if (dec_handle)
DecStop();
}
int CMp4Decoder::Decode(unsigned char *in_buffer,unsigned char *out_buffer,int input_len)
{
unsigned char *mp4_ptr;
int used_bytes = 0;
if(g_first)
{
DecInit(use_assembler);
g_first = 0;
}
mp4_ptr = in_buffer;
/* This loop is needed to handle VOL/NVOP reading */
do {
used_bytes = DecMain(mp4_ptr, out_buffer, input_len, &xvid_dec_stats);
/* Update buffer pointers */
if(used_bytes > 0) {
mp4_ptr += used_bytes;
input_len -= used_bytes;
}
}while(xvid_dec_stats.type <= 0 && input_len > 0);
return 0;
}/***************************************************************************** * Routines for decoding: init decoder, use, and stop decoder ****************************************************************************//* init decoder before first run */int CMp4Decoder::DecInit(int use_assembler){ int ret; xvid_gbl_init_t xvid_gbl_init; xvid_dec_create_t xvid_dec_create; /* Reset the structure with zeros */ memset(&xvid_gbl_init, 0, sizeof(xvid_gbl_init_t)); memset(&xvid_dec_create, 0, sizeof(xvid_dec_create_t)); /*------------------------------------------------------------------------ * XviD core initialization *----------------------------------------------------------------------*/ /* Version */ xvid_gbl_init.version = XVID_VERSION; /* Assembly setting */ if(use_assembler)#ifdef ARCH_IS_IA64 xvid_gbl_init.cpu_flags = XVID_CPU_FORCE | XVID_CPU_IA64;#else xvid_gbl_init.cpu_flags = 0;#endif else xvid_gbl_init.cpu_flags = XVID_CPU_FORCE; xvid_global(NULL, 0, &xvid_gbl_init, NULL); /*------------------------------------------------------------------------ * XviD encoder initialization *----------------------------------------------------------------------*/ /* Version */ xvid_dec_create.version = XVID_VERSION; /* * Image dimensions -- set to 0, xvidcore will resize when ever it is * needed */ xvid_dec_create.width = 0; xvid_dec_create.height = 0; ret = xvid_decore(NULL, XVID_DEC_CREATE, &xvid_dec_create, NULL); dec_handle = xvid_dec_create.handle; return(ret);}/* decode one frame */int CMp4Decoder::DecMain(unsigned char *istream, unsigned char *ostream, int istream_size, xvid_dec_stats_t *xvid_dec_stats){ int ret; xvid_dec_frame_t xvid_dec_frame; memset(&xvid_dec_frame, 0, sizeof(xvid_dec_frame_t)); /* Set version */ xvid_dec_frame.version = XVID_VERSION; xvid_dec_stats->version = XVID_VERSION; /* No general flags to set */ xvid_dec_frame.general = 0; /* Input stream */ xvid_dec_frame.bitstream = istream; xvid_dec_frame.length = istream_size; /* Output frame structure */ xvid_dec_frame.output.plane[0] = ostream; xvid_dec_frame.output.stride[0] = m_iXdim*BPP; xvid_dec_frame.output.csp = CSP; ret = xvid_decore(dec_handle, XVID_DEC_DECODE, &xvid_dec_frame, xvid_dec_stats); return(ret);}/* close decoder to release resources */int CMp4Decoder::DecStop(){ int ret; ret = xvid_decore(dec_handle, XVID_DEC_DESTROY, NULL, NULL); return(ret);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -