diff -r 000000000000 -r ed9695c8bcbe vtengines/videoteleng/Inc/Media/CVtEngRemoteVideo.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtengines/videoteleng/Inc/Media/CVtEngRemoteVideo.h Mon Nov 23 14:47:47 2009 +0200 @@ -0,0 +1,441 @@ +/* +* Copyright (c) 2006 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: Remote video handling class. +* +*/ + + + +#ifndef CVTENGREMOTEVIDEO_H +#define CVTENGREMOTEVIDEO_H + +// INCLUDES +#include +#include +#include "MVtEngImageScaler.h" +#include "MVtEngDraw.h" +#include "TVtEngRendering.h" +#include "TVtEngRenderConfig.h" +#include +#include + +// FORWARD DECLARATIONS +class CDirectScreenAccess; +class CFbsBitmap; +class CVtEngStateManager; +class MVtEngScalerObserver; + +class TVtEngRenderingOptionsDSA; +class TVtEngRenderingOptionsDP; +class TVtEngRenderingOptionsNGA; + +// Define image sizes. +// QCIF. +const TInt KVtEngResolutionQCIFWidth = 176; +const TInt KVtEngResolutionQCIFHeight = 144; + +// SQCIF. +const TInt KVtEngResolutionSQCIFWidth = 128; +const TInt KVtEngResolutionSQCIFHeight = 96; + +// Default video screen width. +const TInt KVtEngRemoteVideoDefaultWidth = 176; + +// Default video screen height. +const TInt KVtEngRemoteVideoDefaultHeight = 144; + +// Watcher checks point time-out 400 ms. +const TInt KVtEngWatcherTimeout = 400000; + +// When the watcher has timed out 15 times without new frame, send event to UI. +const TInt KVtEngWatcherThreshold = 15; + +// CLASS DECLARATION + +/** +* Class handling remote video. +* +* @lib videoteleng.lib +* @since Series 60 2.6 +*/ +NONSHARABLE_CLASS( CVtEngRemoteVideo ) : + public CBase, + public MDisplaySinkObserver + { + public: // Constructors and destructor + + /** + * Two-phased constructor. + * @param aPv2Way a reference to PV instance. + * @param aStateManager reference to VT state manager + * @return instance of CVtEngRemoteVideo + */ + static CVtEngRemoteVideo* NewL( + MVtSessionCommand& aSessionCommand, + CVtEngStateManager& aStateManager ); + + /** + * Destructor. + */ + virtual ~CVtEngRemoteVideo(); + + public: // From MDisplaySinkObserver + + /** + * @see MDisplaySinkObserver + */ + void VideoFrameSizeChangedL( const TSize& aFrom, + const TSize& aTo ); + + public: // New functions + + /** + * Sets parameters used when rendering remote video. + */ + void SetRenderingParametersL( + const TVtEngRenderingOptionsNGA& aParams ); + + /** + * Sets parameters used when rendering remote video. + * @param aParams direct screen access parameters + */ + void SetRenderingParametersL( + const TVtEngRenderingOptionsDSA& aParams ); + + /** + * Sets parameters used when rendering remote video. + * @param aParams direct screen access parameters + */ + void SetRenderingParametersL( + const TVtEngRenderingOptionsDP& aParams ); + + /** + * Starts remote video rendering. + */ + void StartVideoL(); + + /** + * Stops remote video rendering. + */ + void StopVideoRendering(); + + /** + * Pauses remote video rendering. + * @return command id from PV + */ + TInt PauseVideoL(); + + /** + * Adds Display sink into PV. + * @param Video channel logical channel ID number. + * @return PV command ID + */ + TInt AddVideoSinkL( TInt aChannelId ); + + /** + * Adds Audio sink into PV. + * @param Audio channel logical channel ID number. + * @return PV command ID + */ + TInt AddAudioSinkL( TInt aChannelId ); + + /** + * Returns state of Direct Screen Access. + * @return state of Direct Screen Access + */ + TBool GetDsaState() const; + + /** + * Returns the audiosink of nested CVtEngDraw class. + * @return the audiosink of nested CVtEngDraw class + */ + MVTAudioSink* AudioSink(); + + /** + * Sets UI foreground state (i.e. is the Application + * current active application or not). + * @param aForeground ETrue if the VT application is + * in foreground, EFalse otherwise. + * @exception May leave with KErrNotReady. + */ + void SetUIForegroundL( TBool aForeground ); + + /** + * Request update last remote video frame through MVtEngFrameObserver::vtSetFrame + */ + void RequestLastFrame(); + + private: + + /** + * C++ constructor. + * @param aPv2Way a reference to PV instance + * @param aStateManager reference to VT state manager + */ + CVtEngRemoteVideo( + MVtSessionCommand& aSessionCommand, + CVtEngStateManager& aStateManager ); + + /** + * By default Symbian 2nd phase constructor is private. + */ + void ConstructL(); + + + public: + + /** + * Base rendering class + */ + NONSHARABLE_CLASS( CVtEngDraw ) : + public CActive, + public MVtEngDraw, + public MDirectScreenAccess + { + + protected: // new methods + /** + * C++ constructor as private. + * @param aObserver callback interface for Display Sink + */ + CVtEngDraw( MDisplaySinkObserver* aObserver ); + + /** + * Destructor + */ + ~CVtEngDraw(); + + /** + * By default Symbian 2nd phase constructor is private. + */ + void ConstructL(); + + /** + * If not active, set iStatus to KRequestPending and calls + * SetActive(); + */ + void Activate(); + + /** + * Creates DSA instance. + */ + void CreateAndStartDSAL(); + + public: // from MDirectScreenAccess + + /** + * From MDirectScreenAccess, this function is called by the + * window server when direct screen access must stop. + * @see MDirectScreenAccess::AbortNow + */ + virtual void AbortNow( + RDirectScreenAccess::TTerminationReasons aReason ); + + /** + * From MDirectScreenAccess, this method is called by the direct + * screen access instance as soon as direct screen access can + * resume. + * @see MDirectScreenAccess::Restart + */ + virtual void Restart( + RDirectScreenAccess::TTerminationReasons aReason ); + + public: // new functions + + /** + * Configuration was updated. + */ + void ConfigUpdatedL(); + + /** + * Display Sink pointer. + * @return instance of MDisplaySink + */ + MDisplaySink* DisplaySink(); + + /** + * Returns state of Direct Screen Access. + * @return true if rendering + */ + TBool GetDsaState() const; + + /** + * Checks frame watcher expiration. + * @param aAny pointer to CVtEngDrawDSA + * @return Symbian OS error code + */ + static TInt WatcherExpired( TAny* aAny ); + + /** + * Handles frame watcher expiration. + */ + void HandleWatcherExpired(); + + /** + * Sets certain flag on. + * @param aFlags flags to turn on. + */ + void SetFlag( TUint aFlags ); + + /** + * Clears certain flag. + * @param aFlags flags to clear. + */ + void ClearFlag( TUint aFlags ); + + /** + * Checks if certain flag is on. + * @param aFlags flags to check. + */ + TBool IsFlag( TUint aFlag ) const; + + /** + * Called by CVtEngRemoteVideo, when video sink is added + * to PV. + */ + void VideoSinkAdded(); + + private: // from CActive + + /** + * Handles active object cancellation. + * @see CActive::Cancel + */ + void DoCancel(); + + /** + * Handles active object execution errors. + * @see CActive::RunError + */ + TInt RunError( TInt aError ); + + protected: + + /** + * Defines if drawing can be done + * and if we have not received frames + * for some time and observer is notified + * (and no new frames since then). + */ + enum TFlags + { + // Start the rendering. + EStarted = ( 1 << 0 ), + // Ready by window server. + EReadyForeground = ( 1 << 1 ), + // Ready by internal state. + EReadyInternal = ( 1 << 2 ), + // Ready to draw. + EReady = EReadyInternal | EReadyForeground, + // Watcher expired because no frames received in time. + EFrameWatcherExpired= ( 1 << 3 ), + // First frame has been received. + EFirstFrameReceived = ( 1 << 4 ), + // Drawing ongoing flag + ERemoteVideoDrawing = ( 1 << 5 ), + // VT UI foreground status (if set, UI is foreground) + EFlagUIForeground = ( 1 << 6 ), + // Components have been initialized + EFlagInitialized = ( 1 << 7 ), + // VT UI has been sent to background + ESentToBackground = ( 1 << 8 ), + // Frame buffer contains data when this flag is set (DP,NGA) + EFrameBufferFilled = ( 1 << 9 ), + // BaseConstructL() call is pending (DP,NGA) + EBaseConstructCalled = ( 1 << 10 ), + // BaseSetConfigL() call is pending (DP,NGA) + EBaseSetConfigCalled = ( 1 << 11 ), + // BaseStartDrawL() call is pending (DP,NGA) + EBaseBaseStartDrawCalled = ( 1 << 12 ), + // UpdateSinkParamsL() needs to be called (DP,NGA) + ESinkParamUpdateRequired = ( 1 << 13 ), + // Sink().Resume() needs to be called (DP,NGA) + ESinkResumeRequired = ( 1 << 14 ), + // InitializePostingSurfaceL() call is pending (DP), CreateSurfaceL call is pending (NGA) + EInitializePostingSurfaceCalled = ( 1 << 15 ), + // New frame buffer is store, not coverted and scaled yet + EFrameBufferNeedsConvertAndScale = ( 1 << 16 ), + + // Bitmask for all pending calls (DP) + EDelayedCallsMask = EBaseConstructCalled | + EBaseSetConfigCalled | + EBaseBaseStartDrawCalled | + ESinkParamUpdateRequired | + EInitializePostingSurfaceCalled + }; + + protected : // data + + // Direct Screen Access. + CDirectScreenAccess* iDSA; + + // Display sink providing bitmaps. + MDisplaySink* iDisplaySink; + + // @see TFlags + TInt iFlags; + + // For checking if display sink stops feeding. + // drawer with bitmaps + CPeriodic* iWatcher; + + // to reduce watcher restarts do cancel it + // only every 15 frames + // Counter for frame expiration. + TInt iCheckpoint; + + // DisplaySink callback interface. + MDisplaySinkObserver* iObserver; + + // Frame watcher callback. + TCallBack iCallback; + + // Container class as a friend. + friend class CVtEngRemoteVideo; + + // Temporarily store image size when size changes on the fly. + TSize iSourceSize; + + // DisplaySink status boolean. + TBool iDSUpdated; + }; + + private: // Data + // Packet Video interface. + MVtSessionCommand& iSessionCommand; + + // State manager. + CVtEngStateManager& iStateManager; + + // Draws remote video with DSA. + CVtEngDraw* iDrawer; + + // Display sink. + MDisplaySink* iDisplaySink; + + // Audio sink interface. + MVTAudioSink* iAudioSink; + + // Information from PV regarding sink. + TInt iTrackId; + + // @see TFlags + TInt iStateFlags; + + TBool iEnableNGA; + }; + +#endif // CVTENGREMOTEVIDEO_H + +// End of File