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

Commit d3ed3883 authored by Pawin Vongmasa's avatar Pawin Vongmasa
Browse files

Decouple OMX from OMXNodeInstance.

OMXNodeInstance has a member named mOwner, which is a reference to OMX.
Since Treble conversion would replace OMX with a new class (to be named Omx),
mOwner should have a type that is different from OMX. Fortunately, the
only use of mOwner in OMXNodeInstance is to call freeNode(). This CL
introduces OMXNodeOwner, an abstract class that has freeNode() as the only
function, and changes the type of mOwner to OMXNodeOwner. This way,
OMXNodeInstance can work with both OMX and Omx.

Test: adb shell am instrument -e size small -w
'android.media.cts/android.support.test.runner.AndroidJUnitRunner'

Bug: 31399200

Change-Id: Ia2d07a48aa94da8378fd36e55244a7e7817a5f42
parent 0bdd9ffd
Loading
Loading
Loading
Loading
+4 −1
Original line number Diff line number Diff line
@@ -21,12 +21,15 @@
#include <utils/threads.h>
#include <utils/KeyedVector.h>

#include "OmxNodeOwner.h"

namespace android {

struct OMXMaster;
struct OMXNodeInstance;

class OMX : public BnOMX,
            public OmxNodeOwner,
            public IBinder::DeathRecipient {
public:
    OMX();
@@ -43,7 +46,7 @@ public:

    virtual void binderDied(const wp<IBinder> &the_late_who);

    status_t freeNode(const sp<OMXNodeInstance>& instance);
    virtual status_t freeNode(const sp<OMXNodeInstance>& instance);

protected:
    virtual ~OMX();
+25 −24
Original line number Diff line number Diff line
@@ -18,11 +18,12 @@

#define OMX_NODE_INSTANCE_H_

#include "OMX.h"

#include <media/IOMX.h>
#include <utils/RefBase.h>
#include <utils/SortedVector.h>
#include <utils/threads.h>
#include <utils/KeyedVector.h>
#include <utils/SortedVector.h>
#include "OmxNodeOwner.h"

namespace android {
class IOMXBufferSource;
@@ -32,7 +33,7 @@ class OMXBuffer;

struct OMXNodeInstance : public BnOMXNode {
    OMXNodeInstance(
            OMX *owner, const sp<IOMXObserver> &observer, const char *name);
            OmxNodeOwner *owner, const sp<IOMXObserver> &observer, const char *name);

    void setHandle(OMX_HANDLETYPE handle);

@@ -66,7 +67,7 @@ struct OMXNodeInstance : public BnOMXNode {
            const sp<IOMXBufferSource> &bufferSource);

    status_t allocateSecureBuffer(
            OMX_U32 portIndex, size_t size, OMX::buffer_id *buffer,
            OMX_U32 portIndex, size_t size, IOMX::buffer_id *buffer,
            void **buffer_data, sp<NativeHandle> *native_handle);

    status_t useBuffer(
@@ -106,7 +107,7 @@ private:

    Mutex mLock;

    OMX *mOwner;
    OmxNodeOwner *mOwner;
    OMX_HANDLETYPE mHandle;
    sp<IOMXObserver> mObserver;
    sp<CallbackDispatcher> mDispatcher;
@@ -125,14 +126,14 @@ private:

    struct ActiveBuffer {
        OMX_U32 mPortIndex;
        OMX::buffer_id mID;
        IOMX::buffer_id mID;
    };
    Vector<ActiveBuffer> mActiveBuffers;
    // for buffer ptr to buffer id translation
    Mutex mBufferIDLock;
    uint32_t mBufferIDCount;
    KeyedVector<OMX::buffer_id, OMX_BUFFERHEADERTYPE *> mBufferIDToBufferHeader;
    KeyedVector<OMX_BUFFERHEADERTYPE *, OMX::buffer_id> mBufferHeaderToBufferID;
    KeyedVector<IOMX::buffer_id, OMX_BUFFERHEADERTYPE *> mBufferIDToBufferHeader;
    KeyedVector<OMX_BUFFERHEADERTYPE *, IOMX::buffer_id> mBufferHeaderToBufferID;

    bool mLegacyAdaptiveExperiment;
    IOMX::PortMode mPortMode[2];
@@ -167,45 +168,45 @@ private:

    ~OMXNodeInstance();

    void addActiveBuffer(OMX_U32 portIndex, OMX::buffer_id id);
    void removeActiveBuffer(OMX_U32 portIndex, OMX::buffer_id id);
    void addActiveBuffer(OMX_U32 portIndex, IOMX::buffer_id id);
    void removeActiveBuffer(OMX_U32 portIndex, IOMX::buffer_id id);
    void freeActiveBuffers();

    // For buffer id management
    OMX::buffer_id makeBufferID(OMX_BUFFERHEADERTYPE *bufferHeader);
    OMX_BUFFERHEADERTYPE *findBufferHeader(OMX::buffer_id buffer, OMX_U32 portIndex);
    OMX::buffer_id findBufferID(OMX_BUFFERHEADERTYPE *bufferHeader);
    void invalidateBufferID(OMX::buffer_id buffer);
    IOMX::buffer_id makeBufferID(OMX_BUFFERHEADERTYPE *bufferHeader);
    OMX_BUFFERHEADERTYPE *findBufferHeader(IOMX::buffer_id buffer, OMX_U32 portIndex);
    IOMX::buffer_id findBufferID(OMX_BUFFERHEADERTYPE *bufferHeader);
    void invalidateBufferID(IOMX::buffer_id buffer);

    bool isProhibitedIndex_l(OMX_INDEXTYPE index);

    status_t useBuffer_l(
            OMX_U32 portIndex, const sp<IMemory> &params,
            OMX::buffer_id *buffer);
            IOMX::buffer_id *buffer);

    status_t useGraphicBuffer_l(
            OMX_U32 portIndex, const sp<GraphicBuffer> &graphicBuffer,
            OMX::buffer_id *buffer);
            IOMX::buffer_id *buffer);

    status_t useGraphicBufferWithMetadata_l(
            OMX_U32 portIndex, const sp<GraphicBuffer> &graphicBuffer,
            OMX::buffer_id *buffer);
            IOMX::buffer_id *buffer);

    status_t useGraphicBuffer2_l(
            OMX_U32 portIndex, const sp<GraphicBuffer> &graphicBuffer,
            OMX::buffer_id *buffer);
            IOMX::buffer_id *buffer);

    status_t emptyBuffer_l(
            OMX::buffer_id buffer,
            IOMX::buffer_id buffer,
            OMX_U32 rangeOffset, OMX_U32 rangeLength,
            OMX_U32 flags, OMX_TICKS timestamp, int fenceFd);

    status_t emptyGraphicBuffer_l(
            OMX::buffer_id buffer, const sp<GraphicBuffer> &graphicBuffer,
            IOMX::buffer_id buffer, const sp<GraphicBuffer> &graphicBuffer,
            OMX_U32 flags, OMX_TICKS timestamp, int fenceFd);

    status_t emptyNativeHandleBuffer_l(
            OMX::buffer_id buffer, const sp<NativeHandle> &nativeHandle,
            IOMX::buffer_id buffer, const sp<NativeHandle> &nativeHandle,
            OMX_U32 flags, OMX_TICKS timestamp, int fenceFd);

    status_t emptyBuffer_l(
@@ -252,11 +253,11 @@ private:
    // buffer.)
    status_t updateGraphicBufferInMeta_l(
            OMX_U32 portIndex, const sp<GraphicBuffer> &graphicBuffer,
            OMX::buffer_id buffer, OMX_BUFFERHEADERTYPE *header);
            IOMX::buffer_id buffer, OMX_BUFFERHEADERTYPE *header);

    status_t updateNativeHandleInMeta_l(
            OMX_U32 portIndex, const sp<NativeHandle> &nativeHandle,
            OMX::buffer_id buffer, OMX_BUFFERHEADERTYPE *header);
            IOMX::buffer_id buffer, OMX_BUFFERHEADERTYPE *header);

    sp<IOMXBufferSource> getBufferSource();
    void setBufferSource(const sp<IOMXBufferSource> &bufferSource);
+37 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2016 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#ifndef OMX_NODE_OWNER_H_

#define OMX_NODE_OWNER_H_

namespace android {

struct OMXNodeInstance;

/**
 * This struct is needed to separate OMX from OMXNodeInstance.
 *
 * TODO: This might not be needed after Treble transition is complete.
 */
struct OmxNodeOwner {
    virtual status_t freeNode(const sp<OMXNodeInstance> &instance) = 0;
    virtual ~OmxNodeOwner() {}
};

}

#endif  // OMX_NODE_OWNER_H_
+22 −22
Original line number Diff line number Diff line
@@ -332,7 +332,7 @@ bool OMXNodeInstance::CallbackDispatcherThread::threadLoop() {
////////////////////////////////////////////////////////////////////////////////

OMXNodeInstance::OMXNodeInstance(
        OMX *owner, const sp<IOMXObserver> &observer, const char *name)
        OmxNodeOwner *owner, const sp<IOMXObserver> &observer, const char *name)
    : mOwner(owner),
      mHandle(NULL),
      mObserver(observer),
@@ -1010,7 +1010,7 @@ status_t OMXNodeInstance::configureVideoTunnelMode(
}

status_t OMXNodeInstance::useBuffer(
        OMX_U32 portIndex, const OMXBuffer &omxBuffer, OMX::buffer_id *buffer) {
        OMX_U32 portIndex, const OMXBuffer &omxBuffer, IOMX::buffer_id *buffer) {
    if (buffer == NULL) {
        ALOGE("b/25884056");
        return BAD_VALUE;
@@ -1040,7 +1040,7 @@ status_t OMXNodeInstance::useBuffer(
}

status_t OMXNodeInstance::useBuffer_l(
        OMX_U32 portIndex, const sp<IMemory> &params, OMX::buffer_id *buffer) {
        OMX_U32 portIndex, const sp<IMemory> &params, IOMX::buffer_id *buffer) {
    BufferMeta *buffer_meta;
    OMX_BUFFERHEADERTYPE *header;
    OMX_ERRORTYPE err = OMX_ErrorNone;
@@ -1147,7 +1147,7 @@ status_t OMXNodeInstance::useBuffer_l(

status_t OMXNodeInstance::useGraphicBuffer2_l(
        OMX_U32 portIndex, const sp<GraphicBuffer>& graphicBuffer,
        OMX::buffer_id *buffer) {
        IOMX::buffer_id *buffer) {
    if (graphicBuffer == NULL || buffer == NULL) {
        ALOGE("b/25884056");
        return BAD_VALUE;
@@ -1203,7 +1203,7 @@ status_t OMXNodeInstance::useGraphicBuffer2_l(
// can be renamed to useGraphicBuffer.
status_t OMXNodeInstance::useGraphicBuffer_l(
        OMX_U32 portIndex, const sp<GraphicBuffer>& graphicBuffer,
        OMX::buffer_id *buffer) {
        IOMX::buffer_id *buffer) {
    if (graphicBuffer == NULL || buffer == NULL) {
        ALOGE("b/25884056");
        return BAD_VALUE;
@@ -1273,7 +1273,7 @@ status_t OMXNodeInstance::useGraphicBuffer_l(

status_t OMXNodeInstance::useGraphicBufferWithMetadata_l(
        OMX_U32 portIndex, const sp<GraphicBuffer> &graphicBuffer,
        OMX::buffer_id *buffer) {
        IOMX::buffer_id *buffer) {
    if (portIndex != kPortIndexOutput) {
        return BAD_VALUE;
    }
@@ -1296,7 +1296,7 @@ status_t OMXNodeInstance::useGraphicBufferWithMetadata_l(

status_t OMXNodeInstance::updateGraphicBufferInMeta_l(
        OMX_U32 portIndex, const sp<GraphicBuffer>& graphicBuffer,
        OMX::buffer_id buffer, OMX_BUFFERHEADERTYPE *header) {
        IOMX::buffer_id buffer, OMX_BUFFERHEADERTYPE *header) {
    // No need to check |graphicBuffer| since NULL is valid for it as below.
    if (header == NULL) {
        ALOGE("b/25884056");
@@ -1336,7 +1336,7 @@ status_t OMXNodeInstance::updateGraphicBufferInMeta_l(

status_t OMXNodeInstance::updateNativeHandleInMeta_l(
        OMX_U32 portIndex, const sp<NativeHandle>& nativeHandle,
        OMX::buffer_id buffer, OMX_BUFFERHEADERTYPE *header) {
        IOMX::buffer_id buffer, OMX_BUFFERHEADERTYPE *header) {
    // No need to check |nativeHandle| since NULL is valid for it as below.
    if (header == NULL) {
        ALOGE("b/25884056");
@@ -1423,7 +1423,7 @@ status_t OMXNodeInstance::setInputSurface(
}

status_t OMXNodeInstance::allocateSecureBuffer(
        OMX_U32 portIndex, size_t size, OMX::buffer_id *buffer,
        OMX_U32 portIndex, size_t size, IOMX::buffer_id *buffer,
        void **buffer_data, sp<NativeHandle> *native_handle) {
    if (buffer == NULL || buffer_data == NULL || native_handle == NULL) {
        ALOGE("b/25884056");
@@ -1481,7 +1481,7 @@ status_t OMXNodeInstance::allocateSecureBuffer(
}

status_t OMXNodeInstance::freeBuffer(
        OMX_U32 portIndex, OMX::buffer_id buffer) {
        OMX_U32 portIndex, IOMX::buffer_id buffer) {
    Mutex::Autolock autoLock(mLock);
    CLOG_BUFFER(freeBuffer, "%s:%u %#x", portString(portIndex), portIndex, buffer);

@@ -1505,7 +1505,7 @@ status_t OMXNodeInstance::freeBuffer(
}

status_t OMXNodeInstance::fillBuffer(
        OMX::buffer_id buffer, const OMXBuffer &omxBuffer, int fenceFd) {
        IOMX::buffer_id buffer, const OMXBuffer &omxBuffer, int fenceFd) {
    Mutex::Autolock autoLock(mLock);

    OMX_BUFFERHEADERTYPE *header = findBufferHeader(buffer, kPortIndexOutput);
@@ -1579,7 +1579,7 @@ status_t OMXNodeInstance::emptyBuffer(
}

status_t OMXNodeInstance::emptyBuffer_l(
        OMX::buffer_id buffer,
        IOMX::buffer_id buffer,
        OMX_U32 rangeOffset, OMX_U32 rangeLength,
        OMX_U32 flags, OMX_TICKS timestamp, int fenceFd) {

@@ -1731,7 +1731,7 @@ status_t OMXNodeInstance::emptyBuffer_l(

// like emptyBuffer, but the data is already in header->pBuffer
status_t OMXNodeInstance::emptyGraphicBuffer_l(
        OMX::buffer_id buffer, const sp<GraphicBuffer> &graphicBuffer,
        IOMX::buffer_id buffer, const sp<GraphicBuffer> &graphicBuffer,
        OMX_U32 flags, OMX_TICKS timestamp, int fenceFd) {
    OMX_BUFFERHEADERTYPE *header = findBufferHeader(buffer, kPortIndexInput);
    if (header == NULL) {
@@ -1803,7 +1803,7 @@ int64_t OMXNodeInstance::getCodecTimestamp(OMX_TICKS timestamp) {
}

status_t OMXNodeInstance::emptyNativeHandleBuffer_l(
        OMX::buffer_id buffer, const sp<NativeHandle> &nativeHandle,
        IOMX::buffer_id buffer, const sp<NativeHandle> &nativeHandle,
        OMX_U32 flags, OMX_TICKS timestamp, int fenceFd) {
    OMX_BUFFERHEADERTYPE *header = findBufferHeader(buffer, kPortIndexInput);
    if (header == NULL) {
@@ -2199,7 +2199,7 @@ OMX_ERRORTYPE OMXNodeInstance::OnFillBufferDone(
    return OMX_ErrorNone;
}

void OMXNodeInstance::addActiveBuffer(OMX_U32 portIndex, OMX::buffer_id id) {
void OMXNodeInstance::addActiveBuffer(OMX_U32 portIndex, IOMX::buffer_id id) {
    ActiveBuffer active;
    active.mPortIndex = portIndex;
    active.mID = id;
@@ -2211,7 +2211,7 @@ void OMXNodeInstance::addActiveBuffer(OMX_U32 portIndex, OMX::buffer_id id) {
}

void OMXNodeInstance::removeActiveBuffer(
        OMX_U32 portIndex, OMX::buffer_id id) {
        OMX_U32 portIndex, IOMX::buffer_id id) {
    for (size_t i = 0; i < mActiveBuffers.size(); ++i) {
        if (mActiveBuffers[i].mPortIndex == portIndex
                && mActiveBuffers[i].mID == id) {
@@ -2236,17 +2236,17 @@ void OMXNodeInstance::freeActiveBuffers() {
    }
}

OMX::buffer_id OMXNodeInstance::makeBufferID(OMX_BUFFERHEADERTYPE *bufferHeader) {
IOMX::buffer_id OMXNodeInstance::makeBufferID(OMX_BUFFERHEADERTYPE *bufferHeader) {
    if (bufferHeader == NULL) {
        return 0;
    }
    Mutex::Autolock autoLock(mBufferIDLock);
    OMX::buffer_id buffer;
    IOMX::buffer_id buffer;
    do { // handle the very unlikely case of ID overflow
        if (++mBufferIDCount == 0) {
            ++mBufferIDCount;
        }
        buffer = (OMX::buffer_id)mBufferIDCount;
        buffer = (IOMX::buffer_id)mBufferIDCount;
    } while (mBufferIDToBufferHeader.indexOfKey(buffer) >= 0);
    mBufferIDToBufferHeader.add(buffer, bufferHeader);
    mBufferHeaderToBufferID.add(bufferHeader, buffer);
@@ -2254,7 +2254,7 @@ OMX::buffer_id OMXNodeInstance::makeBufferID(OMX_BUFFERHEADERTYPE *bufferHeader)
}

OMX_BUFFERHEADERTYPE *OMXNodeInstance::findBufferHeader(
        OMX::buffer_id buffer, OMX_U32 portIndex) {
        IOMX::buffer_id buffer, OMX_U32 portIndex) {
    if (buffer == 0) {
        return NULL;
    }
@@ -2275,7 +2275,7 @@ OMX_BUFFERHEADERTYPE *OMXNodeInstance::findBufferHeader(
    return header;
}

OMX::buffer_id OMXNodeInstance::findBufferID(OMX_BUFFERHEADERTYPE *bufferHeader) {
IOMX::buffer_id OMXNodeInstance::findBufferID(OMX_BUFFERHEADERTYPE *bufferHeader) {
    if (bufferHeader == NULL) {
        return 0;
    }
@@ -2288,7 +2288,7 @@ OMX::buffer_id OMXNodeInstance::findBufferID(OMX_BUFFERHEADERTYPE *bufferHeader)
    return mBufferHeaderToBufferID.valueAt(index);
}

void OMXNodeInstance::invalidateBufferID(OMX::buffer_id buffer) {
void OMXNodeInstance::invalidateBufferID(IOMX::buffer_id buffer) {
    if (buffer == 0) {
        return;
    }