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