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

MediaCodec如何在Android框架内找到编解码器?,第1张

概述我试图了解MediaCodec如何用于硬件解码. 我在android内部的知识非常有限. 这是我的发现: 有一个xml文件代表android系统中的编解码器细节. device/ti/omap3evm/media_codecs.xml for an example. 这意味着,如果我们使用Media Codec从Java Application创建编解码器 MediaCodec codec = M 我试图了解MediaCodec如何用于硬件解码.

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

这是我的发现:

有一个xml文件代表androID系统中的编解码器细节.

device/tI/Omap3evm/media_codecs.xml for an example.

这意味着,如果我们使用Media Codec从Java Application创建编解码器

MediaCodec codec = MediaCodec.createDecoderByType(type);

应该在xml文件的帮助下找出相应的编码器.

我在做什么?

我试图找出代码的哪一部分正在读取xml并根据给定的’type’找到编解码器.

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,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,encoder) != OK) {  --> HERE.            return NulL;        }        return codec;   }    status_t MediaCodec::init(const char *name,bool nameIsType,bool encoder) {           // MediaCodec    }

我很震惊这个流程.如果有人指出如何推进它将会有很大帮助.

谢谢.

解决方法 让我们一步一步走.

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

通过这些步骤,XML文件内容被翻译成可由任何其他模块使用的列表. MediaCodecList也在Java层公开,可以从here引用.

我已经跳过了一些跳,其中MediaCodec和ACodec使用消息来实际通信和调用方法,但是所提供的流程应该对底层机制有一个很好的了解.

总结

以上是内存溢出为你收集整理的MediaCodec如何在Android框架内找到编解码器?全部内容,希望文章能够帮你解决MediaCodec如何在Android框架内找到编解码器?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://www.outofmemory.cn/web/1137402.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-30
下一篇 2022-05-30

发表评论

登录后才能评论

评论列表(0条)

保存