IOMX.cpp revision 7eaa9c9385535b651064e02d05a8ffa4b2359281
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, 157eaa9c9385535b651064e02d05a8ffa4b2359281Andreas Huber LIVES_LOCALLY, 1620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber LIST_NODES, 1720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber ALLOCATE_NODE, 1820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber FREE_NODE, 1920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber SEND_COMMAND, 2020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber GET_PARAMETER, 2120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber SET_PARAMETER, 22693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber GET_CONFIG, 23693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber SET_CONFIG, 2420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber USE_BUFFER, 2520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber ALLOC_BUFFER, 2620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber ALLOC_BUFFER_WITH_BACKUP, 2720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber FREE_BUFFER, 2820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber FILL_BUFFER, 2920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber EMPTY_BUFFER, 30693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber GET_EXTENSION_INDEX, 318b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber CREATE_RENDERER, 3220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber OBSERVER_ON_MSG, 338b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber RENDERER_RENDER, 3420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}; 3520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 36f4148b55c5d6f68b22462e3880015fefa91ae7c6Andreas Hubersp<IOMXRenderer> IOMX::createRenderer( 37f4148b55c5d6f68b22462e3880015fefa91ae7c6Andreas Huber const sp<Surface> &surface, 38f4148b55c5d6f68b22462e3880015fefa91ae7c6Andreas Huber const char *componentName, 39f4148b55c5d6f68b22462e3880015fefa91ae7c6Andreas Huber OMX_COLOR_FORMATTYPE colorFormat, 40f4148b55c5d6f68b22462e3880015fefa91ae7c6Andreas Huber size_t encodedWidth, size_t encodedHeight, 41f4148b55c5d6f68b22462e3880015fefa91ae7c6Andreas Huber size_t displayWidth, size_t displayHeight) { 42f4148b55c5d6f68b22462e3880015fefa91ae7c6Andreas Huber return createRenderer( 43f4148b55c5d6f68b22462e3880015fefa91ae7c6Andreas Huber surface->getISurface(), 44f4148b55c5d6f68b22462e3880015fefa91ae7c6Andreas Huber componentName, colorFormat, encodedWidth, encodedHeight, 45f4148b55c5d6f68b22462e3880015fefa91ae7c6Andreas Huber displayWidth, displayHeight); 46f4148b55c5d6f68b22462e3880015fefa91ae7c6Andreas Huber} 47f4148b55c5d6f68b22462e3880015fefa91ae7c6Andreas Huber 481b84df1a0823fbcb9cec754311f53eaccfe85ae3Andreas Hubersp<IOMXRenderer> IOMX::createRendererFromJavaSurface( 491b84df1a0823fbcb9cec754311f53eaccfe85ae3Andreas Huber JNIEnv *env, jobject javaSurface, 501b84df1a0823fbcb9cec754311f53eaccfe85ae3Andreas Huber const char *componentName, 511b84df1a0823fbcb9cec754311f53eaccfe85ae3Andreas Huber OMX_COLOR_FORMATTYPE colorFormat, 521b84df1a0823fbcb9cec754311f53eaccfe85ae3Andreas Huber size_t encodedWidth, size_t encodedHeight, 531b84df1a0823fbcb9cec754311f53eaccfe85ae3Andreas Huber size_t displayWidth, size_t displayHeight) { 541b84df1a0823fbcb9cec754311f53eaccfe85ae3Andreas Huber jclass surfaceClass = env->FindClass("android/view/Surface"); 551b84df1a0823fbcb9cec754311f53eaccfe85ae3Andreas Huber if (surfaceClass == NULL) { 561b84df1a0823fbcb9cec754311f53eaccfe85ae3Andreas Huber LOGE("Can't find android/view/Surface"); 571b84df1a0823fbcb9cec754311f53eaccfe85ae3Andreas Huber return NULL; 581b84df1a0823fbcb9cec754311f53eaccfe85ae3Andreas Huber } 591b84df1a0823fbcb9cec754311f53eaccfe85ae3Andreas Huber 601b84df1a0823fbcb9cec754311f53eaccfe85ae3Andreas Huber jfieldID surfaceID = env->GetFieldID(surfaceClass, "mSurface", "I"); 611b84df1a0823fbcb9cec754311f53eaccfe85ae3Andreas Huber if (surfaceID == NULL) { 621b84df1a0823fbcb9cec754311f53eaccfe85ae3Andreas Huber LOGE("Can't find Surface.mSurface"); 631b84df1a0823fbcb9cec754311f53eaccfe85ae3Andreas Huber return NULL; 641b84df1a0823fbcb9cec754311f53eaccfe85ae3Andreas Huber } 651b84df1a0823fbcb9cec754311f53eaccfe85ae3Andreas Huber 661b84df1a0823fbcb9cec754311f53eaccfe85ae3Andreas Huber sp<Surface> surface = (Surface *)env->GetIntField(javaSurface, surfaceID); 671b84df1a0823fbcb9cec754311f53eaccfe85ae3Andreas Huber 681b84df1a0823fbcb9cec754311f53eaccfe85ae3Andreas Huber return createRenderer( 691b84df1a0823fbcb9cec754311f53eaccfe85ae3Andreas Huber surface, componentName, colorFormat, encodedWidth, 701b84df1a0823fbcb9cec754311f53eaccfe85ae3Andreas Huber encodedHeight, displayWidth, displayHeight); 711b84df1a0823fbcb9cec754311f53eaccfe85ae3Andreas Huber} 721b84df1a0823fbcb9cec754311f53eaccfe85ae3Andreas Huber 7320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberclass BpOMX : public BpInterface<IOMX> { 7420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberpublic: 7520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber BpOMX(const sp<IBinder> &impl) 7620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber : BpInterface<IOMX>(impl) { 7720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 7820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 797eaa9c9385535b651064e02d05a8ffa4b2359281Andreas Huber virtual bool livesLocally(pid_t pid) { 807eaa9c9385535b651064e02d05a8ffa4b2359281Andreas Huber Parcel data, reply; 817eaa9c9385535b651064e02d05a8ffa4b2359281Andreas Huber data.writeInterfaceToken(IOMX::getInterfaceDescriptor()); 827eaa9c9385535b651064e02d05a8ffa4b2359281Andreas Huber data.writeInt32(pid); 837eaa9c9385535b651064e02d05a8ffa4b2359281Andreas Huber remote()->transact(LIVES_LOCALLY, data, &reply); 847eaa9c9385535b651064e02d05a8ffa4b2359281Andreas Huber 857eaa9c9385535b651064e02d05a8ffa4b2359281Andreas Huber return reply.readInt32() != 0; 867eaa9c9385535b651064e02d05a8ffa4b2359281Andreas Huber } 877eaa9c9385535b651064e02d05a8ffa4b2359281Andreas Huber 88134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber virtual status_t listNodes(List<ComponentInfo> *list) { 8920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber list->clear(); 9020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 9120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber Parcel data, reply; 9220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber data.writeInterfaceToken(IOMX::getInterfaceDescriptor()); 9320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber remote()->transact(LIST_NODES, data, &reply); 9420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 9520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber int32_t n = reply.readInt32(); 9620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber for (int32_t i = 0; i < n; ++i) { 97134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber list->push_back(ComponentInfo()); 98134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber ComponentInfo &info = *--list->end(); 9920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 100134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber info.mName = reply.readString8(); 101134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber int32_t numRoles = reply.readInt32(); 102134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber for (int32_t j = 0; j < numRoles; ++j) { 103134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber info.mRoles.push_back(reply.readString8()); 104134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber } 10520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 10620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 10720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return OK; 10820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 10920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 110318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber virtual status_t allocateNode( 111318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber const char *name, const sp<IOMXObserver> &observer, node_id *node) { 11220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber Parcel data, reply; 11320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber data.writeInterfaceToken(IOMX::getInterfaceDescriptor()); 11420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber data.writeCString(name); 115318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber data.writeStrongBinder(observer->asBinder()); 11620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber remote()->transact(ALLOCATE_NODE, data, &reply); 11720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 11820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber status_t err = reply.readInt32(); 11920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber if (err == OK) { 120c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber *node = (void*)reply.readIntPtr(); 12120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } else { 12220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber *node = 0; 12320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 12420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 12520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return err; 12620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 12720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 128318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber virtual status_t freeNode(node_id node) { 12920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber Parcel data, reply; 13020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber data.writeInterfaceToken(IOMX::getInterfaceDescriptor()); 131c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber data.writeIntPtr((intptr_t)node); 13220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber remote()->transact(FREE_NODE, data, &reply); 13320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 13420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return reply.readInt32(); 13520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 13620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 137318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber virtual status_t sendCommand( 13820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber node_id node, OMX_COMMANDTYPE cmd, OMX_S32 param) { 13920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber Parcel data, reply; 14020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber data.writeInterfaceToken(IOMX::getInterfaceDescriptor()); 141c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber data.writeIntPtr((intptr_t)node); 14220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber data.writeInt32(cmd); 14320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber data.writeInt32(param); 14420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber remote()->transact(SEND_COMMAND, data, &reply); 14520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 14620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return reply.readInt32(); 14720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 14820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 149318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber virtual status_t getParameter( 15020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber node_id node, OMX_INDEXTYPE index, 15120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber void *params, size_t size) { 15220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber Parcel data, reply; 15320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber data.writeInterfaceToken(IOMX::getInterfaceDescriptor()); 154c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber data.writeIntPtr((intptr_t)node); 15520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber data.writeInt32(index); 15620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber data.writeInt32(size); 15720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber data.write(params, size); 15820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber remote()->transact(GET_PARAMETER, data, &reply); 15920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 16020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber status_t err = reply.readInt32(); 16120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber if (err != OK) { 16220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return err; 16320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 16420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 16520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber reply.read(params, size); 16620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 16720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return OK; 16820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 16920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 170318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber virtual status_t setParameter( 17120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber node_id node, OMX_INDEXTYPE index, 17220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber const void *params, size_t size) { 17320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber Parcel data, reply; 17420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber data.writeInterfaceToken(IOMX::getInterfaceDescriptor()); 175c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber data.writeIntPtr((intptr_t)node); 17620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber data.writeInt32(index); 17720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber data.writeInt32(size); 17820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber data.write(params, size); 17920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber remote()->transact(SET_PARAMETER, data, &reply); 18020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 18120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return reply.readInt32(); 18220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 18320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 184318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber virtual status_t getConfig( 185693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber node_id node, OMX_INDEXTYPE index, 186693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber void *params, size_t size) { 187693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber Parcel data, reply; 188693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber data.writeInterfaceToken(IOMX::getInterfaceDescriptor()); 189c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber data.writeIntPtr((intptr_t)node); 190693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber data.writeInt32(index); 191693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber data.writeInt32(size); 192693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber data.write(params, size); 193693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber remote()->transact(GET_CONFIG, data, &reply); 194693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 195693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber status_t err = reply.readInt32(); 196693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber if (err != OK) { 197693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber return err; 198693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 199693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 200693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber reply.read(params, size); 201693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 202693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber return OK; 203693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 204693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 205318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber virtual status_t setConfig( 206693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber node_id node, OMX_INDEXTYPE index, 207693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber const void *params, size_t size) { 208693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber Parcel data, reply; 209693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber data.writeInterfaceToken(IOMX::getInterfaceDescriptor()); 210c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber data.writeIntPtr((intptr_t)node); 211693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber data.writeInt32(index); 212693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber data.writeInt32(size); 213693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber data.write(params, size); 214693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber remote()->transact(SET_CONFIG, data, &reply); 215693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 216693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber return reply.readInt32(); 217693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 218693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 219318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber virtual status_t useBuffer( 22020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber node_id node, OMX_U32 port_index, const sp<IMemory> ¶ms, 22120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber buffer_id *buffer) { 22220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber Parcel data, reply; 22320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber data.writeInterfaceToken(IOMX::getInterfaceDescriptor()); 224c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber data.writeIntPtr((intptr_t)node); 22520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber data.writeInt32(port_index); 22620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber data.writeStrongBinder(params->asBinder()); 22720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber remote()->transact(USE_BUFFER, data, &reply); 22820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 22920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber status_t err = reply.readInt32(); 23020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber if (err != OK) { 23120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber *buffer = 0; 23220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 23320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return err; 23420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 23520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 236c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber *buffer = (void*)reply.readIntPtr(); 23720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 23820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return err; 23920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 24020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 241318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber virtual status_t allocateBuffer( 24220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber node_id node, OMX_U32 port_index, size_t size, 24320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber buffer_id *buffer) { 24420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber Parcel data, reply; 24520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber data.writeInterfaceToken(IOMX::getInterfaceDescriptor()); 246c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber data.writeIntPtr((intptr_t)node); 24720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber data.writeInt32(port_index); 24820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber data.writeInt32(size); 24920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber remote()->transact(ALLOC_BUFFER, data, &reply); 25020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 25120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber status_t err = reply.readInt32(); 25220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber if (err != OK) { 25320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber *buffer = 0; 25420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 25520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return err; 25620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 25720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 258c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber *buffer = (void*)reply.readIntPtr(); 25920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 26020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return err; 26120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 26220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 263318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber virtual status_t allocateBufferWithBackup( 26420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber node_id node, OMX_U32 port_index, const sp<IMemory> ¶ms, 26520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber buffer_id *buffer) { 26620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber Parcel data, reply; 26720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber data.writeInterfaceToken(IOMX::getInterfaceDescriptor()); 268c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber data.writeIntPtr((intptr_t)node); 26920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber data.writeInt32(port_index); 27020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber data.writeStrongBinder(params->asBinder()); 27120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber remote()->transact(ALLOC_BUFFER_WITH_BACKUP, data, &reply); 27220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 27320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber status_t err = reply.readInt32(); 27420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber if (err != OK) { 27520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber *buffer = 0; 27620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 27720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return err; 27820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 27920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 280c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber *buffer = (void*)reply.readIntPtr(); 28120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 28220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return err; 28320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 28420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 285318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber virtual status_t freeBuffer( 28620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber node_id node, OMX_U32 port_index, buffer_id buffer) { 28720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber Parcel data, reply; 28820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber data.writeInterfaceToken(IOMX::getInterfaceDescriptor()); 289c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber data.writeIntPtr((intptr_t)node); 29020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber data.writeInt32(port_index); 291c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber data.writeIntPtr((intptr_t)buffer); 29220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber remote()->transact(FREE_BUFFER, data, &reply); 29320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 29420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return reply.readInt32(); 29520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 29620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 297318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber virtual status_t fillBuffer(node_id node, buffer_id buffer) { 29820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber Parcel data, reply; 29920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber data.writeInterfaceToken(IOMX::getInterfaceDescriptor()); 300c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber data.writeIntPtr((intptr_t)node); 301c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber data.writeIntPtr((intptr_t)buffer); 30236efa039efaae4526791336cb688032d22b34becAndreas Huber remote()->transact(FILL_BUFFER, data, &reply); 30336efa039efaae4526791336cb688032d22b34becAndreas Huber 30436efa039efaae4526791336cb688032d22b34becAndreas Huber return reply.readInt32(); 30520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 30620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 307318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber virtual status_t emptyBuffer( 30820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber node_id node, 30920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber buffer_id buffer, 31020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber OMX_U32 range_offset, OMX_U32 range_length, 31120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber OMX_U32 flags, OMX_TICKS timestamp) { 31220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber Parcel data, reply; 31320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber data.writeInterfaceToken(IOMX::getInterfaceDescriptor()); 314c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber data.writeIntPtr((intptr_t)node); 315c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber data.writeIntPtr((intptr_t)buffer); 31620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber data.writeInt32(range_offset); 31720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber data.writeInt32(range_length); 31820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber data.writeInt32(flags); 31920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber data.writeInt64(timestamp); 32036efa039efaae4526791336cb688032d22b34becAndreas Huber remote()->transact(EMPTY_BUFFER, data, &reply); 32136efa039efaae4526791336cb688032d22b34becAndreas Huber 32236efa039efaae4526791336cb688032d22b34becAndreas Huber return reply.readInt32(); 32320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 3248b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber 325318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber virtual status_t getExtensionIndex( 326693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber node_id node, 327693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber const char *parameter_name, 328693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber OMX_INDEXTYPE *index) { 329693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber Parcel data, reply; 330693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber data.writeInterfaceToken(IOMX::getInterfaceDescriptor()); 331c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber data.writeIntPtr((intptr_t)node); 332693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber data.writeCString(parameter_name); 333693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 334693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber remote()->transact(GET_EXTENSION_INDEX, data, &reply); 335693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 336693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber status_t err = reply.readInt32(); 337693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber if (err == OK) { 338693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber *index = static_cast<OMX_INDEXTYPE>(reply.readInt32()); 339693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } else { 340693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber *index = OMX_IndexComponentStartUnused; 341693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 342693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 343693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber return err; 344693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 345693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 3468b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber virtual sp<IOMXRenderer> createRenderer( 3478b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber const sp<ISurface> &surface, 3488b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber const char *componentName, 3498b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber OMX_COLOR_FORMATTYPE colorFormat, 3508b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber size_t encodedWidth, size_t encodedHeight, 3518b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber size_t displayWidth, size_t displayHeight) { 3528b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber Parcel data, reply; 3538b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber data.writeInterfaceToken(IOMX::getInterfaceDescriptor()); 3548b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber 3558b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber data.writeStrongBinder(surface->asBinder()); 3568b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber data.writeCString(componentName); 3578b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber data.writeInt32(colorFormat); 3588b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber data.writeInt32(encodedWidth); 3598b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber data.writeInt32(encodedHeight); 3608b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber data.writeInt32(displayWidth); 3618b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber data.writeInt32(displayHeight); 3628b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber 3638b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber remote()->transact(CREATE_RENDERER, data, &reply); 3648b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber 3658b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber return interface_cast<IOMXRenderer>(reply.readStrongBinder()); 3668b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber } 36720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}; 36820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 36920111aa043c5f404472bc63b90bc5aad906b1101Andreas HuberIMPLEMENT_META_INTERFACE(OMX, "android.hardware.IOMX"); 37020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 37120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber//////////////////////////////////////////////////////////////////////////////// 37220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 37320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#define CHECK_INTERFACE(interface, data, reply) \ 37420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber do { if (!data.enforceInterface(interface::getInterfaceDescriptor())) { \ 37520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber LOGW("Call incorrectly routed to " #interface); \ 37620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return PERMISSION_DENIED; \ 37720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } } while (0) 37820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 37920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberstatus_t BnOMX::onTransact( 38020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber uint32_t code, const Parcel &data, Parcel *reply, uint32_t flags) { 38120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber switch (code) { 3827eaa9c9385535b651064e02d05a8ffa4b2359281Andreas Huber case LIVES_LOCALLY: 3837eaa9c9385535b651064e02d05a8ffa4b2359281Andreas Huber { 3847eaa9c9385535b651064e02d05a8ffa4b2359281Andreas Huber CHECK_INTERFACE(IOMX, data, reply); 3857eaa9c9385535b651064e02d05a8ffa4b2359281Andreas Huber reply->writeInt32(livesLocally((pid_t)data.readInt32())); 3867eaa9c9385535b651064e02d05a8ffa4b2359281Andreas Huber 3877eaa9c9385535b651064e02d05a8ffa4b2359281Andreas Huber return OK; 3887eaa9c9385535b651064e02d05a8ffa4b2359281Andreas Huber } 3897eaa9c9385535b651064e02d05a8ffa4b2359281Andreas Huber 39020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber case LIST_NODES: 39120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber { 39220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber CHECK_INTERFACE(IOMX, data, reply); 39320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 394134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber List<ComponentInfo> list; 395318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber listNodes(&list); 39620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 39720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber reply->writeInt32(list.size()); 398134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber for (List<ComponentInfo>::iterator it = list.begin(); 39920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber it != list.end(); ++it) { 400134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber ComponentInfo &cur = *it; 401134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber 402134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber reply->writeString8(cur.mName); 403134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber reply->writeInt32(cur.mRoles.size()); 404134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber for (List<String8>::iterator role_it = cur.mRoles.begin(); 405134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber role_it != cur.mRoles.end(); ++role_it) { 406134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber reply->writeString8(*role_it); 407134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber } 40820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 40920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 41020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return NO_ERROR; 41120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 41220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 41320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber case ALLOCATE_NODE: 41420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber { 41520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber CHECK_INTERFACE(IOMX, data, reply); 41620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 417318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber const char *name = data.readCString(); 418318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 419318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber sp<IOMXObserver> observer = 420318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber interface_cast<IOMXObserver>(data.readStrongBinder()); 421318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 42220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber node_id node; 423318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 424318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber status_t err = allocateNode(name, observer, &node); 42520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber reply->writeInt32(err); 42620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber if (err == OK) { 427c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber reply->writeIntPtr((intptr_t)node); 42820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 4297eaa9c9385535b651064e02d05a8ffa4b2359281Andreas Huber 43020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return NO_ERROR; 43120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 43220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 43320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber case FREE_NODE: 43420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber { 43520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber CHECK_INTERFACE(IOMX, data, reply); 43620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 437c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber node_id node = (void*)data.readIntPtr(); 43820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 439318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber reply->writeInt32(freeNode(node)); 4407eaa9c9385535b651064e02d05a8ffa4b2359281Andreas Huber 44120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return NO_ERROR; 44220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 44320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 44420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber case SEND_COMMAND: 44520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber { 44620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber CHECK_INTERFACE(IOMX, data, reply); 44720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 448c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber node_id node = (void*)data.readIntPtr(); 44920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 45020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber OMX_COMMANDTYPE cmd = 45120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber static_cast<OMX_COMMANDTYPE>(data.readInt32()); 45220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 45320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber OMX_S32 param = data.readInt32(); 454318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber reply->writeInt32(sendCommand(node, cmd, param)); 45520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 45620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return NO_ERROR; 45720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 45820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 45920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber case GET_PARAMETER: 46020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber { 46120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber CHECK_INTERFACE(IOMX, data, reply); 46220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 463c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber node_id node = (void*)data.readIntPtr(); 46420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber OMX_INDEXTYPE index = static_cast<OMX_INDEXTYPE>(data.readInt32()); 46520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 46620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber size_t size = data.readInt32(); 46720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 46820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber // XXX I am not happy with this but Parcel::readInplace didn't work. 46920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber void *params = malloc(size); 47020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber data.read(params, size); 47120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 472318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber status_t err = getParameter(node, index, params, size); 47320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 47420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber reply->writeInt32(err); 47520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 47620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber if (err == OK) { 47720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber reply->write(params, size); 47820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 47920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 48020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber free(params); 48120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber params = NULL; 48220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 48320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return NO_ERROR; 48420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 48520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 48620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber case SET_PARAMETER: 48720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber { 48820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber CHECK_INTERFACE(IOMX, data, reply); 48920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 490c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber node_id node = (void*)data.readIntPtr(); 49120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber OMX_INDEXTYPE index = static_cast<OMX_INDEXTYPE>(data.readInt32()); 49220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 49320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber size_t size = data.readInt32(); 49420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber void *params = const_cast<void *>(data.readInplace(size)); 49520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 496318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber reply->writeInt32(setParameter(node, index, params, size)); 49720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 49820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return NO_ERROR; 49920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 50020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 501693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber case GET_CONFIG: 502693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber { 503693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK_INTERFACE(IOMX, data, reply); 504693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 505c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber node_id node = (void*)data.readIntPtr(); 506693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber OMX_INDEXTYPE index = static_cast<OMX_INDEXTYPE>(data.readInt32()); 507693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 508693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber size_t size = data.readInt32(); 509693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 510693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber // XXX I am not happy with this but Parcel::readInplace didn't work. 511693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber void *params = malloc(size); 512693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber data.read(params, size); 513693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 514318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber status_t err = getConfig(node, index, params, size); 515693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 516693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber reply->writeInt32(err); 517693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 518693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber if (err == OK) { 519693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber reply->write(params, size); 520693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 521693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 522693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber free(params); 523693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber params = NULL; 524693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 525693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber return NO_ERROR; 526693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 527693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 528693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber case SET_CONFIG: 529693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber { 530693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK_INTERFACE(IOMX, data, reply); 531693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 532c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber node_id node = (void*)data.readIntPtr(); 533693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber OMX_INDEXTYPE index = static_cast<OMX_INDEXTYPE>(data.readInt32()); 534693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 535693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber size_t size = data.readInt32(); 536693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber void *params = const_cast<void *>(data.readInplace(size)); 537693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 538318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber reply->writeInt32(setConfig(node, index, params, size)); 539693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 540693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber return NO_ERROR; 541693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 542693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 54320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber case USE_BUFFER: 54420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber { 54520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber CHECK_INTERFACE(IOMX, data, reply); 54620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 547c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber node_id node = (void*)data.readIntPtr(); 54820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber OMX_U32 port_index = data.readInt32(); 54920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber sp<IMemory> params = 55020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber interface_cast<IMemory>(data.readStrongBinder()); 55120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 55220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber buffer_id buffer; 553318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber status_t err = useBuffer(node, port_index, params, &buffer); 55420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber reply->writeInt32(err); 55520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 55620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber if (err == OK) { 557c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber reply->writeIntPtr((intptr_t)buffer); 55820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 55920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 56020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return NO_ERROR; 56120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 56220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 56320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber case ALLOC_BUFFER: 56420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber { 56520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber CHECK_INTERFACE(IOMX, data, reply); 56620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 567c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber node_id node = (void*)data.readIntPtr(); 56820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber OMX_U32 port_index = data.readInt32(); 56920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber size_t size = data.readInt32(); 57020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 57120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber buffer_id buffer; 572318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber status_t err = allocateBuffer(node, port_index, size, &buffer); 57320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber reply->writeInt32(err); 57420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 57520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber if (err == OK) { 576c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber reply->writeIntPtr((intptr_t)buffer); 57720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 57820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 57920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return NO_ERROR; 58020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 58120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 58220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber case ALLOC_BUFFER_WITH_BACKUP: 58320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber { 58420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber CHECK_INTERFACE(IOMX, data, reply); 58520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 586c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber node_id node = (void*)data.readIntPtr(); 58720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber OMX_U32 port_index = data.readInt32(); 58820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber sp<IMemory> params = 58920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber interface_cast<IMemory>(data.readStrongBinder()); 59020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 59120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber buffer_id buffer; 592318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber status_t err = allocateBufferWithBackup( 59320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber node, port_index, params, &buffer); 59420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 59520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber reply->writeInt32(err); 59620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 59720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber if (err == OK) { 598c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber reply->writeIntPtr((intptr_t)buffer); 59920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 60020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 60120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return NO_ERROR; 60220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 60320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 60420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber case FREE_BUFFER: 60520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber { 60620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber CHECK_INTERFACE(IOMX, data, reply); 60720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 608c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber node_id node = (void*)data.readIntPtr(); 60920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber OMX_U32 port_index = data.readInt32(); 610c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber buffer_id buffer = (void*)data.readIntPtr(); 611318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber reply->writeInt32(freeBuffer(node, port_index, buffer)); 61220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 61320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return NO_ERROR; 61420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 61520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 61620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber case FILL_BUFFER: 61720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber { 61820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber CHECK_INTERFACE(IOMX, data, reply); 61920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 620c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber node_id node = (void*)data.readIntPtr(); 621c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber buffer_id buffer = (void*)data.readIntPtr(); 622318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber reply->writeInt32(fillBuffer(node, buffer)); 62320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 62420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return NO_ERROR; 62520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 62620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 62720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber case EMPTY_BUFFER: 62820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber { 62920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber CHECK_INTERFACE(IOMX, data, reply); 63020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 631c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber node_id node = (void*)data.readIntPtr(); 632c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber buffer_id buffer = (void*)data.readIntPtr(); 63320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber OMX_U32 range_offset = data.readInt32(); 63420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber OMX_U32 range_length = data.readInt32(); 63520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber OMX_U32 flags = data.readInt32(); 63620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber OMX_TICKS timestamp = data.readInt64(); 63720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 63836efa039efaae4526791336cb688032d22b34becAndreas Huber reply->writeInt32( 639318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber emptyBuffer( 64036efa039efaae4526791336cb688032d22b34becAndreas Huber node, buffer, range_offset, range_length, 64136efa039efaae4526791336cb688032d22b34becAndreas Huber flags, timestamp)); 64220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 64320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return NO_ERROR; 64420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 64520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 646693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber case GET_EXTENSION_INDEX: 647693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber { 648693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK_INTERFACE(IOMX, data, reply); 649693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 650c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber node_id node = (void*)data.readIntPtr(); 651693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber const char *parameter_name = data.readCString(); 6527eaa9c9385535b651064e02d05a8ffa4b2359281Andreas Huber 653693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber OMX_INDEXTYPE index; 654318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber status_t err = getExtensionIndex(node, parameter_name, &index); 655693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 656693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber reply->writeInt32(err); 657693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 658693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber if (err == OK) { 659693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber reply->writeInt32(index); 660693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 661693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 662693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber return OK; 663693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 664693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 6658b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber case CREATE_RENDERER: 6668b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber { 6678b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber CHECK_INTERFACE(IOMX, data, reply); 6688b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber 6698b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber sp<ISurface> isurface = 6708b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber interface_cast<ISurface>(data.readStrongBinder()); 6718b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber 6728b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber const char *componentName = data.readCString(); 6738b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber 6748b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber OMX_COLOR_FORMATTYPE colorFormat = 6758b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber static_cast<OMX_COLOR_FORMATTYPE>(data.readInt32()); 6768b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber 6778b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber size_t encodedWidth = (size_t)data.readInt32(); 6788b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber size_t encodedHeight = (size_t)data.readInt32(); 6798b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber size_t displayWidth = (size_t)data.readInt32(); 6808b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber size_t displayHeight = (size_t)data.readInt32(); 6818b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber 6828b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber sp<IOMXRenderer> renderer = 6838b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber createRenderer(isurface, componentName, colorFormat, 6848b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber encodedWidth, encodedHeight, 6858b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber displayWidth, displayHeight); 6868b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber 6878b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber reply->writeStrongBinder(renderer->asBinder()); 6888b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber 6898b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber return OK; 6908b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber } 6918b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber 69220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber default: 69320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return BBinder::onTransact(code, data, reply, flags); 69420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 69520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber} 69620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 69720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber//////////////////////////////////////////////////////////////////////////////// 69820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 69920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberclass BpOMXObserver : public BpInterface<IOMXObserver> { 70020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberpublic: 70120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber BpOMXObserver(const sp<IBinder> &impl) 70220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber : BpInterface<IOMXObserver>(impl) { 70320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 70420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 705318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber virtual void onMessage(const omx_message &msg) { 70620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber Parcel data, reply; 70720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber data.writeInterfaceToken(IOMXObserver::getInterfaceDescriptor()); 70820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber data.write(&msg, sizeof(msg)); 70920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 71020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber remote()->transact(OBSERVER_ON_MSG, data, &reply, IBinder::FLAG_ONEWAY); 71120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 71220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}; 71320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 71420111aa043c5f404472bc63b90bc5aad906b1101Andreas HuberIMPLEMENT_META_INTERFACE(OMXObserver, "android.hardware.IOMXObserver"); 71520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 71620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberstatus_t BnOMXObserver::onTransact( 71720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber uint32_t code, const Parcel &data, Parcel *reply, uint32_t flags) { 71820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber switch (code) { 71920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber case OBSERVER_ON_MSG: 72020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber { 72120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber CHECK_INTERFACE(IOMXObserver, data, reply); 72220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 72320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber omx_message msg; 72420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber data.read(&msg, sizeof(msg)); 72520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 72620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber // XXX Could use readInplace maybe? 727318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber onMessage(msg); 72820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 72920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return NO_ERROR; 73020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 73120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 73220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber default: 73320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return BBinder::onTransact(code, data, reply, flags); 73420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 73520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber} 73620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 7378b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber//////////////////////////////////////////////////////////////////////////////// 7388b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber 7398b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huberclass BpOMXRenderer : public BpInterface<IOMXRenderer> { 7408b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huberpublic: 7418b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber BpOMXRenderer(const sp<IBinder> &impl) 7428b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber : BpInterface<IOMXRenderer>(impl) { 7438b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber } 7448b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber 7458b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber virtual void render(IOMX::buffer_id buffer) { 7468b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber Parcel data, reply; 7478b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber data.writeInterfaceToken(IOMXRenderer::getInterfaceDescriptor()); 748c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber data.writeIntPtr((intptr_t)buffer); 7498b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber 7508b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber // NOTE: Do NOT make this a ONE_WAY call, it must be synchronous 7518b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber // so that the caller knows when to recycle the buffer. 7528b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber remote()->transact(RENDERER_RENDER, data, &reply); 7538b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber } 7548b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber}; 7558b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber 7568b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas HuberIMPLEMENT_META_INTERFACE(OMXRenderer, "android.hardware.IOMXRenderer"); 7578b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber 7588b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huberstatus_t BnOMXRenderer::onTransact( 7598b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber uint32_t code, const Parcel &data, Parcel *reply, uint32_t flags) { 7608b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber switch (code) { 7618b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber case RENDERER_RENDER: 7628b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber { 7638b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber CHECK_INTERFACE(IOMXRenderer, data, reply); 7648b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber 765c6b59b7c8acf7c6e7fbb93470aecc2c0ebe1b084Andreas Huber IOMX::buffer_id buffer = (void*)data.readIntPtr(); 7668b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber 7678b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber render(buffer); 7688b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber 7698b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber return NO_ERROR; 7708b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber } 7718b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber 7728b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber default: 7738b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber return BBinder::onTransact(code, data, reply, flags); 7748b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber } 7758b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber} 7768b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber 77720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber} // namespace android 778