omxil_generic/omxilcomplib/src/omxilstate.h
changeset 0 0e4a32b9112d
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/omxil_generic/omxilcomplib/src/omxilstate.h	Wed Aug 25 12:40:50 2010 +0300
@@ -0,0 +1,748 @@
+// 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
+*/
+
+#ifndef OMXILSTATE_H
+#define OMXILSTATE_H
+
+#include <e32base.h>
+#include <openmax/il/khronos/v1_x/OMX_Core.h>
+#include <openmax/il/common/omxilstatedefs.h>
+#include "omxilfsm.h"
+#include "omxilportmanagerif.h"
+
+// Forward declarations
+class TOmxILCommand;
+
+/**
+   Base class for concrete OpenMAX IL state objects (State Pattern)
+*/
+class COmxILFsm::COmxILState : public CBase
+	{
+
+public:
+
+	//
+	// Events, a.k.a. OpenMAX IL API calls
+	//
+
+	virtual OMX_ERRORTYPE GetParameter(
+		const COmxILFsm& aFsm,
+		OMX_INDEXTYPE aParamIndex,
+		TAny* apComponentParameterStructure) const;
+
+	/**
+	   State-specific version of the OpenMAX IL SetParameter API.
+
+	   @param [in] aFsm The main FSM context class that delegates the events to the
+	   state classes.
+
+	   @param [in] aParamIndex The index of the structure that is to be filled.
+
+	   @param [in] apComponentParameterStructure A pointer to the IL structure.
+
+	   @return OMX_ERRORTYPE
+	*/
+	virtual OMX_ERRORTYPE SetParameter(
+		COmxILFsm& aFsm,
+		OMX_INDEXTYPE aParamIndex,
+		const TAny* apComponentParameterStructure) = 0;
+
+	virtual OMX_ERRORTYPE GetConfig(
+		const COmxILFsm& aFsm,
+		OMX_INDEXTYPE aConfigIndex,
+		TAny* apComponentConfigStructure) const;
+
+	virtual OMX_ERRORTYPE SetConfig(
+		COmxILFsm& aFsm,
+		OMX_INDEXTYPE aConfigIndex,
+		const TAny* apComponentConfigStructure);
+
+	virtual OMX_ERRORTYPE GetExtensionIndex(
+		const COmxILFsm& aFsm,
+		OMX_STRING aParameterName,
+		OMX_INDEXTYPE* apIndexType) const;
+
+	/**
+	   State-specific version of the OpenMAX IL GetState API.
+
+	   @return OMX_STATETYPE
+	*/
+	virtual OMX_STATETYPE GetState() const = 0;
+
+	/**
+	   State-specific version of the OpenMAX IL ComponentTunnelRequest API.
+
+	   @param [in] aFsm The main FSM context class that delegates the events to
+	   the state classes.
+
+	   @param [in] aPort Used to select the port on the component to be used
+	   for tunneling.
+
+	   @param [in] aTunneledComp Handle of the component to tunnel with.
+
+	   @param [in] aTunneledPort Indicates the port the component should tunnel
+	   with.
+
+	   @param [in] aTunnelSetup Pointer to the tunnel setup structure.
+
+	   @return OMX_ERRORTYPE
+	*/
+	inline virtual OMX_ERRORTYPE ComponentTunnelRequest(
+		COmxILFsm& aFsm,
+		OMX_U32 aPort,
+		OMX_HANDLETYPE aTunneledComp,
+		OMX_U32 aTunneledPort,
+		OMX_TUNNELSETUPTYPE* apTunnelSetup) = 0;
+
+	/**
+	   State-specific version of the PopulateBuffer method used by the FSM
+	   object to implement the OpenMAX IL AllocateBuffer/UseBuffer APIs.
+
+	   @param [in] aFsm The main FSM context class that delegates the events
+	   to the state classes.
+
+	   @param [out] appBufferHdr A pointer to a pointer of an
+	   OMX_BUFFERHEADERTYPE structure that receives the pointer to the buffer
+	   header.
+
+	   @param [in] aPortIndex The index of the port that will use the
+	   specified buffer. This index is relative to the component that owns the
+	   port.
+
+	   @param [in] apAppPrivate A pointer that refers to an
+	   implementation-specific memory area that is under responsibility of the
+	   supplier of the buffer.
+
+	   @param [in] aSizeBytes The buffer size in bytes.
+
+	   @param [in] apBuffer A pointer to the memory buffer area to be used.
+
+	   @param [out] portPopulationCompleted Used to signal the FSM object the
+	   the port population has completed.
+
+	   @return OMX_ERRORTYPE
+	*/
+	inline virtual OMX_ERRORTYPE PopulateBuffer(
+		COmxILFsm& aFsm,
+		OMX_BUFFERHEADERTYPE** appBufferHdr,
+		OMX_U32 aPortIndex,
+		OMX_PTR apAppPrivate,
+		OMX_U32 aSizeBytes,
+		OMX_U8* apBuffer,
+		TBool& portPopulationCompleted) = 0;
+
+	/**
+	   State-specific version of the OpenMAX IL FreeBuffer API.
+
+	   @param [in] aFsm The main FSM context class that delegates the events
+	   to the state classes.
+
+	   @param [in] aPortIndex The index of the port that is using the
+	   specified buffer.
+
+	   @param [in] apBuffer A pointer to an OMX_BUFFERHEADERTYPE structure
+	   used to provide or receive the pointer to the buffer header.
+
+	   @param [out] aPortDepopulationCompleted Used to signal the FSM object
+	   the the port population has completed.
+
+	   @return OMX_ERRORTYPE
+	*/
+	inline virtual OMX_ERRORTYPE FreeBuffer(
+		COmxILFsm& aFsm,
+		OMX_U32 aPortIndex,
+		OMX_BUFFERHEADERTYPE* apBuffer,
+		TBool& aPortDepopulationCompleted) = 0;
+
+	/**
+	   State-specific version of the OpenMAX IL EmptyThisBuffer API.
+
+	   @param  [in] aFsm The main FSM context class that delegates the events
+	   to the state classes.
+
+	   @param [in] apBuffer A pointer to an OMX_BUFFERHEADERTYPE structure that is
+	   used to receive the pointer to the buffer header. The buffer header
+	   shall specify the index of the input port that receives the buffer.
+
+	   @return OMX_ERRORTYPE
+	*/
+	inline virtual OMX_ERRORTYPE EmptyThisBuffer(
+		COmxILFsm& aFsm,
+		OMX_BUFFERHEADERTYPE* apBuffer) = 0;
+
+	/**
+	   State-specific version of the OpenMAX IL FillThisBuffer API.
+
+	   @param [in] aFsm The main FSM context class that delegates the events
+	   to the state classes.
+
+	   @param [in] apBuffer A pointer to an OMX_BUFFERHEADERTYPE structure
+	   that is used to receive the pointer to the buffer header. The buffer
+	   header shall specify the index of the input port that receives the
+	   buffer.
+
+	   @return OMX_ERRORTYPE
+	*/
+	inline virtual OMX_ERRORTYPE FillThisBuffer(
+		COmxILFsm& aFsm,
+		OMX_BUFFERHEADERTYPE* apBuffer) = 0;
+
+	/**
+	   State-specific version of the method used by the FSM object to
+	   implement the OpenMAX IL OMX_CommandStateSet command.
+
+	   @param [in] aFsm The main FSM context class that delegates the events
+	   to the state classes.
+
+	   @param [in] aCommand A TOmxILCommand object used to carry the command
+	   parameters.
+
+	   @return OMX_ERRORTYPE
+	*/
+	virtual OMX_ERRORTYPE CommandStateSet(
+		COmxILFsm& aFsm,
+		const TOmxILCommand& aCommand) = 0;
+
+	virtual OMX_ERRORTYPE CommandFlush(
+		COmxILFsm& aFsm,
+		const TOmxILCommand& aCommand);
+
+	/**
+	   State-specific version of the method used by the FSM object to
+	   implement the OpenMAX IL OMX_CommandPortEnable command.
+
+	   @param [in] aFsm The main FSM context class that delegates the events
+	   to the state classes.
+
+	   @param [in] aCommand A TOmxILCommand object used to carry the command
+	   parameters.
+
+	   @return OMX_ERRORTYPE
+	*/
+	virtual OMX_ERRORTYPE CommandPortEnable(
+		COmxILFsm& aFsm,
+		const TOmxILCommand& aCommand) = 0;
+
+	virtual OMX_ERRORTYPE CommandPortDisable(
+		COmxILFsm& aFsm,
+		const TOmxILCommand& aCommand);
+
+	virtual OMX_ERRORTYPE CommandMarkBuffer(
+		COmxILFsm& aFsm,
+		const TOmxILCommand& aCommand);
+
+protected:
+
+	virtual OMX_ERRORTYPE SetParameterV2(
+		COmxILFsm& aFsm,
+		OMX_INDEXTYPE aParamIndex,
+		const TAny* apComponentParameterStructure);
+
+	inline virtual OMX_ERRORTYPE PopulateBufferV2(
+		COmxILFsm& aFsm,
+		OMX_BUFFERHEADERTYPE** appBufferHdr,
+		OMX_U32 aPortIndex,
+		OMX_PTR apAppPrivate,
+		OMX_U32 aSizeBytes,
+		OMX_U8* apBuffer,
+		TBool& portPopulationCompleted);
+
+	inline virtual OMX_ERRORTYPE FreeBufferV2(
+		COmxILFsm& aFsm,
+		OMX_U32 aPortIndex,
+		OMX_BUFFERHEADERTYPE* apBuffer,
+		TBool& aPortDepopulationCompleted);
+
+	inline virtual OMX_ERRORTYPE ComponentTunnelRequestV2(
+		COmxILFsm& aFsm,
+		OMX_U32 aPort,
+		OMX_HANDLETYPE aTunneledComp,
+		OMX_U32 aTunneledPort,
+		OMX_TUNNELSETUPTYPE* apTunnelSetup);
+
+	inline virtual OMX_ERRORTYPE EmptyThisBufferV2(
+		COmxILFsm& aFsm,
+		OMX_BUFFERHEADERTYPE* apBuffer);
+
+	inline virtual OMX_ERRORTYPE FillThisBufferV2(
+		COmxILFsm& aFsm,
+		OMX_BUFFERHEADERTYPE* apBuffer);
+
+	};
+
+
+/**
+   Concrete class that implements the OpenMAX IL OMX_StateInvalid state
+*/
+class COmxILFsm::COmxILStateInvalid : public COmxILFsm::COmxILState
+	{
+
+public:
+
+	OMX_ERRORTYPE GetParameter(const COmxILFsm& aFsm,
+							   OMX_INDEXTYPE aParamIndex,
+							   TAny* apComponentParameterStructure) const;
+
+	OMX_ERRORTYPE SetParameter(COmxILFsm& aFsm,
+							   OMX_INDEXTYPE aParamIndex,
+							   const TAny* apComponentParameterStructure);
+
+	OMX_ERRORTYPE GetConfig(const COmxILFsm& aFsm,
+							OMX_INDEXTYPE aConfigIndex,
+							TAny* apComponentConfigStructure) const;
+
+	OMX_ERRORTYPE SetConfig(COmxILFsm& aFsm,
+							OMX_INDEXTYPE aConfigIndex,
+							const TAny* apComponentConfigStructure);
+
+	OMX_ERRORTYPE GetExtensionIndex(const COmxILFsm& aFsm,
+									OMX_STRING aParameterName,
+									OMX_INDEXTYPE* apIndexType) const;
+
+	OMX_STATETYPE GetState() const;
+
+	OMX_ERRORTYPE ComponentTunnelRequest(COmxILFsm& aFsm,
+										 OMX_U32 aPort,
+										 OMX_HANDLETYPE aTunneledComp,
+										 OMX_U32 aTunneledPort,
+										 OMX_TUNNELSETUPTYPE* apTunnelSetup);
+
+	OMX_ERRORTYPE PopulateBuffer(COmxILFsm& aFsm,
+								 OMX_BUFFERHEADERTYPE** appBufferHdr,
+								 OMX_U32 aPortIndex,
+								 OMX_PTR apAppPrivate,
+								 OMX_U32 aSizeBytes,
+								 OMX_U8* apBuffer,
+								 TBool& portPopulationCompleted);
+
+	OMX_ERRORTYPE FreeBuffer(COmxILFsm& aFsm,
+							 OMX_U32 aPortIndex,
+							 OMX_BUFFERHEADERTYPE* apBuffer,
+							 TBool& aPortDepopulationCompleted);
+
+	OMX_ERRORTYPE EmptyThisBuffer(COmxILFsm& aFsm,
+								  OMX_BUFFERHEADERTYPE* apBuffer);
+
+	OMX_ERRORTYPE FillThisBuffer(COmxILFsm& aFsm,
+								 OMX_BUFFERHEADERTYPE* apBuffer);
+
+
+	OMX_ERRORTYPE CommandStateSet(
+		COmxILFsm& aFsm,
+		const TOmxILCommand& aCommand);
+
+	OMX_ERRORTYPE CommandFlush(
+		COmxILFsm& aFsm,
+		const TOmxILCommand& aCommand);
+
+	OMX_ERRORTYPE CommandPortEnable(
+		COmxILFsm& aFsm,
+		const TOmxILCommand& aCommand);
+
+	OMX_ERRORTYPE CommandPortDisable(
+		COmxILFsm& aFsm,
+		const TOmxILCommand& aCommand);
+
+	OMX_ERRORTYPE CommandMarkBuffer(
+		COmxILFsm& aFsm,
+		const TOmxILCommand& aCommand);
+
+	};
+
+/**
+   Concrete class that implements the OpenMAX IL OMX_StateLoaded state
+*/
+class COmxILFsm::COmxILStateLoaded : public COmxILFsm::COmxILState
+	{
+
+public:
+
+	OMX_STATETYPE GetState() const;
+
+	OMX_ERRORTYPE SetParameter(COmxILFsm& aFsm,
+							   OMX_INDEXTYPE aParamIndex,
+							   const TAny* apComponentParameterStructure);
+
+	OMX_ERRORTYPE PopulateBuffer(COmxILFsm& aFsm,
+								 OMX_BUFFERHEADERTYPE** appBufferHdr,
+								 OMX_U32 aPortIndex,
+								 OMX_PTR apAppPrivate,
+								 OMX_U32 aSizeBytes,
+								 OMX_U8* apBuffer,
+								 TBool& portPopulationCompleted);
+
+	OMX_ERRORTYPE FreeBuffer(COmxILFsm& aFsm,
+							 OMX_U32 aPortIndex,
+							 OMX_BUFFERHEADERTYPE* apBuffer,
+							 TBool& aPortDepopulationCompleted);
+
+	OMX_ERRORTYPE EmptyThisBuffer(COmxILFsm& aFsm,
+								  OMX_BUFFERHEADERTYPE* apBuffer);
+
+	OMX_ERRORTYPE FillThisBuffer(COmxILFsm& aFsm,
+								 OMX_BUFFERHEADERTYPE* apBuffer);
+
+	OMX_ERRORTYPE ComponentTunnelRequest(COmxILFsm& aFsm,
+										 OMX_U32 aPort,
+										 OMX_HANDLETYPE aTunneledComp,
+										 OMX_U32 aTunneledPort,
+										 OMX_TUNNELSETUPTYPE* apTunnelSetup);
+
+	OMX_ERRORTYPE CommandStateSet(
+		COmxILFsm& aFsm,
+		const TOmxILCommand& aCommand);
+
+	OMX_ERRORTYPE CommandPortEnable(
+		COmxILFsm& aFsm,
+		const TOmxILCommand& aCommand);
+
+	};
+
+
+/**
+   Concrete class that implements the intermediate state OMX_StateLoaded ->
+   OMX_StateIdle.
+*/
+class COmxILFsm::COmxILStateLoadedToIdle : public COmxILFsm::COmxILStateLoaded
+	{
+
+public:
+
+
+	OMX_ERRORTYPE PopulateBuffer(COmxILFsm& aFsm,
+								 OMX_BUFFERHEADERTYPE** appBufferHdr,
+								 OMX_U32 aPortIndex,
+								 OMX_PTR apAppPrivate,
+								 OMX_U32 aSizeBytes,
+								 OMX_U8* apBuffer,
+								 TBool& portPopulationCompleted);
+
+	OMX_ERRORTYPE CommandStateSet(
+		COmxILFsm& aFsm,
+		const TOmxILCommand& aCommand);
+
+	OMX_ERRORTYPE CommandPortEnable(
+		COmxILFsm& aFsm,
+		const TOmxILCommand& aCommand);
+
+	};
+
+/**
+   Concrete class that implements the OpenMAX IL OMX_StateWaitForResources
+   state
+
+   NOTE: This state is here only to provide the basic functionality of
+   transitioning form OMX_StateLoaded to OMX_StateWaitForResources and
+   viceversa. Transition from OMX_StateWaitForResources to OMX_StateIdle is not
+   implemented at this stage since a Resource Manager is not present
+   yet. Whenever a Resource Manager becomes available, a
+   COmxILStateWaitForResourcesToIdle substate should be implemented to handle
+   the allocation of buffers mandated by the standard in this transition.
+
+*/
+class COmxILFsm::COmxILStateWaitForResources : public COmxILFsm::COmxILState
+	{
+
+public:
+
+	OMX_STATETYPE GetState() const;
+
+	OMX_ERRORTYPE SetParameter(COmxILFsm& aFsm,
+							   OMX_INDEXTYPE aParamIndex,
+							   const TAny* apComponentParameterStructure);
+
+	OMX_ERRORTYPE PopulateBuffer(COmxILFsm& aFsm,
+								 OMX_BUFFERHEADERTYPE** appBufferHdr,
+								 OMX_U32 aPortIndex,
+								 OMX_PTR apAppPrivate,
+								 OMX_U32 aSizeBytes,
+								 OMX_U8* apBuffer,
+								 TBool& portPopulationCompleted);
+
+	OMX_ERRORTYPE FreeBuffer(COmxILFsm& aFsm,
+							 OMX_U32 aPortIndex,
+							 OMX_BUFFERHEADERTYPE* apBuffer,
+							 TBool& aPortDepopulationCompleted);
+
+	OMX_ERRORTYPE EmptyThisBuffer(COmxILFsm& aFsm,
+								  OMX_BUFFERHEADERTYPE* apBuffer);
+
+	OMX_ERRORTYPE FillThisBuffer(COmxILFsm& aFsm,
+								 OMX_BUFFERHEADERTYPE* apBuffer);
+
+	OMX_ERRORTYPE ComponentTunnelRequest(COmxILFsm& aFsm,
+										 OMX_U32 aPort,
+										 OMX_HANDLETYPE aTunneledComp,
+										 OMX_U32 aTunneledPort,
+										 OMX_TUNNELSETUPTYPE* apTunnelSetup);
+
+	OMX_ERRORTYPE CommandStateSet(
+		COmxILFsm& aFsm,
+		const TOmxILCommand& aCommand);
+
+	OMX_ERRORTYPE CommandPortEnable(
+		COmxILFsm& aFsm,
+		const TOmxILCommand& aCommand);
+
+	};
+
+/**
+   Concrete class that implements the OpenMAX IL COmxILStateIdle state
+*/
+class COmxILFsm::COmxILStateIdle : public COmxILFsm::COmxILState
+	{
+
+public:
+
+	OMX_STATETYPE GetState() const;
+
+	OMX_ERRORTYPE SetParameter(COmxILFsm& aFsm,
+							   OMX_INDEXTYPE aParamIndex,
+							   const TAny* apComponentParameterStructure);
+
+	OMX_ERRORTYPE PopulateBuffer(COmxILFsm& aFsm,
+								 OMX_BUFFERHEADERTYPE** appBufferHdr,
+								 OMX_U32 aPortIndex,
+								 OMX_PTR apAppPrivate,
+								 OMX_U32 aSizeBytes,
+								 OMX_U8* apBuffer,
+								 TBool& portPopulationCompleted);
+
+	OMX_ERRORTYPE FreeBuffer(COmxILFsm& aFsm,
+							 OMX_U32 aPortIndex,
+							 OMX_BUFFERHEADERTYPE* apBuffer,
+							 TBool& aPortDepopulationCompleted);
+
+	OMX_ERRORTYPE EmptyThisBuffer(COmxILFsm& aFsm,
+								  OMX_BUFFERHEADERTYPE* apBuffer);
+
+	OMX_ERRORTYPE FillThisBuffer(COmxILFsm& aFsm,
+								 OMX_BUFFERHEADERTYPE* apBuffer);
+
+	OMX_ERRORTYPE ComponentTunnelRequest(COmxILFsm& aFsm,
+										 OMX_U32 aPort,
+										 OMX_HANDLETYPE aTunneledComp,
+										 OMX_U32 aTunneledPort,
+										 OMX_TUNNELSETUPTYPE* apTunnelSetup);
+
+	OMX_ERRORTYPE CommandStateSet(
+		COmxILFsm& aFsm,
+		const TOmxILCommand& aCommand);
+
+	OMX_ERRORTYPE CommandFlush(
+		COmxILFsm& aFsm,
+		const TOmxILCommand& aCommand);
+
+	OMX_ERRORTYPE CommandPortEnable(
+		COmxILFsm& aFsm,
+		const TOmxILCommand& aCommand);
+
+	};
+
+/**
+   Concrete class that implements the intermediate state OMX_StateIdle ->
+   OMX_StateLoaded.
+*/
+class COmxILFsm::COmxILStateIdleToLoaded : public COmxILFsm::COmxILStateIdle
+	{
+
+public:
+
+	OMX_ERRORTYPE FreeBuffer(COmxILFsm& aFsm,
+							 OMX_U32 aPortIndex,
+							 OMX_BUFFERHEADERTYPE* apBuffer,
+							 TBool& aPortDepopulationCompleted);
+
+	OMX_ERRORTYPE CommandStateSet(
+		COmxILFsm& aFsm,
+		const TOmxILCommand& aCommand);
+
+	};
+
+/**
+   Concrete class that implements the OpenMAX IL COmxILStateExecuting state
+*/
+class COmxILFsm::COmxILStateExecuting : public COmxILFsm::COmxILState
+	{
+
+public:
+
+	OMX_STATETYPE GetState() const;
+
+	OMX_ERRORTYPE SetParameter(COmxILFsm& aFsm,
+							   OMX_INDEXTYPE aParamIndex,
+							   const TAny* apComponentParameterStructure);
+
+	OMX_ERRORTYPE PopulateBuffer(COmxILFsm& aFsm,
+								 OMX_BUFFERHEADERTYPE** appBufferHdr,
+								 OMX_U32 aPortIndex,
+								 OMX_PTR apAppPrivate,
+								 OMX_U32 aSizeBytes,
+								 OMX_U8* apBuffer,
+								 TBool& portPopulationCompleted);
+
+	OMX_ERRORTYPE FreeBuffer(COmxILFsm& aFsm,
+							 OMX_U32 aPortIndex,
+							 OMX_BUFFERHEADERTYPE* apBuffer,
+							 TBool& aPortDepopulationCompleted);
+
+	OMX_ERRORTYPE EmptyThisBuffer(COmxILFsm& aFsm,
+								  OMX_BUFFERHEADERTYPE* apBuffer);
+
+	OMX_ERRORTYPE FillThisBuffer(COmxILFsm& aFsm,
+								 OMX_BUFFERHEADERTYPE* apBuffer);
+
+	OMX_ERRORTYPE ComponentTunnelRequest(COmxILFsm& aFsm,
+										 OMX_U32 aPort,
+										 OMX_HANDLETYPE aTunneledComp,
+										 OMX_U32 aTunneledPort,
+										 OMX_TUNNELSETUPTYPE* apTunnelSetup);
+
+	OMX_ERRORTYPE CommandStateSet(
+		COmxILFsm& aFsm,
+		const TOmxILCommand& aCommand);
+
+	OMX_ERRORTYPE CommandPortEnable(
+		COmxILFsm& aFsm,
+		const TOmxILCommand& aCommand);
+
+	};
+
+/**
+   Class used to abstract the commonalities of the transitions from
+   OMX_StatePause or OMX_StateExecuting to OMX_StateIdle.
+*/
+class COmxILFsm::MOmxILPauseOrExecutingToIdle
+	{
+
+protected:
+
+	OMX_ERRORTYPE ReturnThisBuffer(COmxILFsm& aFsm,
+								   OMX_BUFFERHEADERTYPE* apBuffer,
+								   OMX_DIRTYPE aDirection);
+
+	OMX_ERRORTYPE CommandPortEnable(
+		COmxILFsm& aFsm,
+		const TOmxILCommand& aCommand);
+
+	};
+
+/**
+   Concrete class that implements the intermediate state OMX_StateExecuting ->
+   OMX_StateIdle.
+*/
+class COmxILFsm::COmxILStateExecutingToIdle :
+	public COmxILFsm::COmxILStateExecuting,
+	private COmxILFsm::MOmxILPauseOrExecutingToIdle
+
+	{
+
+public:
+
+	OMX_ERRORTYPE EmptyThisBuffer(COmxILFsm& aFsm,
+								  OMX_BUFFERHEADERTYPE* apBuffer);
+
+	OMX_ERRORTYPE FillThisBuffer(COmxILFsm& aFsm,
+								 OMX_BUFFERHEADERTYPE* apBuffer);
+
+	OMX_ERRORTYPE CommandStateSet(
+		COmxILFsm& aFsm,
+		const TOmxILCommand& aCommand);
+
+	};
+
+/**
+   Concrete class that implements the OpenMAX IL COmxILStatePause state
+*/
+class COmxILFsm::COmxILStatePause : public COmxILFsm::COmxILState
+	{
+
+public:
+
+	OMX_STATETYPE GetState() const;
+
+	OMX_ERRORTYPE SetParameter(COmxILFsm& aFsm,
+							   OMX_INDEXTYPE aParamIndex,
+							   const TAny* apComponentParameterStructure);
+
+	OMX_ERRORTYPE PopulateBuffer(COmxILFsm& aFsm,
+								 OMX_BUFFERHEADERTYPE** appBufferHdr,
+								 OMX_U32 aPortIndex,
+								 OMX_PTR apAppPrivate,
+								 OMX_U32 aSizeBytes,
+								 OMX_U8* apBuffer,
+								 TBool& portPopulationCompleted);
+
+	OMX_ERRORTYPE FreeBuffer(COmxILFsm& aFsm,
+							 OMX_U32 aPortIndex,
+							 OMX_BUFFERHEADERTYPE* apBuffer,
+							 TBool& aPortDepopulationCompleted);
+
+	OMX_ERRORTYPE EmptyThisBuffer(COmxILFsm& aFsm,
+								  OMX_BUFFERHEADERTYPE* apBuffer);
+
+	OMX_ERRORTYPE FillThisBuffer(COmxILFsm& aFsm,
+								 OMX_BUFFERHEADERTYPE* apBuffer);
+
+	OMX_ERRORTYPE ComponentTunnelRequest(COmxILFsm& aFsm,
+										 OMX_U32 aPort,
+										 OMX_HANDLETYPE aTunneledComp,
+										 OMX_U32 aTunneledPort,
+										 OMX_TUNNELSETUPTYPE* apTunnelSetup);
+
+	OMX_ERRORTYPE CommandStateSet(
+		COmxILFsm& aFsm,
+		const TOmxILCommand& aCommand);
+
+	OMX_ERRORTYPE CommandPortEnable(
+		COmxILFsm& aFsm,
+		const TOmxILCommand& aCommand);
+
+	};
+
+/**
+   Concrete class that implements the intermediate state OMX_StatePause ->
+   OMX_StateIdle.
+*/
+class COmxILFsm::COmxILStatePauseToIdle
+	: public COmxILFsm::COmxILStatePause,
+	  private COmxILFsm::MOmxILPauseOrExecutingToIdle
+	{
+
+public:
+
+	OMX_ERRORTYPE EmptyThisBuffer(COmxILFsm& aFsm,
+								  OMX_BUFFERHEADERTYPE* apBuffer);
+
+	OMX_ERRORTYPE FillThisBuffer(COmxILFsm& aFsm,
+								 OMX_BUFFERHEADERTYPE* apBuffer);
+
+	OMX_ERRORTYPE CommandStateSet(
+		COmxILFsm& aFsm,
+		const TOmxILCommand& aCommand);
+
+	};
+
+#include "omxilstate.inl"
+
+#endif // OMXILSTATE_H
+
+