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