Index: webrtc/modules/remote_bitrate_estimator/test/bwe.cc |
diff --git a/webrtc/modules/remote_bitrate_estimator/test/bwe.cc b/webrtc/modules/remote_bitrate_estimator/test/bwe.cc |
index 6e8dbc7c068430905d2681508b10fb2af19fad31..56f63228e435b60c59e8d220630e747b6ff54a62 100644 |
--- a/webrtc/modules/remote_bitrate_estimator/test/bwe.cc |
+++ b/webrtc/modules/remote_bitrate_estimator/test/bwe.cc |
@@ -29,7 +29,20 @@ namespace bwe { |
const int kSetCapacity = 1000; |
magalhaesc
2015/06/25 11:09:16
2 options:
-- Replace 1000 with 1000, then recalc
stefan-webrtc
2015/06/25 14:44:03
Right... I would personally prefer if we could hav
magalhaesc
2015/07/01 12:48:39
All right, I will keep it 1000.
What do you think
|
BweReceiver::BweReceiver(int flow_id) |
- : flow_id_(flow_id), received_packets_(kSetCapacity) { |
+ : num_previous_total_packets_(0), |
+ num_previous_lost_packets_(0), |
+ flow_id_(flow_id), |
+ received_packets_(kSetCapacity) { |
+} |
+ |
+void BweSender::Pause() { |
+ running_ = false; |
+ bitrate_kbps_ = 0; |
+} |
+ |
+void BweSender::Resume() { |
+ running_ = true; |
+ bitrate_kbps_ = kMinBitrateKbps; |
} |
class NullBweSender : public BweSender { |
@@ -97,7 +110,29 @@ BweReceiver* CreateBweReceiver(BandwidthEstimatorType type, |
return NULL; |
} |
-float BweReceiver::GlobalPacketLossRatio() { |
+void BweReceiver::UpdateLossAccount() { |
+ float set_loss_ratio = LinkedSetPacketLossRatio(); |
+ size_t set_received_packets = received_packets_.size(); |
+ size_t set_total_packets = set_received_packets / (1.0f - set_loss_ratio); |
+ size_t set_lost_packets = set_total_packets - set_received_packets; |
+ |
+ num_previous_total_packets_ += static_cast<uint32_t>(set_total_packets); |
+ num_previous_lost_packets_ += static_cast<uint32_t>(set_lost_packets); |
+} |
stefan-webrtc
2015/06/25 14:44:03
But if this method gets called whenever we remove
magalhaesc
2015/07/01 12:48:39
Yes, all should be fine for the global loss ratio
|
+ |
+void BweReceiver::ClearSet() { |
+ received_packets_.Clear(); |
+} |
+ |
+float BweReceiver::GlobalReceiverPacketLossRatio() { |
+ UpdateLossAccount(); |
+ return static_cast<float>(num_previous_lost_packets_) / |
+ num_previous_total_packets_; |
+} |
+ |
+// This function considers at most kSetCapacity = 10000 packets. |
+// TODO(magalhaesc): Unwrap sequence number to handle more. |
+float BweReceiver::LinkedSetPacketLossRatio() { |
if (received_packets_.empty()) { |
return 0.0f; |
} |
@@ -114,7 +149,7 @@ float BweReceiver::GlobalPacketLossRatio() { |
min = received_packets_.lower_bound(0xFFFF - kMaxGap); |
gap = max + (0xFFFF - min) + 2; |
} |
- return static_cast<float>(received_packets_.size()) / gap; |
+ return static_cast<float>(gap - received_packets_.size()) / gap; |
} |
// Go through a fixed time window of most recent packets received and |
@@ -157,6 +192,57 @@ float BweReceiver::RecentPacketLossRatio() { |
return static_cast<float>(gap - number_packets_received) / gap; |
} |
+// For a given time window, compute the receiving speed rate in kbps. |
+// As described below, three cases are considered depending on the number of |
+// packets received. |
+size_t BweReceiver::RecentReceivingRate() { |
magalhaesc
2015/06/25 09:03:35
Since a RateCounter was added, RecentReceivingRate
|
+ // If the receiver didn't receive any packet, return 0. |
+ if (received_packets_.empty()) { |
+ return 0.0f; |
+ } |
+ size_t total_size = 0; |
+ int number_packets = 0; |
+ |
+ PacketNodeIt node_it = received_packets_.begin(); |
+ |
+ int64_t last_time_ms = (*node_it)->arrival_time_ms; |
+ int64_t start_time_ms = last_time_ms; |
+ PacketNodeIt end = received_packets_.end(); |
+ |
+ // Stops after including the first packet out of the timeWindow. |
+ // Ameliorates results when there are wide gaps between packets. |
+ // E.g. Large packets : p1(0ms), p2(3000ms). |
+ while (node_it != end) { |
+ total_size += (*node_it)->payload_size; |
+ last_time_ms = (*node_it)->arrival_time_ms; |
+ ++number_packets; |
+ if ((*node_it)->arrival_time_ms < |
+ start_time_ms - kReceivingRateTimeWindowMs) { |
+ break; |
+ } |
+ ++node_it; |
+ } |
+ |
+ int64_t corrected_time_ms; |
+ // If the receiver didn't receive enough packets to fill the time window: |
+ if (start_time_ms - last_time_ms < kReceivingRateTimeWindowMs) { |
+ corrected_time_ms = kReceivingRateTimeWindowMs; |
+ } |
+ // If the receiver received multiple packets, use as time interval the gap |
+ // between first and last packet falling in the timeWindow corrected by the |
+ // factor number_packets/(number_packets-1). |
+ // E.g: Let timeWindow = 500ms, payload_size = 500 bytes, number_packets = 2, |
+ // packets received at t1(0ms) and t2(499 or 501ms). This prevent the function |
+ // from returning ~2*8, sending instead a more likely ~1*8 kbps. |
+ else { |
+ corrected_time_ms = (number_packets * (start_time_ms - last_time_ms)) / |
+ (number_packets - 1); |
+ } |
+ |
+ // Converting from bytes/ms to kbits/s. |
+ return static_cast<size_t>(8 * total_size / corrected_time_ms); |
+} |
stefan-webrtc
2015/06/25 14:44:03
This method seems overly complicated to me. I woul
magalhaesc
2015/07/01 12:48:39
Right, this method will be removed.
|
+ |
void LinkedSet::Insert(uint16_t sequence_number, |
int64_t send_time_ms, |
int64_t arrival_time_ms, |