IOMX.cpp revision 20111aa043c5f404472bc63b90bc5aad906b1101
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> 820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 920111aa043c5f404472bc63b90bc5aad906b1101Andreas Hubernamespace android { 1020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 1120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberenum { 1220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber CONNECT = IBinder::FIRST_CALL_TRANSACTION, 1320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber LIST_NODES, 1420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber ALLOCATE_NODE, 1520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber FREE_NODE, 1620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber SEND_COMMAND, 1720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber GET_PARAMETER, 1820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber SET_PARAMETER, 1920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber USE_BUFFER, 2020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber ALLOC_BUFFER, 2120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber ALLOC_BUFFER_WITH_BACKUP, 2220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber FREE_BUFFER, 2320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber OBSERVE_NODE, 2420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber FILL_BUFFER, 2520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber EMPTY_BUFFER, 2620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber OBSERVER_ON_MSG, 2720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}; 2820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 2920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberstatic void *readVoidStar(const Parcel *parcel) { 3020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber // FIX if sizeof(void *) != sizeof(int32) 3120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return (void *)parcel->readInt32(); 3220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber} 3320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 3420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberstatic void writeVoidStar(void *x, Parcel *parcel) { 3520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber // FIX if sizeof(void *) != sizeof(int32) 3620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber parcel->writeInt32((int32_t)x); 3720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber} 3820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 3920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberclass BpOMX : public BpInterface<IOMX> { 4020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberpublic: 4120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber BpOMX(const sp<IBinder> &impl) 4220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber : BpInterface<IOMX>(impl) { 4320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 4420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 4520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#if IOMX_USES_SOCKETS 4620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber virtual status_t connect(int *sd) { 4720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber Parcel data, reply; 4820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber data.writeInterfaceToken(IOMX::getInterfaceDescriptor()); 4920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber remote()->transact(CONNECT, data, &reply); 5020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 5120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber status_t err = reply.readInt32(); 5220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber if (err == OK) { 5320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber *sd = dup(reply.readFileDescriptor()); 5420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } else { 5520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber *sd = -1; 5620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 5720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 5820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return reply.readInt32(); 5920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 6020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#endif 6120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 6220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber virtual status_t list_nodes(List<String8> *list) { 6320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber list->clear(); 6420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 6520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber Parcel data, reply; 6620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber data.writeInterfaceToken(IOMX::getInterfaceDescriptor()); 6720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber remote()->transact(LIST_NODES, data, &reply); 6820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 6920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber int32_t n = reply.readInt32(); 7020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber for (int32_t i = 0; i < n; ++i) { 7120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber String8 s = reply.readString8(); 7220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 7320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber list->push_back(s); 7420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 7520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 7620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return OK; 7720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 7820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 7920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber virtual status_t allocate_node(const char *name, node_id *node) { 8020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber Parcel data, reply; 8120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber data.writeInterfaceToken(IOMX::getInterfaceDescriptor()); 8220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber data.writeCString(name); 8320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber remote()->transact(ALLOCATE_NODE, data, &reply); 8420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 8520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber status_t err = reply.readInt32(); 8620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber if (err == OK) { 8720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber *node = readVoidStar(&reply); 8820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } else { 8920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber *node = 0; 9020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 9120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 9220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return err; 9320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 9420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 9520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber virtual status_t free_node(node_id node) { 9620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber Parcel data, reply; 9720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber data.writeInterfaceToken(IOMX::getInterfaceDescriptor()); 9820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber writeVoidStar(node, &data); 9920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber remote()->transact(FREE_NODE, data, &reply); 10020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 10120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return reply.readInt32(); 10220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 10320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 10420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber virtual status_t send_command( 10520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber node_id node, OMX_COMMANDTYPE cmd, OMX_S32 param) { 10620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber Parcel data, reply; 10720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber data.writeInterfaceToken(IOMX::getInterfaceDescriptor()); 10820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber writeVoidStar(node, &data); 10920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber data.writeInt32(cmd); 11020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber data.writeInt32(param); 11120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber remote()->transact(SEND_COMMAND, data, &reply); 11220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 11320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return reply.readInt32(); 11420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 11520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 11620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber virtual status_t get_parameter( 11720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber node_id node, OMX_INDEXTYPE index, 11820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber void *params, size_t size) { 11920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber Parcel data, reply; 12020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber data.writeInterfaceToken(IOMX::getInterfaceDescriptor()); 12120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber writeVoidStar(node, &data); 12220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber data.writeInt32(index); 12320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber data.writeInt32(size); 12420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber data.write(params, size); 12520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber remote()->transact(GET_PARAMETER, data, &reply); 12620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 12720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber status_t err = reply.readInt32(); 12820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber if (err != OK) { 12920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return err; 13020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 13120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 13220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber reply.read(params, size); 13320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 13420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return OK; 13520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 13620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 13720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber virtual status_t set_parameter( 13820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber node_id node, OMX_INDEXTYPE index, 13920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber const void *params, size_t size) { 14020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber Parcel data, reply; 14120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber data.writeInterfaceToken(IOMX::getInterfaceDescriptor()); 14220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber writeVoidStar(node, &data); 14320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber data.writeInt32(index); 14420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber data.writeInt32(size); 14520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber data.write(params, size); 14620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber remote()->transact(SET_PARAMETER, data, &reply); 14720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 14820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return reply.readInt32(); 14920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 15020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 15120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber virtual status_t use_buffer( 15220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber node_id node, OMX_U32 port_index, const sp<IMemory> ¶ms, 15320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber buffer_id *buffer) { 15420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber Parcel data, reply; 15520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber data.writeInterfaceToken(IOMX::getInterfaceDescriptor()); 15620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber writeVoidStar(node, &data); 15720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber data.writeInt32(port_index); 15820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber data.writeStrongBinder(params->asBinder()); 15920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber remote()->transact(USE_BUFFER, data, &reply); 16020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 16120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber status_t err = reply.readInt32(); 16220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber if (err != OK) { 16320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber *buffer = 0; 16420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 16520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return err; 16620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 16720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 16820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber *buffer = readVoidStar(&reply); 16920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 17020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return err; 17120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 17220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 17320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber virtual status_t allocate_buffer( 17420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber node_id node, OMX_U32 port_index, size_t size, 17520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber buffer_id *buffer) { 17620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber Parcel data, reply; 17720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber data.writeInterfaceToken(IOMX::getInterfaceDescriptor()); 17820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber writeVoidStar(node, &data); 17920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber data.writeInt32(port_index); 18020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber data.writeInt32(size); 18120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber remote()->transact(ALLOC_BUFFER, data, &reply); 18220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 18320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber status_t err = reply.readInt32(); 18420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber if (err != OK) { 18520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber *buffer = 0; 18620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 18720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return err; 18820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 18920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 19020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber *buffer = readVoidStar(&reply); 19120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 19220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return err; 19320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 19420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 19520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber virtual status_t allocate_buffer_with_backup( 19620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber node_id node, OMX_U32 port_index, const sp<IMemory> ¶ms, 19720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber buffer_id *buffer) { 19820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber Parcel data, reply; 19920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber data.writeInterfaceToken(IOMX::getInterfaceDescriptor()); 20020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber writeVoidStar(node, &data); 20120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber data.writeInt32(port_index); 20220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber data.writeStrongBinder(params->asBinder()); 20320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber remote()->transact(ALLOC_BUFFER_WITH_BACKUP, data, &reply); 20420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 20520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber status_t err = reply.readInt32(); 20620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber if (err != OK) { 20720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber *buffer = 0; 20820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 20920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return err; 21020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 21120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 21220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber *buffer = readVoidStar(&reply); 21320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 21420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return err; 21520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 21620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 21720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber virtual status_t free_buffer( 21820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber node_id node, OMX_U32 port_index, buffer_id buffer) { 21920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber Parcel data, reply; 22020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber data.writeInterfaceToken(IOMX::getInterfaceDescriptor()); 22120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber writeVoidStar(node, &data); 22220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber data.writeInt32(port_index); 22320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber writeVoidStar(buffer, &data); 22420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber remote()->transact(FREE_BUFFER, data, &reply); 22520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 22620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return reply.readInt32(); 22720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 22820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 22920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#if !IOMX_USES_SOCKETS 23020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber virtual status_t observe_node( 23120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber node_id node, const sp<IOMXObserver> &observer) { 23220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber Parcel data, reply; 23320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber data.writeInterfaceToken(IOMX::getInterfaceDescriptor()); 23420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber writeVoidStar(node, &data); 23520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber data.writeStrongBinder(observer->asBinder()); 23620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber remote()->transact(OBSERVE_NODE, data, &reply); 23720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 23820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return reply.readInt32(); 23920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 24020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 24120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber virtual void fill_buffer(node_id node, buffer_id buffer) { 24220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber Parcel data, reply; 24320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber data.writeInterfaceToken(IOMX::getInterfaceDescriptor()); 24420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber writeVoidStar(node, &data); 24520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber writeVoidStar(buffer, &data); 24620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber remote()->transact(FILL_BUFFER, data, &reply, IBinder::FLAG_ONEWAY); 24720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 24820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 24920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber virtual void empty_buffer( 25020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber node_id node, 25120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber buffer_id buffer, 25220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber OMX_U32 range_offset, OMX_U32 range_length, 25320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber OMX_U32 flags, OMX_TICKS timestamp) { 25420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber Parcel data, reply; 25520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber data.writeInterfaceToken(IOMX::getInterfaceDescriptor()); 25620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber writeVoidStar(node, &data); 25720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber writeVoidStar(buffer, &data); 25820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber data.writeInt32(range_offset); 25920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber data.writeInt32(range_length); 26020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber data.writeInt32(flags); 26120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber data.writeInt64(timestamp); 26220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber remote()->transact(EMPTY_BUFFER, data, &reply, IBinder::FLAG_ONEWAY); 26320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 26420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#endif 26520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}; 26620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 26720111aa043c5f404472bc63b90bc5aad906b1101Andreas HuberIMPLEMENT_META_INTERFACE(OMX, "android.hardware.IOMX"); 26820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 26920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber//////////////////////////////////////////////////////////////////////////////// 27020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 27120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#define CHECK_INTERFACE(interface, data, reply) \ 27220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber do { if (!data.enforceInterface(interface::getInterfaceDescriptor())) { \ 27320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber LOGW("Call incorrectly routed to " #interface); \ 27420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return PERMISSION_DENIED; \ 27520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } } while (0) 27620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 27720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberstatus_t BnOMX::onTransact( 27820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber uint32_t code, const Parcel &data, Parcel *reply, uint32_t flags) { 27920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber switch (code) { 28020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#if IOMX_USES_SOCKETS 28120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber case CONNECT: 28220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber { 28320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber CHECK_INTERFACE(IOMX, data, reply); 28420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 28520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber int s; 28620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber status_t err = connect(&s); 28720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 28820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber reply->writeInt32(err); 28920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber if (err == OK) { 29020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber assert(s >= 0); 29120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber reply->writeDupFileDescriptor(s); 29220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber close(s); 29320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber s = -1; 29420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } else { 29520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber assert(s == -1); 29620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 29720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 29820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return NO_ERROR; 29920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 30020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#endif 30120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 30220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber case LIST_NODES: 30320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber { 30420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber CHECK_INTERFACE(IOMX, data, reply); 30520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 30620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber List<String8> list; 30720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber list_nodes(&list); 30820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 30920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber reply->writeInt32(list.size()); 31020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber for (List<String8>::iterator it = list.begin(); 31120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber it != list.end(); ++it) { 31220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber reply->writeString8(*it); 31320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 31420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 31520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return NO_ERROR; 31620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 31720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 31820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber case ALLOCATE_NODE: 31920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber { 32020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber CHECK_INTERFACE(IOMX, data, reply); 32120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 32220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber node_id node; 32320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber status_t err = allocate_node(data.readCString(), &node); 32420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber reply->writeInt32(err); 32520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber if (err == OK) { 32620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber writeVoidStar(node, reply); 32720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 32820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 32920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return NO_ERROR; 33020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 33120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 33220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber case FREE_NODE: 33320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber { 33420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber CHECK_INTERFACE(IOMX, data, reply); 33520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 33620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber node_id node = readVoidStar(&data); 33720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 33820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber reply->writeInt32(free_node(node)); 33920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 34020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return NO_ERROR; 34120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 34220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 34320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber case SEND_COMMAND: 34420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber { 34520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber CHECK_INTERFACE(IOMX, data, reply); 34620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 34720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber node_id node = readVoidStar(&data); 34820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 34920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber OMX_COMMANDTYPE cmd = 35020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber static_cast<OMX_COMMANDTYPE>(data.readInt32()); 35120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 35220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber OMX_S32 param = data.readInt32(); 35320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber reply->writeInt32(send_command(node, cmd, param)); 35420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 35520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return NO_ERROR; 35620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 35720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 35820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber case GET_PARAMETER: 35920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber { 36020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber CHECK_INTERFACE(IOMX, data, reply); 36120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 36220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber node_id node = readVoidStar(&data); 36320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber OMX_INDEXTYPE index = static_cast<OMX_INDEXTYPE>(data.readInt32()); 36420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 36520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber size_t size = data.readInt32(); 36620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 36720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber // XXX I am not happy with this but Parcel::readInplace didn't work. 36820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber void *params = malloc(size); 36920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber data.read(params, size); 37020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 37120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber status_t err = get_parameter(node, index, params, size); 37220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 37320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber reply->writeInt32(err); 37420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 37520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber if (err == OK) { 37620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber reply->write(params, size); 37720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 37820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 37920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber free(params); 38020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber params = NULL; 38120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 38220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return NO_ERROR; 38320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 38420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 38520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber case SET_PARAMETER: 38620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber { 38720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber CHECK_INTERFACE(IOMX, data, reply); 38820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 38920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber node_id node = readVoidStar(&data); 39020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber OMX_INDEXTYPE index = static_cast<OMX_INDEXTYPE>(data.readInt32()); 39120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 39220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber size_t size = data.readInt32(); 39320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber void *params = const_cast<void *>(data.readInplace(size)); 39420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 39520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber reply->writeInt32(set_parameter(node, index, params, size)); 39620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 39720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return NO_ERROR; 39820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 39920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 40020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber case USE_BUFFER: 40120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber { 40220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber CHECK_INTERFACE(IOMX, data, reply); 40320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 40420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber node_id node = readVoidStar(&data); 40520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber OMX_U32 port_index = data.readInt32(); 40620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber sp<IMemory> params = 40720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber interface_cast<IMemory>(data.readStrongBinder()); 40820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 40920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber buffer_id buffer; 41020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber status_t err = use_buffer(node, port_index, params, &buffer); 41120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber reply->writeInt32(err); 41220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 41320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber if (err == OK) { 41420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber writeVoidStar(buffer, reply); 41520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 41620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 41720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return NO_ERROR; 41820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 41920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 42020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber case ALLOC_BUFFER: 42120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber { 42220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber CHECK_INTERFACE(IOMX, data, reply); 42320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 42420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber node_id node = readVoidStar(&data); 42520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber OMX_U32 port_index = data.readInt32(); 42620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber size_t size = data.readInt32(); 42720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 42820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber buffer_id buffer; 42920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber status_t err = allocate_buffer(node, port_index, size, &buffer); 43020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber reply->writeInt32(err); 43120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 43220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber if (err == OK) { 43320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber writeVoidStar(buffer, reply); 43420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 43520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 43620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return NO_ERROR; 43720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 43820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 43920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber case ALLOC_BUFFER_WITH_BACKUP: 44020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber { 44120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber CHECK_INTERFACE(IOMX, data, reply); 44220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 44320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber node_id node = readVoidStar(&data); 44420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber OMX_U32 port_index = data.readInt32(); 44520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber sp<IMemory> params = 44620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber interface_cast<IMemory>(data.readStrongBinder()); 44720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 44820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber buffer_id buffer; 44920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber status_t err = allocate_buffer_with_backup( 45020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber node, port_index, params, &buffer); 45120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 45220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber reply->writeInt32(err); 45320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 45420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber if (err == OK) { 45520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber writeVoidStar(buffer, reply); 45620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 45720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 45820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return NO_ERROR; 45920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 46020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 46120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber case FREE_BUFFER: 46220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber { 46320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber CHECK_INTERFACE(IOMX, data, reply); 46420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 46520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber node_id node = readVoidStar(&data); 46620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber OMX_U32 port_index = data.readInt32(); 46720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber buffer_id buffer = readVoidStar(&data); 46820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber reply->writeInt32(free_buffer(node, port_index, buffer)); 46920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 47020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return NO_ERROR; 47120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 47220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 47320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#if !IOMX_USES_SOCKETS 47420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber case OBSERVE_NODE: 47520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber { 47620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber CHECK_INTERFACE(IOMX, data, reply); 47720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 47820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber node_id node = readVoidStar(&data); 47920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber sp<IOMXObserver> observer = 48020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber interface_cast<IOMXObserver>(data.readStrongBinder()); 48120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber reply->writeInt32(observe_node(node, observer)); 48220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 48320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return NO_ERROR; 48420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 48520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 48620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber case FILL_BUFFER: 48720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber { 48820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber CHECK_INTERFACE(IOMX, data, reply); 48920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 49020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber node_id node = readVoidStar(&data); 49120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber buffer_id buffer = readVoidStar(&data); 49220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber fill_buffer(node, buffer); 49320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 49420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return NO_ERROR; 49520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 49620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 49720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber case EMPTY_BUFFER: 49820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber { 49920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber CHECK_INTERFACE(IOMX, data, reply); 50020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 50120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber node_id node = readVoidStar(&data); 50220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber buffer_id buffer = readVoidStar(&data); 50320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber OMX_U32 range_offset = data.readInt32(); 50420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber OMX_U32 range_length = data.readInt32(); 50520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber OMX_U32 flags = data.readInt32(); 50620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber OMX_TICKS timestamp = data.readInt64(); 50720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 50820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber empty_buffer( 50920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber node, buffer, range_offset, range_length, 51020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber flags, timestamp); 51120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 51220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return NO_ERROR; 51320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 51420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#endif 51520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 51620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber default: 51720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return BBinder::onTransact(code, data, reply, flags); 51820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 51920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber} 52020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 52120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber//////////////////////////////////////////////////////////////////////////////// 52220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 52320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberclass BpOMXObserver : public BpInterface<IOMXObserver> { 52420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberpublic: 52520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber BpOMXObserver(const sp<IBinder> &impl) 52620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber : BpInterface<IOMXObserver>(impl) { 52720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 52820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 52920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber virtual void on_message(const omx_message &msg) { 53020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber Parcel data, reply; 53120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber data.writeInterfaceToken(IOMXObserver::getInterfaceDescriptor()); 53220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber data.write(&msg, sizeof(msg)); 53320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 53420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber remote()->transact(OBSERVER_ON_MSG, data, &reply, IBinder::FLAG_ONEWAY); 53520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 53620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}; 53720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 53820111aa043c5f404472bc63b90bc5aad906b1101Andreas HuberIMPLEMENT_META_INTERFACE(OMXObserver, "android.hardware.IOMXObserver"); 53920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 54020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberstatus_t BnOMXObserver::onTransact( 54120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber uint32_t code, const Parcel &data, Parcel *reply, uint32_t flags) { 54220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber switch (code) { 54320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber case OBSERVER_ON_MSG: 54420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber { 54520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber CHECK_INTERFACE(IOMXObserver, data, reply); 54620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 54720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber omx_message msg; 54820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber data.read(&msg, sizeof(msg)); 54920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 55020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber // XXX Could use readInplace maybe? 55120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber on_message(msg); 55220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 55320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return NO_ERROR; 55420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 55520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 55620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber default: 55720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return BBinder::onTransact(code, data, reply, flags); 55820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 55920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber} 56020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 56120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber} // namespace android 562