IOMX.cpp revision 134ee6a324c35f39e3576172e4eae4c6de6eb9dc
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>
88b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber#include <ui/ISurface.h>
9f4148b55c5d6f68b22462e3880015fefa91ae7c6Andreas Huber#include <ui/Surface.h>
1020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
1120111aa043c5f404472bc63b90bc5aad906b1101Andreas Hubernamespace android {
1220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
1320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberenum {
1420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    CONNECT = IBinder::FIRST_CALL_TRANSACTION,
1520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    LIST_NODES,
1620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    ALLOCATE_NODE,
1720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    FREE_NODE,
1820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    SEND_COMMAND,
1920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    GET_PARAMETER,
2020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    SET_PARAMETER,
21693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber    GET_CONFIG,
22693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber    SET_CONFIG,
2320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    USE_BUFFER,
2420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    ALLOC_BUFFER,
2520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    ALLOC_BUFFER_WITH_BACKUP,
2620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    FREE_BUFFER,
2720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    FILL_BUFFER,
2820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    EMPTY_BUFFER,
29693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber    GET_EXTENSION_INDEX,
308b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber    CREATE_RENDERER,
3120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    OBSERVER_ON_MSG,
328b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber    RENDERER_RENDER,
3320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber};
3420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
35f4148b55c5d6f68b22462e3880015fefa91ae7c6Andreas Hubersp<IOMXRenderer> IOMX::createRenderer(
36f4148b55c5d6f68b22462e3880015fefa91ae7c6Andreas Huber        const sp<Surface> &surface,
37f4148b55c5d6f68b22462e3880015fefa91ae7c6Andreas Huber        const char *componentName,
38f4148b55c5d6f68b22462e3880015fefa91ae7c6Andreas Huber        OMX_COLOR_FORMATTYPE colorFormat,
39f4148b55c5d6f68b22462e3880015fefa91ae7c6Andreas Huber        size_t encodedWidth, size_t encodedHeight,
40f4148b55c5d6f68b22462e3880015fefa91ae7c6Andreas Huber        size_t displayWidth, size_t displayHeight) {
41f4148b55c5d6f68b22462e3880015fefa91ae7c6Andreas Huber    return createRenderer(
42f4148b55c5d6f68b22462e3880015fefa91ae7c6Andreas Huber            surface->getISurface(),
43f4148b55c5d6f68b22462e3880015fefa91ae7c6Andreas Huber            componentName, colorFormat, encodedWidth, encodedHeight,
44f4148b55c5d6f68b22462e3880015fefa91ae7c6Andreas Huber            displayWidth, displayHeight);
45f4148b55c5d6f68b22462e3880015fefa91ae7c6Andreas Huber}
46f4148b55c5d6f68b22462e3880015fefa91ae7c6Andreas Huber
471b84df1a0823fbcb9cec754311f53eaccfe85ae3Andreas Hubersp<IOMXRenderer> IOMX::createRendererFromJavaSurface(
481b84df1a0823fbcb9cec754311f53eaccfe85ae3Andreas Huber        JNIEnv *env, jobject javaSurface,
491b84df1a0823fbcb9cec754311f53eaccfe85ae3Andreas Huber        const char *componentName,
501b84df1a0823fbcb9cec754311f53eaccfe85ae3Andreas Huber        OMX_COLOR_FORMATTYPE colorFormat,
511b84df1a0823fbcb9cec754311f53eaccfe85ae3Andreas Huber        size_t encodedWidth, size_t encodedHeight,
521b84df1a0823fbcb9cec754311f53eaccfe85ae3Andreas Huber        size_t displayWidth, size_t displayHeight) {
531b84df1a0823fbcb9cec754311f53eaccfe85ae3Andreas Huber    jclass surfaceClass = env->FindClass("android/view/Surface");
541b84df1a0823fbcb9cec754311f53eaccfe85ae3Andreas Huber    if (surfaceClass == NULL) {
551b84df1a0823fbcb9cec754311f53eaccfe85ae3Andreas Huber        LOGE("Can't find android/view/Surface");
561b84df1a0823fbcb9cec754311f53eaccfe85ae3Andreas Huber        return NULL;
571b84df1a0823fbcb9cec754311f53eaccfe85ae3Andreas Huber    }
581b84df1a0823fbcb9cec754311f53eaccfe85ae3Andreas Huber
591b84df1a0823fbcb9cec754311f53eaccfe85ae3Andreas Huber    jfieldID surfaceID = env->GetFieldID(surfaceClass, "mSurface", "I");
601b84df1a0823fbcb9cec754311f53eaccfe85ae3Andreas Huber    if (surfaceID == NULL) {
611b84df1a0823fbcb9cec754311f53eaccfe85ae3Andreas Huber        LOGE("Can't find Surface.mSurface");
621b84df1a0823fbcb9cec754311f53eaccfe85ae3Andreas Huber        return NULL;
631b84df1a0823fbcb9cec754311f53eaccfe85ae3Andreas Huber    }
641b84df1a0823fbcb9cec754311f53eaccfe85ae3Andreas Huber
651b84df1a0823fbcb9cec754311f53eaccfe85ae3Andreas Huber    sp<Surface> surface = (Surface *)env->GetIntField(javaSurface, surfaceID);
661b84df1a0823fbcb9cec754311f53eaccfe85ae3Andreas Huber
671b84df1a0823fbcb9cec754311f53eaccfe85ae3Andreas Huber    return createRenderer(
681b84df1a0823fbcb9cec754311f53eaccfe85ae3Andreas Huber            surface, componentName, colorFormat, encodedWidth,
691b84df1a0823fbcb9cec754311f53eaccfe85ae3Andreas Huber            encodedHeight, displayWidth, displayHeight);
701b84df1a0823fbcb9cec754311f53eaccfe85ae3Andreas Huber}
711b84df1a0823fbcb9cec754311f53eaccfe85ae3Andreas Huber
7220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberclass BpOMX : public BpInterface<IOMX> {
7320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberpublic:
7420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    BpOMX(const sp<IBinder> &impl)
7520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        : BpInterface<IOMX>(impl) {
7620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    }
7720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
78134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber    virtual status_t listNodes(List<ComponentInfo> *list) {
7920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        list->clear();
8020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
8120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        Parcel data, reply;
8220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
8320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        remote()->transact(LIST_NODES, data, &reply);
8420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
8520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        int32_t n = reply.readInt32();
8620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        for (int32_t i = 0; i < n; ++i) {
87134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber            list->push_back(ComponentInfo());
88134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber            ComponentInfo &info = *--list->end();
8920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
90134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber            info.mName = reply.readString8();
91134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber            int32_t numRoles = reply.readInt32();
92134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber            for (int32_t j = 0; j < numRoles; ++j) {
93134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber                info.mRoles.push_back(reply.readString8());
94134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber            }
9520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        }
9620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
9720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        return OK;
9820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    }
9920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
100318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    virtual status_t allocateNode(
101318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber            const char *name, const sp<IOMXObserver> &observer, node_id *node) {
10220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        Parcel data, reply;
10320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
10420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        data.writeCString(name);
105318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        data.writeStrongBinder(observer->asBinder());
10620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        remote()->transact(ALLOCATE_NODE, data, &reply);
10720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
10820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        status_t err = reply.readInt32();
10920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        if (err == OK) {
110c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber            *node = (void*)reply.readIntPtr();
11120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        } else {
11220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            *node = 0;
11320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        }
11420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
11520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        return err;
11620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    }
11720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
118318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    virtual status_t freeNode(node_id node) {
11920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        Parcel data, reply;
12020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
121c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber        data.writeIntPtr((intptr_t)node);
12220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        remote()->transact(FREE_NODE, data, &reply);
12320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
12420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        return reply.readInt32();
12520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    }
12620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
127318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    virtual status_t sendCommand(
12820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            node_id node, OMX_COMMANDTYPE cmd, OMX_S32 param) {
12920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        Parcel data, reply;
13020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
131c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber        data.writeIntPtr((intptr_t)node);
13220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        data.writeInt32(cmd);
13320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        data.writeInt32(param);
13420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        remote()->transact(SEND_COMMAND, data, &reply);
13520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
13620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        return reply.readInt32();
13720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    }
13820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
139318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    virtual status_t getParameter(
14020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            node_id node, OMX_INDEXTYPE index,
14120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            void *params, size_t size) {
14220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        Parcel data, reply;
14320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
144c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber        data.writeIntPtr((intptr_t)node);
14520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        data.writeInt32(index);
14620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        data.writeInt32(size);
14720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        data.write(params, size);
14820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        remote()->transact(GET_PARAMETER, data, &reply);
14920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
15020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        status_t err = reply.readInt32();
15120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        if (err != OK) {
15220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            return err;
15320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        }
15420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
15520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        reply.read(params, size);
15620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
15720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        return OK;
15820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    }
15920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
160318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    virtual status_t setParameter(
16120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            node_id node, OMX_INDEXTYPE index,
16220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            const void *params, size_t size) {
16320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        Parcel data, reply;
16420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
165c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber        data.writeIntPtr((intptr_t)node);
16620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        data.writeInt32(index);
16720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        data.writeInt32(size);
16820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        data.write(params, size);
16920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        remote()->transact(SET_PARAMETER, data, &reply);
17020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
17120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        return reply.readInt32();
17220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    }
17320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
174318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    virtual status_t getConfig(
175693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber            node_id node, OMX_INDEXTYPE index,
176693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber            void *params, size_t size) {
177693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        Parcel data, reply;
178693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
179c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber        data.writeIntPtr((intptr_t)node);
180693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        data.writeInt32(index);
181693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        data.writeInt32(size);
182693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        data.write(params, size);
183693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        remote()->transact(GET_CONFIG, data, &reply);
184693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber
185693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        status_t err = reply.readInt32();
186693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        if (err != OK) {
187693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber            return err;
188693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        }
189693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber
190693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        reply.read(params, size);
191693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber
192693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        return OK;
193693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber    }
194693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber
195318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    virtual status_t setConfig(
196693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber            node_id node, OMX_INDEXTYPE index,
197693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber            const void *params, size_t size) {
198693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        Parcel data, reply;
199693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
200c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber        data.writeIntPtr((intptr_t)node);
201693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        data.writeInt32(index);
202693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        data.writeInt32(size);
203693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        data.write(params, size);
204693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        remote()->transact(SET_CONFIG, data, &reply);
205693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber
206693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        return reply.readInt32();
207693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber    }
208693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber
209318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    virtual status_t useBuffer(
21020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            node_id node, OMX_U32 port_index, const sp<IMemory> &params,
21120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            buffer_id *buffer) {
21220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        Parcel data, reply;
21320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
214c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber        data.writeIntPtr((intptr_t)node);
21520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        data.writeInt32(port_index);
21620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        data.writeStrongBinder(params->asBinder());
21720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        remote()->transact(USE_BUFFER, data, &reply);
21820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
21920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        status_t err = reply.readInt32();
22020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        if (err != OK) {
22120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            *buffer = 0;
22220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
22320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            return err;
22420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        }
22520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
226c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber        *buffer = (void*)reply.readIntPtr();
22720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
22820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        return err;
22920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    }
23020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
231318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    virtual status_t allocateBuffer(
23220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            node_id node, OMX_U32 port_index, size_t size,
23320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            buffer_id *buffer) {
23420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        Parcel data, reply;
23520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
236c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber        data.writeIntPtr((intptr_t)node);
23720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        data.writeInt32(port_index);
23820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        data.writeInt32(size);
23920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        remote()->transact(ALLOC_BUFFER, data, &reply);
24020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
24120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        status_t err = reply.readInt32();
24220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        if (err != OK) {
24320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            *buffer = 0;
24420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
24520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            return err;
24620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        }
24720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
248c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber        *buffer = (void*)reply.readIntPtr();
24920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
25020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        return err;
25120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    }
25220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
253318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    virtual status_t allocateBufferWithBackup(
25420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            node_id node, OMX_U32 port_index, const sp<IMemory> &params,
25520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            buffer_id *buffer) {
25620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        Parcel data, reply;
25720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
258c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber        data.writeIntPtr((intptr_t)node);
25920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        data.writeInt32(port_index);
26020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        data.writeStrongBinder(params->asBinder());
26120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        remote()->transact(ALLOC_BUFFER_WITH_BACKUP, data, &reply);
26220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
26320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        status_t err = reply.readInt32();
26420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        if (err != OK) {
26520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            *buffer = 0;
26620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
26720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            return err;
26820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        }
26920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
270c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber        *buffer = (void*)reply.readIntPtr();
27120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
27220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        return err;
27320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    }
27420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
275318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    virtual status_t freeBuffer(
27620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            node_id node, OMX_U32 port_index, buffer_id buffer) {
27720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        Parcel data, reply;
27820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
279c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber        data.writeIntPtr((intptr_t)node);
28020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        data.writeInt32(port_index);
281c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber        data.writeIntPtr((intptr_t)buffer);
28220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        remote()->transact(FREE_BUFFER, data, &reply);
28320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
28420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        return reply.readInt32();
28520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    }
28620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
287318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    virtual status_t fillBuffer(node_id node, buffer_id buffer) {
28820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        Parcel data, reply;
28920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
290c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber        data.writeIntPtr((intptr_t)node);
291c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber        data.writeIntPtr((intptr_t)buffer);
29236efa039efaae4526791336cb688032d22b34becAndreas Huber        remote()->transact(FILL_BUFFER, data, &reply);
29336efa039efaae4526791336cb688032d22b34becAndreas Huber
29436efa039efaae4526791336cb688032d22b34becAndreas Huber        return reply.readInt32();
29520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    }
29620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
297318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    virtual status_t emptyBuffer(
29820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            node_id node,
29920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            buffer_id buffer,
30020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            OMX_U32 range_offset, OMX_U32 range_length,
30120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            OMX_U32 flags, OMX_TICKS timestamp) {
30220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        Parcel data, reply;
30320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
304c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber        data.writeIntPtr((intptr_t)node);
305c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber        data.writeIntPtr((intptr_t)buffer);
30620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        data.writeInt32(range_offset);
30720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        data.writeInt32(range_length);
30820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        data.writeInt32(flags);
30920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        data.writeInt64(timestamp);
31036efa039efaae4526791336cb688032d22b34becAndreas Huber        remote()->transact(EMPTY_BUFFER, data, &reply);
31136efa039efaae4526791336cb688032d22b34becAndreas Huber
31236efa039efaae4526791336cb688032d22b34becAndreas Huber        return reply.readInt32();
31320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    }
3148b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber
315318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    virtual status_t getExtensionIndex(
316693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber            node_id node,
317693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber            const char *parameter_name,
318693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber            OMX_INDEXTYPE *index) {
319693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        Parcel data, reply;
320693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
321c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber        data.writeIntPtr((intptr_t)node);
322693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        data.writeCString(parameter_name);
323693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber
324693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        remote()->transact(GET_EXTENSION_INDEX, data, &reply);
325693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber
326693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        status_t err = reply.readInt32();
327693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        if (err == OK) {
328693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber            *index = static_cast<OMX_INDEXTYPE>(reply.readInt32());
329693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        } else {
330693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber            *index = OMX_IndexComponentStartUnused;
331693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        }
332693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber
333693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        return err;
334693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber    }
335693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber
3368b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber    virtual sp<IOMXRenderer> createRenderer(
3378b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber            const sp<ISurface> &surface,
3388b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber            const char *componentName,
3398b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber            OMX_COLOR_FORMATTYPE colorFormat,
3408b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber            size_t encodedWidth, size_t encodedHeight,
3418b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber            size_t displayWidth, size_t displayHeight) {
3428b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber        Parcel data, reply;
3438b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber        data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
3448b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber
3458b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber        data.writeStrongBinder(surface->asBinder());
3468b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber        data.writeCString(componentName);
3478b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber        data.writeInt32(colorFormat);
3488b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber        data.writeInt32(encodedWidth);
3498b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber        data.writeInt32(encodedHeight);
3508b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber        data.writeInt32(displayWidth);
3518b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber        data.writeInt32(displayHeight);
3528b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber
3538b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber        remote()->transact(CREATE_RENDERER, data, &reply);
3548b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber
3558b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber        return interface_cast<IOMXRenderer>(reply.readStrongBinder());
3568b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber    }
35720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber};
35820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
35920111aa043c5f404472bc63b90bc5aad906b1101Andreas HuberIMPLEMENT_META_INTERFACE(OMX, "android.hardware.IOMX");
36020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
36120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber////////////////////////////////////////////////////////////////////////////////
36220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
36320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#define CHECK_INTERFACE(interface, data, reply) \
36420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        do { if (!data.enforceInterface(interface::getInterfaceDescriptor())) { \
36520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            LOGW("Call incorrectly routed to " #interface); \
36620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            return PERMISSION_DENIED; \
36720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        } } while (0)
36820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
36920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberstatus_t BnOMX::onTransact(
37020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    uint32_t code, const Parcel &data, Parcel *reply, uint32_t flags) {
37120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    switch (code) {
37220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        case LIST_NODES:
37320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        {
37420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            CHECK_INTERFACE(IOMX, data, reply);
37520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
376134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber            List<ComponentInfo> list;
377318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber            listNodes(&list);
37820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
37920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            reply->writeInt32(list.size());
380134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber            for (List<ComponentInfo>::iterator it = list.begin();
38120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber                 it != list.end(); ++it) {
382134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber                ComponentInfo &cur = *it;
383134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber
384134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber                reply->writeString8(cur.mName);
385134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber                reply->writeInt32(cur.mRoles.size());
386134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber                for (List<String8>::iterator role_it = cur.mRoles.begin();
387134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber                     role_it != cur.mRoles.end(); ++role_it) {
388134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber                    reply->writeString8(*role_it);
389134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber                }
39020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            }
39120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
39220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            return NO_ERROR;
39320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        }
39420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
39520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        case ALLOCATE_NODE:
39620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        {
39720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            CHECK_INTERFACE(IOMX, data, reply);
39820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
399318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber            const char *name = data.readCString();
400318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
401318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber            sp<IOMXObserver> observer =
402318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber                interface_cast<IOMXObserver>(data.readStrongBinder());
403318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
40420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            node_id node;
405318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
406318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber            status_t err = allocateNode(name, observer, &node);
40720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            reply->writeInt32(err);
40820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            if (err == OK) {
409c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber                reply->writeIntPtr((intptr_t)node);
41020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            }
41120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
41220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            return NO_ERROR;
41320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        }
41420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
41520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        case FREE_NODE:
41620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        {
41720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            CHECK_INTERFACE(IOMX, data, reply);
41820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
419c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber            node_id node = (void*)data.readIntPtr();
42020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
421318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber            reply->writeInt32(freeNode(node));
42220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
42320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            return NO_ERROR;
42420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        }
42520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
42620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        case SEND_COMMAND:
42720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        {
42820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            CHECK_INTERFACE(IOMX, data, reply);
42920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
430c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber            node_id node = (void*)data.readIntPtr();
43120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
43220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            OMX_COMMANDTYPE cmd =
43320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber                static_cast<OMX_COMMANDTYPE>(data.readInt32());
43420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
43520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            OMX_S32 param = data.readInt32();
436318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber            reply->writeInt32(sendCommand(node, cmd, param));
43720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
43820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            return NO_ERROR;
43920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        }
44020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
44120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        case GET_PARAMETER:
44220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        {
44320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            CHECK_INTERFACE(IOMX, data, reply);
44420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
445c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber            node_id node = (void*)data.readIntPtr();
44620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            OMX_INDEXTYPE index = static_cast<OMX_INDEXTYPE>(data.readInt32());
44720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
44820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            size_t size = data.readInt32();
44920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
45020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            // XXX I am not happy with this but Parcel::readInplace didn't work.
45120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            void *params = malloc(size);
45220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            data.read(params, size);
45320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
454318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber            status_t err = getParameter(node, index, params, size);
45520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
45620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            reply->writeInt32(err);
45720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
45820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            if (err == OK) {
45920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber                reply->write(params, size);
46020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            }
46120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
46220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            free(params);
46320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            params = NULL;
46420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
46520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            return NO_ERROR;
46620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        }
46720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
46820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        case SET_PARAMETER:
46920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        {
47020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            CHECK_INTERFACE(IOMX, data, reply);
47120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
472c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber            node_id node = (void*)data.readIntPtr();
47320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            OMX_INDEXTYPE index = static_cast<OMX_INDEXTYPE>(data.readInt32());
47420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
47520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            size_t size = data.readInt32();
47620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            void *params = const_cast<void *>(data.readInplace(size));
47720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
478318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber            reply->writeInt32(setParameter(node, index, params, size));
47920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
48020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            return NO_ERROR;
48120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        }
48220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
483693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        case GET_CONFIG:
484693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        {
485693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber            CHECK_INTERFACE(IOMX, data, reply);
486693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber
487c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber            node_id node = (void*)data.readIntPtr();
488693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber            OMX_INDEXTYPE index = static_cast<OMX_INDEXTYPE>(data.readInt32());
489693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber
490693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber            size_t size = data.readInt32();
491693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber
492693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber            // XXX I am not happy with this but Parcel::readInplace didn't work.
493693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber            void *params = malloc(size);
494693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber            data.read(params, size);
495693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber
496318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber            status_t err = getConfig(node, index, params, size);
497693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber
498693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber            reply->writeInt32(err);
499693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber
500693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber            if (err == OK) {
501693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber                reply->write(params, size);
502693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber            }
503693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber
504693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber            free(params);
505693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber            params = NULL;
506693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber
507693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber            return NO_ERROR;
508693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        }
509693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber
510693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        case SET_CONFIG:
511693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        {
512693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber            CHECK_INTERFACE(IOMX, data, reply);
513693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber
514c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber            node_id node = (void*)data.readIntPtr();
515693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber            OMX_INDEXTYPE index = static_cast<OMX_INDEXTYPE>(data.readInt32());
516693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber
517693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber            size_t size = data.readInt32();
518693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber            void *params = const_cast<void *>(data.readInplace(size));
519693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber
520318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber            reply->writeInt32(setConfig(node, index, params, size));
521693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber
522693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber            return NO_ERROR;
523693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        }
524693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber
52520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        case USE_BUFFER:
52620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        {
52720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            CHECK_INTERFACE(IOMX, data, reply);
52820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
529c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber            node_id node = (void*)data.readIntPtr();
53020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            OMX_U32 port_index = data.readInt32();
53120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            sp<IMemory> params =
53220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber                interface_cast<IMemory>(data.readStrongBinder());
53320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
53420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            buffer_id buffer;
535318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber            status_t err = useBuffer(node, port_index, params, &buffer);
53620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            reply->writeInt32(err);
53720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
53820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            if (err == OK) {
539c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber                reply->writeIntPtr((intptr_t)buffer);
54020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            }
54120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
54220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            return NO_ERROR;
54320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        }
54420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
54520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        case ALLOC_BUFFER:
54620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        {
54720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            CHECK_INTERFACE(IOMX, data, reply);
54820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
549c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber            node_id node = (void*)data.readIntPtr();
55020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            OMX_U32 port_index = data.readInt32();
55120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            size_t size = data.readInt32();
55220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
55320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            buffer_id buffer;
554318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber            status_t err = allocateBuffer(node, port_index, size, &buffer);
55520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            reply->writeInt32(err);
55620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
55720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            if (err == OK) {
558c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber                reply->writeIntPtr((intptr_t)buffer);
55920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            }
56020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
56120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            return NO_ERROR;
56220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        }
56320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
56420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        case ALLOC_BUFFER_WITH_BACKUP:
56520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        {
56620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            CHECK_INTERFACE(IOMX, data, reply);
56720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
568c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber            node_id node = (void*)data.readIntPtr();
56920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            OMX_U32 port_index = data.readInt32();
57020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            sp<IMemory> params =
57120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber                interface_cast<IMemory>(data.readStrongBinder());
57220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
57320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            buffer_id buffer;
574318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber            status_t err = allocateBufferWithBackup(
57520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber                    node, port_index, params, &buffer);
57620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
57720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            reply->writeInt32(err);
57820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
57920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            if (err == OK) {
580c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber                reply->writeIntPtr((intptr_t)buffer);
58120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            }
58220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
58320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            return NO_ERROR;
58420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        }
58520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
58620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        case FREE_BUFFER:
58720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        {
58820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            CHECK_INTERFACE(IOMX, data, reply);
58920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
590c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber            node_id node = (void*)data.readIntPtr();
59120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            OMX_U32 port_index = data.readInt32();
592c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber            buffer_id buffer = (void*)data.readIntPtr();
593318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber            reply->writeInt32(freeBuffer(node, port_index, buffer));
59420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
59520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            return NO_ERROR;
59620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        }
59720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
59820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        case FILL_BUFFER:
59920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        {
60020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            CHECK_INTERFACE(IOMX, data, reply);
60120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
602c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber            node_id node = (void*)data.readIntPtr();
603c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber            buffer_id buffer = (void*)data.readIntPtr();
604318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber            reply->writeInt32(fillBuffer(node, buffer));
60520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
60620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            return NO_ERROR;
60720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        }
60820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
60920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        case EMPTY_BUFFER:
61020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        {
61120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            CHECK_INTERFACE(IOMX, data, reply);
61220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
613c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber            node_id node = (void*)data.readIntPtr();
614c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber            buffer_id buffer = (void*)data.readIntPtr();
61520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            OMX_U32 range_offset = data.readInt32();
61620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            OMX_U32 range_length = data.readInt32();
61720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            OMX_U32 flags = data.readInt32();
61820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            OMX_TICKS timestamp = data.readInt64();
61920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
62036efa039efaae4526791336cb688032d22b34becAndreas Huber            reply->writeInt32(
621318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber                    emptyBuffer(
62236efa039efaae4526791336cb688032d22b34becAndreas Huber                        node, buffer, range_offset, range_length,
62336efa039efaae4526791336cb688032d22b34becAndreas Huber                        flags, timestamp));
62420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
62520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            return NO_ERROR;
62620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        }
62720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
628693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        case GET_EXTENSION_INDEX:
629693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        {
630693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber            CHECK_INTERFACE(IOMX, data, reply);
631693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber
632c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber            node_id node = (void*)data.readIntPtr();
633693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber            const char *parameter_name = data.readCString();
634693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber
635693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber            OMX_INDEXTYPE index;
636318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber            status_t err = getExtensionIndex(node, parameter_name, &index);
637693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber
638693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber            reply->writeInt32(err);
639693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber
640693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber            if (err == OK) {
641693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber                reply->writeInt32(index);
642693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber            }
643693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber
644693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber            return OK;
645693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        }
646693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber
6478b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber        case CREATE_RENDERER:
6488b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber        {
6498b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber            CHECK_INTERFACE(IOMX, data, reply);
6508b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber
6518b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber            sp<ISurface> isurface =
6528b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber                interface_cast<ISurface>(data.readStrongBinder());
6538b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber
6548b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber            const char *componentName = data.readCString();
6558b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber
6568b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber            OMX_COLOR_FORMATTYPE colorFormat =
6578b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber                static_cast<OMX_COLOR_FORMATTYPE>(data.readInt32());
6588b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber
6598b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber            size_t encodedWidth = (size_t)data.readInt32();
6608b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber            size_t encodedHeight = (size_t)data.readInt32();
6618b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber            size_t displayWidth = (size_t)data.readInt32();
6628b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber            size_t displayHeight = (size_t)data.readInt32();
6638b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber
6648b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber            sp<IOMXRenderer> renderer =
6658b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber                createRenderer(isurface, componentName, colorFormat,
6668b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber                               encodedWidth, encodedHeight,
6678b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber                               displayWidth, displayHeight);
6688b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber
6698b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber            reply->writeStrongBinder(renderer->asBinder());
6708b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber
6718b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber            return OK;
6728b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber        }
6738b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber
67420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        default:
67520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            return BBinder::onTransact(code, data, reply, flags);
67620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    }
67720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}
67820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
67920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber////////////////////////////////////////////////////////////////////////////////
68020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
68120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberclass BpOMXObserver : public BpInterface<IOMXObserver> {
68220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberpublic:
68320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    BpOMXObserver(const sp<IBinder> &impl)
68420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        : BpInterface<IOMXObserver>(impl) {
68520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    }
68620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
687318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    virtual void onMessage(const omx_message &msg) {
68820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        Parcel data, reply;
68920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        data.writeInterfaceToken(IOMXObserver::getInterfaceDescriptor());
69020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        data.write(&msg, sizeof(msg));
69120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
69220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        remote()->transact(OBSERVER_ON_MSG, data, &reply, IBinder::FLAG_ONEWAY);
69320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    }
69420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber};
69520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
69620111aa043c5f404472bc63b90bc5aad906b1101Andreas HuberIMPLEMENT_META_INTERFACE(OMXObserver, "android.hardware.IOMXObserver");
69720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
69820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberstatus_t BnOMXObserver::onTransact(
69920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    uint32_t code, const Parcel &data, Parcel *reply, uint32_t flags) {
70020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    switch (code) {
70120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        case OBSERVER_ON_MSG:
70220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        {
70320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            CHECK_INTERFACE(IOMXObserver, data, reply);
70420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
70520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            omx_message msg;
70620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            data.read(&msg, sizeof(msg));
70720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
70820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            // XXX Could use readInplace maybe?
709318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber            onMessage(msg);
71020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
71120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            return NO_ERROR;
71220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        }
71320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
71420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        default:
71520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            return BBinder::onTransact(code, data, reply, flags);
71620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    }
71720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}
71820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
7198b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber////////////////////////////////////////////////////////////////////////////////
7208b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber
7218b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huberclass BpOMXRenderer : public BpInterface<IOMXRenderer> {
7228b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huberpublic:
7238b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber    BpOMXRenderer(const sp<IBinder> &impl)
7248b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber        : BpInterface<IOMXRenderer>(impl) {
7258b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber    }
7268b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber
7278b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber    virtual void render(IOMX::buffer_id buffer) {
7288b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber        Parcel data, reply;
7298b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber        data.writeInterfaceToken(IOMXRenderer::getInterfaceDescriptor());
730c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber        data.writeIntPtr((intptr_t)buffer);
7318b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber
7328b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber        // NOTE: Do NOT make this a ONE_WAY call, it must be synchronous
7338b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber        // so that the caller knows when to recycle the buffer.
7348b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber        remote()->transact(RENDERER_RENDER, data, &reply);
7358b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber    }
7368b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber};
7378b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber
7388b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas HuberIMPLEMENT_META_INTERFACE(OMXRenderer, "android.hardware.IOMXRenderer");
7398b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber
7408b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huberstatus_t BnOMXRenderer::onTransact(
7418b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber    uint32_t code, const Parcel &data, Parcel *reply, uint32_t flags) {
7428b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber    switch (code) {
7438b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber        case RENDERER_RENDER:
7448b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber        {
7458b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber            CHECK_INTERFACE(IOMXRenderer, data, reply);
7468b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber
747c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber            IOMX::buffer_id buffer = (void*)data.readIntPtr();
7488b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber
7498b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber            render(buffer);
7508b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber
7518b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber            return NO_ERROR;
7528b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber        }
7538b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber
7548b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber        default:
7558b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber            return BBinder::onTransact(code, data, reply, flags);
7568b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber    }
7578b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber}
7588b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber
75920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}  // namespace android
760