tsrc/musenginestub/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 "musengsessionobserver.h"
       
    22 #include "musengreceivesessionobserver.h"
       
    23 #include "musunittesting.h"
       
    24 #include "musengmceutils.h"
       
    25 #include "musenglogger.h"
       
    26 #include "mussipprofilehandler.h"
       
    27 
       
    28 // SYSTEM
       
    29 #include <mcemanager.h>
       
    30 #include <mcecamerasource.h>
       
    31 #include <mcevideostream.h>
       
    32 #include <mcertpsink.h>
       
    33 #include <mcedisplaysink.h>
       
    34 #include <mcesession.h>
       
    35 #include <mcertpsource.h>
       
    36 #include <mcestreambundle.h>
       
    37 
       
    38 const TInt KMusEngJitterBufferLength = 51; //Must be bigger than treshold
       
    39 // Using following value increases treshold buffer to 1 second from 
       
    40 // default 100 ms
       
    41 const TInt KMusEngJitterBufferTreshold = 50;
       
    42 
       
    43 // -----------------------------------------------------------------------------
       
    44 //
       
    45 // -----------------------------------------------------------------------------
       
    46 //
       
    47 EXPORT_C CMusEngTwoWayRecvSession* CMusEngTwoWayRecvSession::NewL(
       
    48                         const TRect& aRemoteRect,
       
    49                         const TRect& aLocalRect,
       
    50                         MMusEngSessionObserver& aSessionObserver,
       
    51                         MMusEngReceiveSessionObserver& aReceiveSessionObserver )
       
    52     {
       
    53     CMusEngTwoWayRecvSession* self = new( ELeave ) CMusEngTwoWayRecvSession( 
       
    54                                                     aSessionObserver,
       
    55                                                     aReceiveSessionObserver,
       
    56                                                     aRemoteRect,
       
    57                                                     aLocalRect );
       
    58     CleanupStack::PushL( self );
       
    59     self->ConstructL();
       
    60     CleanupStack::Pop( self );
       
    61     return self;
       
    62     }
       
    63 
       
    64 // -----------------------------------------------------------------------------
       
    65 //
       
    66 // -----------------------------------------------------------------------------
       
    67 //
       
    68 CMusEngTwoWayRecvSession::~CMusEngTwoWayRecvSession()
       
    69     {
       
    70     MUS_LOG( "mus: [ENGINE]  -> CMusEngTwoWayRecvSession::~CMusEngTwoWayRecvSession()" )
       
    71     MUS_LOG( "mus: [ENGINE]  <- CMusEngTwoWayRecvSession::~CMusEngTwoWayRecvSession()" )
       
    72     }
       
    73 
       
    74 // -----------------------------------------------------------------------------
       
    75 // 
       
    76 // -----------------------------------------------------------------------------
       
    77 //
       
    78 void CMusEngTwoWayRecvSession::EnableDisplayL( TBool aEnable )
       
    79     {
       
    80     MUS_LOG1( "mus: [ENGINE]     -> CMusEngTwoWayRecvSession::EnableDisplayL() %d", 
       
    81               aEnable )
       
    82 
       
    83     __ASSERT_ALWAYS( iSession, User::Leave( KErrNotReady ) );
       
    84 
       
    85     CMceDisplaySink* display = MusEngMceUtils::GetReceivingDisplayL( *iSession );
       
    86     MusEngMceUtils::DoEnableDisplayL( *display, aEnable );
       
    87                 
       
    88     CMceDisplaySink* vfDisplay = MusEngMceUtils::GetVfDisplay( *iSession );
       
    89     if ( vfDisplay )
       
    90         {
       
    91         MusEngMceUtils::DoEnableDisplayL( *vfDisplay, aEnable );  
       
    92         }
       
    93         
       
    94     MUS_LOG( "mus: [ENGINE]  <- CMusEngTwoWayRecvSession::EnableDisplayL()")
       
    95     }
       
    96 
       
    97 // -----------------------------------------------------------------------------
       
    98 //
       
    99 // -----------------------------------------------------------------------------
       
   100 //
       
   101 CMusEngMceSession::TDisplayOrientation CMusEngTwoWayRecvSession::OrientationL()
       
   102     {
       
   103     MUS_LOG( "mus: [ENGINE]  -> CMusEngTwoWayRecvSession::RotationL()" )
       
   104     
       
   105     __ASSERT_ALWAYS( iSession, User::Leave( KErrNotReady ) );
       
   106     
       
   107     CMceDisplaySink* display = MusEngMceUtils::GetReceivingDisplayL( *iSession );
       
   108     
       
   109     TDisplayOrientation displayOrientation;
       
   110     CMceDisplaySink::TRotation rotation( display->RotationL() );
       
   111     
       
   112     MUS_LOG1( "mus: [ENGINE]     MCE rotation is %d", rotation )
       
   113     
       
   114     if ( rotation == CMceDisplaySink::ENone )
       
   115         {
       
   116         displayOrientation = CMusEngMceSession::EPortrait;
       
   117         }
       
   118     else
       
   119         {
       
   120         displayOrientation = CMusEngMceSession::ELandscape;
       
   121         }
       
   122     
       
   123     MUS_LOG1( "mus: [ENGINE]  <- CMusEngTwoWayRecvSession::RotationL() %d", 
       
   124               displayOrientation )
       
   125     
       
   126     return displayOrientation;
       
   127     }
       
   128 
       
   129 // -----------------------------------------------------------------------------
       
   130 //
       
   131 // -----------------------------------------------------------------------------
       
   132 //        
       
   133 void CMusEngTwoWayRecvSession::SetOrientationL( TDisplayOrientation aOrientation )
       
   134     {
       
   135     MUS_LOG1( "mus: [ENGINE]  -> CMusEngTwoWayRecvSession::SetOrientationL() %d", 
       
   136               aOrientation )
       
   137               
       
   138     __ASSERT_ALWAYS( iSession, User::Leave( KErrNotReady ) );
       
   139     
       
   140     CMceDisplaySink* display = MusEngMceUtils::GetReceivingDisplayL( *iSession );
       
   141             
       
   142     CMceDisplaySink* vfDisplay = MusEngMceUtils::GetVfDisplay( *iSession );
       
   143 
       
   144     CMceDisplaySink::TRotation rotation = ( aOrientation == EPortrait ) ? 
       
   145         CMceDisplaySink::ENone : CMceDisplaySink::EClockwise90Degree;
       
   146     
       
   147     display->SetRotationL( rotation );
       
   148     if ( vfDisplay )
       
   149         {
       
   150         vfDisplay->SetRotationL( rotation );
       
   151         }
       
   152     
       
   153     MUS_LOG( "mus: [ENGINE]  <- CMusEngTwoWayRecvSession::SetOrientationL()" )
       
   154     }
       
   155 
       
   156 // -----------------------------------------------------------------------------
       
   157 //
       
   158 // -----------------------------------------------------------------------------
       
   159 //
       
   160 EXPORT_C void CMusEngTwoWayRecvSession::SetRectsL( 
       
   161     const TRect& aRemoteRect,
       
   162     const TRect& aLocalRect )
       
   163     {
       
   164     MUS_LOG( "mus: [ENGINE]  -> CMusEngTwoWayRecvSession::SetRectsL()" )  
       
   165      
       
   166     iLocalRect = aLocalRect;
       
   167     iRect = aRemoteRect;
       
   168     RectChangedL();
       
   169     
       
   170     MUS_LOG( "mus: [ENGINE]  <- CMusEngTwoWayRecvSession::SetRectsL()" )
       
   171     }
       
   172 
       
   173 // -----------------------------------------------------------------------------
       
   174 //
       
   175 // -----------------------------------------------------------------------------
       
   176 //
       
   177 EXPORT_C void CMusEngTwoWayRecvSession::SetLocalRectL( const TRect& aLocalRect )
       
   178     {
       
   179     MUS_LOG( "mus: [ENGINE]  -> CMusEngTwoWayRecvSession::SetLocalRectL()" )
       
   180     
       
   181     iLocalRect = aLocalRect;
       
   182     RectChangedL();
       
   183 
       
   184     MUS_LOG( "mus: [ENGINE]  <- CMusEngTwoWayRecvSession::SetLocalRectL()" )
       
   185     }
       
   186 
       
   187 // -----------------------------------------------------------------------------
       
   188 //
       
   189 // -----------------------------------------------------------------------------
       
   190 //
       
   191 EXPORT_C TRect CMusEngTwoWayRecvSession::LocalRect() const
       
   192     {
       
   193     MUS_LOG( "mus: [ENGINE]  -> CMusEngTwoWayRecvSession::LocalRect()" )
       
   194     MUS_LOG( "mus: [ENGINE]  <- CMusEngTwoWayRecvSession::LocalRect()" )
       
   195     return iLocalRect;
       
   196     }
       
   197 
       
   198 // -----------------------------------------------------------------------------
       
   199 //
       
   200 // -----------------------------------------------------------------------------
       
   201 //
       
   202 EXPORT_C TMusEngCameraHandler& CMusEngTwoWayRecvSession::Camera()
       
   203     {
       
   204     return iCameraHandler;
       
   205     }
       
   206 
       
   207 // -----------------------------------------------------------------------------
       
   208 //
       
   209 // -----------------------------------------------------------------------------
       
   210 //
       
   211 
       
   212 void CMusEngTwoWayRecvSession::RectChangedL()
       
   213     {
       
   214     MUS_LOG( "mus: [ENGINE]  -> CMusEngTwoWayRecvSession::RectChangedL()" )
       
   215 
       
   216 
       
   217     // If session is not yet created, do nothing
       
   218     if ( iSession && iSession->State() != CMceSession::ETerminated )
       
   219         {
       
   220         TRect remoteRect( Rect() );
       
   221         MUS_LOG2( "mus: [ENGINE]  remote tl.ix=%d tl.iy=%d", 
       
   222                   remoteRect.iTl.iX, remoteRect.iTl.iY )
       
   223         MUS_LOG2( "mus: [ENGINE]  remote brc%d br.iy=%d", 
       
   224                   remoteRect.iBr.iX, remoteRect.iBr.iY )    
       
   225         MUS_LOG2( "mus: [ENGINE]  local tl.ix=%d tl.iy=%d", 
       
   226                   iLocalRect.iTl.iX, iLocalRect.iTl.iY )
       
   227         MUS_LOG2( "mus: [ENGINE]  local br.ix=%d br.iy=%d", 
       
   228                   iLocalRect.iBr.iX, iLocalRect.iBr.iY )
       
   229             
       
   230         CMceDisplaySink* display = MusEngMceUtils::GetReceivingDisplayL( *iSession );
       
   231         display->SetDisplayRectL( remoteRect );
       
   232         
       
   233         CMceDisplaySink* vfDisplay = MusEngMceUtils::GetVfDisplay( *iSession );
       
   234         if ( vfDisplay )
       
   235             {
       
   236             vfDisplay->SetDisplayRectL( iLocalRect );
       
   237             }
       
   238         }
       
   239 
       
   240     MUS_LOG( "mus: [ENGINE]  <- CMusEngTwoWayRecvSession::RectChangedL()" )
       
   241     }
       
   242 
       
   243 // -----------------------------------------------------------------------------
       
   244 //
       
   245 // -----------------------------------------------------------------------------
       
   246 //
       
   247 void CMusEngTwoWayRecvSession::CompleteSessionStructureL()
       
   248     {
       
   249     MUS_LOG( "mus: [ENGINE]  -> CMusEngTwoWayRecvSession::CompleteSessionStructureL()" )
       
   250 
       
   251     __ASSERT_ALWAYS( iSession, User::Leave( KErrNotReady ) );
       
   252     
       
   253     iCameraHandler.SetSession( iSession );
       
   254     
       
   255     // Force bandwidth line usage in sdp as it is mandatory
       
   256     // at MT side based on GSMA VS specification IR.74. Bandwidth is set to
       
   257     // session or to media level based on sender's way of usage. If other end
       
   258     // is not using bandwidth attribute at all, media level is preferred.
       
   259     SetSessionSdpLinesL( *iSession, ETrue );
       
   260 
       
   261     CMceStreamBundle* localBundle =
       
   262                               CMceStreamBundle::NewLC( CMceStreamBundle::ELS );
       
   263 
       
   264     const RPointerArray<CMceMediaStream>& streams = iSession->Streams();
       
   265     
       
   266     CMceMediaStream* videoInStream = NULL;
       
   267     CMceMediaStream* videoOutStream = NULL;
       
   268     
       
   269     // Search interesting video streams, sendrecv is preferred
       
   270     TBool sendRecvVideoFound( EFalse );
       
   271     for( TInt i = 0; i < streams.Count(); ++i )
       
   272         {
       
   273         if ( MusEngMceUtils::IsVideoInStream( *streams[i] ) &&
       
   274              !sendRecvVideoFound )
       
   275             {
       
   276             videoInStream = streams[i];
       
   277             
       
   278             if ( streams[i]->BoundStream() )
       
   279                 {
       
   280                 videoOutStream = &streams[i]->BoundStreamL();
       
   281                 }
       
   282             }
       
   283         else if ( streams[i]->BoundStream() &&
       
   284                   MusEngMceUtils::IsVideoInStream( streams[i]->BoundStreamL() ) &&
       
   285                   !sendRecvVideoFound )
       
   286             {
       
   287             videoInStream = &streams[i]->BoundStreamL();
       
   288                 
       
   289             videoOutStream = streams[i];
       
   290             }
       
   291         else
       
   292             {
       
   293             // NOP
       
   294             }
       
   295         
       
   296         sendRecvVideoFound = ( videoInStream && videoOutStream );
       
   297         }
       
   298     
       
   299     CompleteSessionStructureAudioPartL( streams, *localBundle, videoInStream, videoOutStream );
       
   300     
       
   301     if ( videoInStream )
       
   302         {
       
   303         CompleteSessionStructureInStreamL( *videoInStream, *localBundle );
       
   304         }
       
   305     else
       
   306         {
       
   307         // At least receiving video stream is required
       
   308         User::Leave( KErrCorrupt );
       
   309         }
       
   310     
       
   311     if ( videoOutStream )
       
   312         {
       
   313         CompleteSessionStructureOutStreamL( *videoOutStream );
       
   314         }
       
   315     
       
   316     // Destroy bundle if it is not needed or transfer ownership
       
   317     if ( localBundle->Streams().Count() > 1 )
       
   318         {
       
   319         iSession->AddBundleL( localBundle );
       
   320         CleanupStack::Pop( localBundle );
       
   321         }
       
   322     else
       
   323         {
       
   324         CleanupStack::PopAndDestroy( localBundle );
       
   325         }
       
   326     
       
   327     AdjustStreamsAndCodecsL();
       
   328     
       
   329     iSession->UpdateL();
       
   330     
       
   331     // Now session state is right to adjust volume
       
   332     SetSpeakerVolumeL( VolumeL() );
       
   333     
       
   334     iSipProfileHandler->CreateProfileL( iSession->Profile() );
       
   335 
       
   336     MUS_LOG( "mus: [ENGINE]  <- CMusEngTwoWayRecvSession::CompleteSessionStructureL()" )
       
   337     }
       
   338 
       
   339 // -----------------------------------------------------------------------------
       
   340 //
       
   341 // -----------------------------------------------------------------------------
       
   342 //
       
   343 void CMusEngTwoWayRecvSession::StreamStateChanged( CMceMediaStream& aStream,
       
   344                                              CMceMediaSink& aSink )
       
   345     {
       
   346     MUS_LOG( "mus: [ENGINE] -> CMusEngTwoWayRecvSession::StreamStateChanged( sink )" )
       
   347     if ( !iSession )
       
   348         {
       
   349         return;
       
   350         }
       
   351     
       
   352     MUS_ENG_LOG_STREAM_STATE( aStream )
       
   353     
       
   354     // TODO: if display sink buffers, inform ui with some callback
       
   355     // so that it can modify display rects accordingly
       
   356     
       
   357     CMusEngMceSession::StreamStateChanged( aStream, aSink );
       
   358 
       
   359     MUS_LOG( "mus: [ENGINE] <- CMusEngTwoWayRecvSession::StreamStateChanged( sink )" )
       
   360     }
       
   361 
       
   362 // -----------------------------------------------------------------------------
       
   363 //
       
   364 // -----------------------------------------------------------------------------
       
   365 //
       
   366 void CMusEngTwoWayRecvSession::StreamStateChanged( CMceMediaStream& aStream )
       
   367     {
       
   368     MUS_LOG( "mus: [ENGINE] -> CMusEngTwoWayRecvSession::StreamStateChanged()" )
       
   369     if ( !iSession )
       
   370         {
       
   371         return;
       
   372         }
       
   373     
       
   374     MUS_ENG_LOG_STREAM_STATE( aStream )
       
   375     
       
   376     // TODO: if receiving video stream buffers, inform ui with some callback
       
   377     // so that it can modify display rects accordingly
       
   378     
       
   379     CMusEngReceiveSession::StreamStateChanged( aStream );
       
   380 
       
   381     MUS_LOG( "mus: [ENGINE] <- CMusEngTwoWayRecvSession::StreamStateChanged()" )
       
   382     }
       
   383 
       
   384 // -----------------------------------------------------------------------------
       
   385 //
       
   386 // -----------------------------------------------------------------------------
       
   387 //
       
   388 CMusEngTwoWayRecvSession::CMusEngTwoWayRecvSession(
       
   389                         MMusEngSessionObserver& aSessionObserver,
       
   390                         MMusEngReceiveSessionObserver& aReceiveSessionObserver,
       
   391                         const TRect& aRemoteRect,
       
   392                         const TRect& aLocalRect ) : 
       
   393     CMusEngReceiveSession( aSessionObserver,
       
   394                            aReceiveSessionObserver,
       
   395                            aRemoteRect ),
       
   396     iLocalRect( aLocalRect )
       
   397     {
       
   398     }
       
   399 
       
   400 
       
   401 // -----------------------------------------------------------------------------
       
   402 //
       
   403 // -----------------------------------------------------------------------------
       
   404 //
       
   405 void CMusEngTwoWayRecvSession::ConstructL()
       
   406     {
       
   407     MUS_LOG( "mus: [ENGINE]  -> CMusEngTwoWayRecvSession::ConstructL()" )
       
   408     
       
   409     iCameraHandler.ReadCameraUsageKeyL();
       
   410     CMusEngReceiveSession::ConstructL();
       
   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                                             
       
   498     aLocalBundle.AddStreamL( aVideoInStream );
       
   499     
       
   500     MUS_LOG( "mus: [ENGINE]  <- CMusEngTwoWayRecvSession::CompleteSessionStructureInStreamL()" )
       
   501     }
       
   502 
       
   503 // -----------------------------------------------------------------------------
       
   504 //
       
   505 // -----------------------------------------------------------------------------
       
   506 //
       
   507 void CMusEngTwoWayRecvSession::CompleteSessionStructureOutStreamL( 
       
   508     CMceMediaStream& aVideoOutStream )
       
   509     {
       
   510     MUS_LOG( "mus: [ENGINE]  -> CMusEngTwoWayRecvSession::CompleteSessionStructureOutStreamL()" )
       
   511     
       
   512     SetMediaSdpLinesL( aVideoOutStream, ETrue );
       
   513         
       
   514     CMceCameraSource* camera = NULL;
       
   515     TRAP_IGNORE( camera = MusEngMceUtils::GetCameraL( *iSession ) )
       
   516     if ( !camera )
       
   517         {
       
   518         camera = CMceCameraSource::NewLC( *iManager );
       
   519         aVideoOutStream.SetSourceL( camera );
       
   520         CleanupStack::Pop( camera );
       
   521         }
       
   522        
       
   523     camera->DisableL(); // Start session in pause mode.
       
   524     
       
   525     iCameraHandler.InitializeL( *camera );
       
   526     
       
   527     CMceVideoStream* vfStream = CMceVideoStream::NewLC();
       
   528 
       
   529     vfStream->SetSourceL( aVideoOutStream.Source() );
       
   530          
       
   531     // Complete stream
       
   532     MusEngMceUtils::AddDisplayL( *vfStream, *iManager, LocalRect() );
       
   533     
       
   534     iSession->AddStreamL( vfStream );
       
   535     CleanupStack::Pop( vfStream );
       
   536     
       
   537     MUS_LOG( "mus: [ENGINE]  <- CMusEngTwoWayRecvSession::CompleteSessionStructureOutStreamL()" )
       
   538     }
       
   539 
       
   540 // End of file