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,
437cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden    CREATE_INPUT_SURFACE,
447cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden    SIGNAL_END_OF_INPUT_STREAM,
45e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong    STORE_META_DATA_IN_BUFFERS,
4656ce726019f700a95ce5b45beebceadae4836e30Lajos Molnar    PREPARE_FOR_ADAPTIVE_PLAYBACK,
4720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    ALLOC_BUFFER,
4820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    ALLOC_BUFFER_WITH_BACKUP,
4920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    FREE_BUFFER,
5020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    FILL_BUFFER,
5120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    EMPTY_BUFFER,
52693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber    GET_EXTENSION_INDEX,
5320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    OBSERVER_ON_MSG,
54e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis    GET_GRAPHIC_BUFFER_USAGE,
55e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber    SET_INTERNAL_OPTION,
56d0715867861c216e88a4a7523b6da8a3cb128724Lajos Molnar    UPDATE_GRAPHIC_BUFFER_IN_META,
575a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad    CONFIGURE_VIDEO_TUNNEL_MODE,
5820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber};
5920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
6020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberclass BpOMX : public BpInterface<IOMX> {
6120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberpublic:
6220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    BpOMX(const sp<IBinder> &impl)
6320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        : BpInterface<IOMX>(impl) {
6420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    }
6520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
66d459b485c61bd3e7fd81c5cd3af8ada27fc3e8d3Andreas Huber    virtual bool livesLocally(node_id node, pid_t pid) {
677eaa9c9385535b651064e02d05a8ffa4b2359281Andreas Huber        Parcel data, reply;
687eaa9c9385535b651064e02d05a8ffa4b2359281Andreas Huber        data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
69609b815a3131d22da38b2f452faa9f89daad4039Andy Hung        data.writeInt32((int32_t)node);
707eaa9c9385535b651064e02d05a8ffa4b2359281Andreas Huber        data.writeInt32(pid);
717eaa9c9385535b651064e02d05a8ffa4b2359281Andreas Huber        remote()->transact(LIVES_LOCALLY, data, &reply);
727eaa9c9385535b651064e02d05a8ffa4b2359281Andreas Huber
737eaa9c9385535b651064e02d05a8ffa4b2359281Andreas Huber        return reply.readInt32() != 0;
747eaa9c9385535b651064e02d05a8ffa4b2359281Andreas Huber    }
757eaa9c9385535b651064e02d05a8ffa4b2359281Andreas Huber
76134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber    virtual status_t listNodes(List<ComponentInfo> *list) {
7720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        list->clear();
7820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
7920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        Parcel data, reply;
8020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
8120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        remote()->transact(LIST_NODES, data, &reply);
8220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
8320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        int32_t n = reply.readInt32();
8420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        for (int32_t i = 0; i < n; ++i) {
85134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber            list->push_back(ComponentInfo());
86134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber            ComponentInfo &info = *--list->end();
8720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
88134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber            info.mName = reply.readString8();
89134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber            int32_t numRoles = reply.readInt32();
90134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber            for (int32_t j = 0; j < numRoles; ++j) {
91134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber                info.mRoles.push_back(reply.readString8());
92134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber            }
9320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        }
9420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
9520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        return OK;
9620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    }
9720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
98318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    virtual status_t allocateNode(
99318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber            const char *name, const sp<IOMXObserver> &observer, node_id *node) {
10020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        Parcel data, reply;
10120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
10220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        data.writeCString(name);
103318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        data.writeStrongBinder(observer->asBinder());
10420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        remote()->transact(ALLOCATE_NODE, data, &reply);
10520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
10620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        status_t err = reply.readInt32();
10720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        if (err == OK) {
108609b815a3131d22da38b2f452faa9f89daad4039Andy Hung            *node = (node_id)reply.readInt32();
10920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        } else {
11020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            *node = 0;
11120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        }
11220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
11320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        return err;
11420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    }
11520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
116318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    virtual status_t freeNode(node_id node) {
11720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        Parcel data, reply;
11820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
119609b815a3131d22da38b2f452faa9f89daad4039Andy Hung        data.writeInt32((int32_t)node);
12020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        remote()->transact(FREE_NODE, data, &reply);
12120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
12220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        return reply.readInt32();
12320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    }
12420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
125318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    virtual status_t sendCommand(
12620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            node_id node, OMX_COMMANDTYPE cmd, OMX_S32 param) {
12720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        Parcel data, reply;
12820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
129609b815a3131d22da38b2f452faa9f89daad4039Andy Hung        data.writeInt32((int32_t)node);
13020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        data.writeInt32(cmd);
13120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        data.writeInt32(param);
13220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        remote()->transact(SEND_COMMAND, data, &reply);
13320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
13420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        return reply.readInt32();
13520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    }
13620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
137318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    virtual status_t getParameter(
13820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            node_id node, OMX_INDEXTYPE index,
13920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            void *params, size_t size) {
14020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        Parcel data, reply;
14120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
142609b815a3131d22da38b2f452faa9f89daad4039Andy Hung        data.writeInt32((int32_t)node);
14320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        data.writeInt32(index);
144e03dd22716e688faa56467561827d9b1ea0c4214Glenn Kasten        data.writeInt64(size);
14520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        data.write(params, size);
14620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        remote()->transact(GET_PARAMETER, data, &reply);
14720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
14820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        status_t err = reply.readInt32();
14920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        if (err != OK) {
15020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            return err;
15120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        }
15220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
15320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        reply.read(params, size);
15420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
15520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        return OK;
15620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    }
15720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
158318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    virtual status_t setParameter(
15920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            node_id node, OMX_INDEXTYPE index,
16020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            const void *params, size_t size) {
16120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        Parcel data, reply;
16220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
163609b815a3131d22da38b2f452faa9f89daad4039Andy Hung        data.writeInt32((int32_t)node);
16420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        data.writeInt32(index);
165e03dd22716e688faa56467561827d9b1ea0c4214Glenn Kasten        data.writeInt64(size);
16620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        data.write(params, size);
16720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        remote()->transact(SET_PARAMETER, data, &reply);
16820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
16920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        return reply.readInt32();
17020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    }
17120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
172318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    virtual status_t getConfig(
173693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber            node_id node, OMX_INDEXTYPE index,
174693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber            void *params, size_t size) {
175693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        Parcel data, reply;
176693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
177609b815a3131d22da38b2f452faa9f89daad4039Andy Hung        data.writeInt32((int32_t)node);
178693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        data.writeInt32(index);
179e03dd22716e688faa56467561827d9b1ea0c4214Glenn Kasten        data.writeInt64(size);
180693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        data.write(params, size);
181693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        remote()->transact(GET_CONFIG, data, &reply);
182693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber
183693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        status_t err = reply.readInt32();
184693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        if (err != OK) {
185693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber            return err;
186693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        }
187693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber
188693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        reply.read(params, size);
189693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber
190693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        return OK;
191693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber    }
192693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber
193318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    virtual status_t setConfig(
194693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber            node_id node, OMX_INDEXTYPE index,
195693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber            const void *params, size_t size) {
196693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        Parcel data, reply;
197693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
198609b815a3131d22da38b2f452faa9f89daad4039Andy Hung        data.writeInt32((int32_t)node);
199693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        data.writeInt32(index);
200e03dd22716e688faa56467561827d9b1ea0c4214Glenn Kasten        data.writeInt64(size);
201693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        data.write(params, size);
202693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        remote()->transact(SET_CONFIG, data, &reply);
203693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber
204693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        return reply.readInt32();
205693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber    }
206693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber
207b1d666f5cb555d135eb69e005e88a03330bbb54cJamie Gennis    virtual status_t getState(
208b1d666f5cb555d135eb69e005e88a03330bbb54cJamie Gennis            node_id node, OMX_STATETYPE* state) {
209b1d666f5cb555d135eb69e005e88a03330bbb54cJamie Gennis        Parcel data, reply;
210b1d666f5cb555d135eb69e005e88a03330bbb54cJamie Gennis        data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
211609b815a3131d22da38b2f452faa9f89daad4039Andy Hung        data.writeInt32((int32_t)node);
212b1d666f5cb555d135eb69e005e88a03330bbb54cJamie Gennis        remote()->transact(GET_STATE, data, &reply);
213b1d666f5cb555d135eb69e005e88a03330bbb54cJamie Gennis
214b1d666f5cb555d135eb69e005e88a03330bbb54cJamie Gennis        *state = static_cast<OMX_STATETYPE>(reply.readInt32());
215b1d666f5cb555d135eb69e005e88a03330bbb54cJamie Gennis        return reply.readInt32();
216b1d666f5cb555d135eb69e005e88a03330bbb54cJamie Gennis    }
217b1d666f5cb555d135eb69e005e88a03330bbb54cJamie Gennis
21883750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis    virtual status_t enableGraphicBuffers(
21983750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis            node_id node, OMX_U32 port_index, OMX_BOOL enable) {
22083750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis        Parcel data, reply;
22183750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis        data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
222609b815a3131d22da38b2f452faa9f89daad4039Andy Hung        data.writeInt32((int32_t)node);
22383750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis        data.writeInt32(port_index);
22483750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis        data.writeInt32((uint32_t)enable);
22583750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis        remote()->transact(ENABLE_GRAPHIC_BUFFERS, data, &reply);
22683750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis
22783750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis        status_t err = reply.readInt32();
22883750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis        return err;
22983750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis    }
23083750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis
231e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis    virtual status_t getGraphicBufferUsage(
232e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis            node_id node, OMX_U32 port_index, OMX_U32* usage) {
233e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis        Parcel data, reply;
234e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis        data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
235609b815a3131d22da38b2f452faa9f89daad4039Andy Hung        data.writeInt32((int32_t)node);
236e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis        data.writeInt32(port_index);
237e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis        remote()->transact(GET_GRAPHIC_BUFFER_USAGE, data, &reply);
238e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis
239e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis        status_t err = reply.readInt32();
240e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis        *usage = reply.readInt32();
241e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis        return err;
242e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis    }
243e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis
244318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    virtual status_t useBuffer(
24520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            node_id node, OMX_U32 port_index, const sp<IMemory> &params,
24620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            buffer_id *buffer) {
24720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        Parcel data, reply;
24820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
249609b815a3131d22da38b2f452faa9f89daad4039Andy Hung        data.writeInt32((int32_t)node);
25020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        data.writeInt32(port_index);
25120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        data.writeStrongBinder(params->asBinder());
25220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        remote()->transact(USE_BUFFER, data, &reply);
25320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
25420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        status_t err = reply.readInt32();
25520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        if (err != OK) {
25620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            *buffer = 0;
25720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
25820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            return err;
25920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        }
26020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
261609b815a3131d22da38b2f452faa9f89daad4039Andy Hung        *buffer = (buffer_id)reply.readInt32();
26220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
26320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        return err;
26420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    }
26520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
26683750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis
26783750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis    virtual status_t useGraphicBuffer(
26883750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis            node_id node, OMX_U32 port_index,
26983750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis            const sp<GraphicBuffer> &graphicBuffer, buffer_id *buffer) {
27083750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis        Parcel data, reply;
27183750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis        data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
272609b815a3131d22da38b2f452faa9f89daad4039Andy Hung        data.writeInt32((int32_t)node);
27383750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis        data.writeInt32(port_index);
27483750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis        data.write(*graphicBuffer);
27583750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis        remote()->transact(USE_GRAPHIC_BUFFER, data, &reply);
27683750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis
27783750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis        status_t err = reply.readInt32();
27883750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis        if (err != OK) {
27983750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis            *buffer = 0;
28083750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis
28183750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis            return err;
28283750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis        }
28383750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis
284609b815a3131d22da38b2f452faa9f89daad4039Andy Hung        *buffer = (buffer_id)reply.readInt32();
28583750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis
28683750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis        return err;
28783750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis    }
28883750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis
289d0715867861c216e88a4a7523b6da8a3cb128724Lajos Molnar    virtual status_t updateGraphicBufferInMeta(
290d0715867861c216e88a4a7523b6da8a3cb128724Lajos Molnar            node_id node, OMX_U32 port_index,
291d0715867861c216e88a4a7523b6da8a3cb128724Lajos Molnar            const sp<GraphicBuffer> &graphicBuffer, buffer_id buffer) {
292d0715867861c216e88a4a7523b6da8a3cb128724Lajos Molnar        Parcel data, reply;
293d0715867861c216e88a4a7523b6da8a3cb128724Lajos Molnar        data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
294609b815a3131d22da38b2f452faa9f89daad4039Andy Hung        data.writeInt32((int32_t)node);
295d0715867861c216e88a4a7523b6da8a3cb128724Lajos Molnar        data.writeInt32(port_index);
296d0715867861c216e88a4a7523b6da8a3cb128724Lajos Molnar        data.write(*graphicBuffer);
297609b815a3131d22da38b2f452faa9f89daad4039Andy Hung        data.writeInt32((int32_t)buffer);
298d0715867861c216e88a4a7523b6da8a3cb128724Lajos Molnar        remote()->transact(UPDATE_GRAPHIC_BUFFER_IN_META, data, &reply);
299d0715867861c216e88a4a7523b6da8a3cb128724Lajos Molnar
300d0715867861c216e88a4a7523b6da8a3cb128724Lajos Molnar        status_t err = reply.readInt32();
301d0715867861c216e88a4a7523b6da8a3cb128724Lajos Molnar        return err;
302d0715867861c216e88a4a7523b6da8a3cb128724Lajos Molnar    }
303d0715867861c216e88a4a7523b6da8a3cb128724Lajos Molnar
3047cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden    virtual status_t createInputSurface(
3057cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden            node_id node, OMX_U32 port_index,
3067cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden            sp<IGraphicBufferProducer> *bufferProducer) {
3077cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden        Parcel data, reply;
3087cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden        status_t err;
3097cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden        data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
310609b815a3131d22da38b2f452faa9f89daad4039Andy Hung        data.writeInt32((int32_t)node);
3117cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden        data.writeInt32(port_index);
3127cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden        err = remote()->transact(CREATE_INPUT_SURFACE, data, &reply);
3137cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden        if (err != OK) {
3147cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden            ALOGW("binder transaction failed: %d", err);
3157cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden            return err;
3167cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden        }
3177cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden
3187cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden        err = reply.readInt32();
3197cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden        if (err != OK) {
3207cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden            return err;
3217cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden        }
3227cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden
3237cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden        *bufferProducer = IGraphicBufferProducer::asInterface(
3247cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden                reply.readStrongBinder());
3257cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden
3267cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden        return err;
3277cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden    }
3287cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden
3297cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden    virtual status_t signalEndOfInputStream(node_id node) {
3307cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden        Parcel data, reply;
3317cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden        status_t err;
3327cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden        data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
333609b815a3131d22da38b2f452faa9f89daad4039Andy Hung        data.writeInt32((int32_t)node);
3347cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden        err = remote()->transact(SIGNAL_END_OF_INPUT_STREAM, data, &reply);
3357cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden        if (err != OK) {
3367cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden            ALOGW("binder transaction failed: %d", err);
3377cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden            return err;
3387cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden        }
3397cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden
3407cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden        return reply.readInt32();
3417cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden    }
3427cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden
343e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong    virtual status_t storeMetaDataInBuffers(
344e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong            node_id node, OMX_U32 port_index, OMX_BOOL enable) {
345e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong        Parcel data, reply;
346e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong        data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
347609b815a3131d22da38b2f452faa9f89daad4039Andy Hung        data.writeInt32((int32_t)node);
348e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong        data.writeInt32(port_index);
349e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong        data.writeInt32((uint32_t)enable);
350e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong        remote()->transact(STORE_META_DATA_IN_BUFFERS, data, &reply);
351e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong
352e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong        status_t err = reply.readInt32();
353e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong        return err;
354e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong    }
355e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong
35656ce726019f700a95ce5b45beebceadae4836e30Lajos Molnar    virtual status_t prepareForAdaptivePlayback(
35756ce726019f700a95ce5b45beebceadae4836e30Lajos Molnar            node_id node, OMX_U32 port_index, OMX_BOOL enable,
35856ce726019f700a95ce5b45beebceadae4836e30Lajos Molnar            OMX_U32 max_width, OMX_U32 max_height) {
35956ce726019f700a95ce5b45beebceadae4836e30Lajos Molnar        Parcel data, reply;
36056ce726019f700a95ce5b45beebceadae4836e30Lajos Molnar        data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
361609b815a3131d22da38b2f452faa9f89daad4039Andy Hung        data.writeInt32((int32_t)node);
36256ce726019f700a95ce5b45beebceadae4836e30Lajos Molnar        data.writeInt32(port_index);
36356ce726019f700a95ce5b45beebceadae4836e30Lajos Molnar        data.writeInt32((int32_t)enable);
36456ce726019f700a95ce5b45beebceadae4836e30Lajos Molnar        data.writeInt32(max_width);
36556ce726019f700a95ce5b45beebceadae4836e30Lajos Molnar        data.writeInt32(max_height);
36656ce726019f700a95ce5b45beebceadae4836e30Lajos Molnar        remote()->transact(PREPARE_FOR_ADAPTIVE_PLAYBACK, data, &reply);
36756ce726019f700a95ce5b45beebceadae4836e30Lajos Molnar
36856ce726019f700a95ce5b45beebceadae4836e30Lajos Molnar        status_t err = reply.readInt32();
36956ce726019f700a95ce5b45beebceadae4836e30Lajos Molnar        return err;
37056ce726019f700a95ce5b45beebceadae4836e30Lajos Molnar    }
37156ce726019f700a95ce5b45beebceadae4836e30Lajos Molnar
3725a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad    virtual status_t configureVideoTunnelMode(
3735a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad            node_id node, OMX_U32 portIndex, OMX_BOOL tunneled,
3745a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad            OMX_U32 audioHwSync, native_handle_t **sidebandHandle ) {
3755a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad        Parcel data, reply;
3765a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad        data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
3775a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad        data.writeInt32((int32_t)node);
3785a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad        data.writeInt32(portIndex);
3795a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad        data.writeInt32((int32_t)tunneled);
3805a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad        data.writeInt32(audioHwSync);
3815a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad        remote()->transact(CONFIGURE_VIDEO_TUNNEL_MODE, data, &reply);
3825a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad
3835a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad        status_t err = reply.readInt32();
3845a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad        if (sidebandHandle) {
3855a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad            *sidebandHandle = (native_handle_t *)reply.readNativeHandle();
3865a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad        }
3875a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad        return err;
3885a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad    }
3895a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad
3905a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad
391318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    virtual status_t allocateBuffer(
39220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            node_id node, OMX_U32 port_index, size_t size,
393570a3cb7582daa030cb38eedc5eb6a06f86ecc7fAndreas Huber            buffer_id *buffer, void **buffer_data) {
39420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        Parcel data, reply;
39520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
396609b815a3131d22da38b2f452faa9f89daad4039Andy Hung        data.writeInt32((int32_t)node);
39720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        data.writeInt32(port_index);
398e03dd22716e688faa56467561827d9b1ea0c4214Glenn Kasten        data.writeInt64(size);
39920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        remote()->transact(ALLOC_BUFFER, data, &reply);
40020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
40120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        status_t err = reply.readInt32();
40220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        if (err != OK) {
40320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            *buffer = 0;
40420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
40520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            return err;
40620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        }
40720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
408609b815a3131d22da38b2f452faa9f89daad4039Andy Hung        *buffer = (buffer_id)reply.readInt32();
409609b815a3131d22da38b2f452faa9f89daad4039Andy Hung        *buffer_data = (void *)reply.readInt64();
41020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
41120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        return err;
41220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    }
41320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
414318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    virtual status_t allocateBufferWithBackup(
41520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            node_id node, OMX_U32 port_index, const sp<IMemory> &params,
41620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            buffer_id *buffer) {
41720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        Parcel data, reply;
41820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
419609b815a3131d22da38b2f452faa9f89daad4039Andy Hung        data.writeInt32((int32_t)node);
42020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        data.writeInt32(port_index);
42120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        data.writeStrongBinder(params->asBinder());
42220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        remote()->transact(ALLOC_BUFFER_WITH_BACKUP, data, &reply);
42320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
42420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        status_t err = reply.readInt32();
42520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        if (err != OK) {
42620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            *buffer = 0;
42720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
42820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            return err;
42920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        }
43020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
431609b815a3131d22da38b2f452faa9f89daad4039Andy Hung        *buffer = (buffer_id)reply.readInt32();
43220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
43320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        return err;
43420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    }
43520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
436318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    virtual status_t freeBuffer(
43720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            node_id node, OMX_U32 port_index, buffer_id buffer) {
43820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        Parcel data, reply;
43920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
440609b815a3131d22da38b2f452faa9f89daad4039Andy Hung        data.writeInt32((int32_t)node);
44120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        data.writeInt32(port_index);
442609b815a3131d22da38b2f452faa9f89daad4039Andy Hung        data.writeInt32((int32_t)buffer);
44320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        remote()->transact(FREE_BUFFER, data, &reply);
44420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
44520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        return reply.readInt32();
44620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    }
44720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
448318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    virtual status_t fillBuffer(node_id node, buffer_id buffer) {
44920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        Parcel data, reply;
45020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
451609b815a3131d22da38b2f452faa9f89daad4039Andy Hung        data.writeInt32((int32_t)node);
452609b815a3131d22da38b2f452faa9f89daad4039Andy Hung        data.writeInt32((int32_t)buffer);
45336efa039efaae4526791336cb688032d22b34becAndreas Huber        remote()->transact(FILL_BUFFER, data, &reply);
45436efa039efaae4526791336cb688032d22b34becAndreas Huber
45536efa039efaae4526791336cb688032d22b34becAndreas Huber        return reply.readInt32();
45620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    }
45720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
458318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    virtual status_t emptyBuffer(
45920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            node_id node,
46020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            buffer_id buffer,
46120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            OMX_U32 range_offset, OMX_U32 range_length,
46220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            OMX_U32 flags, OMX_TICKS timestamp) {
46320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        Parcel data, reply;
46420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
465609b815a3131d22da38b2f452faa9f89daad4039Andy Hung        data.writeInt32((int32_t)node);
466609b815a3131d22da38b2f452faa9f89daad4039Andy Hung        data.writeInt32((int32_t)buffer);
46720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        data.writeInt32(range_offset);
46820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        data.writeInt32(range_length);
46920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        data.writeInt32(flags);
47020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        data.writeInt64(timestamp);
47136efa039efaae4526791336cb688032d22b34becAndreas Huber        remote()->transact(EMPTY_BUFFER, data, &reply);
47236efa039efaae4526791336cb688032d22b34becAndreas Huber
47336efa039efaae4526791336cb688032d22b34becAndreas Huber        return reply.readInt32();
47420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    }
4758b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber
476318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    virtual status_t getExtensionIndex(
477693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber            node_id node,
478693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber            const char *parameter_name,
479693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber            OMX_INDEXTYPE *index) {
480693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        Parcel data, reply;
481693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
482609b815a3131d22da38b2f452faa9f89daad4039Andy Hung        data.writeInt32((int32_t)node);
483693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        data.writeCString(parameter_name);
484693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber
485693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        remote()->transact(GET_EXTENSION_INDEX, data, &reply);
486693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber
487693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        status_t err = reply.readInt32();
488693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        if (err == OK) {
489693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber            *index = static_cast<OMX_INDEXTYPE>(reply.readInt32());
490693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        } else {
491693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber            *index = OMX_IndexComponentStartUnused;
492693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        }
493693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber
494693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        return err;
495693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber    }
496e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber
497e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber    virtual status_t setInternalOption(
498e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber            node_id node,
499e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber            OMX_U32 port_index,
500e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber            InternalOptionType type,
501e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber            const void *optionData,
502e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber            size_t size) {
503e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber        Parcel data, reply;
504e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber        data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
505609b815a3131d22da38b2f452faa9f89daad4039Andy Hung        data.writeInt32((int32_t)node);
506e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber        data.writeInt32(port_index);
507e03dd22716e688faa56467561827d9b1ea0c4214Glenn Kasten        data.writeInt64(size);
508e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber        data.write(optionData, size);
509e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber        data.writeInt32(type);
510e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber        remote()->transact(SET_INTERNAL_OPTION, data, &reply);
511e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber
512e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber        return reply.readInt32();
513e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber    }
51420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber};
51520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
51620111aa043c5f404472bc63b90bc5aad906b1101Andreas HuberIMPLEMENT_META_INTERFACE(OMX, "android.hardware.IOMX");
51720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
51820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber////////////////////////////////////////////////////////////////////////////////
51920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
5207cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden#define CHECK_OMX_INTERFACE(interface, data, reply) \
52120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        do { if (!data.enforceInterface(interface::getInterfaceDescriptor())) { \
5225ff1dd576bb93c45b44088a51544a18fc43ebf58Steve Block            ALOGW("Call incorrectly routed to " #interface); \
52320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            return PERMISSION_DENIED; \
52420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        } } while (0)
52520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
52620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberstatus_t BnOMX::onTransact(
52720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    uint32_t code, const Parcel &data, Parcel *reply, uint32_t flags) {
52820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    switch (code) {
5297eaa9c9385535b651064e02d05a8ffa4b2359281Andreas Huber        case LIVES_LOCALLY:
5307eaa9c9385535b651064e02d05a8ffa4b2359281Andreas Huber        {
5317cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden            CHECK_OMX_INTERFACE(IOMX, data, reply);
532609b815a3131d22da38b2f452faa9f89daad4039Andy Hung            node_id node = (node_id)data.readInt32();
533d459b485c61bd3e7fd81c5cd3af8ada27fc3e8d3Andreas Huber            pid_t pid = (pid_t)data.readInt32();
534d459b485c61bd3e7fd81c5cd3af8ada27fc3e8d3Andreas Huber            reply->writeInt32(livesLocally(node, pid));
5357eaa9c9385535b651064e02d05a8ffa4b2359281Andreas Huber
5367eaa9c9385535b651064e02d05a8ffa4b2359281Andreas Huber            return OK;
5377eaa9c9385535b651064e02d05a8ffa4b2359281Andreas Huber        }
5387eaa9c9385535b651064e02d05a8ffa4b2359281Andreas Huber
53920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        case LIST_NODES:
54020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        {
5417cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden            CHECK_OMX_INTERFACE(IOMX, data, reply);
54220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
543134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber            List<ComponentInfo> list;
544318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber            listNodes(&list);
54520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
54620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            reply->writeInt32(list.size());
547134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber            for (List<ComponentInfo>::iterator it = list.begin();
54820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber                 it != list.end(); ++it) {
549134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber                ComponentInfo &cur = *it;
550134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber
551134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber                reply->writeString8(cur.mName);
552134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber                reply->writeInt32(cur.mRoles.size());
553134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber                for (List<String8>::iterator role_it = cur.mRoles.begin();
554134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber                     role_it != cur.mRoles.end(); ++role_it) {
555134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber                    reply->writeString8(*role_it);
556134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber                }
55720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            }
55820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
55920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            return NO_ERROR;
56020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        }
56120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
56220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        case ALLOCATE_NODE:
56320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        {
5647cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden            CHECK_OMX_INTERFACE(IOMX, data, reply);
56520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
566318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber            const char *name = data.readCString();
567318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
568318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber            sp<IOMXObserver> observer =
569318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber                interface_cast<IOMXObserver>(data.readStrongBinder());
570318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
57120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            node_id node;
572318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
573318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber            status_t err = allocateNode(name, observer, &node);
57420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            reply->writeInt32(err);
57520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            if (err == OK) {
576609b815a3131d22da38b2f452faa9f89daad4039Andy Hung                reply->writeInt32((int32_t)node);
57720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            }
5787eaa9c9385535b651064e02d05a8ffa4b2359281Andreas Huber
57920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            return NO_ERROR;
58020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        }
58120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
58220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        case FREE_NODE:
58320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        {
5847cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden            CHECK_OMX_INTERFACE(IOMX, data, reply);
58520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
586609b815a3131d22da38b2f452faa9f89daad4039Andy Hung            node_id node = (node_id)data.readInt32();
58720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
588318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber            reply->writeInt32(freeNode(node));
5897eaa9c9385535b651064e02d05a8ffa4b2359281Andreas Huber
59020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            return NO_ERROR;
59120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        }
59220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
59320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        case SEND_COMMAND:
59420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        {
5957cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden            CHECK_OMX_INTERFACE(IOMX, data, reply);
59620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
597609b815a3131d22da38b2f452faa9f89daad4039Andy Hung            node_id node = (node_id)data.readInt32();
59820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
59920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            OMX_COMMANDTYPE cmd =
60020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber                static_cast<OMX_COMMANDTYPE>(data.readInt32());
60120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
60220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            OMX_S32 param = data.readInt32();
603318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber            reply->writeInt32(sendCommand(node, cmd, param));
60420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
60520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            return NO_ERROR;
60620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        }
60720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
60820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        case GET_PARAMETER:
60920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        case SET_PARAMETER:
610693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        case GET_CONFIG:
611b391290130f263441334ee4525a5832f0bea2ef0Andreas Huber        case SET_CONFIG:
612e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber        case SET_INTERNAL_OPTION:
613693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        {
6147cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden            CHECK_OMX_INTERFACE(IOMX, data, reply);
615693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber
616609b815a3131d22da38b2f452faa9f89daad4039Andy Hung            node_id node = (node_id)data.readInt32();
617693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber            OMX_INDEXTYPE index = static_cast<OMX_INDEXTYPE>(data.readInt32());
618693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber
619e03dd22716e688faa56467561827d9b1ea0c4214Glenn Kasten            size_t size = data.readInt64();
620693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber
621693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber            void *params = malloc(size);
622693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber            data.read(params, size);
623693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber
624b391290130f263441334ee4525a5832f0bea2ef0Andreas Huber            status_t err;
625b391290130f263441334ee4525a5832f0bea2ef0Andreas Huber            switch (code) {
626b391290130f263441334ee4525a5832f0bea2ef0Andreas Huber                case GET_PARAMETER:
627b391290130f263441334ee4525a5832f0bea2ef0Andreas Huber                    err = getParameter(node, index, params, size);
628b391290130f263441334ee4525a5832f0bea2ef0Andreas Huber                    break;
629b391290130f263441334ee4525a5832f0bea2ef0Andreas Huber                case SET_PARAMETER:
630b391290130f263441334ee4525a5832f0bea2ef0Andreas Huber                    err = setParameter(node, index, params, size);
631b391290130f263441334ee4525a5832f0bea2ef0Andreas Huber                    break;
632b391290130f263441334ee4525a5832f0bea2ef0Andreas Huber                case GET_CONFIG:
633b391290130f263441334ee4525a5832f0bea2ef0Andreas Huber                    err = getConfig(node, index, params, size);
634b391290130f263441334ee4525a5832f0bea2ef0Andreas Huber                    break;
635b391290130f263441334ee4525a5832f0bea2ef0Andreas Huber                case SET_CONFIG:
636b391290130f263441334ee4525a5832f0bea2ef0Andreas Huber                    err = setConfig(node, index, params, size);
637b391290130f263441334ee4525a5832f0bea2ef0Andreas Huber                    break;
638e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber                case SET_INTERNAL_OPTION:
639e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber                {
640e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber                    InternalOptionType type =
641e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber                        (InternalOptionType)data.readInt32();
642e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber
643e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber                    err = setInternalOption(node, index, type, params, size);
644e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber                    break;
645e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber                }
646e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber
647b391290130f263441334ee4525a5832f0bea2ef0Andreas Huber                default:
648b391290130f263441334ee4525a5832f0bea2ef0Andreas Huber                    TRESPASS();
649b391290130f263441334ee4525a5832f0bea2ef0Andreas Huber            }
650693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber
651693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber            reply->writeInt32(err);
652693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber
653b391290130f263441334ee4525a5832f0bea2ef0Andreas Huber            if ((code == GET_PARAMETER || code == GET_CONFIG) && err == OK) {
654693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber                reply->write(params, size);
655693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber            }
656693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber
657693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber            free(params);
658693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber            params = NULL;
659693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber
660693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber            return NO_ERROR;
661693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        }
662693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber
663b1d666f5cb555d135eb69e005e88a03330bbb54cJamie Gennis        case GET_STATE:
664b1d666f5cb555d135eb69e005e88a03330bbb54cJamie Gennis        {
6657cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden            CHECK_OMX_INTERFACE(IOMX, data, reply);
666b1d666f5cb555d135eb69e005e88a03330bbb54cJamie Gennis
667609b815a3131d22da38b2f452faa9f89daad4039Andy Hung            node_id node = (node_id)data.readInt32();
668b1d666f5cb555d135eb69e005e88a03330bbb54cJamie Gennis            OMX_STATETYPE state = OMX_StateInvalid;
669b1d666f5cb555d135eb69e005e88a03330bbb54cJamie Gennis
670b1d666f5cb555d135eb69e005e88a03330bbb54cJamie Gennis            status_t err = getState(node, &state);
671b1d666f5cb555d135eb69e005e88a03330bbb54cJamie Gennis            reply->writeInt32(state);
672b1d666f5cb555d135eb69e005e88a03330bbb54cJamie Gennis            reply->writeInt32(err);
673b1d666f5cb555d135eb69e005e88a03330bbb54cJamie Gennis
674b1d666f5cb555d135eb69e005e88a03330bbb54cJamie Gennis            return NO_ERROR;
675b1d666f5cb555d135eb69e005e88a03330bbb54cJamie Gennis        }
676b1d666f5cb555d135eb69e005e88a03330bbb54cJamie Gennis
67783750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis        case ENABLE_GRAPHIC_BUFFERS:
67883750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis        {
6797cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden            CHECK_OMX_INTERFACE(IOMX, data, reply);
68083750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis
681609b815a3131d22da38b2f452faa9f89daad4039Andy Hung            node_id node = (node_id)data.readInt32();
68283750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis            OMX_U32 port_index = data.readInt32();
68383750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis            OMX_BOOL enable = (OMX_BOOL)data.readInt32();
68483750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis
68583750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis            status_t err = enableGraphicBuffers(node, port_index, enable);
68683750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis            reply->writeInt32(err);
68783750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis
68883750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis            return NO_ERROR;
68983750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis        }
69083750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis
691e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis        case GET_GRAPHIC_BUFFER_USAGE:
692e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis        {
6937cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden            CHECK_OMX_INTERFACE(IOMX, data, reply);
694e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis
695609b815a3131d22da38b2f452faa9f89daad4039Andy Hung            node_id node = (node_id)data.readInt32();
696e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis            OMX_U32 port_index = data.readInt32();
697e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis
698e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis            OMX_U32 usage = 0;
699e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis            status_t err = getGraphicBufferUsage(node, port_index, &usage);
700e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis            reply->writeInt32(err);
701e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis            reply->writeInt32(usage);
702e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis
703e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis            return NO_ERROR;
704e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis        }
705e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis
70620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        case USE_BUFFER:
70720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        {
7087cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden            CHECK_OMX_INTERFACE(IOMX, data, reply);
70920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
710609b815a3131d22da38b2f452faa9f89daad4039Andy Hung            node_id node = (node_id)data.readInt32();
71120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            OMX_U32 port_index = data.readInt32();
71220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            sp<IMemory> params =
71320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber                interface_cast<IMemory>(data.readStrongBinder());
71420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
71520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            buffer_id buffer;
716318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber            status_t err = useBuffer(node, port_index, params, &buffer);
71720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            reply->writeInt32(err);
71820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
71920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            if (err == OK) {
720609b815a3131d22da38b2f452faa9f89daad4039Andy Hung                reply->writeInt32((int32_t)buffer);
72120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            }
72220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
72320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            return NO_ERROR;
72420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        }
72520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
72683750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis        case USE_GRAPHIC_BUFFER:
72783750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis        {
7287cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden            CHECK_OMX_INTERFACE(IOMX, data, reply);
72983750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis
730609b815a3131d22da38b2f452faa9f89daad4039Andy Hung            node_id node = (node_id)data.readInt32();
73183750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis            OMX_U32 port_index = data.readInt32();
73283750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis            sp<GraphicBuffer> graphicBuffer = new GraphicBuffer();
73383750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis            data.read(*graphicBuffer);
73483750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis
73583750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis            buffer_id buffer;
73683750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis            status_t err = useGraphicBuffer(
73783750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis                    node, port_index, graphicBuffer, &buffer);
73883750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis            reply->writeInt32(err);
73983750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis
74083750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis            if (err == OK) {
741609b815a3131d22da38b2f452faa9f89daad4039Andy Hung                reply->writeInt32((int32_t)buffer);
74283750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis            }
74383750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis
74483750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis            return NO_ERROR;
74583750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis        }
74683750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis
747d0715867861c216e88a4a7523b6da8a3cb128724Lajos Molnar        case UPDATE_GRAPHIC_BUFFER_IN_META:
748d0715867861c216e88a4a7523b6da8a3cb128724Lajos Molnar        {
749d0715867861c216e88a4a7523b6da8a3cb128724Lajos Molnar            CHECK_OMX_INTERFACE(IOMX, data, reply);
750d0715867861c216e88a4a7523b6da8a3cb128724Lajos Molnar
751609b815a3131d22da38b2f452faa9f89daad4039Andy Hung            node_id node = (node_id)data.readInt32();
752d0715867861c216e88a4a7523b6da8a3cb128724Lajos Molnar            OMX_U32 port_index = data.readInt32();
753d0715867861c216e88a4a7523b6da8a3cb128724Lajos Molnar            sp<GraphicBuffer> graphicBuffer = new GraphicBuffer();
754d0715867861c216e88a4a7523b6da8a3cb128724Lajos Molnar            data.read(*graphicBuffer);
755609b815a3131d22da38b2f452faa9f89daad4039Andy Hung            buffer_id buffer = (buffer_id)data.readInt32();
756d0715867861c216e88a4a7523b6da8a3cb128724Lajos Molnar
757d0715867861c216e88a4a7523b6da8a3cb128724Lajos Molnar            status_t err = updateGraphicBufferInMeta(
758d0715867861c216e88a4a7523b6da8a3cb128724Lajos Molnar                    node, port_index, graphicBuffer, buffer);
759d0715867861c216e88a4a7523b6da8a3cb128724Lajos Molnar            reply->writeInt32(err);
760d0715867861c216e88a4a7523b6da8a3cb128724Lajos Molnar
761d0715867861c216e88a4a7523b6da8a3cb128724Lajos Molnar            return NO_ERROR;
762d0715867861c216e88a4a7523b6da8a3cb128724Lajos Molnar        }
763d0715867861c216e88a4a7523b6da8a3cb128724Lajos Molnar
7647cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden        case CREATE_INPUT_SURFACE:
7657cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden        {
7667cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden            CHECK_OMX_INTERFACE(IOMX, data, reply);
7677cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden
768609b815a3131d22da38b2f452faa9f89daad4039Andy Hung            node_id node = (node_id)data.readInt32();
7697cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden            OMX_U32 port_index = data.readInt32();
7707cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden
7717cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden            sp<IGraphicBufferProducer> bufferProducer;
7727cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden            status_t err = createInputSurface(node, port_index,
7737cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden                    &bufferProducer);
7747cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden
7757cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden            reply->writeInt32(err);
7767cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden
7777cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden            if (err == OK) {
7787cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden                reply->writeStrongBinder(bufferProducer->asBinder());
7797cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden            }
7807cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden
7817cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden            return NO_ERROR;
7827cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden        }
7837cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden
7847cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden        case SIGNAL_END_OF_INPUT_STREAM:
7857cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden        {
7867cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden            CHECK_OMX_INTERFACE(IOMX, data, reply);
7877cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden
788609b815a3131d22da38b2f452faa9f89daad4039Andy Hung            node_id node = (node_id)data.readInt32();
7897cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden
7907cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden            status_t err = signalEndOfInputStream(node);
7917cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden            reply->writeInt32(err);
7927cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden
7937cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden            return NO_ERROR;
7947cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden        }
7957cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden
796e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong        case STORE_META_DATA_IN_BUFFERS:
797e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong        {
7987cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden            CHECK_OMX_INTERFACE(IOMX, data, reply);
799e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong
800609b815a3131d22da38b2f452faa9f89daad4039Andy Hung            node_id node = (node_id)data.readInt32();
801e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong            OMX_U32 port_index = data.readInt32();
802e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong            OMX_BOOL enable = (OMX_BOOL)data.readInt32();
803e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong
804e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong            status_t err = storeMetaDataInBuffers(node, port_index, enable);
805e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong            reply->writeInt32(err);
806e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong
807e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong            return NO_ERROR;
808e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong        }
809e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong
81056ce726019f700a95ce5b45beebceadae4836e30Lajos Molnar        case PREPARE_FOR_ADAPTIVE_PLAYBACK:
81156ce726019f700a95ce5b45beebceadae4836e30Lajos Molnar        {
81256ce726019f700a95ce5b45beebceadae4836e30Lajos Molnar            CHECK_OMX_INTERFACE(IOMX, data, reply);
81356ce726019f700a95ce5b45beebceadae4836e30Lajos Molnar
814609b815a3131d22da38b2f452faa9f89daad4039Andy Hung            node_id node = (node_id)data.readInt32();
81556ce726019f700a95ce5b45beebceadae4836e30Lajos Molnar            OMX_U32 port_index = data.readInt32();
81656ce726019f700a95ce5b45beebceadae4836e30Lajos Molnar            OMX_BOOL enable = (OMX_BOOL)data.readInt32();
81756ce726019f700a95ce5b45beebceadae4836e30Lajos Molnar            OMX_U32 max_width = data.readInt32();
81856ce726019f700a95ce5b45beebceadae4836e30Lajos Molnar            OMX_U32 max_height = data.readInt32();
81956ce726019f700a95ce5b45beebceadae4836e30Lajos Molnar
82056ce726019f700a95ce5b45beebceadae4836e30Lajos Molnar            status_t err = prepareForAdaptivePlayback(
82156ce726019f700a95ce5b45beebceadae4836e30Lajos Molnar                    node, port_index, enable, max_width, max_height);
82256ce726019f700a95ce5b45beebceadae4836e30Lajos Molnar            reply->writeInt32(err);
82356ce726019f700a95ce5b45beebceadae4836e30Lajos Molnar
82456ce726019f700a95ce5b45beebceadae4836e30Lajos Molnar            return NO_ERROR;
82556ce726019f700a95ce5b45beebceadae4836e30Lajos Molnar        }
82656ce726019f700a95ce5b45beebceadae4836e30Lajos Molnar
8275a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad        case CONFIGURE_VIDEO_TUNNEL_MODE:
8285a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad        {
8295a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad            CHECK_OMX_INTERFACE(IOMX, data, reply);
8305a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad
8315a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad            node_id node = (node_id)data.readInt32();
8325a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad            OMX_U32 port_index = data.readInt32();
8335a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad            OMX_BOOL tunneled = (OMX_BOOL)data.readInt32();
8345a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad            OMX_U32 audio_hw_sync = data.readInt32();
8355a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad
8365a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad            native_handle_t *sideband_handle;
8375a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad            status_t err = configureVideoTunnelMode(
8385a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad                    node, port_index, tunneled, audio_hw_sync, &sideband_handle);
8395a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad            reply->writeInt32(err);
8405a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad            reply->writeNativeHandle(sideband_handle);
8415a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad
8425a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad            return NO_ERROR;
8435a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad        }
8445a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad
84520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        case ALLOC_BUFFER:
84620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        {
8477cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden            CHECK_OMX_INTERFACE(IOMX, data, reply);
84820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
849609b815a3131d22da38b2f452faa9f89daad4039Andy Hung            node_id node = (node_id)data.readInt32();
85020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            OMX_U32 port_index = data.readInt32();
851e03dd22716e688faa56467561827d9b1ea0c4214Glenn Kasten            size_t size = data.readInt64();
85220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
85320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            buffer_id buffer;
854570a3cb7582daa030cb38eedc5eb6a06f86ecc7fAndreas Huber            void *buffer_data;
855570a3cb7582daa030cb38eedc5eb6a06f86ecc7fAndreas Huber            status_t err = allocateBuffer(
856570a3cb7582daa030cb38eedc5eb6a06f86ecc7fAndreas Huber                    node, port_index, size, &buffer, &buffer_data);
85720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            reply->writeInt32(err);
85820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
85920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            if (err == OK) {
860609b815a3131d22da38b2f452faa9f89daad4039Andy Hung                reply->writeInt32((int32_t)buffer);
861609b815a3131d22da38b2f452faa9f89daad4039Andy Hung                reply->writeInt64((uintptr_t)buffer_data);
86220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            }
86320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
86420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            return NO_ERROR;
86520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        }
86620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
86720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        case ALLOC_BUFFER_WITH_BACKUP:
86820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        {
8697cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden            CHECK_OMX_INTERFACE(IOMX, data, reply);
87020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
871609b815a3131d22da38b2f452faa9f89daad4039Andy Hung            node_id node = (node_id)data.readInt32();
87220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            OMX_U32 port_index = data.readInt32();
87320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            sp<IMemory> params =
87420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber                interface_cast<IMemory>(data.readStrongBinder());
87520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
87620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            buffer_id buffer;
877318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber            status_t err = allocateBufferWithBackup(
87820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber                    node, port_index, params, &buffer);
87920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
88020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            reply->writeInt32(err);
88120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
88220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            if (err == OK) {
883609b815a3131d22da38b2f452faa9f89daad4039Andy Hung                reply->writeInt32((int32_t)buffer);
88420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            }
88520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
88620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            return NO_ERROR;
88720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        }
88820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
88920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        case FREE_BUFFER:
89020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        {
8917cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden            CHECK_OMX_INTERFACE(IOMX, data, reply);
89220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
893609b815a3131d22da38b2f452faa9f89daad4039Andy Hung            node_id node = (node_id)data.readInt32();
89420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            OMX_U32 port_index = data.readInt32();
895609b815a3131d22da38b2f452faa9f89daad4039Andy Hung            buffer_id buffer = (buffer_id)data.readInt32();
896318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber            reply->writeInt32(freeBuffer(node, port_index, buffer));
89720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
89820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            return NO_ERROR;
89920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        }
90020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
90120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        case FILL_BUFFER:
90220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        {
9037cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden            CHECK_OMX_INTERFACE(IOMX, data, reply);
90420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
905609b815a3131d22da38b2f452faa9f89daad4039Andy Hung            node_id node = (node_id)data.readInt32();
906609b815a3131d22da38b2f452faa9f89daad4039Andy Hung            buffer_id buffer = (buffer_id)data.readInt32();
907318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber            reply->writeInt32(fillBuffer(node, buffer));
90820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
90920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            return NO_ERROR;
91020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        }
91120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
91220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        case EMPTY_BUFFER:
91320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        {
9147cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden            CHECK_OMX_INTERFACE(IOMX, data, reply);
91520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
916609b815a3131d22da38b2f452faa9f89daad4039Andy Hung            node_id node = (node_id)data.readInt32();
917609b815a3131d22da38b2f452faa9f89daad4039Andy Hung            buffer_id buffer = (buffer_id)data.readInt32();
91820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            OMX_U32 range_offset = data.readInt32();
91920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            OMX_U32 range_length = data.readInt32();
92020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            OMX_U32 flags = data.readInt32();
92120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            OMX_TICKS timestamp = data.readInt64();
92220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
92336efa039efaae4526791336cb688032d22b34becAndreas Huber            reply->writeInt32(
924318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber                    emptyBuffer(
92536efa039efaae4526791336cb688032d22b34becAndreas Huber                        node, buffer, range_offset, range_length,
92636efa039efaae4526791336cb688032d22b34becAndreas Huber                        flags, timestamp));
92720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
92820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            return NO_ERROR;
92920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        }
93020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
931693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        case GET_EXTENSION_INDEX:
932693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        {
9337cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden            CHECK_OMX_INTERFACE(IOMX, data, reply);
934693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber
935609b815a3131d22da38b2f452faa9f89daad4039Andy Hung            node_id node = (node_id)data.readInt32();
936693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber            const char *parameter_name = data.readCString();
9377eaa9c9385535b651064e02d05a8ffa4b2359281Andreas Huber
938693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber            OMX_INDEXTYPE index;
939318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber            status_t err = getExtensionIndex(node, parameter_name, &index);
940693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber
941693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber            reply->writeInt32(err);
942693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber
943693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber            if (err == OK) {
944693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber                reply->writeInt32(index);
945693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber            }
946693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber
947693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber            return OK;
948693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        }
949693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber
95020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        default:
95120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            return BBinder::onTransact(code, data, reply, flags);
95220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    }
95320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}
95420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
95520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber////////////////////////////////////////////////////////////////////////////////
95620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
95720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberclass BpOMXObserver : public BpInterface<IOMXObserver> {
95820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberpublic:
95920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    BpOMXObserver(const sp<IBinder> &impl)
96020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        : BpInterface<IOMXObserver>(impl) {
96120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    }
96220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
963318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    virtual void onMessage(const omx_message &msg) {
96420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        Parcel data, reply;
96520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        data.writeInterfaceToken(IOMXObserver::getInterfaceDescriptor());
96620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        data.write(&msg, sizeof(msg));
96720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
968609b815a3131d22da38b2f452faa9f89daad4039Andy Hung        ALOGV("onMessage writing message %d, size %zu", msg.type, sizeof(msg));
969609b815a3131d22da38b2f452faa9f89daad4039Andy Hung
97020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        remote()->transact(OBSERVER_ON_MSG, data, &reply, IBinder::FLAG_ONEWAY);
97120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    }
97220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber};
97320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
97420111aa043c5f404472bc63b90bc5aad906b1101Andreas HuberIMPLEMENT_META_INTERFACE(OMXObserver, "android.hardware.IOMXObserver");
97520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
97620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberstatus_t BnOMXObserver::onTransact(
97720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    uint32_t code, const Parcel &data, Parcel *reply, uint32_t flags) {
97820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    switch (code) {
97920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        case OBSERVER_ON_MSG:
98020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        {
9817cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden            CHECK_OMX_INTERFACE(IOMXObserver, data, reply);
98220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
98320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            omx_message msg;
98420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            data.read(&msg, sizeof(msg));
98520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
986609b815a3131d22da38b2f452faa9f89daad4039Andy Hung            ALOGV("onTransact reading message %d, size %zu", msg.type, sizeof(msg));
987609b815a3131d22da38b2f452faa9f89daad4039Andy Hung
98820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            // XXX Could use readInplace maybe?
989318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber            onMessage(msg);
99020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
99120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            return NO_ERROR;
99220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        }
99320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
99420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        default:
99520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            return BBinder::onTransact(code, data, reply, flags);
99620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    }
99720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}
99820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
99920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}  // namespace android
1000