vtengines/videoteleng/Inc/Media/CVtEngMediaHandler.h
author hgs
Fri, 23 Jul 2010 12:39:42 +0300
changeset 42 607cc97c6047
parent 0 ed9695c8bcbe
child 49 8e703580edd3
permissions -rw-r--r--
201029

/*
* 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:  Video session interface.
*
*/



#ifndef CVTENGMEDIAHANDLER_H
#define CVTENGMEDIAHANDLER_H

//  INCLUDES
#include <e32base.h>
#include <mvtprotocolhandler.h>
#include "MVtEngMedia.h"
#include "vtengcommands.h"
#include "CVtEngLocalVideo.h"
#include "MVtEngSettingObserver.h"

// FORWARD DECLARATIONS
class CVtEngLocalVideo;
class CVtEngRemoteVideo;
class MVtEngFrameObserver;
class CVtEngOperation;
class CVtEngExtensionBase;

// CLASS DECLARATION

/**
*  Media control.
*
*  @lib videoteleng.lib
*  @since Series 60 2.6
*/
NONSHARABLE_CLASS( CVtEngMediaHandler ) :
    public CBase,
    public MVtEngMedia,
    public MVtEngSettingObserver,
    public MVtProtocolHandler
    {
    public: // Constructor and destructor.

        /**
        * Symbian two-phase constructor.
        * @return media handler instance
        */
        static CVtEngMediaHandler* NewL();

        /**
        * Destructor.
        */
        ~CVtEngMediaHandler();

    public: // From MVtEngMedia.

        /**
        * @see MVtEngMedia
        */
        virtual TInt GetMediaState(
            const TMediaDirection aMediaDirection,
            TInt& aActiveMedia ) const;

        /**
        * @see MVtEngMedia
        */
        virtual TBool RenderingStarted(
            const TMediaDirection
            aDirection ) const;

        /**
        * @see MVtEngMedia
        */
        virtual TInt GetSource( TMediaSource& aSource ) const;

        /**
        * @see MVtEngMedia
        */
        virtual TInt GetSourcesCaps( TInt& aCaps ) const;

        /**
        * @see MVtEngMedia
        */
        virtual TInt GetCurrentCameraId( TCameraId& aId ) const;

        /**
        * @see MVtEngMedia
        */
        virtual TInt GetCameraInfo(
            const TCameraId aId,
            TCameraInfo& aInfo ) const;

        /**
        * @see MVtEngMedia
        */
        virtual TInt GetCurrentZoomStep( TInt& aCurrentStep );

        /**
        * @see MVtEngMedia
        */
        virtual TInt GetMaxZoomStep( TInt& aMaxZoomStep );

        /**
        * @see MVtEngMedia
        */
        virtual TInt GetMajorZoomStepCount( TInt& aCount );

        /**
        * @see MVtEngMedia
        */
        virtual void GetMajorZoomStep( TInt aIndex, TInt& aStep );

        /**
        * @see MVtEngMedia
        */
        virtual TInt GetFreezeSupported( TBool& aFreezeSupported ) const;

        /**
        * @see MVtEngMedia
        */
        virtual TInt GetFreezeState( TBool& aFrozen ) const;

        /**
        * @see MVtEngMedia
        */
        virtual TInt GetDsaState(
            const TMediaDirection aMediaDirection,
            TBool& aActive ) const;

        /**
        * @see MVtEngMedia
        */
        virtual TBool VideoCallConnected () const;
        
        /**
        * @see MVtEngMedia
        */
        virtual void GetVideoQuality( TVideoQuality& aVideoQuality ) const;

        /**
        * @see MVtEngMedia
        */
        virtual void GetObjectSharingState(
            TShareObjectState& aObjectSharingState ) const;

        /**
        * @ see MVtEngMedia
        */
        virtual void GetCameraOrientations(
            TCameraOrientation& aPrimaryCameraOrientation,
            TCameraOrientation& aSecondaryCameraOrientation ) const;

public: // New functions.

        /**
        * Tells if the Protocol initialization has completed.
        * @return ETrue if initialized
        */
        TBool ProtoInitialized() const;

        /**
        * Performs an operation in the handler.
        * @param operation to be performed on the handler
        */
        virtual void HandleL( CVtEngOperation& aOperation );

        /**
        * Returns if command can be performed by media handler.
        * @return KErrNone if a command can be perfomed
        *         KErrNotReady if not in appropriate state
        *         KErrNotSupported if command is not for media handler
        */
        TInt ValidateCommand( const TVtEngCommandId aCommand ) const;

        /**
        * Returns ETrue if video channel is closed.
        */
        TBool IsVideoChannelClosed() const;
        
        /**
         * Request update last remote video frame through MVtEngFrameObserver::vtSetFrame
         */
        void RequestLastRemoteFrame();        

    public: // from MVtProtocolHandler

        /**
        * Handles callback from protocol.
        * @param aResponse response
        */
        virtual void HandleSessionCommandEventL(const TVtCommandResponse& aResponse);

    public: // From MVtProtocolHandler.

        /**
        * Handles callback from protocol audiocontroller.
        * @param aId which command
        * @param aCmd which audio command
        * @param aContextData any additional data
        * @param aStatus how did it end up with
        */
        virtual void HandleAudioOutputControlCommandComplete(TInt aId,
            TVtAudioOutputControlCommand aCmd,
            TAny *aContextData,
            TInt aStatus);

    public: // From MVtProtocolHandler.

        /**
        * Handles event from protocol.
        * @param aEvent event
        */
        virtual void HandleSessionInformationalEventL(
            const TVtIndicationEvent& aEvent);

    public: // from MVtProtocolHandler

        /**
        * Handles error event from protocol.
        * @param aEvent error event
        */
        virtual void HandleSessionErrorEventL(const TVtErrorEvent& aEvent);

    public: // from MVtEngSettingObserver

        /**
        * Handles shared data setting change.
        * @param aId setting id
        * @param aValue setting value
        */
        virtual void HandleSettingChangedL(
            CVtEngSettings::TSettingId aId,
            const TDesC& aValue );

    public: // From MVtProtocolHandler.

        /**
        * @see MVtProtocolHandler.
        */
        void HandleVideoEncoderCommandCompletedL(
            const TVtCommandResponse& aResponse );

        /**
        * @see MVtProtocolHandler.
        */
        void HandleVideoEncoderInformationalEventL(
            const TVtIndicationEvent& aEvent);

    public: // From MVtProtocolHandler

        /**
        * @see MVtProtocolHandler.
        * @since 3.1
        */
        void HandleH324MConfigCommandCompletedL( const TVtCommandResponse& aResponse );

        /**
        * @see MVtProtocolHandler.
        * @since 3.1
        */
        void HandleH324MConfigInformationalEventL(
            const TVtIndicationEvent& aEvent );

    public: // New functions.

        /**
        * Initializes media handler.
        * @param aStatus signaling handle
        */
        void InitializeL( TRequestStatus& aStatus );

        /**
        * Cancels media handler initialization.
        */
        void CancelInitialize();

        /**
        * Initializes default blank provider.
        * @param aStatus signaling handle
        */
        void InitializeProviderL( TRequestStatus& aStatus );

        /**
        * Cancel Image sharing initialization.         
        */        
        void CancelInitializeShareImage();
        
        /**
        * Sets protocol interface.
        * aProto2Way protocol interface
        */
        void SetSessionCommand( MVtSessionCommand* aProto2Way );

        /**
        * Unitializes media handler.
        * @param aStatus request semaphore to complete
        * when uninitialization is complete
        */
        void Uninitialize( TRequestStatus& aStatus );

        /**
        * Goes to next step of uninitialization process, it can
        * be one of following
        * - Cancel all Protocol commands
        * - Protocol disconnect
        * - Protocol reset
        * - Switch blank provider.
        */
        void UninitializeNextStep();

        /**
        * Sets selected camera ID.
        * @param aId camera ID (primary or secondary)
        * @param aUpdateRequired if ETrue switch could not be performed
        *        Switch will be done when engine has been initialized.
        */
        void SetSelectedCameraId(
            const TCameraId aId,
            TBool aUpdateRequired = EFalse );

        /**
        * Handles source initialization or switch.
        * @param aResult Symbian OS error code
        */
        void HandleLocalVideoOperationCompleteL( const TInt aResult );

        /**
        * SDK init info.
        * @return Protocol initialization info
        */
        TVtInitInfo& SdkInitInfo();

        /**
        * Returns protocol state maintained by VTEngine, not by Protocol.
        * @return state
        */
        MVtProtocolCommand::TVtProtocolState ProtoState();

        /**
        * Sets up video connection to remote terminal.
        * @return Symbian OS error code
        */
        TInt Connect();

        /**
        * Disconnects session.
        * @return Symbian OS error code
        */
        TInt Disconnect();

        /**
        * Adds video data source to protocol engine.
		* @param Video channel logical channel ID number.
        * @return Symbian OS error code
        */
        TInt AddVideoSource( TUint aChannelId );

        /**
        * Adds audio data source to protocol engine.
		* @param Audio channel logical channel ID number.
        * @return Symbian OS error code
        */
        TInt AddAudioSource( TUint aChannelId );

        /**
        * Adds video sink.
		* @param Video channel logical channel ID number.
        * @return Symbian OS error code
        */
        TInt AddVideoSink( TUint aChannelId );

        /**
        * Adds audio sink.
		* @param Audio channel logical channel ID number.
        * @return Symbian OS error code
        */
        TInt AddAudioSink( TUint aChannelId );

        /**
        * Sets the output volume for Protocol.
        * @param aVolume the level of the volume
        * @return Symbian OS error code
        */
        TInt SetVolume( const TInt aVolume,
            CVtEngOperation* aOperation = NULL );

        /**
        * Enables video when primary camera becomes available.
        * @param aEnable do we enable or disable
        * @return Symbian OS error code
        */
        TInt AutoEnableVideo( TBool aEnable = ETrue );

        /**
        * Deletes protocol instance and associated Protocol interfaces.
        */
        void FinalizeUninitialization();

        /**
        * Creates extension according to API Uid.
        * @since S60 v3.2
        * @param aUid extension API Uid.
        * @return Extension pointer
        * @exeption Leaves if creation fails
        *
        */
        CVtEngExtensionBase* CreateExtensionsL( const TUid& aUid );
        
        /**
        * Checks if there is already an operation pending.
        * @return KVtEngCommandNone if no operation is pending or Command identifier
        */
        TVtEngCommandId GetPendingCommand();

    private: // new functions

        /**
        * Sends a sync message to Protocol after provider switch.
        */
        void RequestFrame( );

        /**
        * Sets video quality
        */
        void SetVideoQualityL(
            const TVideoQuality aVideoQuality,
            const TBool aSetPeerVideoQuality );

        /**
        * Sets peer video quality
        */
        void SetPeerVideoQuality( const TVideoQuality aVideoQuality );

        /**
        * Check's flag's validity. If not valid, panic's in debug mode.
        * @param aFlag flag to check.
        */
        void AssertFlag( const TInt aFlag ) const;

        /**
        * Gets the version information from SysUtil
        * and sets it into Protocol.
        */
        void SetVersionInfoL();

        /**
        * Sets supported resolutions to Protocol.
        */
        void SetSupportedResolutions();

		/**
        * Sets used call setup enhancement parameters.
        */
		void SetFastCsupOptions();

        /**
        * Does Protocol reset.
        */
        void ResetProtoL();

        /**
        * Does the actual disconnecting with Protocol.
        */
        void DisconnectProtoL();

        /**
        * Sets the defaults for volumes.
        */
        void InitializeVolume();

        /**
        * Checks if a flag in iProtoInitFlags is set.
        * @return ETrue if flag is set
        */
        TBool IsFlag( const TInt aFlag ) const;

        /**
        * Sets a flag in iProtoInitFlags.
        * @param aFlag flag to set
        */
        inline void SetFlag( const TInt aFlag );

        /**
        * Clears a flag in iProtoInitFlags.
        * @param aFlag flag to clear
        */
        inline void ClearFlag( const TInt aFlag );

        /**
        * Requests the volume controller.
        * @return ETrue if retrieved ok
        */
        TBool RequestAudioControllerL();

        /**
        * Spatial trade off indication handling method. Indication is
        * sent by the peer every time when its spatial trade off is updated.
        * @param aLogicalChannelId Indication's logical channel Id.
        * @param aTradeOff Indication trade off value.
        */
        void HandleSpatialTradeoffIndication(
            const TUint16 aLogicalChannelId, const TUint8 aTradeOff );

        /**
        * Spatial trade off command handling method. Spatial trade off
        * command is sent by the peer whenever peer wants to adjust our
        * video quality.
        * @param aLogicalChannelId Command's logical channel Id.
        * @param aTradeOff New trade off value.
        */
        void HandleSpatialTradeoffCommandL(
            const TUint16 aLogicalChannelId, const TUint8 aTradeOff );

    private: // constructor and destructor

        /**
        * C++ default constructor.
        */
        CVtEngMediaHandler();

        /**
        * Symbian constructor that may leave.
        */
        void ConstructL();

    private:
        /**
        * Operation values
        */
        enum TOperation
            {
            /**
            * No-op.
            * 0
            */
            ENone,

            /**
            * Add video source to protocol.
            * 1
            */
            EAddVideoSource,

            /**
            * Add video source to protocol.
            * 2
            */
            EAddVideoSink,

            /**
            * Add audio source to protocol.
            * 3
            */
            EAddAudioSource,

            /**
            * Add audio source to protocol.
            * 4
            */
            EAddAudioSink,

            /**
            * Connect protocol.
            * 5
            */
            EConnectProto,

            /**
            * Mute audio.
            * 6
            */
            EMuteAudio,

            /**
            * Resume audio sending.
            * 7
            */
            EUnmuteAudio,

            /**
            * Enable video for peer.
            * 8
            */
            EEnableVideo,

            /**
            * Disable video for peer.
            * 9
            */
            EDisableVideo,

            /**
            * Cancel ongoing request to Protocol
            * as part of uninitiazation process.
            * 10
            */
            EUninitializeCancelAllProto,

            /**
            * Disconnect protocol.
            * 11
            */
            EDisconnectProto,

            /**
            * Destructs local/remote video and VS instances.
            * 12
            */
            EDestructInternals,

            /**
            * Terminates H.324 session.
            * 13
            */
            ETerminateSession,

            /**
            * Removing sinks and sources.
            * 14
            */
            ERemovingSinksAndSources,

            /**
            * Request 324 control interface from protocol.
            * 15
            */
            EGet324CtrlInterface,

            /**
            * Set volume.
            * 16
            */
            ESetAudioVolume,

            /**
            * Gets the maximum volume for Protocol.
            * 17
            */
            EGetAudioGetMaxVolume,

            /**
            * Reset protocol.
            * 18
            */
            EDestructProtoPhaseDisconnect,

            /**
            * Destruct switch blank.
            * 19
            */
            EDestructSwitchBlank,

            /**
            * Reset protocol.
            * 20
            */
            EDestructProtoPhaseReset,

            /**
            * Check Protocol state.
            * 21
            */
            ECheckProtoState,

            /**
            * Enables video internally (not originated by UI).
            * 22
            */
            EEnableVideoInternal,

            /**
            * Disables video internally (not originated by UI).
            * 23
            */
            EDisableVideoInternal,

            /**
            * Request H263Enc interface from protocol.
            * 24
            */
            EGetH263EncInterface,

            /**
            * Requests an intra frame.
            * 25
            */
            ESendIntraframe,

            /**
            * Set supported resolutions.
            * 26
            */
            ESetSupportedResolutions,

            /**
            * Set video quality (by changing framerate)
            * 27
            */
            ESetVideoQuality,

			/**
            * Remove H324 interface
            * 28
            */
			ERemove324CtrlInterface,

			/**
            * Remove video encoder interface
            * 29
            */
			ERemoveH263EncInterface,

			/**
            * Sends Video Temporal-spatial trade off command
            * 30
            */
			ESendVTSTO,

			/**
            * Sets fast call setup options
            * 31
            */
			ESetFastCsupOptions,

            /**
            * Sets vendor id
            * 32
            */
			ESetVendorId,

            /**
            * Set interval when I-frames are sent
            * 33
            */
			ESetIFrameInterval
            };

        /**
        * Operation and related command id.
        */
        struct TCmdOpPair
            {
            // Operation
            TOperation   iOp;
            // Command id returned by proto2way asynch request
            TInt iProtoCmdId;
            };

        /**
        * Enables/Disables video sending.
        * @param aEnable ETrue if video is to be enabled
        * @param aOp operation to be added
        * NOTE. Valid only for enabling video, not when disabled.
        * @see void AutoEnableVideo
        * @return started operation or ENone
        */
        TOperation EnableVideoL(
            const TBool aEnable,
            const TOperation aOp = EEnableVideo );

        /**
        * Calls Protocol pausing and acts according to the result.
        * @return operation id for performed operation
        */
        TOperation DoPauseVideo();

        /**
        * Continues to next step of uninitialization.
        * @param aOp operation to perform
        * @return command id
        */
        void ContinueUninitializeL( const TOperation aOp );

        /**
        * Cancels all the running commands within Protocol.
        * @param operation to be returned
        *       EUninitializeCancelAllProto if cancellation is ongoing
        *       (either because was already or just started)
        *       ENone if cancellation is not ongoing
        * @return error code
        *        KErrNotReady if engine not in suitable state
        *        KErrAlreadyExists if cancel was already pending
        *        KErrNone if cancellation request succeeded
        *        other Symbian OS error code if cancellation fails
        */
        TInt CancelAllProtoCommands( TOperation &aOp );

        /**
        * Stops view finder and remote video rendering.
        */
        void StopRendering();

        /**
        * Updates volume to Protocol (if possible).
        */
        void UpdateVolume();

        /**
        * Initiates protocol engine reset.
        */
        void ResetProto2WayL();

        /**
        * Removes operation from pending operations array.
        * @param aOp TOperation
        * @return ETrue if operation was found (and hence removed)
        */
        template<class T>
        TBool RemoveOperation( const T& aOp );

        /**
        * Adds operation pending for callback.
        * @param aOp operation value
        * @param aCmdId protocol commd id or 0 if not Protocol cmd
        * @param aResetExisting if ETrue removes existing operations
        *        from array
        * @return index of the operation in array (i.e. >= 0 )
        */
        TInt AddOperation(
            const TOperation aOp,
            TInt aCmdId,	
            const TBool aResetExisting = EFalse );

        /**
        * Checks if an operation is pending.
        * @param aOp operation
        * @return index if operation is pending or KErrNotFound
        */
        TInt IsPending( const TOperation aOp ) const;

        /**
        * Checks if an operation is pending.
        * @param aCmdId command id
        * @return index if operation is pending or KErrNotFound
        */
        TInt IsPending( const TInt aCmdId ) const;

        /**
        * Completes asynchronous operation.
        * @param aResult
        * @return KErrNotFound if no operation else KErrNone
        */
        TInt CompleteOp( const TInt aResult );

        /**
        * Completes asynchronous operation asynchronously.
        * @param aResult
        * @return KErrNotFound if no operation else KErrNone
        */
        void AsyncCompleteOp( const TInt aResult = KErrNone );

        /**
        * Checks if specific operation matches to response from protocol.
        * @param aProtoCmdId command id returned by protocol
        * @param aOperation operation to search for in pending commands
        * @param aIndex index in iPendingOps array if found
        * @return ETrue if there's corrensponding entry in pending ops
        */
        TBool MatchResponseToPendingOps(
            const TInt aProtoCmdId,
            const TOperation aOperation,
            TInt* aIndex = NULL );

        /**
        * Starts "self-destruction" timer.
        */
        void StartDisconnectTimerL();

        /**
        * Assigns new pending operation. Only one can be pending at a time
        * so if there already is pending operation it is completed with error.
        * @param aOperation operation to assign as pending
        * @param aReplaceError error code to complete penging operation if
        *        one exists. If KErrNone is passed, replacement is not done.
        * @return KErrNone if assignment done successfully i.e. there was
                  not pending operation that was completed.
        *         KErrCancel if some other operation was pending and was
        *                     completed with aReplaceError. Operation is
        *                     still assigned successfully.
        *         KErrGeneral if operation was not assigned.
        */
        TInt AssignPendingOp(
            CVtEngOperation& aOperation,
            TInt aReplaceError = KErrCancel );

        /**
        * Callback function that completes ongoing operation.
        * @param aAny pointer to an instance of the class.
        * @return always KErrNone.
        */
        static TInt DoCompleteOp( TAny* aAny );

        /**
        * Implementation of self-destruction timer activity.
        * Causes a panic.
        * @param aAny pointer to an instance of the class
        *   Not used.
        * @return KErrNone;
        */
        static TInt TimerCallback( TAny* aAny );

        /**
        * Creates and enques async callback for uninitialization.
        * @see iNextStepCallback
        */
        void NextUninitStepCallbackL();

        /**
        * Callback method for async uninitialization step.
        * @seeiNextStepCallback
        * @return KErrNone;
        */
        static TInt UninitCallback( TAny* aAny );

		/**
        * Query 2-way's additional interfaces, encoder and H324
        * @return KErrNone;
        */
        void QueryProtoInterfacesL();

		/**
        * Release 2-way's additional interfaces, encoder and H324
        * @return KErrNone;
        */
        void ReleaseProtoInterfacesL();

        /**
        * Check for pending Protocol extension interface commands.
        * @return ETrue if one or more extension command is pending
        */
        TBool ExtensionCommandsPending() const;

        /**
        * Checks is it possible to add sink / source from session 
        * state point of view.
        * @return ETrue if adding is allowed.
        */
        TBool MediaAddingValidity() const;
        
        /**
        * Provider initialization state
        */
        enum TInitState
            {
            /**
            * Initialization not ongoing.
            */
            EInitStateNone,

            /**
            * Initialize still image.
            */
            EStateInitStillImage,

            /**
            * Initilize default blank provider.
            */
            EStateInitProvider,

            /**
            * Provider is set to none.
            */
            EStateWaitingProviderChangeForUninit,

            /**
            * Initialization has been cancelled.
            */
            EStateInitCanceled
            };

        /**
        * State flags.
        */
        enum
            {
            // Protocol state flags
            // Sink/source added
            EProtoAudioSourceAdded   = 0x000001,
            EProtoVideoSourceAdded   = 0x000002,
            EProtoAudioSinkAdded     = 0x000004,
            EProtoVideoSinkAdded     = 0x000008,
            // Track paused
            EProtoAudioTrackPaused   = 0x000040,
            EProtoVideoTrackPaused   = 0x000080,

            // Pause/resume related flags.
            ETwoStageOperation    = 0x000100,
            ESourceUpdateNeeded   = 0x000200,
            EProtoPauseVideoRequested= 0x000400,
            EProtoPauseVideoBlankProv= 0x000800,
            EProtoContVideoBlankProv = 0x001000,
            EProtoContVideoBlankInit = 0x002000,

            // Must send intra
            EProtoSendIntraFrame     = 0x004000,

            // 324 interface acquired
            EProto324IFAcquired      = 0x008000,

            // Cancel all command is called on Protocol
            // or there's nothing to cancel
            EProtoCancelProtoCmdsOk     = 0x010000,

            // NON Protocol related flags

            EVideoQualitySetByPeer= 0x020000,

            // Outgoing video channel closed (after being open)
            // Used for preventing video pause/resume when
            // the channel is not open
            EOutVideoChannelClosed = 0x040000,

            // Outgoing audio channel closed (after being open)
            // Used for preventing audio pause/resume
            // the channel is not open
            EOutAudioChannelClosed = 0x080000
            };


        /**
        * Defines actions that can be taken when sharing started
        * and/or stopped
        */
        enum TVideoEngAction
            {
            EVideoActionNone,
            EVideoActionEnable,
            EVideoActionDisable
            };

        /**
        * Helper class for handling video quality manipulation.
        */
        class TVtEngVideoQuality
            {

        public:

            // Forward for inner class
            class TVQSParams;

        public:

            /**
            * Constructor.
            */
            TVtEngVideoQuality();

            /**
            * Destructor.
            */
            ~TVtEngVideoQuality();

            /**
            * Sets new local video quality setting.
            * @param aId Operation id.
            * @param aSetPeer ETrue if peer video quality needs to be set,
            * EFalse otherwise.
            */
            void SettingVideoQualityL( TInt aId, const TVideoQuality aValue,
                TBool aSetPeer );

            /**
            * Get current local video quality setting.
            * @return Current local video quality setting.
            */
                TVideoQuality VideoQuality() const;

            /**
            * Setting video quality succeeded.
            * @return ETrue if record with given id was found, EFalse other
            * wise.
            */
            TBool SettingSucceeded( TInt aId, TVQSParams& aParams );

            /**
            * Setting video quality failed.
            */
            void SettingFailed( TInt aId );

            /**
            * Called when video quality indication is received from peer.
            */
            void UpdateVideoQuality( const TVideoQuality aVideoQuality );

            /**
            * Converts given trade off value to video quality enum.
            */
            TVideoQuality FromTradeOff( const TInt aTradeOff ) const;

            /**
            * Converts given video quality enum to trade off value.
            */
            TInt ToFrameRate( const TVideoQuality aVideoQuality ) const;

            /**
            * Converts given video quality value to frame rate.
            */
            TUint8 ToTradeOff( const TVideoQuality aVideoQuality ) const;

            /**
            * Finds id of setting param and returns index to it.
            */
            TInt FindVQSParam( TInt aId ) const;

        public:

            /**
            * Video quality parameters.
            */
            struct TVQSParams
                {

            public:

                // Default constructor
                TVQSParams();

                // Constructor with initializing parameters
                TVQSParams( TInt aId, const TVideoQuality aValue,
                    TBool aSetPeer );

            public: // data

                // Operation id
                TInt iId;

                // VideoQuality value to be set
                TVideoQuality iValue;

                // Defines whether peer video quality needs to be set or not
                TBool iSetPeer;

                };

        private:

            // Current local video quality
            TVideoQuality iCurrent;

            // Qued params
            RArray< TVQSParams > iParamList;
            };

		// Class for handling different kind of H.245 logical
		// channels and their state in different MONA call setup
		// scenarios
		class TLogicalChannel
			{
		public:

			// H.245 logical channel ID to be established or
			// already active
			TUint iLogicalChannelId;

			// H.245 logical channel ID that is currently closing.
			TUint iLogicalChannelIdClosing;

			// Variable to tell is same type (video or audio, incoming or outgoing)
			// channel already started to close but not closed yet. If closing is pending
			// same type channel cannot be opened until closing has finished or sink/source
			// addition has failed for some reason.
			TBool iSameTypeClosingPending;

			// Variable to tell is same type (video or audio, incoming or outgoing)
			// channel ready to be opened.
			TBool iSameTypeChannelReadyToOpen;

			};

    private:    // Data members.

        // Protocol engine pointer.
        MVtSessionCommand* iSessionCommand;

        // Local video configuration.
        CVtEngLocalVideo*   iLocalVideo;

        // Remote video configuration.
        CVtEngRemoteVideo*  iRemoteVideo;

        // Pending internal operations.
        TInt               iCmdId;
        CArrayFixFlat<TCmdOpPair>* iPendingOps;

        // Video Source initialization state.
        TInitState          iVSInitState;

        // Flags used to determine if audio and video sink/source
        // is added to protocol and media state.
        TInt                iProtoStateFlags;

        // protocol state.
        MVtProtocolCommand::TVtProtocolState        iProtoState;

        // Initialization flag.
        TBool               iInitialized;

        // Remote media state.
        TInt                iRemoteMediaState;

        // Pending operation from client.
        CVtEngOperation*    iPendingOp;

        // Protocol initialization information.
        TVtInitInfo     iSdkInitInfo;


        // Request status for (un)initialization.
        TRequestStatus*     iRequestStatus;

        // Audio controller handle.
        MVtAudioConfigCommand* iAudioCtrl;

        // Timer to detect failure in disconnection.
        CPeriodic* iTimer;

        // Protocol max volume.
        TInt iProtoMaxVolume;

        // Selected camera is not necessary activated also.
        TCameraId           iSelectedCameraId;

        // ETrue when it is allowed to update volume.
        TBool iUpdateVolumeAllowed;

        // ETrue when it is needed to update volume.
        TBool iUpdateVolumeRequired;

        // Owned asynch callback.
        CIdle* iAsyncCallback;

        // Pending volume operation.
        CVtEngOperation*    iPendingVolumeOp;

        // Used for various connection related operations.
        TInt iConnectionStates;

        // Used while pausing and resuming video.
        CVtEngLocalVideo::TVtEngProviderType iTempProviderInfo;

        // Used for setting the vendor info.
        MVtH324ConfigCommand* iH324Config;


        // Used H263 interface.
        MVtVideoConfigCommand* iH263Encoder;

        // Video quality
        TVtEngVideoQuality iVideoQuality;

        // Sharing object while video is disable will set this flag
        TVideoEngAction iVideoAction;

		// Logical channel structure for outgoing video channel(s).
		TLogicalChannel iVideoOutgoingLogicalChannel;

		// Logical channel structure for outgoing audio channel(s).
		TLogicalChannel iAudioOutgoingLogicalChannel;

		// Logical channel structure for incoming video channel(s).
		TLogicalChannel iVideoIncomingLogicalChannel;

		// Logical channel structure for incoming audio channel(s).
		TLogicalChannel iAudioIncomingLogicalChannel;

		/* For proceeding to next uninit step asynchronously.
		 * Needed because Proto extension interface cannot be released within
		 * callback 
		 */
		 CAsyncCallBack* iNextStepCallback;


        /* Do not complete operation on pause command. This flag
         * is used when image sharing is stopped and video was disabled
         * when sharing was initially started to prevent black frame sending
         * during blank switch.
         */
        TBool iPauseNoCompleteOp;

        /**
        * Result for asynchronous operation completion.
        */
        TInt iAsyncCompleteOpResult;
    };

#endif      // CVTENGMEDIAHANDLER_H

// End of File