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

📄 mp4decoder.cpp

📁 基于SAA7113的MPEG-4程序
💻 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 + -