| 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 |
| 11 #include "webrtc/modules/audio_coding/audio_network_adaptor/audio_network_adapto
r_impl.h" | 11 #include "webrtc/modules/audio_coding/audio_network_adaptor/audio_network_adapto
r_impl.h" |
| 12 | 12 |
| 13 #include <utility> | 13 #include <utility> |
| 14 | 14 |
| 15 #include "webrtc/rtc_base/logging.h" | 15 #include "webrtc/rtc_base/logging.h" |
| 16 #include "webrtc/rtc_base/timeutils.h" | 16 #include "webrtc/rtc_base/timeutils.h" |
| 17 #include "webrtc/system_wrappers/include/field_trial.h" |
| 17 | 18 |
| 18 namespace webrtc { | 19 namespace webrtc { |
| 19 | 20 |
| 20 namespace { | 21 namespace { |
| 21 constexpr int kEventLogMinBitrateChangeBps = 5000; | 22 constexpr int kEventLogMinBitrateChangeBps = 5000; |
| 22 constexpr float kEventLogMinBitrateChangeFraction = 0.25; | 23 constexpr float kEventLogMinBitrateChangeFraction = 0.25; |
| 23 constexpr float kEventLogMinPacketLossChangeFraction = 0.5; | 24 constexpr float kEventLogMinPacketLossChangeFraction = 0.5; |
| 24 } // namespace | 25 } // namespace |
| 25 | 26 |
| 26 AudioNetworkAdaptorImpl::Config::Config() : event_log(nullptr){}; | 27 AudioNetworkAdaptorImpl::Config::Config() : event_log(nullptr){}; |
| 27 | 28 |
| 28 AudioNetworkAdaptorImpl::Config::~Config() = default; | 29 AudioNetworkAdaptorImpl::Config::~Config() = default; |
| 29 | 30 |
| 30 AudioNetworkAdaptorImpl::AudioNetworkAdaptorImpl( | 31 AudioNetworkAdaptorImpl::AudioNetworkAdaptorImpl( |
| 31 const Config& config, | 32 const Config& config, |
| 32 std::unique_ptr<ControllerManager> controller_manager, | 33 std::unique_ptr<ControllerManager> controller_manager, |
| 33 std::unique_ptr<DebugDumpWriter> debug_dump_writer) | 34 std::unique_ptr<DebugDumpWriter> debug_dump_writer) |
| 34 : config_(config), | 35 : config_(config), |
| 35 controller_manager_(std::move(controller_manager)), | 36 controller_manager_(std::move(controller_manager)), |
| 36 debug_dump_writer_(std::move(debug_dump_writer)), | 37 debug_dump_writer_(std::move(debug_dump_writer)), |
| 37 event_log_writer_( | 38 event_log_writer_( |
| 38 config.event_log | 39 config.event_log |
| 39 ? new EventLogWriter(config.event_log, | 40 ? new EventLogWriter(config.event_log, |
| 40 kEventLogMinBitrateChangeBps, | 41 kEventLogMinBitrateChangeBps, |
| 41 kEventLogMinBitrateChangeFraction, | 42 kEventLogMinBitrateChangeFraction, |
| 42 kEventLogMinPacketLossChangeFraction) | 43 kEventLogMinPacketLossChangeFraction) |
| 43 : nullptr) { | 44 : nullptr), |
| 45 enable_bitrate_adaptation_( |
| 46 webrtc::field_trial::IsEnabled("WebRTC-Audio-BitrateAdaptation")), |
| 47 enable_dtx_adaptation_( |
| 48 webrtc::field_trial::IsEnabled("WebRTC-Audio-DtxAdaptation")), |
| 49 enable_fec_adaptation_( |
| 50 webrtc::field_trial::IsEnabled("WebRTC-Audio-FecAdaptation")), |
| 51 enable_channel_adaptation_( |
| 52 webrtc::field_trial::IsEnabled("WebRTC-Audio-ChannelAdaptation")), |
| 53 enable_frame_length_adaptation_(webrtc::field_trial::IsEnabled( |
| 54 "WebRTC-Audio-FrameLengthAdaptation")) { |
| 44 RTC_DCHECK(controller_manager_); | 55 RTC_DCHECK(controller_manager_); |
| 45 } | 56 } |
| 46 | 57 |
| 47 AudioNetworkAdaptorImpl::~AudioNetworkAdaptorImpl() = default; | 58 AudioNetworkAdaptorImpl::~AudioNetworkAdaptorImpl() = default; |
| 48 | 59 |
| 49 void AudioNetworkAdaptorImpl::SetUplinkBandwidth(int uplink_bandwidth_bps) { | 60 void AudioNetworkAdaptorImpl::SetUplinkBandwidth(int uplink_bandwidth_bps) { |
| 50 last_metrics_.uplink_bandwidth_bps = rtc::Optional<int>(uplink_bandwidth_bps); | 61 last_metrics_.uplink_bandwidth_bps = rtc::Optional<int>(uplink_bandwidth_bps); |
| 51 DumpNetworkMetrics(); | 62 DumpNetworkMetrics(); |
| 52 | 63 |
| 53 Controller::NetworkMetrics network_metrics; | 64 Controller::NetworkMetrics network_metrics; |
| (...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 111 rtc::Optional<size_t>(overhead_bytes_per_packet); | 122 rtc::Optional<size_t>(overhead_bytes_per_packet); |
| 112 UpdateNetworkMetrics(network_metrics); | 123 UpdateNetworkMetrics(network_metrics); |
| 113 } | 124 } |
| 114 | 125 |
| 115 AudioEncoderRuntimeConfig AudioNetworkAdaptorImpl::GetEncoderRuntimeConfig() { | 126 AudioEncoderRuntimeConfig AudioNetworkAdaptorImpl::GetEncoderRuntimeConfig() { |
| 116 AudioEncoderRuntimeConfig config; | 127 AudioEncoderRuntimeConfig config; |
| 117 for (auto& controller : | 128 for (auto& controller : |
| 118 controller_manager_->GetSortedControllers(last_metrics_)) | 129 controller_manager_->GetSortedControllers(last_metrics_)) |
| 119 controller->MakeDecision(&config); | 130 controller->MakeDecision(&config); |
| 120 | 131 |
| 132 // Update ANA stats. |
| 133 auto increment_opt = [](rtc::Optional<uint32_t>& a) { |
| 134 a = rtc::Optional<uint32_t>(a.value_or(0) + 1); |
| 135 }; |
| 136 if (prev_config_) { |
| 137 if (config.bitrate_bps != prev_config_->bitrate_bps) { |
| 138 increment_opt(stats_.bitrate_action_counter); |
| 139 } |
| 140 if (config.enable_dtx != prev_config_->enable_dtx) { |
| 141 increment_opt(stats_.dtx_action_counter); |
| 142 } |
| 143 if (config.enable_fec != prev_config_->enable_fec) { |
| 144 increment_opt(stats_.fec_action_counter); |
| 145 } |
| 146 if (config.frame_length_ms && prev_config_->frame_length_ms) { |
| 147 if (*config.frame_length_ms > *prev_config_->frame_length_ms) { |
| 148 increment_opt(stats_.frame_length_increase_counter); |
| 149 } else if (*config.frame_length_ms < *prev_config_->frame_length_ms) { |
| 150 increment_opt(stats_.frame_length_decrease_counter); |
| 151 } |
| 152 } |
| 153 if (config.num_channels != prev_config_->num_channels) { |
| 154 increment_opt(stats_.channel_action_counter); |
| 155 } |
| 156 if (config.uplink_packet_loss_fraction) { |
| 157 stats_.uplink_packet_loss_fraction = |
| 158 rtc::Optional<float>(*config.uplink_packet_loss_fraction); |
| 159 } |
| 160 } |
| 161 prev_config_ = rtc::Optional<AudioEncoderRuntimeConfig>(config); |
| 162 |
| 163 // Prevent certain controllers from taking action (determined by field trials) |
| 164 if (!enable_bitrate_adaptation_ && config.bitrate_bps) { |
| 165 config.bitrate_bps.reset(); |
| 166 } |
| 167 if (!enable_dtx_adaptation_ && config.enable_dtx) { |
| 168 config.enable_dtx.reset(); |
| 169 } |
| 170 if (!enable_fec_adaptation_ && config.enable_fec) { |
| 171 config.enable_fec.reset(); |
| 172 config.uplink_packet_loss_fraction.reset(); |
| 173 } |
| 174 if (!enable_frame_length_adaptation_ && config.frame_length_ms) { |
| 175 config.frame_length_ms.reset(); |
| 176 } |
| 177 if (!enable_channel_adaptation_ && config.num_channels) { |
| 178 config.num_channels.reset(); |
| 179 } |
| 180 |
| 121 if (debug_dump_writer_) | 181 if (debug_dump_writer_) |
| 122 debug_dump_writer_->DumpEncoderRuntimeConfig(config, rtc::TimeMillis()); | 182 debug_dump_writer_->DumpEncoderRuntimeConfig(config, rtc::TimeMillis()); |
| 123 | 183 |
| 124 if (event_log_writer_) | 184 if (event_log_writer_) |
| 125 event_log_writer_->MaybeLogEncoderConfig(config); | 185 event_log_writer_->MaybeLogEncoderConfig(config); |
| 126 | 186 |
| 127 return config; | 187 return config; |
| 128 } | 188 } |
| 129 | 189 |
| 130 void AudioNetworkAdaptorImpl::StartDebugDump(FILE* file_handle) { | 190 void AudioNetworkAdaptorImpl::StartDebugDump(FILE* file_handle) { |
| 131 debug_dump_writer_ = DebugDumpWriter::Create(file_handle); | 191 debug_dump_writer_ = DebugDumpWriter::Create(file_handle); |
| 132 } | 192 } |
| 133 | 193 |
| 134 void AudioNetworkAdaptorImpl::StopDebugDump() { | 194 void AudioNetworkAdaptorImpl::StopDebugDump() { |
| 135 debug_dump_writer_.reset(nullptr); | 195 debug_dump_writer_.reset(nullptr); |
| 136 } | 196 } |
| 137 | 197 |
| 138 ANAStats AudioNetworkAdaptorImpl::GetStats() const { | 198 ANAStats AudioNetworkAdaptorImpl::GetStats() const { |
| 139 // TODO(ivoc): Actually implement the stat. | 199 return stats_; |
| 140 // Tracking bug: https://crbug.com/webrtc/8127 | |
| 141 return ANAStats(); | |
| 142 } | 200 } |
| 143 | 201 |
| 144 void AudioNetworkAdaptorImpl::DumpNetworkMetrics() { | 202 void AudioNetworkAdaptorImpl::DumpNetworkMetrics() { |
| 145 if (debug_dump_writer_) | 203 if (debug_dump_writer_) |
| 146 debug_dump_writer_->DumpNetworkMetrics(last_metrics_, rtc::TimeMillis()); | 204 debug_dump_writer_->DumpNetworkMetrics(last_metrics_, rtc::TimeMillis()); |
| 147 } | 205 } |
| 148 | 206 |
| 149 void AudioNetworkAdaptorImpl::UpdateNetworkMetrics( | 207 void AudioNetworkAdaptorImpl::UpdateNetworkMetrics( |
| 150 const Controller::NetworkMetrics& network_metrics) { | 208 const Controller::NetworkMetrics& network_metrics) { |
| 151 for (auto& controller : controller_manager_->GetControllers()) | 209 for (auto& controller : controller_manager_->GetControllers()) |
| 152 controller->UpdateNetworkMetrics(network_metrics); | 210 controller->UpdateNetworkMetrics(network_metrics); |
| 153 } | 211 } |
| 154 | 212 |
| 155 } // namespace webrtc | 213 } // namespace webrtc |
| OLD | NEW |