mmsharing/mmshengine/src/musengtwowaysession.cpp
branchRCL_3
changeset 23 bc78a40cd63c
parent 22 73a1feb507fb
child 24 6c57ef9392d2
equal deleted inserted replaced
22:73a1feb507fb 23: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 * Description: 
       
    14 *
       
    15 */
       
    16 
       
    17 
       
    18 // USER
       
    19 #include "musengtwowaysession.h"
       
    20 #include "musunittesting.h"
       
    21 #include "musengmceutils.h"
       
    22 #include "musenglogger.h"
       
    23 #include "musengremotevideoplayer.h"
       
    24 #include "musenglivevideoplayer.h"
       
    25 
       
    26 // SYSTEM
       
    27 #include <lcsessionobserver.h>
       
    28 #include <mcemanager.h>
       
    29 #include <mcecamerasource.h>
       
    30 #include <mcevideostream.h>
       
    31 #include <mcertpsink.h>
       
    32 #include <mcedisplaysink.h>
       
    33 #include <mcesession.h>
       
    34 #include <mcertpsource.h>
       
    35 #include <mcevideocodec.h>
       
    36 
       
    37 const TInt KMusEngJitterBufferLength = 51; //Must be bigger than treshold
       
    38 // Using following value increases treshold buffer to 1 second from 
       
    39 // default 100 ms
       
    40 const TInt KMusEngJitterBufferTreshold = 50;
       
    41 
       
    42 const TUint32 KMusEngTwoWayReceivingActivityTimeout = 5000; // 5 seconds
       
    43 // 6 seconds keepalive timer, needs to be more than receiving timeout
       
    44 const TUint8 KMusEngTwoWayRtpKeepAliveTimer = 6; 
       
    45 
       
    46 // -----------------------------------------------------------------------------
       
    47 //
       
    48 // -----------------------------------------------------------------------------
       
    49 //
       
    50 CMusEngTwoWaySession* CMusEngTwoWaySession::NewL()
       
    51     {
       
    52     CMusEngTwoWaySession* self = new( ELeave )CMusEngTwoWaySession();
       
    53     CleanupStack::PushL( self );
       
    54     self->ConstructL();
       
    55     CleanupStack::Pop( self );
       
    56     return self;
       
    57     }
       
    58 
       
    59 // -----------------------------------------------------------------------------
       
    60 //
       
    61 // -----------------------------------------------------------------------------
       
    62 //
       
    63 CMusEngTwoWaySession::~CMusEngTwoWaySession()
       
    64     {
       
    65     MUS_LOG( "mus: [ENGINE]  -> CMusEngTwoWaySession::~CMusEngTwoWaySession()" )
       
    66     
       
    67     delete iRemoteVideoPlayer; 
       
    68     
       
    69     MUS_LOG( "mus: [ENGINE]  <- CMusEngTwoWaySession::~CMusEngTwoWaySession()" )
       
    70     }
       
    71 
       
    72 // -----------------------------------------------------------------------------
       
    73 // 
       
    74 // -----------------------------------------------------------------------------
       
    75 //
       
    76 void CMusEngTwoWaySession::EnableDisplayL( TBool aEnable )
       
    77     {
       
    78     MUS_LOG1( "mus: [ENGINE]     -> CMusEngTwoWaySession::EnableDisplayL() %d", 
       
    79               aEnable )
       
    80 
       
    81     __ASSERT_ALWAYS( iSession, User::Leave( KErrNotReady ) );
       
    82 
       
    83     CMceDisplaySink* display = MusEngMceUtils::GetReceivingDisplay( *iSession );
       
    84     if ( display )
       
    85         {
       
    86         MusEngMceUtils::DoEnableDisplayL( *display, aEnable );
       
    87         }     
       
    88     CMceDisplaySink* vfDisplay = MusEngMceUtils::GetDisplayL( *iSession, ETrue );
       
    89     MusEngMceUtils::DoEnableDisplayL( *vfDisplay, aEnable );     
       
    90         
       
    91     MUS_LOG( "mus: [ENGINE]  <- CMusEngTwoWaySession::EnableDisplayL()")
       
    92     }
       
    93 
       
    94 // -----------------------------------------------------------------------------
       
    95 //
       
    96 // -----------------------------------------------------------------------------
       
    97 //        
       
    98 void CMusEngTwoWaySession::SetOrientationL( TDisplayOrientation aOrientation )
       
    99     {
       
   100     MUS_LOG1( "mus: [ENGINE]  -> CMusEngTwoWaySession::SetOrientationL() %d", 
       
   101               aOrientation )
       
   102               
       
   103     __ASSERT_ALWAYS( iSession, User::Leave( KErrNotReady ) );
       
   104     
       
   105     CMceDisplaySink* display = MusEngMceUtils::GetReceivingDisplay( *iSession );            
       
   106     CMceDisplaySink* vfDisplay = MusEngMceUtils::GetDisplayL( *iSession, ETrue );
       
   107 
       
   108     CMceDisplaySink::TRotation rotation = ( aOrientation == EPortrait ) ? 
       
   109          CMceDisplaySink::ENone : CMceDisplaySink::EClockwise90Degree;
       
   110      
       
   111     vfDisplay->SetRotationL( rotation );
       
   112     if ( display )
       
   113         {
       
   114         display->SetRotationL( rotation );
       
   115         }
       
   116 
       
   117     MUS_LOG( "mus: [ENGINE]  <- CMusEngTwoWaySession::SetOrientationL()" )
       
   118     }
       
   119 
       
   120 // -----------------------------------------------------------------------------
       
   121 // From MLcFileControl
       
   122 // -----------------------------------------------------------------------------
       
   123 //
       
   124 void CMusEngTwoWaySession::EnableLcFileL( TBool /*aEnable*/ )
       
   125     {
       
   126     MUS_LOG( "mus: [ENGINE]  -> CMusEngTwoWaySession::EnableLcFileL" )
       
   127 
       
   128     User::Leave( KErrNotSupported );
       
   129 
       
   130     MUS_LOG( "mus: [ENGINE]  -> CMusEngTwoWaySession::EnableLcFileL" ) 
       
   131     }
       
   132 
       
   133 // -----------------------------------------------------------------------------
       
   134 //
       
   135 // -----------------------------------------------------------------------------
       
   136 //
       
   137 void CMusEngTwoWaySession::SetRectsL( 
       
   138     const TRect& aRemoteRect,
       
   139     const TRect& aLocalRect )
       
   140     {
       
   141     MUS_LOG( "mus: [ENGINE]  -> CMusEngTwoWaySession::SetRectsL()" )  
       
   142      
       
   143     iLocalRect = aLocalRect;
       
   144     iRect = aRemoteRect;
       
   145     RectChangedL();
       
   146     
       
   147     MUS_LOG( "mus: [ENGINE]  <- CMusEngTwoWaySession::SetRectsL()" )
       
   148     }
       
   149 
       
   150 // -----------------------------------------------------------------------------
       
   151 //
       
   152 // -----------------------------------------------------------------------------
       
   153 //
       
   154 void CMusEngTwoWaySession::SetSecondaryRectL( const TRect& aSecondaryRect )
       
   155     {
       
   156     MUS_LOG( "mus: [ENGINE]  -> CMusEngTwoWaySession::SetSecondaryRectL()" )
       
   157     
       
   158     iLocalRect = aSecondaryRect;
       
   159     RectChangedL();
       
   160 
       
   161     MUS_LOG( "mus: [ENGINE]  <- CMusEngTwoWaySession::SetSecondaryRectL()" )
       
   162     }
       
   163 
       
   164 // -----------------------------------------------------------------------------
       
   165 //
       
   166 // -----------------------------------------------------------------------------
       
   167 //
       
   168 TRect CMusEngTwoWaySession::SecondaryRect() const
       
   169     {
       
   170     MUS_LOG( "mus: [ENGINE]  -> CMusEngTwoWaySession::SecondaryRect()" )
       
   171     MUS_LOG( "mus: [ENGINE]  <- CMusEngTwoWaySession::SecondaryRect()" )
       
   172     return iLocalRect;
       
   173     }
       
   174 
       
   175 // -----------------------------------------------------------------------------
       
   176 // 
       
   177 // -----------------------------------------------------------------------------
       
   178 //
       
   179 TBool CMusEngTwoWaySession::IsDisplayEnabled()
       
   180     {
       
   181     TBool enabled( EFalse );
       
   182     if ( iSession )
       
   183         {
       
   184         CMceDisplaySink* display = MusEngMceUtils::GetReceivingDisplay( *iSession );
       
   185         if ( !display )
       
   186             {
       
   187             display = MusEngMceUtils::GetVfDisplay( *iSession );
       
   188             }
       
   189         if ( display )
       
   190            {
       
   191            enabled = display->IsEnabled();
       
   192            }
       
   193         }
       
   194     return enabled;
       
   195     }
       
   196 
       
   197 // -----------------------------------------------------------------------------
       
   198 // 
       
   199 // -----------------------------------------------------------------------------
       
   200 //
       
   201 TBool CMusEngTwoWaySession::IsDisplayActive()
       
   202     {
       
   203     return ( IsDisplayEnabled() && iReceiving );
       
   204     }
       
   205 
       
   206 // -----------------------------------------------------------------------------
       
   207 // From MLcSession
       
   208 // -----------------------------------------------------------------------------
       
   209 //
       
   210 MLcVideoPlayer* CMusEngTwoWaySession::RemoteVideoPlayer()
       
   211     {
       
   212     return iRemoteVideoPlayer;
       
   213     }
       
   214 
       
   215 // -----------------------------------------------------------------------------
       
   216 //
       
   217 // -----------------------------------------------------------------------------
       
   218 //
       
   219 void CMusEngTwoWaySession::RectChangedL()
       
   220     {
       
   221     MUS_LOG( "mus: [ENGINE]  -> CMusEngTwoWaySession::RectChangedL()" )
       
   222 
       
   223     // If session is not yet created, do nothing
       
   224     if ( iSession && iSession->State() != CMceSession::ETerminated )
       
   225         {
       
   226         TRect remoteRect( Rect() );
       
   227         MUS_LOG2( "mus: [ENGINE]  remote tl.ix=%d tl.iy=%d", 
       
   228                   remoteRect.iTl.iX, remoteRect.iTl.iY )
       
   229         MUS_LOG2( "mus: [ENGINE]  remote br.ix=%d br.iy=%d", 
       
   230                   remoteRect.iBr.iX, remoteRect.iBr.iY )    
       
   231         MUS_LOG2( "mus: [ENGINE]  local tl.ix=%d tl.iy=%d", 
       
   232                   iLocalRect.iTl.iX, iLocalRect.iTl.iY )
       
   233         MUS_LOG2( "mus: [ENGINE]  local br.ix=%d br.iy=%d", 
       
   234                   iLocalRect.iBr.iX, iLocalRect.iBr.iY )           
       
   235 
       
   236         if ( remoteRect != iSetRemoteRect )
       
   237             {
       
   238             CMceDisplaySink* display = MusEngMceUtils::GetReceivingDisplay( *iSession );
       
   239             if ( display )
       
   240                 {
       
   241                 MUS_LOG( "mus: [ENGINE]  set remote rect" )
       
   242                 display->SetDisplayRectL( remoteRect );
       
   243                 iSetRemoteRect = remoteRect;
       
   244                 }
       
   245             }
       
   246 
       
   247         if ( iLocalRect != iSetLocalRect )
       
   248             {
       
   249             MUS_LOG( "mus: [ENGINE]  set local rect" )
       
   250             CMceDisplaySink* vfDisplay = MusEngMceUtils::GetDisplayL( *iSession, ETrue );
       
   251             vfDisplay->SetDisplayRectL( iLocalRect );
       
   252             iSetLocalRect = iLocalRect;
       
   253             }
       
   254         }
       
   255 
       
   256     MUS_LOG( "mus: [ENGINE]  <- CMusEngTwoWaySession::RectChangedL()" )
       
   257     }
       
   258 
       
   259 // -----------------------------------------------------------------------------
       
   260 //
       
   261 // -----------------------------------------------------------------------------
       
   262 //
       
   263 void CMusEngTwoWaySession::CompleteSessionStructureL( 
       
   264                                             CMceStreamBundle& /*aLocalBundle*/ )
       
   265     {
       
   266     MUS_LOG( "mus: [ENGINE]  -> CMusEngTwoWaySession::CompleteSessionStructureL()" )
       
   267 
       
   268     __ASSERT_ALWAYS( iSession, User::Leave( KErrNotReady ) );
       
   269 
       
   270     iCameraHandler.SetSession( iSession );
       
   271     
       
   272     // Create outgoing video stream
       
   273     CMceVideoStream* videoStream = CMceVideoStream::NewLC();
       
   274     
       
   275     CMceRtpSink* rtpsink = CMceRtpSink::NewLC();
       
   276     videoStream->AddSinkL( rtpsink );
       
   277     CleanupStack::Pop( rtpsink );
       
   278 
       
   279     CMceCameraSource* camera = CMceCameraSource::NewLC( *iManager );
       
   280     camera->DisableL(); // Start session in pause mode.
       
   281     
       
   282     iCameraHandler.InitializeL( *camera );
       
   283 
       
   284     videoStream->SetSourceL( camera );
       
   285     CleanupStack::Pop( camera );
       
   286     
       
   287     // Create incoming video stream
       
   288     CMceVideoStream* videoInStream = CMceVideoStream::NewL();
       
   289     CleanupStack::PushL( videoInStream );
       
   290        
       
   291     MusEngMceUtils::AddDisplayL( *videoInStream, *iManager, Rect() );
       
   292 
       
   293     CMceRtpSource* rtpSource = CMceRtpSource::NewLC( KMusEngJitterBufferLength,
       
   294                                                      KMusEngJitterBufferTreshold,
       
   295                                                      KMusEngTwoWayReceivingActivityTimeout );
       
   296     videoInStream->SetSourceL( rtpSource );
       
   297     CleanupStack::Pop( rtpSource ); 
       
   298 
       
   299     videoStream->BindL( videoInStream ); 
       
   300     CleanupStack::Pop( videoInStream );
       
   301 
       
   302     iSession->AddStreamL( videoStream );
       
   303     CleanupStack::Pop( videoStream );    
       
   304 
       
   305     iLiveVideoPlayer->SetMceSession( iSession );
       
   306     iRemoteVideoPlayer->SetMceSession( iSession );
       
   307     
       
   308     MUS_LOG( "mus: [ENGINE]  <- CMusEngTwoWaySession::CompleteSessionStructureL()" )
       
   309     }
       
   310 
       
   311 // -----------------------------------------------------------------------------
       
   312 //
       
   313 // -----------------------------------------------------------------------------
       
   314 //
       
   315 void CMusEngTwoWaySession::CreateMceSessionStructureL( 
       
   316     TBool /*aForceSdpBandwidth*/ ) 
       
   317     {
       
   318     //Force SDP bandwidth attributes to be included in the INVITE
       
   319     CMusEngMceOutSession::CreateMceSessionStructureL( ETrue );
       
   320     }
       
   321 
       
   322 // -----------------------------------------------------------------------------
       
   323 // Sets video codec attributes
       
   324 // -----------------------------------------------------------------------------
       
   325 //
       
   326 void CMusEngTwoWaySession::AdjustVideoCodecL( CMceVideoCodec& aVideoCodec,
       
   327                                               TMceSourceType aSourceType )
       
   328     {
       
   329     MUS_LOG( "mus: [ENGINE] -> CMusEngTwoWaySession::AdjustVideoCodecL()" )
       
   330     
       
   331     CMusEngLiveSession::AdjustVideoCodecL( aVideoCodec, aSourceType );
       
   332     
       
   333     aVideoCodec.SetKeepAliveTimerL( KMusEngTwoWayRtpKeepAliveTimer );
       
   334     if ( aVideoCodec.SdpName() == KMceSDPNameH263() ||
       
   335          aVideoCodec.SdpName() == KMceSDPNameH2632000() )
       
   336         {
       
   337         aVideoCodec.SetKeepAlivePayloadTypeL( KMusEngKeepAlivePayloadTypeVideoH263 );   
       
   338         }
       
   339     else if ( aVideoCodec.SdpName() == KMceSDPNameH264() )
       
   340         {
       
   341         aVideoCodec.SetKeepAlivePayloadTypeL( KMusEngKeepAlivePayloadTypeVideoAvc );                          
       
   342         }
       
   343     else
       
   344         {
       
   345         // NOP
       
   346         }
       
   347     
       
   348     aVideoCodec.SetKeepAliveDataL( KNullDesC8() );
       
   349     
       
   350     MUS_LOG( "mus: [ENGINE] <- CMusEngTwoWaySession::AdjustVideoCodecL()" )
       
   351     }
       
   352 	
       
   353 // -----------------------------------------------------------------------------
       
   354 //
       
   355 // -----------------------------------------------------------------------------
       
   356 //
       
   357 void CMusEngTwoWaySession::AddDisplayL( CMceMediaStream& aStream )
       
   358     {
       
   359     // Vf display is disabled at creation phase if doing bg startup
       
   360     MusEngMceUtils::AddDisplayL( aStream, 
       
   361                                  *iManager,
       
   362                                  iLocalRect,
       
   363                                  IsBackgroundStartup() );
       
   364     }
       
   365  
       
   366 // -----------------------------------------------------------------------------
       
   367 //
       
   368 // -----------------------------------------------------------------------------
       
   369 //
       
   370 void CMusEngTwoWaySession::StreamStateChanged( CMceMediaStream& aStream )
       
   371     {
       
   372     MUS_LOG( "mus: [ENGINE] -> CMusEngTwoWaySession::StreamStateChanged()" )
       
   373     if ( !iSession )
       
   374         {
       
   375         return;
       
   376         }
       
   377     
       
   378     if ( aStream.Type() == KMceVideo &&
       
   379          aStream.Source() &&
       
   380          aStream.Source()->Type() == KMceRTPSource )
       
   381         {
       
   382         if ( aStream.State() == CMceMediaStream::EStreaming )
       
   383             {
       
   384             ReceivingStarted();
       
   385             }
       
   386         else if ( aStream.State() == CMceMediaStream::EBuffering )
       
   387             {
       
   388             MUS_LOG( "mus: [ENGINE] CMusEngTwoWaySession buffered" )
       
   389             
       
   390             iBuffered = ETrue;
       
   391             }
       
   392         else
       
   393             {
       
   394             // NOP
       
   395             }
       
   396         }
       
   397     
       
   398     CMusEngMceSession::StreamStateChanged( aStream );
       
   399 
       
   400     MUS_LOG( "mus: [ENGINE] <- CMusEngTwoWaySession::StreamStateChanged()" )
       
   401     }
       
   402 
       
   403 // -----------------------------------------------------------------------------
       
   404 // Once inactivity timeout occurs, state change is notified and receiving
       
   405 // and buffering statuses are cleared. That is safe to do as once receiving
       
   406 // again continues for real, buffering and streaming events will occur always 
       
   407 // sequentially. If buffering status would not be cleared, some unwanted
       
   408 // sreaming events would be passed towards client when it disables/enables
       
   409 // display sink of remote stream while inactivity timer has expired.
       
   410 // -----------------------------------------------------------------------------
       
   411 //
       
   412 void CMusEngTwoWaySession::InactivityTimeout( CMceMediaStream& aStream,
       
   413                                               CMceRtpSource& /*aSource*/ )
       
   414     {
       
   415     MUS_LOG( "mus: [ENGINE]  -> CMusEngTwoWaySession::InactivityTimeout()" )
       
   416     
       
   417     if ( aStream.Type() == KMceVideo && iReceiving )
       
   418         {
       
   419         iReceiving = EFalse;
       
   420         iBuffered = EFalse;
       
   421         if ( iRemoteVideoPlayer )
       
   422             {
       
   423             InformObserverAboutPlayerStateChange( iRemoteVideoPlayer );
       
   424             }
       
   425         }
       
   426     
       
   427     MUS_LOG( "mus: [ENGINE]  <- CMusEngTwoWaySession::InactivityTimeout()" )
       
   428     }
       
   429 
       
   430 // -----------------------------------------------------------------------------
       
   431 //
       
   432 // -----------------------------------------------------------------------------
       
   433 //
       
   434 void CMusEngTwoWaySession::HandleSessionStateChanged( 
       
   435     CMceSession& aSession,
       
   436     TInt aStatusCode,
       
   437     const TDesC8& aReasonPhrase )
       
   438     {
       
   439     MUS_LOG( "mus: [ENGINE]  -> CMusEngTwoWaySession::HandleSessionStateChanged" )
       
   440     
       
   441     MUS_ENG_LOG_SESSION_STATE_AND_STATUS( aSession, aStatusCode, aReasonPhrase )
       
   442     
       
   443     TBool consumed( EFalse );
       
   444     if ( iSession && 
       
   445          iSession == &aSession && 
       
   446          aSession.State() == CMceSession::EEstablished )
       
   447         {   
       
   448         CMceVideoStream* stream = NULL;
       
   449         CMceVideoStream* streamout = NULL;
       
   450         TRAPD( err, stream = MusEngMceUtils::GetVideoInStreamL( *iSession ) )
       
   451         if ( err == KErrNone && stream && stream->IsEnabled() )
       
   452             {
       
   453             TRAP( err, streamout = MusEngMceUtils::GetVideoOutStreamL( *iSession ) )
       
   454             if ( err != KErrNone || !streamout || !streamout->IsEnabled() )
       
   455                 {
       
   456                 MUS_LOG( "mus: [ENGINE] sendrecv downgraded to recvonly, terminate!" )
       
   457                 consumed = ETrue;
       
   458                 InformObserverAboutSessionFailure( err );
       
   459                 }
       
   460             }
       
   461         }
       
   462     
       
   463     if ( !consumed )
       
   464         {
       
   465         CMusEngLiveSession::HandleSessionStateChanged( aSession,
       
   466                                                        aStatusCode, 
       
   467                                                        aReasonPhrase );
       
   468         }
       
   469     MUS_LOG( "mus: [ENGINE]  <- CMusEngTwoWaySession::HandleSessionStateChanged" )
       
   470     }
       
   471 
       
   472 // -----------------------------------------------------------------------------
       
   473 //
       
   474 // -----------------------------------------------------------------------------
       
   475 //
       
   476 CMusEngTwoWaySession::CMusEngTwoWaySession() 
       
   477     : CMusEngLiveSession()
       
   478     {
       
   479     iSetRemoteRect = TRect( 
       
   480         KMusEngRectNotInit, KMusEngRectNotInit, KMusEngRectNotInit, KMusEngRectNotInit );
       
   481     iSetLocalRect = TRect(
       
   482         KMusEngRectNotInit, KMusEngRectNotInit, KMusEngRectNotInit, KMusEngRectNotInit );
       
   483     }
       
   484 
       
   485 
       
   486 // -----------------------------------------------------------------------------
       
   487 //
       
   488 // -----------------------------------------------------------------------------
       
   489 //
       
   490 void CMusEngTwoWaySession::ConstructL()
       
   491     {
       
   492     MUS_LOG( "mus: [ENGINE]  -> CMusEngTwoWaySession::ConstructL()" )
       
   493     
       
   494     CMusEngLiveSession::ConstructL();
       
   495     
       
   496     iRemoteVideoPlayer = CMusEngRemoteVideoPlayer::NewL( *this, *this ); 
       
   497 
       
   498     MUS_LOG( "mus: [ENGINE]  <- CMusEngTwoWaySession::ConstructL()" )
       
   499     }
       
   500 
       
   501 // -----------------------------------------------------------------------------
       
   502 //
       
   503 // -----------------------------------------------------------------------------
       
   504 //
       
   505 void CMusEngTwoWaySession::ReceivingStarted()
       
   506     {
       
   507     if ( iSession && iBuffered )
       
   508         {
       
   509         MUS_LOG( "mus: [ENGINE]  -> CMusEngTwoWaySession::ReceivingStarted()" )
       
   510         
       
   511         TInt err = MusEngMceUtils::EnableInactivityTimer( 
       
   512             *iSession, KMusEngTwoWayReceivingActivityTimeout );
       
   513         
       
   514         if ( err != KErrNone )
       
   515             {
       
   516             MUS_LOG1("mus: [ENGINE] ReceivingStarted failed %d", err)
       
   517             InformObserverAboutSessionFailure( err );   
       
   518             }
       
   519         else
       
   520             {
       
   521             iReceiving = ETrue;
       
   522             InformObserverAboutPlayerStateChange( iRemoteVideoPlayer );
       
   523             InformUiProviderAboutReceivingStart();
       
   524             }
       
   525         
       
   526         MUS_LOG( "mus: [ENGINE]  <- CMusEngTwoWaySession::ReceivingStarted()" )
       
   527         }
       
   528     }
       
   529 
       
   530 // End of file