IOMX.cpp revision d459b485c61bd3e7fd81c5cd3af8ada27fc3e8d3
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>
253cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian#include <surfaceflinger/ISurface.h>
263cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian#include <surfaceflinger/Surface.h>
2720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
2820111aa043c5f404472bc63b90bc5aad906b1101Andreas Hubernamespace android {
2920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
3020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberenum {
3120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    CONNECT = IBinder::FIRST_CALL_TRANSACTION,
327eaa9c9385535b651064e02d05a8ffa4b2359281Andreas Huber    LIVES_LOCALLY,
3320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    LIST_NODES,
3420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    ALLOCATE_NODE,
3520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    FREE_NODE,
3620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    SEND_COMMAND,
3720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    GET_PARAMETER,
3820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    SET_PARAMETER,
39693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber    GET_CONFIG,
40693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber    SET_CONFIG,
41b1d666f5cb555d135eb69e005e88a03330bbb54cJamie Gennis    GET_STATE,
4283750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis    ENABLE_GRAPHIC_BUFFERS,
4320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    USE_BUFFER,
4483750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis    USE_GRAPHIC_BUFFER,
45e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong    STORE_META_DATA_IN_BUFFERS,
4620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    ALLOC_BUFFER,
4720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    ALLOC_BUFFER_WITH_BACKUP,
4820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    FREE_BUFFER,
4920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    FILL_BUFFER,
5020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    EMPTY_BUFFER,
51693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber    GET_EXTENSION_INDEX,
5220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    OBSERVER_ON_MSG,
53e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis    GET_GRAPHIC_BUFFER_USAGE,
5420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber};
5520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
5620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberclass BpOMX : public BpInterface<IOMX> {
5720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberpublic:
5820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    BpOMX(const sp<IBinder> &impl)
5920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        : BpInterface<IOMX>(impl) {
6020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    }
6120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
62d459b485c61bd3e7fd81c5cd3af8ada27fc3e8d3Andreas Huber    virtual bool livesLocally(node_id node, pid_t pid) {
637eaa9c9385535b651064e02d05a8ffa4b2359281Andreas Huber        Parcel data, reply;
647eaa9c9385535b651064e02d05a8ffa4b2359281Andreas Huber        data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
65d459b485c61bd3e7fd81c5cd3af8ada27fc3e8d3Andreas Huber        data.writeIntPtr((intptr_t)node);
667eaa9c9385535b651064e02d05a8ffa4b2359281Andreas Huber        data.writeInt32(pid);
677eaa9c9385535b651064e02d05a8ffa4b2359281Andreas Huber        remote()->transact(LIVES_LOCALLY, data, &reply);
687eaa9c9385535b651064e02d05a8ffa4b2359281Andreas Huber
697eaa9c9385535b651064e02d05a8ffa4b2359281Andreas Huber        return reply.readInt32() != 0;
707eaa9c9385535b651064e02d05a8ffa4b2359281Andreas Huber    }
717eaa9c9385535b651064e02d05a8ffa4b2359281Andreas Huber
72134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber    virtual status_t listNodes(List<ComponentInfo> *list) {
7320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        list->clear();
7420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
7520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        Parcel data, reply;
7620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
7720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        remote()->transact(LIST_NODES, data, &reply);
7820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
7920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        int32_t n = reply.readInt32();
8020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        for (int32_t i = 0; i < n; ++i) {
81134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber            list->push_back(ComponentInfo());
82134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber            ComponentInfo &info = *--list->end();
8320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
84134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber            info.mName = reply.readString8();
85134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber            int32_t numRoles = reply.readInt32();
86134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber            for (int32_t j = 0; j < numRoles; ++j) {
87134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber                info.mRoles.push_back(reply.readString8());
88134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber            }
8920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        }
9020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
9120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        return OK;
9220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    }
9320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
94318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    virtual status_t allocateNode(
95318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber            const char *name, const sp<IOMXObserver> &observer, node_id *node) {
9620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        Parcel data, reply;
9720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
9820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        data.writeCString(name);
99318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        data.writeStrongBinder(observer->asBinder());
10020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        remote()->transact(ALLOCATE_NODE, data, &reply);
10120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
10220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        status_t err = reply.readInt32();
10320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        if (err == OK) {
104c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber            *node = (void*)reply.readIntPtr();
10520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        } else {
10620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            *node = 0;
10720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        }
10820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
10920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        return err;
11020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    }
11120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
112318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    virtual status_t freeNode(node_id node) {
11320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        Parcel data, reply;
11420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
115c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber        data.writeIntPtr((intptr_t)node);
11620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        remote()->transact(FREE_NODE, data, &reply);
11720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
11820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        return reply.readInt32();
11920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    }
12020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
121318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    virtual status_t sendCommand(
12220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            node_id node, OMX_COMMANDTYPE cmd, OMX_S32 param) {
12320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        Parcel data, reply;
12420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
125c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber        data.writeIntPtr((intptr_t)node);
12620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        data.writeInt32(cmd);
12720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        data.writeInt32(param);
12820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        remote()->transact(SEND_COMMAND, data, &reply);
12920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
13020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        return reply.readInt32();
13120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    }
13220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
133318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    virtual status_t getParameter(
13420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            node_id node, OMX_INDEXTYPE index,
13520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            void *params, size_t size) {
13620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        Parcel data, reply;
13720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
138c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber        data.writeIntPtr((intptr_t)node);
13920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        data.writeInt32(index);
14020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        data.writeInt32(size);
14120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        data.write(params, size);
14220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        remote()->transact(GET_PARAMETER, data, &reply);
14320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
14420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        status_t err = reply.readInt32();
14520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        if (err != OK) {
14620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            return err;
14720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        }
14820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
14920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        reply.read(params, size);
15020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
15120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        return OK;
15220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    }
15320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
154318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    virtual status_t setParameter(
15520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            node_id node, OMX_INDEXTYPE index,
15620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            const void *params, size_t size) {
15720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        Parcel data, reply;
15820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
159c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber        data.writeIntPtr((intptr_t)node);
16020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        data.writeInt32(index);
16120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        data.writeInt32(size);
16220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        data.write(params, size);
16320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        remote()->transact(SET_PARAMETER, data, &reply);
16420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
16520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        return reply.readInt32();
16620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    }
16720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
168318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    virtual status_t getConfig(
169693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber            node_id node, OMX_INDEXTYPE index,
170693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber            void *params, size_t size) {
171693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        Parcel data, reply;
172693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
173c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber        data.writeIntPtr((intptr_t)node);
174693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        data.writeInt32(index);
175693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        data.writeInt32(size);
176693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        data.write(params, size);
177693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        remote()->transact(GET_CONFIG, data, &reply);
178693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber
179693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        status_t err = reply.readInt32();
180693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        if (err != OK) {
181693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber            return err;
182693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        }
183693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber
184693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        reply.read(params, size);
185693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber
186693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        return OK;
187693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber    }
188693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber
189318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    virtual status_t setConfig(
190693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber            node_id node, OMX_INDEXTYPE index,
191693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber            const void *params, size_t size) {
192693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        Parcel data, reply;
193693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
194c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber        data.writeIntPtr((intptr_t)node);
195693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        data.writeInt32(index);
196693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        data.writeInt32(size);
197693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        data.write(params, size);
198693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        remote()->transact(SET_CONFIG, data, &reply);
199693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber
200693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        return reply.readInt32();
201693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber    }
202693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber
203b1d666f5cb555d135eb69e005e88a03330bbb54cJamie Gennis    virtual status_t getState(
204b1d666f5cb555d135eb69e005e88a03330bbb54cJamie Gennis            node_id node, OMX_STATETYPE* state) {
205b1d666f5cb555d135eb69e005e88a03330bbb54cJamie Gennis        Parcel data, reply;
206b1d666f5cb555d135eb69e005e88a03330bbb54cJamie Gennis        data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
207b1d666f5cb555d135eb69e005e88a03330bbb54cJamie Gennis        data.writeIntPtr((intptr_t)node);
208b1d666f5cb555d135eb69e005e88a03330bbb54cJamie Gennis        remote()->transact(GET_STATE, data, &reply);
209b1d666f5cb555d135eb69e005e88a03330bbb54cJamie Gennis
210b1d666f5cb555d135eb69e005e88a03330bbb54cJamie Gennis        *state = static_cast<OMX_STATETYPE>(reply.readInt32());
211b1d666f5cb555d135eb69e005e88a03330bbb54cJamie Gennis        return reply.readInt32();
212b1d666f5cb555d135eb69e005e88a03330bbb54cJamie Gennis    }
213b1d666f5cb555d135eb69e005e88a03330bbb54cJamie Gennis
21483750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis    virtual status_t enableGraphicBuffers(
21583750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis            node_id node, OMX_U32 port_index, OMX_BOOL enable) {
21683750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis        Parcel data, reply;
21783750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis        data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
21883750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis        data.writeIntPtr((intptr_t)node);
21983750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis        data.writeInt32(port_index);
22083750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis        data.writeInt32((uint32_t)enable);
22183750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis        remote()->transact(ENABLE_GRAPHIC_BUFFERS, data, &reply);
22283750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis
22383750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis        status_t err = reply.readInt32();
22483750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis        return err;
22583750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis    }
22683750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis
227e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis    virtual status_t getGraphicBufferUsage(
228e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis            node_id node, OMX_U32 port_index, OMX_U32* usage) {
229e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis        Parcel data, reply;
230e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis        data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
231e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis        data.writeIntPtr((intptr_t)node);
232e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis        data.writeInt32(port_index);
233e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis        remote()->transact(GET_GRAPHIC_BUFFER_USAGE, data, &reply);
234e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis
235e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis        status_t err = reply.readInt32();
236e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis        *usage = reply.readInt32();
237e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis        return err;
238e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis    }
239e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis
240318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    virtual status_t useBuffer(
24120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            node_id node, OMX_U32 port_index, const sp<IMemory> &params,
24220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            buffer_id *buffer) {
24320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        Parcel data, reply;
24420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
245c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber        data.writeIntPtr((intptr_t)node);
24620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        data.writeInt32(port_index);
24720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        data.writeStrongBinder(params->asBinder());
24820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        remote()->transact(USE_BUFFER, data, &reply);
24920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
25020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        status_t err = reply.readInt32();
25120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        if (err != OK) {
25220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            *buffer = 0;
25320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
25420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            return err;
25520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        }
25620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
257c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber        *buffer = (void*)reply.readIntPtr();
25820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
25920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        return err;
26020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    }
26120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
26283750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis
26383750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis    virtual status_t useGraphicBuffer(
26483750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis            node_id node, OMX_U32 port_index,
26583750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis            const sp<GraphicBuffer> &graphicBuffer, buffer_id *buffer) {
26683750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis        Parcel data, reply;
26783750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis        data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
26883750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis        data.writeIntPtr((intptr_t)node);
26983750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis        data.writeInt32(port_index);
27083750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis        data.write(*graphicBuffer);
27183750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis        remote()->transact(USE_GRAPHIC_BUFFER, data, &reply);
27283750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis
27383750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis        status_t err = reply.readInt32();
27483750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis        if (err != OK) {
27583750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis            *buffer = 0;
27683750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis
27783750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis            return err;
27883750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis        }
27983750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis
28083750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis        *buffer = (void*)reply.readIntPtr();
28183750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis
28283750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis        return err;
28383750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis    }
28483750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis
285e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong    virtual status_t storeMetaDataInBuffers(
286e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong            node_id node, OMX_U32 port_index, OMX_BOOL enable) {
287e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong        Parcel data, reply;
288e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong        data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
289e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong        data.writeIntPtr((intptr_t)node);
290e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong        data.writeInt32(port_index);
291e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong        data.writeInt32((uint32_t)enable);
292e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong        remote()->transact(STORE_META_DATA_IN_BUFFERS, data, &reply);
293e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong
294e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong        status_t err = reply.readInt32();
295e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong        return err;
296e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong    }
297e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong
298318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    virtual status_t allocateBuffer(
29920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            node_id node, OMX_U32 port_index, size_t size,
300570a3cb7582daa030cb38eedc5eb6a06f86ecc7fAndreas Huber            buffer_id *buffer, void **buffer_data) {
30120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        Parcel data, reply;
30220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
303c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber        data.writeIntPtr((intptr_t)node);
30420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        data.writeInt32(port_index);
30520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        data.writeInt32(size);
30620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        remote()->transact(ALLOC_BUFFER, data, &reply);
30720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
30820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        status_t err = reply.readInt32();
30920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        if (err != OK) {
31020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            *buffer = 0;
31120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
31220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            return err;
31320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        }
31420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
315570a3cb7582daa030cb38eedc5eb6a06f86ecc7fAndreas Huber        *buffer = (void *)reply.readIntPtr();
316570a3cb7582daa030cb38eedc5eb6a06f86ecc7fAndreas Huber        *buffer_data = (void *)reply.readIntPtr();
31720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
31820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        return err;
31920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    }
32020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
321318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    virtual status_t allocateBufferWithBackup(
32220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            node_id node, OMX_U32 port_index, const sp<IMemory> &params,
32320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            buffer_id *buffer) {
32420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        Parcel data, reply;
32520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
326c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber        data.writeIntPtr((intptr_t)node);
32720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        data.writeInt32(port_index);
32820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        data.writeStrongBinder(params->asBinder());
32920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        remote()->transact(ALLOC_BUFFER_WITH_BACKUP, data, &reply);
33020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
33120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        status_t err = reply.readInt32();
33220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        if (err != OK) {
33320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            *buffer = 0;
33420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
33520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            return err;
33620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        }
33720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
338c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber        *buffer = (void*)reply.readIntPtr();
33920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
34020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        return err;
34120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    }
34220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
343318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    virtual status_t freeBuffer(
34420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            node_id node, OMX_U32 port_index, buffer_id buffer) {
34520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        Parcel data, reply;
34620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
347c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber        data.writeIntPtr((intptr_t)node);
34820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        data.writeInt32(port_index);
349c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber        data.writeIntPtr((intptr_t)buffer);
35020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        remote()->transact(FREE_BUFFER, data, &reply);
35120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
35220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        return reply.readInt32();
35320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    }
35420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
355318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    virtual status_t fillBuffer(node_id node, buffer_id buffer) {
35620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        Parcel data, reply;
35720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
358c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber        data.writeIntPtr((intptr_t)node);
359c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber        data.writeIntPtr((intptr_t)buffer);
36036efa039efaae4526791336cb688032d22b34becAndreas Huber        remote()->transact(FILL_BUFFER, data, &reply);
36136efa039efaae4526791336cb688032d22b34becAndreas Huber
36236efa039efaae4526791336cb688032d22b34becAndreas Huber        return reply.readInt32();
36320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    }
36420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
365318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    virtual status_t emptyBuffer(
36620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            node_id node,
36720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            buffer_id buffer,
36820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            OMX_U32 range_offset, OMX_U32 range_length,
36920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            OMX_U32 flags, OMX_TICKS timestamp) {
37020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        Parcel data, reply;
37120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
372c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber        data.writeIntPtr((intptr_t)node);
373c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber        data.writeIntPtr((intptr_t)buffer);
37420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        data.writeInt32(range_offset);
37520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        data.writeInt32(range_length);
37620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        data.writeInt32(flags);
37720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        data.writeInt64(timestamp);
37836efa039efaae4526791336cb688032d22b34becAndreas Huber        remote()->transact(EMPTY_BUFFER, data, &reply);
37936efa039efaae4526791336cb688032d22b34becAndreas Huber
38036efa039efaae4526791336cb688032d22b34becAndreas Huber        return reply.readInt32();
38120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    }
3828b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber
383318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    virtual status_t getExtensionIndex(
384693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber            node_id node,
385693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber            const char *parameter_name,
386693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber            OMX_INDEXTYPE *index) {
387693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        Parcel data, reply;
388693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
389c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber        data.writeIntPtr((intptr_t)node);
390693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        data.writeCString(parameter_name);
391693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber
392693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        remote()->transact(GET_EXTENSION_INDEX, data, &reply);
393693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber
394693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        status_t err = reply.readInt32();
395693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        if (err == OK) {
396693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber            *index = static_cast<OMX_INDEXTYPE>(reply.readInt32());
397693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        } else {
398693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber            *index = OMX_IndexComponentStartUnused;
399693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        }
400693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber
401693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        return err;
402693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber    }
40320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber};
40420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
40520111aa043c5f404472bc63b90bc5aad906b1101Andreas HuberIMPLEMENT_META_INTERFACE(OMX, "android.hardware.IOMX");
40620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
40720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber////////////////////////////////////////////////////////////////////////////////
40820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
40920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#define CHECK_INTERFACE(interface, data, reply) \
41020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        do { if (!data.enforceInterface(interface::getInterfaceDescriptor())) { \
4115ff1dd576bb93c45b44088a51544a18fc43ebf58Steve Block            ALOGW("Call incorrectly routed to " #interface); \
41220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            return PERMISSION_DENIED; \
41320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        } } while (0)
41420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
41520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberstatus_t BnOMX::onTransact(
41620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    uint32_t code, const Parcel &data, Parcel *reply, uint32_t flags) {
41720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    switch (code) {
4187eaa9c9385535b651064e02d05a8ffa4b2359281Andreas Huber        case LIVES_LOCALLY:
4197eaa9c9385535b651064e02d05a8ffa4b2359281Andreas Huber        {
4207eaa9c9385535b651064e02d05a8ffa4b2359281Andreas Huber            CHECK_INTERFACE(IOMX, data, reply);
421d459b485c61bd3e7fd81c5cd3af8ada27fc3e8d3Andreas Huber            node_id node = (void *)data.readIntPtr();
422d459b485c61bd3e7fd81c5cd3af8ada27fc3e8d3Andreas Huber            pid_t pid = (pid_t)data.readInt32();
423d459b485c61bd3e7fd81c5cd3af8ada27fc3e8d3Andreas Huber            reply->writeInt32(livesLocally(node, pid));
4247eaa9c9385535b651064e02d05a8ffa4b2359281Andreas Huber
4257eaa9c9385535b651064e02d05a8ffa4b2359281Andreas Huber            return OK;
4267eaa9c9385535b651064e02d05a8ffa4b2359281Andreas Huber        }
4277eaa9c9385535b651064e02d05a8ffa4b2359281Andreas Huber
42820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        case LIST_NODES:
42920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        {
43020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            CHECK_INTERFACE(IOMX, data, reply);
43120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
432134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber            List<ComponentInfo> list;
433318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber            listNodes(&list);
43420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
43520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            reply->writeInt32(list.size());
436134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber            for (List<ComponentInfo>::iterator it = list.begin();
43720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber                 it != list.end(); ++it) {
438134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber                ComponentInfo &cur = *it;
439134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber
440134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber                reply->writeString8(cur.mName);
441134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber                reply->writeInt32(cur.mRoles.size());
442134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber                for (List<String8>::iterator role_it = cur.mRoles.begin();
443134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber                     role_it != cur.mRoles.end(); ++role_it) {
444134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber                    reply->writeString8(*role_it);
445134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber                }
44620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            }
44720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
44820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            return NO_ERROR;
44920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        }
45020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
45120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        case ALLOCATE_NODE:
45220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        {
45320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            CHECK_INTERFACE(IOMX, data, reply);
45420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
455318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber            const char *name = data.readCString();
456318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
457318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber            sp<IOMXObserver> observer =
458318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber                interface_cast<IOMXObserver>(data.readStrongBinder());
459318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
46020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            node_id node;
461318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
462318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber            status_t err = allocateNode(name, observer, &node);
46320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            reply->writeInt32(err);
46420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            if (err == OK) {
465c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber                reply->writeIntPtr((intptr_t)node);
46620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            }
4677eaa9c9385535b651064e02d05a8ffa4b2359281Andreas Huber
46820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            return NO_ERROR;
46920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        }
47020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
47120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        case FREE_NODE:
47220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        {
47320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            CHECK_INTERFACE(IOMX, data, reply);
47420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
475c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber            node_id node = (void*)data.readIntPtr();
47620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
477318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber            reply->writeInt32(freeNode(node));
4787eaa9c9385535b651064e02d05a8ffa4b2359281Andreas Huber
47920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            return NO_ERROR;
48020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        }
48120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
48220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        case SEND_COMMAND:
48320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        {
48420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            CHECK_INTERFACE(IOMX, data, reply);
48520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
486c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber            node_id node = (void*)data.readIntPtr();
48720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
48820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            OMX_COMMANDTYPE cmd =
48920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber                static_cast<OMX_COMMANDTYPE>(data.readInt32());
49020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
49120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            OMX_S32 param = data.readInt32();
492318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber            reply->writeInt32(sendCommand(node, cmd, param));
49320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
49420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            return NO_ERROR;
49520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        }
49620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
49720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        case GET_PARAMETER:
49820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        case SET_PARAMETER:
499693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        case GET_CONFIG:
500b391290130f263441334ee4525a5832f0bea2ef0Andreas Huber        case SET_CONFIG:
501693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        {
502693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber            CHECK_INTERFACE(IOMX, data, reply);
503693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber
504c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber            node_id node = (void*)data.readIntPtr();
505693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber            OMX_INDEXTYPE index = static_cast<OMX_INDEXTYPE>(data.readInt32());
506693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber
507693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber            size_t size = data.readInt32();
508693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber
509693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber            void *params = malloc(size);
510693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber            data.read(params, size);
511693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber
512b391290130f263441334ee4525a5832f0bea2ef0Andreas Huber            status_t err;
513b391290130f263441334ee4525a5832f0bea2ef0Andreas Huber            switch (code) {
514b391290130f263441334ee4525a5832f0bea2ef0Andreas Huber                case GET_PARAMETER:
515b391290130f263441334ee4525a5832f0bea2ef0Andreas Huber                    err = getParameter(node, index, params, size);
516b391290130f263441334ee4525a5832f0bea2ef0Andreas Huber                    break;
517b391290130f263441334ee4525a5832f0bea2ef0Andreas Huber                case SET_PARAMETER:
518b391290130f263441334ee4525a5832f0bea2ef0Andreas Huber                    err = setParameter(node, index, params, size);
519b391290130f263441334ee4525a5832f0bea2ef0Andreas Huber                    break;
520b391290130f263441334ee4525a5832f0bea2ef0Andreas Huber                case GET_CONFIG:
521b391290130f263441334ee4525a5832f0bea2ef0Andreas Huber                    err = getConfig(node, index, params, size);
522b391290130f263441334ee4525a5832f0bea2ef0Andreas Huber                    break;
523b391290130f263441334ee4525a5832f0bea2ef0Andreas Huber                case SET_CONFIG:
524b391290130f263441334ee4525a5832f0bea2ef0Andreas Huber                    err = setConfig(node, index, params, size);
525b391290130f263441334ee4525a5832f0bea2ef0Andreas Huber                    break;
526b391290130f263441334ee4525a5832f0bea2ef0Andreas Huber                default:
527b391290130f263441334ee4525a5832f0bea2ef0Andreas Huber                    TRESPASS();
528b391290130f263441334ee4525a5832f0bea2ef0Andreas Huber            }
529693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber
530693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber            reply->writeInt32(err);
531693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber
532b391290130f263441334ee4525a5832f0bea2ef0Andreas Huber            if ((code == GET_PARAMETER || code == GET_CONFIG) && err == OK) {
533693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber                reply->write(params, size);
534693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber            }
535693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber
536693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber            free(params);
537693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber            params = NULL;
538693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber
539693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber            return NO_ERROR;
540693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        }
541693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber
542b1d666f5cb555d135eb69e005e88a03330bbb54cJamie Gennis        case GET_STATE:
543b1d666f5cb555d135eb69e005e88a03330bbb54cJamie Gennis        {
544b1d666f5cb555d135eb69e005e88a03330bbb54cJamie Gennis            CHECK_INTERFACE(IOMX, data, reply);
545b1d666f5cb555d135eb69e005e88a03330bbb54cJamie Gennis
546b1d666f5cb555d135eb69e005e88a03330bbb54cJamie Gennis            node_id node = (void*)data.readIntPtr();
547b1d666f5cb555d135eb69e005e88a03330bbb54cJamie Gennis            OMX_STATETYPE state = OMX_StateInvalid;
548b1d666f5cb555d135eb69e005e88a03330bbb54cJamie Gennis
549b1d666f5cb555d135eb69e005e88a03330bbb54cJamie Gennis            status_t err = getState(node, &state);
550b1d666f5cb555d135eb69e005e88a03330bbb54cJamie Gennis            reply->writeInt32(state);
551b1d666f5cb555d135eb69e005e88a03330bbb54cJamie Gennis            reply->writeInt32(err);
552b1d666f5cb555d135eb69e005e88a03330bbb54cJamie Gennis
553b1d666f5cb555d135eb69e005e88a03330bbb54cJamie Gennis            return NO_ERROR;
554b1d666f5cb555d135eb69e005e88a03330bbb54cJamie Gennis        }
555b1d666f5cb555d135eb69e005e88a03330bbb54cJamie Gennis
55683750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis        case ENABLE_GRAPHIC_BUFFERS:
55783750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis        {
55883750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis            CHECK_INTERFACE(IOMX, data, reply);
55983750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis
56083750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis            node_id node = (void*)data.readIntPtr();
56183750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis            OMX_U32 port_index = data.readInt32();
56283750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis            OMX_BOOL enable = (OMX_BOOL)data.readInt32();
56383750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis
56483750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis            status_t err = enableGraphicBuffers(node, port_index, enable);
56583750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis            reply->writeInt32(err);
56683750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis
56783750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis            return NO_ERROR;
56883750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis        }
56983750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis
570e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis        case GET_GRAPHIC_BUFFER_USAGE:
571e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis        {
572e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis            CHECK_INTERFACE(IOMX, data, reply);
573e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis
574e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis            node_id node = (void*)data.readIntPtr();
575e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis            OMX_U32 port_index = data.readInt32();
576e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis
577e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis            OMX_U32 usage = 0;
578e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis            status_t err = getGraphicBufferUsage(node, port_index, &usage);
579e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis            reply->writeInt32(err);
580e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis            reply->writeInt32(usage);
581e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis
582e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis            return NO_ERROR;
583e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis        }
584e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis
58520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        case USE_BUFFER:
58620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        {
58720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            CHECK_INTERFACE(IOMX, data, reply);
58820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
589c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber            node_id node = (void*)data.readIntPtr();
59020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            OMX_U32 port_index = data.readInt32();
59120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            sp<IMemory> params =
59220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber                interface_cast<IMemory>(data.readStrongBinder());
59320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
59420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            buffer_id buffer;
595318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber            status_t err = useBuffer(node, port_index, params, &buffer);
59620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            reply->writeInt32(err);
59720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
59820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            if (err == OK) {
599c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber                reply->writeIntPtr((intptr_t)buffer);
60020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            }
60120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
60220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            return NO_ERROR;
60320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        }
60420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
60583750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis        case USE_GRAPHIC_BUFFER:
60683750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis        {
60783750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis            CHECK_INTERFACE(IOMX, data, reply);
60883750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis
60983750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis            node_id node = (void*)data.readIntPtr();
61083750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis            OMX_U32 port_index = data.readInt32();
61183750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis            sp<GraphicBuffer> graphicBuffer = new GraphicBuffer();
61283750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis            data.read(*graphicBuffer);
61383750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis
61483750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis            buffer_id buffer;
61583750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis            status_t err = useGraphicBuffer(
61683750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis                    node, port_index, graphicBuffer, &buffer);
61783750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis            reply->writeInt32(err);
61883750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis
61983750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis            if (err == OK) {
62083750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis                reply->writeIntPtr((intptr_t)buffer);
62183750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis            }
62283750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis
62383750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis            return NO_ERROR;
62483750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis        }
62583750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis
626e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong        case STORE_META_DATA_IN_BUFFERS:
627e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong        {
628e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong            CHECK_INTERFACE(IOMX, data, reply);
629e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong
630e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong            node_id node = (void*)data.readIntPtr();
631e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong            OMX_U32 port_index = data.readInt32();
632e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong            OMX_BOOL enable = (OMX_BOOL)data.readInt32();
633e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong
634e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong            status_t err = storeMetaDataInBuffers(node, port_index, enable);
635e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong            reply->writeInt32(err);
636e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong
637e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong            return NO_ERROR;
638e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong        }
639e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong
64020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        case ALLOC_BUFFER:
64120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        {
64220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            CHECK_INTERFACE(IOMX, data, reply);
64320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
644c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber            node_id node = (void*)data.readIntPtr();
64520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            OMX_U32 port_index = data.readInt32();
64620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            size_t size = data.readInt32();
64720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
64820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            buffer_id buffer;
649570a3cb7582daa030cb38eedc5eb6a06f86ecc7fAndreas Huber            void *buffer_data;
650570a3cb7582daa030cb38eedc5eb6a06f86ecc7fAndreas Huber            status_t err = allocateBuffer(
651570a3cb7582daa030cb38eedc5eb6a06f86ecc7fAndreas Huber                    node, port_index, size, &buffer, &buffer_data);
65220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            reply->writeInt32(err);
65320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
65420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            if (err == OK) {
655c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber                reply->writeIntPtr((intptr_t)buffer);
656570a3cb7582daa030cb38eedc5eb6a06f86ecc7fAndreas Huber                reply->writeIntPtr((intptr_t)buffer_data);
65720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            }
65820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
65920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            return NO_ERROR;
66020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        }
66120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
66220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        case ALLOC_BUFFER_WITH_BACKUP:
66320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        {
66420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            CHECK_INTERFACE(IOMX, data, reply);
66520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
666c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber            node_id node = (void*)data.readIntPtr();
66720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            OMX_U32 port_index = data.readInt32();
66820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            sp<IMemory> params =
66920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber                interface_cast<IMemory>(data.readStrongBinder());
67020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
67120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            buffer_id buffer;
672318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber            status_t err = allocateBufferWithBackup(
67320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber                    node, port_index, params, &buffer);
67420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
67520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            reply->writeInt32(err);
67620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
67720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            if (err == OK) {
678c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber                reply->writeIntPtr((intptr_t)buffer);
67920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            }
68020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
68120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            return NO_ERROR;
68220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        }
68320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
68420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        case FREE_BUFFER:
68520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        {
68620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            CHECK_INTERFACE(IOMX, data, reply);
68720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
688c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber            node_id node = (void*)data.readIntPtr();
68920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            OMX_U32 port_index = data.readInt32();
690c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber            buffer_id buffer = (void*)data.readIntPtr();
691318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber            reply->writeInt32(freeBuffer(node, port_index, buffer));
69220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
69320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            return NO_ERROR;
69420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        }
69520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
69620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        case FILL_BUFFER:
69720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        {
69820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            CHECK_INTERFACE(IOMX, data, reply);
69920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
700c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber            node_id node = (void*)data.readIntPtr();
701c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber            buffer_id buffer = (void*)data.readIntPtr();
702318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber            reply->writeInt32(fillBuffer(node, buffer));
70320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
70420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            return NO_ERROR;
70520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        }
70620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
70720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        case EMPTY_BUFFER:
70820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        {
70920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            CHECK_INTERFACE(IOMX, data, reply);
71020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
711c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber            node_id node = (void*)data.readIntPtr();
712c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber            buffer_id buffer = (void*)data.readIntPtr();
71320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            OMX_U32 range_offset = data.readInt32();
71420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            OMX_U32 range_length = data.readInt32();
71520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            OMX_U32 flags = data.readInt32();
71620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            OMX_TICKS timestamp = data.readInt64();
71720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
71836efa039efaae4526791336cb688032d22b34becAndreas Huber            reply->writeInt32(
719318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber                    emptyBuffer(
72036efa039efaae4526791336cb688032d22b34becAndreas Huber                        node, buffer, range_offset, range_length,
72136efa039efaae4526791336cb688032d22b34becAndreas Huber                        flags, timestamp));
72220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
72320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            return NO_ERROR;
72420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        }
72520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
726693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        case GET_EXTENSION_INDEX:
727693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        {
728693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber            CHECK_INTERFACE(IOMX, data, reply);
729693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber
730c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber            node_id node = (void*)data.readIntPtr();
731693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber            const char *parameter_name = data.readCString();
7327eaa9c9385535b651064e02d05a8ffa4b2359281Andreas Huber
733693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber            OMX_INDEXTYPE index;
734318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber            status_t err = getExtensionIndex(node, parameter_name, &index);
735693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber
736693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber            reply->writeInt32(err);
737693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber
738693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber            if (err == OK) {
739693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber                reply->writeInt32(index);
740693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber            }
741693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber
742693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber            return OK;
743693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        }
744693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber
74520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        default:
74620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            return BBinder::onTransact(code, data, reply, flags);
74720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    }
74820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}
74920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
75020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber////////////////////////////////////////////////////////////////////////////////
75120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
75220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberclass BpOMXObserver : public BpInterface<IOMXObserver> {
75320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberpublic:
75420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    BpOMXObserver(const sp<IBinder> &impl)
75520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        : BpInterface<IOMXObserver>(impl) {
75620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    }
75720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
758318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    virtual void onMessage(const omx_message &msg) {
75920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        Parcel data, reply;
76020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        data.writeInterfaceToken(IOMXObserver::getInterfaceDescriptor());
76120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        data.write(&msg, sizeof(msg));
76220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
76320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        remote()->transact(OBSERVER_ON_MSG, data, &reply, IBinder::FLAG_ONEWAY);
76420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    }
76520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber};
76620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
76720111aa043c5f404472bc63b90bc5aad906b1101Andreas HuberIMPLEMENT_META_INTERFACE(OMXObserver, "android.hardware.IOMXObserver");
76820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
76920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberstatus_t BnOMXObserver::onTransact(
77020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    uint32_t code, const Parcel &data, Parcel *reply, uint32_t flags) {
77120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    switch (code) {
77220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        case OBSERVER_ON_MSG:
77320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        {
77420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            CHECK_INTERFACE(IOMXObserver, data, reply);
77520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
77620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            omx_message msg;
77720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            data.read(&msg, sizeof(msg));
77820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
77920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            // XXX Could use readInplace maybe?
780318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber            onMessage(msg);
78120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
78220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            return NO_ERROR;
78320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        }
78420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
78520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        default:
78620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            return BBinder::onTransact(code, data, reply, flags);
78720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    }
78820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}
78920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
79020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}  // namespace android
791