OMXNodeInstance.h revision cc7cc67349b7a3f498882087aa42ffc05a2daf11
1/* 2 * Copyright (C) 2009 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17#ifndef OMX_NODE_INSTANCE_H_ 18 19#define OMX_NODE_INSTANCE_H_ 20 21#include "OMX.h" 22 23#include <utils/RefBase.h> 24#include <utils/threads.h> 25 26namespace android { 27 28class IOMXObserver; 29struct OMXMaster; 30class GraphicBufferSource; 31 32status_t StatusFromOMXError(OMX_ERRORTYPE err); 33 34struct OMXNodeInstance { 35 OMXNodeInstance( 36 OMX *owner, const sp<IOMXObserver> &observer, const char *name); 37 38 void setHandle(OMX::node_id node_id, OMX_HANDLETYPE handle); 39 40 OMX *owner(); 41 sp<IOMXObserver> observer(); 42 OMX::node_id nodeID(); 43 44 status_t freeNode(OMXMaster *master); 45 46 status_t sendCommand(OMX_COMMANDTYPE cmd, OMX_S32 param); 47 status_t getParameter(OMX_INDEXTYPE index, void *params, size_t size); 48 49 status_t setParameter( 50 OMX_INDEXTYPE index, const void *params, size_t size); 51 52 status_t getConfig(OMX_INDEXTYPE index, void *params, size_t size); 53 status_t setConfig(OMX_INDEXTYPE index, const void *params, size_t size); 54 55 status_t getState(OMX_STATETYPE* state); 56 57 status_t enableGraphicBuffers(OMX_U32 portIndex, OMX_BOOL enable); 58 59 status_t getGraphicBufferUsage(OMX_U32 portIndex, OMX_U32* usage); 60 61 status_t storeMetaDataInBuffers(OMX_U32 portIndex, OMX_BOOL enable); 62 63 status_t prepareForAdaptivePlayback( 64 OMX_U32 portIndex, OMX_BOOL enable, 65 OMX_U32 maxFrameWidth, OMX_U32 maxFrameHeight); 66 67 status_t configureVideoTunnelMode( 68 OMX_U32 portIndex, OMX_BOOL tunneled, 69 OMX_U32 audioHwSync, native_handle_t **sidebandHandle); 70 71 status_t useBuffer( 72 OMX_U32 portIndex, const sp<IMemory> ¶ms, 73 OMX::buffer_id *buffer, OMX_U32 allottedSize); 74 75 status_t useGraphicBuffer( 76 OMX_U32 portIndex, const sp<GraphicBuffer> &graphicBuffer, 77 OMX::buffer_id *buffer); 78 79 status_t updateGraphicBufferInMeta( 80 OMX_U32 portIndex, const sp<GraphicBuffer> &graphicBuffer, 81 OMX::buffer_id buffer); 82 83 status_t createInputSurface( 84 OMX_U32 portIndex, sp<IGraphicBufferProducer> *bufferProducer); 85 86 static status_t createPersistentInputSurface( 87 sp<IGraphicBufferProducer> *bufferProducer, 88 sp<IGraphicBufferConsumer> *bufferConsumer); 89 90 status_t setInputSurface( 91 OMX_U32 portIndex, const sp<IGraphicBufferConsumer> &bufferConsumer); 92 93 status_t signalEndOfInputStream(); 94 95 status_t allocateBuffer( 96 OMX_U32 portIndex, size_t size, OMX::buffer_id *buffer, 97 void **buffer_data); 98 99 status_t allocateBufferWithBackup( 100 OMX_U32 portIndex, const sp<IMemory> ¶ms, 101 OMX::buffer_id *buffer, OMX_U32 allottedSize); 102 103 status_t freeBuffer(OMX_U32 portIndex, OMX::buffer_id buffer); 104 105 status_t fillBuffer(OMX::buffer_id buffer); 106 107 status_t emptyBuffer( 108 OMX::buffer_id buffer, 109 OMX_U32 rangeOffset, OMX_U32 rangeLength, 110 OMX_U32 flags, OMX_TICKS timestamp); 111 112 status_t emptyDirectBuffer( 113 OMX_BUFFERHEADERTYPE *header, 114 OMX_U32 rangeOffset, OMX_U32 rangeLength, 115 OMX_U32 flags, OMX_TICKS timestamp); 116 117 status_t getExtensionIndex( 118 const char *parameterName, OMX_INDEXTYPE *index); 119 120 status_t setInternalOption( 121 OMX_U32 portIndex, 122 IOMX::InternalOptionType type, 123 const void *data, 124 size_t size); 125 126 void onMessage(const omx_message &msg); 127 void onObserverDied(OMXMaster *master); 128 void onGetHandleFailed(); 129 void onEvent(OMX_EVENTTYPE event, OMX_U32 arg1, OMX_U32 arg2); 130 131 static OMX_CALLBACKTYPE kCallbacks; 132 133private: 134 Mutex mLock; 135 136 OMX *mOwner; 137 OMX::node_id mNodeID; 138 OMX_HANDLETYPE mHandle; 139 sp<IOMXObserver> mObserver; 140 bool mDying; 141 142 // Lock only covers mGraphicBufferSource. We can't always use mLock 143 // because of rare instances where we'd end up locking it recursively. 144 Mutex mGraphicBufferSourceLock; 145 // Access this through getGraphicBufferSource(). 146 sp<GraphicBufferSource> mGraphicBufferSource; 147 148 149 struct ActiveBuffer { 150 OMX_U32 mPortIndex; 151 OMX::buffer_id mID; 152 }; 153 Vector<ActiveBuffer> mActiveBuffers; 154 // for buffer ptr to buffer id translation 155 Mutex mBufferIDLock; 156 uint32_t mBufferIDCount; 157 KeyedVector<OMX::buffer_id, OMX_BUFFERHEADERTYPE *> mBufferIDToBufferHeader; 158 KeyedVector<OMX_BUFFERHEADERTYPE *, OMX::buffer_id> mBufferHeaderToBufferID; 159 160 // For debug support 161 char *mName; 162 int DEBUG; 163 size_t mNumPortBuffers[2]; // modified under mLock, read outside for debug 164 Mutex mDebugLock; 165 // following are modified and read under mDebugLock 166 int DEBUG_BUMP; 167 SortedVector<OMX_BUFFERHEADERTYPE *> mInputBuffersWithCodec, mOutputBuffersWithCodec; 168 size_t mDebugLevelBumpPendingBuffers[2]; 169 void bumpDebugLevel_l(size_t numInputBuffers, size_t numOutputBuffers); 170 void unbumpDebugLevel_l(size_t portIndex); 171 172 ~OMXNodeInstance(); 173 174 void addActiveBuffer(OMX_U32 portIndex, OMX::buffer_id id); 175 void removeActiveBuffer(OMX_U32 portIndex, OMX::buffer_id id); 176 void freeActiveBuffers(); 177 178 // For buffer id management 179 OMX::buffer_id makeBufferID(OMX_BUFFERHEADERTYPE *bufferHeader); 180 OMX_BUFFERHEADERTYPE *findBufferHeader(OMX::buffer_id buffer); 181 OMX::buffer_id findBufferID(OMX_BUFFERHEADERTYPE *bufferHeader); 182 void invalidateBufferID(OMX::buffer_id buffer); 183 184 status_t useGraphicBuffer2_l( 185 OMX_U32 portIndex, const sp<GraphicBuffer> &graphicBuffer, 186 OMX::buffer_id *buffer); 187 static OMX_ERRORTYPE OnEvent( 188 OMX_IN OMX_HANDLETYPE hComponent, 189 OMX_IN OMX_PTR pAppData, 190 OMX_IN OMX_EVENTTYPE eEvent, 191 OMX_IN OMX_U32 nData1, 192 OMX_IN OMX_U32 nData2, 193 OMX_IN OMX_PTR pEventData); 194 195 static OMX_ERRORTYPE OnEmptyBufferDone( 196 OMX_IN OMX_HANDLETYPE hComponent, 197 OMX_IN OMX_PTR pAppData, 198 OMX_IN OMX_BUFFERHEADERTYPE *pBuffer); 199 200 static OMX_ERRORTYPE OnFillBufferDone( 201 OMX_IN OMX_HANDLETYPE hComponent, 202 OMX_IN OMX_PTR pAppData, 203 OMX_IN OMX_BUFFERHEADERTYPE *pBuffer); 204 205 status_t storeMetaDataInBuffers_l( 206 OMX_U32 portIndex, OMX_BOOL enable, 207 OMX_BOOL useGraphicBuffer, OMX_BOOL *usingGraphicBufferInMeta); 208 209 status_t emptyBuffer_l( 210 OMX_BUFFERHEADERTYPE *header, 211 OMX_U32 flags, OMX_TICKS timestamp, intptr_t debugAddr); 212 213 status_t createGraphicBufferSource( 214 OMX_U32 portIndex, sp<IGraphicBufferConsumer> consumer = NULL); 215 sp<GraphicBufferSource> getGraphicBufferSource(); 216 void setGraphicBufferSource(const sp<GraphicBufferSource>& bufferSource); 217 218 OMXNodeInstance(const OMXNodeInstance &); 219 OMXNodeInstance &operator=(const OMXNodeInstance &); 220}; 221 222} // namespace android 223 224#endif // OMX_NODE_INSTANCE_H_ 225