vtengines/videoteleng/Inc/Media/CVtEngLocalVideo.h
changeset 0 ed9695c8bcbe
child 24 f15ac8e65a02
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/vtengines/videoteleng/Inc/Media/CVtEngLocalVideo.h	Mon Nov 23 14:47:47 2009 +0200
@@ -0,0 +1,1475 @@
+/*
+* Copyright (c) 2004-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:  Local video handler.
+*
+*/
+
+
+#ifndef CVTENGLOCALVIDEO_H
+#define CVTENGLOCALVIDEO_H
+
+//  INCLUDES
+#include <e32base.h>
+#include <capivideosource.h>
+#include "TVtEngRendering.h"
+#include "TVtEngRenderingDSA.h"
+#include "TVtEngRenderingDP.h"
+#include "TVtEngRenderingNGA.h"
+#include "VtEngEvents.h"
+#include "MVtEngMedia.h" //TMediaSource
+#include "MVtEngSettingPSObserver.h"
+#include "CVTEngPubSubsListener.h"
+#include "mvtengcamerapreferencesobserver.h"
+
+// FORWARD DECLARATIONS
+class CVSDataProvider;
+class CVtEngMediaHandler;
+class CVtEngCameraPreferences;
+
+// CLASS DECLARATION
+
+/**
+*  Local (uplink) video handling.
+*
+*  @lib videoteleng.lib
+*  @since Series 60 2.6
+*/
+NONSHARABLE_CLASS( CVtEngLocalVideo ) :
+    public CActive,
+    public MVSDataProviderObserver,
+    public MVSDataSourceObserver,
+    public MVSControllerObserver,
+	public MVtEngSettingPSObserver
+    {
+    public:  // Constructors and destructor
+
+        /**
+        * Symbian two-phase constructor.
+        * @param aObserver callback interface to Media Handler
+        * @return local video instance
+        */
+        static CVtEngLocalVideo* NewL(
+            CVtEngMediaHandler& aObserver );
+
+        /**
+        * Destructor.
+        */
+        virtual ~CVtEngLocalVideo();
+
+    public: // Public data structures
+        enum TVtEngProviderType
+            {
+            KVtEngProviderUndefined  = -1,
+            /** Blank imnage provider */
+            KVtEngProviderNone       = 0,
+            /** Primary camera provider */
+            KVtEngProviderCam1,
+            /** Secondary camera provider */
+            KVtEngProviderCam2,
+            /** GS image provider */
+            KVtEngProviderImage,
+            /** ? */
+            KVtEngProviderTempImage,
+            /** Still share provider */
+            KVtEngProviderShareImage,
+            /** Video share provider */
+            KVtEngProviderShareVideoClip,
+            /** Default image provider */
+            KVtEngProviderDefaultStillImage
+            };
+
+    public: // from MVSDataProviderObserver
+
+        /**
+        * @see MVSDataProviderObserver::vsProviderError
+        */
+        virtual void vsProviderError( TInt aError );
+
+        /**
+        * @see MVSDataProviderObserver::vsProviderReady
+        */
+        virtual void vsProviderReady();
+
+        /**
+        * @see MVSDataProviderObserver::vsViewFinderFrameReady
+        */
+        virtual void vsViewFinderFrameReady( CFbsBitmap& aFrame );
+
+    public: // from MVSDataSourceObserver
+
+        /**
+        * @see MVSDataSourceObserver::vsProviderSwitchDone
+        */
+        virtual void vsProviderSwitchDone( CVSDataProvider* aOldProvider );
+
+    public: // from MVSControllerObserver
+
+        /**
+        * @see MVSControllerObserver::vsProvidersChanged
+        */
+        void vsProvidersChanged( TBool aAttached );
+
+    public: // From MVtEngSettingPSObserver.
+
+        /** @see MVtEngSettingPSObserver */
+        virtual void HandleNotifyPSL( const TUid aUid,
+                const TInt& aKey, const TRequestStatus& aStatus );
+
+    public:  // New functions
+
+        /**
+        * Pauses frame sending from video source (this method is called when
+        * VT is initializing and video source has not yet been added to stack)
+        *
+        */
+        void PauseVideoSending();
+
+        /**
+        * Resumes frame sending from video source.
+        *
+        */
+        void ResumeVideoSending();
+
+        /**
+        * Tells if the provider has started viewfinder.
+        * @return ETrue if started
+        */
+        TBool ViewFinderStarted() const;
+
+        /**
+        * Tells if the provider has been frozen.
+        * @return ETrue if frozen
+        */
+        TBool IsFrozen() const;
+
+        /**
+        * Creates an audio source.
+        * @return an error code
+        */
+        TInt CreateAudioSource();
+
+        /**
+        * Sets configuration for view finder.
+        * @param aParams view finder configuration
+        */
+        void SetViewFinderParameters( const TVtEngRenderingOptions& aParams );
+
+        /**
+        * Sets DSA configuration for view finder.
+        * @param aDSA DSA configuration
+        */
+        void SetViewFinderParameters( const TVtEngRenderingOptionsDSA& aDSA );
+
+        /**
+        * Sets DP configuration for view finder.
+        * @param aDP DP configuration
+        */
+        void SetViewFinderParameters( const TVtEngRenderingOptionsDP& aDP );
+
+        /**
+        * Sets default still image.
+        */
+        void SetDefaultStillImageL();
+
+        /**
+        * Sets still image or none.
+        * @param aSetAsActive sets as active provider
+        */
+        void SetStillImageL( TBool aSetAsActive );
+
+        /**
+        * Initializes default blank provider.
+        */
+        void InitializeL();
+
+        /**
+        * Selects camera1, camera2, still image or none as source.
+        * @param aSource video source
+        * @return ETrue if selecting started
+        */
+        TBool SelectSourceL( TVtEngProviderType aSource );
+
+        /**
+        * Returns currently active video provider.
+        * @return provider type
+        */
+        TVtEngProviderType ActiveProvider( ) const;
+
+        /**
+        * Starts view finder if it was started earlier and current state is
+        * ELocReady.
+        */
+        void StartViewFinderIfWasStartedL();
+
+        /**
+        * Starts view finder. Uses either DSA or WS depending on
+        * which configuration is active.
+        * @param aClientRequest request issued by user
+        */
+        void StartViewFinderL( TBool aClientRequest = EFalse );
+
+        /**
+        * Stops view finder.
+        * @param aClientRequest request issued by user
+        */
+        void StopViewFinder( TBool aClientRequest = EFalse );
+
+        /**
+        * Freeze video sending (i.e. start sending last frame only).
+        */
+        void FreezeL();
+
+        /**
+        * Unfreeze video sending (i.e. resume sending).
+        */
+        void UnfreezeL();
+
+        /**
+        * Checks that all other providers don't have
+        * view finder active and stops if found.
+        * @param aProvider provider that should not be stopped
+        */
+        void CheckOthersStopped( const CVSDataProvider& aProvider );
+
+        /**
+        * Returns video source.
+        * @return video source
+        */
+        MVTVideoSource* Source() const;
+
+        /**
+        * Returns audio source.
+        * @return audio source
+        */
+        MVTAudioSource* AudioSource() const;
+
+        /**
+        * Gets media state.
+        * @param aActiveMedia returns active TMediaType
+        * @return Symbian OS error code
+        */
+        TInt GetMediaState( TInt& aActiveMedia );
+
+        /**
+        * Gets source type.
+        * @return media source type
+        */
+        MVtEngMedia::TMediaSource GetMediaSource();
+
+        /**
+        * Gets source capabilities.
+        * @param aCaps capability of providers
+        * @return Symbian OS error code
+        */
+        TInt GetSourceCaps( TInt& aCaps );
+
+        /**
+        * Sets boolean to indicate if the provider is to be initialized only.
+        * Selected camera is not necessary activated. If current media is
+        * other than camera, initialization can be done on the background.
+        * @param aInitOnly boolean value stating if to initialize only
+        */
+        void InitializeOnly( TBool aInitOnly = ETrue );
+
+        /**
+        * Sets boolean to indicate if the provider is to be initialized only.
+        * @param aInitOnly boolean value stating if to initialize only
+        */
+        void InitializeOnlyEx( TBool aInitOnly = ETrue );
+
+        /**
+        * Indicates if camera provider is initialized.
+        * @param aId provider ID
+        * @param aInitialized
+        * @return Symbian OS error code
+        */
+        TInt IsInitialized( MVtEngMedia::TCameraId aId, TBool& aInitialized );
+
+        /**
+        * Gets camera info.
+        * @param TCameraId camera ID
+        * @param aInfo camera info
+        * @return Symbian OS error code
+        */
+        TInt GetCameraInfo( MVtEngMedia::TCameraId aId,
+            MVtEngMedia::TCameraInfo& aInfo );
+
+        /**
+        * Gets current digital zoom step (Factor in VS camera terminology).
+        * @param aCurrentStep current zoom step
+        * @return Symbian OS error code
+        */
+        TInt GetDigitalZoomFactor( TInt& aCurrentStep );
+
+        /**
+        * Gets maximum digital zoom value that may be passed to camera.
+        * @param aMaxZoomStep maximum zoom step
+        * @return Symbian OS error code
+        */
+        TInt GetMaxDigitalZoomStep( TInt& aMaxZoomStep );
+
+        /**
+        * Gets number of major zoom level leaps.
+        * One to maximum digital zoom steps plus one.
+        * Less than or equal to maximum digital zoom steps plus one.
+        * @param aCount number of leaps
+        * @param aProviderSupplied use original or mapped
+        * @return Symbian OS error code
+        */
+        TInt GetMajorDigitalZoomStepCount( TInt& aCount,
+            TBool aProviderSupplied = EFalse );
+
+        /**
+        * Maps major zoom leap step to corresponding step index.
+        * @param aIndex major zoom step
+        * @param aStep zoom step
+        */
+        void GetMajorDigitalZoomStep( const TInt aIndex, TInt& aStep );
+
+        /**
+        * Sets video provider's digital zoom step.
+        * @param aDigitalZoomFactor step
+        */
+        void SetDigitalZoomFactorL( TInt aDigitalZoomFactor );
+
+        /**
+        * Gets video provider's freeze support.
+        * @param aFreezeSupported Freeze support status
+        * @return KErrNotReady if provider not initialized.
+        */
+        TInt GetFreezeSupported( TBool& aFreezeSupported ) const;
+
+        /**
+        * Returns ETrue if it is ok to freeze provider.
+        */
+        TBool OkToFreeze() const;
+
+        /**
+        * Returns ETrue if it is ok to unfreeze provider.
+        */
+        TBool OkToUnfreeze() const;
+
+        /**
+        * Sets audio as muted.
+        */
+        void Mute();
+
+        /**
+        * Resumes audio output.
+        */
+        void UnMute();
+
+        /**
+        * 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.
+        */
+        void SetUIForeground( TBool aForeground );
+
+        /**
+        * Gets current media object sharing state. Only local video related
+        * checks do here. Connection issues have been checked by
+        * the caller.
+        * @param aObjectSharingState On return contains current media object
+        * sharing state. @see MVtEngMedia::TShareObjectState.
+        */
+        void GetObjectSharingState(
+            MVtEngMedia::TShareObjectState& aObjectSharingState ) const;
+
+        /**
+        * Start Image sharing initialization.
+        */
+        void InitializeShareImageL(
+            const MVtEngMedia::TShareObjectImageParameters& aParameters,
+            TBool& aFirstTime );
+
+        /**
+        * Cancel Image sharing initialization.
+        */        
+        void CancelInitializeShareImage();
+
+        /**
+        * Start Image sharing.
+        */
+        void StartShareImageL();
+
+        /**
+        * Stop Image sharing.
+        */
+        void StopShareImageL();
+
+        /**
+        * Report error.
+        */
+        void ShareError( TInt aError );
+
+        /**
+        * Returns share's stored media source.
+        */
+        TVtEngProviderType ShareStoredSource() const;
+
+        /**
+        * General settings changed.
+        */
+        void SettingsChanged();
+
+        /**
+        * Creates camera preferences extension
+        * @since S60 v3.2
+        * @return pointer to extension
+        * @exeption Leaves if creation fails
+        */
+        CVtEngCameraPreferences* CreateCameraPreferencesL();
+
+        /**
+        * Called when prepare camera has been handled in media handler.
+        */
+        void SetIsPrepareCameraCalled( TBool aCalled );
+
+        /**
+        * Returns ETrue if prepare camera has been handled in media handler,
+        * EFalse otherwise.
+        */
+        TBool IsPrepareCameraCalled() const;
+
+        /**
+        * Reinitializes camera if onboard camera is being used as a provider.
+        */
+        void HandleLayoutChangeL();
+
+        /**
+        * Returns ETrue if delayed select is pending.
+        */
+        TBool IsDelayedSelectPending() const;
+
+        /**
+        * Completes operation to mediahandler.
+        */
+        void CompleteOperation( const TInt aResult );
+
+        /**
+        * Called when video channel is opened.
+        */
+        void VideoChannelOpenedL();
+
+     private: // constructors
+
+        /**
+        * C++ constructor.
+        * @param aObserver callback interface to Media Handler
+        */
+        CVtEngLocalVideo(
+            CVtEngMediaHandler& aObserver );
+
+        /**
+        * By default Symbian 2nd phase constructor is private.
+        */
+        void ConstructL( );
+
+        /**
+        * Async callback method
+        */
+        static TInt CallBackFunc( TAny* aPtr );
+
+        /**
+        * Returns result.
+        */
+        TInt Result() const;
+
+        /**
+        * Sets result.
+        */
+        void SetResult( const TInt aResult );
+
+    private:  // Rendering configuration
+
+        /**
+        * Options for window server rendering.
+        *   iObserver callback interface
+        *   iSize VF image size
+        */
+        struct TOptions
+            {
+            MVtEngFrameObserver* iObserver;
+            TSize iSize;
+            };
+
+        /**
+        * Direct screen access options.
+        *   iWsSession windor server session
+        *   iWsSD screen device
+        *   iWindow handle to server based window
+        *   iRect iRect window size
+        *   iClipRect drawing size
+        */
+        struct TDsaOptions
+            {
+            RWsSession*      iWs;
+            CWsScreenDevice* iWsSD;
+            RWindowBase*     iWindow;
+            TRect            iRect;
+            TRect            iClipRect;
+            };
+
+        /**
+        * Internal state of a video provider.
+        */
+        enum TProviderState
+            {
+            /** initial state */
+            EUndefined = KErrNone,
+            /** never deleted */
+            EPermanent,
+            /** to be deleted when another provider selected */
+            EFading,
+            /** waiting for blank provider switch */
+            EWaiting,
+            /** changing still image */
+            ERefreshing
+            };
+
+        /**
+        * Provider information.
+        */
+        NONSHARABLE_CLASS( TProviderItem ) :
+            public MVtEngCameraPreferencesObserver
+            {
+            public:
+
+                /**
+                * C++ constructor
+                */
+                TProviderItem();
+
+                /**
+                * Destructor
+                */
+                ~TProviderItem();
+
+                /**
+                * Sets zoom factor to resetted state.
+                */
+                void ResetStoredValues();
+
+                /**
+                * Tries to restore preferences.
+                */
+                TInt RestoreZoomFactor();
+
+                /**
+                * Tries to restore preferences.
+                */
+                TInt RestorePreferences();
+
+            public:
+                // pointer to provider
+                CVSDataProvider*   iProvider;
+
+                // provider type
+                TVtEngProviderType iType;
+
+                // provider initialized
+                TBool              iInitialized;
+
+                // provider has errors
+                TInt               iErrorCode;
+
+                // state of a provider
+                TProviderState     iProviderState;
+
+                // Stored zoom value
+                TInt               iStoredZoomFactor;
+
+                // Error code setting zoom factor
+                TInt iZFErr;
+
+            public: // MVtEngCameraPreferencesObserver
+
+                /**
+                * @see MVtEngCameraPreferencesObserver::Attach
+                */
+                void Attach( MVtEngCameraPreferences& aCamPrefs );
+
+                /**
+                * @see MVtEngCameraPreferencesObserver::ColorToneUpdated
+                */
+                void ColorToneUpdated(
+                    MVtEngCameraPreferences::TColorTone aColorTone );
+
+                /**
+                * @see MVtEngCameraPreferencesObserver::WhiteBalanceUpdated
+                */
+                void WhiteBalanceUpdated(
+                    MVtEngCameraPreferences::TWhiteBalance aWhiteBalance );
+
+                /**
+                * @see MVtEngCameraPreferencesObserver::BrightnessUpdated
+                */
+                void BrightnessUpdated( TInt aBrightness );
+
+                /**
+                * @see MVtEngCameraPreferencesObserver::ContrastUpdated
+                */
+                void ContrastUpdated( TInt aContrast );
+
+                /**
+                * @see MVtEngCameraPreferencesObserver::Detach
+                */
+                void Detach( MVtEngCameraPreferences& aCamPrefs );
+
+            public:
+
+                /**
+                * Detach from preference and reset pointer.
+                */
+                void DetachFromCameraPreferences();
+
+            private:
+
+                // Pointer to camera preferences object this provider item is
+                // attached to
+                MVtEngCameraPreferences* iCamPrefs;
+
+                // Stored color tone value
+                MVtEngCameraPreferences::TColorTone iColorTone;
+
+                // Error code reading color tone value
+                TInt iCtErr;
+
+                // Stored white balance
+                MVtEngCameraPreferences::TWhiteBalance iWhiteBalance;
+
+                // Error code reading white balance value
+                TInt iWbErr;
+
+                // Stored brightness
+                TInt iBrightness;
+
+                // Error code reading brightness value
+                TInt iBrErr;
+
+                // Stored contrast
+                TInt iContrast;
+
+                // Error code reading contrast value
+                TInt iCrErr;
+
+                // ETrue if Attach is called first time
+                TBool iFirstTime;
+
+            };
+
+    /**
+    * Inner class for hiding image sharing details.
+    */
+    NONSHARABLE_CLASS( CVtEngShareImage ) : public CBase
+        {
+        private: // enumerations
+
+            /**
+            * Media object sharing internal state.
+            */
+            enum TState
+                {
+                EStopped,
+                EInitializing,
+                ESharing
+                };
+
+        public: // New public methods
+
+            /**
+            * Constructor.
+            */
+            static CVtEngShareImage* NewL( CVtEngLocalVideo& aLocalVideo );
+
+            /**
+            * C++ destructor.
+            */
+            ~CVtEngShareImage();
+
+            /**
+            * Start initialization of image sharing.
+            * @param aParameters Image sharing parameters (from UI)
+            * @param aCurrent Currently active provider's type.
+            * @param aFirstTime After call ETrue if this call was first to
+            * share initialize, EFalse otherwise.
+            * @exception May leave with KErrNotReady already initializing. May
+            * also leave with system wide error code if something goes wrong
+            * during provider initialization.
+            */
+            void InitializeL(
+                const MVtEngMedia::TShareObjectImageParameters& aParameters,
+                TVtEngProviderType aCurrent,
+                TBool& aFirstTime );
+
+            /**
+            * Cancel sharing initialized image.
+            */            
+            void CancelInitialize();
+
+            /**
+            * Start sharing initialized image.
+            * @exception May leave with KErrNotReady if not initialized. May
+            * also leave with system wide error code if something goes wrong
+            * during provider swap.
+            */
+            void ShareL();
+
+            /**
+            * Stop sharing image.
+            * @exception May leave with KErrNotReady if not sharing. May also
+            * leave with system wide error code if something goes wrong during
+            * provider swap.
+            */
+            void StopL();
+
+            /**
+            * An error happened during initialization, sharing or stopping.
+            * @param aError Error reason.
+            */
+            void Error( TInt aError );
+
+            /**
+            * Returns stored source from sharer.
+            * @return Stored source (source that was selected before share).
+            */
+            TVtEngProviderType StoredSource() const;
+
+            /**
+            * Get sharing state.
+            * @param aObjectSharingState On return contains current object
+            * sharing state.
+            */
+            void GetObjectSharingState(
+                MVtEngMedia::TShareObjectState& aObjectSharingState ) const;
+
+            /**
+            * Check whether share is being initialized or not.
+            * @return ETrue if share is being initialized EFalse otherwise.
+            */
+            TBool IsInitializingShare() const;
+
+            /**
+            * Called when General settings have been changed.
+            */
+            void SettingsChanged();
+
+            /**
+            * Called when vsProviderSwitchDone() is called to local video.
+            */
+            void ProviderSwitchDone( CVSDataProvider* aOldProvider );
+
+            /**
+            * Called when camera change event is received from PS.
+            */
+            void NotifyCameraChanged( const TVtEngProviderType& aProviderType );
+
+        private: // New private methods
+
+            /**
+            * C++ constructor.
+            */
+            CVtEngShareImage( CVtEngLocalVideo& aLocalVideo );
+
+            /**
+            * 2nd constructor, may leave.
+            */
+            void ConstructL();
+
+            /**
+            * Get image sharing parameters.
+            * @return Constant reference to image sharing parameters.
+            */
+            const MVtEngMedia::TShareObjectImageParameters& Parameters() const;
+
+            /**
+            * Get initialization state.
+            * @return ETrue if sharing is being initialized, EFalse otherwise.
+            */
+            TBool IsInitializing() const;
+
+            /**
+            * Set sharing state.
+            * @param aNewState New image sharing state.
+            */
+            void SetState( const TState aNewState );
+
+            /**
+            * Fetches next available provider item pointer.
+            * @return Pointer to next available provider item or NULL if none
+            * could be found.
+            */
+            TProviderItem* FetchProviderItem() const;
+
+            /**
+            * Creates provider.
+            */
+            void CreateProviderL( TProviderItem& aProviderItem );
+
+            /**
+            * Initializes provider.
+            */
+            void InitializeProviderL( TProviderItem& aProviderItem );
+
+            /**
+            * Deletes provider.
+            */
+            void DeleteProvider( TVtEngProviderType aProviderType );
+
+            /**
+            * Deletes all precreated providers.
+            */
+            void DeleteProviders();
+
+        private: // Data
+
+            // Pointer to local video instance
+            CVtEngLocalVideo* iLocalVideo;
+
+            // Current state
+            TState iState;
+
+            // Previous state
+            TState iPreviousState;
+
+            // Copy of image sharing parameters
+            MVtEngMedia::TShareObjectImageParameters iParameters;
+
+            // Type of provider that was active before image sharing
+            TVtEngProviderType iStoredType;
+
+            // Type of provider that was originally active before image sharing
+            // This is needed because iStoredType may change according to PS
+            // events.
+            TVtEngProviderType iOriginalStoredType;
+
+            // Currently active provider
+            TProviderItem* iActiveProvider;
+
+            // Currently initialized provider
+            TProviderItem* iInitializingProvider;
+
+            // Buffered items
+            RPointerArray< TProviderItem > iBuffered;
+
+            // General settings were changed while sharing
+            TBool iSettingsChanged;
+        };
+
+    /**
+    * Inner class for handling delayed provider switches (e.g. PS signalled
+    * camera changes)
+    */
+    NONSHARABLE_CLASS( TVtEngDelayedSelect )
+        {
+    public:
+
+        /**
+        * Constructor
+        */
+        TVtEngDelayedSelect();
+
+       /**
+        * Called when camera change event is received from PS.
+        */
+        void NotifyDelayedSelect( const TVtEngProviderType& aProviderType );
+
+        /**
+        * Returns ETrue if delayed select is pending, EFalse otherwise.
+        */
+        TBool IsDelayedSelectPending() const;
+
+        /**
+        * Returns delayed select target and resets stored value.
+        */
+        TVtEngProviderType DelayedSelectTarget();
+
+    private: // data
+
+        TVtEngProviderType iDelayedProviderType;
+        };
+
+    /**
+    * Inner class for handling layout change reinitialization.
+    */
+    NONSHARABLE_CLASS( TVtEngLayoutChangeHandler )
+        {
+
+    public:
+
+        /**
+        * Constructor
+        */
+        TVtEngLayoutChangeHandler( CVtEngLocalVideo& aLocalVideo );
+
+        /**
+        * Called when layout change has happened
+        */
+        void HandleLayoutChangeL();
+
+        /**
+        * Called when layout change needs to be cancelled
+        */
+        void CancelHandleLayoutChange();
+
+        /**
+        * Called when provider is unfrozen.
+        * @return ETrue if unfreeze was handled by the layout change handler,
+        * EFalse otherwise.
+        */
+        TBool UnfreezeL();
+
+        /**
+        * Called by the local video when provider error happens.
+        * @param aError Type of error
+        * @return ETrue If error was handled by the layout change handler
+        */
+        TBool ProviderError( TInt aError );
+
+        /**
+        * Called by the local video when provider is ready after initialization.
+        * @return ETrue If callback was handled by the layout change handler.
+        */
+        TBool ProviderReady();
+
+        /**
+        * Called by the local video when provider has been switched.
+        * @param CVSDataProvider Pointer of old provider instance.
+        * @return ETrue If callback was handled by the layout change handler.
+        */
+        TBool ProviderSwitchDone( CVSDataProvider* aOldProvider );
+
+    private:
+
+        /**
+        * 2nd constructor
+        */
+        void ConstructL();
+
+        /**
+        * Does the layout change handling.
+        */
+        void DoHandleLayoutChangeL();
+
+        /**
+        * Call to CompleteL() that is trapped.
+        */
+        TInt Complete( const TInt aError );
+
+        /**
+        * Completes handling and resets state to EIdle.
+        */
+        void CompleteL( const TInt aError );
+
+        /**
+        * Completes asynchronous request.
+        */
+        void CompleteOperation( const TInt aError );
+
+    private: // data
+
+        // Pointer to local video instance
+        CVtEngLocalVideo* iLocalVideo;
+
+        /**
+        * Layout change handler internal state.
+        */
+        enum TState
+            {
+            /** Layout change handler is ready to be called */
+            EIdle,
+            /** Layout change handler has been called, but layout update is
+                pending */
+            ELayoutChangePending,
+            /** Layout change handler is switching blank provider */
+            ESwitchingBlank,
+            /** Layout change handler is initializing camera provider */
+            EInitializingCamera,
+            /** Layout change handler is switching camera provider */
+            ESwitchingCamera
+            };
+
+        // Handler's internal state
+        TState iState;
+
+        // Stored provider type
+        TVtEngProviderType iStored;
+
+        };
+
+        private:
+
+        /**
+        * Rendering method.
+        */
+        enum TRenderingMethod
+            {
+            // Unspecified
+            EUnspecified,
+            // Through window server
+            EWindowServer,
+            // Direct screen access
+            EDSA,
+            // Display posting
+            EDP
+            };
+
+        /**
+        * View finder state.
+        */
+        enum TViewFinderState
+            {
+            // View finder not active.
+            EVFNone,
+            // View finder started to reveive bitmaps.
+            EVFReceivingBitmaps,
+            // View finder started to render with DSA.
+            EVFRenderingDsa
+            };
+
+        /**
+        * Internal state.
+        */
+        enum TState
+            {
+            // Initial and state when error occurred.
+            ELocNone,
+            // Provider initialization ongoing.
+            ELocInitializing,
+            // Switch to another provider ongoing.
+            ELocSwichingProvider,
+            // Provider initialization or switch completed.
+            ELocReady
+            };
+
+    public:
+
+        /**
+        * Deletes provider.
+        * @param aItem provider to delete
+        */
+        void DeleteProvider( TProviderItem& aItem );
+
+        /**
+        * Deletes provider.
+        * @param aType type of provider to delete.
+        */
+        void DeleteProvider( TVtEngProviderType aType );
+
+        /**
+        * Resets local video after a video call.
+        */
+        void Reset();
+
+    private:  // New functions
+
+        /**
+        * Sets current camera id.
+        */
+        void SetCurrentCameraId( MVtEngMedia::TCameraId aCamId );
+
+    	/**
+    	 * Configures provider item for outwards camera in
+    	 * construction phase.
+    	 */
+    	void ConfigureOutwardsCameraItem(
+    		TProviderItem& aItem,
+    		const TInt aCurrentIndex );
+
+        /**
+        * Calculater digital zoom steps.
+        * @param aProvider the used provider in counting
+        * @return amount of major zoom steps
+        */
+        TInt CalculateMajorDigitalZoomStepCount(
+            CVSDataProvider* aProvider );
+
+        /**
+        * Calculater digital zoom steps.
+        * @param aInfo provider info structure from which zoom steps will be
+        * calculated
+        * @return amount of major zoom steps
+        */
+        TInt CalculateMajorDigitalZoomStepCount(
+            const TVSDataProviderInfo& aInfo ) const;
+
+        /**
+        * Deletes audio source.
+        */
+        void DeleteAudioSource();
+
+        /**
+        * Gets a provider for a given type.
+        * @param aType type to search for
+        * @param aItem returned provider item
+        * @return index in provider array or KErrNotFound
+        */
+        TInt GetProviderByType(
+            TVtEngProviderType aType, TProviderItem& aItem );
+
+        /**
+        * Gets a provider for a given type.
+        * @param aType type to search for
+        * @param aItem returned provider item
+        * @return index in provider array or KErrNotFound
+        */
+        TInt GetProviderByType(
+            TVtEngProviderType aType, TProviderItem*& aItem );
+
+        /**
+        * Gets a provider for a given provider instance.
+        * @param aInstance Instance to search for
+        * @param aItem returned provider item
+        * @return index in provider array or KErrNotFound
+        */
+        TInt GetProviderByInstance(
+            const CVSDataProvider* aInstance,
+            TProviderItem*& aItem ) const;
+
+        /**
+        * Initializes provider.
+        * @param aProviderItem provider
+        */
+        void InitializeProviderL( TProviderItem& aProviderItem );
+
+        /**
+        * Initializes provider for sharing.
+        */
+        void InitializeShareProviderL( TProviderItem& aProviderItem,
+            const TDesC8& aParams );
+
+        /**
+        * Re-creates provider. First deletes old instance inside provider
+        * item structure and then creates a new instance, using given
+        * provider type.
+        * @param aProviderItem Provider to be recreated.
+        * @param aType Type of the new provider to be created.
+        */
+        void ReCreateProviderL(
+            TProviderItem& aProviderItem, const TVtEngProviderType aType );
+
+        /**
+        * Provider index by provider type.
+        * @param aType Type of provider
+        */
+        TInt ProviderIndex( TVtEngProviderType aType ) const;
+
+        /**
+        * Gets a provider index by state.
+        * @param aState state of returned provider
+        * @return Index of provider
+        */
+        TInt ProviderIndexByState( TProviderState aState ) const;
+
+        /**
+        * Gets a provider index by provider instance.
+        * @param aInstance instance of provider to be found
+        * @return Index of provider or KErrNotFound if given provider item
+        * is not found
+        */
+        TInt ProviderIndexByInstance( const CVSDataProvider* aInstance ) const;
+
+        /**
+        * Creates VideoSource provider by type.
+        * @param aType Engine provider type
+        * @return CVSDataProvider pointer
+        */
+        CVSDataProvider* CreateDataProviderL( TVtEngProviderType aType );
+
+        /**
+        * Maps camera orientation to provider type.
+        * @param aOrientation camera orientation
+        * @return provider type
+        */
+        static TVtEngProviderType
+            OrientationToType( TCameraInfo::TCameraOrientation aOrientation );
+
+        /**
+        * Maps camera ID to provider type.
+        * @param aId camera ID
+        * @return provider type
+        */
+        static TVtEngProviderType CameraIdToType( MVtEngMedia::TCameraId aId );
+
+        /**
+        * Creates blank still image provider.
+        * @param aIndex index of still image provider
+        */
+        void CreateBlankProviderL( const TInt aIndex );
+
+        /**
+        * Creates default still image provider.
+        * @param aIndex index of default still image provider
+        */
+        void CreateDefaultStillImageProviderL( const TInt aIndex );
+
+        /**
+        * Updates available camera providers.
+        * @return primary provider
+        */
+        TVtEngProviderType UpdateAvailableProvidersL();
+
+        /**
+        * Switches to active provider.
+        */
+        void SwitchProvider( TProviderItem* aProviderItem );
+
+        /**
+        * Overloaded SwitchProvider() that takes new provider as a parameter.
+        */
+        void SwitchProvider( TProviderItem& aProviderItem );
+
+        /**
+        * Uninitializes non-permanent provider.
+        */
+        void UninitializeProviderL();
+
+        /**
+        * Updates iState if view finder is active.
+        */
+        void UpdateState();
+
+        /**
+        * Checks if initialization or provider switch is pending.
+        * @return ETrue if either one is pending
+        */
+        TBool InitializingOrSwitching() const;
+
+        /**
+        * Resets provider info index variables.
+        */
+        void ResetIndices();
+
+        /**
+        * Sets active camera tracking.
+        * @param aProviderIndex current camera in use
+        * @return error code
+        */
+        TInt SetCameraTrackingL( TInt& aProviderIndex );
+
+        /**
+        * Maps pubsub provided camera id to internal indexes.
+        * @param aCameraId id to map
+        * @return internally mapped id
+        */
+        MVtEngMedia::TCameraId MapCameraInternally( TInt aCameraId );
+
+        /**
+        * Checks if desired camera is available.
+        * @param aType provider type to return
+        */
+        void CameraAvailable( CVtEngLocalVideo::TVtEngProviderType &aType );
+
+        /**
+        * checks if given provider type is already waiting for initialization
+        * or switch.
+        * @param aType Provider type.
+        * @return ETrue if given provider type is in waiting state, EFalse
+        * otherwise.
+        */
+        TBool IsProviderWaiting( TVtEngProviderType aType ) const;
+
+        /**
+        * Returns highest provider type which is available for selection.
+        * Priority is following:
+        *    KVtEngProviderCam1         << highest
+        *    KVtEngProviderCam2
+        *    KVtEngProviderImage
+        *    KVtEngProviderNone
+        * If eg. cam2 is designated as preferred, possible returns values are
+        * Cam2, Image and None.
+        *
+        * @param aType in/out argument. In  => preferred provider which
+        *        caller of the method wishes to select
+        *                               Out => highest available provider
+        * @return ETrue if preferred == highest i.e. aPreferred is intact
+        *
+        */
+        TBool GetHighestSelectableProvider( TVtEngProviderType& aPreferred ) const;
+
+        /**
+        * checks if given provider type is acitven
+        * @param aType Provider type.
+        * @return ETrue if given provider is already active, EFalse
+        * otherwise.
+        */
+        TBool IsActiveProvider( TVtEngProviderType aType ) const;
+
+
+    private: // From CActive.
+
+        /**
+        * Handles sync operations as async.
+        * @see CActive::RunL
+        */
+        virtual void RunL();
+
+        /**
+        * @see CActive::DoCancel()
+        */
+        virtual void DoCancel();
+
+    private:
+
+        // Local video flags
+        enum TVtEngLocalVideoFlags
+            {
+            // Camera 1 is available (inwards)
+            EFlagCamera1Available = 0x00000001,
+            // Camera 2 is available (outwards)
+            EFlagCamera2Available = 0x00000002,
+            // video call ongoing
+            EFlagInitialized      = 0x00000004,
+            // view finder enabled from UI
+            EFlagVFEnabled        = 0x00000008,
+            // Non-user orginated switch
+            EFlagAutomaticSwitchCallback = 0x00000010,
+            // Audio muted
+            EFlagAudioMuted       = 0x00000020,
+            // Only initialize a provider (no switch when initialized)
+            EFlagInitializeOnly   = 0x00000040,
+            // Signal observer when switch is complete
+            EFlagSignalSourceSelection = 0x00000080,
+            // Provider event received while switch ongoing.
+            // When this is set and switch completes it
+            // is checked if revert to previous is needed.
+            EFlagCheckRevertToPrevious = 0x00000100,
+            // Avoid calculating the step count by using flag.
+            EFlagZoomStepCountNeedsMapping = 0x00000200,
+            // VT application foreground state
+            EFlagUIForeground           = 0x00000400,
+            // VT application background state ( notification purpose)
+            EFlagUIBackground           = 0x00000800,
+            // Provider is frozen
+            EFlagFrozen                 = 0x00001000
+            };
+
+        /**
+        * Sets a flag on.
+        * @param aFlag flag to set
+        */
+        void SetFlag( const TInt aFlag );
+
+        /**
+        * Removes a flag.
+        * @param aFlag flag to remove
+        */
+        void ClearFlag( const TInt aFlag );
+
+        /**
+        * Checks if a flag has been set.
+        * @param aFlag flag to check
+        * @return ETsrue if set
+        */
+        TBool IsFlag( const TInt aFlag ) const;
+
+    private:    // Data
+
+        // Options for window server rendering.
+        TOptions                iOptions;
+
+        // Options for DSA rendering.
+        TDsaOptions             iDsaOptions;
+
+        // Video source controller.
+        CVSController*          iSourceController;
+
+        // Video source.
+        CVSDataSource*          iSource;
+
+        // Audio source.
+        MVTAudioSource*          iAudioSource;
+
+        // Video providers (cameras and still image).
+        CArrayFixFlat<TProviderItem>* iVideoProviders;
+
+        // Currently active provider.
+        TProviderItem*          iActiveProvider;
+
+        // Provider item we're switching away from.
+        TProviderItem*          iFadingProvider;
+
+        // Provider that is selected as next one and
+        // is initializing or switching.
+        TProviderItem*          iSelectedProvider;
+
+        // DSA or window server.
+        TRenderingMethod        iRenderingMethod;
+
+        // Local video status.
+        TState                  iState;
+
+        // View finder state.
+        TViewFinderState        iViewFinderState;
+
+        // Callback interface to Media Handler.
+        CVtEngMediaHandler&     iObserver;
+
+        // Still image file name.
+        TFileName               iStillImage;
+
+        // Local video state flags.
+        TInt                    iFlags;
+
+        // Friend declaration provides extended access.
+        friend class TProviderItem;
+
+        // Member variables to use in referencing to
+        // provider information
+        TInt iProviderInfoIndexCam1;
+        TInt iProviderInfoIndexCam2;
+        TInt iProviderInfoIndexStill;
+
+        // Used for default camera notifications.
+        CVtEngPubSubsListener* iCameraListener;
+
+        // Camera received from pubsub.
+        MVtEngMedia::TCameraId iCurrentCamera;
+
+        // Contains logics for image sharing.
+        CVtEngShareImage* iShareImage;
+
+        // Pointer to camera preferences extension
+        CVtEngCameraPreferences* iCameraPref;
+
+        // Logics for delayed provider selection
+        TVtEngDelayedSelect iDelayedSelect;
+
+        // Active provider's info
+        TVSDataProviderInfo iProviderInfo;
+
+        // ETrue if prepare camera has been handled in media handler
+        TBool iPrepareCameraCalled;
+
+        // Layout change handler
+        TVtEngLayoutChangeHandler iLayoutChangeHandler;
+
+        // ASync callback
+        CAsyncCallBack* iAsyncCallBack;
+
+        // Result
+        TInt iResult;
+
+        // Pointer to provider item that is being initialized
+        TProviderItem* iInitializingProvider;
+
+        // Number of cameras in the device
+        TInt iNumSupportedCameras;
+    };
+
+#endif      // CVTENGLOCALVIDEO_H
+
+// End of File