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> ¶ms, 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> ¶ms, 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