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",
|
"bbr:bbr_unittests",
|
||||||
"goog_cc:estimators",
|
"goog_cc:estimators",
|
||||||
"goog_cc:goog_cc_unittests",
|
"goog_cc:goog_cc_unittests",
|
||||||
|
"pcc:pcc_unittests",
|
||||||
"rtp:congestion_controller_unittests",
|
"rtp:congestion_controller_unittests",
|
||||||
]
|
]
|
||||||
if (!build_with_chromium && is_clang) {
|
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