/* * Copyright (C) 2009 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef ANDROID_IOMX_H_ #define ANDROID_IOMX_H_ #include #include #include #include #include #include #include namespace android { class IMemory; class IOMXObserver; class IOMXRenderer; class Surface; class IOMX : public IInterface { public: DECLARE_META_INTERFACE(OMX); typedef uint32_t buffer_id; typedef uint32_t node_id; // Given a node_id and the calling process' pid, returns true iff // the implementation of the OMX interface lives in the same // process. virtual bool livesLocally(node_id node, pid_t pid) = 0; struct ComponentInfo { String8 mName; List mRoles; }; virtual status_t listNodes(List *list) = 0; virtual status_t allocateNode( const char *name, const sp &observer, node_id *node) = 0; virtual status_t freeNode(node_id node) = 0; virtual status_t sendCommand( node_id node, OMX_COMMANDTYPE cmd, OMX_S32 param) = 0; virtual status_t getParameter( node_id node, OMX_INDEXTYPE index, void *params, size_t size) = 0; virtual status_t setParameter( node_id node, OMX_INDEXTYPE index, const void *params, size_t size) = 0; virtual status_t getConfig( node_id node, OMX_INDEXTYPE index, void *params, size_t size) = 0; virtual status_t setConfig( node_id node, OMX_INDEXTYPE index, const void *params, size_t size) = 0; virtual status_t getState( node_id node, OMX_STATETYPE* state) = 0; virtual status_t storeMetaDataInBuffers( node_id node, OMX_U32 port_index, OMX_BOOL enable) = 0; virtual status_t prepareForAdaptivePlayback( node_id node, OMX_U32 portIndex, OMX_BOOL enable, OMX_U32 maxFrameWidth, OMX_U32 maxFrameHeight) = 0; virtual status_t enableGraphicBuffers( node_id node, OMX_U32 port_index, OMX_BOOL enable) = 0; virtual status_t getGraphicBufferUsage( node_id node, OMX_U32 port_index, OMX_U32* usage) = 0; virtual status_t useBuffer( node_id node, OMX_U32 port_index, const sp ¶ms, buffer_id *buffer) = 0; virtual status_t useGraphicBuffer( node_id node, OMX_U32 port_index, const sp &graphicBuffer, buffer_id *buffer) = 0; virtual status_t updateGraphicBufferInMeta( node_id node, OMX_U32 port_index, const sp &graphicBuffer, buffer_id buffer) = 0; virtual status_t createInputSurface( node_id node, OMX_U32 port_index, sp *bufferProducer) = 0; virtual status_t signalEndOfInputStream(node_id node) = 0; // This API clearly only makes sense if the caller lives in the // same process as the callee, i.e. is the media_server, as the // returned "buffer_data" pointer is just that, a pointer into local // address space. virtual status_t allocateBuffer( node_id node, OMX_U32 port_index, size_t size, buffer_id *buffer, void **buffer_data) = 0; virtual status_t allocateBufferWithBackup( node_id node, OMX_U32 port_index, const sp ¶ms, buffer_id *buffer) = 0; virtual status_t freeBuffer( node_id node, OMX_U32 port_index, buffer_id buffer) = 0; virtual status_t fillBuffer(node_id node, buffer_id buffer) = 0; virtual status_t emptyBuffer( node_id node, buffer_id buffer, OMX_U32 range_offset, OMX_U32 range_length, OMX_U32 flags, OMX_TICKS timestamp) = 0; virtual status_t getExtensionIndex( node_id node, const char *parameter_name, OMX_INDEXTYPE *index) = 0; enum InternalOptionType { INTERNAL_OPTION_SUSPEND, // data is a bool INTERNAL_OPTION_REPEAT_PREVIOUS_FRAME_DELAY, // data is an int64_t INTERNAL_OPTION_MAX_TIMESTAMP_GAP, // data is int64_t }; virtual status_t setInternalOption( node_id node, OMX_U32 port_index, InternalOptionType type, const void *data, size_t size) = 0; }; struct omx_message { enum { EVENT, EMPTY_BUFFER_DONE, FILL_BUFFER_DONE, } type; IOMX::node_id node; union { // if type == EVENT struct { OMX_EVENTTYPE event; OMX_U32 data1; OMX_U32 data2; } event_data; // if type == EMPTY_BUFFER_DONE struct { IOMX::buffer_id buffer; } buffer_data; // if type == FILL_BUFFER_DONE struct { IOMX::buffer_id buffer; OMX_U32 range_offset; OMX_U32 range_length; OMX_U32 flags; OMX_TICKS timestamp; OMX_PTR platform_private; OMX_PTR data_ptr; } extended_buffer_data; } u; }; class IOMXObserver : public IInterface { public: DECLARE_META_INTERFACE(OMXObserver); virtual void onMessage(const omx_message &msg) = 0; }; //////////////////////////////////////////////////////////////////////////////// class BnOMX : public BnInterface { public: virtual status_t onTransact( uint32_t code, const Parcel &data, Parcel *reply, uint32_t flags = 0); }; class BnOMXObserver : public BnInterface { public: virtual status_t onTransact( uint32_t code, const Parcel &data, Parcel *reply, uint32_t flags = 0); }; struct CodecProfileLevel { OMX_U32 mProfile; OMX_U32 mLevel; }; } // namespace android #endif // ANDROID_IOMX_H_