status_t OMX::freeNode(node_id node) { OMXNodeInstance *instance = findInstance(node); { Mutex::Autolock autoLock(mLock); ssize_t index = mLiveNodes.indexOfKey(instance->observer()->asBinder()); if (index < 0) { // This could conceivably happen if the observer dies at roughly the // same time that a client attempts to free the node explicitly. return OK; } mLiveNodes.removeItemsAt(index); } instance->observer()->asBinder()->unlinkToDeath(this); status_t err = instance->freeNode(mMaster); { Mutex::Autolock autoLock(mLock); ssize_t index = mDispatchers.indexOfKey(node); CHECK(index >= 0); mDispatchers.removeItemsAt(index); } return err; }
// static OMX_ERRORTYPE OMXNodeInstance::OnFillBufferDone( OMX_IN OMX_HANDLETYPE hComponent, OMX_IN OMX_PTR pAppData, OMX_IN OMX_BUFFERHEADERTYPE* pBuffer) { OMXNodeInstance *instance = static_cast<OMXNodeInstance *>(pAppData); return instance->owner()->OnFillBufferDone(instance->nodeID(), pBuffer); }
status_t OMX::allocateNode( const char *name, const sp<IOMXObserver> &observer, node_id *node) { Mutex::Autolock autoLock(mLock); *node = 0; OMXNodeInstance *instance = new OMXNodeInstance(this, observer); OMX_COMPONENTTYPE *handle; OMX_ERRORTYPE err = mMaster->makeComponentInstance( name, &OMXNodeInstance::kCallbacks, instance, &handle); if (err != OMX_ErrorNone) { ALOGV("FAILED to allocate omx component '%s'", name); instance->onGetHandleFailed(); return UNKNOWN_ERROR; } *node = makeNodeID(instance); mDispatchers.add(*node, new CallbackDispatcher(instance)); instance->setHandle(*node, handle); mLiveNodes.add(observer->asBinder(), instance); observer->asBinder()->linkToDeath(this); return OK; }
void OMX::CallbackDispatcher::dispatch(const omx_message &msg) { OMXNodeInstance *instance = mOwner->findInstance(msg.node); if (instance == NULL) { LOGV("Would have dispatched a message to a node that's already gone."); return; } instance->onMessage(msg); }
status_t OMX::freeNode(node_id node) { OMXNodeInstance *instance = findInstance(node); ssize_t index = mLiveNodes.indexOfKey(instance->observer()->asBinder()); CHECK(index >= 0); mLiveNodes.removeItemsAt(index); instance->observer()->asBinder()->unlinkToDeath(this); return instance->freeNode(mMaster); }
// static OMX_ERRORTYPE OMXNodeInstance::OnEmptyBufferDone( OMX_IN OMX_HANDLETYPE hComponent, OMX_IN OMX_PTR pAppData, OMX_IN OMX_BUFFERHEADERTYPE* pBuffer) { OMXNodeInstance *instance = static_cast<OMXNodeInstance *>(pAppData); if (instance->mDying) { return OMX_ErrorNone; } return instance->owner()->OnEmptyBufferDone(instance->nodeID(), pBuffer); }
// static OMX_ERRORTYPE OMXNodeInstance::OnEvent( OMX_IN OMX_HANDLETYPE hComponent, OMX_IN OMX_PTR pAppData, OMX_IN OMX_EVENTTYPE eEvent, OMX_IN OMX_U32 nData1, OMX_IN OMX_U32 nData2, OMX_IN OMX_PTR pEventData) { OMXNodeInstance *instance = static_cast<OMXNodeInstance *>(pAppData); return instance->owner()->OnEvent( instance->nodeID(), eEvent, nData1, nData2, pEventData); }
status_t OMX::allocateNode( const char *name, const sp<IOMXObserver> &observer, node_id *node) { ALOGV("%s(%d) try mLock", __FUNCTION__, __LINE__); Mutex::Autolock autoLock(mLock); ALOGV("%s(%d) get mLock", __FUNCTION__, __LINE__); *node = 0; OMXNodeInstance *instance = new OMXNodeInstance(this, observer); OMX_COMPONENTTYPE *handle; #if 0//def CC_SUPPORT_MTK_ANDROID_RM /* To unlock mLock is because preemption flow might have allocateNode => callback (need held mlock) It is ok because mLock seems to protect mDispatchers, mLiveNodes, ... check OMX::freeNode for reference */ mLock.unlock(); ALOGV("%s(%d) free mLock", __FUNCTION__, __LINE__); #endif OMX_ERRORTYPE err = mMaster->makeComponentInstance( name, &OMXNodeInstance::kCallbacks, instance, &handle); #if 0//def CC_SUPPORT_MTK_ANDROID_RM mLock.lock(); ALOGV("%s(%d) get mLock", __FUNCTION__, __LINE__); #endif if (err != OMX_ErrorNone) { ALOGV("FAILED to allocate omx component '%s'", name); instance->onGetHandleFailed(); ALOGV("%s(%d) free mLock", __FUNCTION__, __LINE__); return UNKNOWN_ERROR; } *node = makeNodeID(instance); mDispatchers.add(*node, new CallbackDispatcher(instance)); instance->setHandle(*node, handle); mLiveNodes.add(observer->asBinder(), instance); observer->asBinder()->linkToDeath(this); ALOGV("%s(%d) free mLock", __FUNCTION__, __LINE__); return OK; }
void OMX::binderDied(const wp<IBinder> &the_late_who) { OMXNodeInstance *instance; { Mutex::Autolock autoLock(mLock); ssize_t index = mLiveNodes.indexOfKey(the_late_who); CHECK(index >= 0); instance = mLiveNodes.editValueAt(index); mLiveNodes.removeItemsAt(index); invalidateNodeID_l(instance->nodeID()); } instance->onObserverDied(mMaster); }
status_t OMX::freeNode(node_id node) { OMXNodeInstance *instance = findInstance(node); ssize_t index = mLiveNodes.indexOfKey(instance->observer()->asBinder()); CHECK(index >= 0); mLiveNodes.removeItemsAt(index); instance->observer()->asBinder()->unlinkToDeath(this); status_t err = instance->freeNode(mMaster); { Mutex::Autolock autoLock(mLock); index = mDispatchers.indexOfKey(node); CHECK(index >= 0); mDispatchers.removeItemsAt(index); } return err; }
void OMX::binderDied(const wp<IBinder> &the_late_who) { OMXNodeInstance *instance; { ALOGV("%s(%d) try mLock", __FUNCTION__, __LINE__); Mutex::Autolock autoLock(mLock); ALOGV("%s(%d) get mLock", __FUNCTION__, __LINE__); ssize_t index = mLiveNodes.indexOfKey(the_late_who); CHECK(index >= 0); instance = mLiveNodes.editValueAt(index); mLiveNodes.removeItemsAt(index); index = mDispatchers.indexOfKey(instance->nodeID()); CHECK(index >= 0); mDispatchers.removeItemsAt(index); invalidateNodeID_l(instance->nodeID()); ALOGV("%s(%d) free mLock", __FUNCTION__, __LINE__); } instance->onObserverDied(mMaster); }
bool OMX::isSecure(node_id node) { OMXNodeInstance *instance = findInstance(node); return (instance == NULL ? false : instance->isSecure()); }