Index: webrtc/modules/congestion_controller/delay_based_bwe.cc |
diff --git a/webrtc/modules/remote_bitrate_estimator/remote_bitrate_estimator_abs_send_time.cc b/webrtc/modules/congestion_controller/delay_based_bwe.cc |
similarity index 71% |
copy from webrtc/modules/remote_bitrate_estimator/remote_bitrate_estimator_abs_send_time.cc |
copy to webrtc/modules/congestion_controller/delay_based_bwe.cc |
index 5975c5f3b8c9d8c9e4c3206883dfd7832e1793e1..27cbf015d85f6f84fa5c9a547ff80b146fd7a3b9 100644 |
--- a/webrtc/modules/remote_bitrate_estimator/remote_bitrate_estimator_abs_send_time.cc |
+++ b/webrtc/modules/congestion_controller/delay_based_bwe.cc |
@@ -1,5 +1,5 @@ |
/* |
- * Copyright (c) 2013 The WebRTC project authors. All Rights Reserved. |
+ * Copyright (c) 2016 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 |
@@ -8,7 +8,7 @@ |
* be found in the AUTHORS file in the root of the source tree. |
*/ |
-#include "webrtc/modules/remote_bitrate_estimator/remote_bitrate_estimator_abs_send_time.h" |
+#include "webrtc/modules/congestion_controller/delay_based_bwe.h" |
#include <math.h> |
@@ -23,8 +23,7 @@ |
#include "webrtc/system_wrappers/include/critical_section_wrapper.h" |
#include "webrtc/typedefs.h" |
-namespace webrtc { |
- |
+namespace { |
enum { |
kTimestampGroupLengthMs = 5, |
kAbsSendTimeFraction = 18, |
@@ -36,15 +35,15 @@ enum { |
kExpectedNumberOfProbes = 3 |
}; |
-static const double kTimestampToMs = 1000.0 / |
- static_cast<double>(1 << kInterArrivalShift); |
+static const double kTimestampToMs = |
+ 1000.0 / static_cast<double>(1 << kInterArrivalShift); |
-template<typename K, typename V> |
+template <typename K, typename V> |
std::vector<K> Keys(const std::map<K, V>& map) { |
std::vector<K> keys; |
keys.reserve(map.size()); |
for (typename std::map<K, V>::const_iterator it = map.begin(); |
- it != map.end(); ++it) { |
+ it != map.end(); ++it) { |
keys.push_back(it->first); |
} |
return keys; |
@@ -58,58 +57,49 @@ uint32_t ConvertMsTo24Bits(int64_t time_ms) { |
0x00FFFFFF; |
return time_24_bits; |
} |
+} // namespace |
-bool RemoteBitrateEstimatorAbsSendTime::IsWithinClusterBounds( |
- int send_delta_ms, |
- const Cluster& cluster_aggregate) { |
- if (cluster_aggregate.count == 0) |
- return true; |
- float cluster_mean = cluster_aggregate.send_mean_ms / |
- static_cast<float>(cluster_aggregate.count); |
- return fabs(static_cast<float>(send_delta_ms) - cluster_mean) < 2.5f; |
- } |
+namespace webrtc { |
- void RemoteBitrateEstimatorAbsSendTime::AddCluster( |
- std::list<Cluster>* clusters, |
- Cluster* cluster) { |
- cluster->send_mean_ms /= static_cast<float>(cluster->count); |
- cluster->recv_mean_ms /= static_cast<float>(cluster->count); |
- cluster->mean_size /= cluster->count; |
- clusters->push_back(*cluster); |
- } |
+void DelayBasedBwe::AddCluster(std::list<Cluster>* clusters, Cluster* cluster) { |
+ cluster->send_mean_ms /= static_cast<float>(cluster->count); |
+ cluster->recv_mean_ms /= static_cast<float>(cluster->count); |
+ cluster->mean_size /= cluster->count; |
+ clusters->push_back(*cluster); |
+} |
- RemoteBitrateEstimatorAbsSendTime::RemoteBitrateEstimatorAbsSendTime( |
- RemoteBitrateObserver* observer) |
- : observer_(observer), |
- inter_arrival_(), |
- estimator_(), |
- detector_(OverUseDetectorOptions()), |
- incoming_bitrate_(kBitrateWindowMs, 8000), |
- incoming_bitrate_initialized_(false), |
- total_probes_received_(0), |
- first_packet_time_ms_(-1), |
- last_update_ms_(-1), |
- ssrcs_() { |
- RTC_DCHECK(observer_); |
- LOG(LS_INFO) << "RemoteBitrateEstimatorAbsSendTime: Instantiating."; |
- network_thread_.DetachFromThread(); |
+DelayBasedBwe::DelayBasedBwe(RemoteBitrateObserver* observer) |
+ : observer_(observer), |
+ inter_arrival_(), |
+ estimator_(), |
+ detector_(OverUseDetectorOptions()), |
+ incoming_bitrate_(kBitrateWindowMs, 8000), |
+ total_probes_received_(0), |
+ first_packet_time_ms_(-1), |
+ last_update_ms_(-1), |
+ ssrcs_() { |
+ RTC_DCHECK(observer_); |
+ // NOTE! The BitrateEstimatorTest relies on this EXACT log line. |
+ LOG(LS_INFO) << "RemoteBitrateEstimatorAbsSendTime: Instantiating."; |
+ network_thread_.DetachFromThread(); |
} |
-void RemoteBitrateEstimatorAbsSendTime::ComputeClusters( |
- std::list<Cluster>* clusters) const { |
+void DelayBasedBwe::ComputeClusters(std::list<Cluster>* clusters) const { |
Cluster current; |
int64_t prev_send_time = -1; |
int64_t prev_recv_time = -1; |
+ int last_probe_cluster_id = -1; |
for (std::list<Probe>::const_iterator it = probes_.begin(); |
- it != probes_.end(); |
- ++it) { |
+ it != probes_.end(); ++it) { |
+ if (last_probe_cluster_id == -1) |
+ last_probe_cluster_id = it->cluster_id; |
if (prev_send_time >= 0) { |
int send_delta_ms = it->send_time_ms - prev_send_time; |
int recv_delta_ms = it->recv_time_ms - prev_recv_time; |
if (send_delta_ms >= 1 && recv_delta_ms >= 1) { |
++current.num_above_min_delta; |
} |
- if (!IsWithinClusterBounds(send_delta_ms, current)) { |
+ if (it->cluster_id != last_probe_cluster_id) { |
if (current.count >= kMinClusterSize) |
AddCluster(clusters, ¤t); |
current = Cluster(); |
@@ -118,6 +108,7 @@ void RemoteBitrateEstimatorAbsSendTime::ComputeClusters( |
current.recv_mean_ms += recv_delta_ms; |
current.mean_size += it->payload_size; |
++current.count; |
+ last_probe_cluster_id = it->cluster_id; |
} |
prev_send_time = it->send_time_ms; |
prev_recv_time = it->recv_time_ms; |
@@ -126,14 +117,12 @@ void RemoteBitrateEstimatorAbsSendTime::ComputeClusters( |
AddCluster(clusters, ¤t); |
} |
-std::list<Cluster>::const_iterator |
-RemoteBitrateEstimatorAbsSendTime::FindBestProbe( |
+std::list<DelayBasedBwe::Cluster>::const_iterator DelayBasedBwe::FindBestProbe( |
const std::list<Cluster>& clusters) const { |
int highest_probe_bitrate_bps = 0; |
std::list<Cluster>::const_iterator best_it = clusters.end(); |
for (std::list<Cluster>::const_iterator it = clusters.begin(); |
- it != clusters.end(); |
- ++it) { |
+ it != clusters.end(); ++it) { |
if (it->send_mean_ms == 0 || it->recv_mean_ms == 0) |
continue; |
int send_bitrate_bps = it->mean_size * 8 * 1000 / it->send_mean_ms; |
@@ -159,8 +148,7 @@ RemoteBitrateEstimatorAbsSendTime::FindBestProbe( |
return best_it; |
} |
-RemoteBitrateEstimatorAbsSendTime::ProbeResult |
-RemoteBitrateEstimatorAbsSendTime::ProcessClusters(int64_t now_ms) { |
+DelayBasedBwe::ProbeResult DelayBasedBwe::ProcessClusters(int64_t now_ms) { |
std::list<Cluster> clusters; |
ComputeClusters(&clusters); |
if (clusters.empty()) { |
@@ -196,8 +184,7 @@ RemoteBitrateEstimatorAbsSendTime::ProcessClusters(int64_t now_ms) { |
return ProbeResult::kNoUpdate; |
} |
-bool RemoteBitrateEstimatorAbsSendTime::IsBitrateImproving( |
- int new_bitrate_bps) const { |
+bool DelayBasedBwe::IsBitrateImproving(int new_bitrate_bps) const { |
bool initial_probe = !remote_rate_.ValidEstimate() && new_bitrate_bps > 0; |
bool bitrate_above_estimate = |
remote_rate_.ValidEstimate() && |
@@ -205,36 +192,55 @@ bool RemoteBitrateEstimatorAbsSendTime::IsBitrateImproving( |
return initial_probe || bitrate_above_estimate; |
} |
-void RemoteBitrateEstimatorAbsSendTime::IncomingPacketFeedbackVector( |
+void DelayBasedBwe::IncomingPacketFeedbackVector( |
const std::vector<PacketInfo>& packet_feedback_vector) { |
RTC_DCHECK(network_thread_.CalledOnValidThread()); |
for (const auto& packet_info : packet_feedback_vector) { |
IncomingPacketInfo(packet_info.arrival_time_ms, |
ConvertMsTo24Bits(packet_info.send_time_ms), |
- packet_info.payload_size, 0, packet_info.was_paced); |
+ packet_info.payload_size, 0, packet_info.was_paced, |
+ packet_info.probe_cluster_id); |
} |
} |
-void RemoteBitrateEstimatorAbsSendTime::IncomingPacket(int64_t arrival_time_ms, |
- size_t payload_size, |
- const RTPHeader& header, |
- bool was_paced) { |
+void DelayBasedBwe::IncomingPacket(int64_t arrival_time_ms, |
+ size_t payload_size, |
+ const RTPHeader& header, |
+ bool was_paced) { |
RTC_DCHECK(network_thread_.CalledOnValidThread()); |
if (!header.extension.hasAbsoluteSendTime) { |
- LOG(LS_WARNING) << "RemoteBitrateEstimatorAbsSendTimeImpl: Incoming packet " |
+ // NOTE! The BitrateEstimatorTest relies on this EXACT log line. |
+ LOG(LS_WARNING) << "RemoteBitrateEstimatorAbsSendTime: Incoming packet " |
"is missing absolute send time extension!"; |
return; |
} |
IncomingPacketInfo(arrival_time_ms, header.extension.absoluteSendTime, |
- payload_size, header.ssrc, was_paced); |
+ payload_size, header.ssrc, was_paced, |
+ PacketInfo::kNotAProbe); |
} |
-void RemoteBitrateEstimatorAbsSendTime::IncomingPacketInfo( |
- int64_t arrival_time_ms, |
- uint32_t send_time_24bits, |
- size_t payload_size, |
- uint32_t ssrc, |
- bool was_paced) { |
+void DelayBasedBwe::IncomingPacket(int64_t arrival_time_ms, |
+ size_t payload_size, |
+ const RTPHeader& header, |
+ bool was_paced, |
+ int probe_cluster_id) { |
+ RTC_DCHECK(network_thread_.CalledOnValidThread()); |
+ if (!header.extension.hasAbsoluteSendTime) { |
+ // NOTE! The BitrateEstimatorTest relies on this EXACT log line. |
+ LOG(LS_WARNING) << "RemoteBitrateEstimatorAbsSendTime: Incoming packet " |
+ "is missing absolute send time extension!"; |
+ return; |
+ } |
+ IncomingPacketInfo(arrival_time_ms, header.extension.absoluteSendTime, |
+ payload_size, header.ssrc, was_paced, probe_cluster_id); |
+} |
+ |
+void DelayBasedBwe::IncomingPacketInfo(int64_t arrival_time_ms, |
+ uint32_t send_time_24bits, |
+ size_t payload_size, |
+ uint32_t ssrc, |
+ bool was_paced, |
+ int probe_cluster_id) { |
assert(send_time_24bits < (1ul << 24)); |
// Shift up send time to use the full 32 bits that inter_arrival works with, |
// so wrapping works properly. |
@@ -244,18 +250,6 @@ void RemoteBitrateEstimatorAbsSendTime::IncomingPacketInfo( |
int64_t now_ms = arrival_time_ms; |
// TODO(holmer): SSRCs are only needed for REMB, should be broken out from |
// here. |
- |
- // Check if incoming bitrate estimate is valid, and if it needs to be reset. |
- rtc::Optional<uint32_t> incoming_bitrate = incoming_bitrate_.Rate(now_ms); |
- if (incoming_bitrate) { |
- incoming_bitrate_initialized_ = true; |
- } else if (incoming_bitrate_initialized_) { |
- // Incoming bitrate had a previous valid value, but now not enough data |
- // point are left within the current window. Reset incoming bitrate |
- // estimator so that the window size will only contain new data points. |
- incoming_bitrate_.Reset(); |
- incoming_bitrate_initialized_ = false; |
- } |
incoming_bitrate_.Update(payload_size, now_ms); |
if (first_packet_time_ms_ == -1) |
@@ -264,10 +258,7 @@ void RemoteBitrateEstimatorAbsSendTime::IncomingPacketInfo( |
uint32_t ts_delta = 0; |
int64_t t_delta = 0; |
int size_delta = 0; |
- // For now only try to detect probes while we don't have a valid estimate, and |
- // make sure the packet was paced. We currently assume that only packets |
- // larger than 200 bytes are paced by the sender. |
- was_paced = was_paced && payload_size > PacedSender::kMinProbePacketSize; |
+ |
bool update_estimate = false; |
uint32_t target_bitrate_bps = 0; |
std::vector<uint32_t> ssrcs; |
@@ -279,7 +270,11 @@ void RemoteBitrateEstimatorAbsSendTime::IncomingPacketInfo( |
RTC_DCHECK(estimator_.get()); |
ssrcs_[ssrc] = now_ms; |
- if (was_paced && |
+ // For now only try to detect probes while we don't have a valid estimate, |
+ // and make sure the packet was paced. We currently assume that only packets |
+ // larger than 200 bytes are paced by the sender. |
+ if (probe_cluster_id != PacketInfo::kNotAProbe && |
+ payload_size > PacedSender::kMinProbePacketSize && |
(!remote_rate_.ValidEstimate() || |
now_ms - first_packet_time_ms_ < kInitialProbingIntervalMs)) { |
// TODO(holmer): Use a map instead to get correct order? |
@@ -295,7 +290,8 @@ void RemoteBitrateEstimatorAbsSendTime::IncomingPacketInfo( |
<< " ms, send delta=" << send_delta_ms |
<< " ms, recv delta=" << recv_delta_ms << " ms."; |
} |
- probes_.push_back(Probe(send_time_ms, arrival_time_ms, payload_size)); |
+ probes_.push_back( |
+ Probe(send_time_ms, arrival_time_ms, payload_size, probe_cluster_id)); |
++total_probes_received_; |
// Make sure that a probe which updated the bitrate immediately has an |
// effect by calling the OnReceiveBitrateChanged callback. |
@@ -344,14 +340,14 @@ void RemoteBitrateEstimatorAbsSendTime::IncomingPacketInfo( |
} |
} |
-void RemoteBitrateEstimatorAbsSendTime::Process() {} |
+void DelayBasedBwe::Process() {} |
-int64_t RemoteBitrateEstimatorAbsSendTime::TimeUntilNextProcess() { |
+int64_t DelayBasedBwe::TimeUntilNextProcess() { |
const int64_t kDisabledModuleTime = 1000; |
return kDisabledModuleTime; |
} |
-void RemoteBitrateEstimatorAbsSendTime::TimeoutStreams(int64_t now_ms) { |
+void DelayBasedBwe::TimeoutStreams(int64_t now_ms) { |
for (Ssrcs::iterator it = ssrcs_.begin(); it != ssrcs_.end();) { |
if ((now_ms - it->second) > kStreamTimeOutMs) { |
ssrcs_.erase(it++); |
@@ -370,20 +366,18 @@ void RemoteBitrateEstimatorAbsSendTime::TimeoutStreams(int64_t now_ms) { |
} |
} |
-void RemoteBitrateEstimatorAbsSendTime::OnRttUpdate(int64_t avg_rtt_ms, |
- int64_t max_rtt_ms) { |
+void DelayBasedBwe::OnRttUpdate(int64_t avg_rtt_ms, int64_t max_rtt_ms) { |
rtc::CritScope lock(&crit_); |
remote_rate_.SetRtt(avg_rtt_ms); |
} |
-void RemoteBitrateEstimatorAbsSendTime::RemoveStream(uint32_t ssrc) { |
+void DelayBasedBwe::RemoveStream(uint32_t ssrc) { |
rtc::CritScope lock(&crit_); |
ssrcs_.erase(ssrc); |
} |
-bool RemoteBitrateEstimatorAbsSendTime::LatestEstimate( |
- std::vector<uint32_t>* ssrcs, |
- uint32_t* bitrate_bps) const { |
+bool DelayBasedBwe::LatestEstimate(std::vector<uint32_t>* ssrcs, |
+ uint32_t* bitrate_bps) const { |
// Currently accessed from both the process thread (see |
// ModuleRtpRtcpImpl::Process()) and the configuration thread (see |
// Call::GetStats()). Should in the future only be accessed from a single |
@@ -403,7 +397,7 @@ bool RemoteBitrateEstimatorAbsSendTime::LatestEstimate( |
return true; |
} |
-void RemoteBitrateEstimatorAbsSendTime::SetMinBitrate(int min_bitrate_bps) { |
+void DelayBasedBwe::SetMinBitrate(int min_bitrate_bps) { |
// Called from both the configuration thread and the network thread. Shouldn't |
// be called from the network thread in the future. |
rtc::CritScope lock(&crit_); |