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