Merge "Remove hard-coded number of audio channels in AudioSource" into gingerbread
diff --git a/media/libstagefright/include/OMX.h b/media/libstagefright/include/OMX.h
index ea131e8..c99da59 100644
--- a/media/libstagefright/include/OMX.h
+++ b/media/libstagefright/include/OMX.h
@@ -102,7 +102,7 @@
OMX_IN OMX_U32 nData1,
OMX_IN OMX_U32 nData2,
OMX_IN OMX_PTR pEventData);
-
+
OMX_ERRORTYPE OnEmptyBufferDone(
node_id node, OMX_IN OMX_BUFFERHEADERTYPE *pBuffer);
@@ -115,20 +115,19 @@
virtual ~OMX();
private:
- Mutex mLock;
-
- OMXMaster *mMaster;
-
struct CallbackDispatcher;
- sp<CallbackDispatcher> mDispatcher;
+ Mutex mLock;
+ OMXMaster *mMaster;
int32_t mNodeCounter;
KeyedVector<wp<IBinder>, OMXNodeInstance *> mLiveNodes;
KeyedVector<node_id, OMXNodeInstance *> mNodeIDToInstance;
+ KeyedVector<node_id, sp<CallbackDispatcher> > mDispatchers;
node_id makeNodeID(OMXNodeInstance *instance);
OMXNodeInstance *findInstance(node_id node);
+ sp<CallbackDispatcher> findDispatcher(node_id node);
void invalidateNodeID_l(node_id node);
diff --git a/media/libstagefright/omx/OMX.cpp b/media/libstagefright/omx/OMX.cpp
index 132e31b..ad5b0f9 100644
--- a/media/libstagefright/omx/OMX.cpp
+++ b/media/libstagefright/omx/OMX.cpp
@@ -43,7 +43,7 @@
////////////////////////////////////////////////////////////////////////////////
struct OMX::CallbackDispatcher : public RefBase {
- CallbackDispatcher(OMX *owner);
+ CallbackDispatcher(OMXNodeInstance *owner);
void post(const omx_message &msg);
@@ -53,7 +53,7 @@
private:
Mutex mLock;
- OMX *mOwner;
+ OMXNodeInstance *mOwner;
bool mDone;
Condition mQueueChanged;
List<omx_message> mQueue;
@@ -69,7 +69,7 @@
CallbackDispatcher &operator=(const CallbackDispatcher &);
};
-OMX::CallbackDispatcher::CallbackDispatcher(OMX *owner)
+OMX::CallbackDispatcher::CallbackDispatcher(OMXNodeInstance *owner)
: mOwner(owner),
mDone(false) {
pthread_attr_t attr;
@@ -101,12 +101,11 @@
}
void OMX::CallbackDispatcher::dispatch(const omx_message &msg) {
- OMXNodeInstance *instance = mOwner->findInstance(msg.node);
- if (instance == NULL) {
+ if (mOwner == NULL) {
LOGV("Would have dispatched a message to a node that's already gone.");
return;
}
- instance->onMessage(msg);
+ mOwner->onMessage(msg);
}
// static
@@ -145,7 +144,6 @@
OMX::OMX()
: mMaster(new OMXMaster),
- mDispatcher(new CallbackDispatcher(this)),
mNodeCounter(0) {
}
@@ -226,6 +224,7 @@
}
*node = makeNodeID(instance);
+ mDispatchers.add(*node, new CallbackDispatcher(instance));
instance->setHandle(*node, handle);
@@ -341,7 +340,7 @@
msg.u.event_data.data1 = nData1;
msg.u.event_data.data2 = nData2;
- mDispatcher->post(msg);
+ findDispatcher(node)->post(msg);
return OMX_ErrorNone;
}
@@ -355,7 +354,7 @@
msg.node = node;
msg.u.buffer_data.buffer = pBuffer;
- mDispatcher->post(msg);
+ findDispatcher(node)->post(msg);
return OMX_ErrorNone;
}
@@ -375,7 +374,7 @@
msg.u.extended_buffer_data.platform_private = pBuffer->pPlatformPrivate;
msg.u.extended_buffer_data.data_ptr = pBuffer->pBuffer;
- mDispatcher->post(msg);
+ findDispatcher(node)->post(msg);
return OMX_ErrorNone;
}
@@ -397,6 +396,14 @@
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) {
Mutex::Autolock autoLock(mLock);
invalidateNodeID_l(node);