Stagefright中增加Codec支持
2013-04-10 13:39
537 查看
方法1:注册Plugin
device/qcom/common/media/media_codecs.xml
如果是Decoder则在xml文件的Decoder部分加一行描述新加Codec的信息,注意Codec名称必须以OMX.开头:
如果Codec需要初始化,则可以在OMXCodec::configureCodec中加入codec相关的初始化代码:
实现Plugin并编译成libstagefright_my.so:
OMXMaster.cpp
在SoftOMXPlugin.cpp中,增加一行
然后实现库文件libstagefright_aac_my.so,在其中实现接口函数SoftOMXComponent *(*CreateSoftOMXComponentFunc)(const char *, const OMX_CALLBACKTYPE *, OMX_PTR, OMX_COMPONENTTYPE **);。
方法2:
实现OMXPluginBase接口及函数OMXPluginBase *(*CreateOMXPluginFunc)(),并在media_codecs.xml中加入对应描述。
方法3:
实现一整套NuPlayer机制+OMX Codec
device/qcom/common/media/media_codecs.xml
<MediaCodecs> <Encoders> <!-- Audio Hardware -->
<MediaCodec name="OMX.google.aac.encoder" type="audio/mp4a-latm" />
<MediaCodec name="OMX.qcom.audio.encoder.aac" type="audio/mp4a-latm" />
...
</Encoders> <Decoders>
<!-- Audio Hardware --> <MediaCodec name="OMX.qcom.audio.decoder.Qcelp13Hw" type="audio/qcelp" > <Quirk name="requires-global-flush" /> </MediaCodec> <MediaCodec name="OMX.qcom.audio.decoder.evrchw" type="audio/evrc" > <Quirk name="requires-global-flush" /> </MediaCodec>
如果是Decoder则在xml文件的Decoder部分加一行描述新加Codec的信息,注意Codec名称必须以OMX.开头:
<MediaCodec name="OMX.my.aac" type="audio/mp4a-latm" />
如果Codec需要初始化,则可以在OMXCodec::configureCodec中加入codec相关的初始化代码:
status_t OMXCodec::configureCodec(const sp<MetaData> &meta) { ... } else if (meta->findData(kKeyAVCC, &type, &data, &size)) { // Parse the AVCDecoderConfigurationRecord unsigned profile, level; status_t err; if ((err = parseAVCCodecSpecificData( data, size, &profile, &level)) != OK) { ALOGE("Malformed AVC codec specific data."); return err; } QCOMXCodec::checkIfInterlaced((const uint8_t *)data, meta);
实现Plugin并编译成libstagefright_my.so:
OMXMaster.cpp
OMXMaster::OMXMaster() : mVendorLibHandle(NULL) { addVendorPlugin(); addPlugin(new SoftOMXPlugin); } void OMXMaster::addVendorPlugin() { addPlugin("libstagefrighthw.so"); } 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)()); } }
void OMXMaster::addPlugin(OMXPluginBase *plugin) { Mutex::Autolock autoLock(mLock); mPlugins.push_back(plugin); OMX_U32 index = 0; char name[128]; OMX_ERRORTYPE err; while ((err = plugin->enumerateComponents( name, sizeof(name), index++)) == OMX_ErrorNone) { String8 name8(name); if (mPluginByComponentName.indexOfKey(name8) >= 0) { ALOGE("A component of name '%s' already exists, ignoring this one.", name8.string()); continue; } mPluginByComponentName.add(name8, plugin); } if (err != OMX_ErrorNoMore) { ALOGE("OMX plugin failed w/ error 0x%08x after registering %d " "components", err, mPluginByComponentName.size()); } }
OMX_ERRORTYPE OMXMaster::makeComponentInstance( const char *name, const OMX_CALLBACKTYPE *callbacks, OMX_PTR appData, OMX_COMPONENTTYPE **component) { Mutex::Autolock autoLock(mLock); *component = NULL; ssize_t index = mPluginByComponentName.indexOfKey(String8(name)); if (index < 0) { return OMX_ErrorInvalidComponentName; } OMXPluginBase *plugin = mPluginByComponentName.valueAt(index); OMX_ERRORTYPE err = plugin->makeComponentInstance(name, callbacks, appData, component); if (err != OMX_ErrorNone) { return err; } mPluginByInstance.add(*component, plugin); return err; }
在SoftOMXPlugin.cpp中,增加一行
static const struct { const char *mName; const char *mLibNameSuffix; const char *mRole; } kComponents[] = { { "OMX.google.aac.decoder", "aacdec", "audio_decoder.aac" }, { "OMX.my.aac", "aac_my", "audio/mp4a-latm" },
然后实现库文件libstagefright_aac_my.so,在其中实现接口函数SoftOMXComponent *(*CreateSoftOMXComponentFunc)(const char *, const OMX_CALLBACKTYPE *, OMX_PTR, OMX_COMPONENTTYPE **);。
方法2:
实现OMXPluginBase接口及函数OMXPluginBase *(*CreateOMXPluginFunc)(),并在media_codecs.xml中加入对应描述。
struct OMXPluginBase { OMXPluginBase() {} virtual ~OMXPluginBase() {} virtual OMX_ERRORTYPE makeComponentInstance( const char *name, const OMX_CALLBACKTYPE *callbacks, OMX_PTR appData, OMX_COMPONENTTYPE **component) = 0; virtual OMX_ERRORTYPE destroyComponentInstance( OMX_COMPONENTTYPE *component) = 0; virtual OMX_ERRORTYPE enumerateComponents( OMX_STRING name, size_t size, OMX_U32 index) = 0; virtual OMX_ERRORTYPE getRolesOfComponent( const char *name, Vector<String8> *roles) = 0; private: OMXPluginBase(const OMXPluginBase &); OMXPluginBase &operator=(const OMXPluginBase &); };
方法3:
实现一整套NuPlayer机制+OMX Codec
相关文章推荐
- Android平台Stagefright中增加flv/f4v支持及相关原理介绍
- Android平台Stagefright中增加flv/f4v支持及相关原理介绍
- 在StageFright中增加对FLV的支持
- SIPPhone toolkit 增加 iLBC codec 支持
- Android平台Stagefright中增加flv/f4v支持及相关原理介绍
- Stagefright 增加 flv 支持
- Android平台Stagefright中增加flv/f4v支持及相关原理介绍
- 猎豹浏览器新版更新 增加猎豹商店支持第三方插件
- 织梦DEDECMS中增加父栏目调用,以及多级支持currentstyle的方法
- 增加es6 webpack支持
- MyEclipse6.5增加对Tomcat7的支持
- docker打包centos增加中文支持
- 传言:Windows Phone 7“芒果”更新将增加 HTML5 支持
- vb6代码编辑框增加滚轮支持
- cudaRay,增加了对图像文件的支持。
- 增加SVN的Tunnel支持,遇到can't create tunnel的朋友注意了。
- Linux增加JSON支持
- android 增加 在build.prop 中的ro.sf.hwrotation角度支持
- KGTP中增加对GDB命令“set trace-buffer-size”的支持 - Week 2
- Eclipse rcp 开发 : 自定义导航视图CNF(2)为导航视图增加数据提供和右键支持