c语言sscanf函数的用法是什么
373
2022-09-04
Android音视频——OMX 中 Nodeinstance 列表的管理与节点的操作
在我们创建Componentinstance (OMX组件实例)后,需要对它里面的Nodelnstance列表 进行管理。
OMX对解码器组件Component的使用,是通过OMXNodelnstance来实现的。 OMXNodelnstance自身的动作包括 Nodeinstance 的生成(allocateNode )和删除(freeNode)o其实就是对niDispatchers和mNode】DToInstance进行添加和删除。mNodelDToInstance 就是一个 key 为 node id» value 为 Nodeinstance 的键/值对列表。而niDispatchers 就是一个 key 为 node id, value 为 OMX::CallbackDispatcher的键/值对列 表。并且,每个 Nodeinstance 都拥有一个 0MX::CalIbackDispatcheroCallbackDispatcher的主要作用是在解码器组件Component发出回调动作后,将message分发给对应的OMXCodec客户端。
在我们了解到OMXNodelnstance列表管理后,每个OMXNodelnstance中都有Node节 点,若你需要给这些Node节点分配一些Buffer,下面看看对Node节点的操作过程。 在/frameworks/av/media/libstagefright/include/OMXNodeInstance.h 中:
struct OMXNodeInstance { OMXNodeInstance( OMX *owner, const sp
当执行这些函数时,都是先通过findinstance在mNodelDToInstance列表中找到对应的 Nodeinstance,然后调用Nodelnstance对应的方法。 OMXCodec对具体的component函数的操作,是通过OMXNodelnstance来实现的,如 filIBuffer> emptyBuffer> sendCommand等,它们都是通过OMX Core.h中的宏定义间接调用 OMX_Component.h 的 OMX_COMPONENTTYPE 中的相应函数指针来完成的。OMX_Core.h 和OMX_Compoiient.h都是OpenMAX标准头文件。
OMX_CALLBACKTYPE OMXNodeInstance::kCallbacks = { &OnEvent, &OnEmptyBufferDone, &OnFillBufferDone }; 它把3个OMXNodelnstance类的静态方法注册给了 kCallbacks。kCallbacks实际就是struct OMX COMPONENTTYPE和struct OMX_CALLBACKTYPE的具体实现,而这两者就是在 OMX Core.h 和 OMX_Component.h 中定义的。 在哪里使用kCallbacks呢?下面看看OMX.cpp中的allocateNode函数:
status_t OMX::allocateNode( const char *name, const sp
事件处理函数传给了组件Componentinstance,也就是传给了具体芯片平台相关的OMX IL 层。 当组件有事件发生时,就会调用OMXNodelnstance中这几个注册过的事件处理函数:
OMX_ERRORTYPE OMXNodelnstance::OnEmptyBufferDoneOMX_ERRORTYPE OMXNodelnstance::OnFillBufferDoneOMX_ERRORTYPE OMXNodelnstance::OnEvent而这几个函数又会调用OMX中对应的函数,也就是下面这3个函数:OMX_ERRORTYPE OMX::OnEmptyBufferDoneOMX_ERRORTYPE OMX::OnFillBufferDoneOMX_ERRORTYPE OMX::OnEvent
总结一下,这儿个函数都采用相同的方式,即根据n odeid找到Cal I back Dispatcher,并把 事件信息传递出去,也就是findDispatcher(node)->post(msg)o 进一步地,需要了解CallbackDispatcher的实现机制。它内部开启了一个线程,使用了信 号量(signal)机制。 findDispatcher(node)->post(msg)是一个异步操作,只把消息传递过去,不会等待事件处理 完毕就返回。 问题来了,那么CallbackDispatcher是怎么处理接收到的消息的呢?查看以下代码:
bool OMX::CallbackDispatcher::loop() { for (;;) { std::list
这样事件最终还是跨Binder传到OMXCodec里面,交给OMXCodecObserver 了« •旦有 关于回调的过程,再从OMX服务器端发送到OMX客户端。我们又知道AwesomePlayer类中 持有OMX客户端,所以这些从OMX组件通知上来的消息就可以到达AwesomePlayer中。这 样就完成了 AwesomePlayer和OMX组件之间的通信。
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~