| OLD | NEW | 
|    1 /* |    1 /* | 
|    2  *  Copyright (c) 2016 The WebRTC project authors. All Rights Reserved. |    2  *  Copyright (c) 2016 The WebRTC project authors. All Rights Reserved. | 
|    3  * |    3  * | 
|    4  *  Use of this source code is governed by a BSD-style license |    4  *  Use of this source code is governed by a BSD-style license | 
|    5  *  that can be found in the LICENSE file in the root of the source |    5  *  that can be found in the LICENSE file in the root of the source | 
|    6  *  tree. An additional intellectual property rights grant can be found |    6  *  tree. An additional intellectual property rights grant can be found | 
|    7  *  in the file PATENTS.  All contributing project authors may |    7  *  in the file PATENTS.  All contributing project authors may | 
|    8  *  be found in the AUTHORS file in the root of the source tree. |    8  *  be found in the AUTHORS file in the root of the source tree. | 
|    9  */ |    9  */ | 
|   10  |   10  | 
| (...skipping 19 matching lines...) Expand all  Loading... | 
|   30                               const Threshold& fec_enabling_threshold, |   30                               const Threshold& fec_enabling_threshold, | 
|   31                               const Threshold& fec_disabling_threshold, |   31                               const Threshold& fec_disabling_threshold, | 
|   32                               int time_constant_ms, |   32                               int time_constant_ms, | 
|   33                               const Clock* clock) |   33                               const Clock* clock) | 
|   34     : initial_fec_enabled(initial_fec_enabled), |   34     : initial_fec_enabled(initial_fec_enabled), | 
|   35       fec_enabling_threshold(fec_enabling_threshold), |   35       fec_enabling_threshold(fec_enabling_threshold), | 
|   36       fec_disabling_threshold(fec_disabling_threshold), |   36       fec_disabling_threshold(fec_disabling_threshold), | 
|   37       time_constant_ms(time_constant_ms), |   37       time_constant_ms(time_constant_ms), | 
|   38       clock(clock) {} |   38       clock(clock) {} | 
|   39  |   39  | 
|   40 FecController::FecController(const Config& config) |   40 FecController::FecController(const Config& config, | 
 |   41                              std::unique_ptr<SmoothingFilter> smoothing_filter) | 
|   41     : config_(config), |   42     : config_(config), | 
|   42       fec_enabled_(config.initial_fec_enabled), |   43       fec_enabled_(config.initial_fec_enabled), | 
|   43       packet_loss_smoothed_( |   44       packet_loss_smoother_(std::move(smoothing_filter)), | 
|   44           new SmoothingFilterImpl(config_.time_constant_ms, config_.clock)), |  | 
|   45       fec_enabling_threshold_info_(config_.fec_enabling_threshold), |   45       fec_enabling_threshold_info_(config_.fec_enabling_threshold), | 
|   46       fec_disabling_threshold_info_(config_.fec_disabling_threshold) { |   46       fec_disabling_threshold_info_(config_.fec_disabling_threshold) { | 
|   47   RTC_DCHECK_LE(fec_enabling_threshold_info_.slope, 0); |   47   RTC_DCHECK_LE(fec_enabling_threshold_info_.slope, 0); | 
|   48   RTC_DCHECK_LE(fec_enabling_threshold_info_.slope, 0); |   48   RTC_DCHECK_LE(fec_enabling_threshold_info_.slope, 0); | 
|   49   RTC_DCHECK_LE( |   49   RTC_DCHECK_LE( | 
|   50       GetPacketLossThreshold(config_.fec_enabling_threshold.low_bandwidth_bps, |   50       GetPacketLossThreshold(config_.fec_enabling_threshold.low_bandwidth_bps, | 
|   51                              config_.fec_disabling_threshold, |   51                              config_.fec_disabling_threshold, | 
|   52                              fec_disabling_threshold_info_), |   52                              fec_disabling_threshold_info_), | 
|   53       config_.fec_enabling_threshold.low_bandwidth_packet_loss); |   53       config_.fec_enabling_threshold.low_bandwidth_packet_loss); | 
|   54   RTC_DCHECK_LE( |   54   RTC_DCHECK_LE( | 
|   55       GetPacketLossThreshold(config_.fec_enabling_threshold.high_bandwidth_bps, |   55       GetPacketLossThreshold(config_.fec_enabling_threshold.high_bandwidth_bps, | 
|   56                              config_.fec_disabling_threshold, |   56                              config_.fec_disabling_threshold, | 
|   57                              fec_disabling_threshold_info_), |   57                              fec_disabling_threshold_info_), | 
|   58       config_.fec_enabling_threshold.high_bandwidth_packet_loss); |   58       config_.fec_enabling_threshold.high_bandwidth_packet_loss); | 
|   59 } |   59 } | 
|   60  |   60  | 
|   61 FecController::FecController(const Config& config, |   61 FecController::FecController(const Config& config) | 
|   62                              std::unique_ptr<SmoothingFilter> smoothing_filter) |   62     : FecController( | 
|   63     : FecController(config) { |   63           config, | 
|   64   packet_loss_smoothed_ = std::move(smoothing_filter); |   64           std::unique_ptr<SmoothingFilter>( | 
 |   65               new SmoothingFilterImpl(config.time_constant_ms, config.clock))) { | 
|   65 } |   66 } | 
|   66  |   67  | 
|   67 FecController::~FecController() = default; |   68 FecController::~FecController() = default; | 
|   68  |   69  | 
 |   70 void FecController::UpdateNetworkMetrics( | 
 |   71     const NetworkMetrics& network_metrics) { | 
 |   72   if (network_metrics.uplink_bandwidth_bps) | 
 |   73     uplink_bandwidth_bps_ = network_metrics.uplink_bandwidth_bps; | 
 |   74   if (network_metrics.uplink_packet_loss_fraction) { | 
 |   75     packet_loss_smoother_->AddSample( | 
 |   76         *network_metrics.uplink_packet_loss_fraction); | 
 |   77   } | 
 |   78 } | 
 |   79  | 
|   69 void FecController::MakeDecision( |   80 void FecController::MakeDecision( | 
|   70     const NetworkMetrics& metrics, |  | 
|   71     AudioNetworkAdaptor::EncoderRuntimeConfig* config) { |   81     AudioNetworkAdaptor::EncoderRuntimeConfig* config) { | 
|   72   RTC_DCHECK(!config->enable_fec); |   82   RTC_DCHECK(!config->enable_fec); | 
|   73   RTC_DCHECK(!config->uplink_packet_loss_fraction); |   83   RTC_DCHECK(!config->uplink_packet_loss_fraction); | 
|   74  |   84  | 
|   75   if (metrics.uplink_packet_loss_fraction) |   85   const auto& packet_loss = packet_loss_smoother_->GetAverage(); | 
|   76     packet_loss_smoothed_->AddSample(*metrics.uplink_packet_loss_fraction); |  | 
|   77  |   86  | 
|   78   const auto& packet_loss = packet_loss_smoothed_->GetAverage(); |   87   fec_enabled_ = fec_enabled_ ? !FecDisablingDecision(packet_loss) | 
|   79  |   88                               : FecEnablingDecision(packet_loss); | 
|   80   fec_enabled_ = fec_enabled_ ? !FecDisablingDecision(metrics, packet_loss) |  | 
|   81                               : FecEnablingDecision(metrics, packet_loss); |  | 
|   82  |   89  | 
|   83   config->enable_fec = rtc::Optional<bool>(fec_enabled_); |   90   config->enable_fec = rtc::Optional<bool>(fec_enabled_); | 
|   84  |   91  | 
|   85   auto packet_loss_fraction = packet_loss_smoothed_->GetAverage(); |   92   config->uplink_packet_loss_fraction = | 
|   86   config->uplink_packet_loss_fraction = rtc::Optional<float>( |   93       rtc::Optional<float>(packet_loss ? *packet_loss : 0.0); | 
|   87       packet_loss_fraction ? *packet_loss_fraction : 0.0); |  | 
|   88 } |   94 } | 
|   89  |   95  | 
|   90 FecController::ThresholdInfo::ThresholdInfo( |   96 FecController::ThresholdInfo::ThresholdInfo( | 
|   91     const Config::Threshold& threshold) { |   97     const Config::Threshold& threshold) { | 
|   92   int bandwidth_diff_bps = |   98   int bandwidth_diff_bps = | 
|   93       threshold.high_bandwidth_bps - threshold.low_bandwidth_bps; |   99       threshold.high_bandwidth_bps - threshold.low_bandwidth_bps; | 
|   94   float packet_loss_diff = threshold.high_bandwidth_packet_loss - |  100   float packet_loss_diff = threshold.high_bandwidth_packet_loss - | 
|   95                            threshold.low_bandwidth_packet_loss; |  101                            threshold.low_bandwidth_packet_loss; | 
|   96   slope = bandwidth_diff_bps == 0 ? 0.0 : packet_loss_diff / bandwidth_diff_bps; |  102   slope = bandwidth_diff_bps == 0 ? 0.0 : packet_loss_diff / bandwidth_diff_bps; | 
|   97   offset = |  103   offset = | 
|   98       threshold.low_bandwidth_packet_loss - slope * threshold.low_bandwidth_bps; |  104       threshold.low_bandwidth_packet_loss - slope * threshold.low_bandwidth_bps; | 
|   99 } |  105 } | 
|  100  |  106  | 
|  101 float FecController::GetPacketLossThreshold( |  107 float FecController::GetPacketLossThreshold( | 
|  102     int bandwidth_bps, |  108     int bandwidth_bps, | 
|  103     const Config::Threshold& threshold, |  109     const Config::Threshold& threshold, | 
|  104     const ThresholdInfo& threshold_info) const { |  110     const ThresholdInfo& threshold_info) const { | 
|  105   if (bandwidth_bps < threshold.low_bandwidth_bps) |  111   if (bandwidth_bps < threshold.low_bandwidth_bps) | 
|  106     return std::numeric_limits<float>::max(); |  112     return std::numeric_limits<float>::max(); | 
|  107   if (bandwidth_bps >= threshold.high_bandwidth_bps) |  113   if (bandwidth_bps >= threshold.high_bandwidth_bps) | 
|  108     return threshold.high_bandwidth_packet_loss; |  114     return threshold.high_bandwidth_packet_loss; | 
|  109   return threshold_info.offset + threshold_info.slope * bandwidth_bps; |  115   return threshold_info.offset + threshold_info.slope * bandwidth_bps; | 
|  110 } |  116 } | 
|  111  |  117  | 
|  112 bool FecController::FecEnablingDecision( |  118 bool FecController::FecEnablingDecision( | 
|  113     const NetworkMetrics& metrics, |  | 
|  114     const rtc::Optional<float>& packet_loss) const { |  119     const rtc::Optional<float>& packet_loss) const { | 
|  115   if (!metrics.uplink_bandwidth_bps) |  120   if (!uplink_bandwidth_bps_) | 
|  116     return false; |  121     return false; | 
|  117   if (!packet_loss) |  122   if (!packet_loss) | 
|  118     return false; |  123     return false; | 
|  119   return *packet_loss >= GetPacketLossThreshold(*metrics.uplink_bandwidth_bps, |  124   return *packet_loss >= GetPacketLossThreshold(*uplink_bandwidth_bps_, | 
|  120                                                 config_.fec_enabling_threshold, |  125                                                 config_.fec_enabling_threshold, | 
|  121                                                 fec_enabling_threshold_info_); |  126                                                 fec_enabling_threshold_info_); | 
|  122 } |  127 } | 
|  123  |  128  | 
|  124 bool FecController::FecDisablingDecision( |  129 bool FecController::FecDisablingDecision( | 
|  125     const NetworkMetrics& metrics, |  | 
|  126     const rtc::Optional<float>& packet_loss) const { |  130     const rtc::Optional<float>& packet_loss) const { | 
|  127   if (!metrics.uplink_bandwidth_bps) |  131   if (!uplink_bandwidth_bps_) | 
|  128     return false; |  132     return false; | 
|  129   if (!packet_loss) |  133   if (!packet_loss) | 
|  130     return false; |  134     return false; | 
|  131   return *packet_loss <= GetPacketLossThreshold(*metrics.uplink_bandwidth_bps, |  135   return *packet_loss <= GetPacketLossThreshold(*uplink_bandwidth_bps_, | 
|  132                                                 config_.fec_disabling_threshold, |  136                                                 config_.fec_disabling_threshold, | 
|  133                                                 fec_disabling_threshold_info_); |  137                                                 fec_disabling_threshold_info_); | 
|  134 } |  138 } | 
|  135  |  139  | 
|  136 }  // namespace webrtc |  140 }  // namespace webrtc | 
| OLD | NEW |