Adds Rtt tracker for PCC.
This is a part of series of CLs adding PCC (Performance-oriented Congestion Control). Bug: webrtc:9434 Change-Id: Idd36d8abea008623ac64b939d0de7ee6001f7f23 Reviewed-on: https://webrtc-review.googlesource.com/86951 Commit-Queue: Anastasia Koloskova <koloskova@webrtc.org> Reviewed-by: Sebastian Jansson <srte@webrtc.org> Reviewed-by: Björn Terelius <terelius@webrtc.org> Cr-Commit-Position: refs/heads/master@{#24364}
This commit is contained in:
committed by
Commit Bot
parent
8459b17c75
commit
ac50c6a204
@ -125,6 +125,7 @@ if (rtc_include_tests) {
|
||||
"bbr:bbr_unittests",
|
||||
"goog_cc:estimators",
|
||||
"goog_cc:goog_cc_unittests",
|
||||
"pcc:pcc_unittests",
|
||||
"rtp:congestion_controller_unittests",
|
||||
]
|
||||
if (!build_with_chromium && is_clang) {
|
||||
|
||||
37
modules/congestion_controller/pcc/BUILD.gn
Normal file
37
modules/congestion_controller/pcc/BUILD.gn
Normal file
@ -0,0 +1,37 @@
|
||||
# Copyright (c) 2018 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.
|
||||
|
||||
import("../../../webrtc.gni")
|
||||
|
||||
rtc_static_library("rtt_tracker") {
|
||||
sources = [
|
||||
"rtt_tracker.cc",
|
||||
"rtt_tracker.h",
|
||||
]
|
||||
deps = [
|
||||
"../../../api/transport:network_control",
|
||||
"../../../rtc_base:rtc_base_approved",
|
||||
]
|
||||
}
|
||||
|
||||
if (rtc_include_tests) {
|
||||
rtc_source_set("pcc_unittests") {
|
||||
testonly = true
|
||||
sources = [
|
||||
"rtt_tracker_unittest.cc",
|
||||
]
|
||||
deps = [
|
||||
":rtt_tracker",
|
||||
"../../../api/transport:network_control_test",
|
||||
"../../../api/units:data_rate",
|
||||
"../../../api/units:time_delta",
|
||||
"../../../api/units:timestamp",
|
||||
"../../../test:test_support",
|
||||
]
|
||||
}
|
||||
}
|
||||
42
modules/congestion_controller/pcc/rtt_tracker.cc
Normal file
42
modules/congestion_controller/pcc/rtt_tracker.cc
Normal file
@ -0,0 +1,42 @@
|
||||
/*
|
||||
* Copyright (c) 2018 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 <algorithm>
|
||||
|
||||
#include "modules/congestion_controller/pcc/rtt_tracker.h"
|
||||
|
||||
namespace webrtc {
|
||||
namespace pcc {
|
||||
|
||||
RttTracker::RttTracker(TimeDelta initial_rtt, double alpha)
|
||||
: rtt_estimate_(initial_rtt), alpha_(alpha) {}
|
||||
|
||||
void RttTracker::OnPacketsFeedback(
|
||||
const std::vector<PacketResult>& packet_feedbacks,
|
||||
Timestamp feedback_received_time) {
|
||||
TimeDelta packet_rtt = TimeDelta::MinusInfinity();
|
||||
for (const PacketResult& packet_result : packet_feedbacks) {
|
||||
if (!packet_result.sent_packet.has_value() ||
|
||||
packet_result.receive_time.IsInfinite())
|
||||
continue;
|
||||
packet_rtt = std::max<TimeDelta>(
|
||||
packet_rtt,
|
||||
feedback_received_time - packet_result.sent_packet->send_time);
|
||||
}
|
||||
if (packet_rtt.IsFinite())
|
||||
rtt_estimate_ = (1 - alpha_) * rtt_estimate_ + alpha_ * packet_rtt;
|
||||
}
|
||||
|
||||
TimeDelta RttTracker::GetRtt() const {
|
||||
return rtt_estimate_;
|
||||
}
|
||||
|
||||
} // namespace pcc
|
||||
} // namespace webrtc
|
||||
38
modules/congestion_controller/pcc/rtt_tracker.h
Normal file
38
modules/congestion_controller/pcc/rtt_tracker.h
Normal file
@ -0,0 +1,38 @@
|
||||
/*
|
||||
* Copyright (c) 2018 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.
|
||||
*/
|
||||
|
||||
#ifndef MODULES_CONGESTION_CONTROLLER_PCC_RTT_TRACKER_H_
|
||||
#define MODULES_CONGESTION_CONTROLLER_PCC_RTT_TRACKER_H_
|
||||
|
||||
#include <vector>
|
||||
|
||||
#include "api/transport/network_control.h"
|
||||
#include "api/transport/network_types.h"
|
||||
|
||||
namespace webrtc {
|
||||
namespace pcc {
|
||||
|
||||
class RttTracker {
|
||||
public:
|
||||
RttTracker(TimeDelta initial_rtt, double alpha);
|
||||
// Updates RTT estimate.
|
||||
void OnPacketsFeedback(const std::vector<PacketResult>& packet_feedbacks,
|
||||
Timestamp feedback_received_time);
|
||||
TimeDelta GetRtt() const;
|
||||
|
||||
private:
|
||||
TimeDelta rtt_estimate_;
|
||||
double alpha_;
|
||||
};
|
||||
|
||||
} // namespace pcc
|
||||
} // namespace webrtc
|
||||
|
||||
#endif // MODULES_CONGESTION_CONTROLLER_PCC_RTT_TRACKER_H_
|
||||
70
modules/congestion_controller/pcc/rtt_tracker_unittest.cc
Normal file
70
modules/congestion_controller/pcc/rtt_tracker_unittest.cc
Normal file
@ -0,0 +1,70 @@
|
||||
/*
|
||||
* Copyright (c) 2018 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 "modules/congestion_controller/pcc/rtt_tracker.h"
|
||||
#include "test/gtest.h"
|
||||
|
||||
namespace webrtc {
|
||||
namespace pcc {
|
||||
namespace test {
|
||||
namespace {
|
||||
const TimeDelta kInitialRtt = TimeDelta::us(10);
|
||||
constexpr double kAlpha = 0.9;
|
||||
const Timestamp kStartTime = Timestamp::seconds(0);
|
||||
|
||||
PacketResult GetPacketWithRtt(TimeDelta rtt) {
|
||||
SentPacket packet;
|
||||
packet.send_time = kStartTime;
|
||||
PacketResult packet_result;
|
||||
packet_result.sent_packet = packet;
|
||||
if (rtt.IsFinite()) {
|
||||
packet_result.receive_time = kStartTime + rtt;
|
||||
} else {
|
||||
packet_result.receive_time = Timestamp::Infinity();
|
||||
}
|
||||
return packet_result;
|
||||
}
|
||||
} // namespace
|
||||
|
||||
TEST(PccRttTrackerTest, InitialValue) {
|
||||
RttTracker tracker{kInitialRtt, kAlpha};
|
||||
EXPECT_EQ(kInitialRtt, tracker.GetRtt());
|
||||
for (int i = 0; i < 100; ++i) {
|
||||
tracker.OnPacketsFeedback({GetPacketWithRtt(kInitialRtt)},
|
||||
kStartTime + kInitialRtt);
|
||||
}
|
||||
EXPECT_EQ(kInitialRtt, tracker.GetRtt());
|
||||
}
|
||||
|
||||
TEST(PccRttTrackerTest, DoNothingWhenPacketIsLost) {
|
||||
RttTracker tracker{kInitialRtt, kAlpha};
|
||||
tracker.OnPacketsFeedback({GetPacketWithRtt(TimeDelta::PlusInfinity())},
|
||||
kStartTime + kInitialRtt);
|
||||
EXPECT_EQ(tracker.GetRtt(), kInitialRtt);
|
||||
}
|
||||
|
||||
TEST(PccRttTrackerTest, ChangeInRtt) {
|
||||
RttTracker tracker{kInitialRtt, kAlpha};
|
||||
const TimeDelta kNewRtt = TimeDelta::us(100);
|
||||
tracker.OnPacketsFeedback({GetPacketWithRtt(kNewRtt)}, kStartTime + kNewRtt);
|
||||
EXPECT_GT(tracker.GetRtt(), kInitialRtt);
|
||||
EXPECT_LE(tracker.GetRtt(), kNewRtt);
|
||||
for (int i = 0; i < 100; ++i) {
|
||||
tracker.OnPacketsFeedback({GetPacketWithRtt(kNewRtt)},
|
||||
kStartTime + kNewRtt);
|
||||
}
|
||||
const TimeDelta absolute_error = TimeDelta::us(1);
|
||||
EXPECT_NEAR(tracker.GetRtt().us(), kNewRtt.us(), absolute_error.us());
|
||||
EXPECT_LE(tracker.GetRtt(), kNewRtt);
|
||||
}
|
||||
|
||||
} // namespace test
|
||||
} // namespace pcc
|
||||
} // namespace webrtc
|
||||
Reference in New Issue
Block a user