--- a/omxil/omxilcomponentcommon/src/common/omxilstate.cpp Mon May 03 13:56:28 2010 +0300
+++ b/omxil/omxilcomponentcommon/src/common/omxilstate.cpp Fri May 07 16:25:23 2010 +0100
@@ -1,1964 +1,1937 @@
-// Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies).
-// All rights reserved.
-// This component and the accompanying materials are made available
-// under the terms of "Eclipse Public License v1.0"
-// which accompanies this distribution, and is available
-// at the URL "http://www.eclipse.org/legal/epl-v10.html".
-//
-// Initial Contributors:
-// Nokia Corporation - initial contribution.
-//
-// Contributors:
-//
-// Description:
-//
-
-
-/**
- @file
- @internalComponent
-*/
-
-#include "log.h"
-#include "omxilstate.h"
-#include "omxilfsm.h"
-#include "omxilcommand.h"
-#include "omxilconfigmanager.h"
-#include "omxilcallbackmanager.h"
-
-
-OMX_ERRORTYPE
-COmxILFsm::COmxILState::GetParameter(
- const COmxILFsm& aFsm,
- OMX_INDEXTYPE aParamIndex,
- TAny* apComponentParameterStructure) const
- {
- DEBUG_PRINTF(_L8("COmxILState::GetParameter"));
-
- // This API can be used independently of the current state of the
- // component. Let's try first the Port Manager to check if the index is
- // known there
- OMX_ERRORTYPE retValue =
- aFsm.iPortManager.GetParameter(aParamIndex,
- apComponentParameterStructure);
-
- if (OMX_ErrorUnsupportedIndex == retValue)
- {
- // Otherwise, try Config Manager...
- retValue = aFsm.iConfigManager.GetParameter(
- aParamIndex,
- apComponentParameterStructure);
- }
-
- return retValue;
-
- }
-
-// This SetParameter version must be used in the following states:
-// - OMX_StateIdle,
-// - OMX_StateExecuting,
-// - OMX_StatePaused, and
-//
-OMX_ERRORTYPE
-COmxILFsm::COmxILState::SetParameter(
- COmxILFsm& aFsm,
- OMX_INDEXTYPE aParamIndex,
- const TAny* apComponentParameterStructure)
- {
- DEBUG_PRINTF(_L8("COmxILState::SetParameter"));
-
- OMX_ERRORTYPE retValue =
- aFsm.iPortManager.SetParameter(
- aParamIndex,
- apComponentParameterStructure,
- OMX_TRUE // Port must be disabled
- );
-
- if (OMX_ErrorUnsupportedIndex == retValue)
- {
- // Try Config Manager now...
- retValue = aFsm.iConfigManager.SetParameter(
- aParamIndex,
- apComponentParameterStructure,
- OMX_FALSE // run-time
- );
- }
-
- return retValue;
-
- }
-
-// This SetParameter version must be used in the following states:
-// - OMX_StateLoaded and derived states,
-// - OMX_StateWaitForResources
-//
-OMX_ERRORTYPE
-COmxILFsm::COmxILState::SetParameterV2(
- COmxILFsm& aFsm,
- OMX_INDEXTYPE aParamIndex,
- const TAny* apComponentParameterStructure)
- {
- DEBUG_PRINTF(_L8("COmxILState::SetParameterV2"));
-
- OMX_ERRORTYPE retValue =
- aFsm.iPortManager.SetParameter(aParamIndex,
- apComponentParameterStructure);
-
- if (OMX_ErrorUnsupportedIndex == retValue)
- {
- // Try Config Manager now...
- retValue = aFsm.iConfigManager.SetParameter(
- aParamIndex,
- apComponentParameterStructure);
- }
-
- return retValue;
-
- }
-
-OMX_ERRORTYPE
-COmxILFsm::COmxILState::GetConfig(
- const COmxILFsm& aFsm,
- OMX_INDEXTYPE aConfigIndex,
- TAny* apComponentConfigStructure) const
- {
- DEBUG_PRINTF(_L8("COmxILState::GetConfig"));
-
- OMX_ERRORTYPE retValue =
- aFsm.iPortManager.GetConfig(aConfigIndex,
- apComponentConfigStructure);
-
- if (OMX_ErrorUnsupportedIndex == retValue)
- {
- // Try Config Manager now...
- retValue = aFsm.iConfigManager.GetConfig(
- aConfigIndex,
- apComponentConfigStructure);
- }
-
- return retValue;
-
- }
-
-OMX_ERRORTYPE
-COmxILFsm::COmxILState::SetConfig(COmxILFsm& aFsm,
- OMX_INDEXTYPE aConfigIndex,
- const TAny* apComponentConfigStructure)
- {
- DEBUG_PRINTF(_L8("COmxILState::SetConfig"));
-
- OMX_ERRORTYPE retValue =
- aFsm.iPortManager.SetConfig(aConfigIndex,
- apComponentConfigStructure);
-
- if (OMX_ErrorUnsupportedIndex == retValue)
- {
- // Try Config Manager now...
- retValue = aFsm.iConfigManager.SetConfig(
- aConfigIndex,
- apComponentConfigStructure);
- }
-
- return retValue;
-
- }
-
-OMX_ERRORTYPE
-COmxILFsm::COmxILState::GetExtensionIndex(const COmxILFsm& aFsm,
- OMX_STRING aParameterName,
- OMX_INDEXTYPE* apIndexType) const
- {
- DEBUG_PRINTF(_L8("COmxILState::GetExtensionIndex"));
-
- OMX_ERRORTYPE retValue =
- aFsm.iPortManager.GetExtensionIndex(aParameterName,
- apIndexType);
-
- if (OMX_ErrorUnsupportedIndex == retValue)
- {
- // Try Config Manager now...
- retValue = aFsm.iConfigManager.GetExtensionIndex(
- aParameterName,
- apIndexType);
- }
-
- return retValue;
-
- }
-
-//
-//
-//
-
-OMX_ERRORTYPE
-COmxILFsm::COmxILState::CommandFlush(COmxILFsm& aFsm,
- const TOmxILCommand& aCommand)
- {
- DEBUG_PRINTF(_L8("COmxILState::CommandFlush"));
-
- __ASSERT_DEBUG(aCommand.iCommandType == OMX_CommandFlush,
- User::Panic(KOmxILFsmPanicCategory, 1));
-
- return aFsm.iPortManager.BufferFlushIndicationFlushCommand(
- aCommand.iParam1);
-
- }
-
-OMX_ERRORTYPE
-COmxILFsm::COmxILState::CommandPortDisable(COmxILFsm& aFsm,
- const TOmxILCommand& aCommand)
- {
- DEBUG_PRINTF(_L8("COmxILState::CommandPortDisable"));
- __ASSERT_DEBUG(aCommand.iCommandType == OMX_CommandPortDisable,
- User::Panic(KOmxILFsmPanicCategory, 1));
-
- // First, flush all buffers in the port(s) that is(are) to be disabled.
- return aFsm.iPortManager.PortDisableIndication(
- aCommand.iParam1);
-
- }
-
-OMX_ERRORTYPE
-COmxILFsm::COmxILState::CommandPortEnable(COmxILFsm& aFsm,
- const TOmxILCommand& aCommand)
- {
- DEBUG_PRINTF(_L8("COmxILState::CommandPortEnable"));
- __ASSERT_DEBUG(aCommand.iCommandType == OMX_CommandPortEnable,
- User::Panic(KOmxILFsmPanicCategory, 1));
-
- TBool indicationIsFinal = EFalse;
- return aFsm.iPortManager.PortEnableIndication(
- aCommand.iParam1,
- indicationIsFinal);
-
- }
-
-OMX_ERRORTYPE
-COmxILFsm::COmxILState::CommandMarkBuffer(COmxILFsm& aFsm,
- const TOmxILCommand& aCommand)
- {
- DEBUG_PRINTF(_L8("COmxILState::CommandMarkBuffer"));
-
- __ASSERT_DEBUG(aCommand.iCommandType == OMX_CommandMarkBuffer,
- User::Panic(KOmxILFsmPanicCategory, 1));
-
- if (!aCommand.ipCommandData)
- {
- return OMX_ErrorBadParameter;
- }
-
- return aFsm.iPortManager.BufferMarkIndication(aCommand.iParam1,
- aCommand.ipCommandData);
-
- }
-
-
-//
-// COmxILStateInvalid
-//
-OMX_ERRORTYPE
-COmxILFsm::COmxILStateInvalid::GetParameter(
- const COmxILFsm& /*aFsm*/,
- OMX_INDEXTYPE /*aParamIndex*/,
- TAny* /*apComponentParameterStructure*/) const
- {
- DEBUG_PRINTF(_L8("COmxILStateInvalid::GetParameter"));
- return OMX_ErrorInvalidState;
- }
-
-OMX_ERRORTYPE
-COmxILFsm::COmxILStateInvalid::SetParameter(
- COmxILFsm& /*aFsm*/,
- OMX_INDEXTYPE /*aParamIndex*/,
- const TAny* /*apComponentParameterStructure*/)
- {
- DEBUG_PRINTF(_L8("COmxILStateInvalid::SetParameter"));
- return OMX_ErrorInvalidState;
- }
-
-OMX_ERRORTYPE
-COmxILFsm::COmxILStateInvalid::GetConfig(
- const COmxILFsm& /*aFsm*/,
- OMX_INDEXTYPE /*aConfigIndex*/,
- TAny* /*apComponentConfigStructure*/) const
- {
- DEBUG_PRINTF(_L8("COmxILStateInvalid::GetConfig"));
- return OMX_ErrorInvalidState;
- }
-
-OMX_ERRORTYPE
-COmxILFsm::COmxILStateInvalid::SetConfig(
- COmxILFsm& /*aFsm*/,
- OMX_INDEXTYPE /*aConfigIndex*/,
- const TAny* /*apComponentConfigStructure*/)
- {
- DEBUG_PRINTF(_L8("COmxILStateInvalid::SetConfig"));
- return OMX_ErrorInvalidState;
- }
-
-OMX_ERRORTYPE
-COmxILFsm::COmxILStateInvalid::GetExtensionIndex(
- const COmxILFsm& /*aFsm*/,
- OMX_STRING /*aParameterName*/,
- OMX_INDEXTYPE* /*apIndexType*/) const
- {
- DEBUG_PRINTF(_L8("COmxILStateInvalid::GetExtensionIndex"));
- return OMX_ErrorInvalidState;
- }
-
-OMX_STATETYPE
-COmxILFsm::COmxILStateInvalid::GetState() const
- {
- DEBUG_PRINTF(_L8("COmxILStateInvalid::GetState"));
- return OMX_StateInvalid;
- }
-
-OMX_ERRORTYPE
-COmxILFsm::COmxILStateInvalid::ComponentTunnelRequest(
- COmxILFsm& /*aFsm*/,
- OMX_U32 /*aPort*/,
- OMX_HANDLETYPE /*aTunneledComp*/,
- OMX_U32 /*aTunneledPort*/,
- OMX_TUNNELSETUPTYPE* /*apTunnelSetup*/)
- {
- DEBUG_PRINTF(_L8("COmxILStateInvalid::ComponentTunnelRequest"));
-
- return OMX_ErrorInvalidState;
-
- }
-
-OMX_ERRORTYPE
-COmxILFsm::COmxILStateInvalid::PopulateBuffer(
- COmxILFsm& /*aFsm*/,
- OMX_BUFFERHEADERTYPE** /*appBufferHdr*/,
- OMX_U32 /*aPortIndex*/,
- OMX_PTR /*apAppPrivate*/,
- OMX_U32 /*aSizeBytes*/,
- OMX_U8* /*apBuffer*/,
- TBool& /*portPopulationCompleted*/)
- {
- DEBUG_PRINTF(_L8("COmxILStateInvalid::PopulateBuffer"));
-
- return OMX_ErrorInvalidState;
-
- }
-
-OMX_ERRORTYPE
-COmxILFsm::COmxILStateInvalid::FreeBuffer(COmxILFsm& aFsm,
- OMX_U32 aPortIndex,
- OMX_BUFFERHEADERTYPE* apBuffer,
- TBool& aPortDepopulationCompleted)
- {
- DEBUG_PRINTF(_L8("COmxILStateInvalid::FreeBuffer"));
-
- return COmxILState::FreeBufferV2(
- aFsm,
- aPortIndex,
- apBuffer,
- aPortDepopulationCompleted);
-
- }
-
-OMX_ERRORTYPE
-COmxILFsm::COmxILStateInvalid::EmptyThisBuffer(
- COmxILFsm& /*aFsm*/,
- OMX_BUFFERHEADERTYPE* /*apBuffer*/)
- {
- DEBUG_PRINTF(_L8("COmxILStateInvalid::EmptyThisBuffer"));
-
- return OMX_ErrorInvalidState;
-
- }
-
-OMX_ERRORTYPE
-COmxILFsm::COmxILStateInvalid::FillThisBuffer(
- COmxILFsm& /*aFsm*/,
- OMX_BUFFERHEADERTYPE* /*apBuffer*/)
- {
- DEBUG_PRINTF(_L8("COmxILStateInvalid::FillThisBuffer"));
-
- return OMX_ErrorInvalidState;
-
- }
-
-OMX_ERRORTYPE
-COmxILFsm::COmxILStateInvalid::CommandStateSet(
- COmxILFsm& /*aFsm*/,
- const TOmxILCommand& /*aCommand*/)
- {
- DEBUG_PRINTF(_L8("COmxILStateInvalid::CommandStateSet"));
- return OMX_ErrorInvalidState;
- }
-
-OMX_ERRORTYPE
-COmxILFsm::COmxILStateInvalid::CommandFlush(
- COmxILFsm& /*aFsm*/,
- const TOmxILCommand& /*aCommand*/)
- {
- DEBUG_PRINTF(_L8("COmxILStateInvalid::CommandFlush"));
- return OMX_ErrorInvalidState;
- }
-
-OMX_ERRORTYPE
-COmxILFsm::COmxILStateInvalid::CommandPortEnable(
- COmxILFsm& /*aFsm*/,
- const TOmxILCommand& /*aCommand*/)
- {
- DEBUG_PRINTF(_L8("COmxILStateInvalid::CommandPortEnable"));
- return OMX_ErrorInvalidState;
- }
-
-OMX_ERRORTYPE
-COmxILFsm::COmxILStateInvalid::CommandPortDisable(
- COmxILFsm& /*aFsm*/,
- const TOmxILCommand& /*aCommand*/)
- {
- DEBUG_PRINTF(_L8("COmxILStateInvalid::CommandPortDisable"));
- return OMX_ErrorInvalidState;
- }
-
-OMX_ERRORTYPE
-COmxILFsm::COmxILStateInvalid::CommandMarkBuffer(
- COmxILFsm& /*aFsm*/,
- const TOmxILCommand& /*aCommand*/)
- {
- DEBUG_PRINTF(_L8("COmxILStateInvalid::CommandMarkBuffer"));
- return OMX_ErrorInvalidState;
- }
-
-
-//
-// COmxILStateLoaded
-//
-OMX_STATETYPE
-COmxILFsm::COmxILStateLoaded::GetState() const
- {
- DEBUG_PRINTF(_L8("COmxILStateLoaded::GetState"));
- return OMX_StateLoaded;
- }
-
-OMX_ERRORTYPE
-COmxILFsm::COmxILStateLoaded::SetParameter(
- COmxILFsm& aFsm,
- OMX_INDEXTYPE aParamIndex,
- const TAny* apComponentParameterStructure)
- {
- DEBUG_PRINTF(_L8("COmxILStateLoaded::SetParameter"));
-
- return COmxILState::SetParameterV2(aFsm,
- aParamIndex,
- apComponentParameterStructure);
-
- }
-
-OMX_ERRORTYPE
-COmxILFsm::COmxILStateLoaded::PopulateBuffer(
- COmxILFsm& aFsm,
- OMX_BUFFERHEADERTYPE** appBufferHdr,
- OMX_U32 aPortIndex,
- OMX_PTR apAppPrivate,
- OMX_U32 aSizeBytes,
- OMX_U8* apBuffer,
- TBool& portPopulationCompleted)
- {
- DEBUG_PRINTF(_L8("COmxILStateLoaded::PopulateBuffer"));
-
- // At this point, the command requesting the transition from Loaded to Idle
- // has not been received yet.. (see COmxILStateLoadedToIdle). Therefore,
- // this can only be successful if the port is disabled
- return COmxILState::PopulateBuffer(aFsm,
- appBufferHdr,
- aPortIndex,
- apAppPrivate,
- aSizeBytes,
- apBuffer,
- portPopulationCompleted);
-
- }
-
-
-OMX_ERRORTYPE
-COmxILFsm::COmxILStateLoaded::FreeBuffer(COmxILFsm& aFsm,
- OMX_U32 aPortIndex,
- OMX_BUFFERHEADERTYPE* apBuffer,
- TBool& aPortDepopulationCompleted)
- {
- DEBUG_PRINTF(_L8("COmxILStateLoaded::FreeBuffer"));
-
- return COmxILState::FreeBuffer(aFsm,
- aPortIndex,
- apBuffer,
- aPortDepopulationCompleted);
-
- }
-
-OMX_ERRORTYPE
-COmxILFsm::COmxILStateLoaded::EmptyThisBuffer(COmxILFsm& aFsm,
- OMX_BUFFERHEADERTYPE* apBuffer)
- {
- DEBUG_PRINTF(_L8("COmxILStateLoaded::EmptyThisBuffer"));
-
- return COmxILState::EmptyThisBuffer(aFsm,
- apBuffer);
-
- }
-
-OMX_ERRORTYPE
-COmxILFsm::COmxILStateLoaded::FillThisBuffer(COmxILFsm& aFsm,
- OMX_BUFFERHEADERTYPE* apBuffer)
- {
- DEBUG_PRINTF(_L8("COmxILStateLoaded::FillThisBuffer"));
-
- return COmxILState::FillThisBuffer(aFsm,
- apBuffer);
-
- }
-
-OMX_ERRORTYPE
-COmxILFsm::COmxILStateLoaded::ComponentTunnelRequest(
- COmxILFsm& aFsm,
- OMX_U32 aPort,
- OMX_HANDLETYPE aTunneledComp,
- OMX_U32 aTunneledPort,
- OMX_TUNNELSETUPTYPE* apTunnelSetup)
- {
- DEBUG_PRINTF(_L8("COmxILStateLoaded::ComponentTunnelRequest"));
-
- return COmxILState::ComponentTunnelRequestV2(aFsm,
- aPort,
- aTunneledComp,
- aTunneledPort,
- apTunnelSetup);
-
- }
-
-
-OMX_ERRORTYPE
-COmxILFsm::COmxILStateLoaded::CommandStateSet(
- COmxILFsm& aFsm,
- const TOmxILCommand& aCommand)
- {
- DEBUG_PRINTF(_L8("COmxILStateLoaded::CommandStateSet"));
-
- __ASSERT_DEBUG(aCommand.iCommandType == OMX_CommandStateSet,
- User::Panic(KOmxILFsmPanicCategory, 1));
-
- // The only two transitions allowed are :
- // - OMX_StateIdle and
- // - OMX_StateWaitForResources.
- COmxILFsm::TStateIndex nextState = COmxILFsm::EStateMax;
- switch(aCommand.iParam1)
- {
- case OMX_StateIdle:
- {
- nextState = COmxILFsm::ESubStateLoadedToIdle;
- }
- break;
- case OMX_StateWaitForResources:
- {
- nextState = COmxILFsm::EStateWaitForResources;
- }
- break;
- case OMX_StateLoaded:
- {
- return OMX_ErrorSameState;
- }
- case OMX_StateInvalid:
- {
- // Notify the IL client... ignore the ret value..
- aFsm.iCallbacks.TransitionCompleteNotification(OMX_StateInvalid);
- // Invalidate component
- return OMX_ErrorInvalidState;
- }
- default:
- {
- return OMX_ErrorIncorrectStateTransition;
- }
-
- };
-
- // Initial checks OK. The component is commanded to make a transition to
- // OMX_StateIdle or OMX_StateWaitForResources.
- OMX_ERRORTYPE omxRetValue = aFsm.FsmTransition(nextState);
- if (OMX_ErrorNone != omxRetValue)
- {
- return omxRetValue;
- }
-
- if (COmxILFsm::ESubStateLoadedToIdle == nextState)
- {
- // Lets tell port manager in case there are buffer supplier tunnelled ports
- TBool componentPopulationCompleted = EFalse;
- omxRetValue =
- aFsm.iPortManager.TunnellingBufferAllocation(
- componentPopulationCompleted);
- if (OMX_ErrorNone != omxRetValue)
- {
- return omxRetValue;
- }
-
- if (componentPopulationCompleted)
- {
- // Complete here the transition to OMX_StateIdle
- omxRetValue = aFsm.FsmTransition(COmxILFsm::EStateIdle);
- if (OMX_ErrorNone == omxRetValue)
- {
- // Notify the IL client that port population has completed
- // sucessfully
- omxRetValue =
- aFsm.iCallbacks.TransitionCompleteNotification(
- OMX_StateIdle);
- }
-
- }
-
- }
- else
- {
- // Notify the IL client that the transition to
- // OMX_StateWaitForResources has completed sucessfully
- omxRetValue = aFsm.iCallbacks.TransitionCompleteNotification(
- OMX_StateWaitForResources);
-
- }
-
- return omxRetValue;
-
- }
-
-OMX_ERRORTYPE
-COmxILFsm::COmxILStateLoaded::CommandPortEnable(
- COmxILFsm& aFsm,
- const TOmxILCommand& aCommand)
- {
- DEBUG_PRINTF(_L8("COmxILStateLoaded::CommandPortEnable"));
- __ASSERT_DEBUG(aCommand.iCommandType == OMX_CommandPortEnable,
- User::Panic(KOmxILFsmPanicCategory, 1));
-
- TBool indicationIsFinal = ETrue;
- return aFsm.iPortManager.PortEnableIndication(
- aCommand.iParam1,
- indicationIsFinal);
-
- }
-
-
-//
-// COmxILStateLoadedToIdle
-//
-OMX_ERRORTYPE
-COmxILFsm::COmxILStateLoadedToIdle::SetParameter(
- COmxILFsm& aFsm,
- OMX_INDEXTYPE aParamIndex,
- const TAny* apComponentParameterStructure)
- {
-
- // In this transitional state, OMX_SetParameter is allowed only if
- // OMX_UseBuffer has not been received yet...
- if (iUseBufferReceived)
- {
- return OMX_ErrorIncorrectStateOperation;
- }
-
-
- return COmxILStateLoaded::SetParameter(aFsm,
- aParamIndex,
- apComponentParameterStructure);
-
- }
-
-OMX_ERRORTYPE
-COmxILFsm::COmxILStateLoadedToIdle::PopulateBuffer(
- COmxILFsm& aFsm,
- OMX_BUFFERHEADERTYPE** appBufferHdr,
- OMX_U32 aPortIndex,
- OMX_PTR apAppPrivate,
- OMX_U32 aSizeBytes,
- OMX_U8* apBuffer,
- TBool& portPopulationCompleted)
- {
- DEBUG_PRINTF(_L8("COmxILStateLoadedToIdle::PopulateBuffer"));
-
- OMX_ERRORTYPE omxError =
- COmxILState::PopulateBufferV2(aFsm,
- appBufferHdr,
- aPortIndex,
- apAppPrivate,
- aSizeBytes,
- apBuffer,
- portPopulationCompleted);
-
- if (apBuffer && OMX_ErrorNone == omxError)
- {
- // Flag that OMX_UseBuffer has been called in LoadedToIdle state. This
- // will be used to know if an OMX_SetParameter call will be allowed in
- // this state... It will be allowed only if false...
- iUseBufferReceived = ETrue;
- }
-
- return omxError;
-
- }
-
-
-OMX_ERRORTYPE
-COmxILFsm::COmxILStateLoadedToIdle::CommandStateSet(
- COmxILFsm& aFsm,
- const TOmxILCommand& aCommand)
- {
- DEBUG_PRINTF(_L8("COmxILStateLoadedToIdle::CommandStateSet"));
-
- __ASSERT_DEBUG(aCommand.iCommandType == OMX_CommandStateSet,
- User::Panic(KOmxILFsmPanicCategory, 1));
-
- switch(aCommand.iParam1)
- {
- case OMX_StateWaitForResources:
- {
- // Not implemented for now...
- return OMX_ErrorNotImplemented;
- }
- case OMX_StateLoaded:
- {
- // Here, return "same state" as the transition to OMX_StateLoaded has
- // not completed yet.
- return OMX_ErrorSameState;
- }
- case OMX_StateInvalid:
- {
- // Notify the IL client... ignore the ret value...
- aFsm.iCallbacks.TransitionCompleteNotification(OMX_StateInvalid);
- // Invalidate component
- return OMX_ErrorInvalidState;
- }
- default:
- {
- return OMX_ErrorIncorrectStateTransition;
- }
- };
-
- }
-
-OMX_ERRORTYPE
-COmxILFsm::COmxILStateLoadedToIdle::CommandPortEnable(
- COmxILFsm& aFsm,
- const TOmxILCommand& aCommand)
- {
- DEBUG_PRINTF(_L8("COmxILStateLoadedToIdle::CommandPortEnable"));
- __ASSERT_DEBUG(aCommand.iCommandType == OMX_CommandPortEnable,
- User::Panic(KOmxILFsmPanicCategory, 1));
-
- TBool indicationIsFinal = EFalse;
- OMX_ERRORTYPE omxRetValue =
- aFsm.iPortManager.PortEnableIndication(
- aCommand.iParam1,
- indicationIsFinal);
- if (OMX_ErrorNone != omxRetValue)
- {
- return omxRetValue;
- }
-
- // Lets tell port manager in case the port being enabled is a tunnel
- // supplier...
- TBool componentPopulationCompleted = EFalse;
- omxRetValue =
- aFsm.iPortManager.TunnellingBufferAllocation(
- componentPopulationCompleted, aCommand.iParam1);
- if (OMX_ErrorNone != omxRetValue)
- {
- return omxRetValue;
- }
-
- // Let's do this check here although this situation is going to be very
- // unlikely...
- if (componentPopulationCompleted)
- {
- // Complete here the transition to OMX_StateIdle
- omxRetValue = aFsm.FsmTransition(COmxILFsm::EStateIdle);
- if (OMX_ErrorNone == omxRetValue)
- {
- // Notify the IL client that port population has completed sucessfully
- aFsm.iCallbacks.TransitionCompleteNotification(
- OMX_StateIdle);
- }
-
- }
-
- return omxRetValue;
-
- }
-
-
-//
-// COmxILStateWaitForResources
-//
-OMX_STATETYPE
-COmxILFsm::COmxILStateWaitForResources::GetState() const
- {
- DEBUG_PRINTF(_L8("COmxILStateWaitForResources::GetState"));
- return OMX_StateWaitForResources;
- }
-
-
-OMX_ERRORTYPE
-COmxILFsm::COmxILStateWaitForResources::SetParameter(
- COmxILFsm& aFsm,
- OMX_INDEXTYPE aParamIndex,
- const TAny* apComponentParameterStructure)
- {
- DEBUG_PRINTF(_L8("COmxILStateWaitForResources::SetParameter"));
-
- return COmxILState::SetParameterV2(aFsm,
- aParamIndex,
- apComponentParameterStructure);
-
- }
-
-
-OMX_ERRORTYPE
-COmxILFsm::COmxILStateWaitForResources::PopulateBuffer(
- COmxILFsm& aFsm,
- OMX_BUFFERHEADERTYPE** appBufferHdr,
- OMX_U32 aPortIndex,
- OMX_PTR apAppPrivate,
- OMX_U32 aSizeBytes,
- OMX_U8* apBuffer,
- TBool& portPopulationCompleted)
- {
- DEBUG_PRINTF(_L8("COmxILStateWaitForResources::PopulateBuffer"));
-
- // NOTE that according to the spec, PopulateBuffer could be used here even
- // if the port is enabled. However, for now the transition from
- // OMX_StateWaitForResouces -> OMX_StateIdle is not supported, therefore
- // buffer population is only allowed for disabled ports. This should be
- // changed once Resource Management functionality is available and this
- // state is revisited.
- return COmxILState::PopulateBuffer(aFsm,
- appBufferHdr,
- aPortIndex,
- apAppPrivate,
- aSizeBytes,
- apBuffer,
- portPopulationCompleted);
-
- }
-
-
-OMX_ERRORTYPE
-COmxILFsm::COmxILStateWaitForResources::FreeBuffer(
- COmxILFsm& aFsm,
- OMX_U32 aPortIndex,
- OMX_BUFFERHEADERTYPE* apBuffer,
- TBool& aPortDepopulationCompleted)
- {
- DEBUG_PRINTF(_L8("COmxILStateWaitForResources::FreeBuffer"));
-
- return COmxILState::FreeBuffer(aFsm,
- aPortIndex,
- apBuffer,
- aPortDepopulationCompleted);
-
- }
-
-OMX_ERRORTYPE
-COmxILFsm::COmxILStateWaitForResources::EmptyThisBuffer(
- COmxILFsm& aFsm,
- OMX_BUFFERHEADERTYPE* apBuffer)
- {
- DEBUG_PRINTF(_L8("COmxILStateWaitForResources::EmptyThisBuffer"));
-
- return COmxILState::EmptyThisBuffer(aFsm,
- apBuffer);
-
-
- }
-
-OMX_ERRORTYPE
-COmxILFsm::COmxILStateWaitForResources::FillThisBuffer(
- COmxILFsm& aFsm,
- OMX_BUFFERHEADERTYPE* apBuffer)
- {
- DEBUG_PRINTF(_L8("COmxILStateWaitForResources::FillThisBuffer"));
-
- return COmxILState::FillThisBuffer(aFsm,
- apBuffer);
-
- }
-
-
-OMX_ERRORTYPE
-COmxILFsm::COmxILStateWaitForResources::ComponentTunnelRequest(
- COmxILFsm& aFsm,
- OMX_U32 aPort,
- OMX_HANDLETYPE aTunneledComp,
- OMX_U32 aTunneledPort,
- OMX_TUNNELSETUPTYPE* apTunnelSetup)
- {
- DEBUG_PRINTF(_L8("COmxILStateWaitForResources::ComponentTunnelRequest"));
-
- return COmxILState::ComponentTunnelRequest(aFsm,
- aPort,
- aTunneledComp,
- aTunneledPort,
- apTunnelSetup);
-
- }
-
-
-OMX_ERRORTYPE
-COmxILFsm::COmxILStateWaitForResources::CommandStateSet(
- COmxILFsm& aFsm,
- const TOmxILCommand& aCommand)
- {
- DEBUG_PRINTF(_L8("COmxILStateWaitForResources::CommandStateSet"));
-
- __ASSERT_DEBUG(aCommand.iCommandType == OMX_CommandStateSet,
- User::Panic(KOmxILFsmPanicCategory, 1));
-
- // Transition to OMX_StateIdle not implemented for now...
- COmxILFsm::TStateIndex nextState = COmxILFsm::EStateMax;
- switch(aCommand.iParam1)
- {
- case OMX_StateLoaded:
- {
- nextState = COmxILFsm::EStateLoaded;
- }
- break;
- case OMX_StateWaitForResources:
- {
- return OMX_ErrorSameState;
- }
- case OMX_StateInvalid:
- {
- // Notify the IL client... ignore the ret value...
- aFsm.iCallbacks.TransitionCompleteNotification(OMX_StateInvalid);
- // Invalidate component
- return OMX_ErrorInvalidState;
- }
- default:
- {
- return OMX_ErrorIncorrectStateTransition;
- }
- };
-
- // Initial checks OK. The component is commanded to make a transition to
- // OMX_StateLoaded
- OMX_ERRORTYPE omxRetValue = aFsm.FsmTransition(nextState);
- if (OMX_ErrorNone == omxRetValue)
- {
- // Notify the IL client that the transition to
- // OMX_StateLoaded has completed sucessfully
- omxRetValue =
- aFsm.iCallbacks.TransitionCompleteNotification(OMX_StateLoaded);
- }
-
- return omxRetValue;
-
- }
-
-OMX_ERRORTYPE
-COmxILFsm::COmxILStateWaitForResources::CommandPortEnable(
- COmxILFsm& aFsm,
- const TOmxILCommand& aCommand)
- {
- DEBUG_PRINTF(_L8("COmxILStateWaitForResources::CommandPortEnable"));
- __ASSERT_DEBUG(aCommand.iCommandType == OMX_CommandPortEnable,
- User::Panic(KOmxILFsmPanicCategory, 1));
-
- // NOTE: Here, we only care about the port enabled flag. Transition from
- // OMX_StateWaitForResources to OMX_StateIdle is not implemented at this
- // stage until a Resource Manager is available. Whenever a Resource Manager
- // becomes available, a COmxILStateWaitForResourcesToIdle substate should
- // be implemented to handle the allocation of buffers mandated by the
- // standard when a port is enabled in this transition.
- TBool indicationIsFinal = ETrue;
- return aFsm.iPortManager.PortEnableIndication(
- aCommand.iParam1,
- indicationIsFinal);
-
- }
-
-
-//
-// COmxILStateIdle
-//
-OMX_STATETYPE
-COmxILFsm::COmxILStateIdle::GetState() const
- {
- DEBUG_PRINTF(_L8("COmxILStateIdle::GetState"));
- return OMX_StateIdle;
- }
-
-
-OMX_ERRORTYPE
-COmxILFsm::COmxILStateIdle::SetParameter(
- COmxILFsm& aFsm,
- OMX_INDEXTYPE aParamIndex,
- const TAny* apComponentParameterStructure)
- {
- DEBUG_PRINTF(_L8("COmxILStateIdle::SetParameter"));
-
- return COmxILState::SetParameter(aFsm,
- aParamIndex,
- apComponentParameterStructure);
-
- }
-
-OMX_ERRORTYPE
-COmxILFsm::COmxILStateIdle::PopulateBuffer(COmxILFsm& aFsm,
- OMX_BUFFERHEADERTYPE** appBufferHdr,
- OMX_U32 aPortIndex,
- OMX_PTR apAppPrivate,
- OMX_U32 aSizeBytes,
- OMX_U8* apBuffer,
- TBool& portPopulationCompleted)
- {
- DEBUG_PRINTF(_L8("COmxILStateIdle::PopulateBuffer"));
-
- // At this point, no buffer population can take place unless the port is disabled
- return COmxILState::PopulateBuffer(aFsm,
- appBufferHdr,
- aPortIndex,
- apAppPrivate,
- aSizeBytes,
- apBuffer,
- portPopulationCompleted);
-
- }
-
-
-OMX_ERRORTYPE
-COmxILFsm::COmxILStateIdle::FreeBuffer(COmxILFsm& aFsm,
- OMX_U32 aPortIndex,
- OMX_BUFFERHEADERTYPE* apBuffer,
- TBool& aPortDepopulationCompleted)
- {
- DEBUG_PRINTF(_L8("COmxILStateIdle::FreeBuffer"));
-
- // At this point, the command requesting the transition from Idle to Loaded
- // has not been received yet.. (see COmxILStateIdleToLoaded). Therefore,
- // this can only be successful if the port is disabled
- return COmxILState::FreeBuffer(aFsm,
- aPortIndex,
- apBuffer,
- aPortDepopulationCompleted);
-
- }
-
-OMX_ERRORTYPE
-COmxILFsm::COmxILStateIdle::EmptyThisBuffer(
- COmxILFsm& aFsm,
- OMX_BUFFERHEADERTYPE* apBuffer)
- {
- DEBUG_PRINTF(_L8("COmxILStateIdle::EmptyThisBuffer"));
-
- return COmxILState::EmptyThisBufferV2(aFsm,
- apBuffer);
-
- }
-
-OMX_ERRORTYPE
-COmxILFsm::COmxILStateIdle::FillThisBuffer(COmxILFsm& aFsm,
- OMX_BUFFERHEADERTYPE* apBuffer)
- {
- DEBUG_PRINTF(_L8("COmxILStateIdle::FillThisBuffer"));
-
- return COmxILState::FillThisBufferV2(aFsm,
- apBuffer);
-
- }
-
-OMX_ERRORTYPE
-COmxILFsm::COmxILStateIdle::ComponentTunnelRequest(
- COmxILFsm& aFsm,
- OMX_U32 aPort,
- OMX_HANDLETYPE aTunneledComp,
- OMX_U32 aTunneledPort,
- OMX_TUNNELSETUPTYPE* apTunnelSetup)
- {
- DEBUG_PRINTF(_L8("COmxILStateIdle::ComponentTunnelRequest"));
-
- return COmxILState::ComponentTunnelRequest(aFsm,
- aPort,
- aTunneledComp,
- aTunneledPort,
- apTunnelSetup);
-
- }
-
-OMX_ERRORTYPE
-COmxILFsm::COmxILStateIdle::CommandStateSet(
- COmxILFsm& aFsm,
- const TOmxILCommand& aCommand)
- {
- DEBUG_PRINTF(_L8("COmxILStateIdle::CommandStateSet"));
-
- __ASSERT_DEBUG(aCommand.iCommandType == OMX_CommandStateSet,
- User::Panic(KOmxILFsmPanicCategory, 1));
-
- COmxILFsm::TStateIndex nextState = COmxILFsm::EStateInvalid;
- switch(aCommand.iParam1)
- {
- case OMX_StateLoaded:
- {
- nextState = COmxILFsm::ESubStateIdleToLoaded;
- }
- break;
- case OMX_StateExecuting:
- {
- nextState = COmxILFsm::EStateExecuting;
- }
- break;
- case OMX_StatePause:
- {
- nextState = COmxILFsm::EStatePause;
- }
- break;
- case OMX_StateIdle:
- {
- return OMX_ErrorSameState;
- }
- case OMX_StateInvalid:
- {
- // Notify the IL client... ignore the ret value...
- aFsm.iCallbacks.TransitionCompleteNotification(OMX_StateInvalid);
- // Invalidate component
- return OMX_ErrorInvalidState;
- }
- default:
- {
- return OMX_ErrorIncorrectStateTransition;
- }
- };
-
- // Initial command checks OK
-
- // Commit transition to the valid state
- OMX_ERRORTYPE omxRetValue = aFsm.FsmTransition(nextState);
- if (OMX_ErrorNone != omxRetValue)
- {
- return omxRetValue;
- }
-
- if (COmxILFsm::ESubStateIdleToLoaded == nextState)
- {
- // Lets tell port manager in case there are tunnelled ports...
- TBool componentDepopulationCompleted = EFalse;
- omxRetValue =
- aFsm.iPortManager.TunnellingBufferDeallocation(
- componentDepopulationCompleted);
- if (OMX_ErrorNone != omxRetValue)
- {
- return omxRetValue;
- }
-
- if (componentDepopulationCompleted)
- {
- // Complete here the transition to OMX_StateLoaded
- omxRetValue = aFsm.FsmTransition(COmxILFsm::EStateLoaded);
- if (OMX_ErrorNone == omxRetValue)
- {
- // Notify the IL client that port population has completed sucessfully
- omxRetValue = aFsm.iCallbacks.TransitionCompleteNotification(
- OMX_StateLoaded);
- }
- }
-
- }
- else
- {
- // Notify the IL client that the transition to the valid state
- // OMX_StatePause or OMX_StateExecuting has completed sucessfully
- omxRetValue = aFsm.iCallbacks.TransitionCompleteNotification(
- static_cast<OMX_STATETYPE>(aCommand.iParam1));
-
- if (OMX_ErrorNone == omxRetValue)
- {
- // Fire up the tunnelled buffer exchange, if any tunnelled ports are
- // found in the component...
- omxRetValue = aFsm.iPortManager.InitiateTunnellingDataFlow();
- }
-
- }
-
- return omxRetValue;
-
- }
-
-OMX_ERRORTYPE
-COmxILFsm::COmxILStateIdle::CommandFlush(COmxILFsm& aFsm,
- const TOmxILCommand& aCommand)
- {
- DEBUG_PRINTF(_L8("COmxILStateIdle::CommandFlush"));
-
- __ASSERT_DEBUG(aCommand.iCommandType == OMX_CommandFlush,
- User::Panic(KOmxILFsmPanicCategory, 1));
-
- return aFsm.iPortManager.BufferFlushIndicationFlushCommand(
- aCommand.iParam1, OMX_FALSE); // Do not eject buffers
-
- }
-
-
-OMX_ERRORTYPE
-COmxILFsm::COmxILStateIdle::CommandPortEnable(
- COmxILFsm& aFsm,
- const TOmxILCommand& aCommand)
- {
- DEBUG_PRINTF(_L8("COmxILStateIdle::CommandPortEnable"));
- __ASSERT_DEBUG(aCommand.iCommandType == OMX_CommandPortEnable,
- User::Panic(KOmxILFsmPanicCategory, 1));
-
- // In this state, the port allocation has finished for enabled
- // ports. However, a port is being enabled here. The port being enabled
- // must populate (if tunnel supplier) or be populated (if non-tunnel
- // supplier or IL Client communication)
- TBool indicationIsFinal = EFalse;
- OMX_ERRORTYPE omxRetValue =
- aFsm.iPortManager.PortEnableIndication(
- aCommand.iParam1,
- indicationIsFinal);
-
- if (OMX_ErrorNone == omxRetValue)
- {
- // From section 3.2.2.6, "If the IL client enables a port while the
- // component is in any state other than OMX_StateLoaded or
- // OMX_WaitForResources, then that port shall allocate its buffers via
- // the same call sequence used on a transition from OMX_StateLoaded to
- // OMX_StateIdle."
-
- // Lets tell port manager in case the port being enabled is a tunnel
- // supplier...
- TBool componentPopulationCompleted = EFalse;
- omxRetValue =
- aFsm.iPortManager.TunnellingBufferAllocation(
- componentPopulationCompleted, aCommand.iParam1);
- }
-
- return omxRetValue;
-
- }
-
-
-//
-// COmxILStateIdleToLoaded
-//
-OMX_ERRORTYPE
-COmxILFsm::COmxILStateIdleToLoaded::FreeBuffer(COmxILFsm& aFsm,
- OMX_U32 aPortIndex,
- OMX_BUFFERHEADERTYPE* apBuffer,
- TBool& aPortDepopulationCompleted)
- {
- DEBUG_PRINTF(_L8("COmxILStateIdleToLoaded::FreeBuffer"));
-
- return COmxILState::FreeBufferV2(aFsm,
- aPortIndex,
- apBuffer,
- aPortDepopulationCompleted);
-
- }
-
-
-OMX_ERRORTYPE
-COmxILFsm::COmxILStateIdleToLoaded::CommandStateSet(
- COmxILFsm& aFsm,
- const TOmxILCommand& aCommand)
- {
- DEBUG_PRINTF(_L8("COmxILStateIdleToLoaded::CommandStateSet"));
-
- __ASSERT_DEBUG(aCommand.iCommandType == OMX_CommandStateSet,
- User::Panic(KOmxILFsmPanicCategory, 1));
-
- switch (aCommand.iParam1)
- {
- case OMX_StateIdle:
- {
- // Here, return "same state" as the transition to OMX_StateLoaded has
- // not completed yet.
- return OMX_ErrorSameState;
- }
- case OMX_StateInvalid:
- {
- // Notify the IL client... ignore the ret value...
- aFsm.iCallbacks.TransitionCompleteNotification(OMX_StateInvalid);
- // Invalidate component
- return OMX_ErrorInvalidState;
- }
- default:
- {
- __ASSERT_ALWAYS(0, User::Panic(KOmxILFsmPanicCategory, 1));
- }
- };
-
- return OMX_ErrorNone;
-
- }
-
-
-//
-// COmxILStateExecuting
-//
-OMX_STATETYPE
-COmxILFsm::COmxILStateExecuting::GetState() const
- {
- DEBUG_PRINTF(_L8("COmxILStateExecuting::GetState"));
- return OMX_StateExecuting;
- }
-
-
-OMX_ERRORTYPE
-COmxILFsm::COmxILStateExecuting::SetParameter(COmxILFsm& aFsm,
- OMX_INDEXTYPE aParamIndex,
- const TAny* apComponentParameterStructure)
- {
- DEBUG_PRINTF(_L8("COmxILStateExecuting::SetParameter"));
-
- return COmxILState::SetParameter(aFsm,
- aParamIndex,
- apComponentParameterStructure);
-
- }
-
-
-OMX_ERRORTYPE
-COmxILFsm::COmxILStateExecuting::PopulateBuffer(COmxILFsm& aFsm,
- OMX_BUFFERHEADERTYPE** appBufferHdr,
- OMX_U32 aPortIndex,
- OMX_PTR apAppPrivate,
- OMX_U32 aSizeBytes,
- OMX_U8* apBuffer,
- TBool& portPopulationCompleted)
- {
- DEBUG_PRINTF(_L8("COmxILStateExecuting::PopulateBuffer"));
-
- return COmxILState::PopulateBuffer(aFsm,
- appBufferHdr,
- aPortIndex,
- apAppPrivate,
- aSizeBytes,
- apBuffer,
- portPopulationCompleted);
-
- }
-
-
-OMX_ERRORTYPE
-COmxILFsm::COmxILStateExecuting::FreeBuffer(COmxILFsm& aFsm,
- OMX_U32 aPortIndex,
- OMX_BUFFERHEADERTYPE* apBuffer,
- TBool& aPortDepopulationCompleted)
- {
- DEBUG_PRINTF(_L8("COmxILStateExecuting::FreeBuffer"));
-
- return COmxILState::FreeBuffer(aFsm,
- aPortIndex,
- apBuffer,
- aPortDepopulationCompleted);
-
- }
-
-
-OMX_ERRORTYPE
-COmxILFsm::COmxILStateExecuting::EmptyThisBuffer(
- COmxILFsm& aFsm,
- OMX_BUFFERHEADERTYPE* apBuffer)
- {
- DEBUG_PRINTF(_L8("COmxILStateExecuting::EmptyThisBuffer"));
-
- return COmxILState::EmptyThisBufferV2(aFsm,
- apBuffer);
-
- }
-
-
-OMX_ERRORTYPE
-COmxILFsm::COmxILStateExecuting::FillThisBuffer(COmxILFsm& aFsm,
- OMX_BUFFERHEADERTYPE* apBuffer)
- {
- DEBUG_PRINTF(_L8("COmxILStateExecuting::FillThisBuffer"));
-
- return COmxILState::FillThisBufferV2(aFsm,
- apBuffer);
-
- }
-
-
-OMX_ERRORTYPE
-COmxILFsm::COmxILStateExecuting::ComponentTunnelRequest(
- COmxILFsm& aFsm,
- OMX_U32 aPort,
- OMX_HANDLETYPE aTunneledComp,
- OMX_U32 aTunneledPort,
- OMX_TUNNELSETUPTYPE* apTunnelSetup)
- {
- DEBUG_PRINTF(_L8("COmxILStateExecuting::ComponentTunnelRequest"));
-
- return COmxILState::ComponentTunnelRequest(aFsm,
- aPort,
- aTunneledComp,
- aTunneledPort,
- apTunnelSetup);
-
- }
-
-
-OMX_ERRORTYPE
-COmxILFsm::COmxILStateExecuting::CommandStateSet(
- COmxILFsm& aFsm,
- const TOmxILCommand& aCommand)
- {
- DEBUG_PRINTF(_L8("COmxILStateExecuting::CommandStateSet"));
-
- __ASSERT_DEBUG(aCommand.iCommandType == OMX_CommandStateSet,
- User::Panic(KOmxILFsmPanicCategory, 1));
-
- COmxILFsm::TStateIndex nextState = COmxILFsm::EStateMax;
- switch(aCommand.iParam1)
- {
- case OMX_StateIdle:
- {
- nextState = COmxILFsm::ESubStateExecutingToIdle;
- }
- break;
- case OMX_StatePause:
- {
- nextState = COmxILFsm::EStatePause;
- }
- break;
- case OMX_StateExecuting:
- {
- return OMX_ErrorSameState;
- }
- case OMX_StateInvalid:
- {
- // Notify the IL client... ignore the ret value...
- aFsm.iCallbacks.TransitionCompleteNotification(OMX_StateInvalid);
- // Invalidate component
- return OMX_ErrorInvalidState;
- }
- default:
- {
- return OMX_ErrorIncorrectStateTransition;
- }
- };
-
-
- // Initial checks OK. The component is commanded to make a transition to
- // ESubStateExecutingToIdle substate or OMX_StatePause.
- OMX_ERRORTYPE omxRetValue = aFsm.FsmTransition(nextState);
- if (OMX_ErrorNone != omxRetValue)
- {
- return omxRetValue;
- }
-
- if (COmxILFsm::ESubStateExecutingToIdle == nextState)
- {
- // Lets tell port manager since at this point it is mandated that all
- // buffers must be returned to their suppliers (IL Client and/or
- // tunnelled components).
- TBool allBuffersReturnedToSuppliers = EFalse;
- omxRetValue =
- aFsm.iPortManager.BufferFlushIndicationPauseOrExeToIdleCommand(
- allBuffersReturnedToSuppliers);
- if (OMX_ErrorNone != omxRetValue)
- {
- return omxRetValue;
- }
-
- if (allBuffersReturnedToSuppliers)
- {
- // Complete here the transition to OMX_StateIdle
- omxRetValue = aFsm.FsmTransition(COmxILFsm::EStateIdle);
- if (OMX_ErrorNone == omxRetValue)
- {
- // Notify the IL client that port population has completed sucessfully
- omxRetValue = aFsm.iCallbacks.TransitionCompleteNotification(
- OMX_StateIdle);
- }
- }
-
- }
- else
- {
- // Notify the IL client that the transition to OMX_StatePause has
- // completed sucessfully
- omxRetValue = aFsm.iCallbacks.TransitionCompleteNotification(
- OMX_StatePause);
-
- }
-
- return omxRetValue;
-
- }
-
-
-OMX_ERRORTYPE
-COmxILFsm::COmxILStateExecuting::CommandPortEnable(
- COmxILFsm& aFsm,
- const TOmxILCommand& aCommand)
- {
- DEBUG_PRINTF(_L8("COmxILStateExecuting::CommandPortEnable"));
- __ASSERT_DEBUG(aCommand.iCommandType == OMX_CommandPortEnable,
- User::Panic(KOmxILFsmPanicCategory, 1));
-
- // In this state, the port allocation has finished for enabled
- // ports. However, a port is being enabled here. The port being enabled
- // must populate (if tunnel supplier) or be populated (if non-tunnel
- // supplier or IL Client communication)
- TBool indicationIsFinal = EFalse;
- OMX_ERRORTYPE omxRetValue =
- aFsm.iPortManager.PortEnableIndication(
- aCommand.iParam1,
- indicationIsFinal);
-
- if (OMX_ErrorNone == omxRetValue)
- {
- // From section 3.2.2.6, "If the IL client enables a port while the
- // component is in any state other than OMX_StateLoaded or
- // OMX_WaitForResources, then that port shall allocate its buffers via
- // the same call sequence used on a transition from OMX_StateLoaded to
- // OMX_StateIdle. If the IL client enables while the component is in
- // the OMX_Executing state, then that port shall begin transferring
- // buffers"
-
- // Lets tell port manager in case the port being enabled is a tunnel
- // supplier...
- TBool componentPopulationCompleted = EFalse;
- omxRetValue =
- aFsm.iPortManager.TunnellingBufferAllocation(
- componentPopulationCompleted, aCommand.iParam1);
-
- // No need to use here componentPopulationCompleted. A port is being
- // enabled in OMX_StateExecuting. If the port is a supplier, after
- // being re-enabled it should start the buffer allocation phase,
- // regardless of the population state of other ports in the component.
- if (OMX_ErrorNone == omxRetValue)
- {
- // Fire up the tunnelled buffer exchange in the enabled port...
- omxRetValue = aFsm.iPortManager.InitiateTunnellingDataFlow(
- aCommand.iParam1);
- }
- }
-
- return omxRetValue;
-
- }
-
-
-//
-// MOmxILPauseOrExecutingToIdle
-//
-OMX_ERRORTYPE
-COmxILFsm::MOmxILPauseOrExecutingToIdle::ReturnThisBuffer(
- COmxILFsm& aFsm,
- OMX_BUFFERHEADERTYPE* apBuffer,
- OMX_DIRTYPE aDirection)
- {
- DEBUG_PRINTF(_L8("MOmxILPauseOrExecutingToIdle::ReturnThisBuffer"));
-
- TBool allBuffersReturned = EFalse;
- OMX_ERRORTYPE omxRetValue =
- aFsm.iPortManager.BufferReturnIndication(
- apBuffer,
- aDirection,
- allBuffersReturned
- );
-
- if (OMX_ErrorNone != omxRetValue)
- {
- return omxRetValue;
- }
-
- if (allBuffersReturned &&
- aFsm.iPortManager.AllBuffersAtHome())
- {
- // Complete here the transition to OMX_StateIdle
- omxRetValue = aFsm.FsmTransition(COmxILFsm::EStateIdle);
- if (OMX_ErrorNone == omxRetValue)
- {
- // Notify the IL client that transition to Idle has completed
- // sucessfully
- omxRetValue = aFsm.iCallbacks.TransitionCompleteNotification(
- OMX_StateIdle);
- }
- }
-
- return omxRetValue;
-
- }
-
-
-
-//
-// COmxILStateExecutingToIdle
-//
-OMX_ERRORTYPE
-COmxILFsm::COmxILStateExecutingToIdle::EmptyThisBuffer(
- COmxILFsm& aFsm,
- OMX_BUFFERHEADERTYPE* apBuffer)
- {
- DEBUG_PRINTF(_L8("COmxILStateExecutingToIdle::EmptyThisBuffer"));
-
- return ReturnThisBuffer(aFsm,
- apBuffer,
- OMX_DirInput);
-
- }
-
-
-OMX_ERRORTYPE
-COmxILFsm::COmxILStateExecutingToIdle::FillThisBuffer(
- COmxILFsm& aFsm,
- OMX_BUFFERHEADERTYPE* apBuffer)
- {
- DEBUG_PRINTF(_L8("COmxILStateExecutingToIdle::FillThisBuffer"));
-
- return ReturnThisBuffer(aFsm,
- apBuffer,
- OMX_DirOutput);
-
- }
-
-
-OMX_ERRORTYPE
-COmxILFsm::COmxILStateExecutingToIdle::CommandStateSet(
- COmxILFsm& aFsm,
- const TOmxILCommand& aCommand)
- {
- DEBUG_PRINTF(_L8("COmxILStateExecutingToIdle::CommandStateSet"));
-
- __ASSERT_DEBUG(aCommand.iCommandType == OMX_CommandStateSet,
- User::Panic(KOmxILFsmPanicCategory, 1));
-
- switch(aCommand.iParam1)
- {
- case OMX_StateExecuting:
- {
- // Here, return "same state" as the transition to OMX_StateIdle has
- // not completed yet.
- return OMX_ErrorSameState;
- }
- case OMX_StateInvalid:
- {
- // Notify the IL client... ignore the ret value...
- aFsm.iCallbacks.TransitionCompleteNotification(OMX_StateInvalid);
- // Invalidate component
- return OMX_ErrorInvalidState;
- }
- default:
- {
- return OMX_ErrorIncorrectStateTransition;
- }
- };
-
- }
-
-
-//
-// COmxILStatePause
-//
-OMX_STATETYPE
-COmxILFsm::COmxILStatePause::GetState() const
- {
- DEBUG_PRINTF(_L8("COmxILStatePause::GetState"));
- return OMX_StatePause;
- }
-
-
-OMX_ERRORTYPE
-COmxILFsm::COmxILStatePause::SetParameter(
- COmxILFsm& aFsm,
- OMX_INDEXTYPE aParamIndex,
- const TAny* apComponentParameterStructure)
- {
- DEBUG_PRINTF(_L8("COmxILStatePause::SetParameter"));
-
- return COmxILState::SetParameter(aFsm,
- aParamIndex,
- apComponentParameterStructure);
-
- }
-
-
-OMX_ERRORTYPE
-COmxILFsm::COmxILStatePause::PopulateBuffer(
- COmxILFsm& aFsm,
- OMX_BUFFERHEADERTYPE** appBufferHdr,
- OMX_U32 aPortIndex,
- OMX_PTR apAppPrivate,
- OMX_U32 aSizeBytes,
- OMX_U8* apBuffer,
- TBool& portPopulationCompleted)
- {
- DEBUG_PRINTF(_L8("COmxILStatePause::PopulateBuffer"));
-
- return COmxILState::PopulateBuffer(aFsm,
- appBufferHdr,
- aPortIndex,
- apAppPrivate,
- aSizeBytes,
- apBuffer,
- portPopulationCompleted);
-
- }
-
-
-OMX_ERRORTYPE
-COmxILFsm::COmxILStatePause::FreeBuffer(COmxILFsm& aFsm,
- OMX_U32 aPortIndex,
- OMX_BUFFERHEADERTYPE* apBuffer,
- TBool& aPortDepopulationCompleted)
- {
- DEBUG_PRINTF(_L8("COmxILStatePause::FreeBuffer"));
-
- return COmxILState::FreeBuffer(aFsm,
- aPortIndex,
- apBuffer,
- aPortDepopulationCompleted);
-
- }
-
-
-OMX_ERRORTYPE
-COmxILFsm::COmxILStatePause::EmptyThisBuffer(
- COmxILFsm& aFsm,
- OMX_BUFFERHEADERTYPE* apBuffer)
- {
- DEBUG_PRINTF(_L8("COmxILStatePause::EmptyThisBuffer"));
-
- return COmxILState::EmptyThisBufferV2(aFsm,
- apBuffer);
-
- }
-
-OMX_ERRORTYPE
-COmxILFsm::COmxILStatePause::FillThisBuffer(COmxILFsm& aFsm,
- OMX_BUFFERHEADERTYPE* apBuffer)
- {
- DEBUG_PRINTF(_L8("COmxILStatePause::FillThisBuffer"));
-
- return COmxILState::FillThisBufferV2(aFsm,
- apBuffer);
-
- }
-
-OMX_ERRORTYPE
-COmxILFsm::COmxILStatePause::ComponentTunnelRequest(
- COmxILFsm& aFsm,
- OMX_U32 aPort,
- OMX_HANDLETYPE aTunneledComp,
- OMX_U32 aTunneledPort,
- OMX_TUNNELSETUPTYPE* apTunnelSetup)
- {
- DEBUG_PRINTF(_L8("COmxILStatePause::ComponentTunnelRequest"));
-
- return COmxILState::ComponentTunnelRequest(aFsm,
- aPort,
- aTunneledComp,
- aTunneledPort,
- apTunnelSetup);
-
- }
-
-
-OMX_ERRORTYPE
-COmxILFsm::COmxILStatePause::CommandStateSet(
- COmxILFsm& aFsm,
- const TOmxILCommand& aCommand)
- {
- DEBUG_PRINTF(_L8("COmxILStatePause::CommandStateSet"));
-
- __ASSERT_DEBUG(aCommand.iCommandType == OMX_CommandStateSet,
- User::Panic(KOmxILFsmPanicCategory, 1));
-
- COmxILFsm::TStateIndex nextState = COmxILFsm::EStateInvalid;
- switch(aCommand.iParam1)
- {
- case OMX_StateIdle:
- {
- nextState = COmxILFsm::ESubStatePauseToIdle;
- }
- break;
- case OMX_StateExecuting:
- {
- nextState = COmxILFsm::EStateExecuting;
- }
- break;
- case OMX_StatePause:
- {
- return OMX_ErrorSameState;
- }
- case OMX_StateInvalid:
- {
- // Notify the IL client... ignore the ret value...
- aFsm.iCallbacks.TransitionCompleteNotification(OMX_StateInvalid);
- // Invalidate component
- return OMX_ErrorInvalidState;
- }
- default:
- {
- return OMX_ErrorIncorrectStateTransition;
- }
- };
-
- // Initial command checks OK. The component is commanded to make a
- // transition to ESubStatePauseToIdle substate or OMX_StateExecuting.
- // Commit transition to the valid state
- OMX_ERRORTYPE omxRetValue = aFsm.FsmTransition(nextState);
- if (OMX_ErrorNone != omxRetValue)
- {
- return omxRetValue;
- }
-
- if (COmxILFsm::ESubStatePauseToIdle == nextState)
- {
- // Lets tell port manager since at this point it is mandated that all
- // buffers must be returned to their suppliers (IL Client and/or
- // tunnelled components).
- TBool allBuffersReturnedToSuppliers = EFalse;
- omxRetValue =
- aFsm.iPortManager.BufferFlushIndicationPauseOrExeToIdleCommand(
- allBuffersReturnedToSuppliers);
- if (OMX_ErrorNone != omxRetValue)
- {
- return omxRetValue;
- }
-
- if (allBuffersReturnedToSuppliers)
- {
- // Complete here the transition to OMX_StateIdle
- omxRetValue = aFsm.FsmTransition(COmxILFsm::EStateIdle);
- if (OMX_ErrorNone == omxRetValue)
- {
- // Notify the IL client that port population has completed sucessfully
- aFsm.iCallbacks.TransitionCompleteNotification(
- OMX_StateIdle);
- }
- }
-
- }
- else
- {
- // Notify the IL client that the transition to OMX_StateExecuting has
- // completed sucessfully
- omxRetValue = aFsm.iCallbacks.TransitionCompleteNotification(
- OMX_StateExecuting);
-
- if (OMX_ErrorNone == omxRetValue)
- {
- // Fire up the tunnelled buffer exchange, if any tunnelled ports are
- // found in the component...
- omxRetValue = aFsm.iPortManager.InitiateTunnellingDataFlow();
- }
-
- }
-
- return omxRetValue;
-
- }
-
-OMX_ERRORTYPE
-COmxILFsm::COmxILStatePause::CommandPortEnable(
- COmxILFsm& aFsm,
- const TOmxILCommand& aCommand)
- {
- DEBUG_PRINTF(_L8("COmxILStatePause::CommandPortEnable"));
- __ASSERT_DEBUG(aCommand.iCommandType == OMX_CommandPortEnable,
- User::Panic(KOmxILFsmPanicCategory, 1));
-
- // In this state, the port allocation has finished for enabled
- // ports. However, a port is being enabled here. The port being enabled
- // must populate (if tunnel supplier) or be populated (if non-tunnel
- // supplier or IL Client communication)
- TBool indicationIsFinal = EFalse;
- OMX_ERRORTYPE omxRetValue = aFsm.iPortManager.PortEnableIndication(
- aCommand.iParam1,
- indicationIsFinal);
-
- if (OMX_ErrorNone == omxRetValue)
- {
- // From section 3.2.2.6, "If the IL client enables a port while the
- // component is in any state other than OMX_StateLoaded or
- // OMX_WaitForResources, then that port shall allocate its buffers via
- // the same call sequence used on a transition from OMX_StateLoaded to
- // OMX_StateIdle."
-
- // Lets tell port manager in case the port being enabled is a tunnel
- // supplier...
- TBool componentPopulationCompleted = EFalse;
- omxRetValue =
- aFsm.iPortManager.TunnellingBufferAllocation(
- componentPopulationCompleted, aCommand.iParam1);
-
- }
-
- return omxRetValue;
-
- }
-
-
-//
-// COmxILStatePauseToIdle
-//
-OMX_ERRORTYPE
-COmxILFsm::COmxILStatePauseToIdle::EmptyThisBuffer(
- COmxILFsm& aFsm,
- OMX_BUFFERHEADERTYPE* apBuffer)
- {
- DEBUG_PRINTF(_L8("COmxILStatePauseToIdle::EmptyThisBuffer"));
-
- return ReturnThisBuffer(aFsm,
- apBuffer,
- OMX_DirInput);
-
- }
-
-
-OMX_ERRORTYPE
-COmxILFsm::COmxILStatePauseToIdle::FillThisBuffer(
- COmxILFsm& aFsm,
- OMX_BUFFERHEADERTYPE* apBuffer)
- {
- DEBUG_PRINTF(_L8("COmxILStatePauseToIdle::FillThisBuffer"));
-
- return ReturnThisBuffer(aFsm,
- apBuffer,
- OMX_DirOutput);
-
- }
-
-
-OMX_ERRORTYPE
-COmxILFsm::COmxILStatePauseToIdle::CommandStateSet(
- COmxILFsm& aFsm,
- const TOmxILCommand& aCommand)
- {
- DEBUG_PRINTF(_L8("COmxILStatePauseToIdle::CommandStateSet"));
-
- __ASSERT_DEBUG(aCommand.iCommandType == OMX_CommandStateSet,
- User::Panic(KOmxILFsmPanicCategory, 1));
-
- switch(aCommand.iParam1)
- {
- case OMX_StatePause:
- {
- // Here, return "same state" as the transition to OMX_StateIdle has not
- // completed yet.
- return OMX_ErrorSameState;
- }
- case OMX_StateInvalid:
- {
- // Notify the IL client... ignore the ret value...
- aFsm.iCallbacks.TransitionCompleteNotification(OMX_StateInvalid);
- // Invalidate component
- return OMX_ErrorInvalidState;
- }
- default:
- {
- return OMX_ErrorIncorrectStateTransition;
- }
- };
-
- }
-
-
+// Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of "Eclipse Public License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+//
+
+
+/**
+ @file
+ @internalComponent
+*/
+
+#include "log.h"
+#include "omxilstate.h"
+#include "omxilfsm.h"
+#include "omxilcommand.h"
+#include "omxilconfigmanager.h"
+#include "omxilcallbackmanager.h"
+
+
+OMX_ERRORTYPE
+COmxILFsm::COmxILState::GetParameter(
+ const COmxILFsm& aFsm,
+ OMX_INDEXTYPE aParamIndex,
+ TAny* apComponentParameterStructure) const
+ {
+ DEBUG_PRINTF(_L8("COmxILState::GetParameter"));
+
+ // This API can be used independently of the current state of the
+ // component. Let's try first the Port Manager to check if the index is
+ // known there
+ OMX_ERRORTYPE retValue =
+ aFsm.iPortManager.GetParameter(aParamIndex,
+ apComponentParameterStructure);
+
+ if (OMX_ErrorUnsupportedIndex == retValue)
+ {
+ // Otherwise, try Config Manager...
+ retValue = aFsm.iConfigManager.GetParameter(
+ aParamIndex,
+ apComponentParameterStructure);
+ }
+
+ return retValue;
+
+ }
+
+// This SetParameter version must be used in the following states:
+// - OMX_StateIdle,
+// - OMX_StateExecuting,
+// - OMX_StatePaused, and
+//
+OMX_ERRORTYPE
+COmxILFsm::COmxILState::SetParameter(
+ COmxILFsm& aFsm,
+ OMX_INDEXTYPE aParamIndex,
+ const TAny* apComponentParameterStructure)
+ {
+ DEBUG_PRINTF(_L8("COmxILState::SetParameter"));
+
+ OMX_ERRORTYPE retValue =
+ aFsm.iPortManager.SetParameter(
+ aParamIndex,
+ apComponentParameterStructure,
+ OMX_TRUE // Port must be disabled
+ );
+
+ if (OMX_ErrorUnsupportedIndex == retValue)
+ {
+ // Try Config Manager now...
+ retValue = aFsm.iConfigManager.SetParameter(
+ aParamIndex,
+ apComponentParameterStructure,
+ OMX_FALSE // run-time
+ );
+ }
+
+ return retValue;
+
+ }
+
+// This SetParameter version must be used in the following states:
+// - OMX_StateLoaded and derived states,
+// - OMX_StateWaitForResources
+//
+OMX_ERRORTYPE
+COmxILFsm::COmxILState::SetParameterV2(
+ COmxILFsm& aFsm,
+ OMX_INDEXTYPE aParamIndex,
+ const TAny* apComponentParameterStructure)
+ {
+ DEBUG_PRINTF(_L8("COmxILState::SetParameterV2"));
+
+ OMX_ERRORTYPE retValue =
+ aFsm.iPortManager.SetParameter(aParamIndex,
+ apComponentParameterStructure);
+
+ if (OMX_ErrorUnsupportedIndex == retValue)
+ {
+ // Try Config Manager now...
+ retValue = aFsm.iConfigManager.SetParameter(
+ aParamIndex,
+ apComponentParameterStructure);
+ }
+
+ return retValue;
+
+ }
+
+OMX_ERRORTYPE
+COmxILFsm::COmxILState::GetConfig(
+ const COmxILFsm& aFsm,
+ OMX_INDEXTYPE aConfigIndex,
+ TAny* apComponentConfigStructure) const
+ {
+ DEBUG_PRINTF(_L8("COmxILState::GetConfig"));
+
+ OMX_ERRORTYPE retValue =
+ aFsm.iPortManager.GetConfig(aConfigIndex,
+ apComponentConfigStructure);
+
+ if (OMX_ErrorUnsupportedIndex == retValue)
+ {
+ // Try Config Manager now...
+ retValue = aFsm.iConfigManager.GetConfig(
+ aConfigIndex,
+ apComponentConfigStructure);
+ }
+
+ return retValue;
+
+ }
+
+OMX_ERRORTYPE
+COmxILFsm::COmxILState::SetConfig(COmxILFsm& aFsm,
+ OMX_INDEXTYPE aConfigIndex,
+ const TAny* apComponentConfigStructure)
+ {
+ DEBUG_PRINTF(_L8("COmxILState::SetConfig"));
+
+ OMX_ERRORTYPE retValue =
+ aFsm.iPortManager.SetConfig(aConfigIndex,
+ apComponentConfigStructure);
+
+ if (OMX_ErrorUnsupportedIndex == retValue)
+ {
+ // Try Config Manager now...
+ retValue = aFsm.iConfigManager.SetConfig(
+ aConfigIndex,
+ apComponentConfigStructure);
+ }
+
+ return retValue;
+
+ }
+
+OMX_ERRORTYPE
+COmxILFsm::COmxILState::GetExtensionIndex(const COmxILFsm& aFsm,
+ OMX_STRING aParameterName,
+ OMX_INDEXTYPE* apIndexType) const
+ {
+ DEBUG_PRINTF(_L8("COmxILState::GetExtensionIndex"));
+
+ OMX_ERRORTYPE retValue =
+ aFsm.iPortManager.GetExtensionIndex(aParameterName,
+ apIndexType);
+
+ if (OMX_ErrorUnsupportedIndex == retValue)
+ {
+ // Try Config Manager now...
+ retValue = aFsm.iConfigManager.GetExtensionIndex(
+ aParameterName,
+ apIndexType);
+ }
+
+ return retValue;
+
+ }
+
+//
+//
+//
+
+OMX_ERRORTYPE
+COmxILFsm::COmxILState::CommandFlush(COmxILFsm& aFsm,
+ const TOmxILCommand& aCommand)
+ {
+ DEBUG_PRINTF(_L8("COmxILState::CommandFlush"));
+
+ __ASSERT_DEBUG(aCommand.iCommandType == OMX_CommandFlush,
+ User::Panic(KOmxILFsmPanicCategory, 1));
+
+ return aFsm.iPortManager.BufferFlushIndicationFlushCommand(
+ aCommand.iParam1);
+
+ }
+
+OMX_ERRORTYPE
+COmxILFsm::COmxILState::CommandPortDisable(COmxILFsm& aFsm,
+ const TOmxILCommand& aCommand)
+ {
+ DEBUG_PRINTF(_L8("COmxILState::CommandPortDisable"));
+ __ASSERT_DEBUG(aCommand.iCommandType == OMX_CommandPortDisable,
+ User::Panic(KOmxILFsmPanicCategory, 1));
+
+ // First, flush all buffers in the port(s) that is(are) to be disabled.
+ return aFsm.iPortManager.PortDisableIndication(
+ aCommand.iParam1);
+
+ }
+
+OMX_ERRORTYPE
+COmxILFsm::COmxILState::CommandPortEnable(COmxILFsm& aFsm,
+ const TOmxILCommand& aCommand)
+ {
+ DEBUG_PRINTF(_L8("COmxILState::CommandPortEnable"));
+ __ASSERT_DEBUG(aCommand.iCommandType == OMX_CommandPortEnable,
+ User::Panic(KOmxILFsmPanicCategory, 1));
+
+ TBool indicationIsFinal = EFalse;
+ return aFsm.iPortManager.PortEnableIndication(
+ aCommand.iParam1,
+ indicationIsFinal);
+
+ }
+
+OMX_ERRORTYPE
+COmxILFsm::COmxILState::CommandMarkBuffer(COmxILFsm& aFsm,
+ const TOmxILCommand& aCommand)
+ {
+ DEBUG_PRINTF(_L8("COmxILState::CommandMarkBuffer"));
+
+ __ASSERT_DEBUG(aCommand.iCommandType == OMX_CommandMarkBuffer,
+ User::Panic(KOmxILFsmPanicCategory, 1));
+
+ if (!aCommand.ipCommandData)
+ {
+ return OMX_ErrorBadParameter;
+ }
+
+ return aFsm.iPortManager.BufferMarkIndication(aCommand.iParam1,
+ aCommand.ipCommandData);
+
+ }
+
+//
+// COmxILStateInvalid
+//
+OMX_ERRORTYPE
+COmxILFsm::COmxILStateInvalid::GetParameter(
+ const COmxILFsm& /*aFsm*/,
+ OMX_INDEXTYPE /*aParamIndex*/,
+ TAny* /*apComponentParameterStructure*/) const
+ {
+ DEBUG_PRINTF(_L8("COmxILStateInvalid::GetParameter"));
+ return OMX_ErrorInvalidState;
+ }
+
+OMX_ERRORTYPE
+COmxILFsm::COmxILStateInvalid::SetParameter(
+ COmxILFsm& /*aFsm*/,
+ OMX_INDEXTYPE /*aParamIndex*/,
+ const TAny* /*apComponentParameterStructure*/)
+ {
+ DEBUG_PRINTF(_L8("COmxILStateInvalid::SetParameter"));
+ return OMX_ErrorInvalidState;
+ }
+
+OMX_ERRORTYPE
+COmxILFsm::COmxILStateInvalid::GetConfig(
+ const COmxILFsm& /*aFsm*/,
+ OMX_INDEXTYPE /*aConfigIndex*/,
+ TAny* /*apComponentConfigStructure*/) const
+ {
+ DEBUG_PRINTF(_L8("COmxILStateInvalid::GetConfig"));
+ return OMX_ErrorInvalidState;
+ }
+
+OMX_ERRORTYPE
+COmxILFsm::COmxILStateInvalid::SetConfig(
+ COmxILFsm& /*aFsm*/,
+ OMX_INDEXTYPE /*aConfigIndex*/,
+ const TAny* /*apComponentConfigStructure*/)
+ {
+ DEBUG_PRINTF(_L8("COmxILStateInvalid::SetConfig"));
+ return OMX_ErrorInvalidState;
+ }
+
+OMX_ERRORTYPE
+COmxILFsm::COmxILStateInvalid::GetExtensionIndex(
+ const COmxILFsm& /*aFsm*/,
+ OMX_STRING /*aParameterName*/,
+ OMX_INDEXTYPE* /*apIndexType*/) const
+ {
+ DEBUG_PRINTF(_L8("COmxILStateInvalid::GetExtensionIndex"));
+ return OMX_ErrorInvalidState;
+ }
+
+OMX_STATETYPE
+COmxILFsm::COmxILStateInvalid::GetState() const
+ {
+ DEBUG_PRINTF(_L8("COmxILStateInvalid::GetState"));
+ return OMX_StateInvalid;
+ }
+
+OMX_ERRORTYPE
+COmxILFsm::COmxILStateInvalid::ComponentTunnelRequest(
+ COmxILFsm& /*aFsm*/,
+ OMX_U32 /*aPort*/,
+ OMX_HANDLETYPE /*aTunneledComp*/,
+ OMX_U32 /*aTunneledPort*/,
+ OMX_TUNNELSETUPTYPE* /*apTunnelSetup*/)
+ {
+ DEBUG_PRINTF(_L8("COmxILStateInvalid::ComponentTunnelRequest"));
+
+ return OMX_ErrorInvalidState;
+
+ }
+
+OMX_ERRORTYPE
+COmxILFsm::COmxILStateInvalid::PopulateBuffer(
+ COmxILFsm& /*aFsm*/,
+ OMX_BUFFERHEADERTYPE** /*appBufferHdr*/,
+ OMX_U32 /*aPortIndex*/,
+ OMX_PTR /*apAppPrivate*/,
+ OMX_U32 /*aSizeBytes*/,
+ OMX_U8* /*apBuffer*/,
+ TBool& /*portPopulationCompleted*/)
+ {
+ DEBUG_PRINTF(_L8("COmxILStateInvalid::PopulateBuffer"));
+
+ return OMX_ErrorInvalidState;
+
+ }
+
+OMX_ERRORTYPE
+COmxILFsm::COmxILStateInvalid::FreeBuffer(COmxILFsm& aFsm,
+ OMX_U32 aPortIndex,
+ OMX_BUFFERHEADERTYPE* apBuffer,
+ TBool& aPortDepopulationCompleted)
+ {
+ DEBUG_PRINTF(_L8("COmxILStateInvalid::FreeBuffer"));
+
+ return COmxILState::FreeBufferV2(
+ aFsm,
+ aPortIndex,
+ apBuffer,
+ aPortDepopulationCompleted);
+
+ }
+
+OMX_ERRORTYPE
+COmxILFsm::COmxILStateInvalid::EmptyThisBuffer(
+ COmxILFsm& /*aFsm*/,
+ OMX_BUFFERHEADERTYPE* /*apBuffer*/)
+ {
+ DEBUG_PRINTF(_L8("COmxILStateInvalid::EmptyThisBuffer"));
+
+ return OMX_ErrorInvalidState;
+
+ }
+
+OMX_ERRORTYPE
+COmxILFsm::COmxILStateInvalid::FillThisBuffer(
+ COmxILFsm& /*aFsm*/,
+ OMX_BUFFERHEADERTYPE* /*apBuffer*/)
+ {
+ DEBUG_PRINTF(_L8("COmxILStateInvalid::FillThisBuffer"));
+
+ return OMX_ErrorInvalidState;
+
+ }
+
+OMX_ERRORTYPE
+COmxILFsm::COmxILStateInvalid::CommandStateSet(
+ COmxILFsm& /*aFsm*/,
+ const TOmxILCommand& /*aCommand*/)
+ {
+ DEBUG_PRINTF(_L8("COmxILStateInvalid::CommandStateSet"));
+ return OMX_ErrorInvalidState;
+ }
+
+OMX_ERRORTYPE
+COmxILFsm::COmxILStateInvalid::CommandFlush(
+ COmxILFsm& /*aFsm*/,
+ const TOmxILCommand& /*aCommand*/)
+ {
+ DEBUG_PRINTF(_L8("COmxILStateInvalid::CommandFlush"));
+ return OMX_ErrorInvalidState;
+ }
+
+OMX_ERRORTYPE
+COmxILFsm::COmxILStateInvalid::CommandPortEnable(
+ COmxILFsm& /*aFsm*/,
+ const TOmxILCommand& /*aCommand*/)
+ {
+ DEBUG_PRINTF(_L8("COmxILStateInvalid::CommandPortEnable"));
+ return OMX_ErrorInvalidState;
+ }
+
+OMX_ERRORTYPE
+COmxILFsm::COmxILStateInvalid::CommandPortDisable(
+ COmxILFsm& /*aFsm*/,
+ const TOmxILCommand& /*aCommand*/)
+ {
+ DEBUG_PRINTF(_L8("COmxILStateInvalid::CommandPortDisable"));
+ return OMX_ErrorInvalidState;
+ }
+
+OMX_ERRORTYPE
+COmxILFsm::COmxILStateInvalid::CommandMarkBuffer(
+ COmxILFsm& /*aFsm*/,
+ const TOmxILCommand& /*aCommand*/)
+ {
+ DEBUG_PRINTF(_L8("COmxILStateInvalid::CommandMarkBuffer"));
+ return OMX_ErrorInvalidState;
+ }
+
+//
+// COmxILStateLoaded
+//
+OMX_STATETYPE
+COmxILFsm::COmxILStateLoaded::GetState() const
+ {
+ DEBUG_PRINTF(_L8("COmxILStateLoaded::GetState"));
+ return OMX_StateLoaded;
+ }
+
+OMX_ERRORTYPE
+COmxILFsm::COmxILStateLoaded::SetParameter(
+ COmxILFsm& aFsm,
+ OMX_INDEXTYPE aParamIndex,
+ const TAny* apComponentParameterStructure)
+ {
+ DEBUG_PRINTF(_L8("COmxILStateLoaded::SetParameter"));
+
+ return COmxILState::SetParameterV2(aFsm,
+ aParamIndex,
+ apComponentParameterStructure);
+
+ }
+
+OMX_ERRORTYPE
+COmxILFsm::COmxILStateLoaded::PopulateBuffer(
+ COmxILFsm& aFsm,
+ OMX_BUFFERHEADERTYPE** appBufferHdr,
+ OMX_U32 aPortIndex,
+ OMX_PTR apAppPrivate,
+ OMX_U32 aSizeBytes,
+ OMX_U8* apBuffer,
+ TBool& portPopulationCompleted)
+ {
+ DEBUG_PRINTF(_L8("COmxILStateLoaded::PopulateBuffer"));
+
+ // At this point, the command requesting the transition from Loaded to Idle
+ // has not been received yet.. (see COmxILStateLoadedToIdle). Therefore,
+ // this can only be successful if the port is disabled
+ return COmxILState::PopulateBuffer(aFsm,
+ appBufferHdr,
+ aPortIndex,
+ apAppPrivate,
+ aSizeBytes,
+ apBuffer,
+ portPopulationCompleted);
+ }
+
+
+OMX_ERRORTYPE
+COmxILFsm::COmxILStateLoaded::FreeBuffer(COmxILFsm& aFsm,
+ OMX_U32 aPortIndex,
+ OMX_BUFFERHEADERTYPE* apBuffer,
+ TBool& aPortDepopulationCompleted)
+ {
+ DEBUG_PRINTF(_L8("COmxILStateLoaded::FreeBuffer"));
+
+ return COmxILState::FreeBuffer(aFsm,
+ aPortIndex,
+ apBuffer,
+ aPortDepopulationCompleted);
+
+ }
+
+OMX_ERRORTYPE
+COmxILFsm::COmxILStateLoaded::EmptyThisBuffer(COmxILFsm& aFsm,
+ OMX_BUFFERHEADERTYPE* apBuffer)
+ {
+ DEBUG_PRINTF(_L8("COmxILStateLoaded::EmptyThisBuffer"));
+
+ return COmxILState::EmptyThisBuffer(aFsm,
+ apBuffer);
+
+ }
+
+OMX_ERRORTYPE
+COmxILFsm::COmxILStateLoaded::FillThisBuffer(COmxILFsm& aFsm,
+ OMX_BUFFERHEADERTYPE* apBuffer)
+ {
+ DEBUG_PRINTF(_L8("COmxILStateLoaded::FillThisBuffer"));
+
+ return COmxILState::FillThisBuffer(aFsm,
+ apBuffer);
+
+ }
+
+OMX_ERRORTYPE
+COmxILFsm::COmxILStateLoaded::ComponentTunnelRequest(
+ COmxILFsm& aFsm,
+ OMX_U32 aPort,
+ OMX_HANDLETYPE aTunneledComp,
+ OMX_U32 aTunneledPort,
+ OMX_TUNNELSETUPTYPE* apTunnelSetup)
+ {
+ DEBUG_PRINTF(_L8("COmxILStateLoaded::ComponentTunnelRequest"));
+
+ return COmxILState::ComponentTunnelRequestV2(aFsm,
+ aPort,
+ aTunneledComp,
+ aTunneledPort,
+ apTunnelSetup);
+
+ }
+
+
+OMX_ERRORTYPE
+COmxILFsm::COmxILStateLoaded::CommandStateSet(
+ COmxILFsm& aFsm,
+ const TOmxILCommand& aCommand)
+ {
+ DEBUG_PRINTF(_L8("COmxILStateLoaded::CommandStateSet"));
+
+ __ASSERT_DEBUG(aCommand.iCommandType == OMX_CommandStateSet,
+ User::Panic(KOmxILFsmPanicCategory, 1));
+
+ // The only two transitions allowed are :
+ // - OMX_StateIdle and
+ // - OMX_StateWaitForResources.
+ COmxILFsm::TStateIndex nextState = COmxILFsm::EStateMax;
+ switch(aCommand.iParam1)
+ {
+ case OMX_StateIdle:
+ {
+ nextState = COmxILFsm::ESubStateLoadedToIdle;
+ }
+ break;
+ case OMX_StateWaitForResources:
+ {
+ nextState = COmxILFsm::EStateWaitForResources;
+ }
+ break;
+ case OMX_StateLoaded:
+ {
+ return OMX_ErrorSameState;
+ }
+ case OMX_StateInvalid:
+ {
+ // Notify the IL client... ignore the ret value..
+ aFsm.iCallbacks.TransitionCompleteNotification(OMX_StateInvalid);
+ // Invalidate component
+ return OMX_ErrorInvalidState;
+ }
+ default:
+ {
+ return OMX_ErrorIncorrectStateTransition;
+ }
+
+ };
+
+ // Initial checks OK. The component is commanded to make a transition to
+ // OMX_StateIdle or OMX_StateWaitForResources.
+ OMX_ERRORTYPE omxRetValue = aFsm.FsmTransition(nextState);
+ if (OMX_ErrorNone != omxRetValue)
+ {
+ return omxRetValue;
+ }
+
+ if (COmxILFsm::ESubStateLoadedToIdle == nextState)
+ {
+ // Lets tell port manager in case there are buffer supplier tunnelled ports
+ TBool componentPopulationCompleted = EFalse;
+ omxRetValue =
+ aFsm.iPortManager.TunnellingBufferAllocation(
+ componentPopulationCompleted);
+ if (OMX_ErrorNone != omxRetValue)
+ {
+ return omxRetValue;
+ }
+
+ if (componentPopulationCompleted)
+ {
+ // Complete here the transition to OMX_StateIdle
+ omxRetValue = aFsm.FsmTransition(COmxILFsm::EStateIdle);
+ if (OMX_ErrorNone == omxRetValue)
+ {
+ // Notify the IL client that port population has completed
+ // sucessfully
+ omxRetValue =
+ aFsm.iCallbacks.TransitionCompleteNotification(
+ OMX_StateIdle);
+ }
+
+ }
+
+ }
+ else
+ {
+ // Notify the IL client that the transition to
+ // OMX_StateWaitForResources has completed sucessfully
+ omxRetValue = aFsm.iCallbacks.TransitionCompleteNotification(
+ OMX_StateWaitForResources);
+
+ }
+
+ return omxRetValue;
+
+ }
+
+OMX_ERRORTYPE
+COmxILFsm::COmxILStateLoaded::CommandPortEnable(
+ COmxILFsm& aFsm,
+ const TOmxILCommand& aCommand)
+ {
+ DEBUG_PRINTF(_L8("COmxILStateLoaded::CommandPortEnable"));
+ __ASSERT_DEBUG(aCommand.iCommandType == OMX_CommandPortEnable,
+ User::Panic(KOmxILFsmPanicCategory, 1));
+
+ TBool indicationIsFinal = ETrue;
+ return aFsm.iPortManager.PortEnableIndication(
+ aCommand.iParam1,
+ indicationIsFinal);
+
+ }
+
+
+//
+// COmxILStateLoadedToIdle
+//
+OMX_ERRORTYPE
+COmxILFsm::COmxILStateLoadedToIdle::PopulateBuffer(
+ COmxILFsm& aFsm,
+ OMX_BUFFERHEADERTYPE** appBufferHdr,
+ OMX_U32 aPortIndex,
+ OMX_PTR apAppPrivate,
+ OMX_U32 aSizeBytes,
+ OMX_U8* apBuffer,
+ TBool& portPopulationCompleted)
+ {
+ DEBUG_PRINTF(_L8("COmxILStateLoadedToIdle::PopulateBuffer"));
+
+ OMX_ERRORTYPE omxError =
+ COmxILState::PopulateBufferV2(aFsm,
+ appBufferHdr,
+ aPortIndex,
+ apAppPrivate,
+ aSizeBytes,
+ apBuffer,
+ portPopulationCompleted);
+
+ if (apBuffer && OMX_ErrorNone == omxError)
+ {
+ DEBUG_PRINTF2(_L8("COmxILStateLoadedToIdle::PopulateBuffer : PORT [%u] : Buffer population occurring in state LoadedToIdle"), aPortIndex);
+ }
+
+ return omxError;
+
+ }
+
+
+OMX_ERRORTYPE
+COmxILFsm::COmxILStateLoadedToIdle::CommandStateSet(
+ COmxILFsm& aFsm,
+ const TOmxILCommand& aCommand)
+ {
+ DEBUG_PRINTF(_L8("COmxILStateLoadedToIdle::CommandStateSet"));
+
+ __ASSERT_DEBUG(aCommand.iCommandType == OMX_CommandStateSet,
+ User::Panic(KOmxILFsmPanicCategory, 1));
+
+ switch(aCommand.iParam1)
+ {
+ case OMX_StateWaitForResources:
+ {
+ // Not implemented for now...
+ return OMX_ErrorNotImplemented;
+ }
+ case OMX_StateLoaded:
+ {
+ // Here, return "same state" as the transition to OMX_StateLoaded has
+ // not completed yet.
+ return OMX_ErrorSameState;
+ }
+ case OMX_StateInvalid:
+ {
+ // Notify the IL client... ignore the ret value...
+ aFsm.iCallbacks.TransitionCompleteNotification(OMX_StateInvalid);
+ // Invalidate component
+ return OMX_ErrorInvalidState;
+ }
+ default:
+ {
+ return OMX_ErrorIncorrectStateTransition;
+ }
+ };
+
+ }
+
+OMX_ERRORTYPE
+COmxILFsm::COmxILStateLoadedToIdle::CommandPortEnable(
+ COmxILFsm& aFsm,
+ const TOmxILCommand& aCommand)
+ {
+ DEBUG_PRINTF(_L8("COmxILStateLoadedToIdle::CommandPortEnable"));
+ __ASSERT_DEBUG(aCommand.iCommandType == OMX_CommandPortEnable,
+ User::Panic(KOmxILFsmPanicCategory, 1));
+
+ TBool indicationIsFinal = EFalse;
+ OMX_ERRORTYPE omxRetValue =
+ aFsm.iPortManager.PortEnableIndication(
+ aCommand.iParam1,
+ indicationIsFinal);
+ if (OMX_ErrorNone != omxRetValue)
+ {
+ return omxRetValue;
+ }
+
+ // Lets tell port manager in case the port being enabled is a tunnel
+ // supplier...
+ TBool componentPopulationCompleted = EFalse;
+ omxRetValue =
+ aFsm.iPortManager.TunnellingBufferAllocation(
+ componentPopulationCompleted, aCommand.iParam1);
+ if (OMX_ErrorNone != omxRetValue)
+ {
+ return omxRetValue;
+ }
+
+ // Let's do this check here although this situation is going to be very
+ // unlikely...
+ if (componentPopulationCompleted)
+ {
+ // Complete here the transition to OMX_StateIdle
+ omxRetValue = aFsm.FsmTransition(COmxILFsm::EStateIdle);
+ if (OMX_ErrorNone == omxRetValue)
+ {
+ // Notify the IL client that port population has completed sucessfully
+ aFsm.iCallbacks.TransitionCompleteNotification(
+ OMX_StateIdle);
+ }
+
+ }
+
+ return omxRetValue;
+
+ }
+
+
+//
+// COmxILStateWaitForResources
+//
+OMX_STATETYPE
+COmxILFsm::COmxILStateWaitForResources::GetState() const
+ {
+ DEBUG_PRINTF(_L8("COmxILStateWaitForResources::GetState"));
+ return OMX_StateWaitForResources;
+ }
+
+
+OMX_ERRORTYPE
+COmxILFsm::COmxILStateWaitForResources::SetParameter(
+ COmxILFsm& aFsm,
+ OMX_INDEXTYPE aParamIndex,
+ const TAny* apComponentParameterStructure)
+ {
+ DEBUG_PRINTF(_L8("COmxILStateWaitForResources::SetParameter"));
+
+ return COmxILState::SetParameterV2(aFsm,
+ aParamIndex,
+ apComponentParameterStructure);
+
+ }
+
+
+OMX_ERRORTYPE
+COmxILFsm::COmxILStateWaitForResources::PopulateBuffer(
+ COmxILFsm& aFsm,
+ OMX_BUFFERHEADERTYPE** appBufferHdr,
+ OMX_U32 aPortIndex,
+ OMX_PTR apAppPrivate,
+ OMX_U32 aSizeBytes,
+ OMX_U8* apBuffer,
+ TBool& portPopulationCompleted)
+ {
+ DEBUG_PRINTF(_L8("COmxILStateWaitForResources::PopulateBuffer"));
+
+ // NOTE that according to the spec, PopulateBuffer could be used here even
+ // if the port is enabled. However, for now the transition from
+ // OMX_StateWaitForResouces -> OMX_StateIdle is not supported, therefore
+ // buffer population is only allowed for disabled ports. This should be
+ // changed once Resource Management functionality is available and this
+ // state is revisited.
+ return COmxILState::PopulateBuffer(aFsm,
+ appBufferHdr,
+ aPortIndex,
+ apAppPrivate,
+ aSizeBytes,
+ apBuffer,
+ portPopulationCompleted);
+
+ }
+
+
+OMX_ERRORTYPE
+COmxILFsm::COmxILStateWaitForResources::FreeBuffer(
+ COmxILFsm& aFsm,
+ OMX_U32 aPortIndex,
+ OMX_BUFFERHEADERTYPE* apBuffer,
+ TBool& aPortDepopulationCompleted)
+ {
+ DEBUG_PRINTF(_L8("COmxILStateWaitForResources::FreeBuffer"));
+
+ return COmxILState::FreeBuffer(aFsm,
+ aPortIndex,
+ apBuffer,
+ aPortDepopulationCompleted);
+
+ }
+
+OMX_ERRORTYPE
+COmxILFsm::COmxILStateWaitForResources::EmptyThisBuffer(
+ COmxILFsm& aFsm,
+ OMX_BUFFERHEADERTYPE* apBuffer)
+ {
+ DEBUG_PRINTF(_L8("COmxILStateWaitForResources::EmptyThisBuffer"));
+
+ return COmxILState::EmptyThisBuffer(aFsm,
+ apBuffer);
+
+
+ }
+
+OMX_ERRORTYPE
+COmxILFsm::COmxILStateWaitForResources::FillThisBuffer(
+ COmxILFsm& aFsm,
+ OMX_BUFFERHEADERTYPE* apBuffer)
+ {
+ DEBUG_PRINTF(_L8("COmxILStateWaitForResources::FillThisBuffer"));
+
+ return COmxILState::FillThisBuffer(aFsm,
+ apBuffer);
+
+ }
+
+
+OMX_ERRORTYPE
+COmxILFsm::COmxILStateWaitForResources::ComponentTunnelRequest(
+ COmxILFsm& aFsm,
+ OMX_U32 aPort,
+ OMX_HANDLETYPE aTunneledComp,
+ OMX_U32 aTunneledPort,
+ OMX_TUNNELSETUPTYPE* apTunnelSetup)
+ {
+ DEBUG_PRINTF(_L8("COmxILStateWaitForResources::ComponentTunnelRequest"));
+
+ return COmxILState::ComponentTunnelRequest(aFsm,
+ aPort,
+ aTunneledComp,
+ aTunneledPort,
+ apTunnelSetup);
+
+ }
+
+
+OMX_ERRORTYPE
+COmxILFsm::COmxILStateWaitForResources::CommandStateSet(
+ COmxILFsm& aFsm,
+ const TOmxILCommand& aCommand)
+ {
+ DEBUG_PRINTF(_L8("COmxILStateWaitForResources::CommandStateSet"));
+
+ __ASSERT_DEBUG(aCommand.iCommandType == OMX_CommandStateSet,
+ User::Panic(KOmxILFsmPanicCategory, 1));
+
+ // Transition to OMX_StateIdle not implemented for now...
+ COmxILFsm::TStateIndex nextState = COmxILFsm::EStateMax;
+ switch(aCommand.iParam1)
+ {
+ case OMX_StateLoaded:
+ {
+ nextState = COmxILFsm::EStateLoaded;
+ }
+ break;
+ case OMX_StateWaitForResources:
+ {
+ return OMX_ErrorSameState;
+ }
+ case OMX_StateInvalid:
+ {
+ // Notify the IL client... ignore the ret value...
+ aFsm.iCallbacks.TransitionCompleteNotification(OMX_StateInvalid);
+ // Invalidate component
+ return OMX_ErrorInvalidState;
+ }
+ default:
+ {
+ return OMX_ErrorIncorrectStateTransition;
+ }
+ };
+
+ // Initial checks OK. The component is commanded to make a transition to
+ // OMX_StateLoaded
+ OMX_ERRORTYPE omxRetValue = aFsm.FsmTransition(nextState);
+ if (OMX_ErrorNone == omxRetValue)
+ {
+ // Notify the IL client that the transition to
+ // OMX_StateLoaded has completed sucessfully
+ omxRetValue =
+ aFsm.iCallbacks.TransitionCompleteNotification(OMX_StateLoaded);
+ }
+
+ return omxRetValue;
+
+ }
+
+OMX_ERRORTYPE
+COmxILFsm::COmxILStateWaitForResources::CommandPortEnable(
+ COmxILFsm& aFsm,
+ const TOmxILCommand& aCommand)
+ {
+ DEBUG_PRINTF(_L8("COmxILStateWaitForResources::CommandPortEnable"));
+ __ASSERT_DEBUG(aCommand.iCommandType == OMX_CommandPortEnable,
+ User::Panic(KOmxILFsmPanicCategory, 1));
+
+ // NOTE: Here, we only care about the port enabled flag. Transition from
+ // OMX_StateWaitForResources to OMX_StateIdle is not implemented at this
+ // stage until a Resource Manager is available. Whenever a Resource Manager
+ // becomes available, a COmxILStateWaitForResourcesToIdle substate should
+ // be implemented to handle the allocation of buffers mandated by the
+ // standard when a port is enabled in this transition.
+ TBool indicationIsFinal = ETrue;
+ return aFsm.iPortManager.PortEnableIndication(
+ aCommand.iParam1,
+ indicationIsFinal);
+
+ }
+
+
+//
+// COmxILStateIdle
+//
+OMX_STATETYPE
+COmxILFsm::COmxILStateIdle::GetState() const
+ {
+ DEBUG_PRINTF(_L8("COmxILStateIdle::GetState"));
+ return OMX_StateIdle;
+ }
+
+
+OMX_ERRORTYPE
+COmxILFsm::COmxILStateIdle::SetParameter(
+ COmxILFsm& aFsm,
+ OMX_INDEXTYPE aParamIndex,
+ const TAny* apComponentParameterStructure)
+ {
+ DEBUG_PRINTF(_L8("COmxILStateIdle::SetParameter"));
+
+ return COmxILState::SetParameter(aFsm,
+ aParamIndex,
+ apComponentParameterStructure);
+
+ }
+
+OMX_ERRORTYPE
+COmxILFsm::COmxILStateIdle::PopulateBuffer(COmxILFsm& aFsm,
+ OMX_BUFFERHEADERTYPE** appBufferHdr,
+ OMX_U32 aPortIndex,
+ OMX_PTR apAppPrivate,
+ OMX_U32 aSizeBytes,
+ OMX_U8* apBuffer,
+ TBool& portPopulationCompleted)
+ {
+ DEBUG_PRINTF(_L8("COmxILStateIdle::PopulateBuffer"));
+
+ // At this point, no buffer population can take place unless the port is disabled
+ return COmxILState::PopulateBuffer(aFsm,
+ appBufferHdr,
+ aPortIndex,
+ apAppPrivate,
+ aSizeBytes,
+ apBuffer,
+ portPopulationCompleted);
+
+ }
+
+
+OMX_ERRORTYPE
+COmxILFsm::COmxILStateIdle::FreeBuffer(COmxILFsm& aFsm,
+ OMX_U32 aPortIndex,
+ OMX_BUFFERHEADERTYPE* apBuffer,
+ TBool& aPortDepopulationCompleted)
+ {
+ DEBUG_PRINTF(_L8("COmxILStateIdle::FreeBuffer"));
+
+ // At this point, the command requesting the transition from Idle to Loaded
+ // has not been received yet.. (see COmxILStateIdleToLoaded). Therefore,
+ // this can only be successful if the port is disabled
+ return COmxILState::FreeBuffer(aFsm,
+ aPortIndex,
+ apBuffer,
+ aPortDepopulationCompleted);
+
+ }
+
+OMX_ERRORTYPE
+COmxILFsm::COmxILStateIdle::EmptyThisBuffer(
+ COmxILFsm& aFsm,
+ OMX_BUFFERHEADERTYPE* apBuffer)
+ {
+ DEBUG_PRINTF(_L8("COmxILStateIdle::EmptyThisBuffer"));
+
+ return COmxILState::EmptyThisBufferV2(aFsm,
+ apBuffer);
+
+ }
+
+OMX_ERRORTYPE
+COmxILFsm::COmxILStateIdle::FillThisBuffer(COmxILFsm& aFsm,
+ OMX_BUFFERHEADERTYPE* apBuffer)
+ {
+ DEBUG_PRINTF(_L8("COmxILStateIdle::FillThisBuffer"));
+
+ return COmxILState::FillThisBufferV2(aFsm,
+ apBuffer);
+
+ }
+
+OMX_ERRORTYPE
+COmxILFsm::COmxILStateIdle::ComponentTunnelRequest(
+ COmxILFsm& aFsm,
+ OMX_U32 aPort,
+ OMX_HANDLETYPE aTunneledComp,
+ OMX_U32 aTunneledPort,
+ OMX_TUNNELSETUPTYPE* apTunnelSetup)
+ {
+ DEBUG_PRINTF(_L8("COmxILStateIdle::ComponentTunnelRequest"));
+
+ return COmxILState::ComponentTunnelRequest(aFsm,
+ aPort,
+ aTunneledComp,
+ aTunneledPort,
+ apTunnelSetup);
+
+ }
+
+OMX_ERRORTYPE
+COmxILFsm::COmxILStateIdle::CommandStateSet(
+ COmxILFsm& aFsm,
+ const TOmxILCommand& aCommand)
+ {
+ DEBUG_PRINTF(_L8("COmxILStateIdle::CommandStateSet"));
+
+ __ASSERT_DEBUG(aCommand.iCommandType == OMX_CommandStateSet,
+ User::Panic(KOmxILFsmPanicCategory, 1));
+
+ COmxILFsm::TStateIndex nextState = COmxILFsm::EStateInvalid;
+ switch(aCommand.iParam1)
+ {
+ case OMX_StateLoaded:
+ {
+ nextState = COmxILFsm::ESubStateIdleToLoaded;
+ }
+ break;
+ case OMX_StateExecuting:
+ {
+ nextState = COmxILFsm::EStateExecuting;
+ }
+ break;
+ case OMX_StatePause:
+ {
+ nextState = COmxILFsm::EStatePause;
+ }
+ break;
+ case OMX_StateIdle:
+ {
+ return OMX_ErrorSameState;
+ }
+ case OMX_StateInvalid:
+ {
+ // Notify the IL client... ignore the ret value...
+ aFsm.iCallbacks.TransitionCompleteNotification(OMX_StateInvalid);
+ // Invalidate component
+ return OMX_ErrorInvalidState;
+ }
+ default:
+ {
+ return OMX_ErrorIncorrectStateTransition;
+ }
+ };
+
+ // Initial command checks OK
+
+ // Commit transition to the valid state
+ OMX_ERRORTYPE omxRetValue = aFsm.FsmTransition(nextState);
+ if (OMX_ErrorNone != omxRetValue)
+ {
+ return omxRetValue;
+ }
+
+ if (COmxILFsm::ESubStateIdleToLoaded == nextState)
+ {
+ // Lets tell port manager in case there are tunnelled ports...
+ TBool componentDepopulationCompleted = EFalse;
+ omxRetValue =
+ aFsm.iPortManager.TunnellingBufferDeallocation(
+ componentDepopulationCompleted);
+ if (OMX_ErrorNone != omxRetValue)
+ {
+ return omxRetValue;
+ }
+
+ if (componentDepopulationCompleted)
+ {
+ // Complete here the transition to OMX_StateLoaded
+ omxRetValue = aFsm.FsmTransition(COmxILFsm::EStateLoaded);
+ if (OMX_ErrorNone == omxRetValue)
+ {
+ // Notify the IL client that port population has completed sucessfully
+ omxRetValue = aFsm.iCallbacks.TransitionCompleteNotification(
+ OMX_StateLoaded);
+ }
+ }
+
+ }
+ else
+ {
+ // Notify the IL client that the transition to the valid state
+ // OMX_StatePause or OMX_StateExecuting has completed sucessfully
+ omxRetValue = aFsm.iCallbacks.TransitionCompleteNotification(
+ static_cast<OMX_STATETYPE>(aCommand.iParam1));
+
+ if (OMX_ErrorNone == omxRetValue)
+ {
+ // Fire up the tunnelled buffer exchange, if any tunnelled ports are
+ // found in the component...
+ omxRetValue = aFsm.iPortManager.InitiateTunnellingDataFlow();
+ }
+
+ }
+
+ return omxRetValue;
+
+ }
+
+OMX_ERRORTYPE
+COmxILFsm::COmxILStateIdle::CommandFlush(COmxILFsm& aFsm,
+ const TOmxILCommand& aCommand)
+ {
+ DEBUG_PRINTF(_L8("COmxILStateIdle::CommandFlush"));
+
+ __ASSERT_DEBUG(aCommand.iCommandType == OMX_CommandFlush,
+ User::Panic(KOmxILFsmPanicCategory, 1));
+
+ return aFsm.iPortManager.BufferFlushIndicationFlushCommand(
+ aCommand.iParam1, OMX_FALSE); // Do not eject buffers
+
+ }
+
+
+OMX_ERRORTYPE
+COmxILFsm::COmxILStateIdle::CommandPortEnable(
+ COmxILFsm& aFsm,
+ const TOmxILCommand& aCommand)
+ {
+ DEBUG_PRINTF(_L8("COmxILStateIdle::CommandPortEnable"));
+ __ASSERT_DEBUG(aCommand.iCommandType == OMX_CommandPortEnable,
+ User::Panic(KOmxILFsmPanicCategory, 1));
+
+ // In this state, the port allocation has finished for enabled
+ // ports. However, a port is being enabled here. The port being enabled
+ // must populate (if tunnel supplier) or be populated (if non-tunnel
+ // supplier or IL Client communication)
+ TBool indicationIsFinal = EFalse;
+ OMX_ERRORTYPE omxRetValue =
+ aFsm.iPortManager.PortEnableIndication(
+ aCommand.iParam1,
+ indicationIsFinal);
+
+ if (OMX_ErrorNone == omxRetValue)
+ {
+ // From section 3.2.2.6, "If the IL client enables a port while the
+ // component is in any state other than OMX_StateLoaded or
+ // OMX_WaitForResources, then that port shall allocate its buffers via
+ // the same call sequence used on a transition from OMX_StateLoaded to
+ // OMX_StateIdle."
+
+ // Lets tell port manager in case the port being enabled is a tunnel
+ // supplier...
+ TBool componentPopulationCompleted = EFalse;
+ omxRetValue =
+ aFsm.iPortManager.TunnellingBufferAllocation(
+ componentPopulationCompleted, aCommand.iParam1);
+ }
+
+ return omxRetValue;
+
+ }
+
+
+//
+// COmxILStateIdleToLoaded
+//
+OMX_ERRORTYPE
+COmxILFsm::COmxILStateIdleToLoaded::FreeBuffer(COmxILFsm& aFsm,
+ OMX_U32 aPortIndex,
+ OMX_BUFFERHEADERTYPE* apBuffer,
+ TBool& aPortDepopulationCompleted)
+ {
+ DEBUG_PRINTF(_L8("COmxILStateIdleToLoaded::FreeBuffer"));
+
+ return COmxILState::FreeBufferV2(aFsm,
+ aPortIndex,
+ apBuffer,
+ aPortDepopulationCompleted);
+
+ }
+
+
+OMX_ERRORTYPE
+COmxILFsm::COmxILStateIdleToLoaded::CommandStateSet(
+ COmxILFsm& aFsm,
+ const TOmxILCommand& aCommand)
+ {
+ DEBUG_PRINTF(_L8("COmxILStateIdleToLoaded::CommandStateSet"));
+
+ __ASSERT_DEBUG(aCommand.iCommandType == OMX_CommandStateSet,
+ User::Panic(KOmxILFsmPanicCategory, 1));
+
+ switch (aCommand.iParam1)
+ {
+ case OMX_StateIdle:
+ {
+ // Here, return "same state" as the transition to OMX_StateLoaded has
+ // not completed yet.
+ return OMX_ErrorSameState;
+ }
+ case OMX_StateInvalid:
+ {
+ // Notify the IL client... ignore the ret value...
+ aFsm.iCallbacks.TransitionCompleteNotification(OMX_StateInvalid);
+ // Invalidate component
+ return OMX_ErrorInvalidState;
+ }
+ default:
+ {
+ __ASSERT_ALWAYS(0, User::Panic(KOmxILFsmPanicCategory, 1));
+ }
+ };
+
+ return OMX_ErrorNone;
+
+ }
+
+
+//
+// COmxILStateExecuting
+//
+OMX_STATETYPE
+COmxILFsm::COmxILStateExecuting::GetState() const
+ {
+ DEBUG_PRINTF(_L8("COmxILStateExecuting::GetState"));
+ return OMX_StateExecuting;
+ }
+
+
+OMX_ERRORTYPE
+COmxILFsm::COmxILStateExecuting::SetParameter(COmxILFsm& aFsm,
+ OMX_INDEXTYPE aParamIndex,
+ const TAny* apComponentParameterStructure)
+ {
+ DEBUG_PRINTF(_L8("COmxILStateExecuting::SetParameter"));
+
+ return COmxILState::SetParameter(aFsm,
+ aParamIndex,
+ apComponentParameterStructure);
+
+ }
+
+
+OMX_ERRORTYPE
+COmxILFsm::COmxILStateExecuting::PopulateBuffer(COmxILFsm& aFsm,
+ OMX_BUFFERHEADERTYPE** appBufferHdr,
+ OMX_U32 aPortIndex,
+ OMX_PTR apAppPrivate,
+ OMX_U32 aSizeBytes,
+ OMX_U8* apBuffer,
+ TBool& portPopulationCompleted)
+ {
+ DEBUG_PRINTF(_L8("COmxILStateExecuting::PopulateBuffer"));
+
+ return COmxILState::PopulateBuffer(aFsm,
+ appBufferHdr,
+ aPortIndex,
+ apAppPrivate,
+ aSizeBytes,
+ apBuffer,
+ portPopulationCompleted);
+
+ }
+
+
+OMX_ERRORTYPE
+COmxILFsm::COmxILStateExecuting::FreeBuffer(COmxILFsm& aFsm,
+ OMX_U32 aPortIndex,
+ OMX_BUFFERHEADERTYPE* apBuffer,
+ TBool& aPortDepopulationCompleted)
+ {
+ DEBUG_PRINTF(_L8("COmxILStateExecuting::FreeBuffer"));
+
+ return COmxILState::FreeBuffer(aFsm,
+ aPortIndex,
+ apBuffer,
+ aPortDepopulationCompleted);
+
+ }
+
+
+OMX_ERRORTYPE
+COmxILFsm::COmxILStateExecuting::EmptyThisBuffer(
+ COmxILFsm& aFsm,
+ OMX_BUFFERHEADERTYPE* apBuffer)
+ {
+ DEBUG_PRINTF(_L8("COmxILStateExecuting::EmptyThisBuffer"));
+
+ return COmxILState::EmptyThisBufferV2(aFsm,
+ apBuffer);
+
+ }
+
+
+OMX_ERRORTYPE
+COmxILFsm::COmxILStateExecuting::FillThisBuffer(COmxILFsm& aFsm,
+ OMX_BUFFERHEADERTYPE* apBuffer)
+ {
+ DEBUG_PRINTF(_L8("COmxILStateExecuting::FillThisBuffer"));
+
+ return COmxILState::FillThisBufferV2(aFsm,
+ apBuffer);
+
+ }
+
+
+OMX_ERRORTYPE
+COmxILFsm::COmxILStateExecuting::ComponentTunnelRequest(
+ COmxILFsm& aFsm,
+ OMX_U32 aPort,
+ OMX_HANDLETYPE aTunneledComp,
+ OMX_U32 aTunneledPort,
+ OMX_TUNNELSETUPTYPE* apTunnelSetup)
+ {
+ DEBUG_PRINTF(_L8("COmxILStateExecuting::ComponentTunnelRequest"));
+
+ return COmxILState::ComponentTunnelRequest(aFsm,
+ aPort,
+ aTunneledComp,
+ aTunneledPort,
+ apTunnelSetup);
+
+ }
+
+
+OMX_ERRORTYPE
+COmxILFsm::COmxILStateExecuting::CommandStateSet(
+ COmxILFsm& aFsm,
+ const TOmxILCommand& aCommand)
+ {
+ DEBUG_PRINTF(_L8("COmxILStateExecuting::CommandStateSet"));
+
+ __ASSERT_DEBUG(aCommand.iCommandType == OMX_CommandStateSet,
+ User::Panic(KOmxILFsmPanicCategory, 1));
+
+ COmxILFsm::TStateIndex nextState = COmxILFsm::EStateMax;
+ switch(aCommand.iParam1)
+ {
+ case OMX_StateIdle:
+ {
+ nextState = COmxILFsm::ESubStateExecutingToIdle;
+ }
+ break;
+ case OMX_StatePause:
+ {
+ nextState = COmxILFsm::EStatePause;
+ }
+ break;
+ case OMX_StateExecuting:
+ {
+ return OMX_ErrorSameState;
+ }
+ case OMX_StateInvalid:
+ {
+ // Notify the IL client... ignore the ret value...
+ aFsm.iCallbacks.TransitionCompleteNotification(OMX_StateInvalid);
+ // Invalidate component
+ return OMX_ErrorInvalidState;
+ }
+ default:
+ {
+ return OMX_ErrorIncorrectStateTransition;
+ }
+ };
+
+
+ // Initial checks OK. The component is commanded to make a transition to
+ // ESubStateExecutingToIdle substate or OMX_StatePause.
+ OMX_ERRORTYPE omxRetValue = aFsm.FsmTransition(nextState);
+ if (OMX_ErrorNone != omxRetValue)
+ {
+ return omxRetValue;
+ }
+
+ if (COmxILFsm::ESubStateExecutingToIdle == nextState)
+ {
+ // Lets tell port manager since at this point it is mandated that all
+ // buffers must be returned to their suppliers (IL Client and/or
+ // tunnelled components).
+ TBool allBuffersReturnedToSuppliers = EFalse;
+ omxRetValue =
+ aFsm.iPortManager.BufferFlushIndicationPauseOrExeToIdleCommand(
+ allBuffersReturnedToSuppliers);
+ if (OMX_ErrorNone != omxRetValue)
+ {
+ return omxRetValue;
+ }
+
+ if (allBuffersReturnedToSuppliers)
+ {
+ // Complete here the transition to OMX_StateIdle
+ omxRetValue = aFsm.FsmTransition(COmxILFsm::EStateIdle);
+ if (OMX_ErrorNone == omxRetValue)
+ {
+ // Notify the IL client that port population has completed sucessfully
+ omxRetValue = aFsm.iCallbacks.TransitionCompleteNotification(
+ OMX_StateIdle);
+ }
+ }
+
+ }
+ else
+ {
+ // Notify the IL client that the transition to OMX_StatePause has
+ // completed sucessfully
+ omxRetValue = aFsm.iCallbacks.TransitionCompleteNotification(
+ OMX_StatePause);
+
+ }
+
+ return omxRetValue;
+
+ }
+
+
+OMX_ERRORTYPE
+COmxILFsm::COmxILStateExecuting::CommandPortEnable(
+ COmxILFsm& aFsm,
+ const TOmxILCommand& aCommand)
+ {
+ DEBUG_PRINTF(_L8("COmxILStateExecuting::CommandPortEnable"));
+ __ASSERT_DEBUG(aCommand.iCommandType == OMX_CommandPortEnable,
+ User::Panic(KOmxILFsmPanicCategory, 1));
+
+ // In this state, the port allocation has finished for enabled
+ // ports. However, a port is being enabled here. The port being enabled
+ // must populate (if tunnel supplier) or be populated (if non-tunnel
+ // supplier or IL Client communication)
+ TBool indicationIsFinal = EFalse;
+ OMX_ERRORTYPE omxRetValue =
+ aFsm.iPortManager.PortEnableIndication(
+ aCommand.iParam1,
+ indicationIsFinal);
+
+ if (OMX_ErrorNone == omxRetValue)
+ {
+ // From section 3.2.2.6, "If the IL client enables a port while the
+ // component is in any state other than OMX_StateLoaded or
+ // OMX_WaitForResources, then that port shall allocate its buffers via
+ // the same call sequence used on a transition from OMX_StateLoaded to
+ // OMX_StateIdle. If the IL client enables while the component is in
+ // the OMX_Executing state, then that port shall begin transferring
+ // buffers"
+
+ // Lets tell port manager in case the port being enabled is a tunnel
+ // supplier...
+ TBool componentPopulationCompleted = EFalse;
+ omxRetValue =
+ aFsm.iPortManager.TunnellingBufferAllocation(
+ componentPopulationCompleted, aCommand.iParam1);
+
+ // No need to use here componentPopulationCompleted. A port is being
+ // enabled in OMX_StateExecuting. If the port is a supplier, after
+ // being re-enabled it should start the buffer allocation phase,
+ // regardless of the population state of other ports in the component.
+ if (OMX_ErrorNone == omxRetValue)
+ {
+ // Fire up the tunnelled buffer exchange in the enabled port...
+ omxRetValue = aFsm.iPortManager.InitiateTunnellingDataFlow(
+ aCommand.iParam1);
+ }
+ }
+
+ return omxRetValue;
+
+ }
+
+
+//
+// MOmxILPauseOrExecutingToIdle
+//
+OMX_ERRORTYPE
+COmxILFsm::MOmxILPauseOrExecutingToIdle::ReturnThisBuffer(
+ COmxILFsm& aFsm,
+ OMX_BUFFERHEADERTYPE* apBuffer,
+ OMX_DIRTYPE aDirection)
+ {
+ DEBUG_PRINTF(_L8("MOmxILPauseOrExecutingToIdle::ReturnThisBuffer"));
+
+ TBool allBuffersReturned = EFalse;
+ OMX_ERRORTYPE omxRetValue =
+ aFsm.iPortManager.BufferReturnIndication(
+ apBuffer,
+ aDirection,
+ allBuffersReturned
+ );
+
+ if (OMX_ErrorNone != omxRetValue)
+ {
+ return omxRetValue;
+ }
+
+ if (allBuffersReturned &&
+ aFsm.iPortManager.AllBuffersAtHome())
+ {
+ // Complete here the transition to OMX_StateIdle
+ omxRetValue = aFsm.FsmTransition(COmxILFsm::EStateIdle);
+ if (OMX_ErrorNone == omxRetValue)
+ {
+ // Notify the IL client that transition to Idle has completed
+ // sucessfully
+ omxRetValue = aFsm.iCallbacks.TransitionCompleteNotification(
+ OMX_StateIdle);
+ }
+ }
+
+ return omxRetValue;
+
+ }
+
+
+
+//
+// COmxILStateExecutingToIdle
+//
+OMX_ERRORTYPE
+COmxILFsm::COmxILStateExecutingToIdle::EmptyThisBuffer(
+ COmxILFsm& aFsm,
+ OMX_BUFFERHEADERTYPE* apBuffer)
+ {
+ DEBUG_PRINTF(_L8("COmxILStateExecutingToIdle::EmptyThisBuffer"));
+
+ return ReturnThisBuffer(aFsm,
+ apBuffer,
+ OMX_DirInput);
+
+ }
+
+
+OMX_ERRORTYPE
+COmxILFsm::COmxILStateExecutingToIdle::FillThisBuffer(
+ COmxILFsm& aFsm,
+ OMX_BUFFERHEADERTYPE* apBuffer)
+ {
+ DEBUG_PRINTF(_L8("COmxILStateExecutingToIdle::FillThisBuffer"));
+
+ return ReturnThisBuffer(aFsm,
+ apBuffer,
+ OMX_DirOutput);
+
+ }
+
+
+OMX_ERRORTYPE
+COmxILFsm::COmxILStateExecutingToIdle::CommandStateSet(
+ COmxILFsm& aFsm,
+ const TOmxILCommand& aCommand)
+ {
+ DEBUG_PRINTF(_L8("COmxILStateExecutingToIdle::CommandStateSet"));
+
+ __ASSERT_DEBUG(aCommand.iCommandType == OMX_CommandStateSet,
+ User::Panic(KOmxILFsmPanicCategory, 1));
+
+ switch(aCommand.iParam1)
+ {
+ case OMX_StateExecuting:
+ {
+ // Here, return "same state" as the transition to OMX_StateIdle has
+ // not completed yet.
+ return OMX_ErrorSameState;
+ }
+ case OMX_StateInvalid:
+ {
+ // Notify the IL client... ignore the ret value...
+ aFsm.iCallbacks.TransitionCompleteNotification(OMX_StateInvalid);
+ // Invalidate component
+ return OMX_ErrorInvalidState;
+ }
+ default:
+ {
+ return OMX_ErrorIncorrectStateTransition;
+ }
+ };
+
+ }
+
+
+//
+// COmxILStatePause
+//
+OMX_STATETYPE
+COmxILFsm::COmxILStatePause::GetState() const
+ {
+ DEBUG_PRINTF(_L8("COmxILStatePause::GetState"));
+ return OMX_StatePause;
+ }
+
+
+OMX_ERRORTYPE
+COmxILFsm::COmxILStatePause::SetParameter(
+ COmxILFsm& aFsm,
+ OMX_INDEXTYPE aParamIndex,
+ const TAny* apComponentParameterStructure)
+ {
+ DEBUG_PRINTF(_L8("COmxILStatePause::SetParameter"));
+
+ return COmxILState::SetParameter(aFsm,
+ aParamIndex,
+ apComponentParameterStructure);
+
+ }
+
+
+OMX_ERRORTYPE
+COmxILFsm::COmxILStatePause::PopulateBuffer(
+ COmxILFsm& aFsm,
+ OMX_BUFFERHEADERTYPE** appBufferHdr,
+ OMX_U32 aPortIndex,
+ OMX_PTR apAppPrivate,
+ OMX_U32 aSizeBytes,
+ OMX_U8* apBuffer,
+ TBool& portPopulationCompleted)
+ {
+ DEBUG_PRINTF(_L8("COmxILStatePause::PopulateBuffer"));
+
+ return COmxILState::PopulateBuffer(aFsm,
+ appBufferHdr,
+ aPortIndex,
+ apAppPrivate,
+ aSizeBytes,
+ apBuffer,
+ portPopulationCompleted);
+
+ }
+
+
+OMX_ERRORTYPE
+COmxILFsm::COmxILStatePause::FreeBuffer(COmxILFsm& aFsm,
+ OMX_U32 aPortIndex,
+ OMX_BUFFERHEADERTYPE* apBuffer,
+ TBool& aPortDepopulationCompleted)
+ {
+ DEBUG_PRINTF(_L8("COmxILStatePause::FreeBuffer"));
+
+ return COmxILState::FreeBuffer(aFsm,
+ aPortIndex,
+ apBuffer,
+ aPortDepopulationCompleted);
+
+ }
+
+
+OMX_ERRORTYPE
+COmxILFsm::COmxILStatePause::EmptyThisBuffer(
+ COmxILFsm& aFsm,
+ OMX_BUFFERHEADERTYPE* apBuffer)
+ {
+ DEBUG_PRINTF(_L8("COmxILStatePause::EmptyThisBuffer"));
+
+ return COmxILState::EmptyThisBufferV2(aFsm,
+ apBuffer);
+
+ }
+
+OMX_ERRORTYPE
+COmxILFsm::COmxILStatePause::FillThisBuffer(COmxILFsm& aFsm,
+ OMX_BUFFERHEADERTYPE* apBuffer)
+ {
+ DEBUG_PRINTF(_L8("COmxILStatePause::FillThisBuffer"));
+
+ return COmxILState::FillThisBufferV2(aFsm,
+ apBuffer);
+
+ }
+
+OMX_ERRORTYPE
+COmxILFsm::COmxILStatePause::ComponentTunnelRequest(
+ COmxILFsm& aFsm,
+ OMX_U32 aPort,
+ OMX_HANDLETYPE aTunneledComp,
+ OMX_U32 aTunneledPort,
+ OMX_TUNNELSETUPTYPE* apTunnelSetup)
+ {
+ DEBUG_PRINTF(_L8("COmxILStatePause::ComponentTunnelRequest"));
+
+ return COmxILState::ComponentTunnelRequest(aFsm,
+ aPort,
+ aTunneledComp,
+ aTunneledPort,
+ apTunnelSetup);
+
+ }
+
+
+OMX_ERRORTYPE
+COmxILFsm::COmxILStatePause::CommandStateSet(
+ COmxILFsm& aFsm,
+ const TOmxILCommand& aCommand)
+ {
+ DEBUG_PRINTF(_L8("COmxILStatePause::CommandStateSet"));
+
+ __ASSERT_DEBUG(aCommand.iCommandType == OMX_CommandStateSet,
+ User::Panic(KOmxILFsmPanicCategory, 1));
+
+ COmxILFsm::TStateIndex nextState = COmxILFsm::EStateInvalid;
+ switch(aCommand.iParam1)
+ {
+ case OMX_StateIdle:
+ {
+ nextState = COmxILFsm::ESubStatePauseToIdle;
+ }
+ break;
+ case OMX_StateExecuting:
+ {
+ nextState = COmxILFsm::EStateExecuting;
+ }
+ break;
+ case OMX_StatePause:
+ {
+ return OMX_ErrorSameState;
+ }
+ case OMX_StateInvalid:
+ {
+ // Notify the IL client... ignore the ret value...
+ aFsm.iCallbacks.TransitionCompleteNotification(OMX_StateInvalid);
+ // Invalidate component
+ return OMX_ErrorInvalidState;
+ }
+ default:
+ {
+ return OMX_ErrorIncorrectStateTransition;
+ }
+ };
+
+ // Initial command checks OK. The component is commanded to make a
+ // transition to ESubStatePauseToIdle substate or OMX_StateExecuting.
+ // Commit transition to the valid state
+ OMX_ERRORTYPE omxRetValue = aFsm.FsmTransition(nextState);
+ if (OMX_ErrorNone != omxRetValue)
+ {
+ return omxRetValue;
+ }
+
+ if (COmxILFsm::ESubStatePauseToIdle == nextState)
+ {
+ // Lets tell port manager since at this point it is mandated that all
+ // buffers must be returned to their suppliers (IL Client and/or
+ // tunnelled components).
+ TBool allBuffersReturnedToSuppliers = EFalse;
+ omxRetValue =
+ aFsm.iPortManager.BufferFlushIndicationPauseOrExeToIdleCommand(
+ allBuffersReturnedToSuppliers);
+ if (OMX_ErrorNone != omxRetValue)
+ {
+ return omxRetValue;
+ }
+
+ if (allBuffersReturnedToSuppliers)
+ {
+ // Complete here the transition to OMX_StateIdle
+ omxRetValue = aFsm.FsmTransition(COmxILFsm::EStateIdle);
+ if (OMX_ErrorNone == omxRetValue)
+ {
+ // Notify the IL client that port population has completed sucessfully
+ aFsm.iCallbacks.TransitionCompleteNotification(
+ OMX_StateIdle);
+ }
+ }
+
+ }
+ else
+ {
+ // Notify the IL client that the transition to OMX_StateExecuting has
+ // completed sucessfully
+ omxRetValue = aFsm.iCallbacks.TransitionCompleteNotification(
+ OMX_StateExecuting);
+
+ if (OMX_ErrorNone == omxRetValue)
+ {
+ // Fire up the tunnelled buffer exchange, if any tunnelled ports are
+ // found in the component...
+ omxRetValue = aFsm.iPortManager.InitiateTunnellingDataFlow();
+ }
+
+ }
+
+ return omxRetValue;
+
+ }
+
+OMX_ERRORTYPE
+COmxILFsm::COmxILStatePause::CommandPortEnable(
+ COmxILFsm& aFsm,
+ const TOmxILCommand& aCommand)
+ {
+ DEBUG_PRINTF(_L8("COmxILStatePause::CommandPortEnable"));
+ __ASSERT_DEBUG(aCommand.iCommandType == OMX_CommandPortEnable,
+ User::Panic(KOmxILFsmPanicCategory, 1));
+
+ // In this state, the port allocation has finished for enabled
+ // ports. However, a port is being enabled here. The port being enabled
+ // must populate (if tunnel supplier) or be populated (if non-tunnel
+ // supplier or IL Client communication)
+ TBool indicationIsFinal = EFalse;
+ OMX_ERRORTYPE omxRetValue = aFsm.iPortManager.PortEnableIndication(
+ aCommand.iParam1,
+ indicationIsFinal);
+
+ if (OMX_ErrorNone == omxRetValue)
+ {
+ // From section 3.2.2.6, "If the IL client enables a port while the
+ // component is in any state other than OMX_StateLoaded or
+ // OMX_WaitForResources, then that port shall allocate its buffers via
+ // the same call sequence used on a transition from OMX_StateLoaded to
+ // OMX_StateIdle."
+
+ // Lets tell port manager in case the port being enabled is a tunnel
+ // supplier...
+ TBool componentPopulationCompleted = EFalse;
+ omxRetValue =
+ aFsm.iPortManager.TunnellingBufferAllocation(
+ componentPopulationCompleted, aCommand.iParam1);
+
+ }
+
+ return omxRetValue;
+
+ }
+
+
+//
+// COmxILStatePauseToIdle
+//
+OMX_ERRORTYPE
+COmxILFsm::COmxILStatePauseToIdle::EmptyThisBuffer(
+ COmxILFsm& aFsm,
+ OMX_BUFFERHEADERTYPE* apBuffer)
+ {
+ DEBUG_PRINTF(_L8("COmxILStatePauseToIdle::EmptyThisBuffer"));
+
+ return ReturnThisBuffer(aFsm,
+ apBuffer,
+ OMX_DirInput);
+
+ }
+
+
+OMX_ERRORTYPE
+COmxILFsm::COmxILStatePauseToIdle::FillThisBuffer(
+ COmxILFsm& aFsm,
+ OMX_BUFFERHEADERTYPE* apBuffer)
+ {
+ DEBUG_PRINTF(_L8("COmxILStatePauseToIdle::FillThisBuffer"));
+
+ return ReturnThisBuffer(aFsm,
+ apBuffer,
+ OMX_DirOutput);
+
+ }
+
+
+OMX_ERRORTYPE
+COmxILFsm::COmxILStatePauseToIdle::CommandStateSet(
+ COmxILFsm& aFsm,
+ const TOmxILCommand& aCommand)
+ {
+ DEBUG_PRINTF(_L8("COmxILStatePauseToIdle::CommandStateSet"));
+
+ __ASSERT_DEBUG(aCommand.iCommandType == OMX_CommandStateSet,
+ User::Panic(KOmxILFsmPanicCategory, 1));
+
+ switch(aCommand.iParam1)
+ {
+ case OMX_StatePause:
+ {
+ // Here, return "same state" as the transition to OMX_StateIdle has not
+ // completed yet.
+ return OMX_ErrorSameState;
+ }
+ case OMX_StateInvalid:
+ {
+ // Notify the IL client... ignore the ret value...
+ aFsm.iCallbacks.TransitionCompleteNotification(OMX_StateInvalid);
+ // Invalidate component
+ return OMX_ErrorInvalidState;
+ }
+ default:
+ {
+ return OMX_ErrorIncorrectStateTransition;
+ }
+ };
+
+ }
+
+