mmswadaptation/videorenderer/inc/rendererrelay.h
changeset 0 40261b775718
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mmswadaptation/videorenderer/inc/rendererrelay.h	Tue Feb 02 01:56:55 2010 +0200
@@ -0,0 +1,221 @@
+// Copyright (c) 2007-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 RENDERERRELAY_H
+#define RENDERERRELAY_H
+
+#include <e32base.h>
+#include <e32msgqueue.h>
+#include <graphics/surfaceupdateclient.h>
+#include <mmf/devvideo/devvideobase.h>
+#include "videorenderer.h"
+
+class CBufAvailListener;
+class CBufDisplayListener;
+class CRendererTimer;
+
+/** Interface for renderer relay object */
+class MVideoRendererRelay
+	{
+public:
+	virtual ~MVideoRendererRelay() {};
+	virtual void UpdateBuffer(TVideoFrameBuffer* aBuffer, const TTime& aPresentationTime, TRequestStatus* aRequestStatus) = 0;
+	virtual void DestroySurface(TRequestStatus* aRequestStatus) = 0;
+	virtual void SetBufferManager(CRendererBufferManager* aBufManager) = 0;
+	virtual void PrepareL(const TSurfaceId& aSurfaceId, TInt aNumBuffers, TRequestStatus* aRequestStatus) = 0;
+	virtual void SetRendererThread(RThread* aRendererThread) = 0;
+	virtual void Terminate(TRequestStatus& aRequestStatus) = 0;
+	virtual void SetTimerInfo(TInt64 aDefaultDelay, TInt64 aMaxDelay) = 0;
+	};
+
+/** 
+Implemenation of MVideoRendererRelay. This class is responsible for submitting 
+update for CVideoRenderer in non-timed mode. In timed mode, this class submits 
+update for CRendererThreadRelay.
+*/
+NONSHARABLE_CLASS(CRendererRelay) : public CBase, public MVideoRendererRelay
+	{
+public:
+	static CRendererRelay* NewL(MVideoRendererObserver& aObserver);
+	~CRendererRelay();
+
+	// from MRendererRelay
+	void UpdateBuffer(TVideoFrameBuffer* aBuffer, const TTime& aPresentationTime, TRequestStatus* aRequestStatus);
+	void DestroySurface(TRequestStatus* aRequestStatus);
+	void SetBufferManager(CRendererBufferManager* aBufManager);
+	void PrepareL(const TSurfaceId& aSurfaceId, TInt aNumBuffers, TRequestStatus* aRequestStatus);
+	void SetRendererThread(RThread* aRendererThread);
+	void Terminate(TRequestStatus& aRequestStatus);
+	void SetTimerInfo(TInt64 aDefaultDelay, TInt64 aMaxDelay);
+
+	void BufferDisplayed(TBool aDisplayed, TInt64 aDelay);
+	TBool UpdateSubmitted();
+
+	void SetRendererTimer(CRendererTimer* aRendererTimer);
+	void RendererTimerExpired();
+	void SubmitBufferTimed();
+	TInt64 Delay();
+
+private:
+	CRendererRelay(MVideoRendererObserver& aObserver);
+	void ConstructL();
+
+	CBufAvailListener* BufAvailListener();
+	void SubmitBuffer();
+	void DoUpdateBuffer(TInt aBufferId, const TTime& aTime, TUint32 aFastCounter);
+
+private:
+	MVideoRendererObserver& iObserver;
+	RSurfaceUpdateSession iSurfaceUpdateSession;
+	CRendererBufferManager* iBufManager; // not owned
+	CBufDisplayListener* iDisplayListener;
+	TDblQue<CBufAvailListener> iBufAvailListeners;
+	TDblQueIter<CBufAvailListener> iAvailListenersIter;
+	TSurfaceId iSurfaceId;
+	TBool iUpdateSubmitted;	// true if an update has been submitted
+	TInt iFastCounterFrequency;
+	TBool iFastCounterCountsUp;
+
+	CRendererTimer* iRendererTimer; // not owned, null in non-timed mode
+	TInt64 iDelay; // delay in microseconds
+	TInt64 iMaxDelay;
+	};
+	
+/** 
+Listener in main thread for observer callback so that callback is done in main thread.
+
+This class is needed so that callback to observer is done in the main thread 
+instead of the renderer thread in timed mode.
+*/
+NONSHARABLE_CLASS(CRendererCallbackListener) : public CActive
+	{
+public:
+	enum TFunctionCode
+		{
+		EBufferAvailable,
+		EBufferDisplayed,
+		EBufferSkipped
+		};
+
+	static CRendererCallbackListener* NewL(MVideoRendererObserver& aObserver, TInt aNumBuffer);
+	~CRendererCallbackListener();
+	void Start();
+	void SendCallback(TFunctionCode aFunctionCode, TInt aBufferId, const TTime& aTime);
+	void ExtendMsgQueueL(TInt aNumBuffer);
+
+private:
+	CRendererCallbackListener(MVideoRendererObserver& aObserver);
+	void ConstructL(TInt aNumBuffer);
+	
+	// From CActive
+	void RunL();
+	void DoCancel();
+
+private:
+
+	class TCallbackData
+		{
+	public:
+		TFunctionCode iFunctionCode;
+		TInt iBufferId;
+		TTime iTime;
+		};
+
+	MVideoRendererObserver& iObserver;
+	RMsgQueue<TCallbackData> iMsgQueue;
+	};
+	
+/** 
+Implemenation of MVideoRendererRelay. This class is responsible taking submit
+update request to the renderer thread in timed mode.
+*/
+NONSHARABLE_CLASS(CRendererThreadRelay) : public CActive, public MVideoRendererRelay, public MVideoRendererObserver
+	{
+public:
+	~CRendererThreadRelay();
+	static CRendererThreadRelay* NewL(MVideoRendererObserver& aObserver, TThreadId aMainThreadId);
+	
+	void Start();
+	void SignalSetupComplete(TRequestStatus* aSetupComplete);
+	TRequestStatus* Status();
+
+	// from MRendererRelay
+	void UpdateBuffer(TVideoFrameBuffer* aBuffer, const TTime& aPresentationTime, TRequestStatus* aRequestStatus);
+	void DestroySurface(TRequestStatus* aRequestStatus);
+	void SetBufferManager(CRendererBufferManager* aBufManager);
+	void PrepareL(const TSurfaceId& aSurfaceId, TInt aNumBuffers, TRequestStatus* aRequestStatus);
+	void SetRendererThread(RThread* aRendererThread);
+	void Terminate(TRequestStatus& aRequestStatus);
+	void SetTimerInfo(TInt64 aDefaultDelay, TInt64 aMaxDelay);
+	
+	// from MVideoRendererObserver
+	void MvroVideoBufferAvailable();
+	void MvroBufferDisplayed(TInt aBufferId, const TTime& aTime);
+	void MvroBufferSkipped(TInt aBufferId);
+
+private:
+	CRendererThreadRelay(MVideoRendererObserver& aObserver);
+	void ConstructL(TThreadId aMainThreadId);
+	void RunL();
+	void DoCancel();
+
+	void RunUpdateBuffer(TVideoFrameBuffer* aBuffer, const TTime& aPresentationTime);
+	void RunDestroySurface();
+	void RunPrepareL();
+	void RunSetBufferManager();
+	
+private:
+	enum TFunctionCode
+		{
+		ETermination,
+		ESubmitUpdate,
+		EDestroySurface,
+		EPrepare,
+		ESetBufferManager
+		};
+	
+	MVideoRendererObserver& iObserver;
+	RThread iMainThread;
+	CRendererRelay* iRendererRelay;
+	CRendererTimer* iRendererTimer;
+	CRendererCallbackListener* iRendererCallbackListener;
+	RThread* iRendererThread; //Not owned
+	CRendererBufferManager* iBufManager; // not owned
+	
+	TRequestStatus* iCallingStatus; // not owned
+	TFunctionCode iFunctionCode;
+	TVideoFrameBuffer* iBuffer; // parameter for UpdateBuffer
+	TTime iPresentationTime; // parameter for UpdateBuffer
+	TSurfaceId iSurfaceId; // parameter for PrepareL
+	TInt iNumBuffers; // parameter for PrepareL
+	TInt64 iMaxDelay;
+	};
+
+/** Internal class for passing parameter to renderer thread */
+class TThreadRelayParam
+	{
+public:
+	MVideoRendererObserver* iObserver; //Not owned
+	MVideoRendererRelay** iThreadRelay; //Not owned
+	TThreadId iMainThreadId;
+	TRequestStatus* iSetupComplete; //Not owned
+	};	
+
+#endif // RENDERERRELAY_H