1bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber/* 2bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber * Copyright (C) 2011 The Android Open Source Project 3bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber * 4bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber * Licensed under the Apache License, Version 2.0 (the "License"); 5bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber * you may not use this file except in compliance with the License. 6bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber * You may obtain a copy of the License at 7bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber * 8bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber * http://www.apache.org/licenses/LICENSE-2.0 9bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber * 10bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber * Unless required by applicable law or agreed to in writing, software 11bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber * distributed under the License is distributed on an "AS IS" BASIS, 12bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber * See the License for the specific language governing permissions and 14bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber * limitations under the License. 15bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber */ 16bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber 17bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber#ifndef SIMPLE_SOFT_OMX_COMPONENT_H_ 18bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber 19bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber#define SIMPLE_SOFT_OMX_COMPONENT_H_ 20bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber 21bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber#include "SoftOMXComponent.h" 22bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber 23bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber#include <media/stagefright/foundation/AHandlerReflector.h> 24bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber#include <utils/RefBase.h> 25bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber#include <utils/threads.h> 26bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber#include <utils/Vector.h> 27bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber 28bbba88cb1bdc34705d1477208990a06904c022e7Andreas Hubernamespace android { 29bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber 30bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huberstruct ALooper; 31bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber 32d02c08671d666e12a94bcadd943787a9ab2ceea8Chong Zhangstruct CodecProfileLevel { 33d02c08671d666e12a94bcadd943787a9ab2ceea8Chong Zhang OMX_U32 mProfile; 34d02c08671d666e12a94bcadd943787a9ab2ceea8Chong Zhang OMX_U32 mLevel; 35d02c08671d666e12a94bcadd943787a9ab2ceea8Chong Zhang}; 36d02c08671d666e12a94bcadd943787a9ab2ceea8Chong Zhang 37bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huberstruct SimpleSoftOMXComponent : public SoftOMXComponent { 38bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber SimpleSoftOMXComponent( 39bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber const char *name, 40bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber const OMX_CALLBACKTYPE *callbacks, 41bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber OMX_PTR appData, 42bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber OMX_COMPONENTTYPE **component); 43bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber 445a65e30064dc8dffa4f3d868f1c46038972c40c5Andreas Huber virtual void prepareForDestruction(); 45bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber 46bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber void onMessageReceived(const sp<AMessage> &msg); 47bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber 48bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huberprotected: 49bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber struct BufferInfo { 50bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber OMX_BUFFERHEADERTYPE *mHeader; 51bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber bool mOwnedByUs; 52bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber }; 53bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber 54bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber struct PortInfo { 55bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber OMX_PARAM_PORTDEFINITIONTYPE mDef; 56bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber Vector<BufferInfo> mBuffers; 57bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber List<BufferInfo *> mQueue; 58bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber 59bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber enum { 60bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber NONE, 61bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber DISABLING, 62bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber ENABLING, 63bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber } mTransition; 64bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber }; 65bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber 66031be0f358b07732092a4d1bf02fc99f109a63c4Ronghua Wu enum { 67031be0f358b07732092a4d1bf02fc99f109a63c4Ronghua Wu kStoreMetaDataExtensionIndex = OMX_IndexVendorStartUnused + 1, 68031be0f358b07732092a4d1bf02fc99f109a63c4Ronghua Wu kPrepareForAdaptivePlaybackIndex, 69031be0f358b07732092a4d1bf02fc99f109a63c4Ronghua Wu }; 70031be0f358b07732092a4d1bf02fc99f109a63c4Ronghua Wu 71bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber void addPort(const OMX_PARAM_PORTDEFINITIONTYPE &def); 72bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber 73bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber virtual OMX_ERRORTYPE internalGetParameter( 74bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber OMX_INDEXTYPE index, OMX_PTR params); 75bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber 76bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber virtual OMX_ERRORTYPE internalSetParameter( 77bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber OMX_INDEXTYPE index, const OMX_PTR params); 78bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber 79bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber virtual void onQueueFilled(OMX_U32 portIndex); 80bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber List<BufferInfo *> &getPortQueue(OMX_U32 portIndex); 81bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber 82bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber virtual void onPortFlushCompleted(OMX_U32 portIndex); 83bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber virtual void onPortEnableCompleted(OMX_U32 portIndex, bool enabled); 846fc72b01a3b67903b52f1d33b1ad5c960b5365f1Marco Nelissen virtual void onReset(); 85bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber 86bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber PortInfo *editPortInfo(OMX_U32 portIndex); 87bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber 88bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huberprivate: 89bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber enum { 90bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber kWhatSendCommand, 91bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber kWhatEmptyThisBuffer, 92bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber kWhatFillThisBuffer, 93bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber }; 94bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber 95bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber Mutex mLock; 96bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber 97bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber sp<ALooper> mLooper; 98bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber sp<AHandlerReflector<SimpleSoftOMXComponent> > mHandler; 99bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber 100bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber OMX_STATETYPE mState; 101bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber OMX_STATETYPE mTargetState; 102bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber 103bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber Vector<PortInfo> mPorts; 104bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber 105bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber bool isSetParameterAllowed( 106bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber OMX_INDEXTYPE index, const OMX_PTR params) const; 107bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber 108bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber virtual OMX_ERRORTYPE sendCommand( 109bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber OMX_COMMANDTYPE cmd, OMX_U32 param, OMX_PTR data); 110bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber 111bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber virtual OMX_ERRORTYPE getParameter( 112bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber OMX_INDEXTYPE index, OMX_PTR params); 113bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber 114bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber virtual OMX_ERRORTYPE setParameter( 115bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber OMX_INDEXTYPE index, const OMX_PTR params); 116bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber 117bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber virtual OMX_ERRORTYPE useBuffer( 118bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber OMX_BUFFERHEADERTYPE **buffer, 119bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber OMX_U32 portIndex, 120bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber OMX_PTR appPrivate, 121bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber OMX_U32 size, 122bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber OMX_U8 *ptr); 123bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber 124bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber virtual OMX_ERRORTYPE allocateBuffer( 125bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber OMX_BUFFERHEADERTYPE **buffer, 126bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber OMX_U32 portIndex, 127bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber OMX_PTR appPrivate, 128bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber OMX_U32 size); 129bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber 130bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber virtual OMX_ERRORTYPE freeBuffer( 131bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber OMX_U32 portIndex, 132bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber OMX_BUFFERHEADERTYPE *buffer); 133bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber 134bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber virtual OMX_ERRORTYPE emptyThisBuffer( 135bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber OMX_BUFFERHEADERTYPE *buffer); 136bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber 137bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber virtual OMX_ERRORTYPE fillThisBuffer( 138bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber OMX_BUFFERHEADERTYPE *buffer); 139bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber 140bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber virtual OMX_ERRORTYPE getState(OMX_STATETYPE *state); 141bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber 142bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber void onSendCommand(OMX_COMMANDTYPE cmd, OMX_U32 param); 143bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber void onChangeState(OMX_STATETYPE state); 144bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber void onPortEnable(OMX_U32 portIndex, bool enable); 145bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber void onPortFlush(OMX_U32 portIndex, bool sendFlushComplete); 146bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber 147bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber void checkTransitions(); 148bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber 149bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber DISALLOW_EVIL_CONSTRUCTORS(SimpleSoftOMXComponent); 150bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber}; 151bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber 152bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber} // namespace android 153bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber 154bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber#endif // SIMPLE_SOFT_OMX_COMPONENT_H_ 155