Android-StageFright之OpenMAX的实现
2012-06-11 21:54
281 查看
Android-StageFright之OpenMAX的实现
OMXCodec是一个MediaSource,完成数据的parse和decode。而OMXCodec则主要通过IOMX跨越OpenBinder机制操作OMX来实现。重点介绍一下OMX。OMX主要完成三个任务,NodeInstance列表的管理,针对一个NodeInstance的操作以及事件的处理。
一、NodeInstance列表的管理。
这个主要包括NodeInstance的生成(allocateNode)和删除(freeNode)。其实就是对mDispatchers和 mNodeIDToInstance进行添加和删除。mNodeIDToInstance就是一个key为node_id,value为 NodeInstance的名值对列表。而mDispatchers就是一个key为node_id,value为
OMX::CallbackDispatcher的名值对列表。并且,一个NodeInstance都拥有一个 OMX::CallbackDispatcher。
二、NodeInstance节点的操作。
主要成员函数如下:
sendCommand
getParameter
setParameter
… …
fillBuffer
emptyBuffer
getExtensionIndex
这些方法执行时,都是先通过findInstance在mNodeIDToInstance列表中找到对应的NodeInstance,然后调用NodeInstance对应的方法。
三、事件处理
先看一下OMXNodeInstance.cpp中的这样一段代码:
1 2 3 4 5 | OMX_CALLBACKTYPE OMXNodeInstance::kCallbacks = { &OnEvent, &OnEmptyBufferDone, &OnFillBufferDone }; |
1 2 3 4 5 | OMX_ERRORTYPE err = mMaster->makeComponentInstance( name, &OMXNodeInstance::kCallbacks, instance, &handle); |
OnEvent、OnEmptyBufferDone、OnFillBufferDone。
这几个方法都采用相同的路子:根据node_id找到CallbackDispatcher,并把事件信息post过去。具体点儿,就是调用findDispatcher(node)->post(msg)。
这里不得不提一下CallbackDispatcher的实现机制。它内部开启了一个线程,使用了信号量机制。可以看一下OMX::CallbackDispatcher的属性:Condition mQueueChanged;
可以看出findDispatcher(node)->post(msg)是一个异步操作,只把msg给POST过去,不会等待事件处理完毕就返回了。那么CallbackDispatcher是怎么处理接收到的msg呢?看以下代码:
1 2 3 4 56 | OMX::CallbackDispatcher::threadEntry() dispatch(msg); mOwner->onMessage(msg); mObserver->onMessage(msg); |
1 2 3 4 5 | sp<OMXCodecObserver> observer = new OMXCodecObserver; ... ... omx->allocateNode(componentName, observer, &node); |
对节点的操作
NodeInstance的大部分方法的实现,如sendCommand等,都是通过OMX_Core.h中的宏定义间接调用 OMX_Component.h中的OMX_COMPONENTTYPE这个struct中的相应函数指针来完成。在这里提到的OMX_Core.h和 OMX_Component.h都是OpenMAX标准头文件。
相关文章推荐
- OpenMax在Android上的实现
- OpenMax在Android上的实现
- Android多媒体开发【10】-- android中OpenMax的实现【1】整体框架
- android中OpenMax的实现【3】OMX中主要成员
- android中openMax的实现
- stagefright之OpenMax实现
- OpenMax在Android上的实现
- OpenMax在Android上的实现
- Android多媒体开发【11】-- android中OpenMax的实现【2】AwesomePlayer中openmax的入口
- android中openMax的实现
- Android多媒体开发【12】-- android中OpenMax的实现【3】OMX中主要成员
- OpenMax在Android上的实现
- OpenMax在Android上的实现
- Android多媒体开发【12】-- android中OpenMax的实现【3】OMX中主要成员
- android中多媒体解码openmax的实现
- Android多媒体开发-- android中OpenMax的实现整体框架
- OpenMax在Android上的实现
- Android 2.3.4 RTSP的实现不在StageFright中,在opencore中
- android 多媒体框架服务之StagefrightPlayer和OMXCodec实现原理学习
- android中openMax的实现