mmsharing/mmshengine/src/musengtwowayrecvsession.cpp
branchRCL_3
changeset 33 bc78a40cd63c
parent 32 73a1feb507fb
child 35 6c57ef9392d2
equal deleted inserted replaced
32:73a1feb507fb 33:bc78a40cd63c
     1 /*
       
     2 * Copyright (c) 2005 Nokia Corporation and/or its subsidiary(-ies).
       
     3 * All rights reserved.
       
     4 * This component and the accompanying materials are made available
       
     5 * under the terms of "Eclipse Public License v1.0"
       
     6 * which accompanies this distribution, and is available
       
     7 * at the URL "http://www.eclipse.org/legal/epl-v10.html".
       
     8 *
       
     9 * Initial Contributors:
       
    10 * Nokia Corporation - initial contribution.
       
    11 *
       
    12 * Contributors:
       
    13 *
       
    14 * Description: 
       
    15 *
       
    16 */
       
    17 
       
    18 
       
    19 // USER
       
    20 #include "musengtwowayrecvsession.h"
       
    21 #include "musunittesting.h"
       
    22 #include "musengmceutils.h"
       
    23 #include "musenglogger.h"
       
    24 #include "mussipprofilehandler.h"
       
    25 #include "musenglivevideoplayer.h"
       
    26 #include "musengremotevideoplayer.h"
       
    27 
       
    28 // SYSTEM
       
    29 #include <lcsessionobserver.h>
       
    30 #include <mcemanager.h>
       
    31 #include <mcecamerasource.h>
       
    32 #include <mcevideostream.h>
       
    33 #include <mcertpsink.h>
       
    34 #include <mcedisplaysink.h>
       
    35 #include <mcesession.h>
       
    36 #include <mcertpsource.h>
       
    37 #include <mcestreambundle.h>
       
    38 #include <musmanager.h>
       
    39 
       
    40 const TInt KMusEngJitterBufferLength = 51; //Must be bigger than treshold
       
    41 // Using following value increases treshold buffer to 1 second from 
       
    42 // default 100 ms
       
    43 const TInt KMusEngJitterBufferTreshold = 50;
       
    44 
       
    45 const TUint32 KMusEngTwoWayReceivingActivityTimeout = 5000; // 5 seconds
       
    46 // 6 seconds keepalive timer, needs to be more than receiving timeout
       
    47 const TUint8 KMusEngTwoWayRtpKeepAliveTimer = 6; 
       
    48 
       
    49 // -----------------------------------------------------------------------------
       
    50 //
       
    51 // -----------------------------------------------------------------------------
       
    52 //
       
    53 CMusEngTwoWayRecvSession* CMusEngTwoWayRecvSession::NewL()
       
    54     {
       
    55     CMusEngTwoWayRecvSession* self = new( ELeave )CMusEngTwoWayRecvSession();
       
    56     CleanupStack::PushL( self );
       
    57     self->ConstructL();
       
    58     CleanupStack::Pop( self );
       
    59     return self;
       
    60     }
       
    61 
       
    62 // -----------------------------------------------------------------------------
       
    63 //
       
    64 // -----------------------------------------------------------------------------
       
    65 //
       
    66 CMusEngTwoWayRecvSession::~CMusEngTwoWayRecvSession()
       
    67     {
       
    68     MUS_LOG( "mus: [ENGINE]  -> CMusEngTwoWayRecvSession::~CMusEngTwoWayRecvSession()" )
       
    69     
       
    70     delete iLiveVideoPlayer;  
       
    71     
       
    72     MUS_LOG( "mus: [ENGINE]  <- CMusEngTwoWayRecvSession::~CMusEngTwoWayRecvSession()" )
       
    73     }
       
    74 
       
    75 // -----------------------------------------------------------------------------
       
    76 // 
       
    77 // -----------------------------------------------------------------------------
       
    78 //
       
    79 void CMusEngTwoWayRecvSession::EnableDisplayL( TBool aEnable )
       
    80     {
       
    81     MUS_LOG1( "mus: [ENGINE]     -> CMusEngTwoWayRecvSession::EnableDisplayL() %d", 
       
    82               aEnable )
       
    83 
       
    84     __ASSERT_ALWAYS( iSession, User::Leave( KErrNotReady ) );
       
    85 
       
    86     CMceDisplaySink* display = MusEngMceUtils::GetReceivingDisplayL( *iSession );
       
    87     MusEngMceUtils::DoEnableDisplayL( *display, aEnable );
       
    88                 
       
    89     CMceDisplaySink* vfDisplay = MusEngMceUtils::GetVfDisplay( *iSession );
       
    90     if ( vfDisplay )
       
    91         {
       
    92         MusEngMceUtils::DoEnableDisplayL( *vfDisplay, aEnable );  
       
    93         }
       
    94         
       
    95     MUS_LOG( "mus: [ENGINE]  <- CMusEngTwoWayRecvSession::EnableDisplayL()")
       
    96     }
       
    97 
       
    98 // -----------------------------------------------------------------------------
       
    99 // 
       
   100 // -----------------------------------------------------------------------------
       
   101 //
       
   102 TBool CMusEngTwoWayRecvSession::IsDisplayEnabled()
       
   103     {
       
   104     TBool enabled( EFalse );
       
   105     if ( iSession )
       
   106         {
       
   107         CMceDisplaySink* display = MusEngMceUtils::GetReceivingDisplay( *iSession );
       
   108         if ( display )
       
   109            {
       
   110            enabled = display->IsEnabled();
       
   111            }
       
   112         }
       
   113     return enabled;
       
   114     }
       
   115 
       
   116 // -----------------------------------------------------------------------------
       
   117 //
       
   118 // -----------------------------------------------------------------------------
       
   119 //
       
   120 CMusEngMceSession::TDisplayOrientation CMusEngTwoWayRecvSession::OrientationL()
       
   121     {
       
   122     MUS_LOG( "mus: [ENGINE]  -> CMusEngTwoWayRecvSession::RotationL()" )
       
   123     
       
   124     __ASSERT_ALWAYS( iSession, User::Leave( KErrNotReady ) );
       
   125     
       
   126     CMceDisplaySink* display = MusEngMceUtils::GetReceivingDisplayL( *iSession );
       
   127     
       
   128     TDisplayOrientation displayOrientation;
       
   129     CMceDisplaySink::TRotation rotation( display->RotationL() );
       
   130     
       
   131     MUS_LOG1( "mus: [ENGINE]     MCE rotation is %d", rotation )
       
   132     
       
   133     if ( rotation == CMceDisplaySink::ENone )
       
   134         {
       
   135         displayOrientation = CMusEngMceSession::EPortrait;
       
   136         }
       
   137     else
       
   138         {
       
   139         displayOrientation = CMusEngMceSession::ELandscape;
       
   140         }
       
   141     
       
   142     MUS_LOG1( "mus: [ENGINE]  <- CMusEngTwoWayRecvSession::RotationL() %d", 
       
   143               displayOrientation )
       
   144     
       
   145     return displayOrientation;
       
   146     }
       
   147 
       
   148 // -----------------------------------------------------------------------------
       
   149 //
       
   150 // -----------------------------------------------------------------------------
       
   151 //        
       
   152 void CMusEngTwoWayRecvSession::SetOrientationL( TDisplayOrientation aOrientation )
       
   153     {
       
   154     MUS_LOG1( "mus: [ENGINE]  -> CMusEngTwoWayRecvSession::SetOrientationL() %d", 
       
   155               aOrientation )
       
   156               
       
   157     __ASSERT_ALWAYS( iSession, User::Leave( KErrNotReady ) );
       
   158     
       
   159     CMceDisplaySink* display = MusEngMceUtils::GetReceivingDisplayL( *iSession );
       
   160             
       
   161     CMceDisplaySink* vfDisplay = MusEngMceUtils::GetVfDisplay( *iSession );
       
   162 
       
   163     CMceDisplaySink::TRotation rotation = ( aOrientation == EPortrait ) ? 
       
   164         CMceDisplaySink::ENone : CMceDisplaySink::EClockwise90Degree;
       
   165     
       
   166     display->SetRotationL( rotation );
       
   167     if ( vfDisplay )
       
   168         {
       
   169         vfDisplay->SetRotationL( rotation );
       
   170         }
       
   171     
       
   172     MUS_LOG( "mus: [ENGINE]  <- CMusEngTwoWayRecvSession::SetOrientationL()" )
       
   173     }
       
   174 
       
   175 // -----------------------------------------------------------------------------
       
   176 //
       
   177 // -----------------------------------------------------------------------------
       
   178 //
       
   179 void CMusEngTwoWayRecvSession::SetRectsL( 
       
   180     const TRect& aRemoteRect,
       
   181     const TRect& aLocalRect )
       
   182     {
       
   183     MUS_LOG( "mus: [ENGINE]  -> CMusEngTwoWayRecvSession::SetRectsL()" )  
       
   184      
       
   185     iLocalRect = aLocalRect;
       
   186     iRect = aRemoteRect;
       
   187     RectChangedL();
       
   188     
       
   189     MUS_LOG( "mus: [ENGINE]  <- CMusEngTwoWayRecvSession::SetRectsL()" )
       
   190     }
       
   191 
       
   192 // -----------------------------------------------------------------------------
       
   193 //
       
   194 // -----------------------------------------------------------------------------
       
   195 //
       
   196 void CMusEngTwoWayRecvSession::SetSecondaryRectL( const TRect& aSecondaryRect )
       
   197     {
       
   198     MUS_LOG( "mus: [ENGINE]  -> CMusEngTwoWayRecvSession::SetSecondaryRectL()" )
       
   199     
       
   200     iLocalRect = aSecondaryRect;
       
   201     RectChangedL();
       
   202 
       
   203     MUS_LOG( "mus: [ENGINE]  <- CMusEngTwoWayRecvSession::SetSecondaryRectL()" )
       
   204     }
       
   205 
       
   206 // -----------------------------------------------------------------------------
       
   207 //
       
   208 // -----------------------------------------------------------------------------
       
   209 //
       
   210 TRect CMusEngTwoWayRecvSession::SecondaryRect() const
       
   211     {
       
   212     MUS_LOG( "mus: [ENGINE]  -> CMusEngTwoWayRecvSession::SecondaryRect()" )
       
   213     MUS_LOG( "mus: [ENGINE]  <- CMusEngTwoWayRecvSession::SecondaryRect()" )
       
   214     return iLocalRect;
       
   215     }
       
   216 
       
   217 // -----------------------------------------------------------------------------
       
   218 //
       
   219 // -----------------------------------------------------------------------------
       
   220 //
       
   221 TMusEngCameraHandler& CMusEngTwoWayRecvSession::Camera()
       
   222     {
       
   223     return iCameraHandler;
       
   224     }
       
   225 
       
   226 // -----------------------------------------------------------------------------
       
   227 // From MLcSession
       
   228 // -----------------------------------------------------------------------------
       
   229 //
       
   230 MLcVideoPlayer* CMusEngTwoWayRecvSession::LocalVideoPlayer()
       
   231     {
       
   232     return iLiveVideoPlayer;
       
   233     }
       
   234 
       
   235 // -----------------------------------------------------------------------------
       
   236 //
       
   237 // -----------------------------------------------------------------------------
       
   238 //
       
   239 
       
   240 void CMusEngTwoWayRecvSession::RectChangedL()
       
   241     {
       
   242     MUS_LOG( "mus: [ENGINE]  -> CMusEngTwoWayRecvSession::RectChangedL()" )
       
   243 
       
   244 
       
   245     // If session is not yet created, do nothing
       
   246     if ( iSession && iSession->State() != CMceSession::ETerminated )
       
   247         {
       
   248         TRect remoteRect( Rect() );
       
   249         MUS_LOG2( "mus: [ENGINE]  remote tl.ix=%d tl.iy=%d", 
       
   250                   remoteRect.iTl.iX, remoteRect.iTl.iY )
       
   251         MUS_LOG2( "mus: [ENGINE]  remote brc%d br.iy=%d", 
       
   252                   remoteRect.iBr.iX, remoteRect.iBr.iY )    
       
   253         MUS_LOG2( "mus: [ENGINE]  local tl.ix=%d tl.iy=%d", 
       
   254                   iLocalRect.iTl.iX, iLocalRect.iTl.iY )
       
   255         MUS_LOG2( "mus: [ENGINE]  local br.ix=%d br.iy=%d", 
       
   256                   iLocalRect.iBr.iX, iLocalRect.iBr.iY )
       
   257         
       
   258         if ( remoteRect != iSetRemoteRect )
       
   259             {
       
   260             CMceDisplaySink* display = MusEngMceUtils::GetReceivingDisplayL( *iSession );
       
   261             display->SetDisplayRectL( remoteRect );
       
   262             iSetRemoteRect = remoteRect;
       
   263             }
       
   264         
       
   265         if ( iLocalRect != iSetLocalRect )
       
   266             {
       
   267             CMceDisplaySink* vfDisplay = MusEngMceUtils::GetVfDisplay( *iSession );
       
   268             if ( vfDisplay )
       
   269                 {
       
   270                 vfDisplay->SetDisplayRectL( iLocalRect );
       
   271                 }
       
   272             iSetLocalRect = iLocalRect;
       
   273             }
       
   274         }
       
   275 
       
   276     MUS_LOG( "mus: [ENGINE]  <- CMusEngTwoWayRecvSession::RectChangedL()" )
       
   277     }
       
   278 
       
   279 // -----------------------------------------------------------------------------
       
   280 //
       
   281 // -----------------------------------------------------------------------------
       
   282 //
       
   283 void CMusEngTwoWayRecvSession::CompleteSessionStructureL()
       
   284     {
       
   285     MUS_LOG( "mus: [ENGINE]  -> CMusEngTwoWayRecvSession::CompleteSessionStructureL()" )
       
   286 
       
   287     __ASSERT_ALWAYS( iSession, User::Leave( KErrNotReady ) );
       
   288     
       
   289     iCameraHandler.SetSession( iSession );
       
   290     
       
   291     // Force bandwidth line usage in sdp as it is mandatory
       
   292     // at MT side based on GSMA VS specification IR.74. Bandwidth is set to
       
   293     // session or to media level based on sender's way of usage. If other end
       
   294     // is not using bandwidth attribute at all, media level is preferred.
       
   295     SetSessionSdpLinesL( *iSession, ETrue );
       
   296 
       
   297     CMceStreamBundle* localBundle =
       
   298                               CMceStreamBundle::NewLC( CMceStreamBundle::ELS );
       
   299 
       
   300     const RPointerArray<CMceMediaStream>& streams = iSession->Streams();
       
   301     
       
   302     CMceMediaStream* videoInStream = NULL;
       
   303     CMceMediaStream* videoOutStream = NULL;
       
   304     
       
   305     // Search interesting video streams, sendrecv is preferred
       
   306     TBool sendRecvVideoFound( EFalse );
       
   307     for( TInt i = 0; i < streams.Count(); ++i )
       
   308         {
       
   309         if ( MusEngMceUtils::IsVideoInStream( *streams[i] ) &&
       
   310              !sendRecvVideoFound )
       
   311             {
       
   312             videoInStream = streams[i];
       
   313             
       
   314             if ( streams[i]->BoundStream() )
       
   315                 {
       
   316                 videoOutStream = &streams[i]->BoundStreamL();
       
   317                 }
       
   318             }
       
   319         else if ( streams[i]->BoundStream() &&
       
   320                   MusEngMceUtils::IsVideoInStream( streams[i]->BoundStreamL() ) &&
       
   321                   !sendRecvVideoFound )
       
   322             {
       
   323             videoInStream = &streams[i]->BoundStreamL();
       
   324                 
       
   325             videoOutStream = streams[i];
       
   326             }
       
   327         else
       
   328             {
       
   329             // NOP
       
   330             }
       
   331         
       
   332         sendRecvVideoFound = ( videoInStream && videoOutStream );
       
   333         }
       
   334     
       
   335     CompleteSessionStructureAudioPartL( streams, *localBundle, videoInStream, videoOutStream );
       
   336     
       
   337     if ( videoInStream )
       
   338         {
       
   339         CompleteSessionStructureInStreamL( *videoInStream, *localBundle );
       
   340         }
       
   341     else
       
   342         {
       
   343         // At least receiving video stream is required
       
   344         User::Leave( KErrCorrupt );
       
   345         }
       
   346     
       
   347     if ( videoOutStream )
       
   348         {
       
   349         CompleteSessionStructureOutStreamL( *videoOutStream );
       
   350         }
       
   351     
       
   352     // Destroy bundle if it is not needed or transfer ownership
       
   353     if ( localBundle->Streams().Count() > 1 )
       
   354         {
       
   355         iSession->AddBundleL( localBundle );
       
   356         CleanupStack::Pop( localBundle );
       
   357         }
       
   358     else
       
   359         {
       
   360         CleanupStack::PopAndDestroy( localBundle );
       
   361         }
       
   362     
       
   363     AdjustStreamsAndCodecsL();
       
   364     
       
   365     iSession->UpdateL();
       
   366     
       
   367     // Now session state is right to adjust volume
       
   368     SetSpeakerVolumeL( LcVolumeL() );
       
   369     
       
   370     iSipProfileHandler->CreateProfileL( iSession->Profile() );
       
   371     
       
   372     iRemoteVideoPlayer->SetMceSession( iSession );
       
   373 
       
   374     MUS_LOG( "mus: [ENGINE]  <- CMusEngTwoWayRecvSession::CompleteSessionStructureL()" )
       
   375     }
       
   376 
       
   377 // -----------------------------------------------------------------------------
       
   378 //
       
   379 // -----------------------------------------------------------------------------
       
   380 //
       
   381 CMusEngTwoWayRecvSession::CMusEngTwoWayRecvSession() 
       
   382     : CMusEngReceiveSession()
       
   383     {
       
   384     iMceManagerUid.iUid = CMusManager::ESipInviteDesired2WayVideo;
       
   385     
       
   386     iSetRemoteRect = TRect( 
       
   387         KMusEngRectNotInit, KMusEngRectNotInit, KMusEngRectNotInit, KMusEngRectNotInit );
       
   388     iSetLocalRect = TRect(
       
   389         KMusEngRectNotInit, KMusEngRectNotInit, KMusEngRectNotInit, KMusEngRectNotInit );
       
   390     }
       
   391 
       
   392 // -----------------------------------------------------------------------------
       
   393 //
       
   394 // -----------------------------------------------------------------------------
       
   395 //
       
   396 void CMusEngTwoWayRecvSession::ConstructL()
       
   397     {
       
   398     MUS_LOG( "mus: [ENGINE]  -> CMusEngTwoWayRecvSession::ConstructL()" )
       
   399     
       
   400     iCameraHandler.ReadCameraUsageKeyL();
       
   401     CMusEngReceiveSession::ConstructL();
       
   402     
       
   403     iLiveVideoPlayer = 
       
   404         CMusEngLiveVideoPlayer::NewL( *this, iCameraHandler, *this );
       
   405     
       
   406     // Override receiving timeout and keepalive values of
       
   407     // normal one-way receiving session
       
   408     //
       
   409     iReceivingInactivityTimeout = KMusEngTwoWayReceivingActivityTimeout; 
       
   410     iKeepaliveTimer = KMusEngTwoWayRtpKeepAliveTimer;
       
   411 
       
   412     MUS_LOG( "mus: [ENGINE]  <- CMusEngTwoWayRecvSession::ConstructL()" )
       
   413     }
       
   414 
       
   415 // -----------------------------------------------------------------------------
       
   416 // When checking audio streams also not interesting streams are removed from
       
   417 // session. Stream if removed if one of following apply:
       
   418 // 1. Is not and does not contain incoming video or audio
       
   419 // 2. We already have one incoming video stream
       
   420 // 3. Stream is audio and we run operator variant where audio is 
       
   421 //    not allowed.
       
   422 // 4. Two-way video exists and this one is audio
       
   423 // -----------------------------------------------------------------------------
       
   424 //
       
   425 void CMusEngTwoWayRecvSession::CompleteSessionStructureAudioPartL( 
       
   426     const RPointerArray<CMceMediaStream>& aStreams, 
       
   427     CMceStreamBundle& aLocalBundle, 
       
   428     CMceMediaStream* aVideoInStream,
       
   429     CMceMediaStream* aVideoOutStream )
       
   430     {
       
   431     MUS_LOG( "mus: [ENGINE]  -> CMusEngTwoWayRecvSession::CompleteSessionStructureAudioPartL()" )
       
   432     
       
   433     // Audio streams not allowed in two-way session or in operator variant
       
   434     TBool audioAllowed(  !( aVideoInStream && aVideoOutStream ) && !iOperatorVariant );
       
   435     
       
   436     for( TInt i = 0; i < aStreams.Count(); ++i )
       
   437         {
       
   438         // Audio supported currently only in recvonly case
       
   439         if ( audioAllowed &&
       
   440              MusEngMceUtils::IsAudioInStream( *aStreams[i] ) )
       
   441             {
       
   442             MusEngMceUtils::AddSpeakerL( *aStreams[i] );
       
   443             
       
   444             aLocalBundle.AddStreamL( *aStreams[i] );
       
   445             
       
   446             // Disable possible opposite stream to indicate that sendrecv audio is
       
   447             // not allowed.
       
   448             if ( aStreams[i]->BoundStream() )
       
   449                 {
       
   450                 MusEngMceUtils::DisableStreamL( aStreams[i]->BoundStreamL() );
       
   451                 }
       
   452             }
       
   453         else if ( audioAllowed &&
       
   454                   aStreams[i]->BoundStream() &&
       
   455                   MusEngMceUtils::IsAudioInStream( aStreams[i]->BoundStreamL() ) )
       
   456             {
       
   457             MusEngMceUtils::AddSpeakerL( aStreams[i]->BoundStreamL() );
       
   458     
       
   459             aLocalBundle.AddStreamL( aStreams[i]->BoundStreamL() );
       
   460             
       
   461             // Disable opposite stream to indicate that sendrecv audio is not allowed.
       
   462             MusEngMceUtils::DisableStreamL( *aStreams[i] );
       
   463             }
       
   464         else if ( aStreams[ i ] != aVideoInStream && aStreams[ i ] != aVideoOutStream )
       
   465             {
       
   466            iSession->RemoveStreamL( *aStreams[i] );
       
   467         
       
   468             // Since succesfull removal of a stream has decreased the amount
       
   469             // of streams in array by one, we have to modify the index
       
   470             --i;
       
   471             }
       
   472         else
       
   473             {
       
   474             // NOP
       
   475             }
       
   476         }
       
   477     
       
   478     MUS_LOG( "mus: [ENGINE]  <- CMusEngTwoWayRecvSession::CompleteSessionStructureAudioPartL()" )
       
   479     }
       
   480 
       
   481 // -----------------------------------------------------------------------------
       
   482 //
       
   483 // -----------------------------------------------------------------------------
       
   484 //
       
   485 void CMusEngTwoWayRecvSession::CompleteSessionStructureInStreamL( 
       
   486     CMceMediaStream& aVideoInStream, CMceStreamBundle& aLocalBundle )
       
   487     {
       
   488     MUS_LOG( "mus: [ENGINE]  -> CMusEngTwoWayRecvSession::CompleteSessionStructureInStreamL()" )
       
   489     
       
   490     SetMediaSdpLinesL( aVideoInStream, ETrue );
       
   491 
       
   492     MusEngMceUtils::AddDisplayL( aVideoInStream, *iManager, Rect() );
       
   493     
       
   494     static_cast<CMceRtpSource*>(aVideoInStream.Source())->UpdateL( 
       
   495                                            KMusEngJitterBufferLength,
       
   496                                            KMusEngJitterBufferTreshold,
       
   497                                            KMusEngTwoWayReceivingActivityTimeout );
       
   498                                             
       
   499     aLocalBundle.AddStreamL( aVideoInStream );
       
   500     
       
   501     MUS_LOG( "mus: [ENGINE]  <- CMusEngTwoWayRecvSession::CompleteSessionStructureInStreamL()" )
       
   502     }
       
   503 
       
   504 // -----------------------------------------------------------------------------
       
   505 //
       
   506 // -----------------------------------------------------------------------------
       
   507 //
       
   508 void CMusEngTwoWayRecvSession::CompleteSessionStructureOutStreamL( 
       
   509     CMceMediaStream& aVideoOutStream )
       
   510     {
       
   511     MUS_LOG( "mus: [ENGINE]  -> CMusEngTwoWayRecvSession::CompleteSessionStructureOutStreamL()" )
       
   512     
       
   513     SetMediaSdpLinesL( aVideoOutStream, ETrue );
       
   514         
       
   515     CMceCameraSource* camera = NULL;
       
   516     TRAP_IGNORE( camera = MusEngMceUtils::GetCameraL( *iSession ) )
       
   517     if ( !camera )
       
   518         {
       
   519         camera = CMceCameraSource::NewLC( *iManager );
       
   520         aVideoOutStream.SetSourceL( camera );
       
   521         CleanupStack::Pop( camera );
       
   522         }
       
   523        
       
   524     camera->DisableL(); // Start session in pause mode.
       
   525     
       
   526     iCameraHandler.InitializeL( *camera );
       
   527     
       
   528     CMceVideoStream* vfStream = CMceVideoStream::NewLC();
       
   529 
       
   530     vfStream->SetSourceL( aVideoOutStream.Source() );
       
   531 	
       
   532     // Complete stream, vf display is disabled at creation phase if doing bg startup
       
   533     MusEngMceUtils::AddDisplayL( *vfStream, *iManager, SecondaryRect(), IsBackgroundStartup() );
       
   534     
       
   535     iSession->AddStreamL( vfStream );
       
   536     CleanupStack::Pop( vfStream );
       
   537     
       
   538     iLiveVideoPlayer->SetMceSession( iSession );
       
   539     
       
   540     MUS_LOG( "mus: [ENGINE]  <- CMusEngTwoWayRecvSession::CompleteSessionStructureOutStreamL()" )
       
   541     }
       
   542 
       
   543 
       
   544 // End of file