Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 /* | 1 /* |
| 2 * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved. | 2 * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved. |
| 3 * | 3 * |
| 4 * Use of this source code is governed by a BSD-style license | 4 * Use of this source code is governed by a BSD-style license |
| 5 * that can be found in the LICENSE file in the root of the source | 5 * that can be found in the LICENSE file in the root of the source |
| 6 * tree. An additional intellectual property rights grant can be found | 6 * tree. An additional intellectual property rights grant can be found |
| 7 * in the file PATENTS. All contributing project authors may | 7 * in the file PATENTS. All contributing project authors may |
| 8 * be found in the AUTHORS file in the root of the source tree. | 8 * be found in the AUTHORS file in the root of the source tree. |
| 9 */ | 9 */ |
| 10 | 10 |
| (...skipping 441 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 452 bool bitrate_updated = bitrate_updated_; | 452 bool bitrate_updated = bitrate_updated_; |
| 453 bitrate_updated_ = false; | 453 bitrate_updated_ = false; |
| 454 return bitrate_updated; | 454 return bitrate_updated; |
| 455 } | 455 } |
| 456 | 456 |
| 457 private: | 457 private: |
| 458 uint32_t last_bitrate_bps_; | 458 uint32_t last_bitrate_bps_; |
| 459 bool bitrate_updated_; | 459 bool bitrate_updated_; |
| 460 }; | 460 }; |
| 461 | 461 |
| 462 bool EventLogAnalyzer::IsRtxSsrc(StreamId stream_id) { | 462 bool EventLogAnalyzer::IsRtxSsrc(StreamId stream_id) const { |
| 463 return rtx_ssrcs_.count(stream_id) == 1; | 463 return rtx_ssrcs_.count(stream_id) == 1; |
| 464 } | 464 } |
| 465 | 465 |
| 466 bool EventLogAnalyzer::IsVideoSsrc(StreamId stream_id) { | 466 bool EventLogAnalyzer::IsVideoSsrc(StreamId stream_id) const { |
| 467 return video_ssrcs_.count(stream_id) == 1; | 467 return video_ssrcs_.count(stream_id) == 1; |
| 468 } | 468 } |
| 469 | 469 |
| 470 bool EventLogAnalyzer::IsAudioSsrc(StreamId stream_id) { | 470 bool EventLogAnalyzer::IsAudioSsrc(StreamId stream_id) const { |
| 471 return audio_ssrcs_.count(stream_id) == 1; | 471 return audio_ssrcs_.count(stream_id) == 1; |
| 472 } | 472 } |
| 473 | 473 |
| 474 std::string EventLogAnalyzer::GetStreamName(StreamId stream_id) const { | |
| 475 std::stringstream name; | |
| 476 if (IsAudioSsrc(stream_id)) { | |
| 477 name << "Audio "; | |
| 478 } else if (IsVideoSsrc(stream_id)) { | |
| 479 name << "Video "; | |
| 480 } else { | |
| 481 name << "Unknown "; | |
| 482 } | |
| 483 if (IsRtxSsrc(stream_id)) | |
| 484 name << "RTX "; | |
| 485 name << SsrcToString(stream_id.GetSsrc()); | |
| 486 return name.str(); | |
| 487 } | |
| 488 | |
| 474 void EventLogAnalyzer::CreatePacketGraph(PacketDirection desired_direction, | 489 void EventLogAnalyzer::CreatePacketGraph(PacketDirection desired_direction, |
| 475 Plot* plot) { | 490 Plot* plot) { |
| 476 for (auto& kv : rtp_packets_) { | 491 for (auto& kv : rtp_packets_) { |
| 477 StreamId stream_id = kv.first; | 492 StreamId stream_id = kv.first; |
| 478 const std::vector<LoggedRtpPacket>& packet_stream = kv.second; | 493 const std::vector<LoggedRtpPacket>& packet_stream = kv.second; |
| 479 // Filter on direction and SSRC. | 494 // Filter on direction and SSRC. |
| 480 if (stream_id.GetDirection() != desired_direction || | 495 if (stream_id.GetDirection() != desired_direction || |
| 481 !MatchingSsrc(stream_id.GetSsrc(), desired_ssrc_)) { | 496 !MatchingSsrc(stream_id.GetSsrc(), desired_ssrc_)) { |
| 482 continue; | 497 continue; |
| 483 } | 498 } |
| 484 | 499 |
| 485 TimeSeries time_series; | 500 TimeSeries time_series; |
| 486 time_series.label = SsrcToString(stream_id.GetSsrc()); | 501 time_series.label = GetStreamName(stream_id); |
| 487 time_series.style = BAR_GRAPH; | 502 time_series.style = BAR_GRAPH; |
| 488 Pointwise<PacketSizeBytes>(packet_stream, begin_time_, &time_series); | 503 Pointwise<PacketSizeBytes>(packet_stream, begin_time_, &time_series); |
| 489 plot->series_list_.push_back(std::move(time_series)); | 504 plot->series_list_.push_back(std::move(time_series)); |
| 490 } | 505 } |
| 491 | 506 |
| 492 plot->SetXAxis(0, call_duration_s_, "Time (s)", kLeftMargin, kRightMargin); | 507 plot->SetXAxis(0, call_duration_s_, "Time (s)", kLeftMargin, kRightMargin); |
| 493 plot->SetSuggestedYAxis(0, 1, "Packet size (bytes)", kBottomMargin, | 508 plot->SetSuggestedYAxis(0, 1, "Packet size (bytes)", kBottomMargin, |
| 494 kTopMargin); | 509 kTopMargin); |
| 495 if (desired_direction == webrtc::PacketDirection::kIncomingPacket) { | 510 if (desired_direction == webrtc::PacketDirection::kIncomingPacket) { |
| 496 plot->SetTitle("Incoming RTP packets"); | 511 plot->SetTitle("Incoming RTP packets"); |
| (...skipping 11 matching lines...) Expand all Loading... | |
| 508 for (auto& kv : packets) { | 523 for (auto& kv : packets) { |
| 509 StreamId stream_id = kv.first; | 524 StreamId stream_id = kv.first; |
| 510 const std::vector<T>& packet_stream = kv.second; | 525 const std::vector<T>& packet_stream = kv.second; |
| 511 // Filter on direction and SSRC. | 526 // Filter on direction and SSRC. |
| 512 if (stream_id.GetDirection() != desired_direction || | 527 if (stream_id.GetDirection() != desired_direction || |
| 513 !MatchingSsrc(stream_id.GetSsrc(), desired_ssrc_)) { | 528 !MatchingSsrc(stream_id.GetSsrc(), desired_ssrc_)) { |
| 514 continue; | 529 continue; |
| 515 } | 530 } |
| 516 | 531 |
| 517 TimeSeries time_series; | 532 TimeSeries time_series; |
| 518 time_series.label = label_prefix + " " + SsrcToString(stream_id.GetSsrc()); | 533 time_series.label = label_prefix + " " + GetStreamName(stream_id); |
| 519 time_series.style = LINE_GRAPH; | 534 time_series.style = LINE_GRAPH; |
| 520 | 535 |
| 521 for (size_t i = 0; i < packet_stream.size(); i++) { | 536 for (size_t i = 0; i < packet_stream.size(); i++) { |
| 522 float x = static_cast<float>(packet_stream[i].timestamp - begin_time_) / | 537 float x = static_cast<float>(packet_stream[i].timestamp - begin_time_) / |
| 523 1000000; | 538 1000000; |
| 524 time_series.points.emplace_back(x, i); | 539 time_series.points.emplace_back(x, i); |
| 525 time_series.points.emplace_back(x, i + 1); | 540 time_series.points.emplace_back(x, i + 1); |
| 526 } | 541 } |
| 527 | 542 |
| 528 plot->series_list_.push_back(std::move(time_series)); | 543 plot->series_list_.push_back(std::move(time_series)); |
| (...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 590 for (auto& kv : rtp_packets_) { | 605 for (auto& kv : rtp_packets_) { |
| 591 StreamId stream_id = kv.first; | 606 StreamId stream_id = kv.first; |
| 592 const std::vector<LoggedRtpPacket>& packet_stream = kv.second; | 607 const std::vector<LoggedRtpPacket>& packet_stream = kv.second; |
| 593 // Filter on direction and SSRC. | 608 // Filter on direction and SSRC. |
| 594 if (stream_id.GetDirection() != kIncomingPacket || | 609 if (stream_id.GetDirection() != kIncomingPacket || |
| 595 !MatchingSsrc(stream_id.GetSsrc(), desired_ssrc_)) { | 610 !MatchingSsrc(stream_id.GetSsrc(), desired_ssrc_)) { |
| 596 continue; | 611 continue; |
| 597 } | 612 } |
| 598 | 613 |
| 599 TimeSeries time_series; | 614 TimeSeries time_series; |
| 600 time_series.label = SsrcToString(stream_id.GetSsrc()); | 615 time_series.label = GetStreamName(stream_id); |
| 601 time_series.style = BAR_GRAPH; | 616 time_series.style = BAR_GRAPH; |
| 602 Pairwise<SequenceNumberDiff>(packet_stream, begin_time_, &time_series); | 617 Pairwise<SequenceNumberDiff>(packet_stream, begin_time_, &time_series); |
| 603 plot->series_list_.push_back(std::move(time_series)); | 618 plot->series_list_.push_back(std::move(time_series)); |
| 604 } | 619 } |
| 605 | 620 |
| 606 plot->SetXAxis(0, call_duration_s_, "Time (s)", kLeftMargin, kRightMargin); | 621 plot->SetXAxis(0, call_duration_s_, "Time (s)", kLeftMargin, kRightMargin); |
| 607 plot->SetSuggestedYAxis(0, 1, "Difference since last packet", kBottomMargin, | 622 plot->SetSuggestedYAxis(0, 1, "Difference since last packet", kBottomMargin, |
| 608 kTopMargin); | 623 kTopMargin); |
| 609 plot->SetTitle("Sequence number"); | 624 plot->SetTitle("Sequence number"); |
| 610 } | 625 } |
| 611 | 626 |
| 627 void EventLogAnalyzer::CreateIncomingPacketLossGraph(Plot* plot) { | |
| 628 for (auto& kv : rtp_packets_) { | |
| 629 StreamId stream_id = kv.first; | |
| 630 const std::vector<LoggedRtpPacket>& packet_stream = kv.second; | |
| 631 // Filter on direction and SSRC. | |
| 632 if (stream_id.GetDirection() != kIncomingPacket || | |
| 633 !MatchingSsrc(stream_id.GetSsrc(), desired_ssrc_)) { | |
| 634 continue; | |
| 635 } | |
| 636 | |
| 637 TimeSeries time_series; | |
| 638 time_series.label = GetStreamName(stream_id); | |
| 639 time_series.style = LINE_DOT_GRAPH; | |
| 640 const uint64_t kWindowUs = 1000000; | |
| 641 const LoggedRtpPacket* first_in_window = &packet_stream.front(); | |
| 642 const LoggedRtpPacket* last_in_window = &packet_stream.front(); | |
| 643 int packets_in_window = 0; | |
| 644 for (const LoggedRtpPacket& packet : packet_stream) { | |
| 645 if (packet.timestamp > first_in_window->timestamp + kWindowUs) { | |
| 646 uint16_t expected = last_in_window->header.sequenceNumber - | |
|
philipel
2016/09/08 13:05:52
I guess reordering will show up as packet loss, or
philipel
2016/09/08 13:05:52
|expected| is kind of generic, |expected_num_packe
stefan-webrtc
2016/09/09 07:12:25
Reordering around the window boundaries, yes. It b
stefan-webrtc
2016/09/09 07:12:25
Done.
| |
| 647 first_in_window->header.sequenceNumber + 1; | |
| 648 float fraction_lost = (expected - packets_in_window) / | |
| 649 static_cast<float>(expected); | |
| 650 float y = fraction_lost * 100; | |
| 651 float x = | |
| 652 static_cast<float>(last_in_window->timestamp - begin_time_) / | |
| 653 1000000; | |
| 654 time_series.points.emplace_back(x, y); | |
| 655 first_in_window = &packet; | |
| 656 last_in_window = &packet; | |
| 657 packets_in_window = 1; | |
| 658 continue; | |
| 659 } | |
| 660 ++packets_in_window; | |
| 661 last_in_window = &packet; | |
| 662 } | |
| 663 plot->series_list_.push_back(std::move(time_series)); | |
| 664 } | |
| 665 | |
| 666 plot->SetXAxis(0, call_duration_s_, "Time (s)", kLeftMargin, kRightMargin); | |
| 667 plot->SetSuggestedYAxis(0, 1, "Loss rate (%)", kBottomMargin, | |
| 668 kTopMargin); | |
| 669 plot->SetTitle("Incoming loss rate"); | |
| 670 } | |
| 671 | |
| 612 void EventLogAnalyzer::CreateDelayChangeGraph(Plot* plot) { | 672 void EventLogAnalyzer::CreateDelayChangeGraph(Plot* plot) { |
| 613 for (auto& kv : rtp_packets_) { | 673 for (auto& kv : rtp_packets_) { |
| 614 StreamId stream_id = kv.first; | 674 StreamId stream_id = kv.first; |
| 615 const std::vector<LoggedRtpPacket>& packet_stream = kv.second; | 675 const std::vector<LoggedRtpPacket>& packet_stream = kv.second; |
| 616 uint32_t ssrc = stream_id.GetSsrc(); | |
| 617 // Filter on direction and SSRC. | 676 // Filter on direction and SSRC. |
| 618 if (stream_id.GetDirection() != kIncomingPacket || | 677 if (stream_id.GetDirection() != kIncomingPacket || |
| 619 !MatchingSsrc(ssrc, desired_ssrc_) || IsAudioSsrc(stream_id) || | 678 !MatchingSsrc(stream_id.GetSsrc(), desired_ssrc_) || |
| 620 !IsVideoSsrc(stream_id) || IsRtxSsrc(stream_id)) { | 679 IsAudioSsrc(stream_id) || !IsVideoSsrc(stream_id) || |
| 680 IsRtxSsrc(stream_id)) { | |
| 621 continue; | 681 continue; |
| 622 } | 682 } |
| 623 | 683 |
| 624 TimeSeries capture_time_data; | 684 TimeSeries capture_time_data; |
| 625 capture_time_data.label = SsrcToString(ssrc) + " capture-time"; | 685 capture_time_data.label = GetStreamName(stream_id) + " capture-time"; |
| 626 capture_time_data.style = BAR_GRAPH; | 686 capture_time_data.style = BAR_GRAPH; |
| 627 Pairwise<NetworkDelayDiff::CaptureTime>(packet_stream, begin_time_, | 687 Pairwise<NetworkDelayDiff::CaptureTime>(packet_stream, begin_time_, |
| 628 &capture_time_data); | 688 &capture_time_data); |
| 629 plot->series_list_.push_back(std::move(capture_time_data)); | 689 plot->series_list_.push_back(std::move(capture_time_data)); |
| 630 | 690 |
| 631 TimeSeries send_time_data; | 691 TimeSeries send_time_data; |
| 632 send_time_data.label = SsrcToString(ssrc) + " abs-send-time"; | 692 send_time_data.label = GetStreamName(stream_id) + " abs-send-time"; |
| 633 send_time_data.style = BAR_GRAPH; | 693 send_time_data.style = BAR_GRAPH; |
| 634 Pairwise<NetworkDelayDiff::AbsSendTime>(packet_stream, begin_time_, | 694 Pairwise<NetworkDelayDiff::AbsSendTime>(packet_stream, begin_time_, |
| 635 &send_time_data); | 695 &send_time_data); |
| 636 plot->series_list_.push_back(std::move(send_time_data)); | 696 plot->series_list_.push_back(std::move(send_time_data)); |
| 637 } | 697 } |
| 638 | 698 |
| 639 plot->SetXAxis(0, call_duration_s_, "Time (s)", kLeftMargin, kRightMargin); | 699 plot->SetXAxis(0, call_duration_s_, "Time (s)", kLeftMargin, kRightMargin); |
| 640 plot->SetSuggestedYAxis(0, 1, "Latency change (ms)", kBottomMargin, | 700 plot->SetSuggestedYAxis(0, 1, "Latency change (ms)", kBottomMargin, |
| 641 kTopMargin); | 701 kTopMargin); |
| 642 plot->SetTitle("Network latency change between consecutive packets"); | 702 plot->SetTitle("Network latency change between consecutive packets"); |
| 643 } | 703 } |
| 644 | 704 |
| 645 void EventLogAnalyzer::CreateAccumulatedDelayChangeGraph(Plot* plot) { | 705 void EventLogAnalyzer::CreateAccumulatedDelayChangeGraph(Plot* plot) { |
| 646 for (auto& kv : rtp_packets_) { | 706 for (auto& kv : rtp_packets_) { |
| 647 StreamId stream_id = kv.first; | 707 StreamId stream_id = kv.first; |
| 648 const std::vector<LoggedRtpPacket>& packet_stream = kv.second; | 708 const std::vector<LoggedRtpPacket>& packet_stream = kv.second; |
| 649 uint32_t ssrc = stream_id.GetSsrc(); | |
| 650 // Filter on direction and SSRC. | 709 // Filter on direction and SSRC. |
| 651 if (stream_id.GetDirection() != kIncomingPacket || | 710 if (stream_id.GetDirection() != kIncomingPacket || |
| 652 !MatchingSsrc(ssrc, desired_ssrc_) || IsAudioSsrc(stream_id) || | 711 !MatchingSsrc(stream_id.GetSsrc(), desired_ssrc_) || |
| 653 !IsVideoSsrc(stream_id) || IsRtxSsrc(stream_id)) { | 712 IsAudioSsrc(stream_id) || !IsVideoSsrc(stream_id) || |
| 713 IsRtxSsrc(stream_id)) { | |
| 654 continue; | 714 continue; |
| 655 } | 715 } |
| 656 | 716 |
| 657 TimeSeries capture_time_data; | 717 TimeSeries capture_time_data; |
| 658 capture_time_data.label = SsrcToString(ssrc) + " capture-time"; | 718 capture_time_data.label = GetStreamName(stream_id) + " capture-time"; |
| 659 capture_time_data.style = LINE_GRAPH; | 719 capture_time_data.style = LINE_GRAPH; |
| 660 Pairwise<Accumulated<NetworkDelayDiff::CaptureTime>>( | 720 Pairwise<Accumulated<NetworkDelayDiff::CaptureTime>>( |
| 661 packet_stream, begin_time_, &capture_time_data); | 721 packet_stream, begin_time_, &capture_time_data); |
| 662 plot->series_list_.push_back(std::move(capture_time_data)); | 722 plot->series_list_.push_back(std::move(capture_time_data)); |
| 663 | 723 |
| 664 TimeSeries send_time_data; | 724 TimeSeries send_time_data; |
| 665 send_time_data.label = SsrcToString(ssrc) + " abs-send-time"; | 725 send_time_data.label = GetStreamName(stream_id) + " abs-send-time"; |
| 666 send_time_data.style = LINE_GRAPH; | 726 send_time_data.style = LINE_GRAPH; |
| 667 Pairwise<Accumulated<NetworkDelayDiff::AbsSendTime>>( | 727 Pairwise<Accumulated<NetworkDelayDiff::AbsSendTime>>( |
| 668 packet_stream, begin_time_, &send_time_data); | 728 packet_stream, begin_time_, &send_time_data); |
| 669 plot->series_list_.push_back(std::move(send_time_data)); | 729 plot->series_list_.push_back(std::move(send_time_data)); |
| 670 } | 730 } |
| 671 | 731 |
| 672 plot->SetXAxis(0, call_duration_s_, "Time (s)", kLeftMargin, kRightMargin); | 732 plot->SetXAxis(0, call_duration_s_, "Time (s)", kLeftMargin, kRightMargin); |
| 673 plot->SetSuggestedYAxis(0, 1, "Latency change (ms)", kBottomMargin, | 733 plot->SetSuggestedYAxis(0, 1, "Latency change (ms)", kBottomMargin, |
| 674 kTopMargin); | 734 kTopMargin); |
| 675 plot->SetTitle("Accumulated network latency change"); | 735 plot->SetTitle("Accumulated network latency change"); |
| (...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 781 for (auto& kv : rtp_packets_) { | 841 for (auto& kv : rtp_packets_) { |
| 782 StreamId stream_id = kv.first; | 842 StreamId stream_id = kv.first; |
| 783 const std::vector<LoggedRtpPacket>& packet_stream = kv.second; | 843 const std::vector<LoggedRtpPacket>& packet_stream = kv.second; |
| 784 // Filter on direction and SSRC. | 844 // Filter on direction and SSRC. |
| 785 if (stream_id.GetDirection() != desired_direction || | 845 if (stream_id.GetDirection() != desired_direction || |
| 786 !MatchingSsrc(stream_id.GetSsrc(), desired_ssrc_)) { | 846 !MatchingSsrc(stream_id.GetSsrc(), desired_ssrc_)) { |
| 787 continue; | 847 continue; |
| 788 } | 848 } |
| 789 | 849 |
| 790 TimeSeries time_series; | 850 TimeSeries time_series; |
| 791 time_series.label = SsrcToString(stream_id.GetSsrc()); | 851 time_series.label = GetStreamName(stream_id); |
| 792 time_series.style = LINE_GRAPH; | 852 time_series.style = LINE_GRAPH; |
| 793 double bytes_to_kilobits = 8.0 / 1000; | 853 double bytes_to_kilobits = 8.0 / 1000; |
| 794 MovingAverage<PacketSizeBytes>(packet_stream, begin_time_, end_time_, | 854 MovingAverage<PacketSizeBytes>(packet_stream, begin_time_, end_time_, |
| 795 window_duration_, step_, bytes_to_kilobits, | 855 window_duration_, step_, bytes_to_kilobits, |
| 796 &time_series); | 856 &time_series); |
| 797 plot->series_list_.push_back(std::move(time_series)); | 857 plot->series_list_.push_back(std::move(time_series)); |
| 798 } | 858 } |
| 799 | 859 |
| 800 plot->SetXAxis(0, call_duration_s_, "Time (s)", kLeftMargin, kRightMargin); | 860 plot->SetXAxis(0, call_duration_s_, "Time (s)", kLeftMargin, kRightMargin); |
| 801 plot->SetSuggestedYAxis(0, 1, "Bitrate (kbps)", kBottomMargin, kTopMargin); | 861 plot->SetSuggestedYAxis(0, 1, "Bitrate (kbps)", kBottomMargin, kTopMargin); |
| (...skipping 210 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1012 point.y -= estimated_base_delay_ms; | 1072 point.y -= estimated_base_delay_ms; |
| 1013 // Add the data set to the plot. | 1073 // Add the data set to the plot. |
| 1014 plot->series_list_.push_back(std::move(time_series)); | 1074 plot->series_list_.push_back(std::move(time_series)); |
| 1015 | 1075 |
| 1016 plot->SetXAxis(0, call_duration_s_, "Time (s)", kLeftMargin, kRightMargin); | 1076 plot->SetXAxis(0, call_duration_s_, "Time (s)", kLeftMargin, kRightMargin); |
| 1017 plot->SetSuggestedYAxis(0, 10, "Delay (ms)", kBottomMargin, kTopMargin); | 1077 plot->SetSuggestedYAxis(0, 10, "Delay (ms)", kBottomMargin, kTopMargin); |
| 1018 plot->SetTitle("Network Delay Change."); | 1078 plot->SetTitle("Network Delay Change."); |
| 1019 } | 1079 } |
| 1020 } // namespace plotting | 1080 } // namespace plotting |
| 1021 } // namespace webrtc | 1081 } // namespace webrtc |
| OLD | NEW |