OMXNodeInstance.h revision f8a4cb410115045278f534e54b41ac78d6bf6c07
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/SortedVector.h> 25#include <utils/threads.h> 26 27namespace android { 28 29class IOMXObserver; 30struct OMXMaster; 31class GraphicBufferSource; 32 33status_t StatusFromOMXError(OMX_ERRORTYPE err); 34 35struct OMXNodeInstance { 36 OMXNodeInstance( 37 OMX *owner, const sp<IOMXObserver> &observer, const char *name); 38 39 void setHandle(OMX::node_id node_id, OMX_HANDLETYPE handle); 40 41 OMX *owner(); 42 sp<IOMXObserver> observer(); 43 OMX::node_id nodeID(); 44 45 status_t freeNode(OMXMaster *master); 46 47 status_t sendCommand(OMX_COMMANDTYPE cmd, OMX_S32 param); 48 status_t getParameter(OMX_INDEXTYPE index, void *params, size_t size); 49 50 status_t setParameter( 51 OMX_INDEXTYPE index, const void *params, size_t size); 52 53 status_t getConfig(OMX_INDEXTYPE index, void *params, size_t size); 54 status_t setConfig(OMX_INDEXTYPE index, const void *params, size_t size); 55 56 status_t getState(OMX_STATETYPE* state); 57 58 status_t enableGraphicBuffers(OMX_U32 portIndex, OMX_BOOL enable); 59 60 status_t getGraphicBufferUsage(OMX_U32 portIndex, OMX_U32* usage); 61 62 status_t storeMetaDataInBuffers( 63 OMX_U32 portIndex, OMX_BOOL enable, MetadataBufferType *type); 64 65 status_t prepareForAdaptivePlayback( 66 OMX_U32 portIndex, OMX_BOOL enable, 67 OMX_U32 maxFrameWidth, OMX_U32 maxFrameHeight); 68 69 status_t configureVideoTunnelMode( 70 OMX_U32 portIndex, OMX_BOOL tunneled, 71 OMX_U32 audioHwSync, native_handle_t **sidebandHandle); 72 73 status_t useBuffer( 74 OMX_U32 portIndex, const sp<IMemory> ¶ms, 75 OMX::buffer_id *buffer, OMX_U32 allottedSize, OMX_BOOL crossProcess); 76 77 status_t useGraphicBuffer( 78 OMX_U32 portIndex, const sp<GraphicBuffer> &graphicBuffer, 79 OMX::buffer_id *buffer); 80 81 status_t updateGraphicBufferInMeta( 82 OMX_U32 portIndex, const sp<GraphicBuffer> &graphicBuffer, 83 OMX::buffer_id buffer); 84 85 status_t createInputSurface( 86 OMX_U32 portIndex, sp<IGraphicBufferProducer> *bufferProducer, 87 MetadataBufferType *type); 88 89 static status_t createPersistentInputSurface( 90 sp<IGraphicBufferProducer> *bufferProducer, 91 sp<IGraphicBufferConsumer> *bufferConsumer); 92 93 status_t setInputSurface( 94 OMX_U32 portIndex, const sp<IGraphicBufferConsumer> &bufferConsumer, 95 MetadataBufferType *type); 96 97 status_t signalEndOfInputStream(); 98 99 status_t allocateBuffer( 100 OMX_U32 portIndex, size_t size, OMX::buffer_id *buffer, 101 void **buffer_data); 102 103 status_t allocateBufferWithBackup( 104 OMX_U32 portIndex, const sp<IMemory> ¶ms, 105 OMX::buffer_id *buffer, OMX_U32 allottedSize, OMX_BOOL crossProcess); 106 107 status_t freeBuffer(OMX_U32 portIndex, OMX::buffer_id buffer); 108 109 status_t fillBuffer(OMX::buffer_id buffer, int fenceFd); 110 111 status_t emptyBuffer( 112 OMX::buffer_id buffer, 113 OMX_U32 rangeOffset, OMX_U32 rangeLength, 114 OMX_U32 flags, OMX_TICKS timestamp, int fenceFd); 115 116 status_t emptyGraphicBuffer( 117 OMX_BUFFERHEADERTYPE *header, const sp<GraphicBuffer> &buffer, 118 OMX_U32 flags, OMX_TICKS timestamp, int fenceFd); 119 120 status_t getExtensionIndex( 121 const char *parameterName, OMX_INDEXTYPE *index); 122 123 status_t setInternalOption( 124 OMX_U32 portIndex, 125 IOMX::InternalOptionType type, 126 const void *data, 127 size_t size); 128 129 bool isSecure() const { 130 return mIsSecure; 131 } 132 133 // handles messages and removes them from the list 134 void onMessages(std::list<omx_message> &messages); 135 void onMessage(const omx_message &msg); 136 void onObserverDied(OMXMaster *master); 137 void onGetHandleFailed(); 138 void onEvent(OMX_EVENTTYPE event, OMX_U32 arg1, OMX_U32 arg2); 139 140 static OMX_CALLBACKTYPE kCallbacks; 141 142private: 143 Mutex mLock; 144 145 OMX *mOwner; 146 OMX::node_id mNodeID; 147 OMX_HANDLETYPE mHandle; 148 sp<IOMXObserver> mObserver; 149 bool mDying; 150 bool mSailed; // configuration is set (no more meta-mode changes) 151 bool mQueriedProhibitedExtensions; 152 SortedVector<OMX_INDEXTYPE> mProhibitedExtensions; 153 bool mIsSecure; 154 155 // Lock only covers mGraphicBufferSource. We can't always use mLock 156 // because of rare instances where we'd end up locking it recursively. 157 Mutex mGraphicBufferSourceLock; 158 // Access this through getGraphicBufferSource(). 159 sp<GraphicBufferSource> mGraphicBufferSource; 160 161 162 struct ActiveBuffer { 163 OMX_U32 mPortIndex; 164 OMX::buffer_id mID; 165 }; 166 Vector<ActiveBuffer> mActiveBuffers; 167 // for buffer ptr to buffer id translation 168 Mutex mBufferIDLock; 169 uint32_t mBufferIDCount; 170 KeyedVector<OMX::buffer_id, OMX_BUFFERHEADERTYPE *> mBufferIDToBufferHeader; 171 KeyedVector<OMX_BUFFERHEADERTYPE *, OMX::buffer_id> mBufferHeaderToBufferID; 172 MetadataBufferType mMetadataType[2]; 173 174 // For debug support 175 char *mName; 176 int DEBUG; 177 size_t mNumPortBuffers[2]; // modified under mLock, read outside for debug 178 Mutex mDebugLock; 179 // following are modified and read under mDebugLock 180 int DEBUG_BUMP; 181 SortedVector<OMX_BUFFERHEADERTYPE *> mInputBuffersWithCodec, mOutputBuffersWithCodec; 182 size_t mDebugLevelBumpPendingBuffers[2]; 183 void bumpDebugLevel_l(size_t numInputBuffers, size_t numOutputBuffers); 184 void unbumpDebugLevel_l(size_t portIndex); 185 186 ~OMXNodeInstance(); 187 188 void addActiveBuffer(OMX_U32 portIndex, OMX::buffer_id id); 189 void removeActiveBuffer(OMX_U32 portIndex, OMX::buffer_id id); 190 void freeActiveBuffers(); 191 192 // For buffer id management 193 OMX::buffer_id makeBufferID(OMX_BUFFERHEADERTYPE *bufferHeader); 194 OMX_BUFFERHEADERTYPE *findBufferHeader(OMX::buffer_id buffer, OMX_U32 portIndex); 195 OMX::buffer_id findBufferID(OMX_BUFFERHEADERTYPE *bufferHeader); 196 void invalidateBufferID(OMX::buffer_id buffer); 197 198 bool isProhibitedIndex_l(OMX_INDEXTYPE index); 199 200 status_t useGraphicBuffer2_l( 201 OMX_U32 portIndex, const sp<GraphicBuffer> &graphicBuffer, 202 OMX::buffer_id *buffer); 203 static OMX_ERRORTYPE OnEvent( 204 OMX_IN OMX_HANDLETYPE hComponent, 205 OMX_IN OMX_PTR pAppData, 206 OMX_IN OMX_EVENTTYPE eEvent, 207 OMX_IN OMX_U32 nData1, 208 OMX_IN OMX_U32 nData2, 209 OMX_IN OMX_PTR pEventData); 210 211 static OMX_ERRORTYPE OnEmptyBufferDone( 212 OMX_IN OMX_HANDLETYPE hComponent, 213 OMX_IN OMX_PTR pAppData, 214 OMX_IN OMX_BUFFERHEADERTYPE *pBuffer); 215 216 static OMX_ERRORTYPE OnFillBufferDone( 217 OMX_IN OMX_HANDLETYPE hComponent, 218 OMX_IN OMX_PTR pAppData, 219 OMX_IN OMX_BUFFERHEADERTYPE *pBuffer); 220 221 status_t storeMetaDataInBuffers_l( 222 OMX_U32 portIndex, OMX_BOOL enable, MetadataBufferType *type); 223 224 // Stores fence into buffer if it is ANWBuffer type and has enough space. 225 // otherwise, waits for the fence to signal. Takes ownership of |fenceFd|. 226 status_t storeFenceInMeta_l( 227 OMX_BUFFERHEADERTYPE *header, int fenceFd, OMX_U32 portIndex); 228 229 // Retrieves the fence from buffer if ANWBuffer type and has enough space. Otherwise, returns -1 230 int retrieveFenceFromMeta_l( 231 OMX_BUFFERHEADERTYPE *header, OMX_U32 portIndex); 232 233 status_t emptyBuffer_l( 234 OMX_BUFFERHEADERTYPE *header, 235 OMX_U32 flags, OMX_TICKS timestamp, intptr_t debugAddr, int fenceFd); 236 237 status_t updateGraphicBufferInMeta_l( 238 OMX_U32 portIndex, const sp<GraphicBuffer> &graphicBuffer, 239 OMX::buffer_id buffer, OMX_BUFFERHEADERTYPE *header); 240 241 status_t createGraphicBufferSource( 242 OMX_U32 portIndex, sp<IGraphicBufferConsumer> consumer /* nullable */, 243 MetadataBufferType *type); 244 sp<GraphicBufferSource> getGraphicBufferSource(); 245 void setGraphicBufferSource(const sp<GraphicBufferSource>& bufferSource); 246 247 // Handles |msg|, and may modify it. Returns true iff completely handled it and 248 // |msg| does not need to be sent to the event listener. 249 bool handleMessage(omx_message &msg); 250 251 OMXNodeInstance(const OMXNodeInstance &); 252 OMXNodeInstance &operator=(const OMXNodeInstance &); 253}; 254 255} // namespace android 256 257#endif // OMX_NODE_INSTANCE_H_ 258