MediaCodec如何在Android的框架内find编解码器?

我想了解MediaCodec如何用于硬件解码。

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

这是我的发现:

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

device/ti/omap3evm/media_codecs.xml for an example. 

也就是说,如果我们使用Media Codec从Java应用程序创build一个编解码器

 MediaCodec codec = MediaCodec.createDecoderByType(type); 

它应该find各自的编码器的帮助下的XML文件。

我在做什么?

我试图找出我们的哪部分代码正在读取xml,并根据给定的'type'find编解码器。

1)应用层:

  MediaCodec codec = MediaCodec.createDecoderByType(type); 

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 */); } 

3)

 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 ]

 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

  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 } 

我感到震惊。 如果有人指出如何把握这一点,将会有很大的帮助。

谢谢。

Solutions Collecting From Web of "MediaCodec如何在Android的框架内find编解码器?"

让我们一步一步来看stream程。

  1. MediaCodec::CreateByType将创build一个新的MediaCodec对象

  2. MediaCodec构造函数将创build一个新的ACodec对象并将其存储为mCodec

  3. 当调用MediaCodec::init ,它在内部指示底层ACodec通过mCodec->initiateAllocateComponent分配OMX组件。

  4. ACodec::initiateAllocateComponent将调用onAllocateComponent

  5. ACodec::UninitializedState::onAllocateComponent将调用OMXCodec::findMatchingCodecs来查找匹配从调用者传递的MIMEtypes的编解码器。

  6. OMXCodec::findMatchingCodecs ,有一个调用来检索MediaCodecList一个实例作为MediaCodecList::getInstance()

  7. MediaCodecList::getInstance ,检查是否存在现有MediaCodecList ,否则将创buildMediaCodecList的新对象 。

  8. MediaCodecList的构造函数中,调用parseXMLFile ,文件名为/etc/media_codecs.xml

  9. parseXMLFile读取内容并将不同的组件名称等存储到MediaCodecList ,也可以用于任何其他编解码器实例。 用于parsing的辅助函数是startElementHandler 。 感兴趣的function可以是addMediaCodec

通过这些步骤, XML文件的内容被转换成可供任何其他模块使用的列表。 MediaCodecList也暴露在Java层,可以从这里引用。

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