IOMX.h revision 387e38dd87ae9c04ef79ebe06ea798762916ff5c
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; 361de13168a9d9f55464dc98748ea28ef785f1048eAndreas Huberclass ISurface; 37ccf8b94169197875af6c89172015b9644919b064Andreas Huberclass Surface; 38e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 39e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huberclass IOMX : public IInterface { 40e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huberpublic: 41e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber DECLARE_META_INTERFACE(OMX); 42e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 43e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber typedef void *buffer_id; 44e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber typedef void *node_id; 45e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 46f1fe064d735698b09e4bc7b3a10e4dc3dba9a1d9Andreas Huber // Given the calling process' pid, returns true iff 47f1fe064d735698b09e4bc7b3a10e4dc3dba9a1d9Andreas Huber // the implementation of the OMX interface lives in the same 48f1fe064d735698b09e4bc7b3a10e4dc3dba9a1d9Andreas Huber // process. 49f1fe064d735698b09e4bc7b3a10e4dc3dba9a1d9Andreas Huber virtual bool livesLocally(pid_t pid) = 0; 50f1fe064d735698b09e4bc7b3a10e4dc3dba9a1d9Andreas Huber 512ea14e231945afb6581fa8f54015b33bc74a19e5Andreas Huber struct ComponentInfo { 522ea14e231945afb6581fa8f54015b33bc74a19e5Andreas Huber String8 mName; 532ea14e231945afb6581fa8f54015b33bc74a19e5Andreas Huber List<String8> mRoles; 542ea14e231945afb6581fa8f54015b33bc74a19e5Andreas Huber }; 552ea14e231945afb6581fa8f54015b33bc74a19e5Andreas Huber virtual status_t listNodes(List<ComponentInfo> *list) = 0; 56e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 57784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber virtual status_t allocateNode( 58784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber const char *name, const sp<IOMXObserver> &observer, 59784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber node_id *node) = 0; 60e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 61784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber virtual status_t freeNode(node_id node) = 0; 62784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 63784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber virtual status_t sendCommand( 64e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber node_id node, OMX_COMMANDTYPE cmd, OMX_S32 param) = 0; 65e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 66784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber virtual status_t getParameter( 67e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber node_id node, OMX_INDEXTYPE index, 68e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber void *params, size_t size) = 0; 69e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 70784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber virtual status_t setParameter( 71e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber node_id node, OMX_INDEXTYPE index, 72e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber const void *params, size_t size) = 0; 73e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 74784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber virtual status_t getConfig( 75be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber node_id node, OMX_INDEXTYPE index, 76be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber void *params, size_t size) = 0; 77be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber 78784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber virtual status_t setConfig( 79be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber node_id node, OMX_INDEXTYPE index, 80be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber const void *params, size_t size) = 0; 81be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber 82387e38dd87ae9c04ef79ebe06ea798762916ff5cJames Dong virtual status_t storeMetaDataInBuffers( 83387e38dd87ae9c04ef79ebe06ea798762916ff5cJames Dong node_id node, OMX_U32 port_index, OMX_BOOL enable) = 0; 84387e38dd87ae9c04ef79ebe06ea798762916ff5cJames Dong 8533a78149e00806d055ff214d300279963965a677Jamie Gennis virtual status_t enableGraphicBuffers( 8633a78149e00806d055ff214d300279963965a677Jamie Gennis node_id node, OMX_U32 port_index, OMX_BOOL enable) = 0; 8733a78149e00806d055ff214d300279963965a677Jamie Gennis 88784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber virtual status_t useBuffer( 89e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber node_id node, OMX_U32 port_index, const sp<IMemory> ¶ms, 90e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber buffer_id *buffer) = 0; 91e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 9233a78149e00806d055ff214d300279963965a677Jamie Gennis virtual status_t useGraphicBuffer( 9333a78149e00806d055ff214d300279963965a677Jamie Gennis node_id node, OMX_U32 port_index, 9433a78149e00806d055ff214d300279963965a677Jamie Gennis const sp<GraphicBuffer> &graphicBuffer, buffer_id *buffer) = 0; 9533a78149e00806d055ff214d300279963965a677Jamie Gennis 96c712b9fe2859435ce142b90ddcb46c5bed33eea8Andreas Huber // This API clearly only makes sense if the caller lives in the 97c712b9fe2859435ce142b90ddcb46c5bed33eea8Andreas Huber // same process as the callee, i.e. is the media_server, as the 98c712b9fe2859435ce142b90ddcb46c5bed33eea8Andreas Huber // returned "buffer_data" pointer is just that, a pointer into local 99c712b9fe2859435ce142b90ddcb46c5bed33eea8Andreas Huber // address space. 100784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber virtual status_t allocateBuffer( 101e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber node_id node, OMX_U32 port_index, size_t size, 102c712b9fe2859435ce142b90ddcb46c5bed33eea8Andreas Huber buffer_id *buffer, void **buffer_data) = 0; 103e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 104784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber virtual status_t allocateBufferWithBackup( 105e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber node_id node, OMX_U32 port_index, const sp<IMemory> ¶ms, 106e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber buffer_id *buffer) = 0; 107e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 108784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber virtual status_t freeBuffer( 109e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber node_id node, OMX_U32 port_index, buffer_id buffer) = 0; 110e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 111784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber virtual status_t fillBuffer(node_id node, buffer_id buffer) = 0; 112e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 113784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber virtual status_t emptyBuffer( 114e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber node_id node, 115e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber buffer_id buffer, 116e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber OMX_U32 range_offset, OMX_U32 range_length, 117e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber OMX_U32 flags, OMX_TICKS timestamp) = 0; 1181de13168a9d9f55464dc98748ea28ef785f1048eAndreas Huber 119784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber virtual status_t getExtensionIndex( 120be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber node_id node, 121be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber const char *parameter_name, 122be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber OMX_INDEXTYPE *index) = 0; 123be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber 1241de13168a9d9f55464dc98748ea28ef785f1048eAndreas Huber virtual sp<IOMXRenderer> createRenderer( 1251de13168a9d9f55464dc98748ea28ef785f1048eAndreas Huber const sp<ISurface> &surface, 1261de13168a9d9f55464dc98748ea28ef785f1048eAndreas Huber const char *componentName, 1271de13168a9d9f55464dc98748ea28ef785f1048eAndreas Huber OMX_COLOR_FORMATTYPE colorFormat, 1281de13168a9d9f55464dc98748ea28ef785f1048eAndreas Huber size_t encodedWidth, size_t encodedHeight, 1291de13168a9d9f55464dc98748ea28ef785f1048eAndreas Huber size_t displayWidth, size_t displayHeight) = 0; 130ccf8b94169197875af6c89172015b9644919b064Andreas Huber 1319f9afef3d5da3be6812192e60797b1c035445c3cAndreas Huber // Note: These methods are _not_ virtual, it exists as a wrapper around 132ccf8b94169197875af6c89172015b9644919b064Andreas Huber // the virtual "createRenderer" method above facilitating extraction 1339f9afef3d5da3be6812192e60797b1c035445c3cAndreas Huber // of the ISurface from a regular Surface or a java Surface object. 134ccf8b94169197875af6c89172015b9644919b064Andreas Huber sp<IOMXRenderer> createRenderer( 135ccf8b94169197875af6c89172015b9644919b064Andreas Huber const sp<Surface> &surface, 136ccf8b94169197875af6c89172015b9644919b064Andreas Huber const char *componentName, 137ccf8b94169197875af6c89172015b9644919b064Andreas Huber OMX_COLOR_FORMATTYPE colorFormat, 138ccf8b94169197875af6c89172015b9644919b064Andreas Huber size_t encodedWidth, size_t encodedHeight, 139ccf8b94169197875af6c89172015b9644919b064Andreas Huber size_t displayWidth, size_t displayHeight); 1409f9afef3d5da3be6812192e60797b1c035445c3cAndreas Huber 1419f9afef3d5da3be6812192e60797b1c035445c3cAndreas Huber sp<IOMXRenderer> createRendererFromJavaSurface( 1429f9afef3d5da3be6812192e60797b1c035445c3cAndreas Huber JNIEnv *env, jobject javaSurface, 1439f9afef3d5da3be6812192e60797b1c035445c3cAndreas Huber const char *componentName, 1449f9afef3d5da3be6812192e60797b1c035445c3cAndreas Huber OMX_COLOR_FORMATTYPE colorFormat, 1459f9afef3d5da3be6812192e60797b1c035445c3cAndreas Huber size_t encodedWidth, size_t encodedHeight, 1469f9afef3d5da3be6812192e60797b1c035445c3cAndreas Huber size_t displayWidth, size_t displayHeight); 147e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber}; 148e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 149e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huberstruct omx_message { 150e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber enum { 151e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber EVENT, 152e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber EMPTY_BUFFER_DONE, 153e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber FILL_BUFFER_DONE, 154e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 155e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber } type; 156e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 157be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber IOMX::node_id node; 158be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber 159e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber union { 160e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber // if type == EVENT 161e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber struct { 162e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber OMX_EVENTTYPE event; 163e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber OMX_U32 data1; 164e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber OMX_U32 data2; 165e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber } event_data; 166e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 167329577aa6d422d1dbb33f4771fc5e2949b4ad312Andreas Huber // if type == EMPTY_BUFFER_DONE 168e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber struct { 169e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber IOMX::buffer_id buffer; 170e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber } buffer_data; 171e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 172329577aa6d422d1dbb33f4771fc5e2949b4ad312Andreas Huber // if type == FILL_BUFFER_DONE 173e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber struct { 174e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber IOMX::buffer_id buffer; 175e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber OMX_U32 range_offset; 176e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber OMX_U32 range_length; 177e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber OMX_U32 flags; 178e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber OMX_TICKS timestamp; 179329577aa6d422d1dbb33f4771fc5e2949b4ad312Andreas Huber OMX_PTR platform_private; 18052733b83a736b500f72f72733b06258601c966f8Andreas Huber OMX_PTR data_ptr; 181e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber } extended_buffer_data; 182e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 183e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber } u; 184e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber}; 185e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 186e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huberclass IOMXObserver : public IInterface { 187e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huberpublic: 188e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber DECLARE_META_INTERFACE(OMXObserver); 189e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 190784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber virtual void onMessage(const omx_message &msg) = 0; 191e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber}; 192e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 1931de13168a9d9f55464dc98748ea28ef785f1048eAndreas Huberclass IOMXRenderer : public IInterface { 1941de13168a9d9f55464dc98748ea28ef785f1048eAndreas Huberpublic: 1951de13168a9d9f55464dc98748ea28ef785f1048eAndreas Huber DECLARE_META_INTERFACE(OMXRenderer); 1961de13168a9d9f55464dc98748ea28ef785f1048eAndreas Huber 1971de13168a9d9f55464dc98748ea28ef785f1048eAndreas Huber virtual void render(IOMX::buffer_id buffer) = 0; 1981de13168a9d9f55464dc98748ea28ef785f1048eAndreas Huber}; 1991de13168a9d9f55464dc98748ea28ef785f1048eAndreas Huber 200e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber//////////////////////////////////////////////////////////////////////////////// 201e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 202e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huberclass BnOMX : public BnInterface<IOMX> { 203e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huberpublic: 204e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber virtual status_t onTransact( 205e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber uint32_t code, const Parcel &data, Parcel *reply, 206e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber uint32_t flags = 0); 207e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber}; 208e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 209e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huberclass BnOMXObserver : public BnInterface<IOMXObserver> { 210e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huberpublic: 211e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber virtual status_t onTransact( 212e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber uint32_t code, const Parcel &data, Parcel *reply, 213e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber uint32_t flags = 0); 214e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber}; 215e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 2161de13168a9d9f55464dc98748ea28ef785f1048eAndreas Huberclass BnOMXRenderer : public BnInterface<IOMXRenderer> { 2171de13168a9d9f55464dc98748ea28ef785f1048eAndreas Huberpublic: 2181de13168a9d9f55464dc98748ea28ef785f1048eAndreas Huber virtual status_t onTransact( 2191de13168a9d9f55464dc98748ea28ef785f1048eAndreas Huber uint32_t code, const Parcel &data, Parcel *reply, 2201de13168a9d9f55464dc98748ea28ef785f1048eAndreas Huber uint32_t flags = 0); 2211de13168a9d9f55464dc98748ea28ef785f1048eAndreas Huber}; 2221de13168a9d9f55464dc98748ea28ef785f1048eAndreas Huber 223e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber} // namespace android 224e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 225e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber#endif // ANDROID_IOMX_H_ 226