Chromium Code Reviews| Index: webrtc/modules/remote_bitrate_estimator/test/estimators/nada.cc |
| diff --git a/webrtc/modules/remote_bitrate_estimator/test/estimators/nada.cc b/webrtc/modules/remote_bitrate_estimator/test/estimators/nada.cc |
| index ccbc522b7e375d2e065fe337e6da0038ac237097..068b6923165a016c3d27bd893b11730c12f925a3 100644 |
| --- a/webrtc/modules/remote_bitrate_estimator/test/estimators/nada.cc |
| +++ b/webrtc/modules/remote_bitrate_estimator/test/estimators/nada.cc |
| @@ -17,6 +17,8 @@ |
| #include <math.h> |
| #include <algorithm> |
| #include <vector> |
| + |
| +// DEBUG |
| #include <iostream> |
|
stefan-webrtc
2015/07/15 11:35:54
Remove
magalhaesc
2015/07/15 11:41:59
Done.
|
| #include "webrtc/base/common.h" |
| @@ -28,16 +30,14 @@ namespace webrtc { |
| namespace testing { |
| namespace bwe { |
| -const int NadaBweSender::kMinRefRateKbps = 150; |
| -const int NadaBweSender::kMaxRefRateKbps = 1500; |
| const int64_t NadaBweReceiver::kReceivingRateTimeWindowMs = 500; |
| NadaBweReceiver::NadaBweReceiver(int flow_id) |
| - : BweReceiver(flow_id), |
| + : BweReceiver(flow_id, kReceivingRateTimeWindowMs), |
| clock_(0), |
| last_feedback_ms_(0), |
| recv_stats_(ReceiveStatistics::Create(&clock_)), |
| - baseline_delay_ms_(0), |
| + baseline_delay_ms_(10000), // Initialized as an upper bound. |
| delay_signal_ms_(0), |
| last_congestion_signal_ms_(0), |
| last_delays_index_(0), |
| @@ -57,16 +57,19 @@ void NadaBweReceiver::ReceivePacket(int64_t arrival_time_ms, |
| clock_.AdvanceTimeMilliseconds(arrival_time_ms - clock_.TimeInMilliseconds()); |
| recv_stats_->IncomingPacket(media_packet.header(), |
| media_packet.payload_size(), false); |
| - int64_t delay_ms = arrival_time_ms - |
| - media_packet.creation_time_us() / 1000; // Refered as x_n. |
| + // Refered as x_n. |
| + int64_t delay_ms = arrival_time_ms - media_packet.sender_timestamp_ms(); |
| + |
| // The min should be updated within the first 10 minutes. |
| if (clock_.TimeInMilliseconds() < 10 * 60 * 1000) { |
| baseline_delay_ms_ = std::min(baseline_delay_ms_, delay_ms); |
| } |
| + |
| delay_signal_ms_ = delay_ms - baseline_delay_ms_; // Refered as d_n. |
| const int kMedian = ARRAY_SIZE(last_delays_ms_); |
| last_delays_ms_[(last_delays_index_++) % kMedian] = delay_signal_ms_; |
| int size = std::min(last_delays_index_, kMedian); |
| + |
| int64_t median_filtered_delay_ms_ = MedianFilter(last_delays_ms_, size); |
| exp_smoothed_delay_ms_ = ExponentialSmoothingFilter( |
| median_filtered_delay_ms_, exp_smoothed_delay_ms_, kAlpha); |
| @@ -110,67 +113,19 @@ FeedbackPacket* NadaBweReceiver::GetFeedback(int64_t now_ms) { |
| last_feedback_ms_ = now_ms; |
| last_congestion_signal_ms_ = congestion_signal_ms; |
| - PacketIdentifierNode* latest = *(received_packets_.begin()); |
| - int64_t corrected_send_time_ms = |
| - latest->send_time_ms + now_ms - latest->arrival_time_ms; |
| + int64_t corrected_send_time_ms = 0L; |
| + |
| + if (!received_packets_.empty()) { |
| + PacketIdentifierNode* latest = *(received_packets_.begin()); |
| + corrected_send_time_ms = |
| + latest->send_time_ms + now_ms - latest->arrival_time_ms; |
| + } |
| // Sends a tuple containing latest values of <d_hat_n, d_tilde_n, x_n, x'_n, |
| // R_r> and additional information. |
| - return new NadaFeedback(flow_id_, now_ms, exp_smoothed_delay_ms_, |
| + return new NadaFeedback(flow_id_, now_ms * 1000, exp_smoothed_delay_ms_, |
| est_queuing_delay_signal_ms_, congestion_signal_ms, |
| - derivative, RecentReceivingRate(), |
| - corrected_send_time_ms); |
| -} |
| - |
| -// 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 NadaBweReceiver::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 received a single packet, return its size*8/timeWindow. |
| - if (number_packets == 1) { |
| - 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); |
| + derivative, RecentKbps(), corrected_send_time_ms); |
| } |
| int64_t NadaBweReceiver::MedianFilter(int64_t* last_delays_ms, int size) { |
| @@ -193,16 +148,16 @@ int64_t NadaBweReceiver::ExponentialSmoothingFilter(int64_t new_value, |
| // Implementation according to Cisco's proposal by default. |
| NadaBweSender::NadaBweSender(int kbps, BitrateObserver* observer, Clock* clock) |
| - : clock_(clock), |
| + : BweSender(kbps), // Referred as "Reference Rate" = R_n., |
| + clock_(clock), |
| observer_(observer), |
| - bitrate_kbps_(kbps), |
| original_operating_mode_(true) { |
| } |
| NadaBweSender::NadaBweSender(BitrateObserver* observer, Clock* clock) |
| - : clock_(clock), |
| + : BweSender(kMinBitrateKbps), // Referred as "Reference Rate" = R_n. |
| + clock_(clock), |
| observer_(observer), |
| - bitrate_kbps_(kMinRefRateKbps), |
| original_operating_mode_(true) { |
| } |
| @@ -252,23 +207,23 @@ void NadaBweSender::GiveFeedback(const FeedbackPacket& feedback) { |
| if (fb.congestion_signal() == fb.est_queuing_delay_signal_ms() && |
| fb.est_queuing_delay_signal_ms() < kQueuingDelayUpperBoundMs && |
| fb.exp_smoothed_delay_ms() < |
| - kMinRefRateKbps / kProportionalityDelayBits && |
| + kMinBitrateKbps / kProportionalityDelayBits && |
| fb.derivative() < kDerivativeUpperBound && |
| - fb.receiving_rate() > kMinRefRateKbps) { |
| + fb.receiving_rate() > kMinBitrateKbps) { |
| AcceleratedRampUp(fb); |
| } else if (fb.congestion_signal() > kMaxCongestionSignalMs || |
| fb.exp_smoothed_delay_ms() > kMaxCongestionSignalMs) { |
| AcceleratedRampDown(fb); |
| } else { |
| double bitrate_reference = |
| - (2.0 * bitrate_kbps_) / (kMaxRefRateKbps + kMinRefRateKbps); |
| + (2.0 * bitrate_kbps_) / (kMaxBitrateKbps + kMinBitrateKbps); |
| double smoothing_factor = pow(bitrate_reference, 0.75); |
| GradualRateUpdate(fb, delta_s, smoothing_factor); |
| } |
| } |
| - bitrate_kbps_ = std::min(bitrate_kbps_, kMaxRefRateKbps); |
| - bitrate_kbps_ = std::max(bitrate_kbps_, kMinRefRateKbps); |
| + bitrate_kbps_ = std::min(bitrate_kbps_, kMaxBitrateKbps); |
| + bitrate_kbps_ = std::max(bitrate_kbps_, kMinBitrateKbps); |
| observer_->OnNetworkChanged(1000 * bitrate_kbps_, 0, rtt_ms); |
| } |
| @@ -312,11 +267,11 @@ void NadaBweSender::GradualRateUpdate(const NadaFeedback& fb, |
| float x_hat = fb.congestion_signal() + kEta * kTauOMs * fb.derivative(); |
| float kTheta = |
| - kPriorityWeight * (kMaxRefRateKbps - kMinRefRateKbps) * kReferenceDelayMs; |
| + kPriorityWeight * (kMaxBitrateKbps - kMinBitrateKbps) * kReferenceDelayMs; |
| int original_increase = |
| static_cast<int>((kKappa * delta_s * |
| - (kTheta - (bitrate_kbps_ - kMinRefRateKbps) * x_hat)) / |
| + (kTheta - (bitrate_kbps_ - kMinBitrateKbps) * x_hat)) / |
| (kTauOMs * kTauOMs) + |
| 0.5f); |