diff -r 000000000000 -r 0e4a32b9112d omxil_generic/omxilcomplib/src/omxilportimpl.h --- /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 +#include +#include +#include + +/** + 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 + { + + public: + + // Convenience typedef.... + typedef TSglQue 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 + 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 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