diff -r 6c158198356e -r ae942d28ec0e javauis/mmapi_qt/baseline/inc.nga/cmmasurfacewindow.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/javauis/mmapi_qt/baseline/inc.nga/cmmasurfacewindow.h Tue Aug 31 15:09:22 2010 +0300 @@ -0,0 +1,364 @@ +/* +* Copyright (c) 2002-2007 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: This class implements MMMADisplayWindow functionality +* in graphics surface based displays for Helix engine. +* +*/ + +#ifndef CMMASURFACEWINDOW_H +#define CMMASURFACEWINDOW_H + + +// INCLUDES +#include +//#include +#include +#include +#include + +#include +#include +#include "mmmadisplaywindow.h" +#include "mmafunctionserver.h" +#include "cmmaplayer.h" +#include "cmmacanvasdisplay.h" + +// FORWARD DECLARATIONS +class RWsSession; +class CWsScreenDevice; +class RWindowBase; +class MMMADisplay; + +// CONSTANTS +const TInt KMMAVideoMinDimension = 32; // minimum video width and height + +// CLASS DECLARATION +/** +* This class implements MMMADisplayWindow functionality +* in video display to graphics surface based displays for Helix engine. +*/ +NONSHARABLE_CLASS(CMMASurfaceWindow): public CBase, + public MMMADisplayWindow/*, + public MUiEventConsumer*/ +{ +public: + /** + * indicates what method needs to be called in UI thread context. + */ + enum TUiCallbackType + { + ESetClipRect = 1, + ERemoveSurface, + ESetDrawRect, + EInitVideoDisplay, + EResetSurfaceParameters, + ESetChangedSurfaceParameters, + ECleanVideoDisplay, + EDestroyWindow, + EChangeVisibility + }; + +private: + /** + * indicates different video display initialization states + * + * video display state transition can happen in following order: + * 1. when MIDlet code is: + * Player player = Manager.createPlayer(..); + * player.realize(); + * VideoControl vc = (VideoControl)player.getControl("VideoControl"); + * vc.initDisplayMode(..); + * player.start(); + * + * EUIResourcesAndSurfaceParametersNotSet + * EUIResourcesSetAndSurfaceParametersNotSet + * EUIResourcesAndSurfaceParametersSet + * + * OR + * + * 2. when MIDlet code is: + * Player player = Manager.createPlayer(..); + * player.start(); + * VideoControl vc = (VideoControl)player.getControl("VideoControl"); + * vc.initDisplayMode(..); + * + * EUIResourcesAndSurfaceParametersNotSet + * ESurfaceParametersSetAndUIResourcesNotSet + * EUIResourcesAndSurfaceParametersSet + * + * InitVideoDisplayL() should be called only after EUIResourcesAndSurfaceParametersSet + * state is reached. ie both UI resources and surface parameters becomes available. + * + * 3. for below mentioned MIDlet code case: + * Player player = Manager.createPlayer(..); + * player.start(); // state transition is + * + * EUIResourcesAndSurfaceParametersNotSet + * ESurfaceParametersSetAndUIResourcesNotSet + * note that InitVideoDisplayL() is not called and video is not displayed in this case. + */ + enum TVideoDisplayInitState + { + /** + * indicates ui resources and surface parameters are not yet set. + * UI resources are RWindowBase, CWsScreenDevice and RWsSession. + * Surface parameters are TSurfaceId, TRect and TVideoAspectRatio. + */ + EUIResourcesAndSurfaceParametersNotSet = 1, + /** + * indicates UI resources are set and surface parameters not yet set. + * UI resources are set when initDisplayMode() is called and RWindow becomes available. + */ + EUIResourcesSetAndSurfaceParametersNotSet, + /** + * indicates UI resources are not yet set and surface parameters are set. + * Surface parameters are set when player.start() is called. + */ + ESurfaceParametersSetAndUIResourcesNotSet, + /** + * indicates UI resources and surface parameters are set. + */ + EUIResourcesAndSurfaceParametersSet + }; + +public: // Constructors and destructors + static CMMASurfaceWindow* NewL( + MMAFunctionServer* aEventSource, + CMMAPlayer* aPlayer); + + virtual ~CMMASurfaceWindow(); + +private: // Constructors and destructors + CMMASurfaceWindow( + MMAFunctionServer* aEventSource, + CMMAPlayer* aPlayer); + +public: // Methods derived from MMMADisplayWindow + void SetDestinationBitmapL(CFbsBitmap* aBitmap); + void DrawFrameL(const CFbsBitmap* aBitmap); + void SetDrawRect(const TRect& aRect); + void SetDrawRectThread(const TRect& aRect); + const TRect& DrawRect(); + TSize WindowSize(); + void SetPosition(const TPoint& aPosition); + void SetVisible(TBool aVisible, TBool aUseEventServer = ETrue); + void SetWindowRect(const TRect& aRect,MMMADisplay::TThreadType aThreadType); + void SetVideoCropRegion(const TRect& aRect); + void SetRWindowRect(const TRect& aRect, MMMADisplay::TThreadType aThreadType); + const TRect& WindowRect(); + void ContainerDestroyed(); + void ContainerSet(); + void DoSetVisibleL(); +/* +public: // from base class MUiEventConsumer + void MdcDSAResourcesCallback(RWsSession &aWs, + CWsScreenDevice &aScreenDevice, + RWindowBase &aWindow); + +*/ + void UICallback(TInt aCallbackId); + public: + virtual void ProcureWindowResourcesFromQWidget(RWsSession * aWs, + CWsScreenDevice* aScreenDevice, + RWindowBase* aWindow); + + +public: // New methods + TBool IsVisible() const; + void SetDisplay(MMMADisplay *aDisplay); + + /** + * copies surface paramaters and intializes video display if + * RWindow is already set, ie if intDisplayMode already called in midlet. + * invokes InitVideoDisplayL() in UI thread context. + * + * @params aSurfaceId, aCropRect, aPixelAspectRatio surface paramaters. + */ + void SetSurfaceParameters(const TSurfaceId& aSurfaceId, + const TRect& aCropRect, + const TVideoAspectRatio& aPixelAspectRatio); + + /** + * invokes DoRemoveSurface() in UI thread context. + */ + void RemoveSurface(); + + /** + * updates members variables with new surface parameters and invokes + * DoSetChangedSurfaceParameters() in UI thread context. + * + * @params aSurfaceId, aCropRect, aPixelAspectRatio surface paramaters. + */ + void SetChangedSurfaceParameters(const TSurfaceId& aSurfaceId, + const TRect& aCropRect, + const TVideoAspectRatio& aPixelAspectRatio); + +private: // New methods + /** + * starts video rendering to a graphics surface. + * restarts video rendering to a graphics surafce with changed parameters. + * This method must always be executed in UI-Thread context. + */ + void RedrawVideoL(); + + /** + * utility function to invoke RedrawVideoL() function with in a TRAP harness. + * + * @param aSurfaceWindow reference to CMMASurfaceWindow instance on which RedrawVideoL() + * has to be invoked + * @return TInt Symbian OS error code, KErrNone if no error + */ + static TInt StaticRedrawVideo(CMMASurfaceWindow& aSurfaceWindow); + + /** + * creates new instance of CMediaClientVideoDisplay and intializes it with + * surfaces and windows. + * This method must always be executed in UI-Thread context. + */ + void InitVideoDisplayL(); + + /** + * updates CMediaClientVideoDisplay with new RWindow rect value. + * This method must always be executed in UI-Thread context. + */ + TInt SetClipRect(); + + /** + * updates CMediaClientVideoDisplay instance with new surface parameters. + * This method must always be executed in UI-Thread context. + */ + void DoSetChangedSurfaceParameters(); + + /** + * resets CMediaClientVideoDisplay instance with new surface parameters. + * This method must always be executed in UI-Thread context. + */ + void DoResetSurfaceParameters(); + + /** + * Removes Surface from RWindow + * This method must always be executed in UI-Thread context. + */ + void DoRemoveSurface(); + + /** + * removes surfaces and windows from CMediaClientVideoDisplay instance + * and deletes the instance. + * This method must always be executed in UI-Thread context. + */ + void CleanVideoDisplay(); + + /** + * Deletes this object. + * + * @since S60 v5.2 + */ + void Destroy(); + +private: // Data + /** + * drawing area where video is rendered. + */ + TRect iContentRect; + + /** + * parent rectangle used for positioning contentRect. + */ + TRect iParentRect; + + /** + * Symbian RWindow rect + */ + TRect iRWindowRect; + + /** + * not owned, used for switching from UI thread to MMA thread + */ + MMAFunctionServer* iEventSource; + + /** + * We must depend on player's state because direct screen access may + * not be resumed before player is started. + * not owned. + */ + CMMAPlayer* iPlayer; + + /** + * crop rectangle of video + */ + TRect iVideoCropRegion; + + /** + * owned, used for video display on surface + * this instance is created & accessed in UI thread only. + */ + CMediaClientVideoDisplay* iMediaClientVideoDisplay; + + /** + * Display instance used to invoke UI callbacks. + * Not owned. + */ + MMMADisplay* iDisplay; + + /** + * Window server session used by UI thread. + * Adjustable and usable from UI thread only. + * Not owned. + */ + RWsSession* iWs; + + /** + * Screen device used by UI thread. + * Adjustable and usable from UI thread only. + * Not owned. + */ + CWsScreenDevice* iScreenDevice; + + /** + * Window where video is displayed. + * Adjustable and usable from UI thread only. + * From UI thread. + * Not owned. + */ + RWindowBase* iWindow; + + /** + * The surface to be created for composition. + */ + TSurfaceId iSurfaceId; + + /** + * The dimensions of the crop rectangle, relative to the video image. + */ + TRect iCropRect; + + /** + * The pixel aspect ratio to display video picture. + */ + TVideoAspectRatio iPixelAspectRatio; + + /** + * indicates the video display initialization state. + * + */ + TVideoDisplayInitState iVideoDisplayInitState; + + /** + * Indicates if content need to be drawn. + */ + TBool iVisible; + +}; + +#endif // CMMASURFACEWINDOW_H