1 /* 2 * Copyright (c) 2015 The WebRTC project authors. All Rights Reserved. 3 * 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 6 * tree. An additional intellectual property rights grant can be found 7 * in the file PATENTS. All contributing project authors may 8 * be found in the AUTHORS file in the root of the source tree. 9 */ 10 11 #include "webrtc/modules/remote_bitrate_estimator/test/packet_receiver.h" 12 13 #include <vector> 14 15 #include "testing/gtest/include/gtest/gtest.h" 16 #include "webrtc/base/common.h" 17 #include "webrtc/modules/include/module_common_types.h" 18 #include "webrtc/modules/remote_bitrate_estimator/test/bwe.h" 19 #include "webrtc/modules/remote_bitrate_estimator/test/bwe_test_framework.h" 20 #include "webrtc/modules/rtp_rtcp/include/receive_statistics.h" 21 #include "webrtc/system_wrappers/include/clock.h" 22 23 namespace webrtc { 24 namespace testing { 25 namespace bwe { 26 27 PacketReceiver::PacketReceiver(PacketProcessorListener* listener, 28 int flow_id, 29 BandwidthEstimatorType bwe_type, 30 bool plot_delay, 31 bool plot_bwe, 32 MetricRecorder* metric_recorder) 33 : PacketProcessor(listener, flow_id, kReceiver), 34 bwe_receiver_(CreateBweReceiver(bwe_type, flow_id, plot_bwe)), 35 metric_recorder_(metric_recorder), 36 plot_delay_(plot_delay), 37 last_delay_plot_ms_(0), 38 // #2 aligns the plot with the right axis. 39 delay_prefix_("Delay_ms#2"), 40 bwe_type_(bwe_type) { 41 if (metric_recorder_ != nullptr) { 42 // Setup the prefix std::strings used when logging. 43 std::vector<std::string> prefixes; 44 45 // Metric recorder plots them in separated figures, 46 // alignment will take place with the #1 left axis. 47 prefixes.push_back("Throughput_kbps#1"); 48 prefixes.push_back("Sending_Estimate_kbps#1"); 49 prefixes.push_back("Delay_ms_#1"); 50 prefixes.push_back("Packet_Loss_#1"); 51 prefixes.push_back("Objective_function_#1"); 52 53 // Plot Total/PerFlow Available capacity together with throughputs. 54 prefixes.push_back("Throughput_kbps#1"); // Total Available. 55 prefixes.push_back("Throughput_kbps#1"); // Available per flow. 56 57 bool plot_loss = plot_delay; // Plot loss if delay is plotted. 58 metric_recorder_->SetPlotInformation(prefixes, plot_delay, plot_loss); 59 } 60 } 61 62 PacketReceiver::PacketReceiver(PacketProcessorListener* listener, 63 int flow_id, 64 BandwidthEstimatorType bwe_type, 65 bool plot_delay, 66 bool plot_bwe) 67 : PacketReceiver(listener, 68 flow_id, 69 bwe_type, 70 plot_delay, 71 plot_bwe, 72 nullptr) { 73 } 74 75 PacketReceiver::~PacketReceiver() { 76 } 77 78 void PacketReceiver::RunFor(int64_t time_ms, Packets* in_out) { 79 Packets feedback; 80 for (auto it = in_out->begin(); it != in_out->end();) { 81 // PacketReceivers are only associated with a single stream, and therefore 82 // should only process a single flow id. 83 // TODO(holmer): Break this out into a Demuxer which implements both 84 // PacketProcessorListener and PacketProcessor. 85 BWE_TEST_LOGGING_CONTEXT("Receiver"); 86 if ((*it)->GetPacketType() == Packet::kMedia && 87 (*it)->flow_id() == *flow_ids().begin()) { 88 BWE_TEST_LOGGING_CONTEXT(*flow_ids().begin()); 89 const MediaPacket* media_packet = static_cast<const MediaPacket*>(*it); 90 // We're treating the send time (from previous filter) as the arrival 91 // time once packet reaches the estimator. 92 int64_t arrival_time_ms = media_packet->send_time_ms(); 93 int64_t send_time_ms = media_packet->creation_time_ms(); 94 delay_stats_.Push(arrival_time_ms - send_time_ms); 95 96 if (metric_recorder_ != nullptr) { 97 metric_recorder_->UpdateTimeMs(arrival_time_ms); 98 UpdateMetrics(arrival_time_ms, send_time_ms, 99 media_packet->payload_size()); 100 metric_recorder_->PlotAllDynamics(); 101 } else if (plot_delay_) { 102 PlotDelay(arrival_time_ms, send_time_ms); 103 } 104 105 bwe_receiver_->ReceivePacket(arrival_time_ms, *media_packet); 106 FeedbackPacket* fb = bwe_receiver_->GetFeedback(arrival_time_ms); 107 if (fb) 108 feedback.push_back(fb); 109 delete media_packet; 110 it = in_out->erase(it); 111 } else { 112 ++it; 113 } 114 } 115 // Insert feedback packets to be sent back to the sender. 116 in_out->merge(feedback, DereferencingComparator<Packet>); 117 } 118 119 void PacketReceiver::UpdateMetrics(int64_t arrival_time_ms, 120 int64_t send_time_ms, 121 size_t payload_size) { 122 metric_recorder_->UpdateThroughput(bwe_receiver_->RecentKbps(), payload_size); 123 metric_recorder_->UpdateDelayMs(arrival_time_ms - send_time_ms); 124 metric_recorder_->UpdateLoss(bwe_receiver_->RecentPacketLossRatio()); 125 metric_recorder_->UpdateObjective(); 126 } 127 128 void PacketReceiver::PlotDelay(int64_t arrival_time_ms, int64_t send_time_ms) { 129 const int64_t kDelayPlotIntervalMs = 100; 130 if (arrival_time_ms >= last_delay_plot_ms_ + kDelayPlotIntervalMs) { 131 BWE_TEST_LOGGING_PLOT_WITH_NAME(0, delay_prefix_, arrival_time_ms, 132 arrival_time_ms - send_time_ms, 133 bwe_names[bwe_type_]); 134 last_delay_plot_ms_ = arrival_time_ms; 135 } 136 } 137 138 float PacketReceiver::GlobalPacketLoss() { 139 return bwe_receiver_->GlobalReceiverPacketLossRatio(); 140 } 141 142 Stats<double> PacketReceiver::GetDelayStats() const { 143 return delay_stats_; 144 } 145 } // namespace bwe 146 } // namespace testing 147 } // namespace webrtc 148