IOMX.h revision 570a3cb7582daa030cb38eedc5eb6a06f86ecc7f
120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber/* 220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * Copyright (C) 2009 The Android Open Source Project 320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * 420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * Licensed under the Apache License, Version 2.0 (the "License"); 520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * you may not use this file except in compliance with the License. 620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * You may obtain a copy of the License at 720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * 820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * http://www.apache.org/licenses/LICENSE-2.0 920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * 1020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * Unless required by applicable law or agreed to in writing, software 1120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * distributed under the License is distributed on an "AS IS" BASIS, 1220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * See the License for the specific language governing permissions and 1420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * limitations under the License. 1520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber */ 1620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 1720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#ifndef ANDROID_IOMX_H_ 1820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 1920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#define ANDROID_IOMX_H_ 2020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 2120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#include <binder/IInterface.h> 2220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#include <utils/List.h> 2320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#include <utils/String8.h> 2420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 2520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#include <OMX_Core.h> 268b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber#include <OMX_Video.h> 2720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 281b84df1a0823fbcb9cec754311f53eaccfe85ae3Andreas Huber#include "jni.h" 291b84df1a0823fbcb9cec754311f53eaccfe85ae3Andreas Huber 3020111aa043c5f404472bc63b90bc5aad906b1101Andreas Hubernamespace android { 3120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 3220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberclass IMemory; 3320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberclass IOMXObserver; 348b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huberclass IOMXRenderer; 358b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huberclass ISurface; 36f4148b55c5d6f68b22462e3880015fefa91ae7c6Andreas Huberclass Surface; 3720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 3820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberclass IOMX : public IInterface { 3920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberpublic: 4020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber DECLARE_META_INTERFACE(OMX); 4120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 4220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber typedef void *buffer_id; 4320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber typedef void *node_id; 4420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 457eaa9c9385535b651064e02d05a8ffa4b2359281Andreas Huber // Given the calling process' pid, returns true iff 467eaa9c9385535b651064e02d05a8ffa4b2359281Andreas Huber // the implementation of the OMX interface lives in the same 477eaa9c9385535b651064e02d05a8ffa4b2359281Andreas Huber // process. 487eaa9c9385535b651064e02d05a8ffa4b2359281Andreas Huber virtual bool livesLocally(pid_t pid) = 0; 497eaa9c9385535b651064e02d05a8ffa4b2359281Andreas Huber 50134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber struct ComponentInfo { 51134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber String8 mName; 52134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber List<String8> mRoles; 53134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber }; 54134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber virtual status_t listNodes(List<ComponentInfo> *list) = 0; 5520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 56318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber virtual status_t allocateNode( 57318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber const char *name, const sp<IOMXObserver> &observer, 58318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber node_id *node) = 0; 5920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 60318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber virtual status_t freeNode(node_id node) = 0; 61318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 62318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber virtual status_t sendCommand( 6320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber node_id node, OMX_COMMANDTYPE cmd, OMX_S32 param) = 0; 6420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 65318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber virtual status_t getParameter( 6620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber node_id node, OMX_INDEXTYPE index, 6720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber void *params, size_t size) = 0; 6820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 69318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber virtual status_t setParameter( 7020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber node_id node, OMX_INDEXTYPE index, 7120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber const void *params, size_t size) = 0; 7220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 73318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber virtual status_t getConfig( 74693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber node_id node, OMX_INDEXTYPE index, 75693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber void *params, size_t size) = 0; 76693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 77318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber virtual status_t setConfig( 78693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber node_id node, OMX_INDEXTYPE index, 79693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber const void *params, size_t size) = 0; 80693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 81318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber virtual status_t useBuffer( 8220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber node_id node, OMX_U32 port_index, const sp<IMemory> ¶ms, 8320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber buffer_id *buffer) = 0; 8420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 85570a3cb7582daa030cb38eedc5eb6a06f86ecc7fAndreas Huber // This API clearly only makes sense if the caller lives in the 86570a3cb7582daa030cb38eedc5eb6a06f86ecc7fAndreas Huber // same process as the callee, i.e. is the media_server, as the 87570a3cb7582daa030cb38eedc5eb6a06f86ecc7fAndreas Huber // returned "buffer_data" pointer is just that, a pointer into local 88570a3cb7582daa030cb38eedc5eb6a06f86ecc7fAndreas Huber // address space. 89318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber virtual status_t allocateBuffer( 9020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber node_id node, OMX_U32 port_index, size_t size, 91570a3cb7582daa030cb38eedc5eb6a06f86ecc7fAndreas Huber buffer_id *buffer, void **buffer_data) = 0; 9220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 93318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber virtual status_t allocateBufferWithBackup( 9420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber node_id node, OMX_U32 port_index, const sp<IMemory> ¶ms, 9520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber buffer_id *buffer) = 0; 9620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 97318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber virtual status_t freeBuffer( 9820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber node_id node, OMX_U32 port_index, buffer_id buffer) = 0; 9920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 100318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber virtual status_t fillBuffer(node_id node, buffer_id buffer) = 0; 10120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 102318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber virtual status_t emptyBuffer( 10320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber node_id node, 10420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber buffer_id buffer, 10520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber OMX_U32 range_offset, OMX_U32 range_length, 10620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber OMX_U32 flags, OMX_TICKS timestamp) = 0; 1078b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber 108318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber virtual status_t getExtensionIndex( 109693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber node_id node, 110693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber const char *parameter_name, 111693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber OMX_INDEXTYPE *index) = 0; 112693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1138b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber virtual sp<IOMXRenderer> createRenderer( 1148b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber const sp<ISurface> &surface, 1158b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber const char *componentName, 1168b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber OMX_COLOR_FORMATTYPE colorFormat, 1178b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber size_t encodedWidth, size_t encodedHeight, 1188b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber size_t displayWidth, size_t displayHeight) = 0; 119f4148b55c5d6f68b22462e3880015fefa91ae7c6Andreas Huber 1201b84df1a0823fbcb9cec754311f53eaccfe85ae3Andreas Huber // Note: These methods are _not_ virtual, it exists as a wrapper around 121f4148b55c5d6f68b22462e3880015fefa91ae7c6Andreas Huber // the virtual "createRenderer" method above facilitating extraction 1221b84df1a0823fbcb9cec754311f53eaccfe85ae3Andreas Huber // of the ISurface from a regular Surface or a java Surface object. 123f4148b55c5d6f68b22462e3880015fefa91ae7c6Andreas Huber sp<IOMXRenderer> createRenderer( 124f4148b55c5d6f68b22462e3880015fefa91ae7c6Andreas Huber const sp<Surface> &surface, 125f4148b55c5d6f68b22462e3880015fefa91ae7c6Andreas Huber const char *componentName, 126f4148b55c5d6f68b22462e3880015fefa91ae7c6Andreas Huber OMX_COLOR_FORMATTYPE colorFormat, 127f4148b55c5d6f68b22462e3880015fefa91ae7c6Andreas Huber size_t encodedWidth, size_t encodedHeight, 128f4148b55c5d6f68b22462e3880015fefa91ae7c6Andreas Huber size_t displayWidth, size_t displayHeight); 1291b84df1a0823fbcb9cec754311f53eaccfe85ae3Andreas Huber 1301b84df1a0823fbcb9cec754311f53eaccfe85ae3Andreas Huber sp<IOMXRenderer> createRendererFromJavaSurface( 1311b84df1a0823fbcb9cec754311f53eaccfe85ae3Andreas Huber JNIEnv *env, jobject javaSurface, 1321b84df1a0823fbcb9cec754311f53eaccfe85ae3Andreas Huber const char *componentName, 1331b84df1a0823fbcb9cec754311f53eaccfe85ae3Andreas Huber OMX_COLOR_FORMATTYPE colorFormat, 1341b84df1a0823fbcb9cec754311f53eaccfe85ae3Andreas Huber size_t encodedWidth, size_t encodedHeight, 1351b84df1a0823fbcb9cec754311f53eaccfe85ae3Andreas Huber size_t displayWidth, size_t displayHeight); 13620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}; 13720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 13820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberstruct omx_message { 13920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber enum { 14020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber EVENT, 14120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber EMPTY_BUFFER_DONE, 14220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber FILL_BUFFER_DONE, 14320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 14420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } type; 14520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 146693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber IOMX::node_id node; 147693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 14820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber union { 14920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber // if type == EVENT 15020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber struct { 15120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber OMX_EVENTTYPE event; 15220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber OMX_U32 data1; 15320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber OMX_U32 data2; 15420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } event_data; 15520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 156e0f0b08aa692d15f3bfa19e10abfc84803c099b4Andreas Huber // if type == EMPTY_BUFFER_DONE 15720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber struct { 15820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber IOMX::buffer_id buffer; 15920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } buffer_data; 16020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 161e0f0b08aa692d15f3bfa19e10abfc84803c099b4Andreas Huber // if type == FILL_BUFFER_DONE 16220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber struct { 16320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber IOMX::buffer_id buffer; 16420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber OMX_U32 range_offset; 16520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber OMX_U32 range_length; 16620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber OMX_U32 flags; 16720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber OMX_TICKS timestamp; 168e0f0b08aa692d15f3bfa19e10abfc84803c099b4Andreas Huber OMX_PTR platform_private; 16920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } extended_buffer_data; 17020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 17120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } u; 17220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}; 17320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 17420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberclass IOMXObserver : public IInterface { 17520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberpublic: 17620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber DECLARE_META_INTERFACE(OMXObserver); 17720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 178318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber virtual void onMessage(const omx_message &msg) = 0; 17920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}; 18020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 1818b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huberclass IOMXRenderer : public IInterface { 1828b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huberpublic: 1838b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber DECLARE_META_INTERFACE(OMXRenderer); 1848b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber 1858b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber virtual void render(IOMX::buffer_id buffer) = 0; 1868b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber}; 1878b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber 18820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber//////////////////////////////////////////////////////////////////////////////// 18920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 19020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberclass BnOMX : public BnInterface<IOMX> { 19120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberpublic: 19220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber virtual status_t onTransact( 19320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber uint32_t code, const Parcel &data, Parcel *reply, 19420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber uint32_t flags = 0); 19520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}; 19620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 19720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberclass BnOMXObserver : public BnInterface<IOMXObserver> { 19820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberpublic: 19920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber virtual status_t onTransact( 20020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber uint32_t code, const Parcel &data, Parcel *reply, 20120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber uint32_t flags = 0); 20220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}; 20320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 2048b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huberclass BnOMXRenderer : public BnInterface<IOMXRenderer> { 2058b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huberpublic: 2068b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber virtual status_t onTransact( 2078b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber uint32_t code, const Parcel &data, Parcel *reply, 2088b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber uint32_t flags = 0); 2098b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber}; 2108b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber 21120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber} // namespace android 21220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 21320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#endif // ANDROID_IOMX_H_ 214