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> 22e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber#include <utils/List.h> 23e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber#include <utils/String8.h> 24e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 25e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber#include <OMX_Core.h> 261de13168a9d9f55464dc98748ea28ef785f1048eAndreas Huber#include <OMX_Video.h> 27e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 289f9afef3d5da3be6812192e60797b1c035445c3cAndreas Huber#include "jni.h" 299f9afef3d5da3be6812192e60797b1c035445c3cAndreas Huber 30e46b7be812d68e49710b34048662cbf18e2a6550Andreas Hubernamespace android { 31e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 32e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huberclass IMemory; 33e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huberclass IOMXObserver; 341de13168a9d9f55464dc98748ea28ef785f1048eAndreas Huberclass IOMXRenderer; 351de13168a9d9f55464dc98748ea28ef785f1048eAndreas Huberclass ISurface; 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 81784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber virtual status_t useBuffer( 82e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber node_id node, OMX_U32 port_index, const sp<IMemory> ¶ms, 83e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber buffer_id *buffer) = 0; 84e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 85c712b9fe2859435ce142b90ddcb46c5bed33eea8Andreas Huber // This API clearly only makes sense if the caller lives in the 86c712b9fe2859435ce142b90ddcb46c5bed33eea8Andreas Huber // same process as the callee, i.e. is the media_server, as the 87c712b9fe2859435ce142b90ddcb46c5bed33eea8Andreas Huber // returned "buffer_data" pointer is just that, a pointer into local 88c712b9fe2859435ce142b90ddcb46c5bed33eea8Andreas Huber // address space. 89784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber virtual status_t allocateBuffer( 90e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber node_id node, OMX_U32 port_index, size_t size, 91c712b9fe2859435ce142b90ddcb46c5bed33eea8Andreas Huber buffer_id *buffer, void **buffer_data) = 0; 92e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 93784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber virtual status_t allocateBufferWithBackup( 94e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber node_id node, OMX_U32 port_index, const sp<IMemory> ¶ms, 95e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber buffer_id *buffer) = 0; 96e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 97784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber virtual status_t freeBuffer( 98e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber node_id node, OMX_U32 port_index, buffer_id buffer) = 0; 99e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 100784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber virtual status_t fillBuffer(node_id node, buffer_id buffer) = 0; 101e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 102784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber virtual status_t emptyBuffer( 103e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber node_id node, 104e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber buffer_id buffer, 105e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber OMX_U32 range_offset, OMX_U32 range_length, 106e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber OMX_U32 flags, OMX_TICKS timestamp) = 0; 1071de13168a9d9f55464dc98748ea28ef785f1048eAndreas Huber 108784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber virtual status_t getExtensionIndex( 109be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber node_id node, 110be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber const char *parameter_name, 111be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber OMX_INDEXTYPE *index) = 0; 112be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber 1131de13168a9d9f55464dc98748ea28ef785f1048eAndreas Huber virtual sp<IOMXRenderer> createRenderer( 1141de13168a9d9f55464dc98748ea28ef785f1048eAndreas Huber const sp<ISurface> &surface, 1151de13168a9d9f55464dc98748ea28ef785f1048eAndreas Huber const char *componentName, 1161de13168a9d9f55464dc98748ea28ef785f1048eAndreas Huber OMX_COLOR_FORMATTYPE colorFormat, 1171de13168a9d9f55464dc98748ea28ef785f1048eAndreas Huber size_t encodedWidth, size_t encodedHeight, 11831dc911aee2b50752c0eb7785176075cdaed139cAndreas Huber size_t displayWidth, size_t displayHeight, 11931dc911aee2b50752c0eb7785176075cdaed139cAndreas Huber int32_t rotationDegrees) = 0; 120ccf8b94169197875af6c89172015b9644919b064Andreas Huber 1219f9afef3d5da3be6812192e60797b1c035445c3cAndreas Huber // Note: These methods are _not_ virtual, it exists as a wrapper around 122ccf8b94169197875af6c89172015b9644919b064Andreas Huber // the virtual "createRenderer" method above facilitating extraction 1239f9afef3d5da3be6812192e60797b1c035445c3cAndreas Huber // of the ISurface from a regular Surface or a java Surface object. 124ccf8b94169197875af6c89172015b9644919b064Andreas Huber sp<IOMXRenderer> createRenderer( 125ccf8b94169197875af6c89172015b9644919b064Andreas Huber const sp<Surface> &surface, 126ccf8b94169197875af6c89172015b9644919b064Andreas Huber const char *componentName, 127ccf8b94169197875af6c89172015b9644919b064Andreas Huber OMX_COLOR_FORMATTYPE colorFormat, 128ccf8b94169197875af6c89172015b9644919b064Andreas Huber size_t encodedWidth, size_t encodedHeight, 12931dc911aee2b50752c0eb7785176075cdaed139cAndreas Huber size_t displayWidth, size_t displayHeight, 13031dc911aee2b50752c0eb7785176075cdaed139cAndreas Huber int32_t rotationDegrees); 1319f9afef3d5da3be6812192e60797b1c035445c3cAndreas Huber 1329f9afef3d5da3be6812192e60797b1c035445c3cAndreas Huber sp<IOMXRenderer> createRendererFromJavaSurface( 1339f9afef3d5da3be6812192e60797b1c035445c3cAndreas Huber JNIEnv *env, jobject javaSurface, 1349f9afef3d5da3be6812192e60797b1c035445c3cAndreas Huber const char *componentName, 1359f9afef3d5da3be6812192e60797b1c035445c3cAndreas Huber OMX_COLOR_FORMATTYPE colorFormat, 1369f9afef3d5da3be6812192e60797b1c035445c3cAndreas Huber size_t encodedWidth, size_t encodedHeight, 13731dc911aee2b50752c0eb7785176075cdaed139cAndreas Huber size_t displayWidth, size_t displayHeight, 13831dc911aee2b50752c0eb7785176075cdaed139cAndreas Huber int32_t rotationDegrees); 139e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber}; 140e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 141e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huberstruct omx_message { 142e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber enum { 143e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber EVENT, 144e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber EMPTY_BUFFER_DONE, 145e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber FILL_BUFFER_DONE, 146e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 147e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber } type; 148e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 149be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber IOMX::node_id node; 150be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber 151e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber union { 152e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber // if type == EVENT 153e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber struct { 154e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber OMX_EVENTTYPE event; 155e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber OMX_U32 data1; 156e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber OMX_U32 data2; 157e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber } event_data; 158e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 159329577aa6d422d1dbb33f4771fc5e2949b4ad312Andreas Huber // if type == EMPTY_BUFFER_DONE 160e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber struct { 161e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber IOMX::buffer_id buffer; 162e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber } buffer_data; 163e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 164329577aa6d422d1dbb33f4771fc5e2949b4ad312Andreas Huber // if type == FILL_BUFFER_DONE 165e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber struct { 166e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber IOMX::buffer_id buffer; 167e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber OMX_U32 range_offset; 168e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber OMX_U32 range_length; 169e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber OMX_U32 flags; 170e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber OMX_TICKS timestamp; 171329577aa6d422d1dbb33f4771fc5e2949b4ad312Andreas Huber OMX_PTR platform_private; 17252733b83a736b500f72f72733b06258601c966f8Andreas Huber OMX_PTR data_ptr; 173e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber } extended_buffer_data; 174e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 175e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber } u; 176e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber}; 177e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 178e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huberclass IOMXObserver : public IInterface { 179e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huberpublic: 180e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber DECLARE_META_INTERFACE(OMXObserver); 181e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 182784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber virtual void onMessage(const omx_message &msg) = 0; 183e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber}; 184e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 1851de13168a9d9f55464dc98748ea28ef785f1048eAndreas Huberclass IOMXRenderer : public IInterface { 1861de13168a9d9f55464dc98748ea28ef785f1048eAndreas Huberpublic: 1871de13168a9d9f55464dc98748ea28ef785f1048eAndreas Huber DECLARE_META_INTERFACE(OMXRenderer); 1881de13168a9d9f55464dc98748ea28ef785f1048eAndreas Huber 1891de13168a9d9f55464dc98748ea28ef785f1048eAndreas Huber virtual void render(IOMX::buffer_id buffer) = 0; 1901de13168a9d9f55464dc98748ea28ef785f1048eAndreas Huber}; 1911de13168a9d9f55464dc98748ea28ef785f1048eAndreas Huber 192e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber//////////////////////////////////////////////////////////////////////////////// 193e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 194e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huberclass BnOMX : public BnInterface<IOMX> { 195e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huberpublic: 196e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber virtual status_t onTransact( 197e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber uint32_t code, const Parcel &data, Parcel *reply, 198e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber uint32_t flags = 0); 199e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber}; 200e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 201e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huberclass BnOMXObserver : public BnInterface<IOMXObserver> { 202e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huberpublic: 203e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber virtual status_t onTransact( 204e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber uint32_t code, const Parcel &data, Parcel *reply, 205e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber uint32_t flags = 0); 206e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber}; 207e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 2081de13168a9d9f55464dc98748ea28ef785f1048eAndreas Huberclass BnOMXRenderer : public BnInterface<IOMXRenderer> { 2091de13168a9d9f55464dc98748ea28ef785f1048eAndreas Huberpublic: 2101de13168a9d9f55464dc98748ea28ef785f1048eAndreas Huber virtual status_t onTransact( 2111de13168a9d9f55464dc98748ea28ef785f1048eAndreas Huber uint32_t code, const Parcel &data, Parcel *reply, 2121de13168a9d9f55464dc98748ea28ef785f1048eAndreas Huber uint32_t flags = 0); 2131de13168a9d9f55464dc98748ea28ef785f1048eAndreas Huber}; 2141de13168a9d9f55464dc98748ea28ef785f1048eAndreas Huber 215e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber} // namespace android 216e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 217e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber#endif // ANDROID_IOMX_H_ 218