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

📄 xviddecoder2.h

📁 对MPEG4视频码流的解压
💻 H
字号:
#ifndef  __XVID_DECODER2_H__
#define  __XVID_DECODER2_H__

#include ".\Xvid2.h"

#ifndef   XVID_DEC
#define   XVID_DEC

#define MPEG4_DEC_ERROR		-1
#define MPEG4_DEC_OK		0

enum
{	
	OUTPUT_FORMAT_I420  = XVID_CSP_I420,
	OUTPUT_FORMAT_RGB24 = XVID_CSP_BGR,
	OUTPUT_FORMAT_UYVY  = XVID_CSP_UYVY		
};

#endif

class  XvidDecoder2
{
public:

private:
	typedef unsigned int  uint32_t;

	int dec_main(unsigned char *in_buffer, 
				 unsigned char *out_buffer, 
				 int m4v_size, 
				 xvid_dec_stats_t *xvid_dec_stats)
	{
		int ret;
		
		xvid_dec_frame_t xvid_dec_frame;
		
		/* 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        = in_buffer;
		xvid_dec_frame.length           = m4v_size;
		
		/* Output frame structure */
		xvid_dec_frame.output.plane[0]  = out_buffer;
		xvid_dec_frame.output.stride[0] = m_iStride;
		xvid_dec_frame.output.csp       = m_out_format;
		
		ret = mmpeg4_decore(m_dechandle, XVID_DEC_DECODE, &xvid_dec_frame, xvid_dec_stats);
		
		return(ret);
		
	}

public:
	XvidDecoder2()
	{
		m_bSeeIFrame = false;
		m_dechandle = NULL;
		m_out_format = OUTPUT_FORMAT_UYVY;
	}

	~XvidDecoder2()
	{
		DeInit2();
	}

	int Init2()
	{
		int ret;

		xvid_gbl_init_t   xvid_gbl_init;
		xvid_dec_create_t xvid_dec_create;

		xvid_gbl_init.version = XVID_VERSION;

		xvid_gbl_init.cpu_flags = 0;

		mmpeg4_global(NULL, 0, &xvid_gbl_init, NULL);

		xvid_dec_create.version = XVID_VERSION;

		xvid_dec_create.width = 0;
		xvid_dec_create.height = 0;

		ret = mmpeg4_decore(NULL, XVID_DEC_CREATE, &xvid_dec_create, NULL);

		m_dechandle = xvid_dec_create.handle;

		return ret;
	}

	// 必须找到第一个I帧才能调用这个函数开始解码
	int DecoderOneFrame2(unsigned char *in_buffer, unsigned char *out_buffer, int m4v_size)
	{
		int used_bytes;
		
		do {
			/* Decode frame */
			used_bytes = dec_main(in_buffer, out_buffer, m4v_size, &m_xvid_dec_stats);
			
			/* Update buffer pointers */
			if(used_bytes > 0) {

				in_buffer += used_bytes;
				m4v_size -= used_bytes;

			}
			
		}while(m_xvid_dec_stats.type <= 0 && m4v_size > 0);

		if(m4v_size < 0)
			return MPEG4_DEC_ERROR;

		return MPEG4_DEC_OK;
	}

	int DeInit2()
	{
		int xerr = 0;
	
		if(m_dechandle)
		{
			xerr = mmpeg4_decore(m_dechandle, XVID_DEC_DESTROY, NULL, NULL);
			m_dechandle = NULL;
		}

		return xerr;	
	}
	
	void Reset2()
	{
		DeInit2();
		Init2();
	}

	int GetWidth2()
	{
		return m_iVideoWidth;
	}

	int GetHeight2()
	{
		return m_iVideoHeight;
	}

	void SetWidth2(int width)
	{
		m_iVideoWidth = width;
	}

	void SetHeight2(int height)
	{
		m_iVideoHeight = height;
	}
	
	int GetStride2()
	{
		return m_iStride;
	}

	void SetStride2(int stride)
	{
		m_iStride = stride;
	}

	void SetOutputFormat2( int format )
	{
		m_out_format = format;
	}
	
protected:

private:
	bool	m_bSeeIFrame;
	void*	m_dechandle;
	int		m_out_format;
	xvid_dec_stats_t m_xvid_dec_stats;
	int		m_iVideoWidth;
	int		m_iVideoHeight;
	int		m_iStride;
};

#endif

⌨️ 快捷键说明

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