Stagefright中OMXCodec中根据Extractor中的MIME创建对应编解码器组件的流程如下:
所有支持的编解码类型都是在AwesomePlayer初始化的时候就创建好的.
硬编解码器从hardware/XXX/media/libstagefrighthw/libstagefrighthw.so中加载
软编解码器从frameworks/av/media/libstagefright/codec/libstagefright_soft_XXX.so中加载
所有支持的媒体类型可以在文件夹中 frameworks/av/media/libstagefright/data/ 中看到
这些文件会在厂商定制的时候覆盖
硬编解码器和软编解码器的区别是命名方式
static bool IsSoftwareCodec(const char *componentName) {
if (!strncmp("OMX.google.", componentName, 11)) {
return true;
}
#ifdef DOLBY_UDC
if (!strncmp("OMX.dolby.", componentName, 10)) {
return true;
}
#endif // DOLBY_END
if (!strncmp("OMX.", componentName, 4)) {
return false;
}
return true;
}
如果需要添加新支持的媒体类型或者编解码器组件, 需要一下步骤
硬编解码
- 将编解码相关文件放在hardware/XXX/media/libstagefrighthw/ 继承OMXPluginBase
- 在Android.mk设置LOCAL_MODULE := libstagefrighthw
- 将所支持编解码的媒体文件类型添加到media_codec.xml中
- 在OMXCodec.cpp中将支持的MIME类型添加到kMimeToRole[]
软编解码
- 将文件放到frameworks/av/media/libstagefright/codecs/
- 继承SimpleSoftOMXComponent
- 在Android.mk设置LOCAL_MODULE := libstagefright_soft_XXX
- 将所支持编解码的媒体文件类型定义在media_codec.xml中
- 在OMXCodec.cpp中将新支持的MIME类型添加到kMimeToRole[]
- 在SoftOMXPlugin.cpp添加编解码组件对应的名字到kComponents中,格式 { “OMX.google.aac.decoder”, “XXX”, “audio_decoder.aac” }