mmlibs/mmfw/src/Client/Video/VideoPlayerBody.h
changeset 0 40261b775718
child 12 b74061f7f3d2
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mmlibs/mmfw/src/Client/Video/VideoPlayerBody.h	Tue Feb 02 01:56:55 2010 +0200
@@ -0,0 +1,368 @@
+// Copyright (c) 2002-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:
+//
+
+#ifndef VIDEOPLAYERBODY_H
+#define VIDEOPLAYERBODY_H
+
+#include <fbs.h>
+#include <w32std.h>
+
+#ifdef SYMBIAN_BUILD_GCE
+#include <mmf/common/mmfvideosurfacecustomcommands.h>
+#endif
+
+#include <mmf/common/mmfbase.h>
+#include <mmf/common/mmfcontroller.h>
+#include <mmf/common/mmfaudio.h>
+#include <mmf/common/mmfstandardcustomcommands.h>
+#include <mmf/common/mmfdrmcustomcommands.h>
+#include <mda/common/base.h>
+#include <mmf/common/mmfutilities.h>
+#include <mmf/common/mmfcontrollerframeworkbase.h>
+#include "mmf/common/mmcaf.h"
+#include "mmfclientutility.h"
+
+#ifdef SYMBIAN_MULTIMEDIA_SUBTITLE_SUPPORT
+#include "mmfsubtitleutility.h"
+#endif //SYMBIAN_MULTIMEDIA_SUBTITLE_SUPPORT
+
+#ifdef SYMBIAN_BUILD_GCE
+#include "mediaclientvideodisplaybody.h"
+#endif
+
+class CMMFVideoPlayerCallback;
+class MMMFDRMCustomCommand;
+class CVideoPlayerUtility;
+class MMMFSurfaceEventHandler;
+#ifdef SYMBIAN_BUILD_GCE
+	class TWindowData;
+	class CMediaClientVideoDisplayBody;
+#endif // SYMBIAN_BUILD_GCE
+NONSHARABLE_CLASS( CVideoPlayerUtility::CBody ): public CBase, 
+								   				 public MDirectScreenAccess, 
+								   				 public MMMFControllerEventMonitorObserver,
+								   				 public MMMFFindAndOpenControllerObserver
+
+	{
+
+public:
+	~CBody();
+
+	static CBody* NewL(CVideoPlayerUtility* aParent,
+					   MVideoPlayerUtilityObserver& aObserver,
+					   TInt aPriority,
+					   TInt aPref,
+					   RWsSession& aWs,
+					   CWsScreenDevice& aScreenDevice,
+					   RWindowBase& aWindow,
+					   const TRect& aScreenRect,
+					   const TRect& aClipRect);
+
+#ifdef SYMBIAN_BUILD_GCE
+	static CBody* NewL(CVideoPlayerUtility2* aParent,
+					   MVideoPlayerUtilityObserver& aObserver,
+					   TInt aPriority,
+					   TInt aPref);
+#endif
+	void OpenFileL(const TDesC& aFileName,TUid aControllerUid = KNullUid);
+	void OpenFileL(const RFile& aFile, TUid aControllerUid = KNullUid);
+
+
+	void OpenFileL(const TMMSource& aSource, TUid aControllerUid = KNullUid);
+
+	void OpenDesL(const TDesC8& aDescriptor,TUid aControllerUid = KNullUid);
+	void OpenUrlL(const TDesC& aUrl, TInt aIapId, const TDesC8& aMimeType=KNullDesC8, TUid aControllerUid = KNullUid);
+
+	void Prepare();
+
+	void Close();
+
+	void Play();
+	void Play(const TTimeIntervalMicroSeconds& aStartPoint, const TTimeIntervalMicroSeconds& aEndPoint);
+	TInt Stop();
+	void PauseL();
+
+	void SetPriorityL(TInt aPriority, TInt aPref);
+	void PriorityL(TInt& aPriority, TMdaPriorityPreference& aPref) const;
+
+	void SetDisplayWindowL(RWsSession& aWs, CWsScreenDevice& aScreenDevice, RWindowBase& aWindow,
+						   const TRect& aScreenRect, const TRect& aClipRect);
+
+	void RegisterForVideoLoadingNotification(MVideoLoadingObserver& aObserver);
+
+	void GetFrameL(TDisplayMode aDisplayMode, TBool aUseIntentAPI = EFalse, ContentAccess::TIntent aIntent = ContentAccess::EPeek );
+	void RefreshFrameL();
+
+	TReal32 VideoFrameRateL() const;
+	void VideoFrameSizeL(TSize& aSize) const;
+	const TDesC8& VideoFormatMimeType() const;
+	TInt VideoBitRateL() const;
+
+	TInt AudioBitRateL() const;
+	TFourCC AudioTypeL() const;
+	TBool AudioEnabledL() const;
+
+	void SetPositionL(const TTimeIntervalMicroSeconds& aPosition);
+	TTimeIntervalMicroSeconds PositionL() const;
+	TTimeIntervalMicroSeconds DurationL() const;
+
+	void SetVolumeL(TInt aVolume);
+	TInt Volume() const;
+	TInt MaxVolume() const;
+	void SetBalanceL(TInt aBalance);
+	TInt Balance()const;
+
+	void SetRotationL(TVideoRotation aRotation);
+	TVideoRotation RotationL() const;
+	void SetScaleFactorL(TReal32 aWidthPercentage, TReal32 aHeightPercentage, TBool aAntiAliasFiltering);
+	void GetScaleFactorL(TReal32& aWidthPercentage, TReal32& aHeightPercentage, TBool& aAntiAliasFiltering) const;
+	void SetCropRegionL(const TRect& aCropRegion);
+	void GetCropRegionL(TRect& aCropRegion) const;
+
+	TInt NumberOfMetaDataEntriesL() const;
+	CMMFMetaDataEntry* MetaDataEntryL(TInt aIndex) const;
+	
+	void GetVideoLoadingProgressL(TInt& aPercentageProgress);
+	TInt CustomCommandSync(const TMMFMessageDestinationPckg& aDestination, TInt aFunction, const TDesC8& aDataTo1, const TDesC8& aDataTo2, TDes8& aDataFrom);
+	TInt CustomCommandSync(const TMMFMessageDestinationPckg& aDestination, TInt aFunction, const TDesC8& aDataTo1, const TDesC8& aDataTo2);
+	void CustomCommandAsync(const TMMFMessageDestinationPckg& aDestination, TInt aFunction, const TDesC8& aDataTo1, const TDesC8& aDataTo2, TDes8& aDataFrom, TRequestStatus& aStatus);
+	void CustomCommandAsync(const TMMFMessageDestinationPckg& aDestination, TInt aFunction, const TDesC8& aDataTo1, const TDesC8& aDataTo2, TRequestStatus& aStatus);
+	
+	void SetVideoFrameRateL(TReal32 aFramesPerSecond);
+	const CMMFControllerImplementationInformation& ControllerImplementationInformationL();
+
+	MMMFDRMCustomCommand* GetDRMCustomCommand();
+
+	void StopDirectScreenAccessL();
+	void StartDirectScreenAccessL();
+	
+	TInt RegisterAudioResourceNotification(MMMFAudioResourceNotificationCallback& aCallback, TUid aNotificationEventUid, const TDesC8& aNotificationRegistrationData = KNullDesC8);
+	TInt CancelRegisterAudioResourceNotification(TUid aNotificationEventId);
+	TInt WillResumePlay();
+
+	TInt SetInitScreenNumber(TInt aScreenNumber);
+
+    void SetPlayVelocityL(TInt aVelocity);
+    TInt PlayVelocityL() const;
+    void StepFrameL(TInt aStep);
+    void GetPlayRateCapabilitiesL(TVideoPlayRateCapabilities& aCapabilities) const;
+    void SetVideoEnabledL(TBool aVideoEnabled);
+    TBool VideoEnabledL() const;
+    void SetAudioEnabledL(TBool aAudioEnabled);
+    void SetAutoScaleL(TAutoScaleType aScaleType);
+    void SetAutoScaleL(TAutoScaleType aScaleType, TInt aHorizPos, TInt aVertPos);
+		
+#ifdef SYMBIAN_BUILD_GCE
+	void AddDisplayWindowL(RWsSession& aWs, CWsScreenDevice& aScreenDevice, 
+							RWindow& aWindow, const TRect& aVideoExtent, 
+							const TRect& aWindowClipRect);
+	void AddDisplayWindowL(RWsSession& aWs, CWsScreenDevice& aScreenDevice, RWindow& aWindow);
+ 	void RemoveDisplayWindow(RWindowBase& aWindow);	
+ 	void SetVideoExtentL(const RWindowBase& aWindow, const TRect& aVideoExtent);	
+	void SetWindowClipRectL(const RWindowBase& aWindow, const TRect& aWindowClipRect);
+    
+   	void SetAutoScaleL(const RWindowBase& aWindow, TAutoScaleType aScaleType);
+    void SetAutoScaleL(const RWindowBase& aWindow, TAutoScaleType aScaleType, TInt aHorizPos, TInt aVertPos);
+
+	void SetRotationL(const RWindowBase& aWindow, TVideoRotation aRotation);
+	TVideoRotation RotationL(const RWindowBase& aWindow) const;
+	void SetScaleFactorL(const RWindowBase& aWindow, TReal32 aWidthPercentage, TReal32 aHeightPercentage);
+	void GetScaleFactorL(const RWindowBase& aWindow, TReal32& aWidthPercentage, TReal32& aHeightPercentage) const;
+	void AddDisplayL(TInt aDisplay, MMMFSurfaceEventHandler& aEventHandler);
+	void RemoveDisplay(TInt aDisplay);
+	void ConvertFromRelativeToDisplayToRelativeToWindow(
+	        const RWindowBase& aWindow,
+	        const TRect& aFromWindowRect,
+	        const TRect& aFromClipRect,
+	        TRect& aToWindowRect,
+	        TRect& aToClipRect);
+	void SetExternalDisplaySwitchingL(TInt aDisplay, TBool aControl);
+#endif
+
+#ifdef SYMBIAN_MULTIMEDIA_SUBTITLE_SUPPORT
+	TBool SubtitlesAvailable();
+	void EnableSubtitlesL();
+	void DisableSubtitles();
+	TArray<TLanguage> SupportedSubtitleLanguagesL();
+	TLanguage SubtitleLanguageL();
+	void SetSubtitleLanguageL(TLanguage aLanguage);
+	void RedrawSubtitle(RWindow& aWindow, const TRect &aRect);
+	static RWindow* FindWindowWithWsHandle(const RPointerArray<CMediaClientVideoDisplayBody>& aDisplays, TInt aWsHandle);
+	TInt EnableSubtitles(CMediaClientVideoDisplayBody& aDisplay);
+	TInt AddSubtitleConfig(CMediaClientVideoDisplayBody::TWindowData& aWindowData);
+	void GetSubtitleConfigFromWindowData(CMediaClientVideoDisplayBody::TWindowData& aWindowData, TMMFSubtitleWindowConfig& aConfig);
+	void UpdateSurfaceAndSubtitleConfigL(CMediaClientVideoDisplayBody& aDisplay,CMediaClientVideoDisplayBody::TWindowData& aWindowData, const TRect& aClipRect, TVideoRotation aRotation, const TRect& aCropRegion);
+#endif //SYMBIAN_MULTIMEDIA_SUBTITLE_SUPPORT
+
+private:
+	void ConstructL(RWsSession& aWs, CWsScreenDevice& aScreenDevice, RWindowBase& aWindow,
+					const TRect& aWindowRect, const TRect& aClipRect);
+	CBody(CVideoPlayerUtility* aParent,
+		  MVideoPlayerUtilityObserver& aObserver,
+		  TInt aScreenNumber,
+		  TInt aPriority=EMdaPriorityNormal,
+		  TInt aPref=EMdaPriorityPreferenceTimeAndQuality);
+
+	void CommonConstructL();
+	void SetAndUpdateWindow();
+	void PrepareDSAL(RWsSession& aWs, CWsScreenDevice& aScreenDevice, RWindowBase& aWindow);
+
+#ifdef SYMBIAN_BUILD_GCE	
+	CBody(CVideoPlayerUtility2* aParent,
+		  MVideoPlayerUtilityObserver& aObserver,
+		  TInt aPriority=EMdaPriorityNormal,
+		  TInt aPref=EMdaPriorityPreferenceTimeAndQuality);
+
+	void ConstructL();
+	TInt CheckSurfaceSupported();
+	TBool RectContains(const TRect& aLeft, const TRect& aRight);
+	void DoAddDisplayWindowL(RWsSession& aWs, TInt aDisplay, RWindowBase& aWindow,
+								const TRect& aClipRect, const TRect& aVideoExtent, RWindow* aWindow2);
+	TInt SurfaceCreated();
+	TInt SurfaceParametersChanged();
+	TInt SetBackgroundSurface(const CMediaClientVideoDisplayBody& aDisplay);
+	TInt RemoveSurface(TBool aControllerEvent);
+	TInt SetAllBackgroundSurfaces();
+
+#endif // SYMBIAN_BUILD_GCE
+	
+	// from MMMFControllerEventMonitorObserver
+	virtual void HandleEvent(const TMMFEvent& aEvent);
+
+	//from MDirectScreenAccess
+	virtual void AbortNow(RDirectScreenAccess::TTerminationReasons aReason);
+	virtual void Restart(RDirectScreenAccess::TTerminationReasons aReason);
+
+	// from MMMFFindAndOpenControllerObserver 
+	virtual void MfaocComplete(
+		TInt& aError, 
+		RMMFController* aController, 
+		TUid aControllerUid, 
+		TMMFMessageDestination* aSourceHandle, 
+		TMMFMessageDestination* aSinkHandle);
+
+
+	void OpenComplete(TInt aError);
+	void FrameReady(TInt aError);
+	void PlayComplete(TInt aError);
+	void Reset();
+
+private:
+	//Source and sink handle info
+	TMMFMessageDestination iSourceHandle;
+	TMMFMessageDestination iSinkHandle;
+
+	RMMFController iController;
+	RMMFVideoControllerCustomCommands iVideoControllerCustomCommands;
+	RMMFVideoPlayControllerCustomCommands iVideoPlayControllerCustomCommands;
+	RMMFAudioPlayDeviceCustomCommands iAudioPlayDeviceCustomCommands;
+	RMMFAudioRecordDeviceCustomCommands iAudioRecordDeviceCustomCommands;
+	RMMFVideoDRMExtCustomCommands iVideoDRMExtCustomCommands;
+	RMMFDRMCustomCommands iDRMCustomCommands;
+	RMMFVideoPlayControllerExtCustomCommands iVideoPlayControllerExtCustomCommands;
+	RMMFResourceNotificationCustomCommands iNotificationRegistrationCommands;
+	MMMFAudioResourceNotificationCallback* iAudioResourceNotificationCallBack;
+#ifdef SYMBIAN_BUILD_GCE
+	RMMFVideoPlaySurfaceSupportCustomCommands iVideoPlaySurfaceSupportCustomCommands;
+#endif	
+	//for audio resource notification
+	TUid iArnEventHolder;
+	TBuf8<TMMFAudioConfig::KNotificationDataBufferSize> iNotificationDataHolder;
+	
+	RMMFVideoSetInitScreenCustomCommands iVideoSetInitScreenCustomCommands;
+	MVideoPlayerUtilityObserver& iObserver;
+	CMMFControllerEventMonitor* iControllerEventMonitor;
+	CVideoPlayerUtility::TMMFVideoPlayerState iState;
+	TTimeIntervalMicroSeconds iDuration;
+	TMMFPrioritySettings iPrioritySettings;
+	
+	MVideoLoadingObserver *iVideoLoadingObserver;
+	CDirectScreenAccess * iDirectScreenAccess;
+	HBufC8* iMimeType;
+	CMMFVideoPlayerCallback* iAsyncCallback;
+	CMMFVideoPlayerCallback* iFrameCallback;
+	CMMFControllerImplementationInformation* iControllerImplementationInformation;
+	TUid iControllerUid;
+
+	CVideoPlayerUtility* iParent;
+	CFbsBitmap* iFrameBitmap;
+	RFbsSession iFbsSession;
+
+	TRect iWindowRect;
+	TRect iClipRect;
+	TBool iControllerOpen;
+	TBool iFbsSessionConnected;
+
+	// utility class to find and open a suitable controller asynchronously
+	CMMFFindAndOpenController* iFindAndOpenController;
+
+	// received a KMMFEventCategoryVideoOpenComplete event
+	TBool iEventOpenReceived;
+	
+	// received a MfaocComplete() callback
+	TBool iCallbackOpenReceived;
+	
+	TInt iOpenError;
+	TInt iScreenNumber;
+
+	// flag indicating DSA abort in StopDirectScreenAccess() - to be used in SetDisplayWindowL
+	TBool iDirectScreenAccessAbort;	
+		
+#ifdef SYMBIAN_BUILD_GCE
+
+	TSurfaceId iSurfaceId;
+	
+	//video graphics surface supported
+	TBool iGraphicsSurfaceSupported;
+	TBool iUsingVPU2;
+			
+	// store scale factor
+	TReal32 iGlobalScaleWidth;
+	TReal32 iGlobalScaleHeight;
+	TBool iAntiAliasFiltering;
+	TRect iCropRegion;
+	TVideoRotation iGlobalRotation;
+	TRect iSurfaceCropRect;
+	TVideoAspectRatio iAspectRatio;
+	// for storing window added during NewL,
+	// i.e. DSA
+	RWsSession* iWs;
+	TInt iDisplayId;
+	RWindowBase* iWindow;
+			
+	RPointerArray<CMediaClientVideoDisplayBody> iActiveDisplays;
+
+	// Autoscale info
+	TAutoScaleType iGlobalAutoScaleType;
+	TInt iGlobalHorizPos;
+	TInt iGlobalVertPos;
+#endif // SYMBIAN_BUILD_GCE
+
+#ifdef SYMBIAN_MULTIMEDIA_SUBTITLE_SUPPORT
+	CMMFSubtitleUtility* iSubtitleUtility;
+#endif //SYMBIAN_MULTIMEDIA_SUBTITLE_SUPPORT
+
+	friend class CMMFVideoPlayerCallback;
+	friend class CTestStepUnitMMFVidClient;
+	friend class CTestView;
+	friend class CVideoPlayerUtility;
+	
+#ifdef SYMBIAN_BUILD_GCE
+	friend class CVideoPlayerUtility2;
+#endif
+	};
+
+
+#endif // VIDEOPLAYERBODY_H