首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MediaCodec是如何在Android框架内找到编解码器的?

MediaCodec是如何在Android框架内找到编解码器的?
EN

Stack Overflow用户
提问于 2014-04-04 08:08:18
回答 1查看 4.4K关注 0票数 7

我正在努力理解MediaCodec是如何用于硬件解码的。

我在android内部的知识非常有限。

这里是我的发现:

有一个xml文件表示android系统中的编解码器细节。

代码语言:javascript
复制
 device/ti/omap3evm/media_codecs.xml for an example. 

这意味着,如果我们使用Media从Java应用程序中创建一个编解码器

代码语言:javascript
复制
MediaCodec codec = MediaCodec.createDecoderByType(type);

它应该在xml文件的帮助下找到相应的编码器。

我在做什么?

我试图弄清楚代码的哪一部分正在读取xml,并根据给定的“类型”找到编解码器。

1)应用层:

代码语言:javascript
复制
   MediaCodec codec = MediaCodec.createDecoderByType(type);

2) frameworks/base/media/java/android/media/MediaCodec.java MediaCodec.java ->

代码语言:javascript
复制
     public static MediaCodec createDecoderByType(String type) {

    return new MediaCodec(type, true /* nameIsType */, false /* encoder */);
}

3)

代码语言:javascript
复制
private MediaCodec(
        String name, boolean nameIsType, boolean encoder) {
    native_setup(name, nameIsType, encoder);    --> JNI Call.
}

4) JNI实现frameworks/base/media/jni/android_media_MediaCodec.cpp ->

代码语言:javascript
复制
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
}

来自frameworks/base/media/jni/android_media_MediaCodec.cpp

代码语言:javascript
复制
    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
    }

我被这股水流深深打动了。如果有人指出如何把它向前推进会有很大帮助。

谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-04-05 02:07:30

让我们一步一步地走。

  1. MediaCodec::CreateByType将创建一个新的MediaCodec对象
  2. MediaCodec构造函数将创建一个新的ACodec对象并将其存储为mCodec
  3. 当调用MediaCodec::init时,它在内部指示底层ACodec通过mCodec->initiateAllocateComponent分配OMX组件。
  4. ACodec::initiateAllocateComponent将调用onAllocateComponent
  5. ACodec::UninitializedState::onAllocateComponent将调用OMXCodec::findMatchingCodecs来查找与调用方传递的MIME类型匹配的编解码器。
  6. OMXCodec::findMatchingCodecs中,有一个调用将MediaCodecList的实例检索为MediaCodecList::getInstance()
  7. MediaCodecList::getInstance中,会检查是否存在现有的MediaCodecList或其他 is created
  8. MediaCodecList的构造函数中,调用文件名为/etc/media_codecs.xmlparseXMLFile
  9. parseXMLFile读取内容并将不同的组件名称等存储到MediaCodecList中,这也可用于任何其他编解码实例。用于解析的辅助函数是startElementHandler。感兴趣的函数可以是addMediaCodec

通过这些步骤,XML文件内容被转换成一个列表,该列表可以被任何其他模块使用。MediaCodecList也是在Java层公开的,可以从here引用。

我跳过了几个跳,其中MediaCodecACodec使用消息来实际通信和调用方法,但是提供的流应该给出一个关于底层机制的好主意。

票数 12
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22857059

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档