Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 7e28c010 authored by James Dong's avatar James Dong Committed by Android Git Automerger
Browse files

am 56b64c75: am ac8b0d47: Merge "This patch enables each omx instance to have...

am 56b64c75: am ac8b0d47: 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

Merge commit '56b64c75'

* commit '56b64c75':
  This patch enables each omx instance to have a separate message dispatcher, and
parents f879d620 56b64c75
Loading
Loading
Loading
Loading
+5 −6
Original line number Diff line number Diff line
@@ -115,20 +115,19 @@ protected:
    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);

+17 −10
Original line number Diff line number Diff line
@@ -43,7 +43,7 @@ namespace android {
////////////////////////////////////////////////////////////////////////////////

struct OMX::CallbackDispatcher : public RefBase {
    CallbackDispatcher(OMX *owner);
    CallbackDispatcher(OMXNodeInstance *owner);

    void post(const omx_message &msg);

@@ -53,7 +53,7 @@ protected:
private:
    Mutex mLock;

    OMX *mOwner;
    OMXNodeInstance *mOwner;
    bool mDone;
    Condition mQueueChanged;
    List<omx_message> mQueue;
@@ -69,7 +69,7 @@ private:
    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::post(const omx_message &msg) {
}

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 @@ void OMX::CallbackDispatcher::threadEntry() {

OMX::OMX()
    : mMaster(new OMXMaster),
      mDispatcher(new CallbackDispatcher(this)),
      mNodeCounter(0) {
}

@@ -226,6 +224,7 @@ status_t OMX::allocateNode(
    }

    *node = makeNodeID(instance);
    mDispatchers.add(*node, new CallbackDispatcher(instance));

    instance->setHandle(*node, handle);

@@ -341,7 +340,7 @@ OMX_ERRORTYPE OMX::OnEvent(
    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 @@ OMX_ERRORTYPE OMX::OnEmptyBufferDone(
    msg.node = node;
    msg.u.buffer_data.buffer = pBuffer;

    mDispatcher->post(msg);
    findDispatcher(node)->post(msg);

    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.data_ptr = pBuffer->pBuffer;

    mDispatcher->post(msg);
    findDispatcher(node)->post(msg);

    return OMX_ErrorNone;
}
@@ -397,6 +396,14 @@ OMXNodeInstance *OMX::findInstance(node_id node) {
    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);