rmp4包简单介绍

原来一直在看的几个mpeg4解码包,有ffmpeg,xvid和divx的,各有特点。ffmpeg兼容性(指h263dec.c)好能解各种格式的,包括divx和msmpegv3的,但是也带来一定的复杂性,对于想做优化的人来说,拆解代码的过程比较痛苦。xvid则相对简单了许多,读取码流和核心代码部分分离的很清楚,只支持avi格式,1.0.1以前的版本只支持I帧和P帧的解码。从速度上来说ffmpeg要略快于xvid,原因是xvid在VLC解码上做的优化和设计相对较少,查huffman表的时候都是选取了比较大的表,没有进行分级处理。对于嵌入式应用只有8k,16kCache的处理器,效率相当低。我拿到的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会被修改为解码一帧后用掉的字节数,所以下一帧解码应该从位流的这个字节数后接着往下解码。

好困,没有其它代码了:(,俺家没有编译器。

转自http://wangjiajun53880.blog.163.com/blog/static/11700139420106217565061/

你可能感兴趣的:(rmp4包简单介绍)