1e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber/* 2e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber * Copyright (C) 2009 The Android Open Source Project 3e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber * 4e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber * Licensed under the Apache License, Version 2.0 (the "License"); 5e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber * you may not use this file except in compliance with the License. 6e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber * You may obtain a copy of the License at 7e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber * 8e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber * http://www.apache.org/licenses/LICENSE-2.0 9e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber * 10e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber * Unless required by applicable law or agreed to in writing, software 11e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber * distributed under the License is distributed on an "AS IS" BASIS, 12e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber * See the License for the specific language governing permissions and 14e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber * limitations under the License. 15e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber */ 16e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 17e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber#ifndef ANDROID_IOMX_H_ 18e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 19e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber#define ANDROID_IOMX_H_ 20e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 21e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber#include <binder/IInterface.h> 2233a78149e00806d055ff214d300279963965a677Jamie Gennis#include <ui/GraphicBuffer.h> 23e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber#include <utils/List.h> 24e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber#include <utils/String8.h> 25e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 26e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber#include <OMX_Core.h> 271de13168a9d9f55464dc98748ea28ef785f1048eAndreas Huber#include <OMX_Video.h> 28e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 299f9afef3d5da3be6812192e60797b1c035445c3cAndreas Huber#include "jni.h" 309f9afef3d5da3be6812192e60797b1c035445c3cAndreas Huber 31e46b7be812d68e49710b34048662cbf18e2a6550Andreas Hubernamespace android { 32e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 33e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huberclass IMemory; 34e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huberclass IOMXObserver; 351de13168a9d9f55464dc98748ea28ef785f1048eAndreas Huberclass IOMXRenderer; 36ccf8b94169197875af6c89172015b9644919b064Andreas Huberclass Surface; 37e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 38e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huberclass IOMX : public IInterface { 39e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huberpublic: 40e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber DECLARE_META_INTERFACE(OMX); 41e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 42e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber typedef void *buffer_id; 43e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber typedef void *node_id; 44e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 45f1fe064d735698b09e4bc7b3a10e4dc3dba9a1d9Andreas Huber // Given the calling process' pid, returns true iff 46f1fe064d735698b09e4bc7b3a10e4dc3dba9a1d9Andreas Huber // the implementation of the OMX interface lives in the same 47f1fe064d735698b09e4bc7b3a10e4dc3dba9a1d9Andreas Huber // process. 48f1fe064d735698b09e4bc7b3a10e4dc3dba9a1d9Andreas Huber virtual bool livesLocally(pid_t pid) = 0; 49f1fe064d735698b09e4bc7b3a10e4dc3dba9a1d9Andreas Huber 502ea14e231945afb6581fa8f54015b33bc74a19e5Andreas Huber struct ComponentInfo { 512ea14e231945afb6581fa8f54015b33bc74a19e5Andreas Huber String8 mName; 522ea14e231945afb6581fa8f54015b33bc74a19e5Andreas Huber List<String8> mRoles; 532ea14e231945afb6581fa8f54015b33bc74a19e5Andreas Huber }; 542ea14e231945afb6581fa8f54015b33bc74a19e5Andreas Huber virtual status_t listNodes(List<ComponentInfo> *list) = 0; 55e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 56784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber virtual status_t allocateNode( 57784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber const char *name, const sp<IOMXObserver> &observer, 58784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber node_id *node) = 0; 59e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 60784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber virtual status_t freeNode(node_id node) = 0; 61784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 62784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber virtual status_t sendCommand( 63e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber node_id node, OMX_COMMANDTYPE cmd, OMX_S32 param) = 0; 64e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 65784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber virtual status_t getParameter( 66e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber node_id node, OMX_INDEXTYPE index, 67e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber void *params, size_t size) = 0; 68e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 69784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber virtual status_t setParameter( 70e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber node_id node, OMX_INDEXTYPE index, 71e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber const void *params, size_t size) = 0; 72e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 73784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber virtual status_t getConfig( 74be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber node_id node, OMX_INDEXTYPE index, 75be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber void *params, size_t size) = 0; 76be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber 77784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber virtual status_t setConfig( 78be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber node_id node, OMX_INDEXTYPE index, 79be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber const void *params, size_t size) = 0; 80be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber 816607b39baa05ee85a0857c3f95ff9224517b2abcJamie Gennis virtual status_t getState( 826607b39baa05ee85a0857c3f95ff9224517b2abcJamie Gennis node_id node, OMX_STATETYPE* state) = 0; 836607b39baa05ee85a0857c3f95ff9224517b2abcJamie Gennis 84387e38dd87ae9c04ef79ebe06ea798762916ff5cJames Dong virtual status_t storeMetaDataInBuffers( 85387e38dd87ae9c04ef79ebe06ea798762916ff5cJames Dong node_id node, OMX_U32 port_index, OMX_BOOL enable) = 0; 86387e38dd87ae9c04ef79ebe06ea798762916ff5cJames Dong 8733a78149e00806d055ff214d300279963965a677Jamie Gennis virtual status_t enableGraphicBuffers( 8833a78149e00806d055ff214d300279963965a677Jamie Gennis node_id node, OMX_U32 port_index, OMX_BOOL enable) = 0; 8933a78149e00806d055ff214d300279963965a677Jamie Gennis 90e6befb88bd2ade12c50b0a0e95b209e1f4be94b4Jamie Gennis virtual status_t getGraphicBufferUsage( 91e6befb88bd2ade12c50b0a0e95b209e1f4be94b4Jamie Gennis node_id node, OMX_U32 port_index, OMX_U32* usage) = 0; 92e6befb88bd2ade12c50b0a0e95b209e1f4be94b4Jamie Gennis 93784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber virtual status_t useBuffer( 94e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber node_id node, OMX_U32 port_index, const sp<IMemory> ¶ms, 95e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber buffer_id *buffer) = 0; 96e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 9733a78149e00806d055ff214d300279963965a677Jamie Gennis virtual status_t useGraphicBuffer( 9833a78149e00806d055ff214d300279963965a677Jamie Gennis node_id node, OMX_U32 port_index, 9933a78149e00806d055ff214d300279963965a677Jamie Gennis const sp<GraphicBuffer> &graphicBuffer, buffer_id *buffer) = 0; 10033a78149e00806d055ff214d300279963965a677Jamie Gennis 101c712b9fe2859435ce142b90ddcb46c5bed33eea8Andreas Huber // This API clearly only makes sense if the caller lives in the 102c712b9fe2859435ce142b90ddcb46c5bed33eea8Andreas Huber // same process as the callee, i.e. is the media_server, as the 103c712b9fe2859435ce142b90ddcb46c5bed33eea8Andreas Huber // returned "buffer_data" pointer is just that, a pointer into local 104c712b9fe2859435ce142b90ddcb46c5bed33eea8Andreas Huber // address space. 105784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber virtual status_t allocateBuffer( 106e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber node_id node, OMX_U32 port_index, size_t size, 107c712b9fe2859435ce142b90ddcb46c5bed33eea8Andreas Huber buffer_id *buffer, void **buffer_data) = 0; 108e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 109784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber virtual status_t allocateBufferWithBackup( 110e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber node_id node, OMX_U32 port_index, const sp<IMemory> ¶ms, 111e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber buffer_id *buffer) = 0; 112e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 113784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber virtual status_t freeBuffer( 114e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber node_id node, OMX_U32 port_index, buffer_id buffer) = 0; 115e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 116784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber virtual status_t fillBuffer(node_id node, buffer_id buffer) = 0; 117e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 118784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber virtual status_t emptyBuffer( 119e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber node_id node, 120e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber buffer_id buffer, 121e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber OMX_U32 range_offset, OMX_U32 range_length, 122e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber OMX_U32 flags, OMX_TICKS timestamp) = 0; 1231de13168a9d9f55464dc98748ea28ef785f1048eAndreas Huber 124784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber virtual status_t getExtensionIndex( 125be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber node_id node, 126be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber const char *parameter_name, 127be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber OMX_INDEXTYPE *index) = 0; 128e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber}; 129e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 130e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huberstruct omx_message { 131e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber enum { 132e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber EVENT, 133e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber EMPTY_BUFFER_DONE, 134e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber FILL_BUFFER_DONE, 135e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 136e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber } type; 137e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 138be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber IOMX::node_id node; 139be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber 140e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber union { 141e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber // if type == EVENT 142e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber struct { 143e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber OMX_EVENTTYPE event; 144e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber OMX_U32 data1; 145e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber OMX_U32 data2; 146e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber } event_data; 147e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 148329577aa6d422d1dbb33f4771fc5e2949b4ad312Andreas Huber // if type == EMPTY_BUFFER_DONE 149e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber struct { 150e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber IOMX::buffer_id buffer; 151e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber } buffer_data; 152e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 153329577aa6d422d1dbb33f4771fc5e2949b4ad312Andreas Huber // if type == FILL_BUFFER_DONE 154e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber struct { 155e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber IOMX::buffer_id buffer; 156e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber OMX_U32 range_offset; 157e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber OMX_U32 range_length; 158e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber OMX_U32 flags; 159e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber OMX_TICKS timestamp; 160329577aa6d422d1dbb33f4771fc5e2949b4ad312Andreas Huber OMX_PTR platform_private; 16152733b83a736b500f72f72733b06258601c966f8Andreas Huber OMX_PTR data_ptr; 162e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber } extended_buffer_data; 163e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 164e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber } u; 165e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber}; 166e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 167e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huberclass IOMXObserver : public IInterface { 168e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huberpublic: 169e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber DECLARE_META_INTERFACE(OMXObserver); 170e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 171784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber virtual void onMessage(const omx_message &msg) = 0; 172e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber}; 173e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 174e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber//////////////////////////////////////////////////////////////////////////////// 175e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 176e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huberclass BnOMX : public BnInterface<IOMX> { 177e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huberpublic: 178e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber virtual status_t onTransact( 179e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber uint32_t code, const Parcel &data, Parcel *reply, 180e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber uint32_t flags = 0); 181e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber}; 182e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 183e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huberclass BnOMXObserver : public BnInterface<IOMXObserver> { 184e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huberpublic: 185e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber virtual status_t onTransact( 186e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber uint32_t code, const Parcel &data, Parcel *reply, 187e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber uint32_t flags = 0); 188e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber}; 189e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 190fbb170ca9cbbd0c87c71ac39ecbb36086bca5ee2James Dongstruct CodecProfileLevel { 191fbb170ca9cbbd0c87c71ac39ecbb36086bca5ee2James Dong OMX_U32 mProfile; 192fbb170ca9cbbd0c87c71ac39ecbb36086bca5ee2James Dong OMX_U32 mLevel; 193fbb170ca9cbbd0c87c71ac39ecbb36086bca5ee2James Dong}; 194fbb170ca9cbbd0c87c71ac39ecbb36086bca5ee2James Dong 195e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber} // namespace android 196e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 197e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber#endif // ANDROID_IOMX_H_ 198