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