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