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

Commit 408b8e10 authored by Andreas Huber's avatar Andreas Huber
Browse files

Deprecate/remove now unused socketpair ipc communication in favour of exclusive binder use.

parent 47f59cfe
Loading
Loading
Loading
Loading
+0 −18
Original line number Diff line number Diff line
@@ -25,8 +25,6 @@
#include <OMX_Core.h>
#include <OMX_Video.h>

#define IOMX_USES_SOCKETS       0

namespace android {

class IMemory;
@@ -41,12 +39,6 @@ public:
    typedef void *buffer_id;
    typedef void *node_id;

#if IOMX_USES_SOCKETS
    // If successful, returns a socket descriptor used for further
    // communication. Caller assumes ownership of "*sd".
    virtual status_t connect(int *sd) = 0;
#endif

    virtual status_t list_nodes(List<String8> *list) = 0;

    virtual status_t allocate_node(const char *name, node_id *node) = 0;
@@ -78,7 +70,6 @@ public:
    virtual status_t free_buffer(
            node_id node, OMX_U32 port_index, buffer_id buffer) = 0;

#if !IOMX_USES_SOCKETS
    virtual status_t observe_node(
            node_id node, const sp<IOMXObserver> &observer) = 0;

@@ -89,7 +80,6 @@ public:
            buffer_id buffer,
            OMX_U32 range_offset, OMX_U32 range_length,
            OMX_U32 flags, OMX_TICKS timestamp) = 0;
#endif

    virtual sp<IOMXRenderer> createRenderer(
            const sp<ISurface> &surface,
@@ -105,14 +95,6 @@ struct omx_message {
        EMPTY_BUFFER_DONE,
        FILL_BUFFER_DONE,

#if IOMX_USES_SOCKETS
        EMPTY_BUFFER,
        FILL_BUFFER,
        SEND_COMMAND,
        DISCONNECT,
        DISCONNECTED,
#endif

        // reserved for OMXDecoder use.
        START,
        INITIAL_FILL_BUFFER,
+0 −18
Original line number Diff line number Diff line
@@ -87,32 +87,14 @@ public:
    status_t registerObserver(IOMX::node_id node, OMXObserver *observer);
    void unregisterObserver(IOMX::node_id node);

    status_t fillBuffer(IOMX::node_id node, IOMX::buffer_id buffer);

    status_t emptyBuffer(
            IOMX::node_id node, IOMX::buffer_id buffer,
            OMX_U32 range_offset, OMX_U32 range_length,
            OMX_U32 flags, OMX_TICKS timestamp);

    status_t send_command(
            IOMX::node_id node, OMX_COMMANDTYPE cmd, OMX_S32 param);

private:
    sp<IOMX> mOMX;

    int mSock;
    Mutex mLock;
    pthread_t mThread;

    KeyedVector<IOMX::node_id, OMXObserver *> mObservers;

    sp<OMXClientReflector> mReflector;

#if IOMX_USES_SOCKETS
    static void *ThreadWrapper(void *me);
    void threadEntry();
#endif

    bool onOMXMessage(const omx_message &msg);

    OMXClient(const OMXClient &);
+0 −43
Original line number Diff line number Diff line
@@ -45,23 +45,6 @@ public:
        : BpInterface<IOMX>(impl) {
    }

#if IOMX_USES_SOCKETS
    virtual status_t connect(int *sd) {
        Parcel data, reply;
        data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
        remote()->transact(CONNECT, data, &reply);

        status_t err = reply.readInt32();
        if (err == OK) {
            *sd = dup(reply.readFileDescriptor());
        } else {
            *sd = -1;
        }

        return reply.readInt32();
    }
#endif

    virtual status_t list_nodes(List<String8> *list) {
        list->clear();

@@ -229,7 +212,6 @@ public:
        return reply.readInt32();
    }

#if !IOMX_USES_SOCKETS
    virtual status_t observe_node(
            node_id node, const sp<IOMXObserver> &observer) {
        Parcel data, reply;
@@ -264,7 +246,6 @@ public:
        data.writeInt64(timestamp);
        remote()->transact(EMPTY_BUFFER, data, &reply, IBinder::FLAG_ONEWAY);
    }
#endif

    virtual sp<IOMXRenderer> createRenderer(
            const sp<ISurface> &surface,
@@ -302,28 +283,6 @@ IMPLEMENT_META_INTERFACE(OMX, "android.hardware.IOMX");
status_t BnOMX::onTransact(
    uint32_t code, const Parcel &data, Parcel *reply, uint32_t flags) {
    switch (code) {
#if IOMX_USES_SOCKETS
        case CONNECT:
        {
            CHECK_INTERFACE(IOMX, data, reply);

            int s;
            status_t err = connect(&s);
            
            reply->writeInt32(err);
            if (err == OK) {
                assert(s >= 0);
                reply->writeDupFileDescriptor(s);
                close(s);
                s = -1;
            } else {
                assert(s == -1);
            }

            return NO_ERROR;
        }
#endif

        case LIST_NODES:
        {
            CHECK_INTERFACE(IOMX, data, reply);
@@ -495,7 +454,6 @@ status_t BnOMX::onTransact(
            return NO_ERROR;
        }

#if !IOMX_USES_SOCKETS
        case OBSERVE_NODE:
        {
            CHECK_INTERFACE(IOMX, data, reply);
@@ -536,7 +494,6 @@ status_t BnOMX::onTransact(

            return NO_ERROR;
        }
#endif

        case CREATE_RENDERER:
        {
+5 −151
Original line number Diff line number Diff line
@@ -30,8 +30,7 @@

namespace android {

OMXClient::OMXClient()
    : mSock(-1) {
OMXClient::OMXClient() {
}

OMXClient::~OMXClient() {
@@ -41,10 +40,6 @@ OMXClient::~OMXClient() {
status_t OMXClient::connect() {
    Mutex::Autolock autoLock(mLock);

    if (mSock >= 0) {
        return UNKNOWN_ERROR;
    }

    sp<IServiceManager> sm = defaultServiceManager();
    sp<IBinder> binder = sm->getService(String16("media.player"));
    sp<IMediaPlayerService> service = interface_cast<IMediaPlayerService>(binder);
@@ -54,152 +49,22 @@ status_t OMXClient::connect() {
    mOMX = service->createOMX();
    assert(mOMX.get() != NULL);

#if IOMX_USES_SOCKETS
    status_t result = mOMX->connect(&mSock);
    if (result != OK) {
        mSock = -1;

        mOMX = NULL;
        return result;
    }

    pthread_attr_t attr;
    pthread_attr_init(&attr);
    pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE);

    int err = pthread_create(&mThread, &attr, ThreadWrapper, this);
    assert(err == 0);

    pthread_attr_destroy(&attr);
#else
    mReflector = new OMXClientReflector(this);
#endif

    return OK;
}

void OMXClient::disconnect() {
    {
    Mutex::Autolock autoLock(mLock);

        if (mSock < 0) {
    if (mReflector.get() != NULL) {
        return;
    }

    assert(mObservers.isEmpty());
    }

#if IOMX_USES_SOCKETS
    omx_message msg;
    msg.type = omx_message::DISCONNECT;
    ssize_t n = send(mSock, &msg, sizeof(msg), 0);
    assert(n > 0 && static_cast<size_t>(n) == sizeof(msg));

    void *dummy;
    pthread_join(mThread, &dummy);
#else
    mReflector->reset();
    mReflector.clear();
#endif
}

#if IOMX_USES_SOCKETS
// static
void *OMXClient::ThreadWrapper(void *me) {
    ((OMXClient *)me)->threadEntry();

    return NULL;
}

void OMXClient::threadEntry() {
    bool done = false;
    while (!done) {
        omx_message msg;
        ssize_t n = recv(mSock, &msg, sizeof(msg), 0);

        if (n <= 0) {
            break;
        }

        done = onOMXMessage(msg);
    }

    Mutex::Autolock autoLock(mLock);
    close(mSock);
    mSock = -1;
}
#endif

status_t OMXClient::fillBuffer(IOMX::node_id node, IOMX::buffer_id buffer) {
#if !IOMX_USES_SOCKETS
    mOMX->fill_buffer(node, buffer);
#else
    if (mSock < 0) {
        return UNKNOWN_ERROR;
    }

    omx_message msg;
    msg.type = omx_message::FILL_BUFFER;
    msg.u.buffer_data.node = node;
    msg.u.buffer_data.buffer = buffer;

    ssize_t n = send(mSock, &msg, sizeof(msg), 0);
    assert(n > 0 && static_cast<size_t>(n) == sizeof(msg));
#endif

    return OK;
}

status_t OMXClient::emptyBuffer(
        IOMX::node_id node, IOMX::buffer_id buffer,
        OMX_U32 range_offset, OMX_U32 range_length,
        OMX_U32 flags, OMX_TICKS timestamp) {
#if !IOMX_USES_SOCKETS
    mOMX->empty_buffer(
            node, buffer, range_offset, range_length, flags, timestamp);
#else
    if (mSock < 0) {
        return UNKNOWN_ERROR;
    }

    // XXX I don't like all this copying...

    omx_message msg;
    msg.type = omx_message::EMPTY_BUFFER;
    msg.u.extended_buffer_data.node = node;
    msg.u.extended_buffer_data.buffer = buffer;
    msg.u.extended_buffer_data.range_offset = range_offset;
    msg.u.extended_buffer_data.range_length = range_length;
    msg.u.extended_buffer_data.flags = flags;
    msg.u.extended_buffer_data.timestamp = timestamp;

    ssize_t n = send(mSock, &msg, sizeof(msg), 0);
    assert(n > 0 && static_cast<size_t>(n) == sizeof(msg));
#endif

    return OK;
}

status_t OMXClient::send_command(
        IOMX::node_id node, OMX_COMMANDTYPE cmd, OMX_S32 param) {
#if !IOMX_USES_SOCKETS
    return mOMX->send_command(node, cmd, param);
#else
    if (mSock < 0) {
        return UNKNOWN_ERROR;
    }

    omx_message msg;
    msg.type = omx_message::SEND_COMMAND;
    msg.u.send_command_data.node = node;
    msg.u.send_command_data.cmd = cmd;
    msg.u.send_command_data.param = param;

    ssize_t n = send(mSock, &msg, sizeof(msg), 0);
    assert(n > 0 && static_cast<size_t>(n) == sizeof(msg));
#endif

    return OK;
}

status_t OMXClient::registerObserver(
@@ -214,9 +79,7 @@ status_t OMXClient::registerObserver(
    mObservers.add(node, observer);
    observer->start();

#if !IOMX_USES_SOCKETS
    mOMX->observe_node(node, mReflector);
#endif

    return OK;
}
@@ -263,15 +126,6 @@ bool OMXClient::onOMXMessage(const omx_message &msg) {
            break;
        }

#if IOMX_USES_SOCKETS
        case omx_message::DISCONNECTED:
        {
            LOGV("Disconnected");
            done = true;
            break;
        }
#endif

        default:
            LOGE("received unknown omx_message type %d", msg.type);
            break;
+9 −15
Original line number Diff line number Diff line
@@ -1041,8 +1041,7 @@ void OMXDecoder::onEventCmdComplete(OMX_COMMANDTYPE type, OMX_U32 data) {
                IOMX::buffer_id buffer = *obuffers->begin();
                obuffers->erase(obuffers->begin());

                status_t err = mClient->fillBuffer(mNode, buffer);
                assert(err == NO_ERROR);
                mOMX->fill_buffer(mNode, buffer);
            }

            break;
@@ -1178,7 +1177,7 @@ void OMXDecoder::onStateChanged(OMX_STATETYPE to) {

        LOGV("Executing->Idle complete, initiating Idle->Loaded");
        status_t err =
            mClient->send_command(mNode, OMX_CommandStateSet, OMX_StateLoaded);
            mOMX->send_command(mNode, OMX_CommandStateSet, OMX_StateLoaded);
        assert(err == NO_ERROR);

        freePortBuffers(kPortIndexInput);
@@ -1215,7 +1214,7 @@ void OMXDecoder::initiateShutdown() {
        setPortStatus(kPortIndexInput, kPortStatusFlushingToShutdown);
        setPortStatus(kPortIndexOutput, kPortStatusFlushingToShutdown);
    } else {
        err = mClient->send_command(
        err = mOMX->send_command(
                mNode, OMX_CommandStateSet, OMX_StateIdle);

        setPortStatus(kPortIndexInput, kPortStatusShutdown);
@@ -1300,14 +1299,14 @@ void OMXDecoder::onFillBufferDone(const omx_message &msg) {
        default:
        {
            if (msg.type == omx_message::INITIAL_FILL_BUFFER) {
                err = mClient->fillBuffer(mNode, buffer);
                mOMX->fill_buffer(mNode, buffer);
            } else {
                LOGV("[%s] Filled OUTPUT buffer %p, flags=0x%08lx.",
                     mComponentName, buffer, msg.u.extended_buffer_data.flags);

                onRealFillBufferDone(msg);
                err = NO_ERROR;
            }
            err = NO_ERROR;
            break;
        }
    }
@@ -1348,13 +1347,11 @@ void OMXDecoder::onRealEmptyBufferDone(IOMX::buffer_id buffer) {

        ++mCodecSpecificDataIterator;

        status_t err = mClient->emptyBuffer(
        mOMX->empty_buffer(
                mNode, buffer, 0, range_length, 
                OMX_BUFFERFLAG_ENDOFFRAME | OMX_BUFFERFLAG_CODECCONFIG,
                0);

        assert(err == NO_ERROR);

        return;
    }

@@ -1385,10 +1382,9 @@ void OMXDecoder::onRealEmptyBufferDone(IOMX::buffer_id buffer) {
        }

        if (err != OK) {
            status_t err2 = mClient->emptyBuffer(
            mOMX->empty_buffer(
                    mNode, buffer, 0, 0, OMX_BUFFERFLAG_EOS, 0);

            assert(err2 == NO_ERROR);
            return;
        }

@@ -1452,9 +1448,8 @@ void OMXDecoder::onRealEmptyBufferDone(IOMX::buffer_id buffer) {
    LOGV("[%s] Calling EmptyBuffer on buffer %p size:%d flags:0x%08lx",
         mComponentName, buffer, src_length, flags);

    status_t err2 = mClient->emptyBuffer(
    mOMX->empty_buffer(
            mNode, buffer, 0, src_length, flags, timestamp);
    assert(err2 == OK);
}

void OMXDecoder::onRealFillBufferDone(const omx_message &msg) {
@@ -1517,8 +1512,7 @@ void OMXDecoder::signalBufferReturned(MediaBuffer *_buffer) {
    } else {
        LOGV("[%s] Calling FillBuffer on buffer %p.", mComponentName, buffer);

        status_t err = mClient->fillBuffer(mNode, buffer);
        assert(err == NO_ERROR);
        mOMX->fill_buffer(mNode, buffer);
    }
}

Loading