omxil_generic/omxilcomplib/src/omxilportimpl.h
changeset 0 0e4a32b9112d
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/omxil_generic/omxilcomplib/src/omxilportimpl.h	Wed Aug 25 12:40:50 2010 +0300
@@ -0,0 +1,375 @@
+// Copyright (c) 2010 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 OMXILPORTIMPL_H
+#define OMXILPORTIMPL_H
+
+#include <e32base.h>
+#include <openmax/il/khronos/v1_x/OMX_Component.h>
+#include <openmax/il/common/omxilspecversion.h>
+#include <openmax/il/common/omxilport.h>
+
+/**
+   OpenMAX IL component port base implementation class.
+*/
+class COmxILPortImpl : public CBase
+	{
+public:
+	static const TInt	KMaxBufferMarksQueueSize			= 10;
+	static COmxILPortImpl* NewL(const TOmxILCommonPortData& aCommonPortData, COmxILPort& aPort);
+	~COmxILPortImpl();
+
+	OMX_ERRORTYPE GetParameter(
+		OMX_INDEXTYPE aParamIndex,
+		TAny* apComponentParameterStructure) const;
+
+	OMX_ERRORTYPE SetParameter(
+		OMX_INDEXTYPE aParamIndex,
+		const TAny* apComponentParameterStructure,
+		TBool& aUpdateProcessingFunction);
+		
+	OMX_ERRORTYPE GetConfig(
+		OMX_INDEXTYPE aConfigIndex,
+		TAny* apComponentConfigStructure) const;
+
+	OMX_ERRORTYPE SetConfig(
+		OMX_INDEXTYPE aConfigIndex,
+		const TAny* apComponentConfigStructure,
+		TBool& aUpdateProcessingFunction);
+
+	OMX_ERRORTYPE GetExtensionIndex(
+		OMX_STRING aParameterName,
+		OMX_INDEXTYPE* apIndexType) const;
+
+	OMX_ERRORTYPE PopulateBuffer(
+		OMX_BUFFERHEADERTYPE** appBufferHdr,
+		const OMX_PTR apAppPrivate,
+		OMX_U32 aSizeBytes,
+		OMX_U8* apBuffer,
+		TBool& portPopulationCompleted);
+
+	OMX_ERRORTYPE FreeBuffer(
+		OMX_BUFFERHEADERTYPE* apBufferHeader,
+		TBool& portDepopulationCompleted);
+
+	OMX_ERRORTYPE TunnelRequest(
+		OMX_HANDLETYPE aTunneledComp,
+		OMX_U32 aTunneledPort,
+		OMX_TUNNELSETUPTYPE* apTunnelSetup);
+
+	OMX_ERRORTYPE PopulateTunnel(
+		TBool& portPopulationCompleted);
+
+	OMX_ERRORTYPE FreeTunnel(
+		TBool& portDepopulationCompleted);
+
+	TBool SetBufferSent(
+		OMX_BUFFERHEADERTYPE* apBufferHeader,
+		TBool& aBufferMarkedWithOwnMark);
+
+	TBool SetBufferReturned(
+		OMX_BUFFERHEADERTYPE* apBufferHeader);
+
+	void SetTransitionToDisabled();
+
+	void SetTransitionToEnabled();
+
+	void SetTransitionToDisabledCompleted();
+
+	void SetTransitionToEnabledCompleted();
+
+	OMX_ERRORTYPE StoreBufferMark(
+		const OMX_MARKTYPE* pMark);
+
+	OMX_ERRORTYPE SetComponentRoleDefaults(
+		TUint aComponentRoleIndex);
+
+	OMX_ERRORTYPE DoPortReconfiguration(
+		TUint aPortSettingsIndex,
+		const TDesC8& aPortSettings,
+		OMX_EVENTTYPE& aEventForILClient);
+
+	inline OMX_DIRTYPE Direction() const;
+
+	inline TBool IsEnabled() const;
+
+	inline TBool IsPopulated() const;
+
+	inline TBool IsDePopulated() const;
+
+	inline TBool IsTunnelled() const;
+
+	inline TBool IsTunnelledAndBufferSupplier() const;
+
+	virtual TBool HasAllBuffersAtHome() const;
+
+	TBool IsTransitioningToEnabled() const;
+
+	inline TBool IsTransitioningToDisabled() const;
+
+	virtual TBool IsBufferAtHome(
+		OMX_BUFFERHEADERTYPE* apHeaderHeader) const;
+
+	inline OMX_U32 Index() const;
+
+	inline OMX_PORTDOMAINTYPE Domain() const;
+
+	inline OMX_U32 Count() const;
+
+	inline OMX_BUFFERHEADERTYPE* const& operator[](TInt anIndex) const;
+
+	inline OMX_BUFFERHEADERTYPE*& operator[](TInt anIndex);
+
+	inline OMX_U32 BufferMarkPropagationPort() const;
+
+protected:
+
+	class TBufferMarkInfo;
+
+	/**
+	   Buffer mark info list
+	*/
+	class TBufferMarkInfoQue :
+		public TSglQue<TBufferMarkInfo>
+		{
+
+	public:
+
+		// Convenience typedef....
+		typedef TSglQue<TBufferMarkInfo> Tq;
+
+	public:
+
+		inline explicit TBufferMarkInfoQue(TInt aOffset);
+
+		inline TBufferMarkInfo* First() const;
+
+		inline void AddLast(TBufferMarkInfo& aRef);
+
+		inline void Remove(TBufferMarkInfo& aRef);
+
+		inline TInt Elements() const;
+
+		inline void ResetAndDestroy();
+
+	private:
+
+		TBufferMarkInfoQue();
+		void AddFirst(TBufferMarkInfo& aRef);
+		TBool IsFirst(const TBufferMarkInfo* aPtr) const;
+		TBool IsLast(const TBufferMarkInfo* aPtr) const;
+
+		TBufferMarkInfo* Last() const;
+
+	private:
+
+		TInt iNumElements;
+
+		};
+
+
+	class TBufferInfo;
+
+private:
+
+	enum TPortIntermediateState
+		{
+		EPortNotTransitioning,
+		EPortTransitioningToDisabled,
+		EPortTransitioningToEnabled
+		};
+
+
+protected:
+
+	COmxILPortImpl(const TOmxILCommonPortData& aCommonPortData, COmxILPort& aPort);
+	
+public:
+	template<typename T>
+	inline OMX_ERRORTYPE GetParamStructureFromTunnel(
+		T& aComponentConfigStructure, OMX_INDEXTYPE aParamIndex) const;
+
+	OMX_ERRORTYPE StoreBufferMark(
+		OMX_HANDLETYPE& ipMarkTargetComponent,
+		OMX_PTR& ipMarkData);
+
+	void CleanUpPort();
+
+	inline const OMX_PARAM_PORTDEFINITIONTYPE& GetParamPortDefinition() const;
+	inline const OMX_HANDLETYPE& GetTunnelledComponent() const;
+	inline const OMX_U32& GetTunnelledPort() const;
+	inline OMX_PARAM_PORTDEFINITIONTYPE& GetParamPortDefinition();
+	inline OMX_HANDLETYPE& GetTunnelledComponent();
+	inline OMX_U32& GetTunnelledPort();
+	
+private:
+
+	// Tunnelled component
+	OMX_HANDLETYPE iTunnelledComponent;
+
+	// Tunnelled component's port
+	OMX_U32 iTunnelledPort;
+
+	// Buffer headers store
+	RArray<TBufferInfo> iBufferHeaders;
+
+	// Buffer marks store
+	TBufferMarkInfoQue iBufferMarks;
+
+	// Port's intermediate state to enabled or disabled
+	TPortIntermediateState iTransitionState;
+
+	// Associated port that will be used to propagate buffer marks
+	OMX_U32 iBufferMarkPropagationPortIndex;
+
+	// This is a flag that is set when the port receives the first
+	// OMX_UseBuffer (non-supplier ports). This will be used to know when
+	// SetParameter will be allowed
+	OMX_BOOL aFirstUseBufferHasBeenReceived;
+
+	// OpenMAX IL port definition structure
+	OMX_PARAM_PORTDEFINITIONTYPE iParamPortDefinition;
+
+	// OpenMAX IL buffer supplier structure
+	OMX_PARAM_BUFFERSUPPLIERTYPE iParamCompBufferSupplier;
+	
+	COmxILPort& iOmxILPort;
+	
+	};
+
+/**
+   Buffer mark info structure
+*/
+class COmxILPortImpl::TBufferMarkInfo
+	{
+
+public:
+
+	inline explicit TBufferMarkInfo(
+		const OMX_MARKTYPE*& apMark,
+		TBool aOwnMark = ETrue);
+
+	inline TBufferMarkInfo(
+		OMX_HANDLETYPE& apMarkTargetComponent,
+		OMX_PTR& apMarkData,
+		TBool aOwnMark = ETrue);
+
+public:
+
+	OMX_HANDLETYPE ipMarkTargetComponent;
+	OMX_PTR ipMarkData;
+	TBool iOwnMark;
+	TSglQueLink iLink;
+
+	};
+
+/**
+   Buffer info structure
+*/
+class COmxILPortImpl::TBufferInfo
+	{
+
+public:
+
+	enum THeaderLocationProperty
+		{
+		EBufferAtHome	= 0x01,
+		EBufferAway		= 0x00
+		};
+
+	enum THeaderOwnershipProperty
+		{
+		EBufferOwned	= 0x02,
+		EBufferNotOwned = 0x00
+		};
+
+public:
+
+	inline TBufferInfo(OMX_BUFFERHEADERTYPE* apHeader,
+					   THeaderLocationProperty aLocation,
+					   THeaderOwnershipProperty aOwnership,
+					   OMX_U8* apBuffer,
+					   OMX_PTR apApp,
+					   OMX_PTR apPlatform,
+					   OMX_PTR apPort);
+
+	inline explicit TBufferInfo(OMX_BUFFERHEADERTYPE* apHeader);
+
+	static TBool Compare(const TBufferInfo& aBi1,
+						const TBufferInfo& aBi2);
+
+	inline const OMX_BUFFERHEADERTYPE* GetHeader() const;
+
+	inline OMX_BUFFERHEADERTYPE* GetHeader();
+
+	inline operator OMX_BUFFERHEADERTYPE*&();
+
+	inline operator OMX_BUFFERHEADERTYPE* const&() const;
+
+	inline OMX_U8* GetBufferPointer() const;
+
+	inline OMX_U8* GetBufferPointer();
+
+	inline OMX_PTR GetPortPointer() const;
+
+	inline OMX_PTR GetPortPointer();
+
+	inline OMX_PTR GetPlatformPointer() const;
+
+	inline OMX_PTR GetPlatformPointer();
+
+	inline OMX_PTR GetAppPointer() const;
+
+	inline OMX_PTR GetAppPointer();
+
+	inline void SetBufferAtHome();
+
+	inline void SetBufferAway();
+
+	inline void SetBufferOwned();
+
+	inline void SetBufferNotOwned();
+
+	inline TBool IsBufferAtHome() const;
+
+	inline TBool IsBufferOwned() const;
+
+private:
+
+	enum THeaderPropertyMask
+		{
+		EBufferAwayMask		= 0xFE,
+		EBufferNotOwnedMask = 0xFD
+		};
+
+private:
+
+	OMX_BUFFERHEADERTYPE* ipHeader;
+	TUint8 iBufferProperties;
+	OMX_U8* ipBuffer;
+	OMX_PTR ipApp;
+	OMX_PTR ipPlatform;
+	OMX_PTR ipPort;
+
+	};
+
+#include "omxilportimpl.inl"
+#endif // OMXILPORTIMPL_H