Android O media difference(add HIDL)

1、 初始化
ACodec::UninitializedState::onAllocateComponent(…)中首先会调client.connect(&trebleFlag),其中会根据property_get_bool("persist.media.treble_omx", true)选择采用的机制,若为true则走新的Treble那一套流程,为false则走原来老的Legacy这一套流程。
Legacy调connectTreble(),后面与原来的一样,获取MediaCodecService,然后通过其getOMX得到OMX的入口。(New一个OMX,其中又会new一个OMXMaster)
Treble调connectTreble(),会走新的HAL接口,这里相当于是HAL的一个client:
a、 先getService得到HAL提供的IOmx服务BpHwOmx
b、 然后new一个LWOmx(WOmx.cpp),并将其mBase初始化成刚得到的IOmx服务,这样就得到了HAL这边的Omx入口。后面ACodec通过client.interface()也就得到了这个LWOmx。


2、 allocateNode
ACodec中调用omx->allocateNode,其中调到LWOmx::allocateNode(WOmx.cpp),这里又会调到Hal的BpHwOmx::allocateNode(OmxAll.cpp,第三个参数中还会new一个LWOmxNode,并将mBase初始化成IOmxNode服务,于是得到了HAL的OmxNode入口),然后调用到_hidl_mImpl->allocateNode(这里的_hidl_mImpl就是Omx的指针),所以接着就调到了函数Omx::allocateNode(Omx.cpp),其中:
new OMXNodeInstance,并传入参数新new的LWOmxObserver(observer)
调用mMaster->makeComponentInstance其中同7一样会带参数&OMXNodeInstance::kCallbacks(OMXMaster是在Omx的构造函数中new出来的)
再下面也就用到了原来Legacy的东西
在Omx::allocateNode中会得到OmxNode为TWOmxNode。


3、 MediaCodecList (the same as N)
由解析以下文件而来
media_codecs.xml(/odm/etc, /vendor/etc, /etc下)
media_codecs_performance.xml(/odm/etc, /vendor/etc, /etc下)
/data/misc/media/media_codecs_profiling_results.xml


4、 OMX内部划分

新的Treble框架的OMX将其本身分成了两个部分。一部分为控制性的内容不涉及node操作,经由HAL最后从Omx调到OMXNodeInstance;另一部分则为node操作部分,会经由HAL最后由TWOmxNode调到OMXNodeInstance。再往下就与Legacy的一致了。



5、 Component的加载

根 据 组 件 的名 字 , 找 到 对 应 的 OMXPluginBase 对 象,对于硬解如QComOMXPlugin。然后调用 QComOMXPlugin的 makeComponentInstance 方法经由实际组件的封装获得 OMX_COMPONENTTYPE 对象的指针,并将 OMX_COMPONENTTYPE 对象的指针保存在形参中返回。
 


6、 Calling Sequence(ACodec to OMX)

a、 初始化
 


b、 数据处理 1(输入)

初始化时,在qc_omc_core.c的OMX_GetHandle(…)函数中还会调用到omx_core_cmp.cpp中的qc_omx_component_set_callbacks,然后调到实际组件的set_callbacks完成callbacks的赋值,最终实际组件中的m_cb(callbacks)就对应到了OMX_CALLBACKTYPE,即对应到了OMXNodeInstance::kCallbacks。
 
其中omx_message::EMPTY_BUFFER_DONE消息会先经过OMXNodeInstance::onMessages,然后到LWOmxObserver::onMessages再到TWOmxObserver::onMessages,接着到CodecObserver的onMessages,最后才到了ACodec::BaseState::onOMXMessage中进行相关处理。


c、 数据处理 2(输出)
这里同样涉及emptybuffer时callbacks和Observer的相关内容,且其间的关系都一样。


猜你喜欢

转载自blog.csdn.net/dfhuang09/article/details/80035495
今日推荐