Merge "This patch enables each omx instance to have a separate message dispatcher, and thus eliminates the sharing of the message dispatches between omx instances." into gingerbread
This commit is contained in:
@@ -102,7 +102,7 @@ public:
|
|||||||
OMX_IN OMX_U32 nData1,
|
OMX_IN OMX_U32 nData1,
|
||||||
OMX_IN OMX_U32 nData2,
|
OMX_IN OMX_U32 nData2,
|
||||||
OMX_IN OMX_PTR pEventData);
|
OMX_IN OMX_PTR pEventData);
|
||||||
|
|
||||||
OMX_ERRORTYPE OnEmptyBufferDone(
|
OMX_ERRORTYPE OnEmptyBufferDone(
|
||||||
node_id node, OMX_IN OMX_BUFFERHEADERTYPE *pBuffer);
|
node_id node, OMX_IN OMX_BUFFERHEADERTYPE *pBuffer);
|
||||||
|
|
||||||
@@ -115,20 +115,19 @@ protected:
|
|||||||
virtual ~OMX();
|
virtual ~OMX();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Mutex mLock;
|
|
||||||
|
|
||||||
OMXMaster *mMaster;
|
|
||||||
|
|
||||||
struct CallbackDispatcher;
|
struct CallbackDispatcher;
|
||||||
sp<CallbackDispatcher> mDispatcher;
|
|
||||||
|
|
||||||
|
Mutex mLock;
|
||||||
|
OMXMaster *mMaster;
|
||||||
int32_t mNodeCounter;
|
int32_t mNodeCounter;
|
||||||
|
|
||||||
KeyedVector<wp<IBinder>, OMXNodeInstance *> mLiveNodes;
|
KeyedVector<wp<IBinder>, OMXNodeInstance *> mLiveNodes;
|
||||||
KeyedVector<node_id, OMXNodeInstance *> mNodeIDToInstance;
|
KeyedVector<node_id, OMXNodeInstance *> mNodeIDToInstance;
|
||||||
|
KeyedVector<node_id, sp<CallbackDispatcher> > mDispatchers;
|
||||||
|
|
||||||
node_id makeNodeID(OMXNodeInstance *instance);
|
node_id makeNodeID(OMXNodeInstance *instance);
|
||||||
OMXNodeInstance *findInstance(node_id node);
|
OMXNodeInstance *findInstance(node_id node);
|
||||||
|
sp<CallbackDispatcher> findDispatcher(node_id node);
|
||||||
|
|
||||||
void invalidateNodeID_l(node_id node);
|
void invalidateNodeID_l(node_id node);
|
||||||
|
|
||||||
|
|||||||
@@ -43,7 +43,7 @@ namespace android {
|
|||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
struct OMX::CallbackDispatcher : public RefBase {
|
struct OMX::CallbackDispatcher : public RefBase {
|
||||||
CallbackDispatcher(OMX *owner);
|
CallbackDispatcher(OMXNodeInstance *owner);
|
||||||
|
|
||||||
void post(const omx_message &msg);
|
void post(const omx_message &msg);
|
||||||
|
|
||||||
@@ -53,7 +53,7 @@ protected:
|
|||||||
private:
|
private:
|
||||||
Mutex mLock;
|
Mutex mLock;
|
||||||
|
|
||||||
OMX *mOwner;
|
OMXNodeInstance *mOwner;
|
||||||
bool mDone;
|
bool mDone;
|
||||||
Condition mQueueChanged;
|
Condition mQueueChanged;
|
||||||
List<omx_message> mQueue;
|
List<omx_message> mQueue;
|
||||||
@@ -69,7 +69,7 @@ private:
|
|||||||
CallbackDispatcher &operator=(const CallbackDispatcher &);
|
CallbackDispatcher &operator=(const CallbackDispatcher &);
|
||||||
};
|
};
|
||||||
|
|
||||||
OMX::CallbackDispatcher::CallbackDispatcher(OMX *owner)
|
OMX::CallbackDispatcher::CallbackDispatcher(OMXNodeInstance *owner)
|
||||||
: mOwner(owner),
|
: mOwner(owner),
|
||||||
mDone(false) {
|
mDone(false) {
|
||||||
pthread_attr_t attr;
|
pthread_attr_t attr;
|
||||||
@@ -101,12 +101,11 @@ void OMX::CallbackDispatcher::post(const omx_message &msg) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void OMX::CallbackDispatcher::dispatch(const omx_message &msg) {
|
void OMX::CallbackDispatcher::dispatch(const omx_message &msg) {
|
||||||
OMXNodeInstance *instance = mOwner->findInstance(msg.node);
|
if (mOwner == NULL) {
|
||||||
if (instance == NULL) {
|
|
||||||
LOGV("Would have dispatched a message to a node that's already gone.");
|
LOGV("Would have dispatched a message to a node that's already gone.");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
instance->onMessage(msg);
|
mOwner->onMessage(msg);
|
||||||
}
|
}
|
||||||
|
|
||||||
// static
|
// static
|
||||||
@@ -145,7 +144,6 @@ void OMX::CallbackDispatcher::threadEntry() {
|
|||||||
|
|
||||||
OMX::OMX()
|
OMX::OMX()
|
||||||
: mMaster(new OMXMaster),
|
: mMaster(new OMXMaster),
|
||||||
mDispatcher(new CallbackDispatcher(this)),
|
|
||||||
mNodeCounter(0) {
|
mNodeCounter(0) {
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -226,6 +224,7 @@ status_t OMX::allocateNode(
|
|||||||
}
|
}
|
||||||
|
|
||||||
*node = makeNodeID(instance);
|
*node = makeNodeID(instance);
|
||||||
|
mDispatchers.add(*node, new CallbackDispatcher(instance));
|
||||||
|
|
||||||
instance->setHandle(*node, handle);
|
instance->setHandle(*node, handle);
|
||||||
|
|
||||||
@@ -341,7 +340,7 @@ OMX_ERRORTYPE OMX::OnEvent(
|
|||||||
msg.u.event_data.data1 = nData1;
|
msg.u.event_data.data1 = nData1;
|
||||||
msg.u.event_data.data2 = nData2;
|
msg.u.event_data.data2 = nData2;
|
||||||
|
|
||||||
mDispatcher->post(msg);
|
findDispatcher(node)->post(msg);
|
||||||
|
|
||||||
return OMX_ErrorNone;
|
return OMX_ErrorNone;
|
||||||
}
|
}
|
||||||
@@ -355,7 +354,7 @@ OMX_ERRORTYPE OMX::OnEmptyBufferDone(
|
|||||||
msg.node = node;
|
msg.node = node;
|
||||||
msg.u.buffer_data.buffer = pBuffer;
|
msg.u.buffer_data.buffer = pBuffer;
|
||||||
|
|
||||||
mDispatcher->post(msg);
|
findDispatcher(node)->post(msg);
|
||||||
|
|
||||||
return OMX_ErrorNone;
|
return OMX_ErrorNone;
|
||||||
}
|
}
|
||||||
@@ -375,7 +374,7 @@ OMX_ERRORTYPE OMX::OnFillBufferDone(
|
|||||||
msg.u.extended_buffer_data.platform_private = pBuffer->pPlatformPrivate;
|
msg.u.extended_buffer_data.platform_private = pBuffer->pPlatformPrivate;
|
||||||
msg.u.extended_buffer_data.data_ptr = pBuffer->pBuffer;
|
msg.u.extended_buffer_data.data_ptr = pBuffer->pBuffer;
|
||||||
|
|
||||||
mDispatcher->post(msg);
|
findDispatcher(node)->post(msg);
|
||||||
|
|
||||||
return OMX_ErrorNone;
|
return OMX_ErrorNone;
|
||||||
}
|
}
|
||||||
@@ -397,6 +396,14 @@ OMXNodeInstance *OMX::findInstance(node_id node) {
|
|||||||
return index < 0 ? NULL : mNodeIDToInstance.valueAt(index);
|
return index < 0 ? NULL : mNodeIDToInstance.valueAt(index);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
sp<OMX::CallbackDispatcher> OMX::findDispatcher(node_id node) {
|
||||||
|
Mutex::Autolock autoLock(mLock);
|
||||||
|
|
||||||
|
ssize_t index = mDispatchers.indexOfKey(node);
|
||||||
|
|
||||||
|
return index < 0 ? NULL : mDispatchers.valueAt(index);
|
||||||
|
}
|
||||||
|
|
||||||
void OMX::invalidateNodeID(node_id node) {
|
void OMX::invalidateNodeID(node_id node) {
|
||||||
Mutex::Autolock autoLock(mLock);
|
Mutex::Autolock autoLock(mLock);
|
||||||
invalidateNodeID_l(node);
|
invalidateNodeID_l(node);
|
||||||
|
|||||||
Reference in New Issue
Block a user