blob: 9e47a06f7cac9c3bdfafe549f114c3697fe3232a [file] [log] [blame]
minyuecaa9cb22016-09-13 13:34:15 -07001/*
2 * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.
3 *
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
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
9 */
10
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020011#include "modules/audio_coding/audio_network_adaptor/audio_network_adaptor_impl.h"
minyue161b3902016-09-22 14:16:55 -070012
Yves Gerey988cc082018-10-23 12:03:01 +020013#include <stdint.h>
minyue25f6a392016-09-22 22:23:20 -070014#include <utility>
Yves Gerey988cc082018-10-23 12:03:01 +020015#include <vector>
minyue25f6a392016-09-22 22:23:20 -070016
Yves Gerey988cc082018-10-23 12:03:01 +020017#include "modules/audio_coding/audio_network_adaptor/controller_manager.h"
18#include "modules/audio_coding/audio_network_adaptor/debug_dump_writer.h"
19#include "modules/audio_coding/audio_network_adaptor/event_log_writer.h"
20#include "rtc_base/checks.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020021#include "rtc_base/timeutils.h"
22#include "system_wrappers/include/field_trial.h"
minyue4b7c9522017-01-24 04:54:59 -080023
minyuecaa9cb22016-09-13 13:34:15 -070024namespace webrtc {
25
minyue4b7c9522017-01-24 04:54:59 -080026namespace {
27constexpr int kEventLogMinBitrateChangeBps = 5000;
28constexpr float kEventLogMinBitrateChangeFraction = 0.25;
29constexpr float kEventLogMinPacketLossChangeFraction = 0.5;
30} // namespace
31
michaelt92aef172017-04-18 00:11:48 -070032AudioNetworkAdaptorImpl::Config::Config() : event_log(nullptr){};
minyuecaa9cb22016-09-13 13:34:15 -070033
34AudioNetworkAdaptorImpl::Config::~Config() = default;
35
36AudioNetworkAdaptorImpl::AudioNetworkAdaptorImpl(
37 const Config& config,
minyue25f6a392016-09-22 22:23:20 -070038 std::unique_ptr<ControllerManager> controller_manager,
39 std::unique_ptr<DebugDumpWriter> debug_dump_writer)
40 : config_(config),
41 controller_manager_(std::move(controller_manager)),
minyue4b7c9522017-01-24 04:54:59 -080042 debug_dump_writer_(std::move(debug_dump_writer)),
43 event_log_writer_(
44 config.event_log
45 ? new EventLogWriter(config.event_log,
46 kEventLogMinBitrateChangeBps,
47 kEventLogMinBitrateChangeFraction,
48 kEventLogMinPacketLossChangeFraction)
Minyue Lif40150d2018-11-21 21:39:54 +010049 : nullptr) {
minyuecaa9cb22016-09-13 13:34:15 -070050 RTC_DCHECK(controller_manager_);
51}
52
53AudioNetworkAdaptorImpl::~AudioNetworkAdaptorImpl() = default;
54
55void AudioNetworkAdaptorImpl::SetUplinkBandwidth(int uplink_bandwidth_bps) {
Oskar Sundbom12ab00b2017-11-16 15:31:38 +010056 last_metrics_.uplink_bandwidth_bps = uplink_bandwidth_bps;
minyue25f6a392016-09-22 22:23:20 -070057 DumpNetworkMetrics();
minyuea6a6d652017-01-30 10:50:00 -080058
59 Controller::NetworkMetrics network_metrics;
Oskar Sundbom12ab00b2017-11-16 15:31:38 +010060 network_metrics.uplink_bandwidth_bps = uplink_bandwidth_bps;
minyuea6a6d652017-01-30 10:50:00 -080061 UpdateNetworkMetrics(network_metrics);
minyuecaa9cb22016-09-13 13:34:15 -070062}
63
64void AudioNetworkAdaptorImpl::SetUplinkPacketLossFraction(
65 float uplink_packet_loss_fraction) {
Oskar Sundbom12ab00b2017-11-16 15:31:38 +010066 last_metrics_.uplink_packet_loss_fraction = uplink_packet_loss_fraction;
minyue25f6a392016-09-22 22:23:20 -070067 DumpNetworkMetrics();
minyuea6a6d652017-01-30 10:50:00 -080068
69 Controller::NetworkMetrics network_metrics;
Oskar Sundbom12ab00b2017-11-16 15:31:38 +010070 network_metrics.uplink_packet_loss_fraction = uplink_packet_loss_fraction;
minyuea6a6d652017-01-30 10:50:00 -080071 UpdateNetworkMetrics(network_metrics);
minyue25f6a392016-09-22 22:23:20 -070072}
minyuecaa9cb22016-09-13 13:34:15 -070073
elad.alondadb4dc2017-03-23 15:29:50 -070074void AudioNetworkAdaptorImpl::SetUplinkRecoverablePacketLossFraction(
75 float uplink_recoverable_packet_loss_fraction) {
76 last_metrics_.uplink_recoverable_packet_loss_fraction =
Oskar Sundbom12ab00b2017-11-16 15:31:38 +010077 uplink_recoverable_packet_loss_fraction;
elad.alondadb4dc2017-03-23 15:29:50 -070078 DumpNetworkMetrics();
79
80 Controller::NetworkMetrics network_metrics;
81 network_metrics.uplink_recoverable_packet_loss_fraction =
Oskar Sundbom12ab00b2017-11-16 15:31:38 +010082 uplink_recoverable_packet_loss_fraction;
elad.alondadb4dc2017-03-23 15:29:50 -070083 UpdateNetworkMetrics(network_metrics);
84}
85
minyuec9e80ee2016-11-29 13:00:28 -080086void AudioNetworkAdaptorImpl::SetRtt(int rtt_ms) {
Oskar Sundbom12ab00b2017-11-16 15:31:38 +010087 last_metrics_.rtt_ms = rtt_ms;
minyuec9e80ee2016-11-29 13:00:28 -080088 DumpNetworkMetrics();
minyuea6a6d652017-01-30 10:50:00 -080089
90 Controller::NetworkMetrics network_metrics;
Oskar Sundbom12ab00b2017-11-16 15:31:38 +010091 network_metrics.rtt_ms = rtt_ms;
minyuea6a6d652017-01-30 10:50:00 -080092 UpdateNetworkMetrics(network_metrics);
minyuec9e80ee2016-11-29 13:00:28 -080093}
94
minyuee5e632f2016-09-27 12:54:19 -070095void AudioNetworkAdaptorImpl::SetTargetAudioBitrate(
96 int target_audio_bitrate_bps) {
Oskar Sundbom12ab00b2017-11-16 15:31:38 +010097 last_metrics_.target_audio_bitrate_bps = target_audio_bitrate_bps;
minyuee5e632f2016-09-27 12:54:19 -070098 DumpNetworkMetrics();
minyuea6a6d652017-01-30 10:50:00 -080099
100 Controller::NetworkMetrics network_metrics;
Oskar Sundbom12ab00b2017-11-16 15:31:38 +0100101 network_metrics.target_audio_bitrate_bps = target_audio_bitrate_bps;
minyuea6a6d652017-01-30 10:50:00 -0800102 UpdateNetworkMetrics(network_metrics);
minyuee5e632f2016-09-27 12:54:19 -0700103}
104
minyuec9e80ee2016-11-29 13:00:28 -0800105void AudioNetworkAdaptorImpl::SetOverhead(size_t overhead_bytes_per_packet) {
Oskar Sundbom12ab00b2017-11-16 15:31:38 +0100106 last_metrics_.overhead_bytes_per_packet = overhead_bytes_per_packet;
minyue25f6a392016-09-22 22:23:20 -0700107 DumpNetworkMetrics();
minyuea6a6d652017-01-30 10:50:00 -0800108
109 Controller::NetworkMetrics network_metrics;
Oskar Sundbom12ab00b2017-11-16 15:31:38 +0100110 network_metrics.overhead_bytes_per_packet = overhead_bytes_per_packet;
minyuea6a6d652017-01-30 10:50:00 -0800111 UpdateNetworkMetrics(network_metrics);
minyuecaa9cb22016-09-13 13:34:15 -0700112}
113
michaeltcde46b72017-04-06 05:59:10 -0700114AudioEncoderRuntimeConfig AudioNetworkAdaptorImpl::GetEncoderRuntimeConfig() {
115 AudioEncoderRuntimeConfig config;
minyuecaa9cb22016-09-13 13:34:15 -0700116 for (auto& controller :
117 controller_manager_->GetSortedControllers(last_metrics_))
minyuea6a6d652017-01-30 10:50:00 -0800118 controller->MakeDecision(&config);
minyuecaa9cb22016-09-13 13:34:15 -0700119
ivoc17289092017-09-09 08:45:40 -0700120 // Update ANA stats.
Danil Chapovalovb6021232018-06-19 13:26:36 +0200121 auto increment_opt = [](absl::optional<uint32_t>& a) {
Oskar Sundbom12ab00b2017-11-16 15:31:38 +0100122 a = a.value_or(0) + 1;
ivoc17289092017-09-09 08:45:40 -0700123 };
124 if (prev_config_) {
125 if (config.bitrate_bps != prev_config_->bitrate_bps) {
126 increment_opt(stats_.bitrate_action_counter);
127 }
128 if (config.enable_dtx != prev_config_->enable_dtx) {
129 increment_opt(stats_.dtx_action_counter);
130 }
131 if (config.enable_fec != prev_config_->enable_fec) {
132 increment_opt(stats_.fec_action_counter);
133 }
134 if (config.frame_length_ms && prev_config_->frame_length_ms) {
135 if (*config.frame_length_ms > *prev_config_->frame_length_ms) {
136 increment_opt(stats_.frame_length_increase_counter);
137 } else if (*config.frame_length_ms < *prev_config_->frame_length_ms) {
138 increment_opt(stats_.frame_length_decrease_counter);
139 }
140 }
141 if (config.num_channels != prev_config_->num_channels) {
142 increment_opt(stats_.channel_action_counter);
143 }
144 if (config.uplink_packet_loss_fraction) {
Oskar Sundbom12ab00b2017-11-16 15:31:38 +0100145 stats_.uplink_packet_loss_fraction = *config.uplink_packet_loss_fraction;
ivoc17289092017-09-09 08:45:40 -0700146 }
147 }
Oskar Sundbom12ab00b2017-11-16 15:31:38 +0100148 prev_config_ = config;
ivoc17289092017-09-09 08:45:40 -0700149
minyue25f6a392016-09-22 22:23:20 -0700150 if (debug_dump_writer_)
michaelt92aef172017-04-18 00:11:48 -0700151 debug_dump_writer_->DumpEncoderRuntimeConfig(config, rtc::TimeMillis());
minyuecaa9cb22016-09-13 13:34:15 -0700152
minyue4b7c9522017-01-24 04:54:59 -0800153 if (event_log_writer_)
154 event_log_writer_->MaybeLogEncoderConfig(config);
155
minyuecaa9cb22016-09-13 13:34:15 -0700156 return config;
157}
158
minyuecaa9cb22016-09-13 13:34:15 -0700159void AudioNetworkAdaptorImpl::StartDebugDump(FILE* file_handle) {
minyue25f6a392016-09-22 22:23:20 -0700160 debug_dump_writer_ = DebugDumpWriter::Create(file_handle);
161}
162
163void AudioNetworkAdaptorImpl::StopDebugDump() {
164 debug_dump_writer_.reset(nullptr);
165}
166
ivoce1198e02017-09-08 08:13:19 -0700167ANAStats AudioNetworkAdaptorImpl::GetStats() const {
ivoc17289092017-09-09 08:45:40 -0700168 return stats_;
ivoce1198e02017-09-08 08:13:19 -0700169}
170
minyue25f6a392016-09-22 22:23:20 -0700171void AudioNetworkAdaptorImpl::DumpNetworkMetrics() {
172 if (debug_dump_writer_)
michaelt92aef172017-04-18 00:11:48 -0700173 debug_dump_writer_->DumpNetworkMetrics(last_metrics_, rtc::TimeMillis());
minyuecaa9cb22016-09-13 13:34:15 -0700174}
175
minyuea6a6d652017-01-30 10:50:00 -0800176void AudioNetworkAdaptorImpl::UpdateNetworkMetrics(
177 const Controller::NetworkMetrics& network_metrics) {
178 for (auto& controller : controller_manager_->GetControllers())
179 controller->UpdateNetworkMetrics(network_metrics);
180}
181
minyuecaa9cb22016-09-13 13:34:15 -0700182} // namespace webrtc