1 /* 2 * Copyright (C) 2011 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 SIMPLE_SOFT_OMX_COMPONENT_H_ 18 19 #define SIMPLE_SOFT_OMX_COMPONENT_H_ 20 21 #include "SoftOMXComponent.h" 22 23 #include <atomic> 24 #include <media/stagefright/foundation/AHandlerReflector.h> 25 #include <utils/RefBase.h> 26 #include <utils/threads.h> 27 #include <utils/Vector.h> 28 29 namespace android { 30 31 struct ALooper; 32 struct ABuffer; 33 34 struct CodecProfileLevel { 35 OMX_U32 mProfile; 36 OMX_U32 mLevel; 37 }; 38 39 struct SimpleSoftOMXComponent : public SoftOMXComponent { 40 SimpleSoftOMXComponent( 41 const char *name, 42 const OMX_CALLBACKTYPE *callbacks, 43 OMX_PTR appData, 44 OMX_COMPONENTTYPE **component); 45 46 virtual void prepareForDestruction(); 47 48 void onMessageReceived(const sp<AMessage> &msg); 49 50 protected: 51 struct BufferInfo { 52 OMX_BUFFERHEADERTYPE *mHeader; 53 bool mOwnedByUs; 54 bool mFrameConfig; 55 }; 56 57 struct PortInfo { 58 OMX_PARAM_PORTDEFINITIONTYPE mDef; 59 Vector<BufferInfo> mBuffers; 60 List<BufferInfo *> mQueue; 61 62 enum { 63 NONE, 64 DISABLING, 65 ENABLING, 66 } mTransition; 67 }; 68 69 enum { 70 kStoreMetaDataExtensionIndex = OMX_IndexVendorStartUnused + 1, 71 kPrepareForAdaptivePlaybackIndex, 72 }; 73 74 void addPort(const OMX_PARAM_PORTDEFINITIONTYPE &def); 75 76 virtual OMX_ERRORTYPE internalGetParameter( 77 OMX_INDEXTYPE index, OMX_PTR params); 78 79 virtual OMX_ERRORTYPE internalSetParameter( 80 OMX_INDEXTYPE index, const OMX_PTR params); 81 82 virtual OMX_ERRORTYPE internalSetConfig( 83 OMX_INDEXTYPE index, const OMX_PTR params, bool *frameConfig); 84 85 virtual void onQueueFilled(OMX_U32 portIndex); 86 List<BufferInfo *> &getPortQueue(OMX_U32 portIndex); 87 88 virtual void onPortFlushCompleted(OMX_U32 portIndex); 89 virtual void onPortEnableCompleted(OMX_U32 portIndex, bool enabled); 90 virtual void onReset(); 91 92 PortInfo *editPortInfo(OMX_U32 portIndex); 93 94 private: 95 enum { 96 kWhatSendCommand, 97 kWhatEmptyThisBuffer, 98 kWhatFillThisBuffer, 99 }; 100 101 Mutex mLock; 102 103 sp<ALooper> mLooper; 104 sp<AHandlerReflector<SimpleSoftOMXComponent> > mHandler; 105 106 OMX_STATETYPE mState; 107 OMX_STATETYPE mTargetState; 108 109 Vector<PortInfo> mPorts; 110 std::atomic_bool mFrameConfig; 111 112 bool isSetParameterAllowed( 113 OMX_INDEXTYPE index, const OMX_PTR params) const; 114 115 virtual OMX_ERRORTYPE sendCommand( 116 OMX_COMMANDTYPE cmd, OMX_U32 param, OMX_PTR data); 117 118 virtual OMX_ERRORTYPE getParameter( 119 OMX_INDEXTYPE index, OMX_PTR params); 120 121 virtual OMX_ERRORTYPE setParameter( 122 OMX_INDEXTYPE index, const OMX_PTR params); 123 124 virtual OMX_ERRORTYPE setConfig( 125 OMX_INDEXTYPE index, const OMX_PTR params); 126 127 virtual OMX_ERRORTYPE useBuffer( 128 OMX_BUFFERHEADERTYPE **buffer, 129 OMX_U32 portIndex, 130 OMX_PTR appPrivate, 131 OMX_U32 size, 132 OMX_U8 *ptr); 133 134 virtual OMX_ERRORTYPE allocateBuffer( 135 OMX_BUFFERHEADERTYPE **buffer, 136 OMX_U32 portIndex, 137 OMX_PTR appPrivate, 138 OMX_U32 size); 139 140 virtual OMX_ERRORTYPE freeBuffer( 141 OMX_U32 portIndex, 142 OMX_BUFFERHEADERTYPE *buffer); 143 144 virtual OMX_ERRORTYPE emptyThisBuffer( 145 OMX_BUFFERHEADERTYPE *buffer); 146 147 virtual OMX_ERRORTYPE fillThisBuffer( 148 OMX_BUFFERHEADERTYPE *buffer); 149 150 virtual OMX_ERRORTYPE getState(OMX_STATETYPE *state); 151 152 void onSendCommand(OMX_COMMANDTYPE cmd, OMX_U32 param); 153 void onChangeState(OMX_STATETYPE state); 154 void onPortEnable(OMX_U32 portIndex, bool enable); 155 void onPortFlush(OMX_U32 portIndex, bool sendFlushComplete); 156 157 void checkTransitions(); 158 159 DISALLOW_EVIL_CONSTRUCTORS(SimpleSoftOMXComponent); 160 }; 161 162 } // namespace android 163 164 #endif // SIMPLE_SOFT_OMX_COMPONENT_H_ 165