转载调用xvid实现解码 xvid解码器 下载

view plaincopy to clipboardprint?
///////////////////
intinit_decoder()
{
intret;
xvid_gbl_init_txvid_gbl_init;
xvid_dec_create_txvid_dec_create;

memset(&xvid_gbl_init, 0,sizeof(xvid_gbl_init_t));
memset(&xvid_dec_create, 0,sizeof(xvid_dec_create_t));

XDIM = 0;
YDIM = 0;
FORMAT = 0;
CSP =XVID_CSP_BGR;
BPP =3;

dec_handle =NULL ;

mp4_buffer =NULL ;
out_buffer =NULL ;
mp4_ptr =NULL ;

xvid_gbl_init.version =XVID_VERSION;

xvid_gbl_init.cpu_flags = 0; // use assemblyoptimized
xvid_gbl_init.debug = 0;// set debug level 0, no debugoutput
xvid_global(NULL, 0, &xvid_gbl_init, NULL);//XVID初始化


xvid_dec_create.version =XVID_VERSION;

xvid_dec_create.width = 0;//解码后图像的宽度如果事先已经知道那么这里就填写 否则设置0
xvid_dec_create.height = 0;//解码后图像的高度 如果事先已经知道那么这里就填写否则设置0
ret =xvid_decore(NULL, XVID_DEC_CREATE,&xvid_dec_create, NULL);//创建xvid解码实例
dec_handle =xvid_dec_create.handle;////将创建的句柄 赋值 给dec_handle
return(ret);
}
//////////////////////////////////////////////////////////////////
int decode_one_frame(unsigned char *istream, unsigned char*ostream,
int istream_size, xvid_dec_stats_t*xvid_dec_stats)
{
intret;
xvid_dec_frame_txvid_dec_frame;

memset(&xvid_dec_frame, 0,sizeof(xvid_dec_frame_t));
memset(xvid_dec_stats, 0,sizeof(xvid_dec_stats_t));

xvid_dec_frame.version =XVID_VERSION;
xvid_dec_stats->version =XVID_VERSION;

xvid_dec_frame.general= 0;

xvid_dec_frame.bitstream= istream;//待解码的数据
xvid_dec_frame.length= istream_size;//待解码数据的长度

xvid_dec_frame.output.plane[0] =ostream;//解码完成后存放原始视频流的缓冲区
xvid_dec_frame.output.stride[0] =XDIM*BPP;//步长即一行像素所占的空间大小
xvid_dec_frame.output.csp = CSP;//输出时 采用的色场空间 这里 XVID_CSP_BGR即采用RGB
ret =xvid_decore(dec_handle, XVID_DEC_DECODE,&xvid_dec_frame, xvid_dec_stats);//ret 值解码前帧的长度
return(ret);
}
///调用方式
do {

used_bytes = decode_one_frame(mp4_ptr, out_buffer, useful_bytes,&xvid_dec_stats);

if(xvid_dec_stats.type == XVID_TYPE_VOL)//如果输入一帧包含 VOL重新获得输出图像的宽度和高度
{

if(XDIM*YDIM <xvid_dec_stats.data.vol.width*xvid_dec_stats.data.vol.height)
{

XDIM =xvid_dec_stats.data.vol.width;
YDIM =xvid_dec_stats.data.vol.height;


if(out_buffer)free(out_buffer);

out_buffer = (unsigned char*)malloc(XDIM*YDIM*4);//动态调整输出流存储空间的大小
if(out_buffer == NULL)
goto free_all_memory;
}
}

if(used_bytes > 0){
mp4_ptr += used_bytes;
useful_bytes -=used_bytes;
}
} while (xvid_dec_stats.type <= 0&& useful_bytes >MIN_USEFUL_BYTES);


draw_image(out_buffer) ;
///////////////////
int init_decoder()
转载调用xvid实现解码 xvid解码器 下载
{
int ret;
xvid_gbl_init_txvid_gbl_init;
xvid_dec_create_t xvid_dec_create;

memset(&xvid_gbl_init, 0,sizeof(xvid_gbl_init_t));
memset(&xvid_dec_create, 0,sizeof(xvid_dec_create_t));

XDIM = 0 ;
YDIM = 0 ;
FORMAT = 0 ;
CSP = XVID_CSP_BGR;
BPP = 3;

dec_handle = NULL ;

mp4_buffer = NULL ;
out_buffer = NULL ;
mp4_ptr = NULL ;

xvid_gbl_init.version = XVID_VERSION;

xvid_gbl_init.cpu_flags = 0; //use assembly optimized
xvid_gbl_init.debug = 0;// set debug level 0, no debug output
xvid_global(NULL, 0,&xvid_gbl_init, NULL);//XVID 初始化


xvid_dec_create.version = XVID_VERSION;

xvid_dec_create.width =0;//解码后图像的宽度 如果事先已经知道 那么这里就填写 否则设置0
xvid_dec_create.height = 0;//解码后图像的高度如果事先已经知道那么这里就填写 否则设置0
ret = xvid_decore(NULL, XVID_DEC_CREATE,&xvid_dec_create, NULL);//创建xvid 解码实例
dec_handle = xvid_dec_create.handle;////将创建的句柄赋值给 dec_handle
return(ret);
}
//////////////////////////////////////////////////////////////////
int decode_one_frame(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));
memset(xvid_dec_stats, 0,sizeof(xvid_dec_stats_t));

xvid_dec_frame.version = XVID_VERSION;
xvid_dec_stats->version =XVID_VERSION;

xvid_dec_frame.general= 0;

xvid_dec_frame.bitstream= istream;//待解码的数据
xvid_dec_frame.length= istream_size;//待解码数据的长度

xvid_dec_frame.output.plane[0]= ostream;//解码完成后 存放原始视频流的缓冲区
xvid_dec_frame.output.stride[0] =XDIM*BPP;//步长即一行像素所占的空间大小
xvid_dec_frame.output.csp = CSP;//输出时 采用的色场空间 这里XVID_CSP_BGR 即采用RGB
ret = xvid_decore(dec_handle, XVID_DEC_DECODE,&xvid_dec_frame, xvid_dec_stats);//ret 值解码前帧的长度
return(ret);
}
///调用方式
do {

used_bytes =decode_one_frame(mp4_ptr, out_buffer, useful_bytes,&xvid_dec_stats);

if(xvid_dec_stats.type== XVID_TYPE_VOL)//如果输入一帧包含 VOL 重新获得 输出图像的宽度和高度
{

if(XDIM*YDIM<xvid_dec_stats.data.vol.width*xvid_dec_stats.data.vol.height)
{

XDIM= xvid_dec_stats.data.vol.width;
YDIM= xvid_dec_stats.data.vol.height;


if(out_buffer)free(out_buffer);

out_buffer= (unsigned char*)malloc(XDIM*YDIM*4);//动态调整 输出流 存储空间的大小
if(out_buffer== NULL)
gotofree_all_memory;
}
}

if(used_bytes> 0) {
mp4_ptr+= used_bytes;
useful_bytes-= used_bytes;
}
} while (xvid_dec_stats.type<= 0 && useful_bytes> MIN_USEFUL_BYTES);


draw_image(out_buffer);

2 Xvid编解码 实践

关于编码器输入格式设置:

其中 en->width图像采集时的宽度(以像素为单位)

switch( input->format )
{
case FORMAT_RAW_BGR24:
xvid_enc_frame.input.csp =XVID_CSP_BGR;
xvid_enc_frame.input.stride[0]= en->width * 3;
break;
case FORMAT_RAW_UYVY:
xvid_enc_frame.input.csp =XVID_CSP_UYVY;
xvid_enc_frame.input.stride[0]= en->width * 2;
break;
case FORMAT_RAW_YUY2:
xvid_enc_frame.input.csp =XVID_CSP_YUY2;
xvid_enc_frame.input.stride[0]= en->width * 2;
break;
}

解码器输出格式设置:

switch( output->format )
{
case FORMAT_RAW_BGR24:
xvid_dec_frame.output.stride[0] = m_width*3;
xvid_dec_frame.output.csp=XVID_CSP_BGR;

break;
case FORMAT_RAW_YUY2:
xvid_dec_frame.output.csp =XVID_CSP_YUY2;
xvid_dec_frame.output.stride[0]= en->width *2;
break;
}

特别注意的是:

在xvid 中stride 步长与 视频格式有密切格式 一旦设置错误导致 编解码异常终止。

xvid使用小技巧:

(1)解决:使用xvid编解码rtp传输directshow播放远程视频时开始会出现绿屏但可以看到图像轮廓,在经过几秒后正常

很可能的一个原因是 关键帧丢失 方法:

减小关键帧的间隔


//最大I帧(关键帧)间隔,一般设置成帧数的10倍

xvid_enc_create.max_key_interval =1;//(int)-1;//--default 10s

(2)(获得编码后 帧长度)

ret = xvid_encore(m_enc_handle, XVID_ENC_ENCODE,&xvid_enc_frame,&xvid_enc_stats);

m_enc_frame_length=xvid_enc_stats.length;//编码获得的帧长度

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/markman101/archive/2010/09/21/5899836.aspx

  

爱华网本文地址 » http://www.aihuau.com/a/25101014/191791.html

更多阅读

暴风影音如何下载安装解码器 暴风影音解码器

暴风影音如何下载安装解码器——简介暴风影音需要安装一些解码器之后才能有效的播放一些视频格式,所以安装解码器时必要的。通过这篇经验,教教大家如何下载安装暴风影音的解码器,希望能够帮助到大家。暴风影音如何下载安装解码器——

电脑如何播放dvd之DVD播放器下载及安装 如何安装dvd播放器

电脑如何播放dvd之DVD播放器下载及安装——简介 你知道电脑如何播放DVD么?呵呵,你可能会说,这个问题有点蠢。随便找个播放器都能播放啦。这俺可不敢苟同,虽然说现在的播放器多得很,但高清的光碟放在普通播放器上,我想你看着也没什么感觉。

视频解码器怎么用 高清解码器

视频解码器怎么用——简介在windows系统中有一个系统自带的播放器,用它可以播放一般格式的视频,但是很有限,有很多流行的视频格式并不支持,如果要想让系统自带的播放器能播放大多数的视频格式,就需要用到一种视频解码器的软件。一般一些

关于纯笛的解码器DACA-1 daca

纯笛的解码器DAC A-1问世后基本改变了纯笛的历程,一个好的音源作用可以有此看出。现在使用电脑听音乐的人越来越多,但是毕竟电脑作为音源效果是不够理想的。很多IT公司也推出音乐声卡,解码器,其实作为HIFI器材跟IT还是有很大的差别。

linux配置MP3RMVB解码器_Andy rmvb解码器realcodec

linux 配置 MP3 RMVB 解码器加入163源 不然不能安装 MP3 和RM解码器su -c 'yum localinstall --nogpgcheckhttp://mirrors.163.com/rpmfusion/free/fedora/rpmfusion-free-release-stable.noarch.rpmhttp://mirrors.163.com/rpmfu

声明:《转载调用xvid实现解码 xvid解码器 下载》为网友牛牛丶哞分享!如侵犯到您的合法权益请联系我们删除