IOMX.cpp revision 20111aa043c5f404472bc63b90bc5aad906b1101
120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber//#define LOG_NDEBUG 0
220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#define LOG_TAG "IOMX"
320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#include <utils/Log.h>
420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#include <binder/IMemory.h>
620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#include <binder/Parcel.h>
720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#include <media/IOMX.h>
820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
920111aa043c5f404472bc63b90bc5aad906b1101Andreas Hubernamespace android {
1020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
1120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberenum {
1220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    CONNECT = IBinder::FIRST_CALL_TRANSACTION,
1320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    LIST_NODES,
1420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    ALLOCATE_NODE,
1520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    FREE_NODE,
1620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    SEND_COMMAND,
1720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    GET_PARAMETER,
1820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    SET_PARAMETER,
1920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    USE_BUFFER,
2020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    ALLOC_BUFFER,
2120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    ALLOC_BUFFER_WITH_BACKUP,
2220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    FREE_BUFFER,
2320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    OBSERVE_NODE,
2420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    FILL_BUFFER,
2520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    EMPTY_BUFFER,
2620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    OBSERVER_ON_MSG,
2720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber};
2820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
2920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberstatic void *readVoidStar(const Parcel *parcel) {
3020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    // FIX if sizeof(void *) != sizeof(int32)
3120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    return (void *)parcel->readInt32();
3220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}
3320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
3420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberstatic void writeVoidStar(void *x, Parcel *parcel) {
3520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    // FIX if sizeof(void *) != sizeof(int32)
3620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    parcel->writeInt32((int32_t)x);
3720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}
3820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
3920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberclass BpOMX : public BpInterface<IOMX> {
4020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberpublic:
4120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    BpOMX(const sp<IBinder> &impl)
4220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        : BpInterface<IOMX>(impl) {
4320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    }
4420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
4520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#if IOMX_USES_SOCKETS
4620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    virtual status_t connect(int *sd) {
4720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        Parcel data, reply;
4820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
4920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        remote()->transact(CONNECT, data, &reply);
5020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
5120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        status_t err = reply.readInt32();
5220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        if (err == OK) {
5320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            *sd = dup(reply.readFileDescriptor());
5420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        } else {
5520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            *sd = -1;
5620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        }
5720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
5820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        return reply.readInt32();
5920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    }
6020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#endif
6120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
6220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    virtual status_t list_nodes(List<String8> *list) {
6320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        list->clear();
6420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
6520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        Parcel data, reply;
6620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
6720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        remote()->transact(LIST_NODES, data, &reply);
6820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
6920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        int32_t n = reply.readInt32();
7020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        for (int32_t i = 0; i < n; ++i) {
7120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            String8 s = reply.readString8();
7220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
7320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            list->push_back(s);
7420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        }
7520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
7620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        return OK;
7720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    }
7820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
7920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    virtual status_t allocate_node(const char *name, node_id *node) {
8020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        Parcel data, reply;
8120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
8220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        data.writeCString(name);
8320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        remote()->transact(ALLOCATE_NODE, data, &reply);
8420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
8520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        status_t err = reply.readInt32();
8620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        if (err == OK) {
8720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            *node = readVoidStar(&reply);
8820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        } else {
8920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            *node = 0;
9020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        }
9120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
9220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        return err;
9320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    }
9420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
9520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    virtual status_t free_node(node_id node) {
9620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        Parcel data, reply;
9720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
9820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        writeVoidStar(node, &data);
9920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        remote()->transact(FREE_NODE, data, &reply);
10020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
10120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        return reply.readInt32();
10220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    }
10320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
10420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    virtual status_t send_command(
10520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            node_id node, OMX_COMMANDTYPE cmd, OMX_S32 param) {
10620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        Parcel data, reply;
10720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
10820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        writeVoidStar(node, &data);
10920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        data.writeInt32(cmd);
11020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        data.writeInt32(param);
11120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        remote()->transact(SEND_COMMAND, data, &reply);
11220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
11320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        return reply.readInt32();
11420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    }
11520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
11620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    virtual status_t get_parameter(
11720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            node_id node, OMX_INDEXTYPE index,
11820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            void *params, size_t size) {
11920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        Parcel data, reply;
12020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
12120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        writeVoidStar(node, &data);
12220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        data.writeInt32(index);
12320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        data.writeInt32(size);
12420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        data.write(params, size);
12520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        remote()->transact(GET_PARAMETER, data, &reply);
12620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
12720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        status_t err = reply.readInt32();
12820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        if (err != OK) {
12920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            return err;
13020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        }
13120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
13220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        reply.read(params, size);
13320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
13420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        return OK;
13520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    }
13620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
13720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    virtual status_t set_parameter(
13820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            node_id node, OMX_INDEXTYPE index,
13920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            const void *params, size_t size) {
14020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        Parcel data, reply;
14120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
14220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        writeVoidStar(node, &data);
14320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        data.writeInt32(index);
14420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        data.writeInt32(size);
14520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        data.write(params, size);
14620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        remote()->transact(SET_PARAMETER, data, &reply);
14720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
14820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        return reply.readInt32();
14920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    }
15020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
15120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    virtual status_t use_buffer(
15220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            node_id node, OMX_U32 port_index, const sp<IMemory> &params,
15320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            buffer_id *buffer) {
15420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        Parcel data, reply;
15520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
15620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        writeVoidStar(node, &data);
15720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        data.writeInt32(port_index);
15820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        data.writeStrongBinder(params->asBinder());
15920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        remote()->transact(USE_BUFFER, data, &reply);
16020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
16120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        status_t err = reply.readInt32();
16220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        if (err != OK) {
16320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            *buffer = 0;
16420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
16520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            return err;
16620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        }
16720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
16820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        *buffer = readVoidStar(&reply);
16920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
17020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        return err;
17120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    }
17220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
17320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    virtual status_t allocate_buffer(
17420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            node_id node, OMX_U32 port_index, size_t size,
17520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            buffer_id *buffer) {
17620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        Parcel data, reply;
17720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
17820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        writeVoidStar(node, &data);
17920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        data.writeInt32(port_index);
18020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        data.writeInt32(size);
18120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        remote()->transact(ALLOC_BUFFER, data, &reply);
18220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
18320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        status_t err = reply.readInt32();
18420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        if (err != OK) {
18520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            *buffer = 0;
18620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
18720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            return err;
18820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        }
18920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
19020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        *buffer = readVoidStar(&reply);
19120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
19220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        return err;
19320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    }
19420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
19520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    virtual status_t allocate_buffer_with_backup(
19620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            node_id node, OMX_U32 port_index, const sp<IMemory> &params,
19720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            buffer_id *buffer) {
19820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        Parcel data, reply;
19920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
20020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        writeVoidStar(node, &data);
20120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        data.writeInt32(port_index);
20220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        data.writeStrongBinder(params->asBinder());
20320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        remote()->transact(ALLOC_BUFFER_WITH_BACKUP, data, &reply);
20420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
20520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        status_t err = reply.readInt32();
20620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        if (err != OK) {
20720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            *buffer = 0;
20820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
20920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            return err;
21020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        }
21120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
21220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        *buffer = readVoidStar(&reply);
21320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
21420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        return err;
21520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    }
21620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
21720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    virtual status_t free_buffer(
21820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            node_id node, OMX_U32 port_index, buffer_id buffer) {
21920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        Parcel data, reply;
22020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
22120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        writeVoidStar(node, &data);
22220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        data.writeInt32(port_index);
22320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        writeVoidStar(buffer, &data);
22420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        remote()->transact(FREE_BUFFER, data, &reply);
22520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
22620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        return reply.readInt32();
22720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    }
22820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
22920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#if !IOMX_USES_SOCKETS
23020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    virtual status_t observe_node(
23120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            node_id node, const sp<IOMXObserver> &observer) {
23220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        Parcel data, reply;
23320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
23420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        writeVoidStar(node, &data);
23520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        data.writeStrongBinder(observer->asBinder());
23620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        remote()->transact(OBSERVE_NODE, data, &reply);
23720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
23820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        return reply.readInt32();
23920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    }
24020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
24120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    virtual void fill_buffer(node_id node, buffer_id buffer) {
24220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        Parcel data, reply;
24320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
24420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        writeVoidStar(node, &data);
24520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        writeVoidStar(buffer, &data);
24620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        remote()->transact(FILL_BUFFER, data, &reply, IBinder::FLAG_ONEWAY);
24720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    }
24820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
24920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    virtual void empty_buffer(
25020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            node_id node,
25120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            buffer_id buffer,
25220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            OMX_U32 range_offset, OMX_U32 range_length,
25320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            OMX_U32 flags, OMX_TICKS timestamp) {
25420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        Parcel data, reply;
25520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
25620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        writeVoidStar(node, &data);
25720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        writeVoidStar(buffer, &data);
25820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        data.writeInt32(range_offset);
25920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        data.writeInt32(range_length);
26020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        data.writeInt32(flags);
26120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        data.writeInt64(timestamp);
26220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        remote()->transact(EMPTY_BUFFER, data, &reply, IBinder::FLAG_ONEWAY);
26320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    }
26420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#endif
26520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber};
26620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
26720111aa043c5f404472bc63b90bc5aad906b1101Andreas HuberIMPLEMENT_META_INTERFACE(OMX, "android.hardware.IOMX");
26820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
26920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber////////////////////////////////////////////////////////////////////////////////
27020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
27120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#define CHECK_INTERFACE(interface, data, reply) \
27220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        do { if (!data.enforceInterface(interface::getInterfaceDescriptor())) { \
27320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            LOGW("Call incorrectly routed to " #interface); \
27420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            return PERMISSION_DENIED; \
27520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        } } while (0)
27620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
27720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberstatus_t BnOMX::onTransact(
27820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    uint32_t code, const Parcel &data, Parcel *reply, uint32_t flags) {
27920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    switch (code) {
28020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#if IOMX_USES_SOCKETS
28120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        case CONNECT:
28220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        {
28320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            CHECK_INTERFACE(IOMX, data, reply);
28420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
28520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            int s;
28620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            status_t err = connect(&s);
28720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
28820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            reply->writeInt32(err);
28920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            if (err == OK) {
29020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber                assert(s >= 0);
29120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber                reply->writeDupFileDescriptor(s);
29220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber                close(s);
29320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber                s = -1;
29420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            } else {
29520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber                assert(s == -1);
29620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            }
29720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
29820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            return NO_ERROR;
29920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        }
30020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#endif
30120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
30220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        case LIST_NODES:
30320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        {
30420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            CHECK_INTERFACE(IOMX, data, reply);
30520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
30620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            List<String8> list;
30720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            list_nodes(&list);
30820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
30920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            reply->writeInt32(list.size());
31020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            for (List<String8>::iterator it = list.begin();
31120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber                 it != list.end(); ++it) {
31220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber                reply->writeString8(*it);
31320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            }
31420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
31520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            return NO_ERROR;
31620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        }
31720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
31820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        case ALLOCATE_NODE:
31920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        {
32020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            CHECK_INTERFACE(IOMX, data, reply);
32120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
32220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            node_id node;
32320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            status_t err = allocate_node(data.readCString(), &node);
32420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            reply->writeInt32(err);
32520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            if (err == OK) {
32620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber                writeVoidStar(node, reply);
32720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            }
32820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
32920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            return NO_ERROR;
33020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        }
33120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
33220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        case FREE_NODE:
33320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        {
33420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            CHECK_INTERFACE(IOMX, data, reply);
33520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
33620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            node_id node = readVoidStar(&data);
33720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
33820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            reply->writeInt32(free_node(node));
33920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
34020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            return NO_ERROR;
34120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        }
34220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
34320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        case SEND_COMMAND:
34420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        {
34520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            CHECK_INTERFACE(IOMX, data, reply);
34620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
34720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            node_id node = readVoidStar(&data);
34820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
34920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            OMX_COMMANDTYPE cmd =
35020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber                static_cast<OMX_COMMANDTYPE>(data.readInt32());
35120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
35220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            OMX_S32 param = data.readInt32();
35320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            reply->writeInt32(send_command(node, cmd, param));
35420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
35520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            return NO_ERROR;
35620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        }
35720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
35820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        case GET_PARAMETER:
35920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        {
36020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            CHECK_INTERFACE(IOMX, data, reply);
36120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
36220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            node_id node = readVoidStar(&data);
36320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            OMX_INDEXTYPE index = static_cast<OMX_INDEXTYPE>(data.readInt32());
36420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
36520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            size_t size = data.readInt32();
36620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
36720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            // XXX I am not happy with this but Parcel::readInplace didn't work.
36820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            void *params = malloc(size);
36920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            data.read(params, size);
37020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
37120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            status_t err = get_parameter(node, index, params, size);
37220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
37320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            reply->writeInt32(err);
37420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
37520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            if (err == OK) {
37620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber                reply->write(params, size);
37720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            }
37820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
37920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            free(params);
38020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            params = NULL;
38120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
38220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            return NO_ERROR;
38320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        }
38420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
38520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        case SET_PARAMETER:
38620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        {
38720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            CHECK_INTERFACE(IOMX, data, reply);
38820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
38920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            node_id node = readVoidStar(&data);
39020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            OMX_INDEXTYPE index = static_cast<OMX_INDEXTYPE>(data.readInt32());
39120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
39220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            size_t size = data.readInt32();
39320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            void *params = const_cast<void *>(data.readInplace(size));
39420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
39520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            reply->writeInt32(set_parameter(node, index, params, size));
39620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
39720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            return NO_ERROR;
39820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        }
39920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
40020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        case USE_BUFFER:
40120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        {
40220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            CHECK_INTERFACE(IOMX, data, reply);
40320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
40420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            node_id node = readVoidStar(&data);
40520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            OMX_U32 port_index = data.readInt32();
40620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            sp<IMemory> params =
40720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber                interface_cast<IMemory>(data.readStrongBinder());
40820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
40920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            buffer_id buffer;
41020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            status_t err = use_buffer(node, port_index, params, &buffer);
41120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            reply->writeInt32(err);
41220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
41320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            if (err == OK) {
41420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber                writeVoidStar(buffer, reply);
41520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            }
41620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
41720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            return NO_ERROR;
41820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        }
41920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
42020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        case ALLOC_BUFFER:
42120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        {
42220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            CHECK_INTERFACE(IOMX, data, reply);
42320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
42420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            node_id node = readVoidStar(&data);
42520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            OMX_U32 port_index = data.readInt32();
42620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            size_t size = data.readInt32();
42720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
42820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            buffer_id buffer;
42920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            status_t err = allocate_buffer(node, port_index, size, &buffer);
43020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            reply->writeInt32(err);
43120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
43220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            if (err == OK) {
43320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber                writeVoidStar(buffer, reply);
43420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            }
43520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
43620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            return NO_ERROR;
43720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        }
43820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
43920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        case ALLOC_BUFFER_WITH_BACKUP:
44020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        {
44120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            CHECK_INTERFACE(IOMX, data, reply);
44220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
44320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            node_id node = readVoidStar(&data);
44420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            OMX_U32 port_index = data.readInt32();
44520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            sp<IMemory> params =
44620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber                interface_cast<IMemory>(data.readStrongBinder());
44720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
44820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            buffer_id buffer;
44920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            status_t err = allocate_buffer_with_backup(
45020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber                    node, port_index, params, &buffer);
45120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
45220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            reply->writeInt32(err);
45320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
45420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            if (err == OK) {
45520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber                writeVoidStar(buffer, reply);
45620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            }
45720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
45820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            return NO_ERROR;
45920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        }
46020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
46120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        case FREE_BUFFER:
46220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        {
46320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            CHECK_INTERFACE(IOMX, data, reply);
46420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
46520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            node_id node = readVoidStar(&data);
46620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            OMX_U32 port_index = data.readInt32();
46720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            buffer_id buffer = readVoidStar(&data);
46820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            reply->writeInt32(free_buffer(node, port_index, buffer));
46920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
47020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            return NO_ERROR;
47120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        }
47220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
47320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#if !IOMX_USES_SOCKETS
47420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        case OBSERVE_NODE:
47520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        {
47620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            CHECK_INTERFACE(IOMX, data, reply);
47720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
47820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            node_id node = readVoidStar(&data);
47920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            sp<IOMXObserver> observer =
48020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber                interface_cast<IOMXObserver>(data.readStrongBinder());
48120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            reply->writeInt32(observe_node(node, observer));
48220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
48320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            return NO_ERROR;
48420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        }
48520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
48620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        case FILL_BUFFER:
48720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        {
48820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            CHECK_INTERFACE(IOMX, data, reply);
48920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
49020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            node_id node = readVoidStar(&data);
49120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            buffer_id buffer = readVoidStar(&data);
49220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            fill_buffer(node, buffer);
49320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
49420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            return NO_ERROR;
49520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        }
49620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
49720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        case EMPTY_BUFFER:
49820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        {
49920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            CHECK_INTERFACE(IOMX, data, reply);
50020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
50120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            node_id node = readVoidStar(&data);
50220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            buffer_id buffer = readVoidStar(&data);
50320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            OMX_U32 range_offset = data.readInt32();
50420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            OMX_U32 range_length = data.readInt32();
50520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            OMX_U32 flags = data.readInt32();
50620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            OMX_TICKS timestamp = data.readInt64();
50720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
50820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            empty_buffer(
50920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber                    node, buffer, range_offset, range_length,
51020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber                    flags, timestamp);
51120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
51220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            return NO_ERROR;
51320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        }
51420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#endif
51520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
51620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        default:
51720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            return BBinder::onTransact(code, data, reply, flags);
51820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    }
51920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}
52020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
52120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber////////////////////////////////////////////////////////////////////////////////
52220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
52320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberclass BpOMXObserver : public BpInterface<IOMXObserver> {
52420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberpublic:
52520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    BpOMXObserver(const sp<IBinder> &impl)
52620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        : BpInterface<IOMXObserver>(impl) {
52720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    }
52820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
52920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    virtual void on_message(const omx_message &msg) {
53020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        Parcel data, reply;
53120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        data.writeInterfaceToken(IOMXObserver::getInterfaceDescriptor());
53220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        data.write(&msg, sizeof(msg));
53320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
53420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        remote()->transact(OBSERVER_ON_MSG, data, &reply, IBinder::FLAG_ONEWAY);
53520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    }
53620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber};
53720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
53820111aa043c5f404472bc63b90bc5aad906b1101Andreas HuberIMPLEMENT_META_INTERFACE(OMXObserver, "android.hardware.IOMXObserver");
53920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
54020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberstatus_t BnOMXObserver::onTransact(
54120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    uint32_t code, const Parcel &data, Parcel *reply, uint32_t flags) {
54220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    switch (code) {
54320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        case OBSERVER_ON_MSG:
54420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        {
54520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            CHECK_INTERFACE(IOMXObserver, data, reply);
54620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
54720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            omx_message msg;
54820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            data.read(&msg, sizeof(msg));
54920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
55020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            // XXX Could use readInplace maybe?
55120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            on_message(msg);
55220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
55320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            return NO_ERROR;
55420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        }
55520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
55620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        default:
55720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            return BBinder::onTransact(code, data, reply, flags);
55820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    }
55920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}
56020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
56120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}  // namespace android
562