multimediacommscontroller/mmccrtpsourcesink/src/mccjittercalculator.cpp
branchRCL_3
changeset 59 b0e4b01681c5
parent 42 817c922b90eb
equal deleted inserted replaced
55:f72c4fccd381 59:b0e4b01681c5
     9 * Initial Contributors:
     9 * Initial Contributors:
    10 * Nokia Corporation - initial contribution.
    10 * Nokia Corporation - initial contribution.
    11 *
    11 *
    12 * Contributors:
    12 * Contributors:
    13 *
    13 *
    14 * Description:  MccJitterCalculator calculates jitter level and compares given
    14 * Description:    MccJitterCalculator calculates jitter level and compares given
    15 *                triggers.
    15 *                triggers.
    16 *
    16 *
    17 */
    17 */
    18 
    18 
    19 
    19 
    44 const TUint KSampleRate = 8;
    44 const TUint KSampleRate = 8;
    45 
    45 
    46 const TInt KNum4( 4 );
    46 const TInt KNum4( 4 );
    47 const TInt KNum8( 8 );
    47 const TInt KNum8( 8 );
    48 const TInt KNumZero( 0 );
    48 const TInt KNumZero( 0 );
    49 const TInt KNumHundred( 100 );
       
    50 
       
    51 const TUint32 KRtpFractationAccuracy = 5000;
       
    52 // Specified period of the moving average
       
    53 const TUint32 KDivider = 250;
       
    54 // Specified the max calculate count of package loss
       
    55 const TUint32 KMaxCalCount = 200;
       
    56 
    49 
    57 // ============================ MEMBER FUNCTIONS ===============================
    50 // ============================ MEMBER FUNCTIONS ===============================
    58 
    51 
    59 // -----------------------------------------------------------------------------
    52 // -----------------------------------------------------------------------------
    60 // CMccJitterCalculator::CMccJitterCalculator
    53 // CMccJitterCalculator::CMccJitterCalculator
   142 // CMccJitterCalculator::RtpPacketReceived
   135 // CMccJitterCalculator::RtpPacketReceived
   143 // Calculates jitter values
   136 // Calculates jitter values
   144 // -----------------------------------------------------------------------------
   137 // -----------------------------------------------------------------------------
   145 //
   138 //
   146 void CMccJitterCalculator::RtpPacketReceived( const TUint32 aTimeStamp, 
   139 void CMccJitterCalculator::RtpPacketReceived( const TUint32 aTimeStamp, 
   147     TBool aMarker, TUint16 aSeqNum )
   140     TBool aMarker )
   148     {
   141     {
   149     #ifdef TRACE_JITCALC
   142     #ifdef TRACE_JITCALC
   150         RDebug::Print( _L("CMccJitterCalculator::RtpPacketReceived IN") );
   143         RDebug::Print( _L("CMccJitterCalculator::RtpPacketReceived IN") );
   151     #endif
   144     #endif
   152     
   145     
   153     #ifdef VOIP_RECEIVED_RTP_PACKET_INFO_ENABLED
   146     #ifdef VOIP_RECEIVED_RTP_PACKET_INFO_ENABLED
   154         VoipTrace("%x %x %d %d %d", MCC_TRACE, MCC_RECEIVED_RTP_PACKET_INFO,
   147         VoipTrace("%x %x %d %d %d", MCC_TRACE, MCC_RECEIVED_RTP_PACKET_INFO,
   155         aHeaderInfo.iSeqNum, aHeaderInfo.iTimestamp, iPacketsReceived );
   148         aHeaderInfo.iSeqNum, aHeaderInfo.iTimestamp, iPacketsReceived );
   156     #endif
   149     #endif
   157           
       
   158     TBool calculatePkgLoss = ETrue;  
       
   159     if ( EMccQualityPacketBased == iReportIntervalType || iFrameLossObsOn )
       
   160         {
       
   161         // Save current packet sequence number
       
   162 	    // The SeqNum come from RTP package. It maybe start from a random number between
       
   163         // 0 to 65535. iStartingSeqNum should be reset 
       
   164         // while iCurrentSeqNum was reset (by remote packages)
       
   165     	iCurrentSeqNum = aSeqNum;
       
   166 		if( iStartingSeqNum == KNumZero ||
       
   167 			iStartingSeqNum > iCurrentSeqNum )
       
   168 			{
       
   169 			iStartingSeqNum = aSeqNum;
       
   170 			if ( iStartingSeqNum > 0 )
       
   171 				{
       
   172 			    iStartingSeqNum--;
       
   173 				}
       
   174 			else
       
   175 				{
       
   176                 #ifdef TRACE_JITCALC
       
   177                 RDebug::Print( _L("Received SeqNum is 0, don't calculate lost package") );
       
   178                 #endif
       
   179 			    calculatePkgLoss = EFalse;
       
   180 				}
       
   181 			}
       
   182         iReceivedPacketCounter++; 
       
   183 		}
       
   184     
   150     
   185     // Jitter calculating based on RFC3550 Appendix A.8, see www.ietf.org
   151     // Jitter calculating based on RFC3550 Appendix A.8, see www.ietf.org
   186     if ( aMarker || !iPacketsReceived )
   152     if ( aMarker || !iPacketsReceived )
   187         {
   153         {
   188         // A new talkspurt, redo calculations Marker bit is set after silent
   154         // A new talkspurt, redo calculations Marker bit is set after silent
   250         {
   216         {
   251         #ifdef TRACE_JITCALC
   217         #ifdef TRACE_JITCALC
   252             RDebug::Print( _L("CMccJitterCalculator::RtpPacketReceived SENDING RCV: %d"), iPacketsReceived );
   218             RDebug::Print( _L("CMccJitterCalculator::RtpPacketReceived SENDING RCV: %d"), iPacketsReceived );
   253         #endif
   219         #endif
   254         
   220         
   255         TMccRtpEventDataExtended event( ( iCurJitter >> KNum4 ), 
   221         TMccRtpEventData event( ( iCurJitter >> KNum4 ), 
   256                                 iPacketsReceived, 
   222                                 iPacketsReceived, 
   257                                 iPrevPacketTransit,
   223                                 iPrevPacketTransit,
   258                                 KNumZero,
       
   259                                 KNumZero,
       
   260                                 KNumZero );
   224                                 KNumZero );
   261         
   225         
   262         iObserver->SendJitterEvent( event, KErrNone );
   226         iObserver->SendJitterEvent( event, KErrNone );
   263         }
   227         }
   264     
   228     
   265     if ( calculatePkgLoss )	
   229     JitterObserving();
   266     	{
       
   267         JitterObserving();
       
   268     	}    
       
   269     }
   230     }
   270 
   231 
   271 // ---------------------------------------------------------------------------
   232 // ---------------------------------------------------------------------------
   272 // CMccJitterCalculator::StartObserving
   233 // CMccJitterCalculator::StartObserving
   273 // Switch to deside report type
   234 // Switch to deside report type
   339     #endif
   300     #endif
   340     
   301     
   341     iJitterObsOn = EFalse;
   302     iJitterObsOn = EFalse;
   342     iFrameLossObsOn = EFalse;
   303     iFrameLossObsOn = EFalse;
   343     iMediaQualityObservingStarted = EFalse;
   304     iMediaQualityObservingStarted = EFalse;
   344     iStartingSeqNum = KNumZero;
       
   345     }
   305     }
   346 
   306 
   347 // ---------------------------------------------------------------------------
   307 // ---------------------------------------------------------------------------
   348 // CMccJitterCalculator::SetMediaConfigsL
   308 // CMccJitterCalculator::SetMediaConfigsL
   349 // Open aMessage and read media configs
   309 // Open aMessage and read media configs
   394     #endif
   354     #endif
   395         
   355         
   396     iPacketsReceived = KNumZero;
   356     iPacketsReceived = KNumZero;
   397     iCurJitter = KNumZero;
   357     iCurJitter = KNumZero;
   398     iPrevPacketTransit = KNumZero;
   358     iPrevPacketTransit = KNumZero;
   399     iCurrentSeqNum = KNumZero;
       
   400 	iStartingSeqNum = KNumZero;
       
   401 	iReceivedPacketCounter = KNumZero;
       
   402     }
   359     }
   403 
   360 
   404 // -----------------------------------------------------------------------------
   361 // -----------------------------------------------------------------------------
   405 // CMccJitterCalculator::JitterObserving
   362 // CMccJitterCalculator::JitterObserving
   406 // Trigger controller. Compares calculated and defined values.
   363 // Trigger controller. Compares calculated and defined values.
   407 // private method
   364 // private method
   408 // -----------------------------------------------------------------------------
   365 // -----------------------------------------------------------------------------
   409 //  
   366 //  
   410 void CMccJitterCalculator::JitterObserving()
   367 void CMccJitterCalculator::JitterObserving()
   411     {
   368     {
   412     #ifdef TRACE_JITCALC
       
   413         RDebug::Print( _L("CMccJitterCalculator::JitterObserving IN") );
       
   414     #endif
       
   415     
       
   416     TBool resetValuesForNextReport = EFalse;
       
   417     TBool cancelObs = EFalse;
       
   418     
       
   419     if ( iJitterObsOn )
   369     if ( iJitterObsOn )
   420         {
   370         {
   421         #ifdef TRACE_JITCALC
   371         #ifdef TRACE_JITCALC
   422             RDebug::Print( _L("CMccJitterCalculator::JitterObserving Jitter level observing ON") );
   372             RDebug::Print( _L("CMccJitterCalculator::JitterObserving Jitter level observing ON") );
   423             RDebug::Print( _L("CMccJitterCalculator::JitterObserving jitterlevel %u ms compared to jitter estimate %Lu ms"), 
   373             RDebug::Print( _L("CMccJitterCalculator::JitterObserving jitterlevel %u ms compared to jitter estimate %Lu ms"), 
   424                 iJitterLevelFromClient, ( iCurJitter / KConversionFactor ) );
   374                 iJitterLevelFromClient, ( iCurJitter / KConversionFactor ) );
   425         #endif
   375         #endif
   426         
   376         
   427         CheckJitter( resetValuesForNextReport, cancelObs );
   377         // Normalize iCurJitter
   428         }
   378         TUint64 modJitter = iCurJitter >> KNum4;
   429         	
   379             
   430 	if ( iFrameLossObsOn )
   380         if ( EMccQualityTimeBased == iReportIntervalType )
   431         {
   381             {
   432         #ifdef TRACE_JITCALC
   382             // change microsecs to millisecs
   433             RDebug::Print( _L("CMccJitterCalculator::JitterObserving Frame Loss observing ON") );
   383             TTimeIntervalMicroSeconds getTime = 
   434         #endif
   384                 iCurTime.MicroSecondsFrom( iHomeTime );
   435         
   385             
   436         CheckPacketLoss( resetValuesForNextReport, cancelObs );
   386             #ifdef TRACE_JITCALC
   437         }
   387                 RDebug::Print( _L("CMccJitterCalculator::JitterObserving getTime = %Ld"), getTime.Int64() );
   438  
   388             #endif
   439     if( resetValuesForNextReport ) 
   389             
   440 		{
   390             if ( static_cast<TInt64>( iReportInterval ) <= 
   441         // Initialize hometime again
   391                ( getTime.Int64() / KConversionFactor ) )
   442         iHomeTime.HomeTime();
   392                 {
   443         #ifdef TRACE_JITCALC       
   393                 // compare clients jitter level to current level
   444             RDebug::Print ( _L("CMccJitterCalculator::JitterObserving Initialize iHomeTime = %Ld"), iHomeTime.Int64() );
   394                 if ( static_cast<TUint64>( iJitterLevelFromClient ) < 
   445         #endif
   395                     modJitter )
   446 		}
   396                     {
   447 	if( cancelObs )
   397                     #ifdef TRACE_JITCALC
   448 		{
   398                         RDebug::Print ( _L("CMccJitterCalculator::JitterObserving jitterlevel %u ms compared to jitter estimate %Lu ms"), 
   449 		CancelObserving();	
   399                             iJitterLevelFromClient, modJitter );
   450 		}
   400                     #endif
   451     }
   401                     
   452     
   402                     TMccRtpEventData event( ( iCurJitter >> KNum4 ), 
       
   403                                             iPacketsReceived, 
       
   404                                             iPrevPacketTransit,
       
   405                                             modJitter );
       
   406                     
       
   407                     // Informs client via event and cancels jitter observing
       
   408                     iObserver->SendJitterEvent( event, KErrNone );
       
   409                     CancelObserving();
       
   410                     }
       
   411                 
       
   412                 // Initialize hometime again
       
   413                 iHomeTime.HomeTime();
       
   414                 
       
   415                 #ifdef TRACE_JITCALC       
       
   416                     RDebug::Print ( _L("CMccJitterCalculator::JitterObserving Initialize iHomeTime = %Ld"), iHomeTime.Int64() );
       
   417                 #endif
       
   418             
       
   419                 }           
       
   420             }
       
   421         else if ( EMccQualityPacketBased == iReportIntervalType )
       
   422             {
       
   423             iReceivedPacketCounter++;
       
   424             
       
   425             #ifdef TRACE_JITCALC
       
   426                 RDebug::Print( _L("CMccJitterCalculator::JitterObserving iReceivedPacketCounter: %u"), iReceivedPacketCounter );
       
   427             #endif
       
   428             
       
   429             if ( iReportInterval == iReceivedPacketCounter )
       
   430                 {
       
   431                 // compare clients jitter level to current level
       
   432                 if ( iJitterLevelFromClient < modJitter )
       
   433                     {
       
   434                     #ifdef TRACE_JITCALC
       
   435                         RDebug::Print( _L("CMccJitterCalculator::JitterObserving jitterlevel %u ms compared to jitter estimate %Lu ms"), 
       
   436                             iJitterLevelFromClient, modJitter );
       
   437                     #endif
       
   438                     
       
   439                     TMccRtpEventData event( ( iCurJitter >> KNum4 ), 
       
   440                                             iPacketsReceived, 
       
   441                                             iPrevPacketTransit,
       
   442                                             modJitter );
       
   443                     
       
   444                     // Informs client via event and cancels jitter observing
       
   445                     iObserver->SendJitterEvent( event, KErrNone );
       
   446                     CancelObserving();
       
   447                     }
       
   448                   
       
   449                 iReceivedPacketCounter = KNumZero;
       
   450                 }
       
   451             }
       
   452          else
       
   453             {
       
   454             #ifdef TRACE_JITCALC
       
   455                 RDebug::Print( _L("CMccJitterCalculator::JitterObserving Report type is not valid!") );
       
   456             #endif
       
   457             
       
   458             TMccRtpEventData event( ( iCurJitter >> KNum4 ), 
       
   459                                       iPacketsReceived, 
       
   460                                       iPrevPacketTransit,
       
   461                                       KNumZero );
       
   462             
       
   463             iObserver->SendJitterEvent( event, KErrArgument );
       
   464             CancelObserving();
       
   465             }
       
   466         }
       
   467     }
       
   468 
   453 // ---------------------------------------------------------------------------
   469 // ---------------------------------------------------------------------------
   454 // CMccJitterCalculator::IsObserving
   470 // CMccJitterCalculator::IsObserving
   455 // To check if observing is ON
   471 // To check if observing is ON
   456 // ---------------------------------------------------------------------------
   472 // ---------------------------------------------------------------------------
   457 //      
   473 //      
   458 TBool CMccJitterCalculator::IsObserving() const
   474 TBool CMccJitterCalculator::IsObserving() const
   459     {
   475     {
   460     return iMediaQualityObservingStarted;
   476     return iMediaQualityObservingStarted;
   461     }
   477     }
   462     
   478     
   463 // -----------------------------------------------------------------------------
       
   464 // CMccJitterCalculator::CountPacketLossPercentage
       
   465 // Counts packet loss percentage from iStartingSeqNum, iCurrentSeqNum
       
   466 // 		and iReceivedPacketCounter
       
   467 // private method
       
   468 // -----------------------------------------------------------------------------
       
   469 //  
       
   470 TInt CMccJitterCalculator::CountPacketLossPercentage()
       
   471 	{
       
   472     TUint32 numberOfPacketsExpected( 0 );
       
   473     numberOfPacketsExpected = iCurrentSeqNum - iStartingSeqNum;
       
   474         
       
   475     if ( ( iPrevExpectedPackets - iPrevPacketsReceived ) ==
       
   476             ( numberOfPacketsExpected - iReceivedPacketCounter ) )
       
   477         {
       
   478         // no packet  lost - inorder
       
   479         iPrevFerValue = CalculateFer( iPrevFerValue, EFalse, ETrue );
       
   480         }
       
   481     else if ( ( iPrevPacketsReceived < iReceivedPacketCounter ) &&
       
   482                 ( iPrevExpectedPackets == numberOfPacketsExpected ) )
       
   483         {
       
   484         // no packet  lost - late packet - remove FER
       
   485         iPrevFerValue = CalculateFer( iPrevFerValue, ETrue, EFalse );                               
       
   486         }
       
   487     else if ( numberOfPacketsExpected > iPrevExpectedPackets )
       
   488         {
       
   489 
       
   490         // packet  lost - add FER by number of packets lost.
       
   491         // expected = 5, prev_expected 3 => diff 2 but loss is ONE thats why - 1
       
   492         TUint32 maxCalcount = 
       
   493 				 numberOfPacketsExpected - iPrevExpectedPackets - 1  < KMaxCalCount ?
       
   494 				 numberOfPacketsExpected - iPrevExpectedPackets - 1 : KMaxCalCount;
       
   495         for ( TUint32 i = 0; i < maxCalcount; i++ )
       
   496            {
       
   497            iPrevFerValue = CalculateFer( iPrevFerValue, ETrue, ETrue );
       
   498            }
       
   499         }
       
   500     
       
   501     iPrevExpectedPackets = numberOfPacketsExpected; 
       
   502     iPrevPacketsReceived = iReceivedPacketCounter;
       
   503     
       
   504     TInt percentage( iPrevFerValue / KRtpFractationAccuracy ); 
       
   505     return percentage;
       
   506 	}    
       
   507     
       
   508 // -----------------------------------------------------------------------------
       
   509 // CMccJitterCalculator::CheckJitter
       
   510 // Checks if current jitter level exceeds the jitter level given by the client,
       
   511 // 		and if exceeded, sends the report to client 
       
   512 // private method
       
   513 // -----------------------------------------------------------------------------
       
   514 //      
       
   515 void CMccJitterCalculator::CheckJitter( TBool& aReportIntervalReached, 
       
   516 										TBool& aReportSent )
       
   517 	{
       
   518 	#ifdef TRACE_JITCALC
       
   519         RDebug::Print( _L("CMccJitterCalculator::CheckJitter IN") );
       
   520     #endif
       
   521     
       
   522 	// Normalize iCurJitter
       
   523     TUint64 modJitter = iCurJitter >> KNum4;
       
   524         
       
   525     if ( EMccQualityTimeBased == iReportIntervalType )
       
   526         {
       
   527         // change microsecs to millisecs
       
   528         TTimeIntervalMicroSeconds getTime = 
       
   529             iCurTime.MicroSecondsFrom( iHomeTime );
       
   530         
       
   531         #ifdef TRACE_JITCALC
       
   532             RDebug::Print( _L("CMccJitterCalculator::CheckJitter getTime = %Ld"), getTime.Int64() );
       
   533         #endif
       
   534         
       
   535         if ( static_cast<TInt64>( iReportInterval ) <= 
       
   536            ( getTime.Int64() / KConversionFactor ) )
       
   537             {
       
   538             // compare clients jitter level to current level
       
   539             if ( static_cast<TUint64>( iJitterLevelFromClient ) < 
       
   540                 modJitter )
       
   541                 {
       
   542                 #ifdef TRACE_JITCALC
       
   543                     RDebug::Print ( _L("CMccJitterCalculator::CheckJitter jitterlevel %u ms compared to jitter estimate %Lu ms"), 
       
   544                         iJitterLevelFromClient, modJitter );
       
   545                 #endif
       
   546                 
       
   547                 TMccRtpEventDataExtended event( ( iCurJitter >> KNum4 ), 
       
   548                                         	iPacketsReceived, 
       
   549                                         	iPrevPacketTransit,
       
   550                                         	modJitter,
       
   551                                         	KNumZero,
       
   552                                         	KNumZero );
       
   553                 
       
   554                 // Informs client via event and cancels jitter observing
       
   555                 iObserver->SendJitterEvent( event, KErrNone );
       
   556                 aReportSent = ETrue; 
       
   557                 }
       
   558             aReportIntervalReached = ETrue;
       
   559             }           
       
   560         }
       
   561     else if ( EMccQualityPacketBased == iReportIntervalType )
       
   562         {
       
   563         #ifdef TRACE_JITCALC
       
   564             RDebug::Print( _L("CMccJitterCalculator::CheckJitter iReceivedPacketCounter: %u"), iReceivedPacketCounter );
       
   565         #endif
       
   566         
       
   567         if ( iReportInterval == iReceivedPacketCounter )
       
   568             {
       
   569             // compare clients jitter level to current level
       
   570             if ( iJitterLevelFromClient < modJitter )
       
   571                 {
       
   572                 #ifdef TRACE_JITCALC
       
   573                     RDebug::Print( _L("CMccJitterCalculator::CheckJitter jitterlevel %u ms compared to jitter estimate %Lu ms"), 
       
   574                         iJitterLevelFromClient, modJitter );
       
   575                 #endif
       
   576                 
       
   577                 TMccRtpEventDataExtended event( ( iCurJitter >> KNum4 ), 
       
   578                                         	iPacketsReceived, 
       
   579                                         	iPrevPacketTransit,
       
   580                                         	modJitter,
       
   581                                         	KNumZero,
       
   582                                         	KNumZero );
       
   583                 
       
   584                 // Informs client via event and cancels jitter observing
       
   585                 iObserver->SendJitterEvent( event, KErrNone );
       
   586                 aReportSent = ETrue; 
       
   587                 }  
       
   588             aReportIntervalReached = ETrue;
       
   589             }
       
   590         }
       
   591      else
       
   592         {
       
   593         #ifdef TRACE_JITCALC
       
   594             RDebug::Print( _L("CMccJitterCalculator::CheckJitter Report type is not valid!") );
       
   595         #endif
       
   596         
       
   597         TMccRtpEventDataExtended event( ( iCurJitter >> KNum4 ), 
       
   598                                   	iPacketsReceived, 
       
   599                                   	iPrevPacketTransit,
       
   600                                   	KNumZero,
       
   601                                   	KNumZero,
       
   602                                   	KNumZero );
       
   603         
       
   604         iObserver->SendJitterEvent( event, KErrArgument );
       
   605         aReportSent = ETrue; 
       
   606         }
       
   607 	
       
   608 	}
       
   609     
       
   610 // -----------------------------------------------------------------------------
       
   611 // CMccJitterCalculator::CheckPacketLoss
       
   612 // Checks if current packet loss level exceeds the packet loss level 
       
   613 // 		given by the client, and if exceeded, sends the report to client 
       
   614 // private method
       
   615 // -----------------------------------------------------------------------------
       
   616 //      
       
   617 void CMccJitterCalculator::CheckPacketLoss( TBool& aReportIntervalReached, 
       
   618 											TBool& aReportSent )
       
   619 	{
       
   620 	#ifdef TRACE_JITCALC
       
   621         RDebug::Print( _L("CMccJitterCalculator::CheckPacketLoss IN") );
       
   622     #endif
       
   623 
       
   624     TInt packetLossPercentage = CountPacketLossPercentage();
       
   625   
       
   626     if ( EMccQualityTimeBased == iReportIntervalType )
       
   627 	    {
       
   628 	    // change microsecs to millisecs
       
   629 	    TTimeIntervalMicroSeconds getTime = 
       
   630 	        iCurTime.MicroSecondsFrom( iHomeTime );
       
   631 	    
       
   632 	    #ifdef TRACE_JITCALC
       
   633 	        RDebug::Print( _L("CMccJitterCalculator::CheckPacketLoss getTime = %Ld"), getTime.Int64() );
       
   634 	    #endif
       
   635 	    
       
   636 	    if ( static_cast<TInt64>( iReportInterval ) <= 
       
   637 	       ( getTime.Int64() / KConversionFactor ) )
       
   638 	        {
       
   639 			// If the packet loss percentage was exceeded
       
   640 			if( iPacketLossFromClient < packetLossPercentage ) 
       
   641 	            {
       
   642 	            #ifdef TRACE_JITCALC
       
   643 	                RDebug::Print( _L("CMccJitterCalculator::CheckPacketLoss Packet Loss From Client %u compared to Current Packet Loss %u "), 
       
   644 	                    iPacketLossFromClient, packetLossPercentage );
       
   645 	            #endif
       
   646 	            
       
   647 	            TMccRtpEventDataExtended event( ( iCurJitter >> KNum4 ), 
       
   648 	                                    iPacketsReceived, 
       
   649 	                                    iPrevPacketTransit,
       
   650 	                                    KNumZero,
       
   651 										packetLossPercentage,
       
   652 										packetLossPercentage );
       
   653 	            
       
   654 	            // Informs client via event and cancels jitter observing
       
   655 	            iObserver->SendJitterEvent( event, KErrNone );
       
   656 	            aReportSent = ETrue; 
       
   657 	   			}
       
   658 	        aReportIntervalReached = ETrue; 
       
   659 	        }
       
   660 	    }      
       
   661 	else if ( EMccQualityPacketBased == iReportIntervalType )
       
   662 	    {
       
   663 	    
       
   664 	    #ifdef TRACE_JITCALC
       
   665 		RDebug::Print( _L("CMccJitterCalculator::CheckPacketLoss EMccQualityPacketBased == iReportIntervalType") );
       
   666 	    RDebug::Print( _L("CMccJitterCalculator::CheckPacketLoss iReceivedPacketCounter: %u"), iReceivedPacketCounter );
       
   667 	    #endif
       
   668 	    
       
   669 	    if ( iReportInterval == iReceivedPacketCounter )  
       
   670 	        {
       
   671 			// If the packet loss percentage was exceeded
       
   672 			if( iPacketLossFromClient < packetLossPercentage ) 
       
   673 	            {
       
   674 	            #ifdef TRACE_JITCALC
       
   675 	                RDebug::Print( _L("CMccJitterCalculator::CheckPacketLoss Packet Loss From Client %u compared to Current Packet Loss %u "), 
       
   676 	                    iPacketLossFromClient, packetLossPercentage );
       
   677 	            #endif
       
   678 	            
       
   679 	            TMccRtpEventDataExtended event( ( iCurJitter >> KNum4 ), 
       
   680 	                                    iPacketsReceived, 
       
   681 	                                    iPrevPacketTransit,
       
   682 	                                    KNumZero,
       
   683 										packetLossPercentage,
       
   684 										packetLossPercentage );
       
   685 	            
       
   686 	            // Informs client via event and cancels jitter observing
       
   687 	            iObserver->SendJitterEvent( event, KErrNone );
       
   688 	            aReportSent = ETrue; 
       
   689 	   			}   
       
   690 	        aReportIntervalReached = ETrue; 
       
   691 	        }
       
   692 	    }
       
   693 	 else
       
   694 	    {
       
   695 	    #ifdef TRACE_JITCALC
       
   696 	        RDebug::Print( _L("CMccJitterCalculator::CheckPacketLoss Report type is not valid!") );
       
   697 	    #endif
       
   698 	    
       
   699 	    TMccRtpEventDataExtended event( ( iCurJitter >> KNum4 ), 
       
   700 	                              iPacketsReceived, 
       
   701 	                              iPrevPacketTransit,
       
   702 	                              KNumZero,
       
   703 	                              KNumZero,
       
   704 								  KNumZero );
       
   705 	    
       
   706 	    iObserver->SendJitterEvent( event, KErrArgument );
       
   707 	    aReportSent = ETrue; 
       
   708 	    }
       
   709 	}   
       
   710 
       
   711 // -----------------------------------------------------------------------------
       
   712 // CMccJitterCalculator::CalculateFer
       
   713 // Calculates a new FER value
       
   714 // -----------------------------------------------------------------------------
       
   715 //      
       
   716 TUint32 CMccJitterCalculator::CalculateFer( TUint32 aPrevValue,
       
   717     TBool aAdd, TBool aFlag )
       
   718     {
       
   719     TUint32 ret = 0;
       
   720     TInt64 temp_add = 0;
       
   721 
       
   722     temp_add = aAdd * KNumHundred * KRtpFractationAccuracy;
       
   723 
       
   724     TInt64 diff = temp_add - (TInt64)aPrevValue;
       
   725     TInt32 tempValue = static_cast<TInt32>( diff / KDivider );
       
   726     
       
   727     if ( aFlag )
       
   728         {
       
   729         ret =  TUint32( aPrevValue + tempValue );
       
   730         }
       
   731     else
       
   732         {
       
   733         if ( aPrevValue > tempValue )
       
   734             {
       
   735             ret = TUint32( aPrevValue - tempValue );
       
   736             }
       
   737         else
       
   738             {
       
   739             // removed FER would have gone over thus zero
       
   740             ret = 0;
       
   741             }
       
   742         }
       
   743     
       
   744     return ret;
       
   745     }
       
   746 
       
   747 //  End of File  
   479 //  End of File