Stagefright中增加Codec支持
来源:互联网 发布:注册淘宝店铺流程图片 编辑:程序博客网 时间:2024/06/05 02:55
方法1:注册Plugin
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
- Stagefright中增加Codec支持
- Stagefright 增加 flv 支持
- 在StageFright中增加对FLV的支持
- Android平台Stagefright中增加flv/f4v支持及相关原理介绍
- Android平台Stagefright中增加flv/f4v支持及相关原理介绍
- Android平台Stagefright中增加flv/f4v支持及相关原理介绍
- Android平台Stagefright中增加flv/f4v支持及相关原理介绍
- SIPPhone toolkit 增加 iLBC codec 支持
- stagefright的codec---1
- stagefright的codec---2
- ffmpeg 中支持的codec
- stagefright 支持的demuxer
- ffmpeg支持的codec
- 向android stagefright增加软解码库
- 向android stagefright增加软解码库
- sourceInsight中增加.hh .cc支持及其它语言支持
- 项目开发中,快速增加 Rspec的支持, 快速增加 spork 和 guard 的支持
- StageFright
- D'fusion使用心得
- PHP SAPI---CLI
- 第六周项目一改错
- 计算2进制数中1的个数
- Android 源码目录结构说明
- Stagefright中增加Codec支持
- 新手的编程之路
- 用php cli写一个shell外壳
- 邮件服务
- Delphi Thread 多线程编程(6)
- JavaScript触摸与手势事件
- 使用maven加载项目中缺少的jar包
- MongoDB 2.4的新特性
- 自动登录的实现