diff -r 73a1feb507fb -r bc78a40cd63c mmsharing/mmshengine/tsrc/ut_engine/src/ut_musengclipsession.cpp --- a/mmsharing/mmshengine/tsrc/ut_engine/src/ut_musengclipsession.cpp Tue Aug 31 15:12:07 2010 +0300 +++ b/mmsharing/mmshengine/tsrc/ut_engine/src/ut_musengclipsession.cpp Wed Sep 01 12:31:01 2010 +0100 @@ -23,12 +23,10 @@ #include "musengclipsession.h" #include "mussipprofilehandler.h" #include "musengmceutils.h" -#include "mussessionproperties.h" + // SYSTEM INCLUDES -#include -#include -#include +#include #include #include #include @@ -43,7 +41,6 @@ #include #include #include -#include // ----------------------------------------------------------------------------- @@ -109,26 +106,33 @@ // void UT_CMusEngClipSession::SetupL() { - iLcSessionObserver = new( ELeave )CLcSessionObserverStub; - iLcUiProvider = new( ELeave )CLcUiProviderStub; - iAudioRoutingObserver = new( ELeave )CMusEngObserverStub; - - iClipSession = CMusEngClipSession::NewL(); - iClipSession->SetLcSessionObserver( iLcSessionObserver ); - iClipSession->SetLcUiProvider( iLcUiProvider ); - iClipSession->LocalVideoPlayer()->LcSourceFileControl()->SetLcFileNameL( - KTestVideoFileName() ); - delete iClipSession->iVideoCodecList; - iClipSession->iVideoCodecList = NULL; + iObserver = new( ELeave ) CMusEngObserverStub; + iClipSession = CMusEngClipSession::NewL( TRect(0,0, 100,100), + *iObserver, + *iObserver, + *iObserver ); + iClipSession->SetClipL( KTestVideoFileName ); iClipSession->iVideoCodecList = KMceSDPNameH264().AllocL(); SIPStrings::OpenL(); - - User::LeaveIfError( RProperty::Set( NMusSessionApi::KCategoryUid, - NMusSessionApi::KRemoteSipAddress, - KTestRecipientSipUri ) ); } +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +void UT_CMusEngClipSession::Setup2L() + { + iObserver = new( ELeave ) CMusEngObserverStub; + iClipSession = CMusEngClipSession::NewL( TRect(0,0, 100,100), + *iObserver, + *iObserver, + *iObserver ); + iClipSession->SetClipL( KTestVideoFileName ); + iClipSession->iVideoCodecList = KMceSDPNameH263().AllocL(); + + SIPStrings::OpenL(); + } // ----------------------------------------------------------------------------- // @@ -138,16 +142,14 @@ { SIPStrings::Close(); delete iClipSession; - delete iLcSessionObserver; - delete iLcUiProvider; - delete iAudioRoutingObserver; - PropertyHelper::Close(); + delete iObserver; } // TEST CASES + // ----------------------------------------------------------------------------- // // ----------------------------------------------------------------------------- @@ -155,8 +157,662 @@ void UT_CMusEngClipSession::UT_NewLL() { EUNIT_ASSERT( iClipSession ) + EUNIT_ASSERT( iClipSession->iFileName != KNullDesC() ) EUNIT_ASSERT( !iClipSession->iSession ) - EUNIT_ASSERT( iClipSession->iMceManagerUid == TUid::Uid( KMusUiUid ) ); + } + + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +void UT_CMusEngClipSession::UT_SetClipLL() + { + // Try with protected file, cannot use EUNIT_ASSERT_SPECIFIC_LEAVE + TRAPD( error, iClipSession->SetClipL( KMusDrmProtectedFileName() ) ) + MUS_TEST_FORWARD_ALLOC_FAILURE( error ); + EUNIT_ASSERT( error == KErrPermissionDenied ) + EUNIT_ASSERT_EQUALS( iClipSession->iFileName, KTestVideoFileName() ) + + // Change the file before session is established + iClipSession->SetClipL( KTestAvcVideoFileName() ); + EUNIT_ASSERT_EQUALS( iClipSession->iFileName, KTestAvcVideoFileName() ) + EUNIT_ASSERT( !iClipSession->iSession ) + + // simulate session establishment + ESTABLISH_OUT_SESSION( iClipSession ); + + // Now test with established session + iClipSession->SetClipL( KTestVideoFileName() ); + + CMceFileSource* file = + MusEngMceUtils::GetFileSourceL( *iClipSession->iSession ); + + EUNIT_ASSERT_EQUALS( iClipSession->iFileName, KTestVideoFileName() ) + EUNIT_ASSERT_EQUALS( file->iFileName, KTestVideoFileName() ) + + + } + + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +void UT_CMusEngClipSession::UT_FastForwardLL() + { + // Try before establishment + EUNIT_ASSERT_SPECIFIC_LEAVE( iClipSession->FastForwardL( ETrue ), + KErrNotReady ) + + // Establish session, simulate position and duration and try again + ESTABLISH_OUT_SESSION( iClipSession ); + + CMceFileSource* file = + MusEngMceUtils::GetFileSourceL( *iClipSession->iSession ); + + file->iDuration = KMusEngTestFileDuration; + file->iPosition = KMusEngTestFilePosition; + + iClipSession->FastForwardL( ETrue ); + + EUNIT_ASSERT( !file->iIsEnabled ) + EUNIT_ASSERT( iClipSession->iFFWDStartTime.Int64() > 0 ) + EUNIT_ASSERT( iClipSession->iFRWDStartTime.Int64() == 0 ) + + // Simulate fastforwarding for a while + User::After( 1000 ); + + // Try to fastforward when already fastforwarding, will be ignored + iClipSession->FastForwardL( ETrue ); + EUNIT_ASSERT( !file->iIsEnabled ) + EUNIT_ASSERT( iClipSession->iFFWDStartTime.Int64() > 0 ) + EUNIT_ASSERT( iClipSession->iFRWDStartTime.Int64() == 0 ) + + // Stop fastforwarding + iClipSession->FastForwardL( EFalse ); + EUNIT_ASSERT( file->iPosition > KMusEngTestFilePosition ) + EUNIT_ASSERT( file->iPosition != file->iDuration ) + EUNIT_ASSERT( !file->iIsEnabled ) + EUNIT_ASSERT( iClipSession->iFFWDStartTime.Int64() == 0 ) + EUNIT_ASSERT( iClipSession->iFRWDStartTime.Int64() == 0 ) + + // Try to stop fastforwarding again, leaves + EUNIT_ASSERT_SPECIFIC_LEAVE( iClipSession->FastForwardL( EFalse ), + KErrAlreadyExists ) + + // Start fastrewinding + iClipSession->FastRewindL( ETrue ); + EUNIT_ASSERT( !file->iIsEnabled ) + EUNIT_ASSERT( iClipSession->iFFWDStartTime.Int64() == 0 ) + EUNIT_ASSERT( iClipSession->iFRWDStartTime.Int64() > 0 ) + + // Start fastforwarding, rewinding should be stopped and FFWD started + iClipSession->FastForwardL( ETrue ); + EUNIT_ASSERT( !file->iIsEnabled ) + EUNIT_ASSERT( iClipSession->iFFWDStartTime.Int64() > 0 ) + EUNIT_ASSERT( iClipSession->iFRWDStartTime.Int64() == 0 ) + + // Simulate fastforwarding for a while + User::After( 1000 ); + + // Simulate that clip is almost in end and fastforwarding would have + // continued over end, position should be set to duration. + + file->iPosition = TTimeIntervalMicroSeconds( file->iDuration.Int64() - 1 ); + + iClipSession->FastForwardL( EFalse ); + EUNIT_ASSERT( file->iPosition == file->iDuration ) + EUNIT_ASSERT( !file->iIsEnabled ) + EUNIT_ASSERT( iClipSession->iFFWDStartTime.Int64() == 0 ) + EUNIT_ASSERT( iClipSession->iFRWDStartTime.Int64() == 0 ) + + } + + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +void UT_CMusEngClipSession::UT_FastRewindLL() + { + // Try before establishment + EUNIT_ASSERT_SPECIFIC_LEAVE( iClipSession->FastRewindL( ETrue ), + KErrNotReady ) + + // Establish session, simulate position and duration and try again + ESTABLISH_OUT_SESSION( iClipSession ); + + CMceFileSource* file = + MusEngMceUtils::GetFileSourceL( *iClipSession->iSession ); + + file->iDuration = KMusEngTestFileDuration; + file->iPosition = KMusEngTestFilePosition; + + iClipSession->FastRewindL( ETrue ); + + EUNIT_ASSERT( !file->iIsEnabled ) + EUNIT_ASSERT( iClipSession->iFFWDStartTime.Int64() == 0 ) + EUNIT_ASSERT( iClipSession->iFRWDStartTime.Int64() > 0 ) + + // Simulate fastrewinding for a while + User::After( 1000 ); + + // Try to fastrewind when already fastrewinding, will be ignored + iClipSession->FastRewindL( ETrue ); + EUNIT_ASSERT( !file->iIsEnabled ) + EUNIT_ASSERT( iClipSession->iFFWDStartTime.Int64() == 0 ) + EUNIT_ASSERT( iClipSession->iFRWDStartTime.Int64() > 0 ) + + // Stop fastrewinding + iClipSession->FastRewindL( EFalse ); + EUNIT_ASSERT( file->iPosition < KMusEngTestFilePosition ) + EUNIT_ASSERT( file->iPosition != TTimeIntervalMicroSeconds( 0 ) ) + EUNIT_ASSERT( !file->iIsEnabled ) + EUNIT_ASSERT( iClipSession->iFFWDStartTime.Int64() == 0 ) + EUNIT_ASSERT( iClipSession->iFRWDStartTime.Int64() == 0 ) + + // Try to stop fastrewinding again, leaves + EUNIT_ASSERT_SPECIFIC_LEAVE( iClipSession->FastRewindL( EFalse ), + KErrAlreadyExists ) + + // Start fastforwarding + iClipSession->FastForwardL( ETrue ); + EUNIT_ASSERT( !file->iIsEnabled ) + EUNIT_ASSERT( iClipSession->iFFWDStartTime.Int64() >= 0 ) + EUNIT_ASSERT( iClipSession->iFRWDStartTime.Int64() == 0 ) + + // Start fastrewinding, forwarding should be stopped and FFWD started + iClipSession->FastRewindL( ETrue ); + EUNIT_ASSERT( !file->iIsEnabled ); + EUNIT_ASSERT( iClipSession->iFFWDStartTime.Int64() == 0 ) + EUNIT_ASSERT( iClipSession->iFRWDStartTime.Int64() >= 0 ) + + // Simulate that clip has just begun and fastrewinding would have + // continued over beginning, position should be set to zero. + + file->iPosition = TTimeIntervalMicroSeconds( 1 ); + + // Simulate fastrewinding for a while + User::After( 1000 ); + + iClipSession->FastRewindL( EFalse ); + EUNIT_ASSERT( file->iPosition == TTimeIntervalMicroSeconds( 0 ) ) + EUNIT_ASSERT( !file->iIsEnabled ) + EUNIT_ASSERT( iClipSession->iFFWDStartTime.Int64() == 0 ) + EUNIT_ASSERT( iClipSession->iFRWDStartTime.Int64() == 0 ) + } + + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +void UT_CMusEngClipSession::UT_PositionLL() + { + // Try before establishment + EUNIT_ASSERT_SPECIFIC_LEAVE( iClipSession->PositionL(), KErrNotReady ) + + // Establish session and try again + ESTABLISH_OUT_SESSION( iClipSession ); + + CMceFileSource* file = + MusEngMceUtils::GetFileSourceL( *iClipSession->iSession ); + file->iPosition = 2000000; + + EUNIT_ASSERT( iClipSession->PositionL().Int() * 1000000 == + file->iPosition.Int64() ) + + // Ask position while fastforwarding, it should be bigger than real position + iClipSession->FastForwardL( ETrue ); + + User::After( 1000000 ); // We have to wait since dividing in PositionL and + // multiplying before comparison loses difference + + EUNIT_ASSERT( iClipSession->PositionL().Int() * 1000000 > + file->iPosition.Int64() ) + + // Ask position while fastforwarding beyond end of clip, clip duration is + // returned + file->iPosition = file->iDuration; + + EUNIT_ASSERT( iClipSession->PositionL().Int() * 1000000 == + file->iDuration.Int64() ) + + // Stop fastforwarding, start fastrewinding, position is set to the end clip + iClipSession->FastForwardL( EFalse ); + iClipSession->FastRewindL( ETrue ); + + User::After( 1000000 ); // We have to wait since dividing in PositionL and + // multiplying before comparison loses difference + + // Ask position while fastrewinding, it should be smaller than real + // position + EUNIT_ASSERT( iClipSession->PositionL().Int() * 1000000 < + file->iPosition.Int64() ) + + // Ask position while fastrewinding beyond the beginning of clip, zero + // returned + file->iPosition = 0; + + EUNIT_ASSERT( iClipSession->PositionL().Int() * 1000000 == 0 ) + + // Asking position when rewinded to beginning but rewinding has ended + // and clip has not ended (position should not be altered in that case) + iClipSession->iRewindedToBeginning = ETrue; + file->iPosition = 0; + iClipSession->iFRWDStartTime = TTime( 0 ); + + EUNIT_ASSERT( iClipSession->PositionL().Int() * 1000000 == 0 ) + + // Position has proceeded from beginning, rewinding to beginning info + // is cleared. + file->iPosition = 10000000; + iClipSession->iFRWDStartTime = TTime( 0 ); + iClipSession->iRewindedToBeginning = EFalse; + EUNIT_ASSERT( iClipSession->PositionL().Int() * 1000000 == 10000000 ) + EUNIT_ASSERT( iClipSession->iRewindedToBeginning == EFalse ) + } + + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +void UT_CMusEngClipSession::UT_DurationLL() + { + // Try before establishment + EUNIT_ASSERT_SPECIFIC_LEAVE( iClipSession->DurationL(), KErrNotReady ) + + // Establish session and try again + ESTABLISH_OUT_SESSION( iClipSession ); + + CMceFileSource* file = + MusEngMceUtils::GetFileSourceL( *iClipSession->iSession ); + file->iDuration = 2000000; + + EUNIT_ASSERT( iClipSession->DurationL().Int() * 1000000 == + file->iDuration.Int64() ) + } + + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +void UT_CMusEngClipSession::UT_SetPositionLL() + { + TTimeIntervalSeconds time( 20 ); + + // Try before establishment + EUNIT_ASSERT_SPECIFIC_LEAVE( iClipSession->SetPositionL( time ), + KErrNotReady ) + + // Normal case with already disabled file source + ESTABLISH_OUT_SESSION( iClipSession ); + + CMceFileSource* file = + MusEngMceUtils::GetFileSourceL( *iClipSession->iSession ); + file->iIsEnabled = EFalse; + + iClipSession->SetPositionL( time ); + + EUNIT_ASSERT( file->iPosition.Int64() == + static_cast(time.Int()) * 1000000 ) + EUNIT_ASSERT( !file->iIsEnabled ) + + // Normal case with enabled file source + TTimeIntervalSeconds anotherTime( 30 ); + + file->iIsEnabled = ETrue; + iClipSession->SetPositionL( anotherTime ); + + EUNIT_ASSERT( file->iPosition.Int64() == + static_cast(anotherTime.Int()) * 1000000 ) + EUNIT_ASSERT( file->iIsEnabled ) + } + + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +void UT_CMusEngClipSession::UT_TranscodeLToAvcL() + { + // Check that transcoding is not possible before invite + EUNIT_ASSERT_SPECIFIC_LEAVE( + iClipSession->TranscodeL( KTestVideoFileName() ), + KErrNotReady ) + + // Construct session with video and audio streams that must transcoded + + CSIPProfile* profile = iClipSession->iSipProfileHandler->Profile(); + + iClipSession->iSession = CMceOutSession::NewL( + *(iClipSession->iManager), + *profile, + KTestRecipientSipUri8() ); + + CMceVideoStream* videoStream = CMceVideoStream::NewLC(); + + CMceRtpSink* rtpsink = CMceRtpSink::NewLC(); + videoStream->AddSinkL( rtpsink ); + CleanupStack::Pop( rtpsink ); + + CMceFileSource* fileSource = + CMceFileSource::NewLC( *iClipSession->iManager, KTestAvcVideoFileName() ); + videoStream->SetSourceL( fileSource ); + CleanupStack::Pop( fileSource ); + + iClipSession->iSession->AddStreamL( videoStream ); + CleanupStack::Pop( videoStream ); + + CMceAudioStream* audioStream = CMceAudioStream::NewLC(); + + audioStream->AddSinkL( CMceRtpSink::NewLC() ); + CleanupStack::Pop(); + + audioStream->SetSourceL( fileSource ); + + iClipSession->iSession->AddStreamL( audioStream ); + CleanupStack::Pop( audioStream ); + + videoStream->iState = CMceMediaStream::ETranscodingRequired; + audioStream->iState = CMceMediaStream::ETranscodingRequired; + + // Remove all codecs (file has some unknown codec type) + RPointerArray videoCodecs = videoStream->Codecs(); + for ( TInt i = 0; i < videoCodecs.Count(); i++ ) + { + videoStream->RemoveCodecL( *videoCodecs[ i ] ); + } + RPointerArray videoCodecs2 = videoStream->Codecs(); + EUNIT_ASSERT_EQUALS( videoCodecs2.Count(), 0 ) + EUNIT_ASSERT( audioStream->Codecs().Count() > 1 ) + + // Add some stream which must not be transcoded + + CMceAudioStream* inStream = CMceAudioStream::NewLC(); + + inStream->AddSinkL( CMceSpeakerSink::NewLC() ); + CleanupStack::Pop(); + + inStream->SetSourceL( CMceRtpSource::NewLC() ); + CleanupStack::Pop(); + + iClipSession->iSession->AddStreamL( inStream ); + CleanupStack::Pop( inStream ); + + // Transcode + iClipSession->TranscodeL( KTestAvcVideoFileName() ); + + // Check that transcoding has begun (transcoding to AVC as we know + // that other end supports it + EUNIT_ASSERT( iClipSession->iTranscodingOngoing ) + EUNIT_ASSERT( videoStream->State() == CMceMediaStream::ETranscoding ) + EUNIT_ASSERT( audioStream->State() == CMceMediaStream::ETranscoding ) + EUNIT_ASSERT( inStream->State() != CMceMediaStream::ETranscoding ) + + // Check that codecs have been replaced + const RPointerArray videoCodecs3 = videoStream->Codecs(); + EUNIT_ASSERT_EQUALS( videoCodecs3.Count(), 1 ) + EUNIT_ASSERT( videoCodecs3[0]->SdpName().FindF( KMceSDPNameH264() ) >= 0 ) + EUNIT_ASSERT( audioStream->Codecs().Count() == 1 ) + EUNIT_ASSERT( audioStream->Codecs()[0]->AllowedBitrates() == + KMceAllowedAmrNbBitrate475 ) + } + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +void UT_CMusEngClipSession::UT_TranscodeLToH263L() + { + // Check that transcoding is not possible before invite + EUNIT_ASSERT_SPECIFIC_LEAVE( + iClipSession->TranscodeL( KTestVideoFileName() ), + KErrNotReady ) + + // Construct session with video and audio streams that must transcoded + + CSIPProfile* profile = iClipSession->iSipProfileHandler->Profile(); + + iClipSession->iSession = CMceOutSession::NewL( + *(iClipSession->iManager), + *profile, + KTestRecipientSipUri8() ); + + CMceVideoStream* videoStream = CMceVideoStream::NewLC(); + + CMceRtpSink* rtpsink = CMceRtpSink::NewLC(); + videoStream->AddSinkL( rtpsink ); + CleanupStack::Pop( rtpsink ); + + CMceFileSource* fileSource = + CMceFileSource::NewLC( *iClipSession->iManager, KTestAvcVideoFileName() ); + videoStream->SetSourceL( fileSource ); + CleanupStack::Pop( fileSource ); + + iClipSession->iSession->AddStreamL( videoStream ); + CleanupStack::Pop( videoStream ); + + CMceAudioStream* audioStream = CMceAudioStream::NewLC(); + + audioStream->AddSinkL( CMceRtpSink::NewLC() ); + CleanupStack::Pop(); + + audioStream->SetSourceL( fileSource ); + + iClipSession->iSession->AddStreamL( audioStream ); + CleanupStack::Pop( audioStream ); + + videoStream->iState = CMceMediaStream::ETranscodingRequired; + audioStream->iState = CMceMediaStream::ETranscodingRequired; + + const RPointerArray videoCodecs = videoStream->Codecs(); + EUNIT_ASSERT_EQUALS( videoCodecs.Count(), 1 ) + EUNIT_ASSERT( videoCodecs[0]->SdpName().FindF( KMceSDPNameH264() ) >= 0 ) + EUNIT_ASSERT( audioStream->Codecs().Count() > 1 ) + + TSize resolution(200,200); // Some value + videoStream->Codecs()[0]->SetResolutionL( resolution ); + audioStream->Codecs()[0]->SetBitrate( KMceAllowedAmrNbBitrateAll ); + + // Add some stream which must not be transcoded + + CMceAudioStream* inStream = CMceAudioStream::NewLC(); + + inStream->AddSinkL( CMceSpeakerSink::NewLC() ); + CleanupStack::Pop(); + + inStream->SetSourceL( CMceRtpSource::NewLC() ); + CleanupStack::Pop(); + + iClipSession->iSession->AddStreamL( inStream ); + CleanupStack::Pop( inStream ); + + // Transcode + iClipSession->TranscodeL( KTestAvcVideoFileName() ); + + // Check that transcoding has begun (transcoding to H263 as we don't + // know whether other end supports H264) EUNIT_ASSERT( iClipSession->iTranscodingOngoing ) + EUNIT_ASSERT( videoStream->State() == CMceMediaStream::ETranscoding ) + EUNIT_ASSERT( audioStream->State() == CMceMediaStream::ETranscoding ) + EUNIT_ASSERT( inStream->State() != CMceMediaStream::ETranscoding ) + + // Check that codecs have been replaced + const RPointerArray videoCodecs2 = videoStream->Codecs(); + EUNIT_ASSERT_EQUALS( videoCodecs2.Count(), 1 ) + EUNIT_ASSERT( videoCodecs2[0]->SdpName().FindF( KMceSDPNameH263() ) >= 0 ) + EUNIT_ASSERT( audioStream->Codecs().Count() == 1 ) + + EUNIT_ASSERT( videoStream->Codecs()[0]->Resolution() != resolution ) + EUNIT_ASSERT( audioStream->Codecs()[0]->AllowedBitrates() == + KMceAllowedAmrNbBitrate475 ) + } + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +void UT_CMusEngClipSession::UT_CancelTranscodeLL() + { + // Check that canceling transcoding is not possible before actual + // transcoding + EUNIT_ASSERT_SPECIFIC_LEAVE( iClipSession->CancelTranscodeL(), + KErrNotReady ) + + // Construct session structure + + CSIPProfile* profile = iClipSession->iSipProfileHandler->Profile(); + + iClipSession->iSession = CMceOutSession::NewL( + *(iClipSession->iManager), + *profile, + KTestRecipientSipUri8() ); + + CMceVideoStream* videoStream = CMceVideoStream::NewLC(); + + CMceRtpSink* rtpsink = CMceRtpSink::NewLC(); + videoStream->AddSinkL( rtpsink ); + CleanupStack::Pop( rtpsink ); + + CMceFileSource* fileSource = + CMceFileSource::NewLC( *iClipSession->iManager, KTestVideoFileName() ); + videoStream->SetSourceL( fileSource ); + CleanupStack::Pop( fileSource ); + + iClipSession->iSession->AddStreamL( videoStream ); + CleanupStack::Pop( videoStream ); + + CMceAudioStream* audioStream = CMceAudioStream::NewLC(); + + audioStream->AddSinkL( CMceRtpSink::NewLC() ); + CleanupStack::Pop(); + + audioStream->SetSourceL( fileSource ); + + iClipSession->iSession->AddStreamL( audioStream ); + CleanupStack::Pop( audioStream ); + + // Set need for transcoding + videoStream->iState = CMceMediaStream::ETranscodingRequired; + audioStream->iState = CMceMediaStream::ETranscodingRequired; + + // Transcode + iClipSession->TranscodeL( KTestAvcVideoFileName() ); + + EUNIT_ASSERT( videoStream->State() == CMceMediaStream::ETranscoding ) + EUNIT_ASSERT( audioStream->State() == CMceMediaStream::ETranscoding ) + + // Cancel + iClipSession->CancelTranscodeL(); + + EUNIT_ASSERT( videoStream->State() == + CMceMediaStream::ETranscodingRequired ) + EUNIT_ASSERT( audioStream->State() == + CMceMediaStream::ETranscodingRequired ) + } + + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +void UT_CMusEngClipSession::UT_PlayLL() + { + // Check that resuming is not possible before invite + EUNIT_ASSERT_SPECIFIC_LEAVE( iClipSession->PlayL(), KErrNotReady ) + + ESTABLISH_OUT_SESSION( iClipSession ); + + // Check that playing is not possible during FFWD + iClipSession->iFFWDStartTime = TTime( 10 ); + EUNIT_ASSERT_SPECIFIC_LEAVE( iClipSession->PlayL(), KErrNotReady ) + iClipSession->iFFWDStartTime = TTime( 0 ); + + // Check that playing is not possible during FRWD + iClipSession->iFRWDStartTime = TTime( 10 ); + EUNIT_ASSERT_SPECIFIC_LEAVE( iClipSession->PlayL(), KErrNotReady ) + iClipSession->iFRWDStartTime = TTime( 0 ); + + // Successful case + CMceFileSource* file = + MusEngMceUtils::GetFileSourceL( *(iClipSession->iSession) ); + + file->iIsEnabled = EFalse; + + iClipSession->PlayL(); + + EUNIT_ASSERT( file->IsEnabled() ) + + // Try to play again, request should be ignored + + iClipSession->PlayL(); + + EUNIT_ASSERT( file->IsEnabled() ) + + } + + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +void UT_CMusEngClipSession::UT_PauseLL() + { + // Check that pausing is not possible before invite + EUNIT_ASSERT_SPECIFIC_LEAVE( iClipSession->PauseL(), KErrNotReady ) + + ESTABLISH_OUT_SESSION( iClipSession ); + + // Check that pausing is not possible during FFWD + iClipSession->iFFWDStartTime = TTime( 10 ); + EUNIT_ASSERT_SPECIFIC_LEAVE( iClipSession->PauseL(), KErrNotReady ) + iClipSession->iFFWDStartTime = TTime( 0 ); + + // Check that pausing is not possible during FRWD + iClipSession->iFRWDStartTime = TTime( 10 ); + EUNIT_ASSERT_SPECIFIC_LEAVE( iClipSession->PauseL(), KErrNotReady ) + iClipSession->iFRWDStartTime = TTime( 0 ); + + // Successful case + + CMceFileSource* file = + MusEngMceUtils::GetFileSourceL( *(iClipSession->iSession) ); + + file->iIsEnabled = ETrue; + + iClipSession->PauseL(); + + EUNIT_ASSERT( !file->IsEnabled() ) + + // Try to pause again, request should be ignored + + iClipSession->PauseL(); + + EUNIT_ASSERT( !file->IsEnabled() ) + + } + + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +void UT_CMusEngClipSession::UT_IsPlayingLL() + { + // Try without a session + EUNIT_ASSERT_SPECIFIC_LEAVE( iClipSession->IsPlayingL(), KErrNotReady ); + + // Normal cases + ESTABLISH_OUT_SESSION( iClipSession ); + + iClipSession->PlayL(); + EUNIT_ASSERT( iClipSession->IsPlayingL() ) + + iClipSession->PauseL(); + EUNIT_ASSERT( !iClipSession->IsPlayingL() ) } @@ -165,26 +821,39 @@ // ----------------------------------------------------------------------------- // void UT_CMusEngClipSession::UT_CompleteSessionStructureLL() - { + { + CMceStreamBundle* localBundle = - CMceStreamBundle::NewLC( CMceStreamBundle::ELS ); + CMceStreamBundle::NewLC( CMceStreamBundle::ELS ); // Check that structure cannot be completed before creating the session EUNIT_ASSERT_SPECIFIC_LEAVE( iClipSession->CompleteSessionStructureL( *localBundle ), KErrNotReady ) - // Normal case - CSIPProfile* profile = iClipSession->iSipProfileHandler->Profile(); + // Check that structure cannot be completed before setting the file name + iClipSession->iFileName = KNullDesC(); + CSIPProfile* profile = iClipSession->iSipProfileHandler->Profile(); + iClipSession->iSession = CMceOutSession::NewL( - *iClipSession->iManager, *profile, KTestRecipientSipUri8() ); + *(iClipSession->iManager), + *profile, + KTestRecipientSipUri8() ); + + EUNIT_ASSERT_SPECIFIC_LEAVE( + iClipSession->CompleteSessionStructureL( *localBundle ), + KErrNotReady ) + // Normal case + iClipSession->iFileName = KTestVideoFileName(); iClipSession->CompleteSessionStructureL( *localBundle ); + EUNIT_ASSERT( iClipSession->iSession->Streams().Count() == 3 ) EUNIT_ASSERT( iClipSession->iSession->Streams()[0]->Type() == KMceVideo ) EUNIT_ASSERT( iClipSession->iSession->Streams()[0]->Source() ) EUNIT_ASSERT( iClipSession->iSession->Streams()[0]->Source()->Type() == - KMceFileSource ) + KMceFileSource ) + EUNIT_ASSERT( !iClipSession->IsPlayingL() ) EUNIT_ASSERT( iClipSession->iSession->Streams()[0]->Sinks().Count() == 1 ) EUNIT_ASSERT( iClipSession->iSession->Streams()[0]->Sinks()[0]->Type() == KMceRTPSink ) @@ -214,7 +883,7 @@ CleanupStack::PopAndDestroy( videoStream ); // Simulate sending invite - iClipSession->EstablishLcSessionL(); + iClipSession->InviteL( KTestRecipientSipUri() ); // Try all the stream states CMceMediaStream* changedStream = iClipSession->iSession->Streams()[0]; @@ -223,57 +892,56 @@ changedStream->iState = CMceMediaStream::EUninitialized; static_cast(iClipSession)->StreamStateChanged( *changedStream ); - EUNIT_ASSERT( iLcSessionObserver->IsReseted() ) + EUNIT_ASSERT( iObserver->IsReseted() ) // EInitialized, stream is initialized changedStream->iState = CMceMediaStream::EInitialized; static_cast(iClipSession)->StreamStateChanged( *changedStream ); - EUNIT_ASSERT( iLcSessionObserver->IsReseted() ) + EUNIT_ASSERT( iObserver->IsReseted() ) // EBuffering, stream is buffering changedStream->iState = CMceMediaStream::EBuffering; static_cast(iClipSession)->StreamStateChanged( *changedStream ); - EUNIT_ASSERT( iLcSessionObserver->IsReseted() ) + EUNIT_ASSERT( iObserver->IsReseted() ) // EIdle, stream is not receiving RTP changedStream->iState = CMceMediaStream::EIdle; static_cast(iClipSession)->StreamStateChanged( *changedStream ); - EUNIT_ASSERT( iLcSessionObserver->IsReseted() ) + EUNIT_ASSERT( iObserver->iStreamIdleCalled ) // EStreaming, stream is streaming changedStream->iState = CMceMediaStream::EStreaming; static_cast(iClipSession)->StreamStateChanged( *changedStream ); - EUNIT_ASSERT_EQUALS( TInt( iLcSessionObserver->iCalledFunction ), - TInt( CLcSessionObserverStub::EPlayerStateChanged ) ) - iLcSessionObserver->Reset(); + EUNIT_ASSERT( iObserver->iStreamStreamingCalled ) + iObserver->Reset(); // EDisabled, stream is explicitly disabled changedStream->iState = CMceMediaStream::EDisabled; static_cast(iClipSession)->StreamStateChanged( *changedStream ); - EUNIT_ASSERT( iLcSessionObserver->IsReseted() ) + EUNIT_ASSERT( iObserver->IsReseted() ) // ENoResources, stream has no needed resources to stream changedStream->iState = CMceMediaStream::ENoResources; static_cast(iClipSession)->StreamStateChanged( *changedStream ); - EUNIT_ASSERT( iLcSessionObserver->IsReseted() ) + EUNIT_ASSERT( iObserver->IsReseted() ) // ETranscodingRequired, stream requires non-realtime transcoding changedStream->iState = CMceMediaStream::ETranscodingRequired; static_cast(iClipSession)->StreamStateChanged( *changedStream ); - EUNIT_ASSERT( iLcSessionObserver->IsReseted() ) + EUNIT_ASSERT( iObserver->IsReseted() ) // ETranscoding, stream is transcoding in non-realtime changedStream->iState = CMceMediaStream::ETranscoding; static_cast(iClipSession)->StreamStateChanged( *changedStream ); - EUNIT_ASSERT( iLcSessionObserver->IsReseted() ) + EUNIT_ASSERT( iObserver->IsReseted() ) } @@ -294,7 +962,7 @@ CleanupStack::PopAndDestroy( videoStream ); // Simulate sending invite - iClipSession->EstablishLcSessionL(); + iClipSession->InviteL( KTestRecipientSipUri() ); // Try all the non-default stream states CMceMediaStream* changedStream = iClipSession->iSession->Streams()[0]; @@ -305,9 +973,68 @@ changedSource->iIsEnabled = EFalse; iClipSession->StreamStateChanged( *changedStream, *changedSource ); - // TODO: EUNIT_ASSERT( iLcSessionObserver->iEndOfClipCalled ) + EUNIT_ASSERT( iObserver->iEndOfClipCalled == ETrue ) changedSource->iIsEnabled = ETrue; - iLcSessionObserver->Reset(); + iObserver->Reset(); + + // ETranscodingRequired, transcoding has failed + iClipSession->iSession->iState = CMceSession::EIdle; + iClipSession->iTranscodingOngoing = ETrue; + changedStream->iState = CMceMediaStream::ETranscodingRequired; + static_cast(iClipSession)->StreamStateChanged( + *changedStream, *changedSource ); + EUNIT_ASSERT( iObserver->iTranscodingFailedCalled ) + EUNIT_ASSERT( !iClipSession->iTranscodingOngoing ) + iObserver->Reset(); + + // ETranscoding, transcoding has progresssed + iClipSession->iSession->iState = CMceSession::EIdle; + changedStream->iState = CMceMediaStream::ETranscoding; + static_cast(changedSource)->iTranscodingPercentage = 20; + static_cast(iClipSession)->StreamStateChanged( + *changedStream, *changedSource ); + EUNIT_ASSERT( iObserver->iTranscodingProgressedPercentage == 20 ) + iObserver->Reset(); + + // ETranscoding, transcoding has progresssed, querying percentage fails + iClipSession->iSession->iState = CMceSession::EIdle; + changedStream->iState = CMceMediaStream::ETranscoding; + iObserver->iTranscodingProgressedPercentage = -1; // make assertion possible + static_cast(changedSource)->iFailWithCode = KErrNotReady; + static_cast(changedSource)->iTranscodingPercentage = 30; + static_cast(iClipSession)->StreamStateChanged( + *changedStream, *changedSource ); + EUNIT_ASSERT( iObserver->iTranscodingProgressedPercentage == 0 ) + iObserver->Reset(); + + // EInitialized, transcoding has completed, establishment fails + iClipSession->iSession->iState = CMceSession::EIdle; + iClipSession->iSession->iFailWithCode = KErrCorrupt; // != KErrNone + iClipSession->iTranscodingOngoing = ETrue; + changedStream->iState = CMceMediaStream::EInitialized; + static_cast(changedSource)->iTranscodingPercentage = 100; + static_cast(iClipSession)->StreamStateChanged( + *changedStream, *changedSource ); + EUNIT_ASSERT( iObserver->iTranscodingCompletedInitCalled ) + EUNIT_ASSERT( iObserver->iTranscodingCompletedFinalizeCalled ) + EUNIT_ASSERT( iObserver->iSessionFailedCalled ) + EUNIT_ASSERT( !iClipSession->iTranscodingOngoing ) + iObserver->Reset(); + + // EInitialized, transcoding has completed, establishment succeeds + iClipSession->iSession->iState = CMceSession::EIdle; + iClipSession->iTranscodingOngoing = ETrue; + changedStream->iState = CMceMediaStream::EInitialized; + static_cast(changedSource)->iTranscodingPercentage = 100; + static_cast(iClipSession)->StreamStateChanged( + *changedStream, *changedSource ); + EUNIT_ASSERT( iObserver->iTranscodingCompletedInitCalled ) + EUNIT_ASSERT( iObserver->iTranscodingCompletedFinalizeCalled ) + // Next cannot be asserted since it is not true with alloc decoration + // EUNIT_ASSERT( !iObserver->iSessionFailedCalled ) + EUNIT_ASSERT( !iClipSession->iTranscodingOngoing ) + iObserver->Reset(); + // Test default stream state change behavior, remove or change when // behavior changes @@ -317,13 +1044,13 @@ changedStream->iState = CMceMediaStream::EUninitialized; static_cast(iClipSession)->StreamStateChanged( *changedStream, *changedSource ); - EUNIT_ASSERT( iLcSessionObserver->IsReseted() ) + EUNIT_ASSERT( iObserver->IsReseted() ) // EInitialized, stream is initialized changedStream->iState = CMceMediaStream::EInitialized; static_cast(iClipSession)->StreamStateChanged( *changedStream, *changedSource ); - EUNIT_ASSERT( iLcSessionObserver->IsReseted() ) + EUNIT_ASSERT( iObserver->IsReseted() ) // Special meaning (Transcoding ready), tested separately @@ -331,21 +1058,20 @@ changedStream->iState = CMceMediaStream::EBuffering; static_cast(iClipSession)->StreamStateChanged( *changedStream, *changedSource ); - EUNIT_ASSERT( iLcSessionObserver->IsReseted() ) + EUNIT_ASSERT( iObserver->IsReseted() ) // EIdle, stream is not receiving RTP changedStream->iState = CMceMediaStream::EIdle; static_cast(iClipSession)->StreamStateChanged( *changedStream, *changedSource ); - EUNIT_ASSERT( iLcSessionObserver->IsReseted() ) + EUNIT_ASSERT( iObserver->iStreamIdleCalled ) // EStreaming, stream is streaming changedStream->iState = CMceMediaStream::EStreaming; static_cast(iClipSession)->StreamStateChanged( *changedStream, *changedSource ); - EUNIT_ASSERT_EQUALS( TInt( iLcSessionObserver->iCalledFunction ), - TInt( CLcSessionObserverStub::EPlayerStateChanged ) ) - iLcSessionObserver->Reset(); + EUNIT_ASSERT( iObserver->iStreamStreamingCalled ) + iObserver->Reset(); // EDisabled, stream is explicitly disabled // This state has non-default meaning, tested before defaults @@ -354,7 +1080,9 @@ changedStream->iState = CMceMediaStream::ENoResources; static_cast(iClipSession)->StreamStateChanged( *changedStream, *changedSource ); - EUNIT_ASSERT( iLcSessionObserver->IsReseted() ) + EUNIT_ASSERT( iObserver->IsReseted() ) + + } @@ -374,7 +1102,7 @@ CleanupStack::PopAndDestroy( videoStream ); // Simulate sending invite - iClipSession->EstablishLcSessionL(); + iClipSession->InviteL( KTestRecipientSipUri() ); // Test default stream state change behavior CMceMediaStream* changedStream = iClipSession->iSession->Streams()[0]; @@ -385,65 +1113,65 @@ static_cast(iClipSession)->StreamStateChanged( *changedStream, *changedSink ); - EUNIT_ASSERT( iLcSessionObserver->IsReseted() ) + EUNIT_ASSERT( iObserver->IsReseted() ) // EInitialized, stream is initialized changedStream->iState = CMceMediaStream::EInitialized; static_cast(iClipSession)->StreamStateChanged( *changedStream, *changedSink ); - EUNIT_ASSERT( iLcSessionObserver->IsReseted() ) + EUNIT_ASSERT( iObserver->IsReseted() ) // EBuffering, stream is buffering changedStream->iState = CMceMediaStream::EBuffering; static_cast(iClipSession)->StreamStateChanged( *changedStream, *changedSink ); - EUNIT_ASSERT( iLcSessionObserver->IsReseted() ) + EUNIT_ASSERT( iObserver->IsReseted() ) // EIdle, stream is not receiving RTP changedStream->iState = CMceMediaStream::EIdle; static_cast(iClipSession)->StreamStateChanged( *changedStream, *changedSink ); - EUNIT_ASSERT( iLcSessionObserver->IsReseted() ) + EUNIT_ASSERT( iObserver->iStreamIdleCalled ); // EStreaming, stream is streaming changedStream->iState = CMceMediaStream::EStreaming; static_cast(iClipSession)->StreamStateChanged( *changedStream, *changedSink ); - EUNIT_ASSERT_EQUALS( TInt( iLcSessionObserver->iCalledFunction ), - TInt( CLcSessionObserverStub::EPlayerStateChanged ) ) - iLcSessionObserver->Reset(); + EUNIT_ASSERT( iObserver->iStreamStreamingCalled ) + iObserver->Reset(); // EDisabled, stream is explicitly disabled changedStream->iState = CMceMediaStream::EDisabled; static_cast(iClipSession)->StreamStateChanged( *changedStream, *changedSink ); - EUNIT_ASSERT( iLcSessionObserver->IsReseted() ) + EUNIT_ASSERT( iObserver->IsReseted() ) // ENoResources, stream has no needed resources to stream changedStream->iState = CMceMediaStream::ENoResources; static_cast(iClipSession)->StreamStateChanged( *changedStream, *changedSink ); - EUNIT_ASSERT( iLcSessionObserver->IsReseted() ) + EUNIT_ASSERT( iObserver->IsReseted() ) // ETranscodingRequired, stream requires non-realtime transcoding changedStream->iState = CMceMediaStream::ETranscodingRequired; static_cast(iClipSession)->StreamStateChanged( *changedStream, *changedSink ); - EUNIT_ASSERT( iLcSessionObserver->IsReseted() ) + EUNIT_ASSERT( iObserver->IsReseted() ) // ETranscoding, stream is transcoding in non-realtime changedStream->iState = CMceMediaStream::ETranscoding; static_cast(iClipSession)->StreamStateChanged( *changedStream, *changedSink ); - EUNIT_ASSERT( iLcSessionObserver->IsReseted() ) + EUNIT_ASSERT( iObserver->IsReseted() ) + } @@ -537,6 +1265,65 @@ // // ----------------------------------------------------------------------------- // +void UT_CMusEngClipSession::UT_HasClipEndedL() + { + // Try before establishing the session + EUNIT_ASSERT( !iClipSession->HasClipEnded() ) + + // Try with session, but without video out stream + + CSIPProfile* profile = iClipSession->iSipProfileHandler->Profile(); + + iClipSession->iSession = CMceOutSession::NewL( + *(iClipSession->iManager), + *profile, + KTestRecipientSipUri8() ); + + EUNIT_ASSERT( !iClipSession->HasClipEnded() ) + + // Try with video out stream without source... + CMceVideoStream* videoOut = CMceVideoStream::NewLC(); + + videoOut->AddSinkL( CMceRtpSink::NewLC() ); + CleanupStack::Pop(); + + iClipSession->iSession->AddStreamL( videoOut ); + CleanupStack::Pop( videoOut ); + + EUNIT_ASSERT( !iClipSession->HasClipEnded() ) + + // And with enabled source and stream + videoOut->SetSourceL( CMceFileSource::NewLC( *iClipSession->iManager, + iClipSession->iFileName ) ); + CleanupStack::Pop(); + + EUNIT_ASSERT( !iClipSession->HasClipEnded() ) + + // try with different position and duration + (static_cast (videoOut->Source()))->iPosition = 90; + (static_cast (videoOut->Source()))->iDuration = 111; + EUNIT_ASSERT( !iClipSession->HasClipEnded() ) + + // Disapling source + (static_cast (videoOut->Source()))->DisableL(); + EUNIT_ASSERT( !iClipSession->HasClipEnded() ) + + // Disapling stream + videoOut->iState = CMceMediaStream::EDisabled; + EUNIT_ASSERT( !iClipSession->HasClipEnded() ) + + // and finaly try with "real" end of clip + (static_cast (videoOut->Source()))->iPosition = 0; + (static_cast (videoOut->Source()))->iDuration = 111; + + EUNIT_ASSERT( iClipSession->HasClipEnded() ) + } + + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// void UT_CMusEngClipSession::UT_ConstructAudioStructureLL() { @@ -569,9 +1356,8 @@ videoOut->AddSinkL( CMceRtpSink::NewLC() ); CleanupStack::Pop(); - videoOut->SetSourceL( CMceFileSource::NewLC( - *iClipSession->iManager, - iClipSession->LocalVideoPlayer()->LcSourceFileControl()->LcFileName() ) ); + videoOut->SetSourceL( CMceFileSource::NewLC( *iClipSession->iManager, + iClipSession->iFileName ) ); CleanupStack::Pop(); iClipSession->iSession->AddStreamL( videoOut ); @@ -638,8 +1424,7 @@ // void UT_CMusEngClipSession::UT_EstablishSessionLL() { - iClipSession->LocalVideoPlayer()->LcSourceFileControl()->SetLcFileNameL( - KTestAvcVideoFileName() ); + iClipSession->SetClipL( KTestAvcVideoFileName() ); // Try to establish, must fail, because of missing session TRAPD( error, iClipSession->EstablishSessionL() ); @@ -652,7 +1437,7 @@ // 1.Test that in case the peer party supports H264, no transcoding is needed // Call to CMusEngOutMceSession::InviteL leads to call to EstablishL - iClipSession->EstablishLcSessionL(); + iClipSession->InviteL( KTestRecipientSipUri ); const RPointerArray& streams = iClipSession->iSession->Streams(); @@ -668,10 +1453,13 @@ } } + + EUNIT_ASSERT( !iObserver->iTranscodingNeededCalled ) + EUNIT_ASSERT( !iClipSession->iTranscodingRequiredDueMissingOptions ) /////// // 2.Test the case when we don't know whether peer supports H264, - // transcoding is needed => function will leave with KErrNotSupported + // transcoding is needed, H264 codec has to be removed from the codec list delete iClipSession->iSession; iClipSession->iSession = NULL; @@ -679,25 +1467,140 @@ delete iClipSession->iVideoCodecList; iClipSession->iVideoCodecList = NULL; - MUSENG_EUNIT_ASSERT_SPECIFIC_LEAVE( - iClipSession->EstablishLcSessionL(), - KErrNotSupported ) - + // Call to CMusEngOutMceSession::InviteL leads to call to EstablishL + iClipSession->InviteL( KTestRecipientSipUri ); + + const RPointerArray& streams2 = iClipSession->iSession->Streams(); + + for ( TInt i = 0; i < streams2.Count(); ++i ) + { + if ( streams2[i]->Type() == KMceVideo ) + { + CMceVideoStream* videoStream = static_cast( streams2[i] ); + const RPointerArray codecs = videoStream->Codecs(); + EUNIT_ASSERT_EQUALS( codecs.Count(), 1 ) + EUNIT_ASSERT( codecs[0]->SdpName().FindF( KMceSDPNameH263() ) >= 0 ) + } + } + + EUNIT_ASSERT( iObserver->iTranscodingNeededCalled ) + EUNIT_ASSERT( iObserver->iDueUnknowCapas ) + EUNIT_ASSERT( iClipSession->iTranscodingRequiredDueMissingOptions ) /////// - // 3.Test that if peer doesn't supports H264, transcoding is needed - // => function will leave with KErrNotSupported + // 3. Establish behaves differently at second round in case clip is AVC + // and because remote party's capabilities were unknown. Use-case is such + // that AVC is tried to be transcoded first but if it fails, invite is retried + // by using AVC + iObserver->Reset(); + iClipSession->InviteL( KTestRecipientSipUri ); + const RPointerArray& testStreams = iClipSession->iSession->Streams(); + + for ( TInt i = 0; i < testStreams.Count(); ++i ) + { + if ( testStreams[i]->Type() == KMceVideo ) + { + CMceVideoStream* videoStream = static_cast( testStreams[i] ); + const RPointerArray codecs = videoStream->Codecs(); + EUNIT_ASSERT_EQUALS( codecs.Count(), 1 ) + EUNIT_ASSERT( codecs[0]->SdpName().FindF( KMceSDPNameH264() ) >= 0 ) + } + } + + EUNIT_ASSERT( !iObserver->iTranscodingNeededCalled ) + EUNIT_ASSERT( !iObserver->iDueUnknowCapas ) + + /////// + // 4.Test that if peer doesn't supports H264, transcoding is needed + // H264 codec has to be removed from the codec list + + iObserver->iTranscodingNeededCalled = EFalse; delete iClipSession->iSession; iClipSession->iSession = NULL; iClipSession->iVideoCodecList = KMceSDPNameH263().AllocL(); - MUSENG_EUNIT_ASSERT_SPECIFIC_LEAVE( - iClipSession->EstablishLcSessionL(), - KErrNotSupported ) + // Call to CMusEngOutMceSession::InviteL leads to call to EstablishL + iClipSession->InviteL( KTestRecipientSipUri ); + + const RPointerArray& streams3 = iClipSession->iSession->Streams(); + + for ( TInt i = 0; i < streams3.Count(); ++i ) + { + if ( streams3[i]->Type() == KMceVideo ) + { + CMceVideoStream* videoStream = static_cast( streams3[i] ); + const RPointerArray codecs = videoStream->Codecs(); + EUNIT_ASSERT_EQUALS( codecs.Count(), 1 ) + EUNIT_ASSERT( codecs[0]->SdpName().FindF( KMceSDPNameH263() ) >= 0 ) + } + } + + EUNIT_ASSERT( iObserver->iTranscodingNeededCalled ) + EUNIT_ASSERT( !iObserver->iDueUnknowCapas ) + } +void UT_CMusEngClipSession::UT_IsRewindFromEndL() + { + // Try before establishing the session + EUNIT_ASSERT( !iClipSession->IsRewindFromEnd() ) + + // Try with session, but without video out stream + + CSIPProfile* profile = iClipSession->iSipProfileHandler->Profile(); + + iClipSession->iSession = CMceOutSession::NewL( + *(iClipSession->iManager), + *profile, + KTestRecipientSipUri8() ); + + EUNIT_ASSERT( !iClipSession->IsRewindFromEnd() ) + + // Try with video out stream without source... + CMceVideoStream* videoOut = CMceVideoStream::NewLC(); + + videoOut->AddSinkL( CMceRtpSink::NewLC() ); + CleanupStack::Pop(); + + iClipSession->iSession->AddStreamL( videoOut ); + CleanupStack::Pop( videoOut ); + + EUNIT_ASSERT( !iClipSession->IsRewindFromEnd() ) + + // And with enabled source and stream + videoOut->SetSourceL( CMceFileSource::NewLC( *iClipSession->iManager, + iClipSession->iFileName ) ); + CleanupStack::Pop(); + + EUNIT_ASSERT( !iClipSession->IsRewindFromEnd() ) + + // try with different position and duration + (static_cast (videoOut->Source()))->iPosition = 90; + (static_cast (videoOut->Source()))->iDuration = 111; + EUNIT_ASSERT( !iClipSession->IsRewindFromEnd() ) + + // Disapling source + (static_cast (videoOut->Source()))->DisableL(); + EUNIT_ASSERT( !iClipSession->IsRewindFromEnd() ) + + // Disapling stream + videoOut->iState = CMceMediaStream::EDisabled; + EUNIT_ASSERT( iClipSession->IsRewindFromEnd() ) + + iClipSession->iPause = ETrue; + EUNIT_ASSERT( !iClipSession->IsRewindFromEnd() ) + + iClipSession->iPause = EFalse; + EUNIT_ASSERT( iClipSession->IsRewindFromEnd() ) + + // and finaly try with "real" end of clip + (static_cast (videoOut->Source()))->iPosition = 0; + (static_cast (videoOut->Source()))->iDuration = 111; + + EUNIT_ASSERT( !iClipSession->IsRewindFromEnd() ) + } // TEST TABLE @@ -714,6 +1617,90 @@ SetupL, UT_NewLL, Teardown) EUNIT_TEST( + "SetClipL - test ", + "CMusEngClipSession", + "AetClipL", + "FUNCTIONALITY", + SetupL, UT_SetClipLL, Teardown) + +EUNIT_TEST( + "FastForwardL - test ", + "CMusEngClipSession", + "FastForwardL", + "FUNCTIONALITY", + SetupL, UT_FastForwardLL, Teardown) + +EUNIT_TEST( + "FastRewindL - test ", + "CMusEngClipSession", + "FastRewindL", + "FUNCTIONALITY", + SetupL, UT_FastRewindLL, Teardown) + +EUNIT_TEST( + "PositionL - test ", + "CMusEngClipSession", + "PositionL", + "FUNCTIONALITY", + SetupL, UT_PositionLL, Teardown) + +EUNIT_TEST( + "DurationL - test ", + "CMusEngClipSession", + "DurationL", + "FUNCTIONALITY", + SetupL, UT_DurationLL, Teardown) + +EUNIT_TEST( + "SetPositionL - test ", + "CMusEngClipSession", + "SetPositionL", + "FUNCTIONALITY", + SetupL, UT_SetPositionLL, Teardown) + +EUNIT_TEST( + "TranscodeL - To AVC test ", + "CMusEngClipSession", + "TranscodeL", + "FUNCTIONALITY", + SetupL, UT_TranscodeLToAvcL, Teardown) + +EUNIT_TEST( + "TranscodeL - To H263 test ", + "CMusEngClipSession", + "TranscodeL", + "FUNCTIONALITY", + Setup2L, UT_TranscodeLToH263L, Teardown) + +EUNIT_TEST( + "CancelTranscodeL - test ", + "CMusEngClipSession", + "CancelTranscodeL", + "FUNCTIONALITY", + SetupL, UT_CancelTranscodeLL, Teardown) + +EUNIT_TEST( + "PlayL - test ", + "CMusEngClipSession", + "PlayL", + "FUNCTIONALITY", + SetupL, UT_PlayLL, Teardown) + +EUNIT_TEST( + "PauseL - test ", + "CMusEngClipSession", + "PauseL", + "FUNCTIONALITY", + SetupL, UT_PauseLL, Teardown) + +EUNIT_TEST( + "IsPlayingL - test ", + "CMusEngClipSession", + "IsPlayingL", + "FUNCTIONALITY", + SetupL, UT_IsPlayingLL, Teardown) + +EUNIT_TEST( "CompleteSessionStructureL - test ", "CMusEngClipSession", "CompleteSessionStructureL", @@ -754,6 +1741,13 @@ "AddVideoCodecL", "FUNCTIONALITY", SetupL, UT_AddVideoCodecLL, Teardown) + +EUNIT_TEST( + "HasClipEnded - test ", + "CMusEngClipSession", + "HasClipEnded", + "FUNCTIONALITY", + SetupL, UT_HasClipEndedL, Teardown) EUNIT_TEST( "ConstructAudioStructureL - test ", @@ -776,7 +1770,13 @@ "FUNCTIONALITY", SetupL, UT_EstablishSessionLL, Teardown) - +EUNIT_TEST( + "IsRewindFromEnd - test ", + "CMusEngClipSession", + "IsRewindFromEnd", + "FUNCTIONALITY", + SetupL, UT_IsRewindFromEndL, Teardown) + EUNIT_END_TEST_TABLE // END OF FILE