IOMX.cpp revision 134ee6a324c35f39e3576172e4eae4c6de6eb9dc
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> 88b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber#include <ui/ISurface.h> 9f4148b55c5d6f68b22462e3880015fefa91ae7c6Andreas Huber#include <ui/Surface.h> 1020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 1120111aa043c5f404472bc63b90bc5aad906b1101Andreas Hubernamespace android { 1220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 1320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberenum { 1420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber CONNECT = IBinder::FIRST_CALL_TRANSACTION, 1520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber LIST_NODES, 1620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber ALLOCATE_NODE, 1720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber FREE_NODE, 1820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber SEND_COMMAND, 1920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber GET_PARAMETER, 2020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber SET_PARAMETER, 21693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber GET_CONFIG, 22693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber SET_CONFIG, 2320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber USE_BUFFER, 2420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber ALLOC_BUFFER, 2520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber ALLOC_BUFFER_WITH_BACKUP, 2620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber FREE_BUFFER, 2720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber FILL_BUFFER, 2820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber EMPTY_BUFFER, 29693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber GET_EXTENSION_INDEX, 308b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber CREATE_RENDERER, 3120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber OBSERVER_ON_MSG, 328b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber RENDERER_RENDER, 3320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}; 3420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 35f4148b55c5d6f68b22462e3880015fefa91ae7c6Andreas Hubersp<IOMXRenderer> IOMX::createRenderer( 36f4148b55c5d6f68b22462e3880015fefa91ae7c6Andreas Huber const sp<Surface> &surface, 37f4148b55c5d6f68b22462e3880015fefa91ae7c6Andreas Huber const char *componentName, 38f4148b55c5d6f68b22462e3880015fefa91ae7c6Andreas Huber OMX_COLOR_FORMATTYPE colorFormat, 39f4148b55c5d6f68b22462e3880015fefa91ae7c6Andreas Huber size_t encodedWidth, size_t encodedHeight, 40f4148b55c5d6f68b22462e3880015fefa91ae7c6Andreas Huber size_t displayWidth, size_t displayHeight) { 41f4148b55c5d6f68b22462e3880015fefa91ae7c6Andreas Huber return createRenderer( 42f4148b55c5d6f68b22462e3880015fefa91ae7c6Andreas Huber surface->getISurface(), 43f4148b55c5d6f68b22462e3880015fefa91ae7c6Andreas Huber componentName, colorFormat, encodedWidth, encodedHeight, 44f4148b55c5d6f68b22462e3880015fefa91ae7c6Andreas Huber displayWidth, displayHeight); 45f4148b55c5d6f68b22462e3880015fefa91ae7c6Andreas Huber} 46f4148b55c5d6f68b22462e3880015fefa91ae7c6Andreas Huber 471b84df1a0823fbcb9cec754311f53eaccfe85ae3Andreas Hubersp<IOMXRenderer> IOMX::createRendererFromJavaSurface( 481b84df1a0823fbcb9cec754311f53eaccfe85ae3Andreas Huber JNIEnv *env, jobject javaSurface, 491b84df1a0823fbcb9cec754311f53eaccfe85ae3Andreas Huber const char *componentName, 501b84df1a0823fbcb9cec754311f53eaccfe85ae3Andreas Huber OMX_COLOR_FORMATTYPE colorFormat, 511b84df1a0823fbcb9cec754311f53eaccfe85ae3Andreas Huber size_t encodedWidth, size_t encodedHeight, 521b84df1a0823fbcb9cec754311f53eaccfe85ae3Andreas Huber size_t displayWidth, size_t displayHeight) { 531b84df1a0823fbcb9cec754311f53eaccfe85ae3Andreas Huber jclass surfaceClass = env->FindClass("android/view/Surface"); 541b84df1a0823fbcb9cec754311f53eaccfe85ae3Andreas Huber if (surfaceClass == NULL) { 551b84df1a0823fbcb9cec754311f53eaccfe85ae3Andreas Huber LOGE("Can't find android/view/Surface"); 561b84df1a0823fbcb9cec754311f53eaccfe85ae3Andreas Huber return NULL; 571b84df1a0823fbcb9cec754311f53eaccfe85ae3Andreas Huber } 581b84df1a0823fbcb9cec754311f53eaccfe85ae3Andreas Huber 591b84df1a0823fbcb9cec754311f53eaccfe85ae3Andreas Huber jfieldID surfaceID = env->GetFieldID(surfaceClass, "mSurface", "I"); 601b84df1a0823fbcb9cec754311f53eaccfe85ae3Andreas Huber if (surfaceID == NULL) { 611b84df1a0823fbcb9cec754311f53eaccfe85ae3Andreas Huber LOGE("Can't find Surface.mSurface"); 621b84df1a0823fbcb9cec754311f53eaccfe85ae3Andreas Huber return NULL; 631b84df1a0823fbcb9cec754311f53eaccfe85ae3Andreas Huber } 641b84df1a0823fbcb9cec754311f53eaccfe85ae3Andreas Huber 651b84df1a0823fbcb9cec754311f53eaccfe85ae3Andreas Huber sp<Surface> surface = (Surface *)env->GetIntField(javaSurface, surfaceID); 661b84df1a0823fbcb9cec754311f53eaccfe85ae3Andreas Huber 671b84df1a0823fbcb9cec754311f53eaccfe85ae3Andreas Huber return createRenderer( 681b84df1a0823fbcb9cec754311f53eaccfe85ae3Andreas Huber surface, componentName, colorFormat, encodedWidth, 691b84df1a0823fbcb9cec754311f53eaccfe85ae3Andreas Huber encodedHeight, displayWidth, displayHeight); 701b84df1a0823fbcb9cec754311f53eaccfe85ae3Andreas Huber} 711b84df1a0823fbcb9cec754311f53eaccfe85ae3Andreas Huber 7220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberclass BpOMX : public BpInterface<IOMX> { 7320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberpublic: 7420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber BpOMX(const sp<IBinder> &impl) 7520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber : BpInterface<IOMX>(impl) { 7620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 7720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 78134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber virtual status_t listNodes(List<ComponentInfo> *list) { 7920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber list->clear(); 8020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 8120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber Parcel data, reply; 8220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber data.writeInterfaceToken(IOMX::getInterfaceDescriptor()); 8320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber remote()->transact(LIST_NODES, data, &reply); 8420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 8520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber int32_t n = reply.readInt32(); 8620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber for (int32_t i = 0; i < n; ++i) { 87134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber list->push_back(ComponentInfo()); 88134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber ComponentInfo &info = *--list->end(); 8920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 90134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber info.mName = reply.readString8(); 91134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber int32_t numRoles = reply.readInt32(); 92134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber for (int32_t j = 0; j < numRoles; ++j) { 93134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber info.mRoles.push_back(reply.readString8()); 94134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber } 9520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 9620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 9720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return OK; 9820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 9920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 100318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber virtual status_t allocateNode( 101318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber const char *name, const sp<IOMXObserver> &observer, node_id *node) { 10220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber Parcel data, reply; 10320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber data.writeInterfaceToken(IOMX::getInterfaceDescriptor()); 10420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber data.writeCString(name); 105318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber data.writeStrongBinder(observer->asBinder()); 10620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber remote()->transact(ALLOCATE_NODE, data, &reply); 10720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 10820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber status_t err = reply.readInt32(); 10920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber if (err == OK) { 110c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber *node = (void*)reply.readIntPtr(); 11120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } else { 11220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber *node = 0; 11320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 11420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 11520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return err; 11620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 11720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 118318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber virtual status_t freeNode(node_id node) { 11920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber Parcel data, reply; 12020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber data.writeInterfaceToken(IOMX::getInterfaceDescriptor()); 121c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber data.writeIntPtr((intptr_t)node); 12220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber remote()->transact(FREE_NODE, data, &reply); 12320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 12420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return reply.readInt32(); 12520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 12620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 127318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber virtual status_t sendCommand( 12820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber node_id node, OMX_COMMANDTYPE cmd, OMX_S32 param) { 12920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber Parcel data, reply; 13020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber data.writeInterfaceToken(IOMX::getInterfaceDescriptor()); 131c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber data.writeIntPtr((intptr_t)node); 13220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber data.writeInt32(cmd); 13320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber data.writeInt32(param); 13420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber remote()->transact(SEND_COMMAND, data, &reply); 13520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 13620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return reply.readInt32(); 13720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 13820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 139318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber virtual status_t getParameter( 14020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber node_id node, OMX_INDEXTYPE index, 14120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber void *params, size_t size) { 14220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber Parcel data, reply; 14320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber data.writeInterfaceToken(IOMX::getInterfaceDescriptor()); 144c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber data.writeIntPtr((intptr_t)node); 14520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber data.writeInt32(index); 14620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber data.writeInt32(size); 14720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber data.write(params, size); 14820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber remote()->transact(GET_PARAMETER, data, &reply); 14920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 15020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber status_t err = reply.readInt32(); 15120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber if (err != OK) { 15220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return err; 15320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 15420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 15520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber reply.read(params, size); 15620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 15720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return OK; 15820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 15920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 160318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber virtual status_t setParameter( 16120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber node_id node, OMX_INDEXTYPE index, 16220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber const void *params, size_t size) { 16320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber Parcel data, reply; 16420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber data.writeInterfaceToken(IOMX::getInterfaceDescriptor()); 165c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber data.writeIntPtr((intptr_t)node); 16620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber data.writeInt32(index); 16720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber data.writeInt32(size); 16820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber data.write(params, size); 16920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber remote()->transact(SET_PARAMETER, data, &reply); 17020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 17120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return reply.readInt32(); 17220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 17320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 174318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber virtual status_t getConfig( 175693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber node_id node, OMX_INDEXTYPE index, 176693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber void *params, size_t size) { 177693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber Parcel data, reply; 178693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber data.writeInterfaceToken(IOMX::getInterfaceDescriptor()); 179c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber data.writeIntPtr((intptr_t)node); 180693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber data.writeInt32(index); 181693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber data.writeInt32(size); 182693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber data.write(params, size); 183693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber remote()->transact(GET_CONFIG, data, &reply); 184693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 185693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber status_t err = reply.readInt32(); 186693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber if (err != OK) { 187693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber return err; 188693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 189693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 190693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber reply.read(params, size); 191693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 192693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber return OK; 193693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 194693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 195318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber virtual status_t setConfig( 196693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber node_id node, OMX_INDEXTYPE index, 197693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber const void *params, size_t size) { 198693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber Parcel data, reply; 199693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber data.writeInterfaceToken(IOMX::getInterfaceDescriptor()); 200c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber data.writeIntPtr((intptr_t)node); 201693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber data.writeInt32(index); 202693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber data.writeInt32(size); 203693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber data.write(params, size); 204693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber remote()->transact(SET_CONFIG, data, &reply); 205693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 206693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber return reply.readInt32(); 207693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 208693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 209318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber virtual status_t useBuffer( 21020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber node_id node, OMX_U32 port_index, const sp<IMemory> ¶ms, 21120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber buffer_id *buffer) { 21220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber Parcel data, reply; 21320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber data.writeInterfaceToken(IOMX::getInterfaceDescriptor()); 214c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber data.writeIntPtr((intptr_t)node); 21520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber data.writeInt32(port_index); 21620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber data.writeStrongBinder(params->asBinder()); 21720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber remote()->transact(USE_BUFFER, data, &reply); 21820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 21920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber status_t err = reply.readInt32(); 22020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber if (err != OK) { 22120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber *buffer = 0; 22220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 22320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return err; 22420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 22520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 226c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber *buffer = (void*)reply.readIntPtr(); 22720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 22820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return err; 22920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 23020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 231318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber virtual status_t allocateBuffer( 23220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber node_id node, OMX_U32 port_index, size_t size, 23320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber buffer_id *buffer) { 23420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber Parcel data, reply; 23520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber data.writeInterfaceToken(IOMX::getInterfaceDescriptor()); 236c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber data.writeIntPtr((intptr_t)node); 23720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber data.writeInt32(port_index); 23820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber data.writeInt32(size); 23920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber remote()->transact(ALLOC_BUFFER, data, &reply); 24020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 24120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber status_t err = reply.readInt32(); 24220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber if (err != OK) { 24320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber *buffer = 0; 24420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 24520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return err; 24620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 24720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 248c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber *buffer = (void*)reply.readIntPtr(); 24920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 25020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return err; 25120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 25220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 253318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber virtual status_t allocateBufferWithBackup( 25420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber node_id node, OMX_U32 port_index, const sp<IMemory> ¶ms, 25520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber buffer_id *buffer) { 25620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber Parcel data, reply; 25720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber data.writeInterfaceToken(IOMX::getInterfaceDescriptor()); 258c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber data.writeIntPtr((intptr_t)node); 25920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber data.writeInt32(port_index); 26020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber data.writeStrongBinder(params->asBinder()); 26120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber remote()->transact(ALLOC_BUFFER_WITH_BACKUP, data, &reply); 26220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 26320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber status_t err = reply.readInt32(); 26420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber if (err != OK) { 26520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber *buffer = 0; 26620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 26720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return err; 26820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 26920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 270c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber *buffer = (void*)reply.readIntPtr(); 27120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 27220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return err; 27320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 27420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 275318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber virtual status_t freeBuffer( 27620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber node_id node, OMX_U32 port_index, buffer_id buffer) { 27720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber Parcel data, reply; 27820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber data.writeInterfaceToken(IOMX::getInterfaceDescriptor()); 279c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber data.writeIntPtr((intptr_t)node); 28020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber data.writeInt32(port_index); 281c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber data.writeIntPtr((intptr_t)buffer); 28220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber remote()->transact(FREE_BUFFER, data, &reply); 28320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 28420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return reply.readInt32(); 28520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 28620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 287318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber virtual status_t fillBuffer(node_id node, buffer_id buffer) { 28820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber Parcel data, reply; 28920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber data.writeInterfaceToken(IOMX::getInterfaceDescriptor()); 290c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber data.writeIntPtr((intptr_t)node); 291c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber data.writeIntPtr((intptr_t)buffer); 29236efa039efaae4526791336cb688032d22b34becAndreas Huber remote()->transact(FILL_BUFFER, data, &reply); 29336efa039efaae4526791336cb688032d22b34becAndreas Huber 29436efa039efaae4526791336cb688032d22b34becAndreas Huber return reply.readInt32(); 29520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 29620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 297318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber virtual status_t emptyBuffer( 29820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber node_id node, 29920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber buffer_id buffer, 30020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber OMX_U32 range_offset, OMX_U32 range_length, 30120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber OMX_U32 flags, OMX_TICKS timestamp) { 30220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber Parcel data, reply; 30320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber data.writeInterfaceToken(IOMX::getInterfaceDescriptor()); 304c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber data.writeIntPtr((intptr_t)node); 305c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber data.writeIntPtr((intptr_t)buffer); 30620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber data.writeInt32(range_offset); 30720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber data.writeInt32(range_length); 30820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber data.writeInt32(flags); 30920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber data.writeInt64(timestamp); 31036efa039efaae4526791336cb688032d22b34becAndreas Huber remote()->transact(EMPTY_BUFFER, data, &reply); 31136efa039efaae4526791336cb688032d22b34becAndreas Huber 31236efa039efaae4526791336cb688032d22b34becAndreas Huber return reply.readInt32(); 31320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 3148b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber 315318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber virtual status_t getExtensionIndex( 316693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber node_id node, 317693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber const char *parameter_name, 318693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber OMX_INDEXTYPE *index) { 319693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber Parcel data, reply; 320693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber data.writeInterfaceToken(IOMX::getInterfaceDescriptor()); 321c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber data.writeIntPtr((intptr_t)node); 322693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber data.writeCString(parameter_name); 323693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 324693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber remote()->transact(GET_EXTENSION_INDEX, data, &reply); 325693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 326693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber status_t err = reply.readInt32(); 327693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber if (err == OK) { 328693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber *index = static_cast<OMX_INDEXTYPE>(reply.readInt32()); 329693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } else { 330693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber *index = OMX_IndexComponentStartUnused; 331693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 332693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 333693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber return err; 334693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 335693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 3368b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber virtual sp<IOMXRenderer> createRenderer( 3378b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber const sp<ISurface> &surface, 3388b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber const char *componentName, 3398b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber OMX_COLOR_FORMATTYPE colorFormat, 3408b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber size_t encodedWidth, size_t encodedHeight, 3418b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber size_t displayWidth, size_t displayHeight) { 3428b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber Parcel data, reply; 3438b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber data.writeInterfaceToken(IOMX::getInterfaceDescriptor()); 3448b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber 3458b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber data.writeStrongBinder(surface->asBinder()); 3468b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber data.writeCString(componentName); 3478b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber data.writeInt32(colorFormat); 3488b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber data.writeInt32(encodedWidth); 3498b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber data.writeInt32(encodedHeight); 3508b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber data.writeInt32(displayWidth); 3518b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber data.writeInt32(displayHeight); 3528b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber 3538b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber remote()->transact(CREATE_RENDERER, data, &reply); 3548b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber 3558b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber return interface_cast<IOMXRenderer>(reply.readStrongBinder()); 3568b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber } 35720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}; 35820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 35920111aa043c5f404472bc63b90bc5aad906b1101Andreas HuberIMPLEMENT_META_INTERFACE(OMX, "android.hardware.IOMX"); 36020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 36120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber//////////////////////////////////////////////////////////////////////////////// 36220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 36320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#define CHECK_INTERFACE(interface, data, reply) \ 36420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber do { if (!data.enforceInterface(interface::getInterfaceDescriptor())) { \ 36520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber LOGW("Call incorrectly routed to " #interface); \ 36620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return PERMISSION_DENIED; \ 36720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } } while (0) 36820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 36920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberstatus_t BnOMX::onTransact( 37020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber uint32_t code, const Parcel &data, Parcel *reply, uint32_t flags) { 37120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber switch (code) { 37220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber case LIST_NODES: 37320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber { 37420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber CHECK_INTERFACE(IOMX, data, reply); 37520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 376134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber List<ComponentInfo> list; 377318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber listNodes(&list); 37820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 37920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber reply->writeInt32(list.size()); 380134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber for (List<ComponentInfo>::iterator it = list.begin(); 38120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber it != list.end(); ++it) { 382134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber ComponentInfo &cur = *it; 383134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber 384134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber reply->writeString8(cur.mName); 385134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber reply->writeInt32(cur.mRoles.size()); 386134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber for (List<String8>::iterator role_it = cur.mRoles.begin(); 387134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber role_it != cur.mRoles.end(); ++role_it) { 388134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber reply->writeString8(*role_it); 389134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber } 39020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 39120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 39220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return NO_ERROR; 39320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 39420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 39520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber case ALLOCATE_NODE: 39620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber { 39720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber CHECK_INTERFACE(IOMX, data, reply); 39820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 399318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber const char *name = data.readCString(); 400318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 401318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber sp<IOMXObserver> observer = 402318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber interface_cast<IOMXObserver>(data.readStrongBinder()); 403318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 40420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber node_id node; 405318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 406318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber status_t err = allocateNode(name, observer, &node); 40720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber reply->writeInt32(err); 40820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber if (err == OK) { 409c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber reply->writeIntPtr((intptr_t)node); 41020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 41120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 41220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return NO_ERROR; 41320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 41420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 41520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber case FREE_NODE: 41620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber { 41720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber CHECK_INTERFACE(IOMX, data, reply); 41820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 419c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber node_id node = (void*)data.readIntPtr(); 42020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 421318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber reply->writeInt32(freeNode(node)); 42220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 42320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return NO_ERROR; 42420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 42520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 42620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber case SEND_COMMAND: 42720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber { 42820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber CHECK_INTERFACE(IOMX, data, reply); 42920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 430c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber node_id node = (void*)data.readIntPtr(); 43120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 43220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber OMX_COMMANDTYPE cmd = 43320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber static_cast<OMX_COMMANDTYPE>(data.readInt32()); 43420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 43520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber OMX_S32 param = data.readInt32(); 436318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber reply->writeInt32(sendCommand(node, cmd, param)); 43720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 43820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return NO_ERROR; 43920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 44020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 44120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber case GET_PARAMETER: 44220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber { 44320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber CHECK_INTERFACE(IOMX, data, reply); 44420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 445c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber node_id node = (void*)data.readIntPtr(); 44620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber OMX_INDEXTYPE index = static_cast<OMX_INDEXTYPE>(data.readInt32()); 44720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 44820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber size_t size = data.readInt32(); 44920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 45020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber // XXX I am not happy with this but Parcel::readInplace didn't work. 45120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber void *params = malloc(size); 45220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber data.read(params, size); 45320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 454318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber status_t err = getParameter(node, index, params, size); 45520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 45620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber reply->writeInt32(err); 45720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 45820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber if (err == OK) { 45920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber reply->write(params, size); 46020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 46120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 46220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber free(params); 46320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber params = NULL; 46420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 46520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return NO_ERROR; 46620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 46720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 46820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber case SET_PARAMETER: 46920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber { 47020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber CHECK_INTERFACE(IOMX, data, reply); 47120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 472c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber node_id node = (void*)data.readIntPtr(); 47320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber OMX_INDEXTYPE index = static_cast<OMX_INDEXTYPE>(data.readInt32()); 47420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 47520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber size_t size = data.readInt32(); 47620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber void *params = const_cast<void *>(data.readInplace(size)); 47720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 478318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber reply->writeInt32(setParameter(node, index, params, size)); 47920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 48020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return NO_ERROR; 48120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 48220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 483693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber case GET_CONFIG: 484693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber { 485693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK_INTERFACE(IOMX, data, reply); 486693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 487c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber node_id node = (void*)data.readIntPtr(); 488693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber OMX_INDEXTYPE index = static_cast<OMX_INDEXTYPE>(data.readInt32()); 489693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 490693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber size_t size = data.readInt32(); 491693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 492693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber // XXX I am not happy with this but Parcel::readInplace didn't work. 493693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber void *params = malloc(size); 494693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber data.read(params, size); 495693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 496318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber status_t err = getConfig(node, index, params, size); 497693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 498693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber reply->writeInt32(err); 499693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 500693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber if (err == OK) { 501693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber reply->write(params, size); 502693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 503693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 504693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber free(params); 505693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber params = NULL; 506693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 507693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber return NO_ERROR; 508693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 509693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 510693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber case SET_CONFIG: 511693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber { 512693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK_INTERFACE(IOMX, data, reply); 513693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 514c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber node_id node = (void*)data.readIntPtr(); 515693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber OMX_INDEXTYPE index = static_cast<OMX_INDEXTYPE>(data.readInt32()); 516693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 517693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber size_t size = data.readInt32(); 518693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber void *params = const_cast<void *>(data.readInplace(size)); 519693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 520318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber reply->writeInt32(setConfig(node, index, params, size)); 521693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 522693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber return NO_ERROR; 523693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 524693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 52520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber case USE_BUFFER: 52620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber { 52720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber CHECK_INTERFACE(IOMX, data, reply); 52820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 529c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber node_id node = (void*)data.readIntPtr(); 53020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber OMX_U32 port_index = data.readInt32(); 53120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber sp<IMemory> params = 53220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber interface_cast<IMemory>(data.readStrongBinder()); 53320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 53420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber buffer_id buffer; 535318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber status_t err = useBuffer(node, port_index, params, &buffer); 53620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber reply->writeInt32(err); 53720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 53820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber if (err == OK) { 539c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber reply->writeIntPtr((intptr_t)buffer); 54020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 54120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 54220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return NO_ERROR; 54320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 54420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 54520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber case ALLOC_BUFFER: 54620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber { 54720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber CHECK_INTERFACE(IOMX, data, reply); 54820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 549c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber node_id node = (void*)data.readIntPtr(); 55020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber OMX_U32 port_index = data.readInt32(); 55120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber size_t size = data.readInt32(); 55220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 55320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber buffer_id buffer; 554318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber status_t err = allocateBuffer(node, port_index, size, &buffer); 55520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber reply->writeInt32(err); 55620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 55720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber if (err == OK) { 558c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber reply->writeIntPtr((intptr_t)buffer); 55920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 56020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 56120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return NO_ERROR; 56220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 56320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 56420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber case ALLOC_BUFFER_WITH_BACKUP: 56520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber { 56620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber CHECK_INTERFACE(IOMX, data, reply); 56720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 568c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber node_id node = (void*)data.readIntPtr(); 56920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber OMX_U32 port_index = data.readInt32(); 57020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber sp<IMemory> params = 57120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber interface_cast<IMemory>(data.readStrongBinder()); 57220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 57320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber buffer_id buffer; 574318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber status_t err = allocateBufferWithBackup( 57520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber node, port_index, params, &buffer); 57620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 57720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber reply->writeInt32(err); 57820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 57920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber if (err == OK) { 580c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber reply->writeIntPtr((intptr_t)buffer); 58120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 58220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 58320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return NO_ERROR; 58420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 58520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 58620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber case FREE_BUFFER: 58720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber { 58820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber CHECK_INTERFACE(IOMX, data, reply); 58920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 590c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber node_id node = (void*)data.readIntPtr(); 59120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber OMX_U32 port_index = data.readInt32(); 592c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber buffer_id buffer = (void*)data.readIntPtr(); 593318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber reply->writeInt32(freeBuffer(node, port_index, buffer)); 59420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 59520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return NO_ERROR; 59620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 59720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 59820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber case FILL_BUFFER: 59920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber { 60020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber CHECK_INTERFACE(IOMX, data, reply); 60120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 602c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber node_id node = (void*)data.readIntPtr(); 603c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber buffer_id buffer = (void*)data.readIntPtr(); 604318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber reply->writeInt32(fillBuffer(node, buffer)); 60520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 60620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return NO_ERROR; 60720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 60820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 60920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber case EMPTY_BUFFER: 61020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber { 61120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber CHECK_INTERFACE(IOMX, data, reply); 61220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 613c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber node_id node = (void*)data.readIntPtr(); 614c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber buffer_id buffer = (void*)data.readIntPtr(); 61520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber OMX_U32 range_offset = data.readInt32(); 61620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber OMX_U32 range_length = data.readInt32(); 61720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber OMX_U32 flags = data.readInt32(); 61820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber OMX_TICKS timestamp = data.readInt64(); 61920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 62036efa039efaae4526791336cb688032d22b34becAndreas Huber reply->writeInt32( 621318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber emptyBuffer( 62236efa039efaae4526791336cb688032d22b34becAndreas Huber node, buffer, range_offset, range_length, 62336efa039efaae4526791336cb688032d22b34becAndreas Huber flags, timestamp)); 62420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 62520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return NO_ERROR; 62620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 62720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 628693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber case GET_EXTENSION_INDEX: 629693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber { 630693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK_INTERFACE(IOMX, data, reply); 631693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 632c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber node_id node = (void*)data.readIntPtr(); 633693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber const char *parameter_name = data.readCString(); 634693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 635693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber OMX_INDEXTYPE index; 636318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber status_t err = getExtensionIndex(node, parameter_name, &index); 637693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 638693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber reply->writeInt32(err); 639693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 640693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber if (err == OK) { 641693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber reply->writeInt32(index); 642693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 643693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 644693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber return OK; 645693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 646693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 6478b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber case CREATE_RENDERER: 6488b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber { 6498b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber CHECK_INTERFACE(IOMX, data, reply); 6508b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber 6518b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber sp<ISurface> isurface = 6528b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber interface_cast<ISurface>(data.readStrongBinder()); 6538b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber 6548b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber const char *componentName = data.readCString(); 6558b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber 6568b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber OMX_COLOR_FORMATTYPE colorFormat = 6578b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber static_cast<OMX_COLOR_FORMATTYPE>(data.readInt32()); 6588b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber 6598b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber size_t encodedWidth = (size_t)data.readInt32(); 6608b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber size_t encodedHeight = (size_t)data.readInt32(); 6618b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber size_t displayWidth = (size_t)data.readInt32(); 6628b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber size_t displayHeight = (size_t)data.readInt32(); 6638b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber 6648b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber sp<IOMXRenderer> renderer = 6658b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber createRenderer(isurface, componentName, colorFormat, 6668b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber encodedWidth, encodedHeight, 6678b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber displayWidth, displayHeight); 6688b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber 6698b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber reply->writeStrongBinder(renderer->asBinder()); 6708b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber 6718b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber return OK; 6728b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber } 6738b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber 67420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber default: 67520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return BBinder::onTransact(code, data, reply, flags); 67620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 67720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber} 67820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 67920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber//////////////////////////////////////////////////////////////////////////////// 68020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 68120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberclass BpOMXObserver : public BpInterface<IOMXObserver> { 68220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberpublic: 68320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber BpOMXObserver(const sp<IBinder> &impl) 68420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber : BpInterface<IOMXObserver>(impl) { 68520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 68620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 687318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber virtual void onMessage(const omx_message &msg) { 68820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber Parcel data, reply; 68920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber data.writeInterfaceToken(IOMXObserver::getInterfaceDescriptor()); 69020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber data.write(&msg, sizeof(msg)); 69120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 69220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber remote()->transact(OBSERVER_ON_MSG, data, &reply, IBinder::FLAG_ONEWAY); 69320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 69420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}; 69520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 69620111aa043c5f404472bc63b90bc5aad906b1101Andreas HuberIMPLEMENT_META_INTERFACE(OMXObserver, "android.hardware.IOMXObserver"); 69720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 69820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberstatus_t BnOMXObserver::onTransact( 69920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber uint32_t code, const Parcel &data, Parcel *reply, uint32_t flags) { 70020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber switch (code) { 70120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber case OBSERVER_ON_MSG: 70220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber { 70320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber CHECK_INTERFACE(IOMXObserver, data, reply); 70420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 70520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber omx_message msg; 70620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber data.read(&msg, sizeof(msg)); 70720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 70820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber // XXX Could use readInplace maybe? 709318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber onMessage(msg); 71020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 71120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return NO_ERROR; 71220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 71320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 71420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber default: 71520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return BBinder::onTransact(code, data, reply, flags); 71620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 71720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber} 71820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 7198b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber//////////////////////////////////////////////////////////////////////////////// 7208b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber 7218b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huberclass BpOMXRenderer : public BpInterface<IOMXRenderer> { 7228b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huberpublic: 7238b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber BpOMXRenderer(const sp<IBinder> &impl) 7248b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber : BpInterface<IOMXRenderer>(impl) { 7258b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber } 7268b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber 7278b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber virtual void render(IOMX::buffer_id buffer) { 7288b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber Parcel data, reply; 7298b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber data.writeInterfaceToken(IOMXRenderer::getInterfaceDescriptor()); 730c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber data.writeIntPtr((intptr_t)buffer); 7318b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber 7328b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber // NOTE: Do NOT make this a ONE_WAY call, it must be synchronous 7338b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber // so that the caller knows when to recycle the buffer. 7348b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber remote()->transact(RENDERER_RENDER, data, &reply); 7358b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber } 7368b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber}; 7378b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber 7388b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas HuberIMPLEMENT_META_INTERFACE(OMXRenderer, "android.hardware.IOMXRenderer"); 7398b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber 7408b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huberstatus_t BnOMXRenderer::onTransact( 7418b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber uint32_t code, const Parcel &data, Parcel *reply, uint32_t flags) { 7428b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber switch (code) { 7438b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber case RENDERER_RENDER: 7448b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber { 7458b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber CHECK_INTERFACE(IOMXRenderer, data, reply); 7468b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber 747c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber IOMX::buffer_id buffer = (void*)data.readIntPtr(); 7488b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber 7498b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber render(buffer); 7508b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber 7518b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber return NO_ERROR; 7528b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber } 7538b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber 7548b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber default: 7558b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber return BBinder::onTransact(code, data, reply, flags); 7568b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber } 7578b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber} 7588b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber 75920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber} // namespace android 760