[RK3288][Android6.0] 导入新Codec到Multimedia Framework中

来源:互联网 发布:神盾局特工 it是什么 编辑:程序博客网 时间:2024/05/18 05:32

Platform: Rockchip
OS: Android 6.0
Kernel: 3.10.92

    • 概要
    • 修改过程
      • 添加配置
      • 创建components
      • 生成库
      • 创建plugin
    • 参考

概要

Stagefright可以通过OpenMAX IL来定制一个基于hardware的codecs,这里叫做components。不过要以plugin的形式提供,并且库的名字叫做libstagefrighthw.so,库里面的接口要遵循OpenMAX IL定制标准。


修改过程

添加配置

这里以添加一个Encoder为例。
参照vendor/rockchip/common/vpu/etc/media_codecs.xml编码部分

    <Encoders>        <MediaCodec name="OMX.rk.video_encoder.avc" type="video/avc" >            <Limit name="size" min="176x144" max="1920x1088" />            <Limit name="alignment" value="16x8" />            <Limit name="bitrate" range="1-40000000" />            <Feature name="bitrate-modes" value="VBR,CBR" />        <Limit name="concurrent-instances" max="32" />        </MediaCodec>    </Encoders>

创建components

根据OpenMAX IL标准创建component, 接口见
frameworks/native/include/media/OpenMAX/OMX_Component.h
由于rk不开源,这部分可参考softcodec部分
frameworks/av/media/libstagefright/codecs/avc/enc/SoftAVCEncoder.cpp

android::SoftOMXComponent *createSoftOMXComponent(        const char *name, const OMX_CALLBACKTYPE *callbacks,        OMX_PTR appData, OMX_COMPONENTTYPE **component) {    return new android::SoftAVCEncoder(name, callbacks, appData, component);}

生成库

库的名字一定要是libstagefrighthw.so
stagefright的调用

void OMXMaster::addVendorPlugin() {    addPlugin("libstagefrighthw.so");}

改动参照 hardware/rockchip/librkvpu/libstagefrighthw/Android.mk
LOCAL_MODULE := libstagefrighthw

创建plugin

stagefright的调用

void OMXMaster::addPlugin(const char *libname) {    mVendorLibHandle = dlopen(libname, RTLD_NOW);......    typedef OMXPluginBase *(*CreateOMXPluginFunc)();    CreateOMXPluginFunc createOMXPlugin =        (CreateOMXPluginFunc)dlsym(                mVendorLibHandle, "createOMXPlugin");......    if (createOMXPlugin) {        addPlugin((*createOMXPlugin)());    }}

接口标准见
frameworks/native/include/media/hardware/OMXPluginBase.h
例如createOMXPlugin()可参照
hardware/rockchip/librkvpu/libstagefrighthw/RKOMXPlugin.cpp

OMXPluginBase *createOMXPlugin() {    return new RKOMXPlugin;}
RKOMXPlugin::RKOMXPlugin(){#if defined(USE_ROCKCHIP_OMX)   AddCore("libOMX_Core.so");#endif}

还有两个比较重要的是makeComponentInstance()和AddCore().


参考

Android: How to integrate a decoder to multimedia framework
Implementing custom codecs

阅读全文
1 0
原创粉丝点击