Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(191)

Side by Side Diff: webrtc/tools/event_log_visualizer/analyzer.cc

Issue 2912813002: Overlay REMB in total bitrate graphs in visualization tool. (Closed)
Patch Set: Add missing include. Created 3 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | webrtc/tools/event_log_visualizer/plot_base.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
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
OLDNEW
« no previous file with comments | « no previous file | webrtc/tools/event_log_visualizer/plot_base.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698