• 2004-12-28

    rmp4包简单介绍

    版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明
    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会被修改为解码一帧后用掉的字节数,所以下一帧解码

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

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


    收藏到:Del.icio.us




    评论

  • 能给我一份rmp4的代码吗?谢谢
  • 能给我一份rmp4代码吗,ffmpeg的也要,谢谢
  • 能给RMP4代码看看吗 谢谢
  • 能留个联系方式吗?我正在做RMP4的封装,有很多问题不懂,麻烦了
  • rmp4代码不好下了,也给我一份吧,谢谢了
  • 能将RMP4的源代码共享一下吗?非常感谢!
  • RMP4代码下不到了,你能提供一份给我吗?thanks
  • RMP4代码下不到了,你能提供一份给我吗?一起研究