微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 手机设计讨论 > MTK手机平台交流 > 如何调用Open MAX(OMX IL)接口 来使用平台HW实现音视频的编解码?

如何调用Open MAX(OMX IL)接口 来使用平台HW实现音视频的编解码?

时间:10-02 整理:3721RD 点击:
[DESCRIPTION]
渐渐的3rd Party开始基于android开发类似视频通话、Video Editor的功能,需要使用比较底层的CodecAPI,
Android只是集成了OMX IL,这篇FAQ就是告诉你如何使用MediaTek各平台上的Video/Audio Codec。
1、由于Android在OMX IL上面又包了一层,叫做OMXCodec,可以实现跨Process通信,使用起来非常方便,所以推荐使用OMXCodec。
2、据了解Android后续会逐渐使用MediaCodec->ACodec->OMXIL,所以也可以直接使用MediaCodec。
3、当然也是可以直接使用OMX IL。
[SOLUTION]
上面这几种Case,具体的方法如下:
OMXCodec
相应的Sample Code:
php?mod=tag&id=6090" target="_blank" class="relatedlink">Frameworks\av\media\libstagefright\omx\tests\omxcodec_ut\OMXCodec_ut.cpp/h
上面这个Sample Code因为Google默认是没有编译的,android.mk都注释掉了,所以无法直接Run这个UT,不过透过这个sample code来study OMXCodec如何使用还是很好的。
MediaCodec
可以直接参考wifi Display这边使用AVC Encoder的代码:
frameworks\av\media\libstagefright\wifi-display\source\Converter.cpp
OMX IL
若需要直接使用OMX IL的话,最关键的是得到OMX Handle,其它的用法就是照着Spec来了。
可以直接参考下面这支文件:
alps\frameworks\av\media\libstagefright\omx\OMXMaster.cpp
1、首先透过
void OMXMaster::addVendorPlugin() {
addPlugin("libstagefrighthw.so");
}
来加载mtk的OMX Plug in,MTK平台的plugin的名叫libstagefrighthw.so
2、然后如下,addPlugin中会使用dlopen & dlsys这一套Interface来getcreateOMXPlugin,并添加到mPlugins里面去。
void OMXMaster::addPlugin(const char *libname) {
mVendorLibHandle = dlopen(libname, RTLD_NOW);
if (mVendorLibHandle == NULL) {
return;
}
typedef OMXPluginBase *(*CreateOMXPluginFunc)();
CreateOMXPluginFunc createOMXPlugin =
(CreateOMXPluginFunc)dlsym(
mVendorLibHandle, "createOMXPlugin");
if (!createOMXPlugin)
createOMXPlugin = (CreateOMXPluginFunc)dlsym(
mVendorLibHandle, "_ZN7android15createOMXPluginEv");
if (createOMXPlugin) {
addPlugin((*createOMXPlugin)());
}
}
3、进行了上面的操作之后就可以进行下面这个动作了,最重要的两个参数,name对应codec的名称。component即对应的codec返回来的OMX Handle了,后面你们就可以使用该component来调用OMX标准的Interface了。
OMX_ERRORTYPE OMXMaster::makeComponentInstance(
const char *name,
const OMX_CALLBACKTYPE *callbacks,
OMX_PTR appData,
OMX_COMPONENTTYPE **component)
PS: Step2中的name你们可以参考下面这个文件中的name="OMX.MTK.VIDEO.ENCODER.MPEG4"之类的字样,或参考
OMXCodec.cpp中对MediaCodeCLIst.cpp的使用。
alps/mediatek/config/common/media_codecs.xml
附:
1、官网上的Spec的路径如下:
Khronos Group — OpenMAX IL 1.1.2 Specification
http://www.khronos.org/registry/omxil/specs/OpenMAX_IL_1_1_2_Specification.pdf
2、如何获得平台针对各个Codec Support能力?
2.1 关于get平台Video Encoder能力的Function,你们可以参考下面这个文件中的函数,很短,应该蛮容易看懂的.
/frameworks/base/media/libmedia/MediaProfiles.cpp
getVideoCapability()函数中对eVEncDrvQueryCapability()的使用。
2.2 关于Video Decoder能力的Function,可以参考
/frameworks/base/media/libstagefright/MPEG4Extractor.cpp
文件中对eVDecDrvQueryCapability()的使用。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top