IOMX.cpp revision b391290130f263441334ee4525a5832f0bea2ef0
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>
8b391290130f263441334ee4525a5832f0bea2ef0Andreas Huber#include <media/stagefright/foundation/ADebug.h>
93cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian#include <surfaceflinger/ISurface.h>
103cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian#include <surfaceflinger/Surface.h>
1120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
1220111aa043c5f404472bc63b90bc5aad906b1101Andreas Hubernamespace android {
1320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
1420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberenum {
1520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    CONNECT = IBinder::FIRST_CALL_TRANSACTION,
167eaa9c9385535b651064e02d05a8ffa4b2359281Andreas Huber    LIVES_LOCALLY,
1720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    LIST_NODES,
1820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    ALLOCATE_NODE,
1920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    FREE_NODE,
2020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    SEND_COMMAND,
2120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    GET_PARAMETER,
2220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    SET_PARAMETER,
23693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber    GET_CONFIG,
24693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber    SET_CONFIG,
2583750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis    ENABLE_GRAPHIC_BUFFERS,
2620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    USE_BUFFER,
2783750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis    USE_GRAPHIC_BUFFER,
28e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong    STORE_META_DATA_IN_BUFFERS,
2920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    ALLOC_BUFFER,
3020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    ALLOC_BUFFER_WITH_BACKUP,
3120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    FREE_BUFFER,
3220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    FILL_BUFFER,
3320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    EMPTY_BUFFER,
34693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber    GET_EXTENSION_INDEX,
3520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    OBSERVER_ON_MSG,
3620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber};
3720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
3820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberclass BpOMX : public BpInterface<IOMX> {
3920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberpublic:
4020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    BpOMX(const sp<IBinder> &impl)
4120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        : BpInterface<IOMX>(impl) {
4220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    }
4320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
447eaa9c9385535b651064e02d05a8ffa4b2359281Andreas Huber    virtual bool livesLocally(pid_t pid) {
457eaa9c9385535b651064e02d05a8ffa4b2359281Andreas Huber        Parcel data, reply;
467eaa9c9385535b651064e02d05a8ffa4b2359281Andreas Huber        data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
477eaa9c9385535b651064e02d05a8ffa4b2359281Andreas Huber        data.writeInt32(pid);
487eaa9c9385535b651064e02d05a8ffa4b2359281Andreas Huber        remote()->transact(LIVES_LOCALLY, data, &reply);
497eaa9c9385535b651064e02d05a8ffa4b2359281Andreas Huber
507eaa9c9385535b651064e02d05a8ffa4b2359281Andreas Huber        return reply.readInt32() != 0;
517eaa9c9385535b651064e02d05a8ffa4b2359281Andreas Huber    }
527eaa9c9385535b651064e02d05a8ffa4b2359281Andreas Huber
53134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber    virtual status_t listNodes(List<ComponentInfo> *list) {
5420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        list->clear();
5520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
5620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        Parcel data, reply;
5720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
5820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        remote()->transact(LIST_NODES, data, &reply);
5920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
6020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        int32_t n = reply.readInt32();
6120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        for (int32_t i = 0; i < n; ++i) {
62134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber            list->push_back(ComponentInfo());
63134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber            ComponentInfo &info = *--list->end();
6420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
65134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber            info.mName = reply.readString8();
66134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber            int32_t numRoles = reply.readInt32();
67134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber            for (int32_t j = 0; j < numRoles; ++j) {
68134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber                info.mRoles.push_back(reply.readString8());
69134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber            }
7020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        }
7120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
7220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        return OK;
7320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    }
7420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
75318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    virtual status_t allocateNode(
76318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber            const char *name, const sp<IOMXObserver> &observer, node_id *node) {
7720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        Parcel data, reply;
7820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
7920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        data.writeCString(name);
80318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        data.writeStrongBinder(observer->asBinder());
8120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        remote()->transact(ALLOCATE_NODE, data, &reply);
8220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
8320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        status_t err = reply.readInt32();
8420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        if (err == OK) {
85c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber            *node = (void*)reply.readIntPtr();
8620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        } else {
8720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            *node = 0;
8820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        }
8920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
9020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        return err;
9120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    }
9220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
93318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    virtual status_t freeNode(node_id node) {
9420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        Parcel data, reply;
9520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
96c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber        data.writeIntPtr((intptr_t)node);
9720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        remote()->transact(FREE_NODE, data, &reply);
9820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
9920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        return reply.readInt32();
10020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    }
10120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
102318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    virtual status_t sendCommand(
10320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            node_id node, OMX_COMMANDTYPE cmd, OMX_S32 param) {
10420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        Parcel data, reply;
10520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
106c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber        data.writeIntPtr((intptr_t)node);
10720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        data.writeInt32(cmd);
10820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        data.writeInt32(param);
10920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        remote()->transact(SEND_COMMAND, data, &reply);
11020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
11120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        return reply.readInt32();
11220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    }
11320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
114318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    virtual status_t getParameter(
11520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            node_id node, OMX_INDEXTYPE index,
11620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            void *params, size_t size) {
11720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        Parcel data, reply;
11820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
119c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber        data.writeIntPtr((intptr_t)node);
12020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        data.writeInt32(index);
12120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        data.writeInt32(size);
12220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        data.write(params, size);
12320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        remote()->transact(GET_PARAMETER, data, &reply);
12420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
12520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        status_t err = reply.readInt32();
12620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        if (err != OK) {
12720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            return err;
12820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        }
12920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
13020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        reply.read(params, size);
13120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
13220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        return OK;
13320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    }
13420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
135318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    virtual status_t setParameter(
13620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            node_id node, OMX_INDEXTYPE index,
13720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            const void *params, size_t size) {
13820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        Parcel data, reply;
13920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
140c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber        data.writeIntPtr((intptr_t)node);
14120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        data.writeInt32(index);
14220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        data.writeInt32(size);
14320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        data.write(params, size);
14420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        remote()->transact(SET_PARAMETER, data, &reply);
14520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
14620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        return reply.readInt32();
14720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    }
14820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
149318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    virtual status_t getConfig(
150693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber            node_id node, OMX_INDEXTYPE index,
151693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber            void *params, size_t size) {
152693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        Parcel data, reply;
153693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
154c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber        data.writeIntPtr((intptr_t)node);
155693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        data.writeInt32(index);
156693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        data.writeInt32(size);
157693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        data.write(params, size);
158693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        remote()->transact(GET_CONFIG, data, &reply);
159693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber
160693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        status_t err = reply.readInt32();
161693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        if (err != OK) {
162693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber            return err;
163693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        }
164693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber
165693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        reply.read(params, size);
166693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber
167693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        return OK;
168693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber    }
169693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber
170318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    virtual status_t setConfig(
171693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber            node_id node, OMX_INDEXTYPE index,
172693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber            const void *params, size_t size) {
173693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        Parcel data, reply;
174693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
175c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber        data.writeIntPtr((intptr_t)node);
176693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        data.writeInt32(index);
177693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        data.writeInt32(size);
178693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        data.write(params, size);
179693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        remote()->transact(SET_CONFIG, data, &reply);
180693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber
181693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        return reply.readInt32();
182693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber    }
183693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber
18483750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis    virtual status_t enableGraphicBuffers(
18583750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis            node_id node, OMX_U32 port_index, OMX_BOOL enable) {
18683750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis        Parcel data, reply;
18783750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis        data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
18883750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis        data.writeIntPtr((intptr_t)node);
18983750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis        data.writeInt32(port_index);
19083750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis        data.writeInt32((uint32_t)enable);
19183750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis        remote()->transact(ENABLE_GRAPHIC_BUFFERS, data, &reply);
19283750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis
19383750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis        status_t err = reply.readInt32();
19483750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis        return err;
19583750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis    }
19683750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis
197318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    virtual status_t useBuffer(
19820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            node_id node, OMX_U32 port_index, const sp<IMemory> &params,
19920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            buffer_id *buffer) {
20020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        Parcel data, reply;
20120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
202c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber        data.writeIntPtr((intptr_t)node);
20320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        data.writeInt32(port_index);
20420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        data.writeStrongBinder(params->asBinder());
20520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        remote()->transact(USE_BUFFER, data, &reply);
20620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
20720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        status_t err = reply.readInt32();
20820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        if (err != OK) {
20920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            *buffer = 0;
21020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
21120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            return err;
21220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        }
21320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
214c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber        *buffer = (void*)reply.readIntPtr();
21520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
21620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        return err;
21720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    }
21820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
21983750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis
22083750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis    virtual status_t useGraphicBuffer(
22183750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis            node_id node, OMX_U32 port_index,
22283750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis            const sp<GraphicBuffer> &graphicBuffer, buffer_id *buffer) {
22383750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis        Parcel data, reply;
22483750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis        data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
22583750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis        data.writeIntPtr((intptr_t)node);
22683750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis        data.writeInt32(port_index);
22783750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis        data.write(*graphicBuffer);
22883750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis        remote()->transact(USE_GRAPHIC_BUFFER, data, &reply);
22983750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis
23083750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis        status_t err = reply.readInt32();
23183750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis        if (err != OK) {
23283750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis            *buffer = 0;
23383750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis
23483750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis            return err;
23583750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis        }
23683750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis
23783750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis        *buffer = (void*)reply.readIntPtr();
23883750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis
23983750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis        return err;
24083750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis    }
24183750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis
242e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong    virtual status_t storeMetaDataInBuffers(
243e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong            node_id node, OMX_U32 port_index, OMX_BOOL enable) {
244e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong        Parcel data, reply;
245e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong        data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
246e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong        data.writeIntPtr((intptr_t)node);
247e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong        data.writeInt32(port_index);
248e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong        data.writeInt32((uint32_t)enable);
249e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong        remote()->transact(STORE_META_DATA_IN_BUFFERS, data, &reply);
250e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong
251e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong        status_t err = reply.readInt32();
252e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong        return err;
253e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong    }
254e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong
255318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    virtual status_t allocateBuffer(
25620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            node_id node, OMX_U32 port_index, size_t size,
257570a3cb7582daa030cb38eedc5eb6a06f86ecc7fAndreas Huber            buffer_id *buffer, void **buffer_data) {
25820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        Parcel data, reply;
25920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
260c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber        data.writeIntPtr((intptr_t)node);
26120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        data.writeInt32(port_index);
26220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        data.writeInt32(size);
26320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        remote()->transact(ALLOC_BUFFER, data, &reply);
26420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
26520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        status_t err = reply.readInt32();
26620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        if (err != OK) {
26720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            *buffer = 0;
26820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
26920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            return err;
27020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        }
27120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
272570a3cb7582daa030cb38eedc5eb6a06f86ecc7fAndreas Huber        *buffer = (void *)reply.readIntPtr();
273570a3cb7582daa030cb38eedc5eb6a06f86ecc7fAndreas Huber        *buffer_data = (void *)reply.readIntPtr();
27420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
27520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        return err;
27620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    }
27720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
278318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    virtual status_t allocateBufferWithBackup(
27920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            node_id node, OMX_U32 port_index, const sp<IMemory> &params,
28020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            buffer_id *buffer) {
28120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        Parcel data, reply;
28220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
283c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber        data.writeIntPtr((intptr_t)node);
28420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        data.writeInt32(port_index);
28520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        data.writeStrongBinder(params->asBinder());
28620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        remote()->transact(ALLOC_BUFFER_WITH_BACKUP, data, &reply);
28720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
28820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        status_t err = reply.readInt32();
28920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        if (err != OK) {
29020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            *buffer = 0;
29120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
29220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            return err;
29320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        }
29420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
295c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber        *buffer = (void*)reply.readIntPtr();
29620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
29720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        return err;
29820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    }
29920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
300318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    virtual status_t freeBuffer(
30120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            node_id node, OMX_U32 port_index, buffer_id buffer) {
30220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        Parcel data, reply;
30320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
304c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber        data.writeIntPtr((intptr_t)node);
30520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        data.writeInt32(port_index);
306c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber        data.writeIntPtr((intptr_t)buffer);
30720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        remote()->transact(FREE_BUFFER, data, &reply);
30820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
30920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        return reply.readInt32();
31020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    }
31120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
312318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    virtual status_t fillBuffer(node_id node, buffer_id buffer) {
31320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        Parcel data, reply;
31420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
315c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber        data.writeIntPtr((intptr_t)node);
316c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber        data.writeIntPtr((intptr_t)buffer);
31736efa039efaae4526791336cb688032d22b34becAndreas Huber        remote()->transact(FILL_BUFFER, data, &reply);
31836efa039efaae4526791336cb688032d22b34becAndreas Huber
31936efa039efaae4526791336cb688032d22b34becAndreas Huber        return reply.readInt32();
32020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    }
32120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
322318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    virtual status_t emptyBuffer(
32320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            node_id node,
32420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            buffer_id buffer,
32520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            OMX_U32 range_offset, OMX_U32 range_length,
32620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            OMX_U32 flags, OMX_TICKS timestamp) {
32720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        Parcel data, reply;
32820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
329c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber        data.writeIntPtr((intptr_t)node);
330c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber        data.writeIntPtr((intptr_t)buffer);
33120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        data.writeInt32(range_offset);
33220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        data.writeInt32(range_length);
33320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        data.writeInt32(flags);
33420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        data.writeInt64(timestamp);
33536efa039efaae4526791336cb688032d22b34becAndreas Huber        remote()->transact(EMPTY_BUFFER, data, &reply);
33636efa039efaae4526791336cb688032d22b34becAndreas Huber
33736efa039efaae4526791336cb688032d22b34becAndreas Huber        return reply.readInt32();
33820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    }
3398b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber
340318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    virtual status_t getExtensionIndex(
341693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber            node_id node,
342693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber            const char *parameter_name,
343693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber            OMX_INDEXTYPE *index) {
344693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        Parcel data, reply;
345693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
346c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber        data.writeIntPtr((intptr_t)node);
347693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        data.writeCString(parameter_name);
348693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber
349693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        remote()->transact(GET_EXTENSION_INDEX, data, &reply);
350693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber
351693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        status_t err = reply.readInt32();
352693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        if (err == OK) {
353693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber            *index = static_cast<OMX_INDEXTYPE>(reply.readInt32());
354693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        } else {
355693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber            *index = OMX_IndexComponentStartUnused;
356693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        }
357693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber
358693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        return err;
359693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber    }
36020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber};
36120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
36220111aa043c5f404472bc63b90bc5aad906b1101Andreas HuberIMPLEMENT_META_INTERFACE(OMX, "android.hardware.IOMX");
36320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
36420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber////////////////////////////////////////////////////////////////////////////////
36520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
36620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#define CHECK_INTERFACE(interface, data, reply) \
36720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        do { if (!data.enforceInterface(interface::getInterfaceDescriptor())) { \
36820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            LOGW("Call incorrectly routed to " #interface); \
36920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            return PERMISSION_DENIED; \
37020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        } } while (0)
37120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
37220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberstatus_t BnOMX::onTransact(
37320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    uint32_t code, const Parcel &data, Parcel *reply, uint32_t flags) {
37420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    switch (code) {
3757eaa9c9385535b651064e02d05a8ffa4b2359281Andreas Huber        case LIVES_LOCALLY:
3767eaa9c9385535b651064e02d05a8ffa4b2359281Andreas Huber        {
3777eaa9c9385535b651064e02d05a8ffa4b2359281Andreas Huber            CHECK_INTERFACE(IOMX, data, reply);
3787eaa9c9385535b651064e02d05a8ffa4b2359281Andreas Huber            reply->writeInt32(livesLocally((pid_t)data.readInt32()));
3797eaa9c9385535b651064e02d05a8ffa4b2359281Andreas Huber
3807eaa9c9385535b651064e02d05a8ffa4b2359281Andreas Huber            return OK;
3817eaa9c9385535b651064e02d05a8ffa4b2359281Andreas Huber        }
3827eaa9c9385535b651064e02d05a8ffa4b2359281Andreas Huber
38320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        case LIST_NODES:
38420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        {
38520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            CHECK_INTERFACE(IOMX, data, reply);
38620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
387134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber            List<ComponentInfo> list;
388318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber            listNodes(&list);
38920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
39020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            reply->writeInt32(list.size());
391134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber            for (List<ComponentInfo>::iterator it = list.begin();
39220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber                 it != list.end(); ++it) {
393134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber                ComponentInfo &cur = *it;
394134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber
395134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber                reply->writeString8(cur.mName);
396134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber                reply->writeInt32(cur.mRoles.size());
397134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber                for (List<String8>::iterator role_it = cur.mRoles.begin();
398134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber                     role_it != cur.mRoles.end(); ++role_it) {
399134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber                    reply->writeString8(*role_it);
400134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber                }
40120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            }
40220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
40320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            return NO_ERROR;
40420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        }
40520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
40620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        case ALLOCATE_NODE:
40720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        {
40820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            CHECK_INTERFACE(IOMX, data, reply);
40920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
410318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber            const char *name = data.readCString();
411318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
412318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber            sp<IOMXObserver> observer =
413318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber                interface_cast<IOMXObserver>(data.readStrongBinder());
414318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
41520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            node_id node;
416318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
417318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber            status_t err = allocateNode(name, observer, &node);
41820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            reply->writeInt32(err);
41920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            if (err == OK) {
420c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber                reply->writeIntPtr((intptr_t)node);
42120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            }
4227eaa9c9385535b651064e02d05a8ffa4b2359281Andreas Huber
42320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            return NO_ERROR;
42420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        }
42520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
42620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        case FREE_NODE:
42720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        {
42820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            CHECK_INTERFACE(IOMX, data, reply);
42920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
430c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber            node_id node = (void*)data.readIntPtr();
43120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
432318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber            reply->writeInt32(freeNode(node));
4337eaa9c9385535b651064e02d05a8ffa4b2359281Andreas Huber
43420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            return NO_ERROR;
43520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        }
43620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
43720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        case SEND_COMMAND:
43820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        {
43920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            CHECK_INTERFACE(IOMX, data, reply);
44020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
441c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber            node_id node = (void*)data.readIntPtr();
44220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
44320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            OMX_COMMANDTYPE cmd =
44420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber                static_cast<OMX_COMMANDTYPE>(data.readInt32());
44520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
44620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            OMX_S32 param = data.readInt32();
447318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber            reply->writeInt32(sendCommand(node, cmd, param));
44820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
44920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            return NO_ERROR;
45020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        }
45120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
45220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        case GET_PARAMETER:
45320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        case SET_PARAMETER:
454693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        case GET_CONFIG:
455b391290130f263441334ee4525a5832f0bea2ef0Andreas Huber        case SET_CONFIG:
456693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        {
457693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber            CHECK_INTERFACE(IOMX, data, reply);
458693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber
459c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber            node_id node = (void*)data.readIntPtr();
460693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber            OMX_INDEXTYPE index = static_cast<OMX_INDEXTYPE>(data.readInt32());
461693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber
462693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber            size_t size = data.readInt32();
463693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber
464693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber            void *params = malloc(size);
465693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber            data.read(params, size);
466693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber
467b391290130f263441334ee4525a5832f0bea2ef0Andreas Huber            status_t err;
468b391290130f263441334ee4525a5832f0bea2ef0Andreas Huber            switch (code) {
469b391290130f263441334ee4525a5832f0bea2ef0Andreas Huber                case GET_PARAMETER:
470b391290130f263441334ee4525a5832f0bea2ef0Andreas Huber                    err = getParameter(node, index, params, size);
471b391290130f263441334ee4525a5832f0bea2ef0Andreas Huber                    break;
472b391290130f263441334ee4525a5832f0bea2ef0Andreas Huber                case SET_PARAMETER:
473b391290130f263441334ee4525a5832f0bea2ef0Andreas Huber                    err = setParameter(node, index, params, size);
474b391290130f263441334ee4525a5832f0bea2ef0Andreas Huber                    break;
475b391290130f263441334ee4525a5832f0bea2ef0Andreas Huber                case GET_CONFIG:
476b391290130f263441334ee4525a5832f0bea2ef0Andreas Huber                    err = getConfig(node, index, params, size);
477b391290130f263441334ee4525a5832f0bea2ef0Andreas Huber                    break;
478b391290130f263441334ee4525a5832f0bea2ef0Andreas Huber                case SET_CONFIG:
479b391290130f263441334ee4525a5832f0bea2ef0Andreas Huber                    err = setConfig(node, index, params, size);
480b391290130f263441334ee4525a5832f0bea2ef0Andreas Huber                    break;
481b391290130f263441334ee4525a5832f0bea2ef0Andreas Huber                default:
482b391290130f263441334ee4525a5832f0bea2ef0Andreas Huber                    TRESPASS();
483b391290130f263441334ee4525a5832f0bea2ef0Andreas Huber            }
484693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber
485693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber            reply->writeInt32(err);
486693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber
487b391290130f263441334ee4525a5832f0bea2ef0Andreas Huber            if ((code == GET_PARAMETER || code == GET_CONFIG) && err == OK) {
488693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber                reply->write(params, size);
489693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber            }
490693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber
491693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber            free(params);
492693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber            params = NULL;
493693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber
494693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber            return NO_ERROR;
495693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        }
496693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber
49783750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis        case ENABLE_GRAPHIC_BUFFERS:
49883750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis        {
49983750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis            CHECK_INTERFACE(IOMX, data, reply);
50083750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis
50183750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis            node_id node = (void*)data.readIntPtr();
50283750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis            OMX_U32 port_index = data.readInt32();
50383750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis            OMX_BOOL enable = (OMX_BOOL)data.readInt32();
50483750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis
50583750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis            status_t err = enableGraphicBuffers(node, port_index, enable);
50683750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis            reply->writeInt32(err);
50783750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis
50883750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis            return NO_ERROR;
50983750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis        }
51083750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis
51120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        case USE_BUFFER:
51220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        {
51320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            CHECK_INTERFACE(IOMX, data, reply);
51420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
515c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber            node_id node = (void*)data.readIntPtr();
51620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            OMX_U32 port_index = data.readInt32();
51720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            sp<IMemory> params =
51820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber                interface_cast<IMemory>(data.readStrongBinder());
51920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
52020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            buffer_id buffer;
521318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber            status_t err = useBuffer(node, port_index, params, &buffer);
52220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            reply->writeInt32(err);
52320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
52420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            if (err == OK) {
525c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber                reply->writeIntPtr((intptr_t)buffer);
52620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            }
52720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
52820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            return NO_ERROR;
52920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        }
53020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
53183750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis        case USE_GRAPHIC_BUFFER:
53283750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis        {
53383750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis            CHECK_INTERFACE(IOMX, data, reply);
53483750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis
53583750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis            node_id node = (void*)data.readIntPtr();
53683750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis            OMX_U32 port_index = data.readInt32();
53783750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis            sp<GraphicBuffer> graphicBuffer = new GraphicBuffer();
53883750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis            data.read(*graphicBuffer);
53983750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis
54083750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis            buffer_id buffer;
54183750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis            status_t err = useGraphicBuffer(
54283750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis                    node, port_index, graphicBuffer, &buffer);
54383750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis            reply->writeInt32(err);
54483750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis
54583750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis            if (err == OK) {
54683750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis                reply->writeIntPtr((intptr_t)buffer);
54783750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis            }
54883750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis
54983750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis            return NO_ERROR;
55083750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis        }
55183750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis
552e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong        case STORE_META_DATA_IN_BUFFERS:
553e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong        {
554e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong            CHECK_INTERFACE(IOMX, data, reply);
555e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong
556e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong            node_id node = (void*)data.readIntPtr();
557e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong            OMX_U32 port_index = data.readInt32();
558e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong            OMX_BOOL enable = (OMX_BOOL)data.readInt32();
559e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong
560e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong            status_t err = storeMetaDataInBuffers(node, port_index, enable);
561e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong            reply->writeInt32(err);
562e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong
563e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong            return NO_ERROR;
564e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong        }
565e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong
56620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        case ALLOC_BUFFER:
56720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        {
56820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            CHECK_INTERFACE(IOMX, data, reply);
56920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
570c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber            node_id node = (void*)data.readIntPtr();
57120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            OMX_U32 port_index = data.readInt32();
57220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            size_t size = data.readInt32();
57320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
57420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            buffer_id buffer;
575570a3cb7582daa030cb38eedc5eb6a06f86ecc7fAndreas Huber            void *buffer_data;
576570a3cb7582daa030cb38eedc5eb6a06f86ecc7fAndreas Huber            status_t err = allocateBuffer(
577570a3cb7582daa030cb38eedc5eb6a06f86ecc7fAndreas Huber                    node, port_index, size, &buffer, &buffer_data);
57820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            reply->writeInt32(err);
57920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
58020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            if (err == OK) {
581c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber                reply->writeIntPtr((intptr_t)buffer);
582570a3cb7582daa030cb38eedc5eb6a06f86ecc7fAndreas Huber                reply->writeIntPtr((intptr_t)buffer_data);
58320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            }
58420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
58520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            return NO_ERROR;
58620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        }
58720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
58820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        case ALLOC_BUFFER_WITH_BACKUP:
58920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        {
59020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            CHECK_INTERFACE(IOMX, data, reply);
59120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
592c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber            node_id node = (void*)data.readIntPtr();
59320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            OMX_U32 port_index = data.readInt32();
59420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            sp<IMemory> params =
59520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber                interface_cast<IMemory>(data.readStrongBinder());
59620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
59720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            buffer_id buffer;
598318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber            status_t err = allocateBufferWithBackup(
59920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber                    node, port_index, params, &buffer);
60020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
60120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            reply->writeInt32(err);
60220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
60320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            if (err == OK) {
604c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber                reply->writeIntPtr((intptr_t)buffer);
60520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            }
60620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
60720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            return NO_ERROR;
60820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        }
60920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
61020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        case FREE_BUFFER:
61120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        {
61220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            CHECK_INTERFACE(IOMX, data, reply);
61320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
614c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber            node_id node = (void*)data.readIntPtr();
61520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            OMX_U32 port_index = data.readInt32();
616c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber            buffer_id buffer = (void*)data.readIntPtr();
617318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber            reply->writeInt32(freeBuffer(node, port_index, buffer));
61820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
61920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            return NO_ERROR;
62020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        }
62120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
62220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        case FILL_BUFFER:
62320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        {
62420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            CHECK_INTERFACE(IOMX, data, reply);
62520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
626c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber            node_id node = (void*)data.readIntPtr();
627c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber            buffer_id buffer = (void*)data.readIntPtr();
628318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber            reply->writeInt32(fillBuffer(node, buffer));
62920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
63020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            return NO_ERROR;
63120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        }
63220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
63320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        case EMPTY_BUFFER:
63420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        {
63520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            CHECK_INTERFACE(IOMX, data, reply);
63620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
637c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber            node_id node = (void*)data.readIntPtr();
638c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber            buffer_id buffer = (void*)data.readIntPtr();
63920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            OMX_U32 range_offset = data.readInt32();
64020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            OMX_U32 range_length = data.readInt32();
64120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            OMX_U32 flags = data.readInt32();
64220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            OMX_TICKS timestamp = data.readInt64();
64320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
64436efa039efaae4526791336cb688032d22b34becAndreas Huber            reply->writeInt32(
645318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber                    emptyBuffer(
64636efa039efaae4526791336cb688032d22b34becAndreas Huber                        node, buffer, range_offset, range_length,
64736efa039efaae4526791336cb688032d22b34becAndreas Huber                        flags, timestamp));
64820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
64920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            return NO_ERROR;
65020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        }
65120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
652693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        case GET_EXTENSION_INDEX:
653693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        {
654693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber            CHECK_INTERFACE(IOMX, data, reply);
655693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber
656c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber            node_id node = (void*)data.readIntPtr();
657693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber            const char *parameter_name = data.readCString();
6587eaa9c9385535b651064e02d05a8ffa4b2359281Andreas Huber
659693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber            OMX_INDEXTYPE index;
660318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber            status_t err = getExtensionIndex(node, parameter_name, &index);
661693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber
662693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber            reply->writeInt32(err);
663693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber
664693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber            if (err == OK) {
665693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber                reply->writeInt32(index);
666693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber            }
667693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber
668693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber            return OK;
669693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        }
670693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber
67120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        default:
67220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            return BBinder::onTransact(code, data, reply, flags);
67320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    }
67420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}
67520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
67620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber////////////////////////////////////////////////////////////////////////////////
67720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
67820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberclass BpOMXObserver : public BpInterface<IOMXObserver> {
67920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberpublic:
68020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    BpOMXObserver(const sp<IBinder> &impl)
68120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        : BpInterface<IOMXObserver>(impl) {
68220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    }
68320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
684318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    virtual void onMessage(const omx_message &msg) {
68520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        Parcel data, reply;
68620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        data.writeInterfaceToken(IOMXObserver::getInterfaceDescriptor());
68720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        data.write(&msg, sizeof(msg));
68820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
68920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        remote()->transact(OBSERVER_ON_MSG, data, &reply, IBinder::FLAG_ONEWAY);
69020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    }
69120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber};
69220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
69320111aa043c5f404472bc63b90bc5aad906b1101Andreas HuberIMPLEMENT_META_INTERFACE(OMXObserver, "android.hardware.IOMXObserver");
69420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
69520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberstatus_t BnOMXObserver::onTransact(
69620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    uint32_t code, const Parcel &data, Parcel *reply, uint32_t flags) {
69720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    switch (code) {
69820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        case OBSERVER_ON_MSG:
69920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        {
70020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            CHECK_INTERFACE(IOMXObserver, data, reply);
70120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
70220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            omx_message msg;
70320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            data.read(&msg, sizeof(msg));
70420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
70520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            // XXX Could use readInplace maybe?
706318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber            onMessage(msg);
70720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
70820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            return NO_ERROR;
70920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        }
71020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
71120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        default:
71220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            return BBinder::onTransact(code, data, reply, flags);
71320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    }
71420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}
71520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
71620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}  // namespace android
717