[转]rmp4包简单介绍

来源:互联网 发布:javascript源代码下载 编辑:程序博客网 时间:2024/05/16 04:46

 转自 http://ffmpeg.blogbus.com/logs/558715.html 作者:不详

 

原来一直在看的几个mpeg4解码包,有ffmpeg,xvid和divx的,各有特点。ffmpeg兼容性(

指h263dec.c)好能解各种格式的,包括divx和msmpegv3的,但是也带来一定的复杂性,对

于想做优化的人来说,拆解代码的过程比较痛苦。xvid则相对简单了许多,读取码流和核

心代码部分分离的很清楚,只支持avi格式,1.0.1以前的版本只支持I帧和P帧的解码。从速

度上来说ffmpeg要略快于xvid,原因是xvid在VLC解码上做的优化和设计相对较少,查

huffman表的时候都是选取了比较大的表,没有进行分级处理。对于嵌入式应用只有8k,16k

Cache的处理器,效率相当低。我拿到的divx的代码对VLC做了很好的优化,但是代码分格

太差,一个函数能够传上10几个参数,不知道是不是真的是它们的商业版本?

很早就下载下来了rmp4的包,这两天才有时间看它,发现它集合了divx和xvid的优点,代

码可读性好,速度比xvid要快,用纯C代码,在某款RISC处理器上播放QVGA(320x240)码率

500k的码流2000帧时,xvid耗时42ms,rmp4耗时37ms。

于是,又重新到网上search了一下,可以在这个地方下载到

http://www.sigmadesigns.com/products/RMP4_download.htm

下载下来的代码是没有Makefile的,只有VC的工程,但是俺不会用VC啊:( .又读了读它的

接口,大致明白了怎么回事,写了个调用函数,在linux下编译通过。


代码封装如下,有三个关键函数,我喜欢将之拿出来分别调用。
int RMP4_decoder(void * handle, int opt, void * param1)
{
 switch (opt)
 {
 case MP4V_DEC_DECODE :
   return RMP4_dec_processing((Decoder *) handle, (MP4V_DEC_FRAME

*) param1);

 case MP4V_DEC_CREATE :
   return RMP4_dec_open((MP4V_DEC_PARAM *) param1);
 
 case MP4V_DEC_DESTROY :
   return RMP4_dec_close((Decoder *) handle);

 default:
   return MP4V_ERR_FAIL;
    }
}

RMP4_dec_open:打开一个解码器
传入参数 MP4V_DEC_PARAM mp4_param;
主要是设置高和宽,就可以了
mp4_param.width=width;
mp4_param.height=height;
RMP4_dec_open(&mp4_param);该函数会给mp4_param.handle返回一个指针,可以做为

RMP4_dec_processing的第一个参数和RMP4_dec_close的参数,这个RMP4_dec_close当然是

在退出程序的时候调用,不多解释。

RMP4_dec_processing:这个函数是解码一帧图像
除了Decoder *handle参数外的,第二个参数是MP4V_DEC_FRAME mp4_frame
主要配置输入的码流地址,码流长度,输出图像地址,输出图像格式,还有输出图像的步

长(stride,有的地方叫pitch)
mp4_frame.bitstream=bitstream;
mp4_frame.length=mp4_frame.length;
mp4_frame.image=output_buf;
mp4_frame.stride=stride;
mp4_frame.colorspace=MP4V_CSP_I420;//这个颜色空间有很多宏,按需要选一个
然后,调用
RMP4_dec_processing(mp4_param.handle,&mp4_frame);
当然,这个函数会调用很多次了,因为每次只能解码一帧:),所以必须自己来维护

mp4_frame的位流指针和位流长度。要注意的是,每次调用完RMP4_dec_processing函数之

后,mp4_frame的mp4_frame.length会被修改为解码一帧后用掉的字节数,所以下一帧解码

应该从位流的这个字节数后接着往下解码。

 

原创粉丝点击