vtengines/videoteleng/Inc/Media/CVtEngLocalVideo.h
author Pat Downey <patd@symbian.org>
Wed, 01 Sep 2010 12:29:12 +0100
branchRCL_3
changeset 25 779871d1e4f4
parent 24 f15ac8e65a02
permissions -rw-r--r--
Revert incorrect RCL_3 drop: Revision: 201033 Kit: 201035

/*
* 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