diff -r b9d283c5c7b5 -r 817c922b90eb multimediacommscontroller/mmccrtpsourcesink/tsrc/ut_rtpsourcesink/src/UT_CMccJitterCalculator.cpp --- a/multimediacommscontroller/mmccrtpsourcesink/tsrc/ut_rtpsourcesink/src/UT_CMccJitterCalculator.cpp Thu Jul 15 19:04:32 2010 +0300 +++ b/multimediacommscontroller/mmccrtpsourcesink/tsrc/ut_rtpsourcesink/src/UT_CMccJitterCalculator.cpp Thu Aug 19 10:18:22 2010 +0300 @@ -66,7 +66,7 @@ } // Observer impl -void UT_CMccJitterCalculator::SendJitterEvent( TMccRtpEventData aEvent, TInt aError ) +void UT_CMccJitterCalculator::SendJitterEvent( TMccRtpEventDataExtended aEvent, TInt aError ) { iLastEvent = aEvent; iLastError = aError; @@ -126,10 +126,15 @@ // Not active iCalculator->JitterObserving(); + iCalculator->iStartingSeqNum = 80; + iCalculator->iCurrentSeqNum = 100; + iCalculator->iReceivedPacketCounter = 20; // 100-80=20, no packets lost + iCalculator->iPacketsReceived = 5; iCalculator->iJitterLevelFromClient = 10000; iCalculator->iCurJitter = 10000; iCalculator->iJitterObsOn = ETrue; + iCalculator->iFrameLossObsOn = ETrue; // Time based reporting // @@ -140,66 +145,264 @@ iCalculator->iReportInterval = 100000; iCalculator->JitterObserving(); EUNIT_ASSERT_EQUALS( iLastEvent.iPacketsReceived, 0 ); + EUNIT_ASSERT_EQUALS( iLastEvent.iPacketLoss, 0 ); // Enough time elapsed but not over jitter level defined by client iCalculator->iReportInterval = 0; iCalculator->JitterObserving(); EUNIT_ASSERT_EQUALS( iLastEvent.iPacketsReceived, 0 ); + EUNIT_ASSERT_EQUALS( iLastEvent.iPacketLoss, 0 ); - // Jitter level defined by client exceeded + // Jitter and packet loss level defined by client exceeded + iCalculator->iStartingSeqNum = 100; + iCalculator->iCurrentSeqNum = 125; + iCalculator->iPrevFerValue = 93000; // 9% + + iCalculator->iPrevExpectedPackets = 20; + iCalculator->iReceivedPacketCounter = 20; // 5 packets is lost. + iCalculator->iJitterLevelFromClient = 10; + User::After( 5000 ); iCalculator->JitterObserving(); EUNIT_ASSERT_EQUALS( iLastEvent.iPacketsReceived, 5 ); // just making sure that callback was called + EUNIT_ASSERT_EQUALS( iLastEvent.iPacketLoss, 19 ); // Quality based reporting // + EUNIT_ASSERT_EQUALS( iCalculator->iReceivedPacketCounter, 20 ); // counter is not zeroed + iCalculator->iReportIntervalType = EMccQualityPacketBased; + iCalculator->iJitterObsOn = ETrue; + iCalculator->iFrameLossObsOn = ETrue; iLastEvent.iPacketsReceived = 0; + iLastEvent.iPacketLoss = 0; iCalculator->iReportInterval = 2; - iCalculator->iJitterObsOn = ETrue; + iCalculator->iPacketsReceived = 2; + + iCalculator->iStartingSeqNum = 120; + iCalculator->iCurrentSeqNum = 121; + iCalculator->iReceivedPacketCounter = 1; + iCalculator->iCurJitter = 10000; + iCalculator->iJitterLevelFromClient = 10000; + + iCalculator->JitterObserving(); + //Check that nothing was changed in iLastEvent: + EUNIT_ASSERT_EQUALS( iLastEvent.iPacketsReceived, 0 ); + EUNIT_ASSERT_EQUALS( iLastEvent.iPacketLoss, 0 ); - // Not the packet when calculation is done - iCalculator->iReceivedPacketCounter = 0; + // One packet more... + iCalculator->iPrevFerValue = 0; // 0% + iCalculator->iCurrentSeqNum++; + iCalculator->iReceivedPacketCounter++; iCalculator->JitterObserving(); - EUNIT_ASSERT_EQUALS( iCalculator->iReceivedPacketCounter, 1 ); + //Check that nothing was changed in iLastEvent: + EUNIT_ASSERT_EQUALS( iLastEvent.iPacketsReceived, 0 ); + EUNIT_ASSERT_EQUALS( iLastEvent.iPacketLoss, 0 ); - // Now the interval is reached + //Do the packet loss, with reporting: + iCalculator->iStartingSeqNum = 122; + iCalculator->iCurrentSeqNum = 126; + iCalculator->iPrevFerValue = 98000; // 9% + iCalculator->iPrevExpectedPackets = 1; + + iCalculator->iReceivedPacketCounter = 2; + iCalculator->iCurJitter = 10000; + iCalculator->iJitterLevelFromClient = 10; iCalculator->JitterObserving(); - EUNIT_ASSERT_EQUALS( iLastEvent.iPacketsReceived, 5 ); // just making sure that callback was called - EUNIT_ASSERT_EQUALS( iCalculator->iReceivedPacketCounter, 0 ); // counter is zeroed + //Check that values were changed in iLastEvent: + EUNIT_ASSERT_EQUALS( iLastEvent.iPacketsReceived, 2 ); + EUNIT_ASSERT_EQUALS( iLastEvent.iPacketLoss, 20 ); // Other reporting iCalculator->iReportIntervalType = 998; iLastEvent.iPacketsReceived = 0; iCalculator->iJitterObsOn = ETrue; + iCalculator->iFrameLossObsOn = ETrue; iCalculator->JitterObserving(); - EUNIT_ASSERT_EQUALS( iLastEvent.iPacketsReceived, 5 ); // just making sure that callback was called + EUNIT_ASSERT_EQUALS( iLastEvent.iPacketsReceived, 2 ); // just making sure that callback was called + EUNIT_ASSERT_EQUALS( iLastError, KErrArgument ); } void UT_CMccJitterCalculator::UT_CMccJitterCalculator_RtpPacketReceivedL() { + iCalculator->iReportIntervalType = EMccQualityPacketBased; // TBD: real assert for values const TInt KTestConversion = 8000; + TUint testSeqNum = 222; + iCalculator->iCurrentSeqNum = 0; + iCalculator->iStartingSeqNum = 0; + iCalculator->iReceivedPacketCounter = 0; // First packet - const TInt firstPacketTimestamp = 1000; - iCalculator->RtpPacketReceived( firstPacketTimestamp, EFalse ); + const TInt PacketTimestamp1 = 1000; + iCalculator->RtpPacketReceived( PacketTimestamp1, EFalse, testSeqNum ); EUNIT_ASSERT( iCalculator->iPrevPacketTransit != 0 ); + EUNIT_ASSERT( iCalculator->iCurrentSeqNum == 222 ); + EUNIT_ASSERT( iCalculator->iStartingSeqNum == 221 ); + EUNIT_ASSERT( iCalculator->iReceivedPacketCounter == 1 ); + testSeqNum++; //Increase seqnum for next packet. // Second packet (fake that it is the one when reporting) iCalculator->iPacketsReceived = 15; // ( KJitterReportInterval - 1 ) - const TInt secondPacketTimestamp = 3000; - iCalculator->RtpPacketReceived( secondPacketTimestamp, EFalse ); + const TInt PacketTimestamp2 = 3000; + iCalculator->RtpPacketReceived( PacketTimestamp2, EFalse, testSeqNum ); EUNIT_ASSERT( iCalculator->iCurJitter != 0 ); EUNIT_ASSERT_EQUALS( (TInt)iLastEvent.iPacketsReceived, 16 ); // just making sure that callback was called + EUNIT_ASSERT( iCalculator->iCurrentSeqNum == 223 ); + EUNIT_ASSERT( iCalculator->iStartingSeqNum == 221 ); + EUNIT_ASSERT( iCalculator->iReceivedPacketCounter == 2 ); + + + iCalculator->iReportIntervalType = EMccQualityTimeBased; + iCalculator->iFrameLossObsOn = EFalse; + testSeqNum++; //Increase seqnum for next packet. + + const TInt packetTimestamp3 = 4000; + iCalculator->RtpPacketReceived( packetTimestamp3, EFalse, testSeqNum ); + EUNIT_ASSERT( iCalculator->iCurJitter != 0 ); + EUNIT_ASSERT_EQUALS( (TInt)iLastEvent.iPacketsReceived, 16 ); // just making sure that callback wasn't called + EUNIT_ASSERT( iCalculator->iCurrentSeqNum == 223 ); + EUNIT_ASSERT( iCalculator->iStartingSeqNum == 221 ); + EUNIT_ASSERT( iCalculator->iReceivedPacketCounter == 2 ); + + // Sequence number start from 0 + iCalculator->iReportIntervalType = EMccQualityPacketBased; + iCalculator->iFrameLossObsOn = ETrue; + testSeqNum = 0; + const TInt packetTimestamp4 = 5000; + iCalculator->RtpPacketReceived( packetTimestamp4, EFalse, testSeqNum ); + EUNIT_ASSERT( iCalculator->iCurJitter != 0 ); + EUNIT_ASSERT_EQUALS( (TInt)iLastEvent.iPacketsReceived, 16 ); // just making sure that callback wasn't called + EUNIT_ASSERT_EQUALS( iCalculator->iCurrentSeqNum, 0); + EUNIT_ASSERT( iCalculator->iStartingSeqNum == 0 ); + EUNIT_ASSERT( iCalculator->iReceivedPacketCounter == 3 ); + + // Sequence number start from 1 + testSeqNum = 1; + const TInt packetTimestamp5 = 6000; + iCalculator->RtpPacketReceived( packetTimestamp5, EFalse, testSeqNum ); + EUNIT_ASSERT( iCalculator->iCurJitter != 0 ); + EUNIT_ASSERT_EQUALS( (TInt)iLastEvent.iPacketsReceived, 16 ); // just making sure that callback wasn't called + EUNIT_ASSERT_EQUALS( iCalculator->iCurrentSeqNum, 1); + EUNIT_ASSERT( iCalculator->iStartingSeqNum == 0 ); + EUNIT_ASSERT( iCalculator->iReceivedPacketCounter == 4 ); + } + +void UT_CMccJitterCalculator::UT_CMccJitterCalculator_CalculateFerL() + { + TUint32 returnValue( 0 ); + + // packet lost + TUint32 prevValue( 0 ); + TBool valueToadd( ETrue ); + TBool flagToAdd( ETrue ); + returnValue = iCalculator->CalculateFer( prevValue, valueToadd, flagToAdd ); + EUNIT_ASSERT_EQUALS( returnValue, 2000 ); + + // packet lost + // returnValue == 2000 + returnValue = iCalculator->CalculateFer( returnValue, valueToadd, flagToAdd ); + EUNIT_ASSERT_EQUALS( returnValue, 3992 ); + + // no packet lost - late packet - remove FER + // decrease fer + flagToAdd = EFalse; + // returnValue == 3996 + returnValue = iCalculator->CalculateFer( returnValue, valueToadd, flagToAdd ); + + EUNIT_ASSERT_EQUALS( returnValue, 2008 ); + + // no packet lost - late packet - remove FER + // decrease fer + flagToAdd = EFalse; + // returnValue == 5 + returnValue = 5; + returnValue = iCalculator->CalculateFer( returnValue, valueToadd, flagToAdd ); + + EUNIT_ASSERT_EQUALS( returnValue, 0); + } + +void UT_CMccJitterCalculator::UT_CMccJitterCalculator_CountPacketLossPercentageL() + { + TInt percentage( 0 ); + + iCalculator->iHomeTime.HomeTime(); + + // Not active + iCalculator->JitterObserving(); + + iCalculator->iPrevFerValue = 0; + iCalculator->iStartingSeqNum = 80; + iCalculator->iCurrentSeqNum = 100; + + // no packets lost + iCalculator->iPrevExpectedPackets = 20; + iCalculator->iReceivedPacketCounter = 20; + + iCalculator->CountPacketLossPercentage(); + + EUNIT_ASSERT_EQUALS( iCalculator->iPrevFerValue, 0 ); + EUNIT_ASSERT_EQUALS( iCalculator->iPrevExpectedPackets, 20 ); + EUNIT_ASSERT_EQUALS( iCalculator->iPrevPacketsReceived, 20 ); + + + // no packets lost, inorder + iCalculator->iCurrentSeqNum = 102; + iCalculator->iPrevExpectedPackets = 22; + + iCalculator->CountPacketLossPercentage(); + + EUNIT_ASSERT_EQUALS( iCalculator->iPrevFerValue, 0 ); + EUNIT_ASSERT_EQUALS( iCalculator->iPrevExpectedPackets, 22 ); + EUNIT_ASSERT_EQUALS( iCalculator->iPrevPacketsReceived, 20 ); + + + // packet lost - add FER by number of packets lost. + // 5 packets lost + iCalculator->iPrevFerValue = 0; + iCalculator->iStartingSeqNum = 80; + iCalculator->iCurrentSeqNum = 105; + + iCalculator->iPrevExpectedPackets = 20; + iCalculator->iReceivedPacketCounter = 20; + + percentage = iCalculator->CountPacketLossPercentage(); + + EUNIT_ASSERT_EQUALS( percentage, 1 ); + EUNIT_ASSERT_EQUALS( iCalculator->iPrevFerValue, 7952 ); + EUNIT_ASSERT_EQUALS( iCalculator->iPrevExpectedPackets, 25 ); + EUNIT_ASSERT_EQUALS( iCalculator->iPrevPacketsReceived, 20 ); + } + +void UT_CMccJitterCalculator::UT_CMccJitterCalculator_ResetCountersL() + { + + iCalculator->iPacketsReceived = 20; + iCalculator->iCurJitter = 200; + iCalculator->iPrevPacketTransit = 100; + iCalculator->iCurrentSeqNum = 25; + iCalculator->iStartingSeqNum = 2; + iCalculator->iReceivedPacketCounter = 30; + + iCalculator->ResetCounters(); + + EUNIT_ASSERT_EQUALS( iCalculator->iPacketsReceived, 0 ); + EUNIT_ASSERT_EQUALS( iCalculator->iCurJitter, 0 ); + EUNIT_ASSERT_EQUALS( iCalculator->iPrevPacketTransit, 0 ); + EUNIT_ASSERT_EQUALS( iCalculator->iCurrentSeqNum, 0 ); + EUNIT_ASSERT_EQUALS( iCalculator->iStartingSeqNum, 0 ); + EUNIT_ASSERT_EQUALS( iCalculator->iReceivedPacketCounter, 0 ); + } + + // TEST TABLE EUNIT_BEGIN_TEST_TABLE( UT_CMccJitterCalculator, - "Add test suite description here.", + "CMccJitterCalculator", "UNIT" ) EUNIT_TEST( @@ -223,6 +426,29 @@ "FUNCTIONALITY", SetupL, UT_CMccJitterCalculator_RtpPacketReceivedL, Teardown) + +EUNIT_TEST( + "CalculateFer - test ", + "CMccJitterCalculator", + "CalculateFer", + "FUNCTIONALITY", + SetupL, UT_CMccJitterCalculator_CalculateFerL, Teardown) + +EUNIT_TEST( + "CountPacketLossPercentage - test ", + "CMccJitterCalculator", + "CountPacketLossPercentage", + "FUNCTIONALITY", + SetupL, UT_CMccJitterCalculator_CountPacketLossPercentageL, Teardown) + +EUNIT_TEST( + "ResetCounters - test ", + "CMccJitterCalculator", + "ResetCounters", + "FUNCTIONALITY", + SetupL, UT_CMccJitterCalculator_ResetCountersL, Teardown) + + EUNIT_END_TEST_TABLE // END OF FILE