mmsharing/mmshengine/src/musenglivesession.cpp
branchRCL_3
changeset 33 bc78a40cd63c
parent 32 73a1feb507fb
--- a/mmsharing/mmshengine/src/musenglivesession.cpp	Tue Aug 31 15:12:07 2010 +0300
+++ b/mmsharing/mmshengine/src/musenglivesession.cpp	Wed Sep 01 12:31:01 2010 +0100
@@ -18,14 +18,15 @@
 
 // USER
 #include "musenglivesession.h"
+#include "musengsessionobserver.h"
+#include "musenglivesessionobserver.h"
 #include "musunittesting.h"
 #include "musengmceutils.h"
 #include "musenglogger.h"
-#include "mussessionproperties.h"
-#include "musenglivevideoplayer.h"
+#include "mussettings.h"
+#include "musengorientationhandler.h"
 
 // SYSTEM
-#include <lcsessionobserver.h>
 #include <mcemanager.h>
 #include <mcecamerasource.h>
 #include <mcevideostream.h>
@@ -37,64 +38,632 @@
 #include <mceh263codec.h>
 #include <mceavccodec.h>
 
+const TInt KMaxBrightness = 100;
+const TInt KMinBrightness = -100;
+const TInt KBrightnessStepSize = 10;
 
-// -----------------------------------------------------------------------------
-//
-// -----------------------------------------------------------------------------
-//
-CMusEngLiveSession* CMusEngLiveSession::NewL()
-    {
-    CMusEngLiveSession* self = new( ELeave )CMusEngLiveSession();
-    CleanupStack::PushL( self );
-    self->ConstructL();
-    CleanupStack::Pop( self );
-    return self;
-    }
+// Names of AVC levels in string for config keys stored in CenRep 
+_LIT8( KMusAvcBitrateLevel1, "AvcBrL1=" );
+_LIT8( KMusAvcBitrateLevel1b, "AvcBrL1b=" );
+_LIT8( KMusAvcBitrateLevel1_1, "AvcBrL1_1=" );
+_LIT8( KMusAvcBitrateLevel1_2, "AvcBrL1_2=" );
+_LIT8( KMusAvcBitrateLevel1_3, "AvcBrL1_3=" );
+_LIT8( KMusAvcBitrateLevel2, "AvcBrL2=" );
+
+_LIT8( KMusEncoderInfoTokenizer, ";" );
+
+//Number of big and small zoom steps on Zoom scale
+const TInt KZoomBigStepCount = 15;
+const TInt KZoomSmallStepCount = KZoomBigStepCount*2;
+const TInt KZoomStepMinSize = 1;
+
+const TInt64 KZoomFasterTime = 333333; // 1/3 second
 
 // -----------------------------------------------------------------------------
 //
 // -----------------------------------------------------------------------------
 //
-CMusEngLiveSession::CMusEngLiveSession()
-    : CMusEngMceOutSession()
+EXPORT_C CMusEngLiveSession* CMusEngLiveSession::NewL(
+                        const TDesC& aFileName,
+                        const TRect& aRect,
+                        MMusEngSessionObserver& aSessionObserver,
+                        MMusEngOutSessionObserver& aOutSessionObserver,
+                        MMusEngLiveSessionObserver& aLiveSessionObserver,
+                        TUint aSipProfileId )
     {
+    CMusEngLiveSession* self = new( ELeave ) CMusEngLiveSession( 
+                                                    aSessionObserver,
+                                                    aOutSessionObserver,
+                                                    aLiveSessionObserver, 
+                                                    aRect,
+                                                    aFileName );
+    CleanupStack::PushL( self );
+    self->ConstructL( aSipProfileId );
+    CleanupStack::Pop( self );
+    return self;
     }
 
+
 // -----------------------------------------------------------------------------
 //
 // -----------------------------------------------------------------------------
 //
-void CMusEngLiveSession::ConstructL()
+EXPORT_C CMusEngLiveSession* CMusEngLiveSession::NewL(
+                        const TRect& aRect,
+                        MMusEngSessionObserver& aSessionObserver,
+                        MMusEngOutSessionObserver& aOutSessionObserver,
+                        MMusEngLiveSessionObserver& aLiveSessionObserver,
+                        TUint aSipProfileId )
     {
-    MUS_LOG( "mus: [ENGINE]  -> CMusEngLiveSession::ConstructL()" )
-    
-    iCameraHandler.ReadCameraUsageKeyL();
-    CMusEngMceOutSession::ConstructL();
-    
-    iLiveVideoPlayer = 
-        CMusEngLiveVideoPlayer::NewL( *this, iCameraHandler, *this );      
-    
-    MUS_LOG( "mus: [ENGINE]  <- CMusEngLiveSession::ConstructL()" )
+    CMusEngLiveSession* self = new( ELeave ) CMusEngLiveSession( 
+                                                    aSessionObserver,
+                                                    aOutSessionObserver,
+                                                    aLiveSessionObserver, 
+                                                    aRect );
+    CleanupStack::PushL( self );
+    self->ConstructL( aSipProfileId );
+    CleanupStack::Pop( self );
+    return self;
     }
 
+
 // -----------------------------------------------------------------------------
 //
 // -----------------------------------------------------------------------------
 //
 CMusEngLiveSession::~CMusEngLiveSession()
     {
-    MUS_LOG( "mus: [ENGINE]  -> CMusEngLiveSession::~CMusEngLiveSession()" )    
-    delete iLiveVideoPlayer;
+    MUS_LOG( "mus: [ENGINE]  -> CMusEngLiveSession::~CMusEngLiveSession()" )
+        
+    delete iOrientationHandler;
+    
     MUS_LOG( "mus: [ENGINE]  <- CMusEngLiveSession::~CMusEngLiveSession()" )
     }
 
+
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt CMusEngLiveSession::CurrentZoomL() const
+    {
+    MUS_LOG( "mus: [ENGINE]  -> CMusEngLiveSession::CurrentZoomL()" )
+    __ASSERT_ALWAYS( iSession, User::Leave( KErrNotReady ) );
+
+    CMceCameraSource* camera = MusEngMceUtils::GetCameraL( *iSession );
+
+    TInt currentZoom = camera->ZoomFactorL() + camera->DigitalZoomFactorL();
+
+    MUS_LOG1( "mus: [ENGINE]  <- CMusEngLiveSession::CurrentZoomL( %d )",
+              currentZoom )
+
+    return currentZoom;
+    }
+
+
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CMusEngLiveSession::SetZoomL( TInt aNewZoomFactor )
+    {
+    MUS_LOG1( "mus: [ENGINE]  -> CMusEngLiveSession::SetZoomL( %d )", 
+              aNewZoomFactor )
+              
+    __ASSERT_ALWAYS( iSession, User::Leave( KErrNotReady ) );
+    __ASSERT_ALWAYS( aNewZoomFactor <= MaxZoomL() &&
+                     aNewZoomFactor >= MinZoomL(), 
+                     User::Leave( KErrArgument ) );
+    
+    CMceCameraSource* camera = MusEngMceUtils::GetCameraL( *iSession );
+
+    if ( aNewZoomFactor < iCameraInfo.iMaxZoom )
+        {
+        MUS_LOG( "mus: [ENGINE]     Optical zoom factor increased" )
+        camera->SetZoomFactorL( aNewZoomFactor ); 
+        }
+    
+    if ( aNewZoomFactor - iCameraInfo.iMaxZoom >= 0 )
+        {
+        camera->SetDigitalZoomFactorL( aNewZoomFactor - iCameraInfo.iMaxZoom );
+        MUS_LOG1( "mus: [ENGINE]     Digital zoom factor increased to %d",
+                  aNewZoomFactor - iCameraInfo.iMaxZoom )
+        }
+    
+    MUS_LOG( "mus: [ENGINE]  <- CMusEngLiveSession::SetZoomL()" )
+    }
+
+
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt CMusEngLiveSession::MinZoomL() const
+    {
+    MUS_LOG( "mus: [ENGINE]  -> CMusEngLiveSession::MinZoomL()" )
+    __ASSERT_ALWAYS( iSession, User::Leave( KErrNotReady ) );
+
+    // Although we do not need camera for return value, we have to have it in
+    // order to have proper iCameraInfo
+    MusEngMceUtils::GetCameraL( *iSession );
+
+    MUS_LOG1( "mus: [ENGINE]  <- CMusEngLiveSession::MinZoomL( %d )",
+              iCameraInfo.iMinZoom )
+
+    return iCameraInfo.iMinZoom;
+    }
+    
+        
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt CMusEngLiveSession::MaxZoomL() const
+    {
+    MUS_LOG( "mus: [ENGINE]  -> CMusEngLiveSession::MaxZoomL()" )
+    __ASSERT_ALWAYS( iSession, User::Leave( KErrNotReady ) );
+
+    // Although we do not need camera for return value, we have to have it in
+    // order to have proper iCameraInfo
+    MusEngMceUtils::GetCameraL( *iSession );
+
+    TInt maxZoom = iCameraInfo.iMaxZoom + iCameraInfo.iMaxDigitalZoom;
+
+    MUS_LOG1( "mus: [ENGINE]     Max optical zoom( %d )",
+              iCameraInfo.iMaxZoom )
+    MUS_LOG1( "mus: [ENGINE]     Max digital zoom( %d )",
+              iCameraInfo.iMaxDigitalZoom )
+    MUS_LOG1( "mus: [ENGINE]  <- CMusEngLiveSession::MaxZoomL( %d )",
+              maxZoom )
+
+    return maxZoom;
+    }
+
+
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CMusEngLiveSession::ZoomInL()
+    {
+    MUS_LOG( "mus: [ENGINE]  -> CMusEngLiveSession::ZoomInL()" )
+    __ASSERT_ALWAYS( iSession, User::Leave( KErrNotReady ) );
+
+    CMceCameraSource* camera = MusEngMceUtils::GetCameraL( *iSession );
+
+    // First try to increase optical zoom factor. If in maximum value, try to
+    // increase digital zoom factor.
+    TInt stepSize = ZoomStepSize( iZoomInTime );
+    TInt zoomFactor = camera->ZoomFactorL();
+    TInt zoomDigitalFactor = camera->DigitalZoomFactorL();
+ 
+    //increate optical zoom factor
+    if ( zoomFactor + stepSize <= iCameraInfo.iMaxZoom )
+        {
+        //optical zoom factor is enough
+        camera->SetZoomFactorL( zoomFactor + stepSize );
+        stepSize = 0;
+        }
+    else if (zoomFactor <  iCameraInfo.iMaxZoom)
+       {
+            stepSize -=  iCameraInfo.iMaxZoom - zoomFactor;
+            camera->SetZoomFactorL( iCameraInfo.iMaxZoom );
+       }
+
+    //increate digital zoom factor
+    if (stepSize > 0)
+        {
+        if ( zoomDigitalFactor + stepSize <= iCameraInfo.iMaxDigitalZoom )
+            {
+            camera->SetDigitalZoomFactorL( zoomDigitalFactor + stepSize );
+            }
+        else 
+            {
+            camera->SetDigitalZoomFactorL( iCameraInfo.iMaxDigitalZoom );
+            MUS_LOG( "mus: [ENGINE]     CMusEngLiveSession::ZoomInL(): Optical \
+                             and digital zoom factors are in maximum value" )
+            }
+        }
+    
+    MUS_LOG( "mus: [ENGINE]  <- CMusEngLiveSession::ZoomInL()" )
+
+    }
+
+
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CMusEngLiveSession::ZoomOutL()
+    {
+    MUS_LOG( "mus: [ENGINE]  -> CMusEngLiveSession::ZoomOutL()" )
+    __ASSERT_ALWAYS( iSession, User::Leave( KErrNotReady ) );
+
+    CMceCameraSource* camera = MusEngMceUtils::GetCameraL( *iSession );
+
+    // First try to decrease digital zoom factor. If already zero, try to
+    // decrease optical zoom factor.
+    TInt stepSize = ZoomStepSize( iZoomOutTime );
+    TInt zoomFactor = camera->ZoomFactorL();
+    TInt zoomDigitalFactor = camera->DigitalZoomFactorL();
+    
+    //decreate digital zoom factor firstly
+    if ( zoomDigitalFactor - stepSize >= 0  )
+        {
+        //digital zoom factor is enough
+        camera->SetDigitalZoomFactorL( zoomDigitalFactor - stepSize );
+        stepSize = 0;
+        }
+    else if ( zoomDigitalFactor > 0 )
+        {
+        stepSize -= zoomDigitalFactor;
+        camera->SetDigitalZoomFactorL( 0 );
+        MUS_LOG("mus: [ENGINE] Digigal Factor to zero")
+        }
+   
+    //decreate optical zoom factor firstly
+    if ( stepSize > 0 )
+        {
+        if ( zoomFactor - stepSize > iCameraInfo.iMinZoom )
+            {
+            camera->SetZoomFactorL( zoomFactor - stepSize );
+            }
+        else 
+            {
+            MUS_LOG( "mus: [ENGINE]    CMusEngLiveSession::ZoomOutL(): Optical and \
+                        digital zoom factors are in minimum value" )
+            camera->SetZoomFactorL( iCameraInfo.iMinZoom );
+            }
+        }
+
+    MUS_LOG( "mus: [ENGINE]  <- CMusEngLiveSession::ZoomOutL()" )
+    }
+
+
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CMusEngLiveSession::ZoomDefaultL()
+    {
+    MUS_LOG( "mus: [ENGINE]  -> CMusEngLiveSession::ZoomDefaultL()" )
+
+    __ASSERT_ALWAYS( iSession, User::Leave( KErrNotReady ) );
+
+    CMceCameraSource* camera = MusEngMceUtils::GetCameraL( *iSession );
+
+    camera->SetZoomFactorL( iDefaultZoomFactor );
+    camera->SetDigitalZoomFactorL( 0 );
+
+    MUS_LOG( "mus: [ENGINE]  <- CMusEngLiveSession::ZoomDefaultL()" )
+    }
+
+
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CMusEngLiveSession::SetBrightnessL( TInt aBrightness ) const
+    {
+    MUS_LOG1( "mus: [ENGINE]  -> CMusEngLiveSession::SetBrightnessL( %d )",
+              aBrightness )
+
+    __ASSERT_ALWAYS( iSession, User::Leave( KErrNotReady ) );
+
+    CMceCameraSource* camera = MusEngMceUtils::GetCameraL( *iSession );
+    camera->SetBrightnessL( aBrightness );
+
+    MUS_LOG( "mus: [ENGINE]  <- CMusEngLiveSession::SetBrightnessL()" )
+    }
+
+
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt CMusEngLiveSession::CurrentBrightnessL() const
+    {
+    MUS_LOG( "mus: [ENGINE]  -> CMusEngLiveSession::CurrentBrightnessL()" )
+    
+    __ASSERT_ALWAYS( iSession, User::Leave( KErrNotReady ) );
+
+    CMceCameraSource* camera = MusEngMceUtils::GetCameraL( *iSession );
+    TInt currentBrightness = camera->BrightnessL();
+
+    MUS_LOG1( "mus: [ENGINE]  <- CMusEngLiveSession::CurrentBrightnessL(): %d",
+              currentBrightness )
+
+    return currentBrightness;
+    }
+
+
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt CMusEngLiveSession::MaxBrightnessL() const
+    {
+    MUS_LOG( "mus: [ENGINE]  -> CMusEngLiveSession::MaxBrightnessL()" )
+    
+    // maximum brightness is not in camera info, but a constant 100
+
+    MUS_LOG1( "mus: [ENGINE]  <- CMusEngLiveSession::MaxBrightnessL(): %d",
+              KMaxBrightness )
+
+    return KMaxBrightness;
+    }
+
+
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt CMusEngLiveSession::MinBrightnessL() const
+    {
+    MUS_LOG( "mus: [ENGINE]  -> CMusEngLiveSession::MinBrightnessL()" )
+ 
+    // maximum brightness is not in camera info, but a constant -100
+
+    MUS_LOG1( "mus: [ENGINE]  <- CMusEngLiveSession::MinBrightnessL(): %d",
+              KMinBrightness )
+
+    return KMinBrightness;
+    }
+
+
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CMusEngLiveSession::IncreaseBrightnessL()
+    {
+    MUS_LOG( "mus: [ENGINE]  -> CMusEngLiveSession::IncreaseBrightnessL()" )
+    __ASSERT_ALWAYS( iSession, User::Leave( KErrNotReady ) );
+
+    CMceCameraSource* camera = MusEngMceUtils::GetCameraL( *iSession );
+
+    TInt newBrightness = camera->BrightnessL() + KBrightnessStepSize;
+    
+    if ( newBrightness < KMaxBrightness )
+        {
+        camera->SetBrightnessL( newBrightness );
+        }
+    else
+        {
+        camera->SetBrightnessL( KMaxBrightness );
+        }
+
+    MUS_LOG( "mus: [ENGINE]  <- CMusEngLiveSession::IncreaseBrightnessL()" )
+    }
+
+
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CMusEngLiveSession::DecreaseBrightnessL()
+    {
+    MUS_LOG( "mus: [ENGINE]  -> CMusEngLiveSession::DecreaseBrightnessL()" )
+    __ASSERT_ALWAYS( iSession, User::Leave( KErrNotReady ) );
+
+    CMceCameraSource* camera = MusEngMceUtils::GetCameraL( *iSession );
+
+    TInt newBrightness = camera->BrightnessL() - KBrightnessStepSize;
+
+    if ( newBrightness > KMinBrightness )
+        {
+        camera->SetBrightnessL( newBrightness );
+        }
+    else
+        {
+        camera->SetBrightnessL( KMinBrightness );
+        }
+
+    MUS_LOG( "mus: [ENGINE]  <- CMusEngLiveSession::DecreaseBrightnessL()" )
+    }
+
+
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CMusEngLiveSession::BrightnessDefaultL()
+    {
+    MUS_LOG( "mus: [ENGINE]  -> CMusEngLiveSession::BrightnessDefaultL()" )
+    __ASSERT_ALWAYS( iSession, User::Leave( KErrNotReady ) );
+
+    CMceCameraSource* camera = MusEngMceUtils::GetCameraL( *iSession );
+
+    camera->SetBrightnessL( iDefaultBrightness );
+
+    MUS_LOG( "mus: [ENGINE]  <- CMusEngLiveSession::BrightnessDefaultL()" )
+    }
+
+
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CMusEngLiveSession::BrightnessAutoL()
+    {
+    MUS_LOG( "mus: [ENGINE]  -> CMusEngLiveSession::BrightnessAutoL()" )
+    __ASSERT_ALWAYS( iSession, User::Leave( KErrNotReady ) );
+
+    CMceCameraSource* camera = MusEngMceUtils::GetCameraL( *iSession );
+
+    camera->SetBrightnessL( CCamera::EBrightnessAuto );
+
+    MUS_LOG( "mus: [ENGINE]  <- CMusEngLiveSession::BrightnessAutoL()" )
+    }
+
+
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CMusEngLiveSession::RecordL( TBool aRecord )
+    {
+    MUS_LOG1( "mus: [ENGINE]  -> CMusEngLiveSession::RecordL( %d )", aRecord )    
+    
+    __ASSERT_ALWAYS( iSession, User::Leave( KErrNotReady ) );
+
+    CMceMediaSink* fileSink = MusEngMceUtils::GetMediaSink( *iSession, 
+                                                            KMceFileSink );
+    
+    __ASSERT_ALWAYS( fileSink, User::Leave( KErrNotReady ) );
+    
+    if( aRecord && !fileSink->IsEnabled() )
+        {
+        fileSink->EnableL();        
+        }
+    else if ( !aRecord && fileSink->IsEnabled() )
+        {
+        fileSink->DisableL();        
+        }
+    else
+        {
+        // NOP
+        }
+
+    MUS_LOG1( "mus: [ENGINE]  <- CMusEngLiveSession::RecordL( %d )", aRecord ) 
+    }    
+
+
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TBool CMusEngLiveSession::IsRecording()
+    {
+    MUS_LOG( "mus: [ENGINE]  -> CMusEngLiveSession::IsRecording()" )    
+    
+    TBool isRecording( EFalse );
+  
+    CMceMediaSink* fileSink = MusEngMceUtils::GetMediaSink( *iSession, 
+                                                            KMceFileSink );
+    if ( fileSink )
+        {
+        isRecording = fileSink->IsEnabled();
+        }
+        
+    MUS_LOG1( "mus: [ENGINE]  <- CMusEngLiveSession::IsRecording(%d)",
+              isRecording )
+                 
+    return isRecording;
+    }
+
+
+// -----------------------------------------------------------------------------
+// Enable camera if not already enabled
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CMusEngLiveSession::PlayL()
+    {
+    MUS_LOG( "mus: [ENGINE]  -> CMusEngLiveSession::PlayL()" )
+
+    __ASSERT_ALWAYS( iSession, User::Leave( KErrNotReady ) );
+    
+    CMceCameraSource* camera = MusEngMceUtils::GetCameraL( *iSession );
+
+    if ( !camera->IsEnabled() )
+        {
+        camera->EnableL();
+        }
+    else
+        {
+        MUS_LOG( "mus: [ENGINE]    Camera already enabled, ignore request" )
+        }
+    
+    iOrientationHandler->UpdateL();
+        
+    MUS_LOG( "mus: [ENGINE]  <- CMusEngLiveSession::PlayL()" )
+    }
+
+
+// -----------------------------------------------------------------------------
+// Disable camera if not already disabled
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CMusEngLiveSession::PauseL()
+    {
+    MUS_LOG( "mus: [ENGINE]  -> CMusEngLiveSession::PauseL()" )
+
+    __ASSERT_ALWAYS( iSession, User::Leave( KErrNotReady ) );
+
+    CMceCameraSource* camera = MusEngMceUtils::GetCameraL( *iSession );
+
+    if ( camera->IsEnabled() )
+        {
+        camera->DisableL();
+        }
+    else
+        {
+        MUS_LOG( "mus: [ENGINE]    Camera already disabled, ignore request" )
+        }
+
+    iOrientationHandler->UpdateL();
+    
+    MUS_LOG( "mus: [ENGINE]  <- CMusEngLiveSession::PauseL()" )
+    }
+
+
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TBool CMusEngLiveSession::IsPlayingL()
+    {
+    __ASSERT_ALWAYS( iSession, User::Leave( KErrNotReady ) );
+    
+    return ( MusEngMceUtils::GetCameraL( *iSession )->IsEnabled() );
+    }
+
 // -----------------------------------------------------------------------------
-// From MLcSession
+//
+// -----------------------------------------------------------------------------
+//
+void CMusEngLiveSession::EnableDisplayL( TBool aEnable )
+{
+    CMusEngMceSession::EnableDisplayL( aEnable );
+    iOrientationHandler->UpdateL();
+}
+    
+// -----------------------------------------------------------------------------
+//
 // -----------------------------------------------------------------------------
 //
-MLcVideoPlayer* CMusEngLiveSession::LocalVideoPlayer()
+void CMusEngLiveSession::RefreshOrientationL()
+    {
+    MUS_LOG( "mus: [ENGINE]  -> CMusEngLiveSession::RefreshOrientationL()" )
+        
+    iOrientationHandler->RefreshOrientationL();
+        
+    MUS_LOG( "mus: [ENGINE]  <- CMusEngLiveSession::RefreshOrientationL()" )
+    }
+
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+//
+void CMusEngLiveSession::InitializeZoomStepSize()
     {
-    return iLiveVideoPlayer;
+    MUS_LOG( "mus: [ENGINE]  -> CMusEngLiveSession::InitializeZoomStepSize()" )
+    
+    iBigZoomStep = ( iCameraInfo.iMaxZoom + iCameraInfo.iMaxDigitalZoom - 
+            iCameraInfo.iMinZoom ) / KZoomBigStepCount;
+            
+    if ( iBigZoomStep < KZoomStepMinSize )
+        iBigZoomStep = KZoomStepMinSize;
+
+    iSmallZoomStep = ( iCameraInfo.iMaxZoom + iCameraInfo.iMaxDigitalZoom - 
+            iCameraInfo.iMinZoom ) / KZoomSmallStepCount;
+    
+    if ( iSmallZoomStep < KZoomStepMinSize )
+        iSmallZoomStep = KZoomStepMinSize;
+
+    MUS_LOG2( "mus: [ENGINE]  iSmallZoomStep = %d, iBigZoomStep = %d", 
+            iSmallZoomStep, iBigZoomStep )
+    MUS_LOG( "mus: [ENGINE]  <- CMusEngLiveSession::InitializeZoomStepSize()" )   
     }
 
 // -----------------------------------------------------------------------------
@@ -102,14 +671,12 @@
 // -----------------------------------------------------------------------------
 //
 void CMusEngLiveSession::CompleteSessionStructureL( 
-    CMceStreamBundle& /*aLocalBundle*/ )
+                                            CMceStreamBundle& /*aLocalBundle*/ )
     {
     MUS_LOG( "mus: [ENGINE]  -> CMusEngLiveSession::CompleteSessionStructureL()" )
 
     __ASSERT_ALWAYS( iSession, User::Leave( KErrNotReady ) );
 
-    iCameraHandler.SetSession( iSession );
-    
     // Create outgoing video stream
     CMceVideoStream* videoStream = CMceVideoStream::NewLC();
     
@@ -119,8 +686,10 @@
 
     CMceCameraSource* camera = CMceCameraSource::NewLC( *iManager );
     camera->DisableL(); // Start session in pause mode.
+    camera->GetCameraInfo( iCameraInfo );
+    iDefaultZoomFactor = camera->ZoomFactorL();
     
-    iCameraHandler.InitializeL( *camera );
+    InitializeZoomStepSize();
         
     videoStream->SetSourceL( camera );
     CleanupStack::Pop( camera );
@@ -129,12 +698,11 @@
     CleanupStack::Pop( videoStream );    
 
     // Construct recording stream if needed
-    if ( iLiveVideoPlayer->LcFileName().Length() > 0 )
+    if ( iRecordedFile != KNullDesC )
         {
         CMceVideoStream* streamForRecording = CMceVideoStream::NewLC();
         
-        CMceFileSink* fileSink = 
-            CMceFileSink::NewLC( iLiveVideoPlayer->LcFileName() );
+        CMceFileSink* fileSink = CMceFileSink::NewLC( iRecordedFile );
         fileSink->DisableL(); // Start in not recording mode
         streamForRecording->AddSinkL( fileSink );
         CleanupStack::Pop( fileSink );
@@ -143,22 +711,56 @@
         iSession->AddStreamL( streamForRecording );
         CleanupStack::Pop( streamForRecording );
         }
-    
-    iLiveVideoPlayer->SetMceSession( iSession );
-    
+
     MUS_LOG( "mus: [ENGINE]  <- CMusEngLiveSession::CompleteSessionStructureL()" )
     }
 
+
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+//
+void CMusEngLiveSession::HandleSessionStateChanged( 
+                                                CMceSession& aSession,
+                                                TInt aStatusCode,
+                                                const TDesC8& aReasonPhrase )
+    {
+    MUS_LOG( "mus: [ENGINE]  -> CMusEngLiveSession::HandleSessionStateChanged" )
+    
+    MUS_ENG_LOG_SESSION_STATE_AND_STATUS( aSession, aStatusCode, aReasonPhrase )
+    
+    if ( iSession && 
+         iSession == &aSession && 
+         aSession.State() == CMceSession::EEstablished &&
+         iStoreEncoderConfigInfo )
+        {
+        iStoreEncoderConfigInfo = EFalse;
+        TRAPD( error, StoreEncoderConfigInfoL() )
+        if ( error != KErrNone && error != KErrNotFound )
+            {
+            // Only acceptable error is absence of repository entry,
+            // otherwise we inform user about failed session.
+            iSessionObserver.SessionFailed();
+            }
+        }
+     
+    CMusEngMceSession::HandleSessionStateChanged( aSession,
+                                                  aStatusCode, 
+                                                  aReasonPhrase );
+    
+    MUS_LOG( "mus: [ENGINE]  <- CMusEngLiveSession::HandleSessionStateChanged" )
+    }
+
+
 // -----------------------------------------------------------------------------
 // Sets video codec attributes
 // -----------------------------------------------------------------------------
 //
-void CMusEngLiveSession::AdjustVideoCodecL( CMceVideoCodec& aVideoCodec,
-                                            TMceSourceType aSourceType )
+void CMusEngLiveSession::AdjustVideoCodecL( CMceVideoCodec& aVideoCodec )
     {
     MUS_LOG( "mus: [ENGINE] -> CMusEngLiveSession::AdjustVideoCodecL()" )
     
-    CMusEngMceOutSession::AdjustVideoCodecL( aVideoCodec, aSourceType );
+    CMusEngMceOutSession::AdjustVideoCodecL( aVideoCodec );
     
     // Starting with 80Kbps  will give better quality than starting with
     // 64kbps.And if network behaves bad than anyhow we will drop down or
@@ -184,7 +786,10 @@
         User::LeaveIfError( aVideoCodec.SetAllowedBitrates( 
                                         KMceAvcCodecProfileIdBaseline | 
                                         KMceAvcCodecProfileIopConstraintSet | 
-                                        KMceAvcBitrateLevel1b ) );                           
+                                        KMceAvcBitrateLevel1b ) );
+        
+        SetCodecConfigKeyL( aVideoCodec );
+        SetEncodingDeviceL( aVideoCodec );                             
         }
     else
         {
@@ -194,6 +799,7 @@
     MUS_LOG( "mus: [ENGINE] <- CMusEngLiveSession::AdjustVideoCodecL()" )
     }
     
+    
 // -----------------------------------------------------------------------------
 //
 // -----------------------------------------------------------------------------
@@ -207,6 +813,7 @@
     MUS_LOG( "mus: [ENGINE] <- CMusEngLiveSession::AdjustAudioCodecL()" )
     }
 
+
 // -----------------------------------------------------------------------------
 //
 // -----------------------------------------------------------------------------
@@ -217,7 +824,9 @@
     
     CMusEngMceSession::DoCodecSelectionL( aVideoStream );
     
-    if ( iVideoCodecList && !IsH264Supported() )
+    if ( iVideoCodecList &&
+         iVideoCodecList->Length() > 0 &&
+         iVideoCodecList->FindF( KMceSDPNameH264 ) == KErrNotFound )
         {        
         // We know that recipient doesn't support AVC, so we do not offer it
         const RPointerArray<CMceVideoCodec>& codecs = aVideoStream.Codecs();
@@ -236,6 +845,7 @@
      
     MUS_LOG( "mus: [ENGINE]  <- CMusEngLiveSession::DoCodecSelectionL()" )
     }
+    
 
 // -----------------------------------------------------------------------------
 //
@@ -254,14 +864,14 @@
     MUS_ENG_LOG_STREAM_STATE( aStream )
     
     CMceVideoStream* recordingStream = 
-        MusEngMceUtils::GetRecordingStream( *iSession );
+                            MusEngMceUtils::GetRecordingStream( *iSession );
     
     if ( recordingStream &&
          recordingStream == &aStream &&
          aStream.State() == CMceMediaStream::ENoResources &&
          aSink.IsEnabled() == EFalse )
         {
-        InformObserverAboutSessionFailure( MLcSession::EDiskFull );
+        iLiveSessionObserver.DiskFull();
         }
     else
         {
@@ -271,3 +881,276 @@
     
     MUS_LOG( "mus: [ENGINE] <- CMusEngLiveSession::StreamStateChanged( sink )" )
     }
+    
+
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+//
+CMusEngLiveSession::CMusEngLiveSession(
+                        MMusEngSessionObserver& aSessionObserver,
+                        MMusEngOutSessionObserver& aOutSessionObserver,
+                        MMusEngLiveSessionObserver& aLiveSessionObserver,
+                        const TRect& aRect,
+                        const TDesC& aRecordedFile )
+    : CMusEngMceOutSession( aRect,
+                            aSessionObserver,
+                            aOutSessionObserver ),
+      iLiveSessionObserver( aLiveSessionObserver ),
+      iDefaultZoomFactor( -1 ),
+      iDefaultBrightness( 0 ),
+      iRecordedFile( aRecordedFile ),
+      iZoomInTime(0),
+      iZoomOutTime(0),
+      iSmallZoomStep( KZoomStepMinSize ),
+      iBigZoomStep( KZoomStepMinSize )
+    {
+    }
+
+
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+//
+void CMusEngLiveSession::ConstructL( TUint aSipProfileId )
+    {
+    MUS_LOG( "mus: [ENGINE]  -> CMusEngLiveSession::ConstructL()" )
+
+    CMusEngMceOutSession::ConstructL( aSipProfileId );
+
+    iOrientationHandler = CMusEngOrientationHandler::NewL( *this, iLiveSessionObserver );
+    
+    MUS_LOG( "mus: [ENGINE]  <- CMusEngLiveSession::ConstructL()" )
+    }
+
+
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+//
+void CMusEngLiveSession::SetEncodingDeviceL( CMceVideoCodec& aVideoCodec )
+    {
+    MUS_LOG( "mus: [ENGINE] -> CMusEngLiveSession::SetEncodingDeviceL()" )
+
+    // We try to read encoding device UID. If we do not succeed, we use default
+    
+    const TUid KDefaultEncodingDevice( TUid::Uid( 0x20001C13 ) );
+    TUid encodingDevice( KDefaultEncodingDevice );
+    TRAPD( error, 
+           encodingDevice = MultimediaSharingSettings::EncodingDeviceL() )
+    __ASSERT_ALWAYS( error == KErrNone || error == KErrNotFound, 
+                     User::Leave( error ) );
+    aVideoCodec.SetPreferredEncodingDecodingDeviceL( encodingDevice );
+    
+    MUS_LOG( "mus: [ENGINE] <- CMusEngLiveSession::SetEncodingDeviceL()" )
+    }
+    
+
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+//
+void CMusEngLiveSession::SetCodecConfigKeyL( CMceVideoCodec& aVideoCodec )
+    {
+    MUS_LOG( "mus: [ENGINE] -> CMusEngLiveSession::SetCodecConfigKeyL()" )
+    
+    HBufC8* configKey( NULL );
+        
+    // We try to read config key. If we do not succeed, we prepare to
+    // write keys to CenRep for the next time.
+    TRAPD( error, configKey = ReadCodecConfigKeyL( aVideoCodec ) )
+    
+    if ( error == KErrNone )
+        {
+        // There is a repository for config keys
+        if ( configKey )
+            {
+            // ...and key is found.
+            CleanupStack::PushL( configKey );
+            aVideoCodec.SetConfigKeyL( *configKey );
+            CleanupStack::PopAndDestroy( configKey );
+            }
+        else
+            {
+            // ...but key is not found, so it must be written to CenRep when
+            // available. 
+            iStoreEncoderConfigInfo = ETrue;
+            }
+        }
+    else if ( error == KErrNotFound )
+        {
+        // There is no repository for config keys so there is no point
+        // trying to write anything there. Session setup can still continue.
+        MUS_LOG1( "mus: [ENGINE]    No repository for config keys [%d]", error )
+        }            
+    else
+        {
+        User::Leave( error );
+        }
+    
+    MUS_LOG( "mus: [ENGINE] <- CMusEngLiveSession::SetCodecConfigKeyL()" )
+    }
+
+
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+//
+HBufC8* CMusEngLiveSession::ReadCodecConfigKeyL( 
+                                    const CMceVideoCodec& aVideoCodec ) const
+    {
+    MUS_LOG( "mus: [ENGINE] -> CMusEngLiveSession::ReadCodecConfigKeyL()" )
+    
+    HBufC8* key( NULL );
+ 
+    HBufC8* encoderInfo = MultimediaSharingSettings::EncoderConfigInfoLC();
+    __ASSERT_ALWAYS( encoderInfo, User::Leave( KErrNotFound ) );
+    
+    TPtrC8 keyId( ConfigKeyIdL( aVideoCodec ) ); 
+    
+    TInt tokenStartPosition( encoderInfo->FindC( keyId ) );
+    if ( tokenStartPosition > KErrNotFound )
+        {
+        TInt tokenLength( encoderInfo->Mid( tokenStartPosition ).FindC( 
+                                                KMusEncoderInfoTokenizer ) );
+        if ( tokenLength > KErrNotFound )
+            {
+            // Separate key from token by removing keyId
+            TInt keyStartPosition = tokenStartPosition + keyId.Length();
+            TInt keyLength = tokenLength - keyId.Length(); 
+            TPtrC8 keyPtr = encoderInfo->Mid( keyStartPosition, keyLength );
+            key = keyPtr.AllocL();
+            }
+        }
+    
+    CleanupStack::PopAndDestroy( encoderInfo );
+    
+    MUS_LOG( "mus: [ENGINE] <- CMusEngLiveSession::ReadCodecConfigKeyL()" )
+        
+    return key;   
+    }
+    
+
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+//
+void CMusEngLiveSession::StoreEncoderConfigInfoL() const
+    {
+    MUS_LOG( "mus: [ENGINE] -> CMusEngLiveSession::StoreEncoderConfigInfoL()" )
+    
+    HBufC8* configInfoInCenRep = MultimediaSharingSettings::EncoderConfigInfoLC();
+    __ASSERT_ALWAYS( configInfoInCenRep, User::Leave( KErrNotFound ) );
+    
+    TBuf8<NCentralRepositoryConstants::KMaxBinaryLength> keys;
+    keys.Append( *configInfoInCenRep );
+    
+    CMceVideoStream* stream = MusEngMceUtils::GetVideoOutStreamL( *iSession );
+    const RPointerArray<CMceVideoCodec>& codecs = stream->Codecs();
+    
+    for ( TInt codecIndex = 0; codecIndex < codecs.Count(); ++codecIndex )
+        {
+        if ( codecs[codecIndex]->SdpName().FindF( KMceSDPNameH264 ) >= 0 )
+            {
+            const TPtrC8 keyId = ConfigKeyIdL( *codecs[codecIndex] );
+            HBufC8* configKey = codecs[codecIndex]->ConfigKeyL();
+            CleanupStack::PushL( configKey );
+            
+            if ( configKey &&
+                 keys.FindF( keyId ) == KErrNotFound &&
+                 configInfoInCenRep->FindF( keyId ) == KErrNotFound )
+                {
+                
+                if ( keys.Length() + 
+                     keyId.Length() + 
+                     configKey->Length() +
+                     KMusEncoderInfoTokenizer().Length() <
+                     NCentralRepositoryConstants::KMaxBinaryLength )
+                    {
+                    keys.Append( keyId );                    
+                    keys.Append( *configKey );
+                    keys.Append( KMusEncoderInfoTokenizer );
+                    }
+                }
+                
+            CleanupStack::PopAndDestroy( configKey );
+            }
+        }
+    
+    MultimediaSharingSettings::SetEncoderConfigInfoL( keys );    
+    
+    CleanupStack::PopAndDestroy( configInfoInCenRep );
+        
+    MUS_LOG( "mus: [ENGINE] <- CMusEngLiveSession::StoreEncoderConfigInfoL()" )
+    }
+
+
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+//
+const TPtrC8 CMusEngLiveSession::ConfigKeyIdL(
+                                    const CMceVideoCodec& aVideoCodec ) const
+    {
+    MUS_LOG( "mus: [ENGINE] -> CMusEngLiveSession::ConfigKeyIdL()" )
+    
+    // Currently works only for AVC
+    __ASSERT_ALWAYS( aVideoCodec.SdpName().FindF( KMceSDPNameH264 ) >= 0,
+                     User::Leave( KErrArgument ) );
+    
+    TPtrC8 configKeyTokenId;
+    
+    if ( aVideoCodec.AllowedBitrates() & KMceAvcBitrateLevel1 )
+        {
+        configKeyTokenId.Set( KMusAvcBitrateLevel1() );
+        }
+    else if ( aVideoCodec.AllowedBitrates() & KMceAvcBitrateLevel1b )
+        {
+        configKeyTokenId.Set( KMusAvcBitrateLevel1b() );
+        }
+    else if ( aVideoCodec.AllowedBitrates() & KMceAvcBitrateLevel1_1 )
+        {
+        configKeyTokenId.Set( KMusAvcBitrateLevel1_1() );
+        }
+    else if ( aVideoCodec.AllowedBitrates() & KMceAvcBitrateLevel1_2 )
+        {
+        configKeyTokenId.Set( KMusAvcBitrateLevel1_2() );
+        }
+    else if ( aVideoCodec.AllowedBitrates() & KMceAvcBitrateLevel1_3 )
+        {
+        configKeyTokenId.Set( KMusAvcBitrateLevel1_3() );
+        }
+    else if ( aVideoCodec.AllowedBitrates() & KMceAvcBitrateLevel2 )
+        {
+        configKeyTokenId.Set( KMusAvcBitrateLevel2() );
+        }
+    else
+        {
+        User::Leave( KErrNotFound );
+        }
+    
+    MUS_LOG( "mus: [ENGINE] <- CMusEngLiveSession::ConfigKeyIdL()" )
+
+    return configKeyTokenId;
+    }
+
+
+// -----------------------------------------------------------------------------
+//  Calculate the zoom step based time escaped
+// -----------------------------------------------------------------------------
+TInt CMusEngLiveSession::ZoomStepSize( TInt64& aTime )
+    {
+//    MUS_LOG( "mus: [ENGINE]  -> CMusEngLiveSession::ZoomStepSize()" )    
+    TTime now;
+    now.HomeTime();
+    TInt64 timeNow = now.Int64();   
+    TInt stepSize = ( ( timeNow - aTime ) <= KZoomFasterTime ) ? iBigZoomStep : iSmallZoomStep;
+    
+    aTime = now.Int64();
+    
+    MUS_LOG1( "mus: [ENGINE]  stepSize = %d", stepSize );    
+//    MUS_LOG( "mus: [ENGINE]  <- CMusEngLiveSession::ZoomStepSize()" )
+    return stepSize;
+    }
+
+