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//#define LOG_NDEBUG 0 18bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber#define LOG_TAG "SimpleSoftOMXComponent" 19bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber#include <utils/Log.h> 20bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber 21bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber#include "include/SimpleSoftOMXComponent.h" 22bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber 23bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber#include <media/stagefright/foundation/ADebug.h> 24bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber#include <media/stagefright/foundation/ALooper.h> 25bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber#include <media/stagefright/foundation/AMessage.h> 26bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber 27bbba88cb1bdc34705d1477208990a06904c022e7Andreas Hubernamespace android { 28bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber 29bbba88cb1bdc34705d1477208990a06904c022e7Andreas HuberSimpleSoftOMXComponent::SimpleSoftOMXComponent( 30bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber const char *name, 31bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber const OMX_CALLBACKTYPE *callbacks, 32bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber OMX_PTR appData, 33bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber OMX_COMPONENTTYPE **component) 34bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber : SoftOMXComponent(name, callbacks, appData, component), 35bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber mLooper(new ALooper), 36bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber mHandler(new AHandlerReflector<SimpleSoftOMXComponent>(this)), 37bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber mState(OMX_StateLoaded), 38bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber mTargetState(OMX_StateLoaded) { 39bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber mLooper->setName(name); 40bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber mLooper->registerHandler(mHandler); 41bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber 42bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber mLooper->start( 43bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber false, // runOnCallingThread 44bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber false, // canCallJava 45078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber ANDROID_PRIORITY_FOREGROUND); 46bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber} 47bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber 485a65e30064dc8dffa4f3d868f1c46038972c40c5Andreas Hubervoid SimpleSoftOMXComponent::prepareForDestruction() { 495a65e30064dc8dffa4f3d868f1c46038972c40c5Andreas Huber // The looper's queue may still contain messages referencing this 505a65e30064dc8dffa4f3d868f1c46038972c40c5Andreas Huber // object. Make sure those are flushed before returning so that 515a65e30064dc8dffa4f3d868f1c46038972c40c5Andreas Huber // a subsequent dlunload() does not pull out the rug from under us. 525a65e30064dc8dffa4f3d868f1c46038972c40c5Andreas Huber 53bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber mLooper->unregisterHandler(mHandler->id()); 54bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber mLooper->stop(); 55bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber} 56bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber 57bbba88cb1bdc34705d1477208990a06904c022e7Andreas HuberOMX_ERRORTYPE SimpleSoftOMXComponent::sendCommand( 58bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber OMX_COMMANDTYPE cmd, OMX_U32 param, OMX_PTR data) { 59bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber CHECK(data == NULL); 60bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber 61bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber sp<AMessage> msg = new AMessage(kWhatSendCommand, mHandler->id()); 62bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber msg->setInt32("cmd", cmd); 63bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber msg->setInt32("param", param); 64bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber msg->post(); 65bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber 66bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber return OMX_ErrorNone; 67bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber} 68bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber 69bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huberbool SimpleSoftOMXComponent::isSetParameterAllowed( 70bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber OMX_INDEXTYPE index, const OMX_PTR params) const { 71bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber if (mState == OMX_StateLoaded) { 72bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber return true; 73bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber } 74bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber 75bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber OMX_U32 portIndex; 76bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber 77bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber switch (index) { 78bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber case OMX_IndexParamPortDefinition: 79bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber { 80bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber portIndex = ((OMX_PARAM_PORTDEFINITIONTYPE *)params)->nPortIndex; 81bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber break; 82bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber } 83bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber 84bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber case OMX_IndexParamAudioPcm: 85bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber { 86bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber portIndex = ((OMX_AUDIO_PARAM_PCMMODETYPE *)params)->nPortIndex; 87bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber break; 88bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber } 89bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber 90bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber case OMX_IndexParamAudioAac: 91bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber { 92bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber portIndex = ((OMX_AUDIO_PARAM_AACPROFILETYPE *)params)->nPortIndex; 93bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber break; 94bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber } 95bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber 96bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber default: 97bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber return false; 98bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber } 99bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber 100bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber CHECK(portIndex < mPorts.size()); 101bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber 102bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber return !mPorts.itemAt(portIndex).mDef.bEnabled; 103bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber} 104bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber 105bbba88cb1bdc34705d1477208990a06904c022e7Andreas HuberOMX_ERRORTYPE SimpleSoftOMXComponent::getParameter( 106bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber OMX_INDEXTYPE index, OMX_PTR params) { 107bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber Mutex::Autolock autoLock(mLock); 108bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber return internalGetParameter(index, params); 109bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber} 110bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber 111bbba88cb1bdc34705d1477208990a06904c022e7Andreas HuberOMX_ERRORTYPE SimpleSoftOMXComponent::setParameter( 112bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber OMX_INDEXTYPE index, const OMX_PTR params) { 113bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber Mutex::Autolock autoLock(mLock); 114bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber 115bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber CHECK(isSetParameterAllowed(index, params)); 116bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber 117bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber return internalSetParameter(index, params); 118bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber} 119bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber 120bbba88cb1bdc34705d1477208990a06904c022e7Andreas HuberOMX_ERRORTYPE SimpleSoftOMXComponent::internalGetParameter( 121bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber OMX_INDEXTYPE index, OMX_PTR params) { 122bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber switch (index) { 123bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber case OMX_IndexParamPortDefinition: 124bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber { 125bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber OMX_PARAM_PORTDEFINITIONTYPE *defParams = 126bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber (OMX_PARAM_PORTDEFINITIONTYPE *)params; 127bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber 128bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber if (defParams->nPortIndex >= mPorts.size() 129bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber || defParams->nSize 130bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber != sizeof(OMX_PARAM_PORTDEFINITIONTYPE)) { 131bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber return OMX_ErrorUndefined; 132bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber } 133bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber 134bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber const PortInfo *port = 135bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber &mPorts.itemAt(defParams->nPortIndex); 136bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber 137bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber memcpy(defParams, &port->mDef, sizeof(port->mDef)); 138bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber 139bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber return OMX_ErrorNone; 140bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber } 141bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber 142bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber default: 143bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber return OMX_ErrorUnsupportedIndex; 144bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber } 145bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber} 146bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber 147bbba88cb1bdc34705d1477208990a06904c022e7Andreas HuberOMX_ERRORTYPE SimpleSoftOMXComponent::internalSetParameter( 148bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber OMX_INDEXTYPE index, const OMX_PTR params) { 149bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber switch (index) { 150bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber case OMX_IndexParamPortDefinition: 151bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber { 152bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber OMX_PARAM_PORTDEFINITIONTYPE *defParams = 153bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber (OMX_PARAM_PORTDEFINITIONTYPE *)params; 154bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber 155bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber if (defParams->nPortIndex >= mPorts.size() 156bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber || defParams->nSize 157bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber != sizeof(OMX_PARAM_PORTDEFINITIONTYPE)) { 158bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber return OMX_ErrorUndefined; 159bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber } 160bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber 161bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber PortInfo *port = 162bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber &mPorts.editItemAt(defParams->nPortIndex); 163bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber 164bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber if (defParams->nBufferSize != port->mDef.nBufferSize) { 165bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber CHECK_GE(defParams->nBufferSize, port->mDef.nBufferSize); 166bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber port->mDef.nBufferSize = defParams->nBufferSize; 167bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber } 168bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber 169bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber if (defParams->nBufferCountActual 170bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber != port->mDef.nBufferCountActual) { 171bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber CHECK_GE(defParams->nBufferCountActual, 172bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber port->mDef.nBufferCountMin); 173bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber 174bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber port->mDef.nBufferCountActual = defParams->nBufferCountActual; 175bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber } 176bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber 177bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber return OMX_ErrorNone; 178bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber } 179bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber 180bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber default: 181bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber return OMX_ErrorUnsupportedIndex; 182bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber } 183bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber} 184bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber 185bbba88cb1bdc34705d1477208990a06904c022e7Andreas HuberOMX_ERRORTYPE SimpleSoftOMXComponent::useBuffer( 186bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber OMX_BUFFERHEADERTYPE **header, 187bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber OMX_U32 portIndex, 188bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber OMX_PTR appPrivate, 189bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber OMX_U32 size, 190bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber OMX_U8 *ptr) { 191bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber Mutex::Autolock autoLock(mLock); 192bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber CHECK_LT(portIndex, mPorts.size()); 193bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber 194bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber *header = new OMX_BUFFERHEADERTYPE; 195bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber (*header)->nSize = sizeof(OMX_BUFFERHEADERTYPE); 196bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber (*header)->nVersion.s.nVersionMajor = 1; 197bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber (*header)->nVersion.s.nVersionMinor = 0; 198bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber (*header)->nVersion.s.nRevision = 0; 199bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber (*header)->nVersion.s.nStep = 0; 200bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber (*header)->pBuffer = ptr; 201bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber (*header)->nAllocLen = size; 202bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber (*header)->nFilledLen = 0; 203bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber (*header)->nOffset = 0; 204bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber (*header)->pAppPrivate = appPrivate; 205bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber (*header)->pPlatformPrivate = NULL; 206bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber (*header)->pInputPortPrivate = NULL; 207bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber (*header)->pOutputPortPrivate = NULL; 208bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber (*header)->hMarkTargetComponent = NULL; 209bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber (*header)->pMarkData = NULL; 210bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber (*header)->nTickCount = 0; 211bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber (*header)->nTimeStamp = 0; 212bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber (*header)->nFlags = 0; 213bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber (*header)->nOutputPortIndex = portIndex; 214bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber (*header)->nInputPortIndex = portIndex; 215bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber 216bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber PortInfo *port = &mPorts.editItemAt(portIndex); 217bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber 218bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber CHECK(mState == OMX_StateLoaded || port->mDef.bEnabled == OMX_FALSE); 219bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber 220bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber CHECK_LT(port->mBuffers.size(), port->mDef.nBufferCountActual); 221bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber 222bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber port->mBuffers.push(); 223bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber 224bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber BufferInfo *buffer = 225bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber &port->mBuffers.editItemAt(port->mBuffers.size() - 1); 226bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber 227bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber buffer->mHeader = *header; 228bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber buffer->mOwnedByUs = false; 229bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber 230bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber if (port->mBuffers.size() == port->mDef.nBufferCountActual) { 231bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber port->mDef.bPopulated = OMX_TRUE; 232bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber checkTransitions(); 233bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber } 234bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber 235bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber return OMX_ErrorNone; 236bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber} 237bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber 238bbba88cb1bdc34705d1477208990a06904c022e7Andreas HuberOMX_ERRORTYPE SimpleSoftOMXComponent::allocateBuffer( 239bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber OMX_BUFFERHEADERTYPE **header, 240bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber OMX_U32 portIndex, 241bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber OMX_PTR appPrivate, 242bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber OMX_U32 size) { 243bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber OMX_U8 *ptr = new OMX_U8[size]; 244bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber 245bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber OMX_ERRORTYPE err = 246bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber useBuffer(header, portIndex, appPrivate, size, ptr); 247bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber 248bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber if (err != OMX_ErrorNone) { 249bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber delete[] ptr; 250bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber ptr = NULL; 251bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber 252bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber return err; 253bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber } 254bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber 255bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber CHECK((*header)->pPlatformPrivate == NULL); 256bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber (*header)->pPlatformPrivate = ptr; 257bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber 258bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber return OMX_ErrorNone; 259bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber} 260bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber 261bbba88cb1bdc34705d1477208990a06904c022e7Andreas HuberOMX_ERRORTYPE SimpleSoftOMXComponent::freeBuffer( 262bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber OMX_U32 portIndex, 263bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber OMX_BUFFERHEADERTYPE *header) { 264bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber Mutex::Autolock autoLock(mLock); 265bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber 266bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber CHECK_LT(portIndex, mPorts.size()); 267bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber 268bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber PortInfo *port = &mPorts.editItemAt(portIndex); 269bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber 270bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber#if 0 // XXX 271bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber CHECK((mState == OMX_StateIdle && mTargetState == OMX_StateLoaded) 272bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber || port->mDef.bEnabled == OMX_FALSE); 273bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber#endif 274bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber 275bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber bool found = false; 276bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber for (size_t i = 0; i < port->mBuffers.size(); ++i) { 277bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber BufferInfo *buffer = &port->mBuffers.editItemAt(i); 278bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber 279bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber if (buffer->mHeader == header) { 280bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber CHECK(!buffer->mOwnedByUs); 281bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber 282bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber if (header->pPlatformPrivate != NULL) { 283bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber // This buffer's data was allocated by us. 284bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber CHECK(header->pPlatformPrivate == header->pBuffer); 285bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber 286bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber delete[] header->pBuffer; 287bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber header->pBuffer = NULL; 288bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber } 289bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber 290bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber delete header; 291bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber header = NULL; 292bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber 293bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber port->mBuffers.removeAt(i); 294bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber port->mDef.bPopulated = OMX_FALSE; 295bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber 296bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber checkTransitions(); 297bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber 298bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber found = true; 299bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber break; 300bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber } 301bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber } 302bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber 303bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber CHECK(found); 304bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber 305bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber return OMX_ErrorNone; 306bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber} 307bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber 308bbba88cb1bdc34705d1477208990a06904c022e7Andreas HuberOMX_ERRORTYPE SimpleSoftOMXComponent::emptyThisBuffer( 309bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber OMX_BUFFERHEADERTYPE *buffer) { 310bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber sp<AMessage> msg = new AMessage(kWhatEmptyThisBuffer, mHandler->id()); 311bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber msg->setPointer("header", buffer); 312bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber msg->post(); 313bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber 314bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber return OMX_ErrorNone; 315bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber} 316bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber 317bbba88cb1bdc34705d1477208990a06904c022e7Andreas HuberOMX_ERRORTYPE SimpleSoftOMXComponent::fillThisBuffer( 318bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber OMX_BUFFERHEADERTYPE *buffer) { 319bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber sp<AMessage> msg = new AMessage(kWhatFillThisBuffer, mHandler->id()); 320bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber msg->setPointer("header", buffer); 321bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber msg->post(); 322bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber 323bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber return OMX_ErrorNone; 324bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber} 325bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber 326bbba88cb1bdc34705d1477208990a06904c022e7Andreas HuberOMX_ERRORTYPE SimpleSoftOMXComponent::getState(OMX_STATETYPE *state) { 327bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber Mutex::Autolock autoLock(mLock); 328bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber 329bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber *state = mState; 330bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber 331bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber return OMX_ErrorNone; 332bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber} 333bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber 334bbba88cb1bdc34705d1477208990a06904c022e7Andreas Hubervoid SimpleSoftOMXComponent::onMessageReceived(const sp<AMessage> &msg) { 335bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber Mutex::Autolock autoLock(mLock); 336928170837b9dec2b90f7a01b85182a8b00b45972James Dong uint32_t msgType = msg->what(); 337928170837b9dec2b90f7a01b85182a8b00b45972James Dong ALOGV("msgType = %d", msgType); 338928170837b9dec2b90f7a01b85182a8b00b45972James Dong switch (msgType) { 339bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber case kWhatSendCommand: 340bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber { 341bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber int32_t cmd, param; 342bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber CHECK(msg->findInt32("cmd", &cmd)); 343bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber CHECK(msg->findInt32("param", ¶m)); 344bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber 345bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber onSendCommand((OMX_COMMANDTYPE)cmd, (OMX_U32)param); 346bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber break; 347bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber } 348bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber 349bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber case kWhatEmptyThisBuffer: 350bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber case kWhatFillThisBuffer: 351bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber { 352bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber OMX_BUFFERHEADERTYPE *header; 353bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber CHECK(msg->findPointer("header", (void **)&header)); 354bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber 355bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber CHECK(mState == OMX_StateExecuting && mTargetState == mState); 356bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber 357bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber bool found = false; 358928170837b9dec2b90f7a01b85182a8b00b45972James Dong size_t portIndex = (kWhatEmptyThisBuffer == msgType)? 359928170837b9dec2b90f7a01b85182a8b00b45972James Dong header->nInputPortIndex: header->nOutputPortIndex; 360928170837b9dec2b90f7a01b85182a8b00b45972James Dong PortInfo *port = &mPorts.editItemAt(portIndex); 361bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber 362928170837b9dec2b90f7a01b85182a8b00b45972James Dong for (size_t j = 0; j < port->mBuffers.size(); ++j) { 363928170837b9dec2b90f7a01b85182a8b00b45972James Dong BufferInfo *buffer = &port->mBuffers.editItemAt(j); 364bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber 365928170837b9dec2b90f7a01b85182a8b00b45972James Dong if (buffer->mHeader == header) { 366928170837b9dec2b90f7a01b85182a8b00b45972James Dong CHECK(!buffer->mOwnedByUs); 367bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber 368928170837b9dec2b90f7a01b85182a8b00b45972James Dong buffer->mOwnedByUs = true; 369bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber 370928170837b9dec2b90f7a01b85182a8b00b45972James Dong CHECK((msgType == kWhatEmptyThisBuffer 371928170837b9dec2b90f7a01b85182a8b00b45972James Dong && port->mDef.eDir == OMX_DirInput) 372928170837b9dec2b90f7a01b85182a8b00b45972James Dong || (port->mDef.eDir == OMX_DirOutput)); 373bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber 374928170837b9dec2b90f7a01b85182a8b00b45972James Dong port->mQueue.push_back(buffer); 375928170837b9dec2b90f7a01b85182a8b00b45972James Dong onQueueFilled(portIndex); 376bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber 377928170837b9dec2b90f7a01b85182a8b00b45972James Dong found = true; 378928170837b9dec2b90f7a01b85182a8b00b45972James Dong break; 379bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber } 380bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber } 381bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber 382bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber CHECK(found); 383bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber break; 384bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber } 385bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber 386bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber default: 387bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber TRESPASS(); 388bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber break; 389bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber } 390bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber} 391bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber 392bbba88cb1bdc34705d1477208990a06904c022e7Andreas Hubervoid SimpleSoftOMXComponent::onSendCommand( 393bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber OMX_COMMANDTYPE cmd, OMX_U32 param) { 394bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber switch (cmd) { 395bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber case OMX_CommandStateSet: 396bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber { 397bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber onChangeState((OMX_STATETYPE)param); 398bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber break; 399bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber } 400bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber 401bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber case OMX_CommandPortEnable: 402bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber case OMX_CommandPortDisable: 403bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber { 404bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber onPortEnable(param, cmd == OMX_CommandPortEnable); 405bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber break; 406bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber } 407bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber 408bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber case OMX_CommandFlush: 409bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber { 410bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber onPortFlush(param, true /* sendFlushComplete */); 411bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber break; 412bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber } 413bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber 414bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber default: 415bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber TRESPASS(); 416bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber break; 417bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber } 418bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber} 419bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber 420bbba88cb1bdc34705d1477208990a06904c022e7Andreas Hubervoid SimpleSoftOMXComponent::onChangeState(OMX_STATETYPE state) { 421bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber // We shouldn't be in a state transition already. 422bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber CHECK_EQ((int)mState, (int)mTargetState); 423bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber 424bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber switch (mState) { 425bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber case OMX_StateLoaded: 426bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber CHECK_EQ((int)state, (int)OMX_StateIdle); 427bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber break; 428bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber case OMX_StateIdle: 429bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber CHECK(state == OMX_StateLoaded || state == OMX_StateExecuting); 430bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber break; 431bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber case OMX_StateExecuting: 432bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber { 433bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber CHECK_EQ((int)state, (int)OMX_StateIdle); 434bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber 435bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber for (size_t i = 0; i < mPorts.size(); ++i) { 436bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber onPortFlush(i, false /* sendFlushComplete */); 437bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber } 438bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber 439bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber mState = OMX_StateIdle; 440bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber notify(OMX_EventCmdComplete, OMX_CommandStateSet, state, NULL); 441bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber break; 442bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber } 443bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber 444bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber default: 445bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber TRESPASS(); 446bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber } 447bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber 448bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber mTargetState = state; 449bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber 450bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber checkTransitions(); 451bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber} 452bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber 4536fc72b01a3b67903b52f1d33b1ad5c960b5365f1Marco Nelissenvoid SimpleSoftOMXComponent::onReset() { 4546fc72b01a3b67903b52f1d33b1ad5c960b5365f1Marco Nelissen // no-op 4556fc72b01a3b67903b52f1d33b1ad5c960b5365f1Marco Nelissen} 4566fc72b01a3b67903b52f1d33b1ad5c960b5365f1Marco Nelissen 457bbba88cb1bdc34705d1477208990a06904c022e7Andreas Hubervoid SimpleSoftOMXComponent::onPortEnable(OMX_U32 portIndex, bool enable) { 458bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber CHECK_LT(portIndex, mPorts.size()); 459bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber 460bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber PortInfo *port = &mPorts.editItemAt(portIndex); 461bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber CHECK_EQ((int)port->mTransition, (int)PortInfo::NONE); 462bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber CHECK(port->mDef.bEnabled == !enable); 463bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber 464bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber if (!enable) { 465bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber port->mDef.bEnabled = OMX_FALSE; 466bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber port->mTransition = PortInfo::DISABLING; 467bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber 468bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber for (size_t i = 0; i < port->mBuffers.size(); ++i) { 469bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber BufferInfo *buffer = &port->mBuffers.editItemAt(i); 470bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber 471bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber if (buffer->mOwnedByUs) { 472bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber buffer->mOwnedByUs = false; 473bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber 474bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber if (port->mDef.eDir == OMX_DirInput) { 475bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber notifyEmptyBufferDone(buffer->mHeader); 476bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber } else { 477bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber CHECK_EQ(port->mDef.eDir, OMX_DirOutput); 478bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber notifyFillBufferDone(buffer->mHeader); 479bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber } 480bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber } 481bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber } 482bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber 483bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber port->mQueue.clear(); 484bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber } else { 485bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber port->mTransition = PortInfo::ENABLING; 486bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber } 487bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber 488bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber checkTransitions(); 489bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber} 490bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber 491bbba88cb1bdc34705d1477208990a06904c022e7Andreas Hubervoid SimpleSoftOMXComponent::onPortFlush( 492bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber OMX_U32 portIndex, bool sendFlushComplete) { 493bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber if (portIndex == OMX_ALL) { 494bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber for (size_t i = 0; i < mPorts.size(); ++i) { 495bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber onPortFlush(i, sendFlushComplete); 496bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber } 497bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber 498bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber if (sendFlushComplete) { 499bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber notify(OMX_EventCmdComplete, OMX_CommandFlush, OMX_ALL, NULL); 500bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber } 501bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber 502bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber return; 503bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber } 504bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber 505bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber CHECK_LT(portIndex, mPorts.size()); 506bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber 507bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber PortInfo *port = &mPorts.editItemAt(portIndex); 508bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber CHECK_EQ((int)port->mTransition, (int)PortInfo::NONE); 509bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber 510bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber for (size_t i = 0; i < port->mBuffers.size(); ++i) { 511bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber BufferInfo *buffer = &port->mBuffers.editItemAt(i); 512bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber 513bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber if (!buffer->mOwnedByUs) { 514bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber continue; 515bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber } 516bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber 517bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber buffer->mHeader->nFilledLen = 0; 518bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber buffer->mHeader->nOffset = 0; 519bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber buffer->mHeader->nFlags = 0; 520bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber 521bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber buffer->mOwnedByUs = false; 522bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber 523bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber if (port->mDef.eDir == OMX_DirInput) { 524bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber notifyEmptyBufferDone(buffer->mHeader); 525bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber } else { 526bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber CHECK_EQ(port->mDef.eDir, OMX_DirOutput); 527bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber 528bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber notifyFillBufferDone(buffer->mHeader); 529bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber } 530bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber } 531bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber 532bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber port->mQueue.clear(); 533bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber 534bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber if (sendFlushComplete) { 535bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber notify(OMX_EventCmdComplete, OMX_CommandFlush, portIndex, NULL); 536bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber 537bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber onPortFlushCompleted(portIndex); 538bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber } 539bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber} 540bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber 541bbba88cb1bdc34705d1477208990a06904c022e7Andreas Hubervoid SimpleSoftOMXComponent::checkTransitions() { 542bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber if (mState != mTargetState) { 543bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber bool transitionComplete = true; 544bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber 545bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber if (mState == OMX_StateLoaded) { 546bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber CHECK_EQ((int)mTargetState, (int)OMX_StateIdle); 547bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber 548bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber for (size_t i = 0; i < mPorts.size(); ++i) { 549bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber const PortInfo &port = mPorts.itemAt(i); 550bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber if (port.mDef.bEnabled == OMX_FALSE) { 551bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber continue; 552bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber } 553bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber 554bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber if (port.mDef.bPopulated == OMX_FALSE) { 555bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber transitionComplete = false; 556bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber break; 557bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber } 558bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber } 559bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber } else if (mTargetState == OMX_StateLoaded) { 560bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber CHECK_EQ((int)mState, (int)OMX_StateIdle); 561bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber 562bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber for (size_t i = 0; i < mPorts.size(); ++i) { 563bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber const PortInfo &port = mPorts.itemAt(i); 564bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber if (port.mDef.bEnabled == OMX_FALSE) { 565bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber continue; 566bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber } 567bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber 568bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber size_t n = port.mBuffers.size(); 569bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber 570bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber if (n > 0) { 571bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber CHECK_LE(n, port.mDef.nBufferCountActual); 572bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber 573bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber if (n == port.mDef.nBufferCountActual) { 574bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber CHECK_EQ((int)port.mDef.bPopulated, (int)OMX_TRUE); 575bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber } else { 576bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber CHECK_EQ((int)port.mDef.bPopulated, (int)OMX_FALSE); 577bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber } 578bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber 579bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber transitionComplete = false; 580bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber break; 581bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber } 582bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber } 583bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber } 584bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber 585bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber if (transitionComplete) { 586bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber mState = mTargetState; 587bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber 5886fc72b01a3b67903b52f1d33b1ad5c960b5365f1Marco Nelissen if (mState == OMX_StateLoaded) { 5896fc72b01a3b67903b52f1d33b1ad5c960b5365f1Marco Nelissen onReset(); 5906fc72b01a3b67903b52f1d33b1ad5c960b5365f1Marco Nelissen } 5916fc72b01a3b67903b52f1d33b1ad5c960b5365f1Marco Nelissen 592bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber notify(OMX_EventCmdComplete, OMX_CommandStateSet, mState, NULL); 593bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber } 594bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber } 595bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber 596bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber for (size_t i = 0; i < mPorts.size(); ++i) { 597bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber PortInfo *port = &mPorts.editItemAt(i); 598bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber 599bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber if (port->mTransition == PortInfo::DISABLING) { 600bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber if (port->mBuffers.empty()) { 6013856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("Port %d now disabled.", i); 602bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber 603bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber port->mTransition = PortInfo::NONE; 604bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber notify(OMX_EventCmdComplete, OMX_CommandPortDisable, i, NULL); 605bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber 606bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber onPortEnableCompleted(i, false /* enabled */); 607bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber } 608bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber } else if (port->mTransition == PortInfo::ENABLING) { 609bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber if (port->mDef.bPopulated == OMX_TRUE) { 6103856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("Port %d now enabled.", i); 611bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber 612bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber port->mTransition = PortInfo::NONE; 613bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber port->mDef.bEnabled = OMX_TRUE; 614bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber notify(OMX_EventCmdComplete, OMX_CommandPortEnable, i, NULL); 615bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber 616bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber onPortEnableCompleted(i, true /* enabled */); 617bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber } 618bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber } 619bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber } 620bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber} 621bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber 622bbba88cb1bdc34705d1477208990a06904c022e7Andreas Hubervoid SimpleSoftOMXComponent::addPort(const OMX_PARAM_PORTDEFINITIONTYPE &def) { 623bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber CHECK_EQ(def.nPortIndex, mPorts.size()); 624bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber 625bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber mPorts.push(); 626bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber PortInfo *info = &mPorts.editItemAt(mPorts.size() - 1); 627bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber info->mDef = def; 628bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber info->mTransition = PortInfo::NONE; 629bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber} 630bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber 631bbba88cb1bdc34705d1477208990a06904c022e7Andreas Hubervoid SimpleSoftOMXComponent::onQueueFilled(OMX_U32 portIndex) { 632bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber} 633bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber 634bbba88cb1bdc34705d1477208990a06904c022e7Andreas Hubervoid SimpleSoftOMXComponent::onPortFlushCompleted(OMX_U32 portIndex) { 635bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber} 636bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber 637bbba88cb1bdc34705d1477208990a06904c022e7Andreas Hubervoid SimpleSoftOMXComponent::onPortEnableCompleted( 638bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber OMX_U32 portIndex, bool enabled) { 639bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber} 640bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber 641bbba88cb1bdc34705d1477208990a06904c022e7Andreas HuberList<SimpleSoftOMXComponent::BufferInfo *> & 642bbba88cb1bdc34705d1477208990a06904c022e7Andreas HuberSimpleSoftOMXComponent::getPortQueue(OMX_U32 portIndex) { 643bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber CHECK_LT(portIndex, mPorts.size()); 644bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber return mPorts.editItemAt(portIndex).mQueue; 645bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber} 646bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber 647bbba88cb1bdc34705d1477208990a06904c022e7Andreas HuberSimpleSoftOMXComponent::PortInfo *SimpleSoftOMXComponent::editPortInfo( 648bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber OMX_U32 portIndex) { 649bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber CHECK_LT(portIndex, mPorts.size()); 650bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber return &mPorts.editItemAt(portIndex); 651bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber} 652bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber 653bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber} // namespace android 654