IOMX.cpp revision b391290130f263441334ee4525a5832f0bea2ef0
120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber//#define LOG_NDEBUG 0 220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#define LOG_TAG "IOMX" 320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#include <utils/Log.h> 420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#include <binder/IMemory.h> 620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#include <binder/Parcel.h> 720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#include <media/IOMX.h> 8b391290130f263441334ee4525a5832f0bea2ef0Andreas Huber#include <media/stagefright/foundation/ADebug.h> 93cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian#include <surfaceflinger/ISurface.h> 103cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian#include <surfaceflinger/Surface.h> 1120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 1220111aa043c5f404472bc63b90bc5aad906b1101Andreas Hubernamespace android { 1320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 1420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberenum { 1520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber CONNECT = IBinder::FIRST_CALL_TRANSACTION, 167eaa9c9385535b651064e02d05a8ffa4b2359281Andreas Huber LIVES_LOCALLY, 1720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber LIST_NODES, 1820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber ALLOCATE_NODE, 1920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber FREE_NODE, 2020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber SEND_COMMAND, 2120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber GET_PARAMETER, 2220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber SET_PARAMETER, 23693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber GET_CONFIG, 24693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber SET_CONFIG, 2583750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis ENABLE_GRAPHIC_BUFFERS, 2620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber USE_BUFFER, 2783750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis USE_GRAPHIC_BUFFER, 28e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong STORE_META_DATA_IN_BUFFERS, 2920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber ALLOC_BUFFER, 3020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber ALLOC_BUFFER_WITH_BACKUP, 3120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber FREE_BUFFER, 3220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber FILL_BUFFER, 3320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber EMPTY_BUFFER, 34693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber GET_EXTENSION_INDEX, 3520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber OBSERVER_ON_MSG, 3620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}; 3720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 3820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberclass BpOMX : public BpInterface<IOMX> { 3920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberpublic: 4020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber BpOMX(const sp<IBinder> &impl) 4120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber : BpInterface<IOMX>(impl) { 4220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 4320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 447eaa9c9385535b651064e02d05a8ffa4b2359281Andreas Huber virtual bool livesLocally(pid_t pid) { 457eaa9c9385535b651064e02d05a8ffa4b2359281Andreas Huber Parcel data, reply; 467eaa9c9385535b651064e02d05a8ffa4b2359281Andreas Huber data.writeInterfaceToken(IOMX::getInterfaceDescriptor()); 477eaa9c9385535b651064e02d05a8ffa4b2359281Andreas Huber data.writeInt32(pid); 487eaa9c9385535b651064e02d05a8ffa4b2359281Andreas Huber remote()->transact(LIVES_LOCALLY, data, &reply); 497eaa9c9385535b651064e02d05a8ffa4b2359281Andreas Huber 507eaa9c9385535b651064e02d05a8ffa4b2359281Andreas Huber return reply.readInt32() != 0; 517eaa9c9385535b651064e02d05a8ffa4b2359281Andreas Huber } 527eaa9c9385535b651064e02d05a8ffa4b2359281Andreas Huber 53134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber virtual status_t listNodes(List<ComponentInfo> *list) { 5420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber list->clear(); 5520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 5620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber Parcel data, reply; 5720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber data.writeInterfaceToken(IOMX::getInterfaceDescriptor()); 5820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber remote()->transact(LIST_NODES, data, &reply); 5920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 6020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber int32_t n = reply.readInt32(); 6120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber for (int32_t i = 0; i < n; ++i) { 62134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber list->push_back(ComponentInfo()); 63134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber ComponentInfo &info = *--list->end(); 6420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 65134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber info.mName = reply.readString8(); 66134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber int32_t numRoles = reply.readInt32(); 67134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber for (int32_t j = 0; j < numRoles; ++j) { 68134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber info.mRoles.push_back(reply.readString8()); 69134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber } 7020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 7120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 7220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return OK; 7320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 7420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 75318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber virtual status_t allocateNode( 76318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber const char *name, const sp<IOMXObserver> &observer, node_id *node) { 7720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber Parcel data, reply; 7820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber data.writeInterfaceToken(IOMX::getInterfaceDescriptor()); 7920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber data.writeCString(name); 80318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber data.writeStrongBinder(observer->asBinder()); 8120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber remote()->transact(ALLOCATE_NODE, data, &reply); 8220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 8320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber status_t err = reply.readInt32(); 8420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber if (err == OK) { 85c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber *node = (void*)reply.readIntPtr(); 8620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } else { 8720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber *node = 0; 8820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 8920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 9020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return err; 9120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 9220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 93318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber virtual status_t freeNode(node_id node) { 9420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber Parcel data, reply; 9520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber data.writeInterfaceToken(IOMX::getInterfaceDescriptor()); 96c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber data.writeIntPtr((intptr_t)node); 9720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber remote()->transact(FREE_NODE, data, &reply); 9820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 9920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return reply.readInt32(); 10020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 10120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 102318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber virtual status_t sendCommand( 10320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber node_id node, OMX_COMMANDTYPE cmd, OMX_S32 param) { 10420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber Parcel data, reply; 10520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber data.writeInterfaceToken(IOMX::getInterfaceDescriptor()); 106c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber data.writeIntPtr((intptr_t)node); 10720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber data.writeInt32(cmd); 10820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber data.writeInt32(param); 10920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber remote()->transact(SEND_COMMAND, data, &reply); 11020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 11120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return reply.readInt32(); 11220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 11320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 114318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber virtual status_t getParameter( 11520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber node_id node, OMX_INDEXTYPE index, 11620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber void *params, size_t size) { 11720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber Parcel data, reply; 11820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber data.writeInterfaceToken(IOMX::getInterfaceDescriptor()); 119c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber data.writeIntPtr((intptr_t)node); 12020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber data.writeInt32(index); 12120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber data.writeInt32(size); 12220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber data.write(params, size); 12320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber remote()->transact(GET_PARAMETER, data, &reply); 12420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 12520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber status_t err = reply.readInt32(); 12620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber if (err != OK) { 12720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return err; 12820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 12920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 13020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber reply.read(params, size); 13120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 13220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return OK; 13320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 13420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 135318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber virtual status_t setParameter( 13620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber node_id node, OMX_INDEXTYPE index, 13720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber const void *params, size_t size) { 13820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber Parcel data, reply; 13920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber data.writeInterfaceToken(IOMX::getInterfaceDescriptor()); 140c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber data.writeIntPtr((intptr_t)node); 14120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber data.writeInt32(index); 14220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber data.writeInt32(size); 14320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber data.write(params, size); 14420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber remote()->transact(SET_PARAMETER, data, &reply); 14520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 14620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return reply.readInt32(); 14720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 14820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 149318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber virtual status_t getConfig( 150693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber node_id node, OMX_INDEXTYPE index, 151693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber void *params, size_t size) { 152693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber Parcel data, reply; 153693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber data.writeInterfaceToken(IOMX::getInterfaceDescriptor()); 154c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber data.writeIntPtr((intptr_t)node); 155693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber data.writeInt32(index); 156693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber data.writeInt32(size); 157693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber data.write(params, size); 158693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber remote()->transact(GET_CONFIG, data, &reply); 159693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 160693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber status_t err = reply.readInt32(); 161693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber if (err != OK) { 162693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber return err; 163693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 164693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 165693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber reply.read(params, size); 166693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 167693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber return OK; 168693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 169693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 170318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber virtual status_t setConfig( 171693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber node_id node, OMX_INDEXTYPE index, 172693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber const void *params, size_t size) { 173693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber Parcel data, reply; 174693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber data.writeInterfaceToken(IOMX::getInterfaceDescriptor()); 175c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber data.writeIntPtr((intptr_t)node); 176693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber data.writeInt32(index); 177693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber data.writeInt32(size); 178693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber data.write(params, size); 179693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber remote()->transact(SET_CONFIG, data, &reply); 180693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 181693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber return reply.readInt32(); 182693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 183693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 18483750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis virtual status_t enableGraphicBuffers( 18583750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis node_id node, OMX_U32 port_index, OMX_BOOL enable) { 18683750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis Parcel data, reply; 18783750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis data.writeInterfaceToken(IOMX::getInterfaceDescriptor()); 18883750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis data.writeIntPtr((intptr_t)node); 18983750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis data.writeInt32(port_index); 19083750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis data.writeInt32((uint32_t)enable); 19183750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis remote()->transact(ENABLE_GRAPHIC_BUFFERS, data, &reply); 19283750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis 19383750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis status_t err = reply.readInt32(); 19483750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis return err; 19583750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis } 19683750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis 197318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber virtual status_t useBuffer( 19820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber node_id node, OMX_U32 port_index, const sp<IMemory> ¶ms, 19920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber buffer_id *buffer) { 20020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber Parcel data, reply; 20120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber data.writeInterfaceToken(IOMX::getInterfaceDescriptor()); 202c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber data.writeIntPtr((intptr_t)node); 20320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber data.writeInt32(port_index); 20420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber data.writeStrongBinder(params->asBinder()); 20520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber remote()->transact(USE_BUFFER, data, &reply); 20620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 20720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber status_t err = reply.readInt32(); 20820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber if (err != OK) { 20920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber *buffer = 0; 21020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 21120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return err; 21220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 21320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 214c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber *buffer = (void*)reply.readIntPtr(); 21520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 21620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return err; 21720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 21820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 21983750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis 22083750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis virtual status_t useGraphicBuffer( 22183750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis node_id node, OMX_U32 port_index, 22283750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis const sp<GraphicBuffer> &graphicBuffer, buffer_id *buffer) { 22383750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis Parcel data, reply; 22483750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis data.writeInterfaceToken(IOMX::getInterfaceDescriptor()); 22583750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis data.writeIntPtr((intptr_t)node); 22683750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis data.writeInt32(port_index); 22783750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis data.write(*graphicBuffer); 22883750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis remote()->transact(USE_GRAPHIC_BUFFER, data, &reply); 22983750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis 23083750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis status_t err = reply.readInt32(); 23183750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis if (err != OK) { 23283750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis *buffer = 0; 23383750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis 23483750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis return err; 23583750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis } 23683750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis 23783750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis *buffer = (void*)reply.readIntPtr(); 23883750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis 23983750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis return err; 24083750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis } 24183750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis 242e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong virtual status_t storeMetaDataInBuffers( 243e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong node_id node, OMX_U32 port_index, OMX_BOOL enable) { 244e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong Parcel data, reply; 245e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong data.writeInterfaceToken(IOMX::getInterfaceDescriptor()); 246e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong data.writeIntPtr((intptr_t)node); 247e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong data.writeInt32(port_index); 248e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong data.writeInt32((uint32_t)enable); 249e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong remote()->transact(STORE_META_DATA_IN_BUFFERS, data, &reply); 250e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong 251e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong status_t err = reply.readInt32(); 252e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong return err; 253e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong } 254e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong 255318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber virtual status_t allocateBuffer( 25620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber node_id node, OMX_U32 port_index, size_t size, 257570a3cb7582daa030cb38eedc5eb6a06f86ecc7fAndreas Huber buffer_id *buffer, void **buffer_data) { 25820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber Parcel data, reply; 25920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber data.writeInterfaceToken(IOMX::getInterfaceDescriptor()); 260c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber data.writeIntPtr((intptr_t)node); 26120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber data.writeInt32(port_index); 26220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber data.writeInt32(size); 26320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber remote()->transact(ALLOC_BUFFER, data, &reply); 26420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 26520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber status_t err = reply.readInt32(); 26620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber if (err != OK) { 26720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber *buffer = 0; 26820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 26920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return err; 27020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 27120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 272570a3cb7582daa030cb38eedc5eb6a06f86ecc7fAndreas Huber *buffer = (void *)reply.readIntPtr(); 273570a3cb7582daa030cb38eedc5eb6a06f86ecc7fAndreas Huber *buffer_data = (void *)reply.readIntPtr(); 27420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 27520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return err; 27620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 27720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 278318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber virtual status_t allocateBufferWithBackup( 27920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber node_id node, OMX_U32 port_index, const sp<IMemory> ¶ms, 28020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber buffer_id *buffer) { 28120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber Parcel data, reply; 28220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber data.writeInterfaceToken(IOMX::getInterfaceDescriptor()); 283c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber data.writeIntPtr((intptr_t)node); 28420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber data.writeInt32(port_index); 28520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber data.writeStrongBinder(params->asBinder()); 28620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber remote()->transact(ALLOC_BUFFER_WITH_BACKUP, data, &reply); 28720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 28820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber status_t err = reply.readInt32(); 28920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber if (err != OK) { 29020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber *buffer = 0; 29120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 29220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return err; 29320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 29420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 295c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber *buffer = (void*)reply.readIntPtr(); 29620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 29720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return err; 29820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 29920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 300318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber virtual status_t freeBuffer( 30120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber node_id node, OMX_U32 port_index, buffer_id buffer) { 30220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber Parcel data, reply; 30320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber data.writeInterfaceToken(IOMX::getInterfaceDescriptor()); 304c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber data.writeIntPtr((intptr_t)node); 30520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber data.writeInt32(port_index); 306c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber data.writeIntPtr((intptr_t)buffer); 30720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber remote()->transact(FREE_BUFFER, data, &reply); 30820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 30920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return reply.readInt32(); 31020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 31120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 312318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber virtual status_t fillBuffer(node_id node, buffer_id buffer) { 31320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber Parcel data, reply; 31420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber data.writeInterfaceToken(IOMX::getInterfaceDescriptor()); 315c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber data.writeIntPtr((intptr_t)node); 316c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber data.writeIntPtr((intptr_t)buffer); 31736efa039efaae4526791336cb688032d22b34becAndreas Huber remote()->transact(FILL_BUFFER, data, &reply); 31836efa039efaae4526791336cb688032d22b34becAndreas Huber 31936efa039efaae4526791336cb688032d22b34becAndreas Huber return reply.readInt32(); 32020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 32120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 322318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber virtual status_t emptyBuffer( 32320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber node_id node, 32420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber buffer_id buffer, 32520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber OMX_U32 range_offset, OMX_U32 range_length, 32620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber OMX_U32 flags, OMX_TICKS timestamp) { 32720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber Parcel data, reply; 32820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber data.writeInterfaceToken(IOMX::getInterfaceDescriptor()); 329c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber data.writeIntPtr((intptr_t)node); 330c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber data.writeIntPtr((intptr_t)buffer); 33120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber data.writeInt32(range_offset); 33220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber data.writeInt32(range_length); 33320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber data.writeInt32(flags); 33420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber data.writeInt64(timestamp); 33536efa039efaae4526791336cb688032d22b34becAndreas Huber remote()->transact(EMPTY_BUFFER, data, &reply); 33636efa039efaae4526791336cb688032d22b34becAndreas Huber 33736efa039efaae4526791336cb688032d22b34becAndreas Huber return reply.readInt32(); 33820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 3398b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber 340318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber virtual status_t getExtensionIndex( 341693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber node_id node, 342693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber const char *parameter_name, 343693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber OMX_INDEXTYPE *index) { 344693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber Parcel data, reply; 345693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber data.writeInterfaceToken(IOMX::getInterfaceDescriptor()); 346c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber data.writeIntPtr((intptr_t)node); 347693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber data.writeCString(parameter_name); 348693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 349693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber remote()->transact(GET_EXTENSION_INDEX, data, &reply); 350693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 351693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber status_t err = reply.readInt32(); 352693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber if (err == OK) { 353693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber *index = static_cast<OMX_INDEXTYPE>(reply.readInt32()); 354693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } else { 355693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber *index = OMX_IndexComponentStartUnused; 356693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 357693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 358693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber return err; 359693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 36020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}; 36120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 36220111aa043c5f404472bc63b90bc5aad906b1101Andreas HuberIMPLEMENT_META_INTERFACE(OMX, "android.hardware.IOMX"); 36320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 36420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber//////////////////////////////////////////////////////////////////////////////// 36520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 36620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#define CHECK_INTERFACE(interface, data, reply) \ 36720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber do { if (!data.enforceInterface(interface::getInterfaceDescriptor())) { \ 36820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber LOGW("Call incorrectly routed to " #interface); \ 36920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return PERMISSION_DENIED; \ 37020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } } while (0) 37120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 37220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberstatus_t BnOMX::onTransact( 37320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber uint32_t code, const Parcel &data, Parcel *reply, uint32_t flags) { 37420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber switch (code) { 3757eaa9c9385535b651064e02d05a8ffa4b2359281Andreas Huber case LIVES_LOCALLY: 3767eaa9c9385535b651064e02d05a8ffa4b2359281Andreas Huber { 3777eaa9c9385535b651064e02d05a8ffa4b2359281Andreas Huber CHECK_INTERFACE(IOMX, data, reply); 3787eaa9c9385535b651064e02d05a8ffa4b2359281Andreas Huber reply->writeInt32(livesLocally((pid_t)data.readInt32())); 3797eaa9c9385535b651064e02d05a8ffa4b2359281Andreas Huber 3807eaa9c9385535b651064e02d05a8ffa4b2359281Andreas Huber return OK; 3817eaa9c9385535b651064e02d05a8ffa4b2359281Andreas Huber } 3827eaa9c9385535b651064e02d05a8ffa4b2359281Andreas Huber 38320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber case LIST_NODES: 38420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber { 38520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber CHECK_INTERFACE(IOMX, data, reply); 38620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 387134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber List<ComponentInfo> list; 388318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber listNodes(&list); 38920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 39020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber reply->writeInt32(list.size()); 391134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber for (List<ComponentInfo>::iterator it = list.begin(); 39220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber it != list.end(); ++it) { 393134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber ComponentInfo &cur = *it; 394134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber 395134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber reply->writeString8(cur.mName); 396134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber reply->writeInt32(cur.mRoles.size()); 397134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber for (List<String8>::iterator role_it = cur.mRoles.begin(); 398134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber role_it != cur.mRoles.end(); ++role_it) { 399134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber reply->writeString8(*role_it); 400134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber } 40120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 40220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 40320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return NO_ERROR; 40420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 40520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 40620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber case ALLOCATE_NODE: 40720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber { 40820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber CHECK_INTERFACE(IOMX, data, reply); 40920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 410318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber const char *name = data.readCString(); 411318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 412318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber sp<IOMXObserver> observer = 413318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber interface_cast<IOMXObserver>(data.readStrongBinder()); 414318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 41520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber node_id node; 416318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 417318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber status_t err = allocateNode(name, observer, &node); 41820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber reply->writeInt32(err); 41920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber if (err == OK) { 420c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber reply->writeIntPtr((intptr_t)node); 42120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 4227eaa9c9385535b651064e02d05a8ffa4b2359281Andreas Huber 42320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return NO_ERROR; 42420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 42520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 42620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber case FREE_NODE: 42720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber { 42820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber CHECK_INTERFACE(IOMX, data, reply); 42920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 430c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber node_id node = (void*)data.readIntPtr(); 43120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 432318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber reply->writeInt32(freeNode(node)); 4337eaa9c9385535b651064e02d05a8ffa4b2359281Andreas Huber 43420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return NO_ERROR; 43520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 43620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 43720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber case SEND_COMMAND: 43820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber { 43920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber CHECK_INTERFACE(IOMX, data, reply); 44020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 441c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber node_id node = (void*)data.readIntPtr(); 44220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 44320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber OMX_COMMANDTYPE cmd = 44420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber static_cast<OMX_COMMANDTYPE>(data.readInt32()); 44520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 44620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber OMX_S32 param = data.readInt32(); 447318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber reply->writeInt32(sendCommand(node, cmd, param)); 44820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 44920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return NO_ERROR; 45020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 45120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 45220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber case GET_PARAMETER: 45320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber case SET_PARAMETER: 454693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber case GET_CONFIG: 455b391290130f263441334ee4525a5832f0bea2ef0Andreas Huber case SET_CONFIG: 456693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber { 457693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK_INTERFACE(IOMX, data, reply); 458693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 459c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber node_id node = (void*)data.readIntPtr(); 460693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber OMX_INDEXTYPE index = static_cast<OMX_INDEXTYPE>(data.readInt32()); 461693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 462693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber size_t size = data.readInt32(); 463693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 464693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber void *params = malloc(size); 465693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber data.read(params, size); 466693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 467b391290130f263441334ee4525a5832f0bea2ef0Andreas Huber status_t err; 468b391290130f263441334ee4525a5832f0bea2ef0Andreas Huber switch (code) { 469b391290130f263441334ee4525a5832f0bea2ef0Andreas Huber case GET_PARAMETER: 470b391290130f263441334ee4525a5832f0bea2ef0Andreas Huber err = getParameter(node, index, params, size); 471b391290130f263441334ee4525a5832f0bea2ef0Andreas Huber break; 472b391290130f263441334ee4525a5832f0bea2ef0Andreas Huber case SET_PARAMETER: 473b391290130f263441334ee4525a5832f0bea2ef0Andreas Huber err = setParameter(node, index, params, size); 474b391290130f263441334ee4525a5832f0bea2ef0Andreas Huber break; 475b391290130f263441334ee4525a5832f0bea2ef0Andreas Huber case GET_CONFIG: 476b391290130f263441334ee4525a5832f0bea2ef0Andreas Huber err = getConfig(node, index, params, size); 477b391290130f263441334ee4525a5832f0bea2ef0Andreas Huber break; 478b391290130f263441334ee4525a5832f0bea2ef0Andreas Huber case SET_CONFIG: 479b391290130f263441334ee4525a5832f0bea2ef0Andreas Huber err = setConfig(node, index, params, size); 480b391290130f263441334ee4525a5832f0bea2ef0Andreas Huber break; 481b391290130f263441334ee4525a5832f0bea2ef0Andreas Huber default: 482b391290130f263441334ee4525a5832f0bea2ef0Andreas Huber TRESPASS(); 483b391290130f263441334ee4525a5832f0bea2ef0Andreas Huber } 484693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 485693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber reply->writeInt32(err); 486693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 487b391290130f263441334ee4525a5832f0bea2ef0Andreas Huber if ((code == GET_PARAMETER || code == GET_CONFIG) && err == OK) { 488693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber reply->write(params, size); 489693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 490693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 491693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber free(params); 492693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber params = NULL; 493693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 494693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber return NO_ERROR; 495693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 496693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 49783750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis case ENABLE_GRAPHIC_BUFFERS: 49883750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis { 49983750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis CHECK_INTERFACE(IOMX, data, reply); 50083750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis 50183750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis node_id node = (void*)data.readIntPtr(); 50283750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis OMX_U32 port_index = data.readInt32(); 50383750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis OMX_BOOL enable = (OMX_BOOL)data.readInt32(); 50483750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis 50583750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis status_t err = enableGraphicBuffers(node, port_index, enable); 50683750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis reply->writeInt32(err); 50783750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis 50883750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis return NO_ERROR; 50983750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis } 51083750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis 51120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber case USE_BUFFER: 51220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber { 51320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber CHECK_INTERFACE(IOMX, data, reply); 51420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 515c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber node_id node = (void*)data.readIntPtr(); 51620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber OMX_U32 port_index = data.readInt32(); 51720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber sp<IMemory> params = 51820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber interface_cast<IMemory>(data.readStrongBinder()); 51920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 52020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber buffer_id buffer; 521318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber status_t err = useBuffer(node, port_index, params, &buffer); 52220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber reply->writeInt32(err); 52320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 52420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber if (err == OK) { 525c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber reply->writeIntPtr((intptr_t)buffer); 52620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 52720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 52820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return NO_ERROR; 52920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 53020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 53183750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis case USE_GRAPHIC_BUFFER: 53283750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis { 53383750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis CHECK_INTERFACE(IOMX, data, reply); 53483750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis 53583750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis node_id node = (void*)data.readIntPtr(); 53683750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis OMX_U32 port_index = data.readInt32(); 53783750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis sp<GraphicBuffer> graphicBuffer = new GraphicBuffer(); 53883750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis data.read(*graphicBuffer); 53983750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis 54083750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis buffer_id buffer; 54183750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis status_t err = useGraphicBuffer( 54283750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis node, port_index, graphicBuffer, &buffer); 54383750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis reply->writeInt32(err); 54483750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis 54583750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis if (err == OK) { 54683750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis reply->writeIntPtr((intptr_t)buffer); 54783750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis } 54883750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis 54983750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis return NO_ERROR; 55083750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis } 55183750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis 552e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong case STORE_META_DATA_IN_BUFFERS: 553e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong { 554e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong CHECK_INTERFACE(IOMX, data, reply); 555e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong 556e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong node_id node = (void*)data.readIntPtr(); 557e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong OMX_U32 port_index = data.readInt32(); 558e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong OMX_BOOL enable = (OMX_BOOL)data.readInt32(); 559e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong 560e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong status_t err = storeMetaDataInBuffers(node, port_index, enable); 561e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong reply->writeInt32(err); 562e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong 563e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong return NO_ERROR; 564e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong } 565e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong 56620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber case ALLOC_BUFFER: 56720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber { 56820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber CHECK_INTERFACE(IOMX, data, reply); 56920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 570c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber node_id node = (void*)data.readIntPtr(); 57120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber OMX_U32 port_index = data.readInt32(); 57220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber size_t size = data.readInt32(); 57320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 57420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber buffer_id buffer; 575570a3cb7582daa030cb38eedc5eb6a06f86ecc7fAndreas Huber void *buffer_data; 576570a3cb7582daa030cb38eedc5eb6a06f86ecc7fAndreas Huber status_t err = allocateBuffer( 577570a3cb7582daa030cb38eedc5eb6a06f86ecc7fAndreas Huber node, port_index, size, &buffer, &buffer_data); 57820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber reply->writeInt32(err); 57920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 58020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber if (err == OK) { 581c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber reply->writeIntPtr((intptr_t)buffer); 582570a3cb7582daa030cb38eedc5eb6a06f86ecc7fAndreas Huber reply->writeIntPtr((intptr_t)buffer_data); 58320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 58420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 58520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return NO_ERROR; 58620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 58720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 58820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber case ALLOC_BUFFER_WITH_BACKUP: 58920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber { 59020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber CHECK_INTERFACE(IOMX, data, reply); 59120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 592c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber node_id node = (void*)data.readIntPtr(); 59320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber OMX_U32 port_index = data.readInt32(); 59420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber sp<IMemory> params = 59520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber interface_cast<IMemory>(data.readStrongBinder()); 59620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 59720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber buffer_id buffer; 598318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber status_t err = allocateBufferWithBackup( 59920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber node, port_index, params, &buffer); 60020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 60120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber reply->writeInt32(err); 60220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 60320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber if (err == OK) { 604c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber reply->writeIntPtr((intptr_t)buffer); 60520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 60620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 60720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return NO_ERROR; 60820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 60920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 61020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber case FREE_BUFFER: 61120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber { 61220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber CHECK_INTERFACE(IOMX, data, reply); 61320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 614c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber node_id node = (void*)data.readIntPtr(); 61520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber OMX_U32 port_index = data.readInt32(); 616c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber buffer_id buffer = (void*)data.readIntPtr(); 617318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber reply->writeInt32(freeBuffer(node, port_index, buffer)); 61820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 61920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return NO_ERROR; 62020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 62120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 62220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber case FILL_BUFFER: 62320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber { 62420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber CHECK_INTERFACE(IOMX, data, reply); 62520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 626c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber node_id node = (void*)data.readIntPtr(); 627c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber buffer_id buffer = (void*)data.readIntPtr(); 628318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber reply->writeInt32(fillBuffer(node, buffer)); 62920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 63020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return NO_ERROR; 63120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 63220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 63320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber case EMPTY_BUFFER: 63420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber { 63520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber CHECK_INTERFACE(IOMX, data, reply); 63620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 637c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber node_id node = (void*)data.readIntPtr(); 638c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber buffer_id buffer = (void*)data.readIntPtr(); 63920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber OMX_U32 range_offset = data.readInt32(); 64020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber OMX_U32 range_length = data.readInt32(); 64120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber OMX_U32 flags = data.readInt32(); 64220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber OMX_TICKS timestamp = data.readInt64(); 64320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 64436efa039efaae4526791336cb688032d22b34becAndreas Huber reply->writeInt32( 645318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber emptyBuffer( 64636efa039efaae4526791336cb688032d22b34becAndreas Huber node, buffer, range_offset, range_length, 64736efa039efaae4526791336cb688032d22b34becAndreas Huber flags, timestamp)); 64820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 64920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return NO_ERROR; 65020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 65120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 652693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber case GET_EXTENSION_INDEX: 653693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber { 654693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK_INTERFACE(IOMX, data, reply); 655693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 656c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber node_id node = (void*)data.readIntPtr(); 657693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber const char *parameter_name = data.readCString(); 6587eaa9c9385535b651064e02d05a8ffa4b2359281Andreas Huber 659693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber OMX_INDEXTYPE index; 660318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber status_t err = getExtensionIndex(node, parameter_name, &index); 661693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 662693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber reply->writeInt32(err); 663693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 664693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber if (err == OK) { 665693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber reply->writeInt32(index); 666693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 667693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 668693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber return OK; 669693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 670693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 67120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber default: 67220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return BBinder::onTransact(code, data, reply, flags); 67320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 67420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber} 67520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 67620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber//////////////////////////////////////////////////////////////////////////////// 67720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 67820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberclass BpOMXObserver : public BpInterface<IOMXObserver> { 67920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberpublic: 68020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber BpOMXObserver(const sp<IBinder> &impl) 68120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber : BpInterface<IOMXObserver>(impl) { 68220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 68320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 684318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber virtual void onMessage(const omx_message &msg) { 68520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber Parcel data, reply; 68620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber data.writeInterfaceToken(IOMXObserver::getInterfaceDescriptor()); 68720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber data.write(&msg, sizeof(msg)); 68820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 68920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber remote()->transact(OBSERVER_ON_MSG, data, &reply, IBinder::FLAG_ONEWAY); 69020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 69120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}; 69220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 69320111aa043c5f404472bc63b90bc5aad906b1101Andreas HuberIMPLEMENT_META_INTERFACE(OMXObserver, "android.hardware.IOMXObserver"); 69420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 69520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberstatus_t BnOMXObserver::onTransact( 69620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber uint32_t code, const Parcel &data, Parcel *reply, uint32_t flags) { 69720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber switch (code) { 69820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber case OBSERVER_ON_MSG: 69920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber { 70020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber CHECK_INTERFACE(IOMXObserver, data, reply); 70120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 70220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber omx_message msg; 70320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber data.read(&msg, sizeof(msg)); 70420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 70520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber // XXX Could use readInplace maybe? 706318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber onMessage(msg); 70720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 70820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return NO_ERROR; 70920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 71020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 71120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber default: 71220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return BBinder::onTransact(code, data, reply, flags); 71320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 71420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber} 71520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 71620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber} // namespace android 717