Index: webrtc/modules/remote_bitrate_estimator/remote_estimator_proxy.cc |
diff --git a/webrtc/modules/remote_bitrate_estimator/remote_estimator_proxy.cc b/webrtc/modules/remote_bitrate_estimator/remote_estimator_proxy.cc |
index b08b30a8ce0b856aed2310bc9c36cc00892ce01d..5e7560a7797def79d1d2026acd971a1487e748e6 100644 |
--- a/webrtc/modules/remote_bitrate_estimator/remote_estimator_proxy.cc |
+++ b/webrtc/modules/remote_bitrate_estimator/remote_estimator_proxy.cc |
@@ -11,6 +11,7 @@ |
#include "webrtc/modules/remote_bitrate_estimator/remote_estimator_proxy.h" |
#include <limits> |
+#include <algorithm> |
#include "webrtc/base/checks.h" |
#include "webrtc/base/logging.h" |
@@ -22,8 +23,10 @@ |
namespace webrtc { |
// TODO(sprang): Tune these! |
-const int RemoteEstimatorProxy::kDefaultProcessIntervalMs = 50; |
const int RemoteEstimatorProxy::kBackWindowMs = 500; |
+const int RemoteEstimatorProxy::kMinSendIntervalMs = 50; |
+const int RemoteEstimatorProxy::kMaxSendIntervalMs = 250; |
+const int RemoteEstimatorProxy::kDefaultSendIntervalMs = 100; |
// The maximum allowed value for a timestamp in milliseconds. This is lower |
// than the numerical limit since we often convert to microseconds. |
@@ -37,7 +40,8 @@ RemoteEstimatorProxy::RemoteEstimatorProxy(Clock* clock, |
last_process_time_ms_(-1), |
media_ssrc_(0), |
feedback_sequence_(0), |
- window_start_seq_(-1) {} |
+ window_start_seq_(-1), |
+ send_interval_ms_(kDefaultSendIntervalMs) {} |
RemoteEstimatorProxy::~RemoteEstimatorProxy() {} |
@@ -68,11 +72,12 @@ bool RemoteEstimatorProxy::LatestEstimate(std::vector<unsigned int>* ssrcs, |
} |
int64_t RemoteEstimatorProxy::TimeUntilNextProcess() { |
- int64_t now = clock_->TimeInMilliseconds(); |
int64_t time_until_next = 0; |
- if (last_process_time_ms_ != -1 && |
- now - last_process_time_ms_ < kDefaultProcessIntervalMs) { |
- time_until_next = (last_process_time_ms_ + kDefaultProcessIntervalMs - now); |
+ if (last_process_time_ms_ != -1) { |
+ rtc::CritScope cs(&lock_); |
+ int64_t now = clock_->TimeInMilliseconds(); |
+ if (now - last_process_time_ms_ < send_interval_ms_) |
+ time_until_next = (last_process_time_ms_ + send_interval_ms_ - now); |
} |
return time_until_next; |
} |
@@ -92,6 +97,24 @@ void RemoteEstimatorProxy::Process() { |
} |
} |
+void RemoteEstimatorProxy::OnBitrateChanged(int bitrate_bps) { |
+ // TwccReportSize = Ipv4(20B) + UDP(8B) + SRTP(10B) + |
+ // AverageTwccReport(30B) |
+ // TwccReport size at 50ms interval is 24 byte. |
+ // TwccReport size at 250ms interval is 36 byte. |
+ // AverageTwccReport = (TwccReport(50ms) + TwccReport(250ms)) / 2 |
+ constexpr int kTwccReportSize = 20 + 8 + 10 + 30; |
+ constexpr double kMinTwccRate = |
+ kTwccReportSize * 8.0 * 1000.0 / kMaxSendIntervalMs; |
+ constexpr double kMaxTwccRate = |
+ kTwccReportSize * 8.0 * 1000.0 / kMinSendIntervalMs; |
+ |
+ // Let TWCC reports occupy 5% of total bandwidth. |
+ rtc::CritScope cs(&lock_); |
+ send_interval_ms_ = static_cast<int>(0.5 + kTwccReportSize * 8.0 * 1000.0 / |
+ (std::max(std::min(0.05 * bitrate_bps, kMaxTwccRate), kMinTwccRate))); |
+} |
+ |
void RemoteEstimatorProxy::OnPacketArrival(uint16_t sequence_number, |
int64_t arrival_time) { |
if (arrival_time < 0 || arrival_time > kMaxTimeMs) { |