Who*_*ami 7 android opencore android-internet stagefright openmax
我试图了解MediaCodec如何用于硬件解码.
我在android内部的知识非常有限.
以下是我的发现:
有一个xml文件,代表android系统中的编解码器细节.
device/ti/omap3evm/media_codecs.xml for an example.
Run Code Online (Sandbox Code Playgroud)
这意味着,如果我们使用Media Codec从Java Application创建编解码器
MediaCodec codec = MediaCodec.createDecoderByType(type);
Run Code Online (Sandbox Code Playgroud)
应该在xml文件的帮助下找出各自的编码器.
我在做什么?
我试图找出代码的哪一部分正在读取xml并根据给定的'type'找到编解码器.
1)应用层:
MediaCodec codec = MediaCodec.createDecoderByType(type);
Run Code Online (Sandbox Code Playgroud)
2)MediaCodec.java - > [ frameworks/base/media/java/android/media/MediaCodec.java ]
public static MediaCodec createDecoderByType(String type) {
return new MediaCodec(type, true /* nameIsType */, false /* encoder */);
}
Run Code Online (Sandbox Code Playgroud)
3)
private MediaCodec(
String name, boolean nameIsType, boolean encoder) {
native_setup(name, nameIsType, encoder); --> JNI Call.
}
Run Code Online (Sandbox Code Playgroud)
4)JNI实现 - > [ frameworks/base/media/jni/android_media_MediaCodec.cpp ]
static void android_media_MediaCodec_native_setup (..) {
.......
const char *tmp = env->GetStringUTFChars(name, NULL);
sp<JMediaCodec> codec = new JMediaCodec(env, thiz, tmp, nameIsType, encoder); ---> Here
}
Run Code Online (Sandbox Code Playgroud)
来自frameworks/base/media/jni/android_media_MediaCodec.cpp
JMediaCodec::JMediaCodec( ..) {
....
mCodec = MediaCodec::CreateByType(mLooper, name, encoder); //Call goes to libstagefright
.... }
sp<MediaCodec> MediaCodec::CreateByType(
const sp<ALooper> &looper, const char *mime, bool encoder) {
sp<MediaCodec> codec = new MediaCodec(looper);
if (codec->init(mime, true /* nameIsType */, encoder) != OK) { --> HERE.
return NULL;
}
return codec;
}
status_t MediaCodec::init(const char *name, bool nameIsType, bool encoder) {
// MediaCodec
}
Run Code Online (Sandbox Code Playgroud)
我很震惊这个流程.如果有人指出如何推进它将会有很大帮助.
谢谢.
Gan*_*esh 12
让我们一步一步走.
MediaCodec::CreateByType将创建一个新MediaCodec对象
MediaCodec构造函数将创建一个新ACodec对象并将其存储为mCodec
当MediaCodec::init被调用时,它在内部指示底层ACodec来分配OMX通过组件mCodec->initiateAllocateComponent.
ACodec::initiateAllocateComponent 会调用 onAllocateComponent
ACodec::UninitializedState::onAllocateComponent将调用OMXCodec::findMatchingCodecs以查找与MIME从调用者传递的类型匹配的编解码器.
在OMXCodec::findMatchingCodecs,有一个调用来检索MediaCodecListas 的实例MediaCodecList::getInstance().
在MediaCodecList::getInstance,检查是否存在创建的现有对象MediaCodecList或新对象MediaCodecList.
在构造函数中MediaCodecList,调用parseXMLFile文件名为/etc/media_codecs.xml.
parseXMLFile读取内容并存储不同的组件名称等MediaCodecList,也可以用于任何其他编解码器实例.用于解析的辅助函数是startElementHandler.感兴趣的功能可以是addMediaCodec.
通过这些步骤,XML文件内容被翻译成可由任何其他模块使用的列表.MediaCodecList在这里也可以引用Java层.
我跳过了几个跳,其中MediaCodec并ACodec使用消息来实际通信和调用方法,但所提供的流程应该对底层机制有一个很好的了解.
| 归档时间: |
|
| 查看次数: |
3224 次 |
| 最近记录: |