354 #endif |
394 #endif |
355 |
395 |
356 iPacketsReceived = KNumZero; |
396 iPacketsReceived = KNumZero; |
357 iCurJitter = KNumZero; |
397 iCurJitter = KNumZero; |
358 iPrevPacketTransit = KNumZero; |
398 iPrevPacketTransit = KNumZero; |
|
399 iCurrentSeqNum = KNumZero; |
|
400 iStartingSeqNum = KNumZero; |
|
401 iReceivedPacketCounter = KNumZero; |
359 } |
402 } |
360 |
403 |
361 // ----------------------------------------------------------------------------- |
404 // ----------------------------------------------------------------------------- |
362 // CMccJitterCalculator::JitterObserving |
405 // CMccJitterCalculator::JitterObserving |
363 // Trigger controller. Compares calculated and defined values. |
406 // Trigger controller. Compares calculated and defined values. |
364 // private method |
407 // private method |
365 // ----------------------------------------------------------------------------- |
408 // ----------------------------------------------------------------------------- |
366 // |
409 // |
367 void CMccJitterCalculator::JitterObserving() |
410 void CMccJitterCalculator::JitterObserving() |
368 { |
411 { |
|
412 #ifdef TRACE_JITCALC |
|
413 RDebug::Print( _L("CMccJitterCalculator::JitterObserving IN") ); |
|
414 #endif |
|
415 |
|
416 TBool resetValuesForNextReport = EFalse; |
|
417 TBool cancelObs = EFalse; |
|
418 |
369 if ( iJitterObsOn ) |
419 if ( iJitterObsOn ) |
370 { |
420 { |
371 #ifdef TRACE_JITCALC |
421 #ifdef TRACE_JITCALC |
372 RDebug::Print( _L("CMccJitterCalculator::JitterObserving Jitter level observing ON") ); |
422 RDebug::Print( _L("CMccJitterCalculator::JitterObserving Jitter level observing ON") ); |
373 RDebug::Print( _L("CMccJitterCalculator::JitterObserving jitterlevel %u ms compared to jitter estimate %Lu ms"), |
423 RDebug::Print( _L("CMccJitterCalculator::JitterObserving jitterlevel %u ms compared to jitter estimate %Lu ms"), |
374 iJitterLevelFromClient, ( iCurJitter / KConversionFactor ) ); |
424 iJitterLevelFromClient, ( iCurJitter / KConversionFactor ) ); |
375 #endif |
425 #endif |
376 |
426 |
377 // Normalize iCurJitter |
427 CheckJitter( resetValuesForNextReport, cancelObs ); |
378 TUint64 modJitter = iCurJitter >> KNum4; |
428 } |
379 |
429 |
380 if ( EMccQualityTimeBased == iReportIntervalType ) |
430 if ( iFrameLossObsOn ) |
381 { |
431 { |
382 // change microsecs to millisecs |
432 #ifdef TRACE_JITCALC |
383 TTimeIntervalMicroSeconds getTime = |
433 RDebug::Print( _L("CMccJitterCalculator::JitterObserving Frame Loss observing ON") ); |
384 iCurTime.MicroSecondsFrom( iHomeTime ); |
434 #endif |
385 |
435 |
386 #ifdef TRACE_JITCALC |
436 CheckPacketLoss( resetValuesForNextReport, cancelObs ); |
387 RDebug::Print( _L("CMccJitterCalculator::JitterObserving getTime = %Ld"), getTime.Int64() ); |
437 } |
388 #endif |
438 |
389 |
439 if( resetValuesForNextReport ) |
390 if ( static_cast<TInt64>( iReportInterval ) <= |
440 { |
391 ( getTime.Int64() / KConversionFactor ) ) |
441 // Initialize hometime again |
392 { |
442 iHomeTime.HomeTime(); |
393 // compare clients jitter level to current level |
443 #ifdef TRACE_JITCALC |
394 if ( static_cast<TUint64>( iJitterLevelFromClient ) < |
444 RDebug::Print ( _L("CMccJitterCalculator::JitterObserving Initialize iHomeTime = %Ld"), iHomeTime.Int64() ); |
395 modJitter ) |
445 #endif |
396 { |
446 } |
397 #ifdef TRACE_JITCALC |
447 if( cancelObs ) |
398 RDebug::Print ( _L("CMccJitterCalculator::JitterObserving jitterlevel %u ms compared to jitter estimate %Lu ms"), |
448 { |
399 iJitterLevelFromClient, modJitter ); |
449 CancelObserving(); |
400 #endif |
450 } |
401 |
451 } |
402 TMccRtpEventData event( ( iCurJitter >> KNum4 ), |
452 |
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 |
|
469 // --------------------------------------------------------------------------- |
453 // --------------------------------------------------------------------------- |
470 // CMccJitterCalculator::IsObserving |
454 // CMccJitterCalculator::IsObserving |
471 // To check if observing is ON |
455 // To check if observing is ON |
472 // --------------------------------------------------------------------------- |
456 // --------------------------------------------------------------------------- |
473 // |
457 // |
474 TBool CMccJitterCalculator::IsObserving() const |
458 TBool CMccJitterCalculator::IsObserving() const |
475 { |
459 { |
476 return iMediaQualityObservingStarted; |
460 return iMediaQualityObservingStarted; |
477 } |
461 } |
478 |
462 |
|
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 |
479 // End of File |
747 // End of File |