omxilvideocomps/omxilgraphicsink/src/omxilgraphicsinkprocessingfunction.h
author hgs
Fri, 08 Oct 2010 22:09:17 +0100
changeset 0 5d29cba61097
permissions -rw-r--r--
2010wk38_02

/*
* 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 OMXILGRAPHICSINKPROCESSINGFUNCTION_H
#define OMXILGRAPHICSINKPROCESSINGFUNCTION_H

#include <e32msgqueue.h>
#include <openmax/il/common/omxilprocessingfunction.h>
#include <openmax/il/extensions/omxilsymbianvideographicsinkextensions.h>
#include <openmax/il/khronos/v1_x/OMX_Video.h>
#include <graphics/surface.h>
#include <graphics/surfacemanager.h>
#include <graphics/surfaceupdateclient.h>
#include <graphics/surfaceconfiguration.h>
#include "mmfbuffershared.h"


class COmxILGraphicSinkVPB0Port;
/**
The class for GraphicSink processing functions. This provides the main processing engine behind the graphic sink.
*/
class COmxILGraphicSinkProcessingFunction :
	public COmxILProcessingFunction
	{
private:
    class TGraphicSurfaceSettings
        {
    public:
        TGraphicSurfaceSettings() : iSurfaceAttributes(iSurfaceAttributesBuf()) {};
        
    public:
        // Surface configuration
        TSurfaceConfiguration iSurfaceConfig;
        // A package for surface attribute.
        RSurfaceManager::TSurfaceCreationAttributesBuf iSurfaceAttributesBuf;
        // A surface attribute.
        RSurfaceManager::TSurfaceCreationAttributes& iSurfaceAttributes;
        } iGraphicSurfaceSettings;

public:
	static COmxILGraphicSinkProcessingFunction* NewL(
			MOmxILCallbackNotificationIf& aCallbacks);

	~COmxILGraphicSinkProcessingFunction();

	OMX_ERRORTYPE StateTransitionIndication(TStateIndex aNewState);

	OMX_ERRORTYPE BufferFlushingIndication(TUint32 aPortIndex,
										   OMX_DIRTYPE aDirection);

	OMX_ERRORTYPE ParamIndication(OMX_INDEXTYPE aParamIndex,
									  const TAny* apComponentParameterStructure);

	OMX_ERRORTYPE ConfigIndication(OMX_INDEXTYPE aConfigIndex,
									   const TAny* apComponentConfigStructure);

	OMX_ERRORTYPE BufferIndication(
		OMX_BUFFERHEADERTYPE* apBufferHeader,
		OMX_DIRTYPE aDirection);

	OMX_BOOL BufferRemovalIndication(
		OMX_BUFFERHEADERTYPE* apBufferHeader,
		OMX_DIRTYPE aDirection);
	
	void CreateBufferL(OMX_U8*& aPortSpecificBuffer, OMX_PTR& aPortPrivate, OMX_U32 aBufferCountActual);
	void DestroyBuffer(OMX_PTR apPortPrivate);
	void InitBufferL(OMX_U32 aSizeBytes, OMX_U8* apBuffer, OMX_U32 aBufferCountActual);
	void DeInitBuffer();
	void WaitForTransitionToPauseToFinish();
	void TransitionToPauseFinished();

	TUidPixelFormat ConvertPixelFormat(OMX_COLOR_FORMATTYPE aColorFormat);
	
	// Access private member (read and write)
	inline MOmxILCallbackNotificationIf& GetCallbacks();
	inline TSurfaceConfiguration& GetSurfaceConfiguration();
	inline RPointerArray<OMX_BUFFERHEADERTYPE>& BuffersToEmpty();
	inline TGraphicSurfaceSettings& GraphicSurfaceSettings();
	inline OMX_STATETYPE State();
	inline void SetState(OMX_STATETYPE aState);
	inline RSurfaceManager& SurfaceManager();
	inline TInt GetFastCounterFrequency();

	void SetSharedChunkBufConfig(TMMSharedChunkBufConfig aSharedChunkBufConfig);
    void GetSharedChunkMetadata(OMX_U32& aHandleId, OMX_U64& aThreadId) const;

public:
	//Not own, just points to related graphic sink port, so set it to public data member.
    COmxILGraphicSinkVPB0Port* iGraphicSinkPort;
private:
	COmxILGraphicSinkProcessingFunction(MOmxILCallbackNotificationIf& aCallbacks);
	void ConstructL();
	
	void InitSurfaceAttributes();

private:
	RPointerArray<OMX_BUFFERHEADERTYPE> iBuffersToEmpty;
	OMX_BUFFERHEADERTYPE* iBufferOnScreen;
	RMutex iBufferMutex;
	OMX_STATETYPE iState;
	TInt iFastCounterFrequency;
    // A surface manager.
    RSurfaceManager iSurfaceManager;
    TThreadId iOwnerThreadId;
    CActiveSchedulerWait* iTransitionToPauseWait;
    RSemaphore iTransitionToPauseWaitSemaphore;

	/**
	 * Mediates access to the RSurfaceUpdateSession.
	 */
	class CGraphicSurfaceAccess : public CActive
		{
	public:
		static CGraphicSurfaceAccess* NewL(COmxILGraphicSinkProcessingFunction& aParent);
		~CGraphicSurfaceAccess();

		// from CActive
		void RunL();
		void DoCancel();

		TInt OpenDevice();
		void CloseDevice();
		TInt Execute();
		TInt Pause();
		TInt Stop();
		
		void CreateBufferL(OMX_U8*& aPortSpecificBuffer, OMX_PTR& aPortPrivate, OMX_U32 aBufferCountActual);
		void InitBufferL(OMX_U32 aSizeBytes, OMX_U8* apBuffer, OMX_U32 aBufferCountActual);
		
		TInt ProcessNextBuffer();
		
		void ResetSurfaceId();
		void CloseChunk();

	public:
	    TInt iSharedChunkHandleId;
	    TUint64 iSharedChunkThreadId;
	    TMMSharedChunkBufConfig iSharedChunkBufConfig;
        TBool iIsLocalChunk;

	private:
		CGraphicSurfaceAccess(COmxILGraphicSinkProcessingFunction& aParent);
		
	public:
	    TInt iBufferIdGenerator;
	    
	private:
		OMX_BUFFERHEADERTYPE* iCurrentBuffer;
		COmxILGraphicSinkProcessingFunction& iParent;
		
		// Memory chunk
		RChunk iChunk;
		
        #ifdef ILCOMPONENTCONFORMANCE
		// These are added for the ILComponentConformance Suite
		// Handles copy of data in case of Non-buffer supplier, while running IL Component conformance suite
		TBool iIsBufferSupplier;
		// Conformance suite does not handle chunks therefore offsets from base chunk address are held in this array
		RArray<TInt> iArrayOffsets;
        #endif
		
		// Surface Id
		TSurfaceId iSurfaceId;
		// A surface update session.
		RSurfaceUpdateSession iSurfaceUpdateSession;
		// Time stamp of the display notification event
		TTimeStamp iTimeStamp;
		// An indicator for first frame displayed
		TBool iFirstFrameDisplayed;

		RArray<TInt> iOffsetArray;

		} *iGraphicSurfaceAccess;

	/**
	 * Serializes operations into the 'main' thread hosting the Active Scheduler.
	 */
	class CPFHelper : public CActive
		{
	public:
		static CPFHelper* NewL(COmxILGraphicSinkProcessingFunction& aParent, CGraphicSurfaceAccess& aGraphicSurfaceAccess);
		~CPFHelper();

		// from CActive
		void RunL();
		void DoCancel();

		OMX_ERRORTYPE OpenDevice();
		OMX_ERRORTYPE CloseDevice();
		OMX_ERRORTYPE ExecuteAsync();
		OMX_ERRORTYPE StopAsync();
		OMX_ERRORTYPE StopSync();
		OMX_ERRORTYPE Pause();
		OMX_ERRORTYPE BufferIndication();

		enum TMessageType 
			{
			EOpenDevice,
			ECloseDevice,
			EExecuteCommand,
			EStopCommand,
			EPauseCommand,
			EBufferIndication
			};
		
		RMsgQueue<TMessageType> iMsgQueue;
	
	private:
		CPFHelper(COmxILGraphicSinkProcessingFunction& aParent, CGraphicSurfaceAccess& aGraphicSurfaceAccess);
		void ConstructL();
		
		TInt ProcessQueue();
		
		OMX_ERRORTYPE ConvertError(TInt aError);

	private:
		static const TInt KMaxMsgQueueEntries = 25;

		COmxILGraphicSinkProcessingFunction& iParent;
		CGraphicSurfaceAccess& iGraphicSurfaceAccess;
		} *iPFHelper;
	};

#include "omxilgraphicsinkprocessingfunction.inl"

#endif // OMXILGRAPHICSINKPROCESSINGFUNCTION_H