IOMX.cpp revision 7eaa9c9385535b651064e02d05a8ffa4b2359281
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,
157eaa9c9385535b651064e02d05a8ffa4b2359281Andreas Huber    LIVES_LOCALLY,
1620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    LIST_NODES,
1720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    ALLOCATE_NODE,
1820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    FREE_NODE,
1920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    SEND_COMMAND,
2020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    GET_PARAMETER,
2120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    SET_PARAMETER,
22693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber    GET_CONFIG,
23693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber    SET_CONFIG,
2420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    USE_BUFFER,
2520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    ALLOC_BUFFER,
2620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    ALLOC_BUFFER_WITH_BACKUP,
2720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    FREE_BUFFER,
2820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    FILL_BUFFER,
2920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    EMPTY_BUFFER,
30693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber    GET_EXTENSION_INDEX,
318b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber    CREATE_RENDERER,
3220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    OBSERVER_ON_MSG,
338b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber    RENDERER_RENDER,
3420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber};
3520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
36f4148b55c5d6f68b22462e3880015fefa91ae7c6Andreas Hubersp<IOMXRenderer> IOMX::createRenderer(
37f4148b55c5d6f68b22462e3880015fefa91ae7c6Andreas Huber        const sp<Surface> &surface,
38f4148b55c5d6f68b22462e3880015fefa91ae7c6Andreas Huber        const char *componentName,
39f4148b55c5d6f68b22462e3880015fefa91ae7c6Andreas Huber        OMX_COLOR_FORMATTYPE colorFormat,
40f4148b55c5d6f68b22462e3880015fefa91ae7c6Andreas Huber        size_t encodedWidth, size_t encodedHeight,
41f4148b55c5d6f68b22462e3880015fefa91ae7c6Andreas Huber        size_t displayWidth, size_t displayHeight) {
42f4148b55c5d6f68b22462e3880015fefa91ae7c6Andreas Huber    return createRenderer(
43f4148b55c5d6f68b22462e3880015fefa91ae7c6Andreas Huber            surface->getISurface(),
44f4148b55c5d6f68b22462e3880015fefa91ae7c6Andreas Huber            componentName, colorFormat, encodedWidth, encodedHeight,
45f4148b55c5d6f68b22462e3880015fefa91ae7c6Andreas Huber            displayWidth, displayHeight);
46f4148b55c5d6f68b22462e3880015fefa91ae7c6Andreas Huber}
47f4148b55c5d6f68b22462e3880015fefa91ae7c6Andreas Huber
481b84df1a0823fbcb9cec754311f53eaccfe85ae3Andreas Hubersp<IOMXRenderer> IOMX::createRendererFromJavaSurface(
491b84df1a0823fbcb9cec754311f53eaccfe85ae3Andreas Huber        JNIEnv *env, jobject javaSurface,
501b84df1a0823fbcb9cec754311f53eaccfe85ae3Andreas Huber        const char *componentName,
511b84df1a0823fbcb9cec754311f53eaccfe85ae3Andreas Huber        OMX_COLOR_FORMATTYPE colorFormat,
521b84df1a0823fbcb9cec754311f53eaccfe85ae3Andreas Huber        size_t encodedWidth, size_t encodedHeight,
531b84df1a0823fbcb9cec754311f53eaccfe85ae3Andreas Huber        size_t displayWidth, size_t displayHeight) {
541b84df1a0823fbcb9cec754311f53eaccfe85ae3Andreas Huber    jclass surfaceClass = env->FindClass("android/view/Surface");
551b84df1a0823fbcb9cec754311f53eaccfe85ae3Andreas Huber    if (surfaceClass == NULL) {
561b84df1a0823fbcb9cec754311f53eaccfe85ae3Andreas Huber        LOGE("Can't find android/view/Surface");
571b84df1a0823fbcb9cec754311f53eaccfe85ae3Andreas Huber        return NULL;
581b84df1a0823fbcb9cec754311f53eaccfe85ae3Andreas Huber    }
591b84df1a0823fbcb9cec754311f53eaccfe85ae3Andreas Huber
601b84df1a0823fbcb9cec754311f53eaccfe85ae3Andreas Huber    jfieldID surfaceID = env->GetFieldID(surfaceClass, "mSurface", "I");
611b84df1a0823fbcb9cec754311f53eaccfe85ae3Andreas Huber    if (surfaceID == NULL) {
621b84df1a0823fbcb9cec754311f53eaccfe85ae3Andreas Huber        LOGE("Can't find Surface.mSurface");
631b84df1a0823fbcb9cec754311f53eaccfe85ae3Andreas Huber        return NULL;
641b84df1a0823fbcb9cec754311f53eaccfe85ae3Andreas Huber    }
651b84df1a0823fbcb9cec754311f53eaccfe85ae3Andreas Huber
661b84df1a0823fbcb9cec754311f53eaccfe85ae3Andreas Huber    sp<Surface> surface = (Surface *)env->GetIntField(javaSurface, surfaceID);
671b84df1a0823fbcb9cec754311f53eaccfe85ae3Andreas Huber
681b84df1a0823fbcb9cec754311f53eaccfe85ae3Andreas Huber    return createRenderer(
691b84df1a0823fbcb9cec754311f53eaccfe85ae3Andreas Huber            surface, componentName, colorFormat, encodedWidth,
701b84df1a0823fbcb9cec754311f53eaccfe85ae3Andreas Huber            encodedHeight, displayWidth, displayHeight);
711b84df1a0823fbcb9cec754311f53eaccfe85ae3Andreas Huber}
721b84df1a0823fbcb9cec754311f53eaccfe85ae3Andreas Huber
7320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberclass BpOMX : public BpInterface<IOMX> {
7420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberpublic:
7520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    BpOMX(const sp<IBinder> &impl)
7620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        : BpInterface<IOMX>(impl) {
7720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    }
7820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
797eaa9c9385535b651064e02d05a8ffa4b2359281Andreas Huber    virtual bool livesLocally(pid_t pid) {
807eaa9c9385535b651064e02d05a8ffa4b2359281Andreas Huber        Parcel data, reply;
817eaa9c9385535b651064e02d05a8ffa4b2359281Andreas Huber        data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
827eaa9c9385535b651064e02d05a8ffa4b2359281Andreas Huber        data.writeInt32(pid);
837eaa9c9385535b651064e02d05a8ffa4b2359281Andreas Huber        remote()->transact(LIVES_LOCALLY, data, &reply);
847eaa9c9385535b651064e02d05a8ffa4b2359281Andreas Huber
857eaa9c9385535b651064e02d05a8ffa4b2359281Andreas Huber        return reply.readInt32() != 0;
867eaa9c9385535b651064e02d05a8ffa4b2359281Andreas Huber    }
877eaa9c9385535b651064e02d05a8ffa4b2359281Andreas Huber
88134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber    virtual status_t listNodes(List<ComponentInfo> *list) {
8920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        list->clear();
9020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
9120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        Parcel data, reply;
9220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
9320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        remote()->transact(LIST_NODES, data, &reply);
9420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
9520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        int32_t n = reply.readInt32();
9620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        for (int32_t i = 0; i < n; ++i) {
97134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber            list->push_back(ComponentInfo());
98134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber            ComponentInfo &info = *--list->end();
9920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
100134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber            info.mName = reply.readString8();
101134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber            int32_t numRoles = reply.readInt32();
102134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber            for (int32_t j = 0; j < numRoles; ++j) {
103134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber                info.mRoles.push_back(reply.readString8());
104134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber            }
10520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        }
10620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
10720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        return OK;
10820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    }
10920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
110318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    virtual status_t allocateNode(
111318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber            const char *name, const sp<IOMXObserver> &observer, node_id *node) {
11220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        Parcel data, reply;
11320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
11420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        data.writeCString(name);
115318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        data.writeStrongBinder(observer->asBinder());
11620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        remote()->transact(ALLOCATE_NODE, data, &reply);
11720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
11820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        status_t err = reply.readInt32();
11920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        if (err == OK) {
120c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber            *node = (void*)reply.readIntPtr();
12120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        } else {
12220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            *node = 0;
12320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        }
12420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
12520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        return err;
12620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    }
12720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
128318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    virtual status_t freeNode(node_id node) {
12920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        Parcel data, reply;
13020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
131c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber        data.writeIntPtr((intptr_t)node);
13220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        remote()->transact(FREE_NODE, data, &reply);
13320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
13420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        return reply.readInt32();
13520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    }
13620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
137318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    virtual status_t sendCommand(
13820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            node_id node, OMX_COMMANDTYPE cmd, OMX_S32 param) {
13920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        Parcel data, reply;
14020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
141c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber        data.writeIntPtr((intptr_t)node);
14220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        data.writeInt32(cmd);
14320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        data.writeInt32(param);
14420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        remote()->transact(SEND_COMMAND, data, &reply);
14520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
14620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        return reply.readInt32();
14720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    }
14820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
149318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    virtual status_t getParameter(
15020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            node_id node, OMX_INDEXTYPE index,
15120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            void *params, size_t size) {
15220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        Parcel data, reply;
15320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
154c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber        data.writeIntPtr((intptr_t)node);
15520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        data.writeInt32(index);
15620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        data.writeInt32(size);
15720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        data.write(params, size);
15820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        remote()->transact(GET_PARAMETER, data, &reply);
15920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
16020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        status_t err = reply.readInt32();
16120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        if (err != OK) {
16220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            return err;
16320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        }
16420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
16520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        reply.read(params, size);
16620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
16720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        return OK;
16820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    }
16920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
170318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    virtual status_t setParameter(
17120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            node_id node, OMX_INDEXTYPE index,
17220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            const void *params, size_t size) {
17320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        Parcel data, reply;
17420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
175c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber        data.writeIntPtr((intptr_t)node);
17620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        data.writeInt32(index);
17720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        data.writeInt32(size);
17820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        data.write(params, size);
17920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        remote()->transact(SET_PARAMETER, data, &reply);
18020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
18120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        return reply.readInt32();
18220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    }
18320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
184318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    virtual status_t getConfig(
185693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber            node_id node, OMX_INDEXTYPE index,
186693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber            void *params, size_t size) {
187693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        Parcel data, reply;
188693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
189c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber        data.writeIntPtr((intptr_t)node);
190693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        data.writeInt32(index);
191693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        data.writeInt32(size);
192693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        data.write(params, size);
193693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        remote()->transact(GET_CONFIG, data, &reply);
194693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber
195693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        status_t err = reply.readInt32();
196693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        if (err != OK) {
197693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber            return err;
198693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        }
199693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber
200693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        reply.read(params, size);
201693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber
202693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        return OK;
203693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber    }
204693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber
205318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    virtual status_t setConfig(
206693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber            node_id node, OMX_INDEXTYPE index,
207693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber            const void *params, size_t size) {
208693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        Parcel data, reply;
209693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
210c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber        data.writeIntPtr((intptr_t)node);
211693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        data.writeInt32(index);
212693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        data.writeInt32(size);
213693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        data.write(params, size);
214693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        remote()->transact(SET_CONFIG, data, &reply);
215693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber
216693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        return reply.readInt32();
217693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber    }
218693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber
219318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    virtual status_t useBuffer(
22020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            node_id node, OMX_U32 port_index, const sp<IMemory> &params,
22120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            buffer_id *buffer) {
22220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        Parcel data, reply;
22320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
224c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber        data.writeIntPtr((intptr_t)node);
22520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        data.writeInt32(port_index);
22620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        data.writeStrongBinder(params->asBinder());
22720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        remote()->transact(USE_BUFFER, data, &reply);
22820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
22920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        status_t err = reply.readInt32();
23020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        if (err != OK) {
23120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            *buffer = 0;
23220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
23320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            return err;
23420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        }
23520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
236c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber        *buffer = (void*)reply.readIntPtr();
23720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
23820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        return err;
23920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    }
24020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
241318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    virtual status_t allocateBuffer(
24220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            node_id node, OMX_U32 port_index, size_t size,
24320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            buffer_id *buffer) {
24420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        Parcel data, reply;
24520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
246c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber        data.writeIntPtr((intptr_t)node);
24720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        data.writeInt32(port_index);
24820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        data.writeInt32(size);
24920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        remote()->transact(ALLOC_BUFFER, data, &reply);
25020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
25120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        status_t err = reply.readInt32();
25220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        if (err != OK) {
25320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            *buffer = 0;
25420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
25520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            return err;
25620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        }
25720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
258c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber        *buffer = (void*)reply.readIntPtr();
25920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
26020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        return err;
26120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    }
26220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
263318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    virtual status_t allocateBufferWithBackup(
26420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            node_id node, OMX_U32 port_index, const sp<IMemory> &params,
26520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            buffer_id *buffer) {
26620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        Parcel data, reply;
26720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
268c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber        data.writeIntPtr((intptr_t)node);
26920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        data.writeInt32(port_index);
27020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        data.writeStrongBinder(params->asBinder());
27120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        remote()->transact(ALLOC_BUFFER_WITH_BACKUP, data, &reply);
27220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
27320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        status_t err = reply.readInt32();
27420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        if (err != OK) {
27520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            *buffer = 0;
27620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
27720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            return err;
27820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        }
27920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
280c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber        *buffer = (void*)reply.readIntPtr();
28120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
28220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        return err;
28320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    }
28420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
285318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    virtual status_t freeBuffer(
28620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            node_id node, OMX_U32 port_index, buffer_id buffer) {
28720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        Parcel data, reply;
28820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
289c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber        data.writeIntPtr((intptr_t)node);
29020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        data.writeInt32(port_index);
291c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber        data.writeIntPtr((intptr_t)buffer);
29220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        remote()->transact(FREE_BUFFER, data, &reply);
29320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
29420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        return reply.readInt32();
29520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    }
29620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
297318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    virtual status_t fillBuffer(node_id node, buffer_id buffer) {
29820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        Parcel data, reply;
29920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
300c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber        data.writeIntPtr((intptr_t)node);
301c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber        data.writeIntPtr((intptr_t)buffer);
30236efa039efaae4526791336cb688032d22b34becAndreas Huber        remote()->transact(FILL_BUFFER, data, &reply);
30336efa039efaae4526791336cb688032d22b34becAndreas Huber
30436efa039efaae4526791336cb688032d22b34becAndreas Huber        return reply.readInt32();
30520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    }
30620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
307318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    virtual status_t emptyBuffer(
30820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            node_id node,
30920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            buffer_id buffer,
31020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            OMX_U32 range_offset, OMX_U32 range_length,
31120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            OMX_U32 flags, OMX_TICKS timestamp) {
31220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        Parcel data, reply;
31320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
314c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber        data.writeIntPtr((intptr_t)node);
315c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber        data.writeIntPtr((intptr_t)buffer);
31620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        data.writeInt32(range_offset);
31720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        data.writeInt32(range_length);
31820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        data.writeInt32(flags);
31920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        data.writeInt64(timestamp);
32036efa039efaae4526791336cb688032d22b34becAndreas Huber        remote()->transact(EMPTY_BUFFER, data, &reply);
32136efa039efaae4526791336cb688032d22b34becAndreas Huber
32236efa039efaae4526791336cb688032d22b34becAndreas Huber        return reply.readInt32();
32320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    }
3248b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber
325318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    virtual status_t getExtensionIndex(
326693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber            node_id node,
327693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber            const char *parameter_name,
328693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber            OMX_INDEXTYPE *index) {
329693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        Parcel data, reply;
330693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
331c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber        data.writeIntPtr((intptr_t)node);
332693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        data.writeCString(parameter_name);
333693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber
334693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        remote()->transact(GET_EXTENSION_INDEX, data, &reply);
335693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber
336693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        status_t err = reply.readInt32();
337693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        if (err == OK) {
338693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber            *index = static_cast<OMX_INDEXTYPE>(reply.readInt32());
339693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        } else {
340693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber            *index = OMX_IndexComponentStartUnused;
341693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        }
342693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber
343693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        return err;
344693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber    }
345693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber
3468b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber    virtual sp<IOMXRenderer> createRenderer(
3478b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber            const sp<ISurface> &surface,
3488b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber            const char *componentName,
3498b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber            OMX_COLOR_FORMATTYPE colorFormat,
3508b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber            size_t encodedWidth, size_t encodedHeight,
3518b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber            size_t displayWidth, size_t displayHeight) {
3528b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber        Parcel data, reply;
3538b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber        data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
3548b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber
3558b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber        data.writeStrongBinder(surface->asBinder());
3568b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber        data.writeCString(componentName);
3578b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber        data.writeInt32(colorFormat);
3588b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber        data.writeInt32(encodedWidth);
3598b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber        data.writeInt32(encodedHeight);
3608b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber        data.writeInt32(displayWidth);
3618b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber        data.writeInt32(displayHeight);
3628b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber
3638b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber        remote()->transact(CREATE_RENDERER, data, &reply);
3648b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber
3658b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber        return interface_cast<IOMXRenderer>(reply.readStrongBinder());
3668b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber    }
36720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber};
36820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
36920111aa043c5f404472bc63b90bc5aad906b1101Andreas HuberIMPLEMENT_META_INTERFACE(OMX, "android.hardware.IOMX");
37020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
37120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber////////////////////////////////////////////////////////////////////////////////
37220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
37320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#define CHECK_INTERFACE(interface, data, reply) \
37420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        do { if (!data.enforceInterface(interface::getInterfaceDescriptor())) { \
37520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            LOGW("Call incorrectly routed to " #interface); \
37620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            return PERMISSION_DENIED; \
37720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        } } while (0)
37820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
37920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberstatus_t BnOMX::onTransact(
38020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    uint32_t code, const Parcel &data, Parcel *reply, uint32_t flags) {
38120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    switch (code) {
3827eaa9c9385535b651064e02d05a8ffa4b2359281Andreas Huber        case LIVES_LOCALLY:
3837eaa9c9385535b651064e02d05a8ffa4b2359281Andreas Huber        {
3847eaa9c9385535b651064e02d05a8ffa4b2359281Andreas Huber            CHECK_INTERFACE(IOMX, data, reply);
3857eaa9c9385535b651064e02d05a8ffa4b2359281Andreas Huber            reply->writeInt32(livesLocally((pid_t)data.readInt32()));
3867eaa9c9385535b651064e02d05a8ffa4b2359281Andreas Huber
3877eaa9c9385535b651064e02d05a8ffa4b2359281Andreas Huber            return OK;
3887eaa9c9385535b651064e02d05a8ffa4b2359281Andreas Huber        }
3897eaa9c9385535b651064e02d05a8ffa4b2359281Andreas Huber
39020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        case LIST_NODES:
39120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        {
39220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            CHECK_INTERFACE(IOMX, data, reply);
39320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
394134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber            List<ComponentInfo> list;
395318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber            listNodes(&list);
39620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
39720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            reply->writeInt32(list.size());
398134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber            for (List<ComponentInfo>::iterator it = list.begin();
39920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber                 it != list.end(); ++it) {
400134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber                ComponentInfo &cur = *it;
401134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber
402134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber                reply->writeString8(cur.mName);
403134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber                reply->writeInt32(cur.mRoles.size());
404134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber                for (List<String8>::iterator role_it = cur.mRoles.begin();
405134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber                     role_it != cur.mRoles.end(); ++role_it) {
406134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber                    reply->writeString8(*role_it);
407134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber                }
40820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            }
40920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
41020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            return NO_ERROR;
41120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        }
41220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
41320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        case ALLOCATE_NODE:
41420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        {
41520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            CHECK_INTERFACE(IOMX, data, reply);
41620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
417318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber            const char *name = data.readCString();
418318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
419318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber            sp<IOMXObserver> observer =
420318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber                interface_cast<IOMXObserver>(data.readStrongBinder());
421318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
42220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            node_id node;
423318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
424318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber            status_t err = allocateNode(name, observer, &node);
42520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            reply->writeInt32(err);
42620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            if (err == OK) {
427c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber                reply->writeIntPtr((intptr_t)node);
42820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            }
4297eaa9c9385535b651064e02d05a8ffa4b2359281Andreas Huber
43020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            return NO_ERROR;
43120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        }
43220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
43320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        case FREE_NODE:
43420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        {
43520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            CHECK_INTERFACE(IOMX, data, reply);
43620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
437c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber            node_id node = (void*)data.readIntPtr();
43820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
439318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber            reply->writeInt32(freeNode(node));
4407eaa9c9385535b651064e02d05a8ffa4b2359281Andreas Huber
44120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            return NO_ERROR;
44220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        }
44320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
44420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        case SEND_COMMAND:
44520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        {
44620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            CHECK_INTERFACE(IOMX, data, reply);
44720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
448c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber            node_id node = (void*)data.readIntPtr();
44920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
45020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            OMX_COMMANDTYPE cmd =
45120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber                static_cast<OMX_COMMANDTYPE>(data.readInt32());
45220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
45320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            OMX_S32 param = data.readInt32();
454318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber            reply->writeInt32(sendCommand(node, cmd, param));
45520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
45620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            return NO_ERROR;
45720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        }
45820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
45920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        case GET_PARAMETER:
46020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        {
46120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            CHECK_INTERFACE(IOMX, data, reply);
46220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
463c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber            node_id node = (void*)data.readIntPtr();
46420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            OMX_INDEXTYPE index = static_cast<OMX_INDEXTYPE>(data.readInt32());
46520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
46620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            size_t size = data.readInt32();
46720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
46820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            // XXX I am not happy with this but Parcel::readInplace didn't work.
46920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            void *params = malloc(size);
47020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            data.read(params, size);
47120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
472318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber            status_t err = getParameter(node, index, params, size);
47320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
47420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            reply->writeInt32(err);
47520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
47620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            if (err == OK) {
47720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber                reply->write(params, size);
47820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            }
47920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
48020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            free(params);
48120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            params = NULL;
48220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
48320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            return NO_ERROR;
48420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        }
48520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
48620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        case SET_PARAMETER:
48720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        {
48820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            CHECK_INTERFACE(IOMX, data, reply);
48920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
490c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber            node_id node = (void*)data.readIntPtr();
49120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            OMX_INDEXTYPE index = static_cast<OMX_INDEXTYPE>(data.readInt32());
49220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
49320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            size_t size = data.readInt32();
49420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            void *params = const_cast<void *>(data.readInplace(size));
49520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
496318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber            reply->writeInt32(setParameter(node, index, params, size));
49720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
49820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            return NO_ERROR;
49920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        }
50020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
501693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        case GET_CONFIG:
502693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        {
503693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber            CHECK_INTERFACE(IOMX, data, reply);
504693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber
505c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber            node_id node = (void*)data.readIntPtr();
506693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber            OMX_INDEXTYPE index = static_cast<OMX_INDEXTYPE>(data.readInt32());
507693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber
508693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber            size_t size = data.readInt32();
509693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber
510693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber            // XXX I am not happy with this but Parcel::readInplace didn't work.
511693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber            void *params = malloc(size);
512693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber            data.read(params, size);
513693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber
514318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber            status_t err = getConfig(node, index, params, size);
515693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber
516693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber            reply->writeInt32(err);
517693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber
518693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber            if (err == OK) {
519693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber                reply->write(params, size);
520693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber            }
521693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber
522693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber            free(params);
523693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber            params = NULL;
524693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber
525693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber            return NO_ERROR;
526693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        }
527693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber
528693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        case SET_CONFIG:
529693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        {
530693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber            CHECK_INTERFACE(IOMX, data, reply);
531693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber
532c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber            node_id node = (void*)data.readIntPtr();
533693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber            OMX_INDEXTYPE index = static_cast<OMX_INDEXTYPE>(data.readInt32());
534693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber
535693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber            size_t size = data.readInt32();
536693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber            void *params = const_cast<void *>(data.readInplace(size));
537693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber
538318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber            reply->writeInt32(setConfig(node, index, params, size));
539693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber
540693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber            return NO_ERROR;
541693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        }
542693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber
54320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        case USE_BUFFER:
54420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        {
54520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            CHECK_INTERFACE(IOMX, data, reply);
54620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
547c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber            node_id node = (void*)data.readIntPtr();
54820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            OMX_U32 port_index = data.readInt32();
54920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            sp<IMemory> params =
55020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber                interface_cast<IMemory>(data.readStrongBinder());
55120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
55220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            buffer_id buffer;
553318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber            status_t err = useBuffer(node, port_index, params, &buffer);
55420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            reply->writeInt32(err);
55520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
55620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            if (err == OK) {
557c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber                reply->writeIntPtr((intptr_t)buffer);
55820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            }
55920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
56020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            return NO_ERROR;
56120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        }
56220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
56320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        case ALLOC_BUFFER:
56420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        {
56520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            CHECK_INTERFACE(IOMX, data, reply);
56620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
567c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber            node_id node = (void*)data.readIntPtr();
56820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            OMX_U32 port_index = data.readInt32();
56920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            size_t size = data.readInt32();
57020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
57120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            buffer_id buffer;
572318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber            status_t err = allocateBuffer(node, port_index, size, &buffer);
57320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            reply->writeInt32(err);
57420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
57520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            if (err == OK) {
576c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber                reply->writeIntPtr((intptr_t)buffer);
57720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            }
57820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
57920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            return NO_ERROR;
58020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        }
58120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
58220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        case ALLOC_BUFFER_WITH_BACKUP:
58320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        {
58420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            CHECK_INTERFACE(IOMX, data, reply);
58520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
586c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber            node_id node = (void*)data.readIntPtr();
58720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            OMX_U32 port_index = data.readInt32();
58820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            sp<IMemory> params =
58920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber                interface_cast<IMemory>(data.readStrongBinder());
59020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
59120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            buffer_id buffer;
592318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber            status_t err = allocateBufferWithBackup(
59320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber                    node, port_index, params, &buffer);
59420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
59520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            reply->writeInt32(err);
59620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
59720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            if (err == OK) {
598c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber                reply->writeIntPtr((intptr_t)buffer);
59920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            }
60020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
60120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            return NO_ERROR;
60220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        }
60320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
60420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        case FREE_BUFFER:
60520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        {
60620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            CHECK_INTERFACE(IOMX, data, reply);
60720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
608c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber            node_id node = (void*)data.readIntPtr();
60920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            OMX_U32 port_index = data.readInt32();
610c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber            buffer_id buffer = (void*)data.readIntPtr();
611318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber            reply->writeInt32(freeBuffer(node, port_index, buffer));
61220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
61320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            return NO_ERROR;
61420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        }
61520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
61620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        case FILL_BUFFER:
61720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        {
61820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            CHECK_INTERFACE(IOMX, data, reply);
61920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
620c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber            node_id node = (void*)data.readIntPtr();
621c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber            buffer_id buffer = (void*)data.readIntPtr();
622318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber            reply->writeInt32(fillBuffer(node, buffer));
62320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
62420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            return NO_ERROR;
62520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        }
62620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
62720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        case EMPTY_BUFFER:
62820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        {
62920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            CHECK_INTERFACE(IOMX, data, reply);
63020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
631c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber            node_id node = (void*)data.readIntPtr();
632c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber            buffer_id buffer = (void*)data.readIntPtr();
63320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            OMX_U32 range_offset = data.readInt32();
63420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            OMX_U32 range_length = data.readInt32();
63520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            OMX_U32 flags = data.readInt32();
63620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            OMX_TICKS timestamp = data.readInt64();
63720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
63836efa039efaae4526791336cb688032d22b34becAndreas Huber            reply->writeInt32(
639318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber                    emptyBuffer(
64036efa039efaae4526791336cb688032d22b34becAndreas Huber                        node, buffer, range_offset, range_length,
64136efa039efaae4526791336cb688032d22b34becAndreas Huber                        flags, timestamp));
64220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
64320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            return NO_ERROR;
64420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        }
64520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
646693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        case GET_EXTENSION_INDEX:
647693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        {
648693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber            CHECK_INTERFACE(IOMX, data, reply);
649693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber
650c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber            node_id node = (void*)data.readIntPtr();
651693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber            const char *parameter_name = data.readCString();
6527eaa9c9385535b651064e02d05a8ffa4b2359281Andreas Huber
653693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber            OMX_INDEXTYPE index;
654318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber            status_t err = getExtensionIndex(node, parameter_name, &index);
655693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber
656693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber            reply->writeInt32(err);
657693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber
658693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber            if (err == OK) {
659693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber                reply->writeInt32(index);
660693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber            }
661693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber
662693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber            return OK;
663693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        }
664693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber
6658b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber        case CREATE_RENDERER:
6668b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber        {
6678b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber            CHECK_INTERFACE(IOMX, data, reply);
6688b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber
6698b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber            sp<ISurface> isurface =
6708b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber                interface_cast<ISurface>(data.readStrongBinder());
6718b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber
6728b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber            const char *componentName = data.readCString();
6738b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber
6748b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber            OMX_COLOR_FORMATTYPE colorFormat =
6758b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber                static_cast<OMX_COLOR_FORMATTYPE>(data.readInt32());
6768b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber
6778b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber            size_t encodedWidth = (size_t)data.readInt32();
6788b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber            size_t encodedHeight = (size_t)data.readInt32();
6798b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber            size_t displayWidth = (size_t)data.readInt32();
6808b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber            size_t displayHeight = (size_t)data.readInt32();
6818b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber
6828b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber            sp<IOMXRenderer> renderer =
6838b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber                createRenderer(isurface, componentName, colorFormat,
6848b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber                               encodedWidth, encodedHeight,
6858b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber                               displayWidth, displayHeight);
6868b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber
6878b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber            reply->writeStrongBinder(renderer->asBinder());
6888b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber
6898b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber            return OK;
6908b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber        }
6918b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber
69220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        default:
69320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            return BBinder::onTransact(code, data, reply, flags);
69420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    }
69520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}
69620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
69720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber////////////////////////////////////////////////////////////////////////////////
69820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
69920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberclass BpOMXObserver : public BpInterface<IOMXObserver> {
70020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberpublic:
70120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    BpOMXObserver(const sp<IBinder> &impl)
70220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        : BpInterface<IOMXObserver>(impl) {
70320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    }
70420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
705318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    virtual void onMessage(const omx_message &msg) {
70620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        Parcel data, reply;
70720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        data.writeInterfaceToken(IOMXObserver::getInterfaceDescriptor());
70820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        data.write(&msg, sizeof(msg));
70920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
71020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        remote()->transact(OBSERVER_ON_MSG, data, &reply, IBinder::FLAG_ONEWAY);
71120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    }
71220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber};
71320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
71420111aa043c5f404472bc63b90bc5aad906b1101Andreas HuberIMPLEMENT_META_INTERFACE(OMXObserver, "android.hardware.IOMXObserver");
71520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
71620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberstatus_t BnOMXObserver::onTransact(
71720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    uint32_t code, const Parcel &data, Parcel *reply, uint32_t flags) {
71820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    switch (code) {
71920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        case OBSERVER_ON_MSG:
72020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        {
72120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            CHECK_INTERFACE(IOMXObserver, data, reply);
72220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
72320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            omx_message msg;
72420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            data.read(&msg, sizeof(msg));
72520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
72620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            // XXX Could use readInplace maybe?
727318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber            onMessage(msg);
72820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
72920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            return NO_ERROR;
73020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        }
73120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
73220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        default:
73320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            return BBinder::onTransact(code, data, reply, flags);
73420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    }
73520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}
73620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
7378b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber////////////////////////////////////////////////////////////////////////////////
7388b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber
7398b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huberclass BpOMXRenderer : public BpInterface<IOMXRenderer> {
7408b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huberpublic:
7418b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber    BpOMXRenderer(const sp<IBinder> &impl)
7428b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber        : BpInterface<IOMXRenderer>(impl) {
7438b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber    }
7448b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber
7458b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber    virtual void render(IOMX::buffer_id buffer) {
7468b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber        Parcel data, reply;
7478b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber        data.writeInterfaceToken(IOMXRenderer::getInterfaceDescriptor());
748c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber        data.writeIntPtr((intptr_t)buffer);
7498b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber
7508b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber        // NOTE: Do NOT make this a ONE_WAY call, it must be synchronous
7518b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber        // so that the caller knows when to recycle the buffer.
7528b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber        remote()->transact(RENDERER_RENDER, data, &reply);
7538b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber    }
7548b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber};
7558b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber
7568b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas HuberIMPLEMENT_META_INTERFACE(OMXRenderer, "android.hardware.IOMXRenderer");
7578b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber
7588b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huberstatus_t BnOMXRenderer::onTransact(
7598b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber    uint32_t code, const Parcel &data, Parcel *reply, uint32_t flags) {
7608b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber    switch (code) {
7618b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber        case RENDERER_RENDER:
7628b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber        {
7638b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber            CHECK_INTERFACE(IOMXRenderer, data, reply);
7648b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber
765c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber            IOMX::buffer_id buffer = (void*)data.readIntPtr();
7668b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber
7678b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber            render(buffer);
7688b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber
7698b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber            return NO_ERROR;
7708b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber        }
7718b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber
7728b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber        default:
7738b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber            return BBinder::onTransact(code, data, reply, flags);
7748b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber    }
7758b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber}
7768b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber
77720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}  // namespace android
778