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 |
11 #include "webrtc/tools/event_log_visualizer/analyzer.h" | 11 #include "webrtc/tools/event_log_visualizer/analyzer.h" |
12 | 12 |
13 #include <algorithm> | 13 #include <algorithm> |
14 #include <limits> | 14 #include <limits> |
15 #include <map> | 15 #include <map> |
16 #include <sstream> | 16 #include <sstream> |
17 #include <string> | 17 #include <string> |
18 #include <utility> | 18 #include <utility> |
19 | 19 |
20 #include "webrtc/base/checks.h" | 20 #include "webrtc/base/checks.h" |
21 #include "webrtc/base/logging.h" | 21 #include "webrtc/base/logging.h" |
| 22 #include "webrtc/base/ptr_util.h" |
22 #include "webrtc/base/rate_statistics.h" | 23 #include "webrtc/base/rate_statistics.h" |
23 #include "webrtc/call/audio_receive_stream.h" | 24 #include "webrtc/call/audio_receive_stream.h" |
24 #include "webrtc/call/audio_send_stream.h" | 25 #include "webrtc/call/audio_send_stream.h" |
25 #include "webrtc/call/call.h" | 26 #include "webrtc/call/call.h" |
26 #include "webrtc/common_types.h" | 27 #include "webrtc/common_types.h" |
27 #include "webrtc/modules/congestion_controller/include/congestion_controller.h" | 28 #include "webrtc/modules/congestion_controller/include/congestion_controller.h" |
28 #include "webrtc/modules/include/module_common_types.h" | 29 #include "webrtc/modules/include/module_common_types.h" |
29 #include "webrtc/modules/rtp_rtcp/include/rtp_rtcp.h" | 30 #include "webrtc/modules/rtp_rtcp/include/rtp_rtcp.h" |
30 #include "webrtc/modules/rtp_rtcp/include/rtp_rtcp_defines.h" | 31 #include "webrtc/modules/rtp_rtcp/include/rtp_rtcp_defines.h" |
31 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/common_header.h" | 32 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/common_header.h" |
32 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/receiver_report.h" | 33 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/receiver_report.h" |
| 34 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/remb.h" |
33 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/sender_report.h" | 35 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/sender_report.h" |
34 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/transport_feedback.h" | 36 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/transport_feedback.h" |
35 #include "webrtc/modules/rtp_rtcp/source/rtp_header_extensions.h" | 37 #include "webrtc/modules/rtp_rtcp/source/rtp_header_extensions.h" |
36 #include "webrtc/modules/rtp_rtcp/source/rtp_utility.h" | 38 #include "webrtc/modules/rtp_rtcp/source/rtp_utility.h" |
37 #include "webrtc/video_receive_stream.h" | 39 #include "webrtc/video_receive_stream.h" |
38 #include "webrtc/video_send_stream.h" | 40 #include "webrtc/video_send_stream.h" |
39 | 41 |
40 namespace webrtc { | 42 namespace webrtc { |
41 namespace plotting { | 43 namespace plotting { |
42 | 44 |
(...skipping 370 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
413 } | 415 } |
414 } | 416 } |
415 rtcp::CommonHeader header; | 417 rtcp::CommonHeader header; |
416 const uint8_t* packet_end = packet + total_length; | 418 const uint8_t* packet_end = packet + total_length; |
417 for (const uint8_t* block = packet; block < packet_end; | 419 for (const uint8_t* block = packet; block < packet_end; |
418 block = header.NextPacket()) { | 420 block = header.NextPacket()) { |
419 RTC_CHECK(header.Parse(block, packet_end - block)); | 421 RTC_CHECK(header.Parse(block, packet_end - block)); |
420 if (header.type() == rtcp::TransportFeedback::kPacketType && | 422 if (header.type() == rtcp::TransportFeedback::kPacketType && |
421 header.fmt() == rtcp::TransportFeedback::kFeedbackMessageType) { | 423 header.fmt() == rtcp::TransportFeedback::kFeedbackMessageType) { |
422 std::unique_ptr<rtcp::TransportFeedback> rtcp_packet( | 424 std::unique_ptr<rtcp::TransportFeedback> rtcp_packet( |
423 new rtcp::TransportFeedback()); | 425 rtc::MakeUnique<rtcp::TransportFeedback>()); |
424 if (rtcp_packet->Parse(header)) { | 426 if (rtcp_packet->Parse(header)) { |
425 uint32_t ssrc = rtcp_packet->sender_ssrc(); | 427 uint32_t ssrc = rtcp_packet->sender_ssrc(); |
426 StreamId stream(ssrc, direction); | 428 StreamId stream(ssrc, direction); |
427 uint64_t timestamp = parsed_log_.GetTimestamp(i); | 429 uint64_t timestamp = parsed_log_.GetTimestamp(i); |
428 rtcp_packets_[stream].push_back(LoggedRtcpPacket( | 430 rtcp_packets_[stream].push_back(LoggedRtcpPacket( |
429 timestamp, kRtcpTransportFeedback, std::move(rtcp_packet))); | 431 timestamp, kRtcpTransportFeedback, std::move(rtcp_packet))); |
430 } | 432 } |
431 } else if (header.type() == rtcp::SenderReport::kPacketType) { | 433 } else if (header.type() == rtcp::SenderReport::kPacketType) { |
432 std::unique_ptr<rtcp::SenderReport> rtcp_packet( | 434 std::unique_ptr<rtcp::SenderReport> rtcp_packet( |
433 new rtcp::SenderReport()); | 435 rtc::MakeUnique<rtcp::SenderReport>()); |
434 if (rtcp_packet->Parse(header)) { | 436 if (rtcp_packet->Parse(header)) { |
435 uint32_t ssrc = rtcp_packet->sender_ssrc(); | 437 uint32_t ssrc = rtcp_packet->sender_ssrc(); |
436 StreamId stream(ssrc, direction); | 438 StreamId stream(ssrc, direction); |
437 uint64_t timestamp = parsed_log_.GetTimestamp(i); | 439 uint64_t timestamp = parsed_log_.GetTimestamp(i); |
438 rtcp_packets_[stream].push_back( | 440 rtcp_packets_[stream].push_back( |
439 LoggedRtcpPacket(timestamp, kRtcpSr, std::move(rtcp_packet))); | 441 LoggedRtcpPacket(timestamp, kRtcpSr, std::move(rtcp_packet))); |
440 } | 442 } |
441 } else if (header.type() == rtcp::ReceiverReport::kPacketType) { | 443 } else if (header.type() == rtcp::ReceiverReport::kPacketType) { |
442 std::unique_ptr<rtcp::ReceiverReport> rtcp_packet( | 444 std::unique_ptr<rtcp::ReceiverReport> rtcp_packet( |
443 new rtcp::ReceiverReport()); | 445 rtc::MakeUnique<rtcp::ReceiverReport>()); |
444 if (rtcp_packet->Parse(header)) { | 446 if (rtcp_packet->Parse(header)) { |
445 uint32_t ssrc = rtcp_packet->sender_ssrc(); | 447 uint32_t ssrc = rtcp_packet->sender_ssrc(); |
446 StreamId stream(ssrc, direction); | 448 StreamId stream(ssrc, direction); |
447 uint64_t timestamp = parsed_log_.GetTimestamp(i); | 449 uint64_t timestamp = parsed_log_.GetTimestamp(i); |
448 rtcp_packets_[stream].push_back( | 450 rtcp_packets_[stream].push_back( |
449 LoggedRtcpPacket(timestamp, kRtcpRr, std::move(rtcp_packet))); | 451 LoggedRtcpPacket(timestamp, kRtcpRr, std::move(rtcp_packet))); |
450 } | 452 } |
| 453 } else if (header.type() == rtcp::Remb::kPacketType && |
| 454 header.fmt() == rtcp::Remb::kFeedbackMessageType) { |
| 455 std::unique_ptr<rtcp::Remb> rtcp_packet( |
| 456 rtc::MakeUnique<rtcp::Remb>()); |
| 457 if (rtcp_packet->Parse(header)) { |
| 458 uint32_t ssrc = rtcp_packet->sender_ssrc(); |
| 459 StreamId stream(ssrc, direction); |
| 460 uint64_t timestamp = parsed_log_.GetTimestamp(i); |
| 461 rtcp_packets_[stream].push_back(LoggedRtcpPacket( |
| 462 timestamp, kRtcpRemb, std::move(rtcp_packet))); |
| 463 } |
451 } | 464 } |
452 } | 465 } |
453 break; | 466 break; |
454 } | 467 } |
455 case ParsedRtcEventLog::LOG_START: { | 468 case ParsedRtcEventLog::LOG_START: { |
456 break; | 469 break; |
457 } | 470 } |
458 case ParsedRtcEventLog::LOG_END: { | 471 case ParsedRtcEventLog::LOG_END: { |
459 break; | 472 break; |
460 } | 473 } |
(...skipping 507 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
968 float y = static_cast<float>(*result.bitrate_bps) / 1000; | 981 float y = static_cast<float>(*result.bitrate_bps) / 1000; |
969 result_series.points.emplace_back(x, y); | 982 result_series.points.emplace_back(x, y); |
970 } | 983 } |
971 } | 984 } |
972 plot->AppendTimeSeries(std::move(loss_series)); | 985 plot->AppendTimeSeries(std::move(loss_series)); |
973 plot->AppendTimeSeries(std::move(delay_series)); | 986 plot->AppendTimeSeries(std::move(delay_series)); |
974 plot->AppendTimeSeries(std::move(created_series)); | 987 plot->AppendTimeSeries(std::move(created_series)); |
975 plot->AppendTimeSeries(std::move(result_series)); | 988 plot->AppendTimeSeries(std::move(result_series)); |
976 } | 989 } |
977 | 990 |
| 991 // Overlay the incoming REMB over the outgoing bitrate |
| 992 // and outgoing REMB over incoming bitrate. |
| 993 PacketDirection remb_direction = |
| 994 desired_direction == kOutgoingPacket ? kIncomingPacket : kOutgoingPacket; |
| 995 TimeSeries remb_series("Remb", LINE_STEP_GRAPH); |
| 996 std::multimap<uint64_t, const LoggedRtcpPacket*> remb_packets; |
| 997 for (const auto& kv : rtcp_packets_) { |
| 998 if (kv.first.GetDirection() == remb_direction) { |
| 999 for (const LoggedRtcpPacket& rtcp_packet : kv.second) { |
| 1000 if (rtcp_packet.type == kRtcpRemb) { |
| 1001 remb_packets.insert( |
| 1002 std::make_pair(rtcp_packet.timestamp, &rtcp_packet)); |
| 1003 } |
| 1004 } |
| 1005 } |
| 1006 } |
| 1007 |
| 1008 for (const auto& kv : remb_packets) { |
| 1009 const LoggedRtcpPacket* const rtcp = kv.second; |
| 1010 const rtcp::Remb* const remb = static_cast<rtcp::Remb*>(rtcp->packet.get()); |
| 1011 float x = static_cast<float>(rtcp->timestamp - begin_time_) / 1000000; |
| 1012 float y = static_cast<float>(remb->bitrate_bps()) / 1000; |
| 1013 remb_series.points.emplace_back(x, y); |
| 1014 } |
| 1015 plot->AppendTimeSeriesIfNotEmpty(std::move(remb_series)); |
| 1016 |
978 plot->SetXAxis(0, call_duration_s_, "Time (s)", kLeftMargin, kRightMargin); | 1017 plot->SetXAxis(0, call_duration_s_, "Time (s)", kLeftMargin, kRightMargin); |
979 plot->SetSuggestedYAxis(0, 1, "Bitrate (kbps)", kBottomMargin, kTopMargin); | 1018 plot->SetSuggestedYAxis(0, 1, "Bitrate (kbps)", kBottomMargin, kTopMargin); |
980 if (desired_direction == webrtc::PacketDirection::kIncomingPacket) { | 1019 if (desired_direction == webrtc::PacketDirection::kIncomingPacket) { |
981 plot->SetTitle("Incoming RTP bitrate"); | 1020 plot->SetTitle("Incoming RTP bitrate"); |
982 } else if (desired_direction == webrtc::PacketDirection::kOutgoingPacket) { | 1021 } else if (desired_direction == webrtc::PacketDirection::kOutgoingPacket) { |
983 plot->SetTitle("Outgoing RTP bitrate"); | 1022 plot->SetTitle("Outgoing RTP bitrate"); |
984 } | 1023 } |
985 } | 1024 } |
986 | 1025 |
987 // For each SSRC, plot the bandwidth used by that stream. | 1026 // For each SSRC, plot the bandwidth used by that stream. |
(...skipping 403 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1391 }, | 1430 }, |
1392 audio_network_adaptation_events_, begin_time_, &time_series); | 1431 audio_network_adaptation_events_, begin_time_, &time_series); |
1393 plot->AppendTimeSeries(std::move(time_series)); | 1432 plot->AppendTimeSeries(std::move(time_series)); |
1394 plot->SetXAxis(0, call_duration_s_, "Time (s)", kLeftMargin, kRightMargin); | 1433 plot->SetXAxis(0, call_duration_s_, "Time (s)", kLeftMargin, kRightMargin); |
1395 plot->SetSuggestedYAxis(0, 1, "Number of channels (1 (mono)/2 (stereo))", | 1434 plot->SetSuggestedYAxis(0, 1, "Number of channels (1 (mono)/2 (stereo))", |
1396 kBottomMargin, kTopMargin); | 1435 kBottomMargin, kTopMargin); |
1397 plot->SetTitle("Reported audio encoder number of channels"); | 1436 plot->SetTitle("Reported audio encoder number of channels"); |
1398 } | 1437 } |
1399 } // namespace plotting | 1438 } // namespace plotting |
1400 } // namespace webrtc | 1439 } // namespace webrtc |
OLD | NEW |