127c174483a8ae9688d5d4897c19074f62c7f1701James Dong/*
227c174483a8ae9688d5d4897c19074f62c7f1701James Dong * Copyright (c) 2009 The Android Open Source Project
327c174483a8ae9688d5d4897c19074f62c7f1701James Dong *
427c174483a8ae9688d5d4897c19074f62c7f1701James Dong * Licensed under the Apache License, Version 2.0 (the "License");
527c174483a8ae9688d5d4897c19074f62c7f1701James Dong * you may not use this file except in compliance with the License.
627c174483a8ae9688d5d4897c19074f62c7f1701James Dong * You may obtain a copy of the License at
727c174483a8ae9688d5d4897c19074f62c7f1701James Dong *
827c174483a8ae9688d5d4897c19074f62c7f1701James Dong *     http://www.apache.org/licenses/LICENSE-2.0
927c174483a8ae9688d5d4897c19074f62c7f1701James Dong *
1027c174483a8ae9688d5d4897c19074f62c7f1701James Dong * Unless required by applicable law or agreed to in writing, software
1127c174483a8ae9688d5d4897c19074f62c7f1701James Dong * distributed under the License is distributed on an "AS IS" BASIS,
1227c174483a8ae9688d5d4897c19074f62c7f1701James Dong * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1327c174483a8ae9688d5d4897c19074f62c7f1701James Dong * See the License for the specific language governing permissions and
1427c174483a8ae9688d5d4897c19074f62c7f1701James Dong * limitations under the License.
1527c174483a8ae9688d5d4897c19074f62c7f1701James Dong */
1627c174483a8ae9688d5d4897c19074f62c7f1701James Dong
1720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber//#define LOG_NDEBUG 0
1820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#define LOG_TAG "IOMX"
1920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#include <utils/Log.h>
2020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
2120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#include <binder/IMemory.h>
2220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#include <binder/Parcel.h>
2320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#include <media/IOMX.h>
24b391290130f263441334ee4525a5832f0bea2ef0Andreas Huber#include <media/stagefright/foundation/ADebug.h>
2520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
2620111aa043c5f404472bc63b90bc5aad906b1101Andreas Hubernamespace android {
2720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
2820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberenum {
2920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    CONNECT = IBinder::FIRST_CALL_TRANSACTION,
307eaa9c9385535b651064e02d05a8ffa4b2359281Andreas Huber    LIVES_LOCALLY,
3120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    LIST_NODES,
3220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    ALLOCATE_NODE,
3320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    FREE_NODE,
3420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    SEND_COMMAND,
3520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    GET_PARAMETER,
3620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    SET_PARAMETER,
37693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber    GET_CONFIG,
38693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber    SET_CONFIG,
39b1d666f5cb555d135eb69e005e88a03330bbb54cJamie Gennis    GET_STATE,
4083750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis    ENABLE_GRAPHIC_BUFFERS,
4120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    USE_BUFFER,
4283750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis    USE_GRAPHIC_BUFFER,
43e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong    STORE_META_DATA_IN_BUFFERS,
4420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    ALLOC_BUFFER,
4520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    ALLOC_BUFFER_WITH_BACKUP,
4620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    FREE_BUFFER,
4720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    FILL_BUFFER,
4820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    EMPTY_BUFFER,
49693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber    GET_EXTENSION_INDEX,
5020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    OBSERVER_ON_MSG,
51e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis    GET_GRAPHIC_BUFFER_USAGE,
5220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber};
5320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
5420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberclass BpOMX : public BpInterface<IOMX> {
5520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberpublic:
5620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    BpOMX(const sp<IBinder> &impl)
5720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        : BpInterface<IOMX>(impl) {
5820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    }
5920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
60d459b485c61bd3e7fd81c5cd3af8ada27fc3e8d3Andreas Huber    virtual bool livesLocally(node_id node, pid_t pid) {
617eaa9c9385535b651064e02d05a8ffa4b2359281Andreas Huber        Parcel data, reply;
627eaa9c9385535b651064e02d05a8ffa4b2359281Andreas Huber        data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
63d459b485c61bd3e7fd81c5cd3af8ada27fc3e8d3Andreas Huber        data.writeIntPtr((intptr_t)node);
647eaa9c9385535b651064e02d05a8ffa4b2359281Andreas Huber        data.writeInt32(pid);
657eaa9c9385535b651064e02d05a8ffa4b2359281Andreas Huber        remote()->transact(LIVES_LOCALLY, data, &reply);
667eaa9c9385535b651064e02d05a8ffa4b2359281Andreas Huber
677eaa9c9385535b651064e02d05a8ffa4b2359281Andreas Huber        return reply.readInt32() != 0;
687eaa9c9385535b651064e02d05a8ffa4b2359281Andreas Huber    }
697eaa9c9385535b651064e02d05a8ffa4b2359281Andreas Huber
70134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber    virtual status_t listNodes(List<ComponentInfo> *list) {
7120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        list->clear();
7220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
7320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        Parcel data, reply;
7420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
7520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        remote()->transact(LIST_NODES, data, &reply);
7620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
7720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        int32_t n = reply.readInt32();
7820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        for (int32_t i = 0; i < n; ++i) {
79134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber            list->push_back(ComponentInfo());
80134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber            ComponentInfo &info = *--list->end();
8120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
82134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber            info.mName = reply.readString8();
83134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber            int32_t numRoles = reply.readInt32();
84134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber            for (int32_t j = 0; j < numRoles; ++j) {
85134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber                info.mRoles.push_back(reply.readString8());
86134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber            }
8720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        }
8820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
8920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        return OK;
9020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    }
9120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
92318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    virtual status_t allocateNode(
93318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber            const char *name, const sp<IOMXObserver> &observer, node_id *node) {
9420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        Parcel data, reply;
9520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
9620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        data.writeCString(name);
97318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        data.writeStrongBinder(observer->asBinder());
9820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        remote()->transact(ALLOCATE_NODE, data, &reply);
9920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
10020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        status_t err = reply.readInt32();
10120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        if (err == OK) {
102c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber            *node = (void*)reply.readIntPtr();
10320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        } else {
10420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            *node = 0;
10520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        }
10620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
10720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        return err;
10820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    }
10920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
110318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    virtual status_t freeNode(node_id node) {
11120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        Parcel data, reply;
11220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
113c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber        data.writeIntPtr((intptr_t)node);
11420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        remote()->transact(FREE_NODE, data, &reply);
11520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
11620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        return reply.readInt32();
11720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    }
11820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
119318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    virtual status_t sendCommand(
12020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            node_id node, OMX_COMMANDTYPE cmd, OMX_S32 param) {
12120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        Parcel data, reply;
12220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
123c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber        data.writeIntPtr((intptr_t)node);
12420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        data.writeInt32(cmd);
12520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        data.writeInt32(param);
12620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        remote()->transact(SEND_COMMAND, data, &reply);
12720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
12820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        return reply.readInt32();
12920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    }
13020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
131318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    virtual status_t getParameter(
13220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            node_id node, OMX_INDEXTYPE index,
13320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            void *params, size_t size) {
13420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        Parcel data, reply;
13520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
136c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber        data.writeIntPtr((intptr_t)node);
13720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        data.writeInt32(index);
13820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        data.writeInt32(size);
13920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        data.write(params, size);
14020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        remote()->transact(GET_PARAMETER, data, &reply);
14120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
14220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        status_t err = reply.readInt32();
14320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        if (err != OK) {
14420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            return err;
14520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        }
14620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
14720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        reply.read(params, size);
14820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
14920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        return OK;
15020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    }
15120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
152318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    virtual status_t setParameter(
15320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            node_id node, OMX_INDEXTYPE index,
15420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            const void *params, size_t size) {
15520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        Parcel data, reply;
15620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
157c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber        data.writeIntPtr((intptr_t)node);
15820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        data.writeInt32(index);
15920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        data.writeInt32(size);
16020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        data.write(params, size);
16120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        remote()->transact(SET_PARAMETER, data, &reply);
16220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
16320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        return reply.readInt32();
16420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    }
16520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
166318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    virtual status_t getConfig(
167693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber            node_id node, OMX_INDEXTYPE index,
168693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber            void *params, size_t size) {
169693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        Parcel data, reply;
170693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
171c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber        data.writeIntPtr((intptr_t)node);
172693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        data.writeInt32(index);
173693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        data.writeInt32(size);
174693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        data.write(params, size);
175693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        remote()->transact(GET_CONFIG, data, &reply);
176693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber
177693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        status_t err = reply.readInt32();
178693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        if (err != OK) {
179693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber            return err;
180693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        }
181693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber
182693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        reply.read(params, size);
183693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber
184693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        return OK;
185693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber    }
186693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber
187318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    virtual status_t setConfig(
188693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber            node_id node, OMX_INDEXTYPE index,
189693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber            const void *params, size_t size) {
190693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        Parcel data, reply;
191693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
192c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber        data.writeIntPtr((intptr_t)node);
193693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        data.writeInt32(index);
194693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        data.writeInt32(size);
195693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        data.write(params, size);
196693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        remote()->transact(SET_CONFIG, data, &reply);
197693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber
198693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        return reply.readInt32();
199693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber    }
200693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber
201b1d666f5cb555d135eb69e005e88a03330bbb54cJamie Gennis    virtual status_t getState(
202b1d666f5cb555d135eb69e005e88a03330bbb54cJamie Gennis            node_id node, OMX_STATETYPE* state) {
203b1d666f5cb555d135eb69e005e88a03330bbb54cJamie Gennis        Parcel data, reply;
204b1d666f5cb555d135eb69e005e88a03330bbb54cJamie Gennis        data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
205b1d666f5cb555d135eb69e005e88a03330bbb54cJamie Gennis        data.writeIntPtr((intptr_t)node);
206b1d666f5cb555d135eb69e005e88a03330bbb54cJamie Gennis        remote()->transact(GET_STATE, data, &reply);
207b1d666f5cb555d135eb69e005e88a03330bbb54cJamie Gennis
208b1d666f5cb555d135eb69e005e88a03330bbb54cJamie Gennis        *state = static_cast<OMX_STATETYPE>(reply.readInt32());
209b1d666f5cb555d135eb69e005e88a03330bbb54cJamie Gennis        return reply.readInt32();
210b1d666f5cb555d135eb69e005e88a03330bbb54cJamie Gennis    }
211b1d666f5cb555d135eb69e005e88a03330bbb54cJamie Gennis
21283750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis    virtual status_t enableGraphicBuffers(
21383750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis            node_id node, OMX_U32 port_index, OMX_BOOL enable) {
21483750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis        Parcel data, reply;
21583750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis        data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
21683750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis        data.writeIntPtr((intptr_t)node);
21783750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis        data.writeInt32(port_index);
21883750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis        data.writeInt32((uint32_t)enable);
21983750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis        remote()->transact(ENABLE_GRAPHIC_BUFFERS, data, &reply);
22083750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis
22183750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis        status_t err = reply.readInt32();
22283750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis        return err;
22383750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis    }
22483750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis
225e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis    virtual status_t getGraphicBufferUsage(
226e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis            node_id node, OMX_U32 port_index, OMX_U32* usage) {
227e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis        Parcel data, reply;
228e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis        data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
229e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis        data.writeIntPtr((intptr_t)node);
230e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis        data.writeInt32(port_index);
231e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis        remote()->transact(GET_GRAPHIC_BUFFER_USAGE, data, &reply);
232e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis
233e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis        status_t err = reply.readInt32();
234e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis        *usage = reply.readInt32();
235e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis        return err;
236e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis    }
237e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis
238318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    virtual status_t useBuffer(
23920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            node_id node, OMX_U32 port_index, const sp<IMemory> &params,
24020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            buffer_id *buffer) {
24120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        Parcel data, reply;
24220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
243c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber        data.writeIntPtr((intptr_t)node);
24420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        data.writeInt32(port_index);
24520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        data.writeStrongBinder(params->asBinder());
24620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        remote()->transact(USE_BUFFER, data, &reply);
24720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
24820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        status_t err = reply.readInt32();
24920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        if (err != OK) {
25020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            *buffer = 0;
25120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
25220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            return err;
25320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        }
25420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
255c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber        *buffer = (void*)reply.readIntPtr();
25620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
25720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        return err;
25820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    }
25920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
26083750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis
26183750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis    virtual status_t useGraphicBuffer(
26283750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis            node_id node, OMX_U32 port_index,
26383750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis            const sp<GraphicBuffer> &graphicBuffer, buffer_id *buffer) {
26483750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis        Parcel data, reply;
26583750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis        data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
26683750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis        data.writeIntPtr((intptr_t)node);
26783750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis        data.writeInt32(port_index);
26883750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis        data.write(*graphicBuffer);
26983750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis        remote()->transact(USE_GRAPHIC_BUFFER, data, &reply);
27083750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis
27183750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis        status_t err = reply.readInt32();
27283750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis        if (err != OK) {
27383750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis            *buffer = 0;
27483750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis
27583750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis            return err;
27683750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis        }
27783750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis
27883750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis        *buffer = (void*)reply.readIntPtr();
27983750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis
28083750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis        return err;
28183750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis    }
28283750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis
283e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong    virtual status_t storeMetaDataInBuffers(
284e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong            node_id node, OMX_U32 port_index, OMX_BOOL enable) {
285e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong        Parcel data, reply;
286e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong        data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
287e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong        data.writeIntPtr((intptr_t)node);
288e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong        data.writeInt32(port_index);
289e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong        data.writeInt32((uint32_t)enable);
290e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong        remote()->transact(STORE_META_DATA_IN_BUFFERS, data, &reply);
291e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong
292e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong        status_t err = reply.readInt32();
293e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong        return err;
294e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong    }
295e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong
296318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    virtual status_t allocateBuffer(
29720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            node_id node, OMX_U32 port_index, size_t size,
298570a3cb7582daa030cb38eedc5eb6a06f86ecc7fAndreas Huber            buffer_id *buffer, void **buffer_data) {
29920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        Parcel data, reply;
30020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
301c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber        data.writeIntPtr((intptr_t)node);
30220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        data.writeInt32(port_index);
30320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        data.writeInt32(size);
30420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        remote()->transact(ALLOC_BUFFER, data, &reply);
30520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
30620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        status_t err = reply.readInt32();
30720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        if (err != OK) {
30820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            *buffer = 0;
30920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
31020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            return err;
31120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        }
31220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
313570a3cb7582daa030cb38eedc5eb6a06f86ecc7fAndreas Huber        *buffer = (void *)reply.readIntPtr();
314570a3cb7582daa030cb38eedc5eb6a06f86ecc7fAndreas Huber        *buffer_data = (void *)reply.readIntPtr();
31520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
31620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        return err;
31720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    }
31820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
319318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    virtual status_t allocateBufferWithBackup(
32020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            node_id node, OMX_U32 port_index, const sp<IMemory> &params,
32120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            buffer_id *buffer) {
32220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        Parcel data, reply;
32320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
324c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber        data.writeIntPtr((intptr_t)node);
32520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        data.writeInt32(port_index);
32620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        data.writeStrongBinder(params->asBinder());
32720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        remote()->transact(ALLOC_BUFFER_WITH_BACKUP, data, &reply);
32820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
32920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        status_t err = reply.readInt32();
33020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        if (err != OK) {
33120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            *buffer = 0;
33220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
33320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            return err;
33420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        }
33520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
336c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber        *buffer = (void*)reply.readIntPtr();
33720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
33820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        return err;
33920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    }
34020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
341318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    virtual status_t freeBuffer(
34220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            node_id node, OMX_U32 port_index, buffer_id buffer) {
34320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        Parcel data, reply;
34420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
345c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber        data.writeIntPtr((intptr_t)node);
34620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        data.writeInt32(port_index);
347c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber        data.writeIntPtr((intptr_t)buffer);
34820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        remote()->transact(FREE_BUFFER, data, &reply);
34920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
35020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        return reply.readInt32();
35120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    }
35220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
353318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    virtual status_t fillBuffer(node_id node, buffer_id buffer) {
35420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        Parcel data, reply;
35520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
356c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber        data.writeIntPtr((intptr_t)node);
357c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber        data.writeIntPtr((intptr_t)buffer);
35836efa039efaae4526791336cb688032d22b34becAndreas Huber        remote()->transact(FILL_BUFFER, data, &reply);
35936efa039efaae4526791336cb688032d22b34becAndreas Huber
36036efa039efaae4526791336cb688032d22b34becAndreas Huber        return reply.readInt32();
36120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    }
36220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
363318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    virtual status_t emptyBuffer(
36420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            node_id node,
36520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            buffer_id buffer,
36620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            OMX_U32 range_offset, OMX_U32 range_length,
36720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            OMX_U32 flags, OMX_TICKS timestamp) {
36820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        Parcel data, reply;
36920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
370c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber        data.writeIntPtr((intptr_t)node);
371c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber        data.writeIntPtr((intptr_t)buffer);
37220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        data.writeInt32(range_offset);
37320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        data.writeInt32(range_length);
37420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        data.writeInt32(flags);
37520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        data.writeInt64(timestamp);
37636efa039efaae4526791336cb688032d22b34becAndreas Huber        remote()->transact(EMPTY_BUFFER, data, &reply);
37736efa039efaae4526791336cb688032d22b34becAndreas Huber
37836efa039efaae4526791336cb688032d22b34becAndreas Huber        return reply.readInt32();
37920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    }
3808b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber
381318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    virtual status_t getExtensionIndex(
382693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber            node_id node,
383693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber            const char *parameter_name,
384693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber            OMX_INDEXTYPE *index) {
385693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        Parcel data, reply;
386693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
387c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber        data.writeIntPtr((intptr_t)node);
388693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        data.writeCString(parameter_name);
389693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber
390693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        remote()->transact(GET_EXTENSION_INDEX, data, &reply);
391693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber
392693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        status_t err = reply.readInt32();
393693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        if (err == OK) {
394693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber            *index = static_cast<OMX_INDEXTYPE>(reply.readInt32());
395693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        } else {
396693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber            *index = OMX_IndexComponentStartUnused;
397693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        }
398693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber
399693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        return err;
400693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber    }
40120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber};
40220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
40320111aa043c5f404472bc63b90bc5aad906b1101Andreas HuberIMPLEMENT_META_INTERFACE(OMX, "android.hardware.IOMX");
40420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
40520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber////////////////////////////////////////////////////////////////////////////////
40620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
40720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#define CHECK_INTERFACE(interface, data, reply) \
40820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        do { if (!data.enforceInterface(interface::getInterfaceDescriptor())) { \
4095ff1dd576bb93c45b44088a51544a18fc43ebf58Steve Block            ALOGW("Call incorrectly routed to " #interface); \
41020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            return PERMISSION_DENIED; \
41120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        } } while (0)
41220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
41320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberstatus_t BnOMX::onTransact(
41420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    uint32_t code, const Parcel &data, Parcel *reply, uint32_t flags) {
41520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    switch (code) {
4167eaa9c9385535b651064e02d05a8ffa4b2359281Andreas Huber        case LIVES_LOCALLY:
4177eaa9c9385535b651064e02d05a8ffa4b2359281Andreas Huber        {
4187eaa9c9385535b651064e02d05a8ffa4b2359281Andreas Huber            CHECK_INTERFACE(IOMX, data, reply);
419d459b485c61bd3e7fd81c5cd3af8ada27fc3e8d3Andreas Huber            node_id node = (void *)data.readIntPtr();
420d459b485c61bd3e7fd81c5cd3af8ada27fc3e8d3Andreas Huber            pid_t pid = (pid_t)data.readInt32();
421d459b485c61bd3e7fd81c5cd3af8ada27fc3e8d3Andreas Huber            reply->writeInt32(livesLocally(node, pid));
4227eaa9c9385535b651064e02d05a8ffa4b2359281Andreas Huber
4237eaa9c9385535b651064e02d05a8ffa4b2359281Andreas Huber            return OK;
4247eaa9c9385535b651064e02d05a8ffa4b2359281Andreas Huber        }
4257eaa9c9385535b651064e02d05a8ffa4b2359281Andreas Huber
42620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        case LIST_NODES:
42720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        {
42820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            CHECK_INTERFACE(IOMX, data, reply);
42920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
430134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber            List<ComponentInfo> list;
431318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber            listNodes(&list);
43220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
43320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            reply->writeInt32(list.size());
434134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber            for (List<ComponentInfo>::iterator it = list.begin();
43520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber                 it != list.end(); ++it) {
436134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber                ComponentInfo &cur = *it;
437134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber
438134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber                reply->writeString8(cur.mName);
439134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber                reply->writeInt32(cur.mRoles.size());
440134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber                for (List<String8>::iterator role_it = cur.mRoles.begin();
441134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber                     role_it != cur.mRoles.end(); ++role_it) {
442134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber                    reply->writeString8(*role_it);
443134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber                }
44420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            }
44520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
44620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            return NO_ERROR;
44720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        }
44820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
44920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        case ALLOCATE_NODE:
45020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        {
45120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            CHECK_INTERFACE(IOMX, data, reply);
45220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
453318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber            const char *name = data.readCString();
454318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
455318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber            sp<IOMXObserver> observer =
456318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber                interface_cast<IOMXObserver>(data.readStrongBinder());
457318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
45820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            node_id node;
459318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
460318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber            status_t err = allocateNode(name, observer, &node);
46120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            reply->writeInt32(err);
46220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            if (err == OK) {
463c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber                reply->writeIntPtr((intptr_t)node);
46420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            }
4657eaa9c9385535b651064e02d05a8ffa4b2359281Andreas Huber
46620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            return NO_ERROR;
46720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        }
46820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
46920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        case FREE_NODE:
47020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        {
47120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            CHECK_INTERFACE(IOMX, data, reply);
47220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
473c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber            node_id node = (void*)data.readIntPtr();
47420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
475318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber            reply->writeInt32(freeNode(node));
4767eaa9c9385535b651064e02d05a8ffa4b2359281Andreas Huber
47720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            return NO_ERROR;
47820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        }
47920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
48020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        case SEND_COMMAND:
48120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        {
48220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            CHECK_INTERFACE(IOMX, data, reply);
48320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
484c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber            node_id node = (void*)data.readIntPtr();
48520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
48620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            OMX_COMMANDTYPE cmd =
48720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber                static_cast<OMX_COMMANDTYPE>(data.readInt32());
48820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
48920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            OMX_S32 param = data.readInt32();
490318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber            reply->writeInt32(sendCommand(node, cmd, param));
49120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
49220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            return NO_ERROR;
49320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        }
49420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
49520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        case GET_PARAMETER:
49620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        case SET_PARAMETER:
497693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        case GET_CONFIG:
498b391290130f263441334ee4525a5832f0bea2ef0Andreas Huber        case SET_CONFIG:
499693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        {
500693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber            CHECK_INTERFACE(IOMX, data, reply);
501693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber
502c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber            node_id node = (void*)data.readIntPtr();
503693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber            OMX_INDEXTYPE index = static_cast<OMX_INDEXTYPE>(data.readInt32());
504693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber
505693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber            size_t size = data.readInt32();
506693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber
507693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber            void *params = malloc(size);
508693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber            data.read(params, size);
509693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber
510b391290130f263441334ee4525a5832f0bea2ef0Andreas Huber            status_t err;
511b391290130f263441334ee4525a5832f0bea2ef0Andreas Huber            switch (code) {
512b391290130f263441334ee4525a5832f0bea2ef0Andreas Huber                case GET_PARAMETER:
513b391290130f263441334ee4525a5832f0bea2ef0Andreas Huber                    err = getParameter(node, index, params, size);
514b391290130f263441334ee4525a5832f0bea2ef0Andreas Huber                    break;
515b391290130f263441334ee4525a5832f0bea2ef0Andreas Huber                case SET_PARAMETER:
516b391290130f263441334ee4525a5832f0bea2ef0Andreas Huber                    err = setParameter(node, index, params, size);
517b391290130f263441334ee4525a5832f0bea2ef0Andreas Huber                    break;
518b391290130f263441334ee4525a5832f0bea2ef0Andreas Huber                case GET_CONFIG:
519b391290130f263441334ee4525a5832f0bea2ef0Andreas Huber                    err = getConfig(node, index, params, size);
520b391290130f263441334ee4525a5832f0bea2ef0Andreas Huber                    break;
521b391290130f263441334ee4525a5832f0bea2ef0Andreas Huber                case SET_CONFIG:
522b391290130f263441334ee4525a5832f0bea2ef0Andreas Huber                    err = setConfig(node, index, params, size);
523b391290130f263441334ee4525a5832f0bea2ef0Andreas Huber                    break;
524b391290130f263441334ee4525a5832f0bea2ef0Andreas Huber                default:
525b391290130f263441334ee4525a5832f0bea2ef0Andreas Huber                    TRESPASS();
526b391290130f263441334ee4525a5832f0bea2ef0Andreas Huber            }
527693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber
528693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber            reply->writeInt32(err);
529693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber
530b391290130f263441334ee4525a5832f0bea2ef0Andreas Huber            if ((code == GET_PARAMETER || code == GET_CONFIG) && err == OK) {
531693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber                reply->write(params, size);
532693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber            }
533693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber
534693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber            free(params);
535693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber            params = NULL;
536693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber
537693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber            return NO_ERROR;
538693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        }
539693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber
540b1d666f5cb555d135eb69e005e88a03330bbb54cJamie Gennis        case GET_STATE:
541b1d666f5cb555d135eb69e005e88a03330bbb54cJamie Gennis        {
542b1d666f5cb555d135eb69e005e88a03330bbb54cJamie Gennis            CHECK_INTERFACE(IOMX, data, reply);
543b1d666f5cb555d135eb69e005e88a03330bbb54cJamie Gennis
544b1d666f5cb555d135eb69e005e88a03330bbb54cJamie Gennis            node_id node = (void*)data.readIntPtr();
545b1d666f5cb555d135eb69e005e88a03330bbb54cJamie Gennis            OMX_STATETYPE state = OMX_StateInvalid;
546b1d666f5cb555d135eb69e005e88a03330bbb54cJamie Gennis
547b1d666f5cb555d135eb69e005e88a03330bbb54cJamie Gennis            status_t err = getState(node, &state);
548b1d666f5cb555d135eb69e005e88a03330bbb54cJamie Gennis            reply->writeInt32(state);
549b1d666f5cb555d135eb69e005e88a03330bbb54cJamie Gennis            reply->writeInt32(err);
550b1d666f5cb555d135eb69e005e88a03330bbb54cJamie Gennis
551b1d666f5cb555d135eb69e005e88a03330bbb54cJamie Gennis            return NO_ERROR;
552b1d666f5cb555d135eb69e005e88a03330bbb54cJamie Gennis        }
553b1d666f5cb555d135eb69e005e88a03330bbb54cJamie Gennis
55483750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis        case ENABLE_GRAPHIC_BUFFERS:
55583750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis        {
55683750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis            CHECK_INTERFACE(IOMX, data, reply);
55783750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis
55883750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis            node_id node = (void*)data.readIntPtr();
55983750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis            OMX_U32 port_index = data.readInt32();
56083750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis            OMX_BOOL enable = (OMX_BOOL)data.readInt32();
56183750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis
56283750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis            status_t err = enableGraphicBuffers(node, port_index, enable);
56383750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis            reply->writeInt32(err);
56483750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis
56583750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis            return NO_ERROR;
56683750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis        }
56783750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis
568e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis        case GET_GRAPHIC_BUFFER_USAGE:
569e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis        {
570e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis            CHECK_INTERFACE(IOMX, data, reply);
571e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis
572e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis            node_id node = (void*)data.readIntPtr();
573e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis            OMX_U32 port_index = data.readInt32();
574e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis
575e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis            OMX_U32 usage = 0;
576e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis            status_t err = getGraphicBufferUsage(node, port_index, &usage);
577e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis            reply->writeInt32(err);
578e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis            reply->writeInt32(usage);
579e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis
580e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis            return NO_ERROR;
581e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis        }
582e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis
58320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        case USE_BUFFER:
58420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        {
58520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            CHECK_INTERFACE(IOMX, data, reply);
58620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
587c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber            node_id node = (void*)data.readIntPtr();
58820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            OMX_U32 port_index = data.readInt32();
58920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            sp<IMemory> params =
59020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber                interface_cast<IMemory>(data.readStrongBinder());
59120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
59220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            buffer_id buffer;
593318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber            status_t err = useBuffer(node, port_index, params, &buffer);
59420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            reply->writeInt32(err);
59520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
59620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            if (err == OK) {
597c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber                reply->writeIntPtr((intptr_t)buffer);
59820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            }
59920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
60020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            return NO_ERROR;
60120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        }
60220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
60383750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis        case USE_GRAPHIC_BUFFER:
60483750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis        {
60583750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis            CHECK_INTERFACE(IOMX, data, reply);
60683750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis
60783750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis            node_id node = (void*)data.readIntPtr();
60883750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis            OMX_U32 port_index = data.readInt32();
60983750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis            sp<GraphicBuffer> graphicBuffer = new GraphicBuffer();
61083750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis            data.read(*graphicBuffer);
61183750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis
61283750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis            buffer_id buffer;
61383750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis            status_t err = useGraphicBuffer(
61483750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis                    node, port_index, graphicBuffer, &buffer);
61583750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis            reply->writeInt32(err);
61683750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis
61783750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis            if (err == OK) {
61883750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis                reply->writeIntPtr((intptr_t)buffer);
61983750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis            }
62083750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis
62183750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis            return NO_ERROR;
62283750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis        }
62383750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis
624e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong        case STORE_META_DATA_IN_BUFFERS:
625e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong        {
626e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong            CHECK_INTERFACE(IOMX, data, reply);
627e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong
628e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong            node_id node = (void*)data.readIntPtr();
629e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong            OMX_U32 port_index = data.readInt32();
630e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong            OMX_BOOL enable = (OMX_BOOL)data.readInt32();
631e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong
632e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong            status_t err = storeMetaDataInBuffers(node, port_index, enable);
633e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong            reply->writeInt32(err);
634e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong
635e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong            return NO_ERROR;
636e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong        }
637e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong
63820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        case ALLOC_BUFFER:
63920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        {
64020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            CHECK_INTERFACE(IOMX, data, reply);
64120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
642c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber            node_id node = (void*)data.readIntPtr();
64320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            OMX_U32 port_index = data.readInt32();
64420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            size_t size = data.readInt32();
64520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
64620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            buffer_id buffer;
647570a3cb7582daa030cb38eedc5eb6a06f86ecc7fAndreas Huber            void *buffer_data;
648570a3cb7582daa030cb38eedc5eb6a06f86ecc7fAndreas Huber            status_t err = allocateBuffer(
649570a3cb7582daa030cb38eedc5eb6a06f86ecc7fAndreas Huber                    node, port_index, size, &buffer, &buffer_data);
65020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            reply->writeInt32(err);
65120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
65220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            if (err == OK) {
653c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber                reply->writeIntPtr((intptr_t)buffer);
654570a3cb7582daa030cb38eedc5eb6a06f86ecc7fAndreas Huber                reply->writeIntPtr((intptr_t)buffer_data);
65520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            }
65620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
65720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            return NO_ERROR;
65820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        }
65920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
66020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        case ALLOC_BUFFER_WITH_BACKUP:
66120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        {
66220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            CHECK_INTERFACE(IOMX, data, reply);
66320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
664c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber            node_id node = (void*)data.readIntPtr();
66520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            OMX_U32 port_index = data.readInt32();
66620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            sp<IMemory> params =
66720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber                interface_cast<IMemory>(data.readStrongBinder());
66820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
66920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            buffer_id buffer;
670318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber            status_t err = allocateBufferWithBackup(
67120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber                    node, port_index, params, &buffer);
67220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
67320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            reply->writeInt32(err);
67420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
67520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            if (err == OK) {
676c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber                reply->writeIntPtr((intptr_t)buffer);
67720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            }
67820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
67920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            return NO_ERROR;
68020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        }
68120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
68220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        case FREE_BUFFER:
68320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        {
68420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            CHECK_INTERFACE(IOMX, data, reply);
68520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
686c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber            node_id node = (void*)data.readIntPtr();
68720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            OMX_U32 port_index = data.readInt32();
688c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber            buffer_id buffer = (void*)data.readIntPtr();
689318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber            reply->writeInt32(freeBuffer(node, port_index, buffer));
69020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
69120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            return NO_ERROR;
69220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        }
69320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
69420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        case FILL_BUFFER:
69520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        {
69620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            CHECK_INTERFACE(IOMX, data, reply);
69720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
698c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber            node_id node = (void*)data.readIntPtr();
699c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber            buffer_id buffer = (void*)data.readIntPtr();
700318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber            reply->writeInt32(fillBuffer(node, buffer));
70120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
70220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            return NO_ERROR;
70320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        }
70420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
70520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        case EMPTY_BUFFER:
70620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        {
70720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            CHECK_INTERFACE(IOMX, data, reply);
70820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
709c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber            node_id node = (void*)data.readIntPtr();
710c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber            buffer_id buffer = (void*)data.readIntPtr();
71120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            OMX_U32 range_offset = data.readInt32();
71220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            OMX_U32 range_length = data.readInt32();
71320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            OMX_U32 flags = data.readInt32();
71420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            OMX_TICKS timestamp = data.readInt64();
71520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
71636efa039efaae4526791336cb688032d22b34becAndreas Huber            reply->writeInt32(
717318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber                    emptyBuffer(
71836efa039efaae4526791336cb688032d22b34becAndreas Huber                        node, buffer, range_offset, range_length,
71936efa039efaae4526791336cb688032d22b34becAndreas Huber                        flags, timestamp));
72020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
72120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            return NO_ERROR;
72220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        }
72320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
724693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        case GET_EXTENSION_INDEX:
725693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        {
726693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber            CHECK_INTERFACE(IOMX, data, reply);
727693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber
728c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber            node_id node = (void*)data.readIntPtr();
729693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber            const char *parameter_name = data.readCString();
7307eaa9c9385535b651064e02d05a8ffa4b2359281Andreas Huber
731693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber            OMX_INDEXTYPE index;
732318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber            status_t err = getExtensionIndex(node, parameter_name, &index);
733693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber
734693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber            reply->writeInt32(err);
735693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber
736693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber            if (err == OK) {
737693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber                reply->writeInt32(index);
738693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber            }
739693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber
740693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber            return OK;
741693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        }
742693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber
74320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        default:
74420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            return BBinder::onTransact(code, data, reply, flags);
74520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    }
74620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}
74720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
74820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber////////////////////////////////////////////////////////////////////////////////
74920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
75020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberclass BpOMXObserver : public BpInterface<IOMXObserver> {
75120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberpublic:
75220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    BpOMXObserver(const sp<IBinder> &impl)
75320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        : BpInterface<IOMXObserver>(impl) {
75420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    }
75520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
756318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    virtual void onMessage(const omx_message &msg) {
75720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        Parcel data, reply;
75820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        data.writeInterfaceToken(IOMXObserver::getInterfaceDescriptor());
75920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        data.write(&msg, sizeof(msg));
76020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
76120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        remote()->transact(OBSERVER_ON_MSG, data, &reply, IBinder::FLAG_ONEWAY);
76220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    }
76320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber};
76420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
76520111aa043c5f404472bc63b90bc5aad906b1101Andreas HuberIMPLEMENT_META_INTERFACE(OMXObserver, "android.hardware.IOMXObserver");
76620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
76720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberstatus_t BnOMXObserver::onTransact(
76820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    uint32_t code, const Parcel &data, Parcel *reply, uint32_t flags) {
76920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    switch (code) {
77020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        case OBSERVER_ON_MSG:
77120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        {
77220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            CHECK_INTERFACE(IOMXObserver, data, reply);
77320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
77420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            omx_message msg;
77520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            data.read(&msg, sizeof(msg));
77620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
77720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            // XXX Could use readInplace maybe?
778318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber            onMessage(msg);
77920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
78020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            return NO_ERROR;
78120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        }
78220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
78320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        default:
78420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            return BBinder::onTransact(code, data, reply, flags);
78520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    }
78620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}
78720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
78820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}  // namespace android
789