aboutsummaryrefslogtreecommitdiff
path: root/webrtc/modules/remote_bitrate_estimator/test/packet_receiver.cc
diff options
context:
space:
mode:
Diffstat (limited to 'webrtc/modules/remote_bitrate_estimator/test/packet_receiver.cc')
-rw-r--r--webrtc/modules/remote_bitrate_estimator/test/packet_receiver.cc147
1 files changed, 147 insertions, 0 deletions
diff --git a/webrtc/modules/remote_bitrate_estimator/test/packet_receiver.cc b/webrtc/modules/remote_bitrate_estimator/test/packet_receiver.cc
new file mode 100644
index 0000000000..f70c212af7
--- /dev/null
+++ b/webrtc/modules/remote_bitrate_estimator/test/packet_receiver.cc
@@ -0,0 +1,147 @@
+/*
+ * Copyright (c) 2015 The WebRTC project authors. All Rights Reserved.
+ *
+ * Use of this source code is governed by a BSD-style license
+ * that can be found in the LICENSE file in the root of the source
+ * tree. An additional intellectual property rights grant can be found
+ * in the file PATENTS. All contributing project authors may
+ * be found in the AUTHORS file in the root of the source tree.
+ */
+
+#include "webrtc/modules/remote_bitrate_estimator/test/packet_receiver.h"
+
+#include <vector>
+
+#include "testing/gtest/include/gtest/gtest.h"
+#include "webrtc/base/common.h"
+#include "webrtc/modules/interface/module_common_types.h"
+#include "webrtc/modules/remote_bitrate_estimator/test/bwe.h"
+#include "webrtc/modules/remote_bitrate_estimator/test/bwe_test_framework.h"
+#include "webrtc/modules/rtp_rtcp/interface/receive_statistics.h"
+#include "webrtc/system_wrappers/include/clock.h"
+
+namespace webrtc {
+namespace testing {
+namespace bwe {
+
+PacketReceiver::PacketReceiver(PacketProcessorListener* listener,
+ int flow_id,
+ BandwidthEstimatorType bwe_type,
+ bool plot_delay,
+ bool plot_bwe,
+ MetricRecorder* metric_recorder)
+ : PacketProcessor(listener, flow_id, kReceiver),
+ bwe_receiver_(CreateBweReceiver(bwe_type, flow_id, plot_bwe)),
+ metric_recorder_(metric_recorder),
+ plot_delay_(plot_delay),
+ last_delay_plot_ms_(0),
+ // #2 aligns the plot with the right axis.
+ delay_prefix_("Delay_ms#2"),
+ bwe_type_(bwe_type) {
+ if (metric_recorder_ != nullptr) {
+ // Setup the prefix std::strings used when logging.
+ std::vector<std::string> prefixes;
+
+ // Metric recorder plots them in separated figures,
+ // alignment will take place with the #1 left axis.
+ prefixes.push_back("Throughput_kbps#1");
+ prefixes.push_back("Sending_Estimate_kbps#1");
+ prefixes.push_back("Delay_ms_#1");
+ prefixes.push_back("Packet_Loss_#1");
+ prefixes.push_back("Objective_function_#1");
+
+ // Plot Total/PerFlow Available capacity together with throughputs.
+ prefixes.push_back("Throughput_kbps#1"); // Total Available.
+ prefixes.push_back("Throughput_kbps#1"); // Available per flow.
+
+ bool plot_loss = plot_delay; // Plot loss if delay is plotted.
+ metric_recorder_->SetPlotInformation(prefixes, plot_delay, plot_loss);
+ }
+}
+
+PacketReceiver::PacketReceiver(PacketProcessorListener* listener,
+ int flow_id,
+ BandwidthEstimatorType bwe_type,
+ bool plot_delay,
+ bool plot_bwe)
+ : PacketReceiver(listener,
+ flow_id,
+ bwe_type,
+ plot_delay,
+ plot_bwe,
+ nullptr) {
+}
+
+PacketReceiver::~PacketReceiver() {
+}
+
+void PacketReceiver::RunFor(int64_t time_ms, Packets* in_out) {
+ Packets feedback;
+ for (auto it = in_out->begin(); it != in_out->end();) {
+ // PacketReceivers are only associated with a single stream, and therefore
+ // should only process a single flow id.
+ // TODO(holmer): Break this out into a Demuxer which implements both
+ // PacketProcessorListener and PacketProcessor.
+ BWE_TEST_LOGGING_CONTEXT("Receiver");
+ if ((*it)->GetPacketType() == Packet::kMedia &&
+ (*it)->flow_id() == *flow_ids().begin()) {
+ BWE_TEST_LOGGING_CONTEXT(*flow_ids().begin());
+ const MediaPacket* media_packet = static_cast<const MediaPacket*>(*it);
+ // We're treating the send time (from previous filter) as the arrival
+ // time once packet reaches the estimator.
+ int64_t arrival_time_ms = media_packet->send_time_ms();
+ int64_t send_time_ms = media_packet->creation_time_ms();
+ delay_stats_.Push(arrival_time_ms - send_time_ms);
+
+ if (metric_recorder_ != nullptr) {
+ metric_recorder_->UpdateTimeMs(arrival_time_ms);
+ UpdateMetrics(arrival_time_ms, send_time_ms,
+ media_packet->payload_size());
+ metric_recorder_->PlotAllDynamics();
+ } else if (plot_delay_) {
+ PlotDelay(arrival_time_ms, send_time_ms);
+ }
+
+ bwe_receiver_->ReceivePacket(arrival_time_ms, *media_packet);
+ FeedbackPacket* fb = bwe_receiver_->GetFeedback(arrival_time_ms);
+ if (fb)
+ feedback.push_back(fb);
+ delete media_packet;
+ it = in_out->erase(it);
+ } else {
+ ++it;
+ }
+ }
+ // Insert feedback packets to be sent back to the sender.
+ in_out->merge(feedback, DereferencingComparator<Packet>);
+}
+
+void PacketReceiver::UpdateMetrics(int64_t arrival_time_ms,
+ int64_t send_time_ms,
+ size_t payload_size) {
+ metric_recorder_->UpdateThroughput(bwe_receiver_->RecentKbps(), payload_size);
+ metric_recorder_->UpdateDelayMs(arrival_time_ms - send_time_ms);
+ metric_recorder_->UpdateLoss(bwe_receiver_->RecentPacketLossRatio());
+ metric_recorder_->UpdateObjective();
+}
+
+void PacketReceiver::PlotDelay(int64_t arrival_time_ms, int64_t send_time_ms) {
+ const int64_t kDelayPlotIntervalMs = 100;
+ if (arrival_time_ms >= last_delay_plot_ms_ + kDelayPlotIntervalMs) {
+ BWE_TEST_LOGGING_PLOT_WITH_NAME(0, delay_prefix_, arrival_time_ms,
+ arrival_time_ms - send_time_ms,
+ bwe_names[bwe_type_]);
+ last_delay_plot_ms_ = arrival_time_ms;
+ }
+}
+
+float PacketReceiver::GlobalPacketLoss() {
+ return bwe_receiver_->GlobalReceiverPacketLossRatio();
+}
+
+Stats<double> PacketReceiver::GetDelayStats() const {
+ return delay_stats_;
+}
+} // namespace bwe
+} // namespace testing
+} // namespace webrtc