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> 227cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden#include <gui/IGraphicBufferProducer.h> 2383750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis#include <ui/GraphicBuffer.h> 2420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#include <utils/List.h> 2520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#include <utils/String8.h> 2620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 2720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#include <OMX_Core.h> 288b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber#include <OMX_Video.h> 2920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 3020111aa043c5f404472bc63b90bc5aad906b1101Andreas Hubernamespace android { 3120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 3220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberclass IMemory; 3320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberclass IOMXObserver; 348b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huberclass IOMXRenderer; 35f4148b55c5d6f68b22462e3880015fefa91ae7c6Andreas Huberclass Surface; 3620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 3720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberclass IOMX : public IInterface { 3820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberpublic: 3920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber DECLARE_META_INTERFACE(OMX); 4020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 4120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber typedef void *buffer_id; 4220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber typedef void *node_id; 4320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 44d459b485c61bd3e7fd81c5cd3af8ada27fc3e8d3Andreas Huber // Given a node_id and the calling process' pid, returns true iff 457eaa9c9385535b651064e02d05a8ffa4b2359281Andreas Huber // the implementation of the OMX interface lives in the same 467eaa9c9385535b651064e02d05a8ffa4b2359281Andreas Huber // process. 47d459b485c61bd3e7fd81c5cd3af8ada27fc3e8d3Andreas Huber virtual bool livesLocally(node_id node, pid_t pid) = 0; 487eaa9c9385535b651064e02d05a8ffa4b2359281Andreas Huber 49134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber struct ComponentInfo { 50134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber String8 mName; 51134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber List<String8> mRoles; 52134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber }; 53134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber virtual status_t listNodes(List<ComponentInfo> *list) = 0; 5420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 55318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber virtual status_t allocateNode( 56318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber const char *name, const sp<IOMXObserver> &observer, 57318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber node_id *node) = 0; 5820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 59318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber virtual status_t freeNode(node_id node) = 0; 60318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 61318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber virtual status_t sendCommand( 6220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber node_id node, OMX_COMMANDTYPE cmd, OMX_S32 param) = 0; 6320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 64318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber virtual status_t getParameter( 6520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber node_id node, OMX_INDEXTYPE index, 6620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber void *params, size_t size) = 0; 6720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 68318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber virtual status_t setParameter( 6920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber node_id node, OMX_INDEXTYPE index, 7020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber const void *params, size_t size) = 0; 7120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 72318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber virtual status_t getConfig( 73693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber node_id node, OMX_INDEXTYPE index, 74693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber void *params, size_t size) = 0; 75693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 76318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber virtual status_t setConfig( 77693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber node_id node, OMX_INDEXTYPE index, 78693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber const void *params, size_t size) = 0; 79693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 80b1d666f5cb555d135eb69e005e88a03330bbb54cJamie Gennis virtual status_t getState( 81b1d666f5cb555d135eb69e005e88a03330bbb54cJamie Gennis node_id node, OMX_STATETYPE* state) = 0; 82b1d666f5cb555d135eb69e005e88a03330bbb54cJamie Gennis 83e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong virtual status_t storeMetaDataInBuffers( 84e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong node_id node, OMX_U32 port_index, OMX_BOOL enable) = 0; 85e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong 8656ce726019f700a95ce5b45beebceadae4836e30Lajos Molnar virtual status_t prepareForAdaptivePlayback( 8756ce726019f700a95ce5b45beebceadae4836e30Lajos Molnar node_id node, OMX_U32 portIndex, OMX_BOOL enable, 8856ce726019f700a95ce5b45beebceadae4836e30Lajos Molnar OMX_U32 maxFrameWidth, OMX_U32 maxFrameHeight) = 0; 8956ce726019f700a95ce5b45beebceadae4836e30Lajos Molnar 9083750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis virtual status_t enableGraphicBuffers( 9183750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis node_id node, OMX_U32 port_index, OMX_BOOL enable) = 0; 9283750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis 93e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis virtual status_t getGraphicBufferUsage( 94e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis node_id node, OMX_U32 port_index, OMX_U32* usage) = 0; 95e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis 96318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber virtual status_t useBuffer( 9720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber node_id node, OMX_U32 port_index, const sp<IMemory> ¶ms, 9820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber buffer_id *buffer) = 0; 9920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 10083750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis virtual status_t useGraphicBuffer( 10183750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis node_id node, OMX_U32 port_index, 10283750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis const sp<GraphicBuffer> &graphicBuffer, buffer_id *buffer) = 0; 10383750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis 104d0715867861c216e88a4a7523b6da8a3cb128724Lajos Molnar virtual status_t updateGraphicBufferInMeta( 105d0715867861c216e88a4a7523b6da8a3cb128724Lajos Molnar node_id node, OMX_U32 port_index, 106d0715867861c216e88a4a7523b6da8a3cb128724Lajos Molnar const sp<GraphicBuffer> &graphicBuffer, buffer_id buffer) = 0; 107d0715867861c216e88a4a7523b6da8a3cb128724Lajos Molnar 1087cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden virtual status_t createInputSurface( 1097cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden node_id node, OMX_U32 port_index, 1107cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden sp<IGraphicBufferProducer> *bufferProducer) = 0; 1117cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden 1127cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden virtual status_t signalEndOfInputStream(node_id node) = 0; 1137cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden 114570a3cb7582daa030cb38eedc5eb6a06f86ecc7fAndreas Huber // This API clearly only makes sense if the caller lives in the 115570a3cb7582daa030cb38eedc5eb6a06f86ecc7fAndreas Huber // same process as the callee, i.e. is the media_server, as the 116570a3cb7582daa030cb38eedc5eb6a06f86ecc7fAndreas Huber // returned "buffer_data" pointer is just that, a pointer into local 117570a3cb7582daa030cb38eedc5eb6a06f86ecc7fAndreas Huber // address space. 118318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber virtual status_t allocateBuffer( 11920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber node_id node, OMX_U32 port_index, size_t size, 120570a3cb7582daa030cb38eedc5eb6a06f86ecc7fAndreas Huber buffer_id *buffer, void **buffer_data) = 0; 12120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 122318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber virtual status_t allocateBufferWithBackup( 12320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber node_id node, OMX_U32 port_index, const sp<IMemory> ¶ms, 12420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber buffer_id *buffer) = 0; 12520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 126318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber virtual status_t freeBuffer( 12720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber node_id node, OMX_U32 port_index, buffer_id buffer) = 0; 12820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 129318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber virtual status_t fillBuffer(node_id node, buffer_id buffer) = 0; 13020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 131318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber virtual status_t emptyBuffer( 13220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber node_id node, 13320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber buffer_id buffer, 13420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber OMX_U32 range_offset, OMX_U32 range_length, 13520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber OMX_U32 flags, OMX_TICKS timestamp) = 0; 1368b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber 137318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber virtual status_t getExtensionIndex( 138693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber node_id node, 139693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber const char *parameter_name, 140693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber OMX_INDEXTYPE *index) = 0; 141e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber 142e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber enum InternalOptionType { 143e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber INTERNAL_OPTION_SUSPEND, // data is a bool 144a61285dcf1da8a2cf40c499ee3a7b9fc4d74ac58Andreas Huber INTERNAL_OPTION_REPEAT_PREVIOUS_FRAME_DELAY, // data is an int64_t 1458bd4d16aa5636e98522c07ae31236420788aa749Chong Zhang INTERNAL_OPTION_MAX_TIMESTAMP_GAP, // data is int64_t 146e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber }; 147e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber virtual status_t setInternalOption( 148e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber node_id node, 149e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber OMX_U32 port_index, 150e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber InternalOptionType type, 151e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber const void *data, 152e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber size_t size) = 0; 15320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}; 15420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 15520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberstruct omx_message { 15620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber enum { 15720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber EVENT, 15820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber EMPTY_BUFFER_DONE, 15920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber FILL_BUFFER_DONE, 16020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 16120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } type; 16220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 163693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber IOMX::node_id node; 164693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 16520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber union { 16620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber // if type == EVENT 16720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber struct { 16820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber OMX_EVENTTYPE event; 16920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber OMX_U32 data1; 17020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber OMX_U32 data2; 17120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } event_data; 17220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 173e0f0b08aa692d15f3bfa19e10abfc84803c099b4Andreas Huber // if type == EMPTY_BUFFER_DONE 17420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber struct { 17520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber IOMX::buffer_id buffer; 17620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } buffer_data; 17720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 178e0f0b08aa692d15f3bfa19e10abfc84803c099b4Andreas Huber // if type == FILL_BUFFER_DONE 17920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber struct { 18020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber IOMX::buffer_id buffer; 18120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber OMX_U32 range_offset; 18220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber OMX_U32 range_length; 18320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber OMX_U32 flags; 18420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber OMX_TICKS timestamp; 185e0f0b08aa692d15f3bfa19e10abfc84803c099b4Andreas Huber OMX_PTR platform_private; 186213addfaf4b359c69da4e9b4490c511d116845bbAndreas Huber OMX_PTR data_ptr; 18720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } extended_buffer_data; 18820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 18920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } u; 19020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}; 19120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 19220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberclass IOMXObserver : public IInterface { 19320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberpublic: 19420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber DECLARE_META_INTERFACE(OMXObserver); 19520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 196318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber virtual void onMessage(const omx_message &msg) = 0; 19720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}; 19820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 19920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber//////////////////////////////////////////////////////////////////////////////// 20020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 20120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberclass BnOMX : public BnInterface<IOMX> { 20220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberpublic: 20320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber virtual status_t onTransact( 20420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber uint32_t code, const Parcel &data, Parcel *reply, 20520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber uint32_t flags = 0); 20620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}; 20720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 20820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberclass BnOMXObserver : public BnInterface<IOMXObserver> { 20920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberpublic: 21020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber virtual status_t onTransact( 21120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber uint32_t code, const Parcel &data, Parcel *reply, 21220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber uint32_t flags = 0); 21320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}; 21420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 215457116d3a01618acf9a875020ca5860551ba03a6James Dongstruct CodecProfileLevel { 216457116d3a01618acf9a875020ca5860551ba03a6James Dong OMX_U32 mProfile; 217457116d3a01618acf9a875020ca5860551ba03a6James Dong OMX_U32 mLevel; 218457116d3a01618acf9a875020ca5860551ba03a6James Dong}; 219457116d3a01618acf9a875020ca5860551ba03a6James Dong 22020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber} // namespace android 22120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 22220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#endif // ANDROID_IOMX_H_ 223