[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
- [RK3288][Android6.0] 导入新Codec到Multimedia Framework中
- [RK3288][Android6.0] 移植笔记 --- RT5640 Audio Codec添加
- [RK3288][Android6.0] WiFi之Framework的socket(客户端)
- [RK3288][Android6.0] WiFi之Framework扫描过程
- [RK3288][Android6.0] WiFi之Framework连接过程小结
- [RK3288][Android6.0] 调试笔记 --- RT5640播放时的Codec寄存器列表
- [RK3288][Android6.0] 调试笔记 --- RT5640录音时的Codec寄存器列表
- [RK3288][Android6.0] 调试笔记 --- Launcher中隐藏APK图标
- [RK3288][Android6.0] 关于uboot中logo相关知识点小结
- [RK3288][Android6.0] 系统中UID(用户ID)知识点小结
- [RK3288][Android6.0] AUDIO_BECOMING_NOISY作用
- [RK3288][Android6.0] 调试笔记 --- 录音音量从HAL到APP层会变小问题
- [RK3288][Android6.0] Audio中的单声道到双声道的转换处理过程
- [RK3288][Android6.0] 主动从WLAN网络切换到移动数据网络
- multimedia framework
- [RK3288][Android6.0] Camera驱动初始化流程
- [RK3288][Android6.0] Camera HAL流程小结
- [RK3288][Android6.0] StageFright解码流程小结
- day01
- 数据库笔试面试55——表示概念结构的常用方法和描述工具是
- APR协议及RARP协议
- HTML 5 新特性
- 【笔记】YOLO: You Only Look Once:Unified, Real-Time Object Detection
- [RK3288][Android6.0] 导入新Codec到Multimedia Framework中
- HttpUrlConnection与HttpClient的认识(二)-请求头信息的问题
- 数据结构:线性表
- Python3+selenium3环境搭建
- hql查询语句
- easyui的dialog刷新href。。。
- 2017年Linux运维人员必会开源运维工具和体系
- 三维重建面试6:绑架问题/SensorFusion/IMU+CV-小尺度SLAM
- Redis 持久化之RDB(二)