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

Unified Diff: webrtc/modules/congestion_controller/receive_side_congestion_controller.cc

Issue 2752233002: Split CongestionController into send- and receive-side classes. (Closed)
Patch Set: Use variable names receive_side_cc and send_side_cc. Created 3 years, 9 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 side-by-side diff with in-line comments
Download patch
Index: webrtc/modules/congestion_controller/receive_side_congestion_controller.cc
diff --git a/webrtc/modules/congestion_controller/receive_side_congestion_controller.cc b/webrtc/modules/congestion_controller/receive_side_congestion_controller.cc
new file mode 100644
index 0000000000000000000000000000000000000000..eb5771ab42a13388693d9bf5eb2ebbce88ca2f4d
--- /dev/null
+++ b/webrtc/modules/congestion_controller/receive_side_congestion_controller.cc
@@ -0,0 +1,174 @@
+/*
+ * Copyright (c) 2017 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/congestion_controller/include/receive_side_congestion_controller.h"
+
+#include "webrtc/base/logging.h"
+#include "webrtc/modules/remote_bitrate_estimator/remote_bitrate_estimator_abs_send_time.h"
+#include "webrtc/modules/remote_bitrate_estimator/remote_bitrate_estimator_single_stream.h"
+
+namespace webrtc {
+
+namespace {
+static const uint32_t kTimeOffsetSwitchThreshold = 30;
+} // namespace
+
+ReceiveSideCongestionController::WrappingBitrateEstimator::
+ WrappingBitrateEstimator(RemoteBitrateObserver* observer,
+ const Clock* clock)
+ : observer_(observer),
+ clock_(clock),
+ rbe_(new RemoteBitrateEstimatorSingleStream(observer_, clock_)),
+ using_absolute_send_time_(false),
+ packets_since_absolute_send_time_(0),
+ min_bitrate_bps_(congestion_controller::GetMinBitrateBps()) {}
+
+void ReceiveSideCongestionController::WrappingBitrateEstimator::IncomingPacket(
+ int64_t arrival_time_ms,
+ size_t payload_size,
+ const RTPHeader& header) {
+ rtc::CritScope cs(&crit_sect_);
+ PickEstimatorFromHeader(header);
+ rbe_->IncomingPacket(arrival_time_ms, payload_size, header);
+}
+
+void ReceiveSideCongestionController::WrappingBitrateEstimator::Process() {
+ rtc::CritScope cs(&crit_sect_);
+ rbe_->Process();
+}
+
+int64_t ReceiveSideCongestionController::WrappingBitrateEstimator::
+ TimeUntilNextProcess() {
+ rtc::CritScope cs(&crit_sect_);
+ return rbe_->TimeUntilNextProcess();
+}
+
+void ReceiveSideCongestionController::WrappingBitrateEstimator::OnRttUpdate(
+ int64_t avg_rtt_ms,
+ int64_t max_rtt_ms) {
+ rtc::CritScope cs(&crit_sect_);
+ rbe_->OnRttUpdate(avg_rtt_ms, max_rtt_ms);
+}
+
+void ReceiveSideCongestionController::WrappingBitrateEstimator::RemoveStream(
+ unsigned int ssrc) {
+ rtc::CritScope cs(&crit_sect_);
+ rbe_->RemoveStream(ssrc);
+}
+
+bool ReceiveSideCongestionController::WrappingBitrateEstimator::LatestEstimate(
+ std::vector<unsigned int>* ssrcs,
+ unsigned int* bitrate_bps) const {
+ rtc::CritScope cs(&crit_sect_);
+ return rbe_->LatestEstimate(ssrcs, bitrate_bps);
+}
+
+void ReceiveSideCongestionController::WrappingBitrateEstimator::SetMinBitrate(
+ int min_bitrate_bps) {
+ rtc::CritScope cs(&crit_sect_);
+ rbe_->SetMinBitrate(min_bitrate_bps);
+ min_bitrate_bps_ = min_bitrate_bps;
+}
+
+void ReceiveSideCongestionController::WrappingBitrateEstimator::
+ PickEstimatorFromHeader(const RTPHeader& header) {
+ if (header.extension.hasAbsoluteSendTime) {
+ // If we see AST in header, switch RBE strategy immediately.
+ if (!using_absolute_send_time_) {
+ LOG(LS_INFO)
+ << "WrappingBitrateEstimator: Switching to absolute send time RBE.";
+ using_absolute_send_time_ = true;
+ PickEstimator();
+ }
+ packets_since_absolute_send_time_ = 0;
+ } else {
+ // When we don't see AST, wait for a few packets before going back to TOF.
+ if (using_absolute_send_time_) {
+ ++packets_since_absolute_send_time_;
+ if (packets_since_absolute_send_time_ >= kTimeOffsetSwitchThreshold) {
+ LOG(LS_INFO) << "WrappingBitrateEstimator: Switching to transmission "
+ << "time offset RBE.";
+ using_absolute_send_time_ = false;
+ PickEstimator();
+ }
+ }
+ }
+}
+
+// Instantiate RBE for Time Offset or Absolute Send Time extensions.
+void ReceiveSideCongestionController::WrappingBitrateEstimator::
+ PickEstimator() {
+ if (using_absolute_send_time_) {
+ rbe_.reset(new RemoteBitrateEstimatorAbsSendTime(observer_, clock_));
+ } else {
+ rbe_.reset(new RemoteBitrateEstimatorSingleStream(observer_, clock_));
+ }
+ rbe_->SetMinBitrate(min_bitrate_bps_);
+}
+
+ReceiveSideCongestionController::ReceiveSideCongestionController(
+ const Clock* clock,
+ RemoteBitrateObserver* remote_bitrate_observer,
+ PacketRouter* packet_router)
+ : remote_bitrate_estimator_(remote_bitrate_observer, clock),
+ remote_estimator_proxy_(clock, packet_router) {}
+
+void ReceiveSideCongestionController::OnReceivedPacket(
+ int64_t arrival_time_ms,
+ size_t payload_size,
+ const RTPHeader& header) {
+ // Send-side BWE.
+ if (header.extension.hasTransportSequenceNumber) {
+ remote_estimator_proxy_.IncomingPacket(arrival_time_ms, payload_size,
+ header);
+ } else {
+ // Receive-side BWE.
+ remote_bitrate_estimator_.IncomingPacket(arrival_time_ms, payload_size,
+ header);
+ }
+}
+
+RemoteBitrateEstimator*
+ReceiveSideCongestionController::GetRemoteBitrateEstimator(bool send_side_bwe) {
+ if (send_side_bwe) {
+ return &remote_estimator_proxy_;
+ } else {
+ return &remote_bitrate_estimator_;
+ }
+}
+
+const RemoteBitrateEstimator*
+ReceiveSideCongestionController::GetRemoteBitrateEstimator(
+ bool send_side_bwe) const {
+ if (send_side_bwe) {
+ return &remote_estimator_proxy_;
+ } else {
+ return &remote_bitrate_estimator_;
+ }
+}
+
+void ReceiveSideCongestionController::OnRttUpdate(int64_t avg_rtt_ms,
+ int64_t max_rtt_ms) {
+ remote_bitrate_estimator_.OnRttUpdate(avg_rtt_ms, max_rtt_ms);
+}
+
+void ReceiveSideCongestionController::OnBitrateChanged(int bitrate_bps) {
+ remote_estimator_proxy_.OnBitrateChanged(bitrate_bps);
+}
+
+int64_t ReceiveSideCongestionController::TimeUntilNextProcess() {
+ return remote_bitrate_estimator_.TimeUntilNextProcess();
+}
+
+void ReceiveSideCongestionController::Process() {
+ remote_bitrate_estimator_.Process();
+}
+
+} // namespace webrtc

Powered by Google App Engine
This is Rietveld 408576698