blob: 11f93e617a675708fe29fe185e5117b996e903d6 [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>
Jonas Olssona4d87372019-07-05 19:08:33 +020014
minyue25f6a392016-09-22 22:23:20 -070015#include <utility>
Yves Gerey988cc082018-10-23 12:03:01 +020016#include <vector>
minyue25f6a392016-09-22 22:23:20 -070017
Yves Gerey988cc082018-10-23 12:03:01 +020018#include "modules/audio_coding/audio_network_adaptor/controller_manager.h"
19#include "modules/audio_coding/audio_network_adaptor/debug_dump_writer.h"
20#include "modules/audio_coding/audio_network_adaptor/event_log_writer.h"
21#include "rtc_base/checks.h"
Steve Anton10542f22019-01-11 09:11:00 -080022#include "rtc_base/time_utils.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020023#include "system_wrappers/include/field_trial.h"
minyue4b7c9522017-01-24 04:54:59 -080024
minyuecaa9cb22016-09-13 13:34:15 -070025namespace webrtc {
26
minyue4b7c9522017-01-24 04:54:59 -080027namespace {
28constexpr int kEventLogMinBitrateChangeBps = 5000;
29constexpr float kEventLogMinBitrateChangeFraction = 0.25;
30constexpr float kEventLogMinPacketLossChangeFraction = 0.5;
31} // namespace
32
Nico Weber22f99252019-02-20 10:13:16 -050033AudioNetworkAdaptorImpl::Config::Config() : event_log(nullptr) {}
minyuecaa9cb22016-09-13 13:34:15 -070034
35AudioNetworkAdaptorImpl::Config::~Config() = default;
36
37AudioNetworkAdaptorImpl::AudioNetworkAdaptorImpl(
38 const Config& config,
minyue25f6a392016-09-22 22:23:20 -070039 std::unique_ptr<ControllerManager> controller_manager,
40 std::unique_ptr<DebugDumpWriter> debug_dump_writer)
41 : config_(config),
42 controller_manager_(std::move(controller_manager)),
minyue4b7c9522017-01-24 04:54:59 -080043 debug_dump_writer_(std::move(debug_dump_writer)),
44 event_log_writer_(
45 config.event_log
46 ? new EventLogWriter(config.event_log,
47 kEventLogMinBitrateChangeBps,
48 kEventLogMinBitrateChangeFraction,
49 kEventLogMinPacketLossChangeFraction)
Minyue Lif40150d2018-11-21 21:39:54 +010050 : nullptr) {
minyuecaa9cb22016-09-13 13:34:15 -070051 RTC_DCHECK(controller_manager_);
52}
53
54AudioNetworkAdaptorImpl::~AudioNetworkAdaptorImpl() = default;
55
56void AudioNetworkAdaptorImpl::SetUplinkBandwidth(int uplink_bandwidth_bps) {
Oskar Sundbom12ab00b2017-11-16 15:31:38 +010057 last_metrics_.uplink_bandwidth_bps = uplink_bandwidth_bps;
minyue25f6a392016-09-22 22:23:20 -070058 DumpNetworkMetrics();
minyuea6a6d652017-01-30 10:50:00 -080059
60 Controller::NetworkMetrics network_metrics;
Oskar Sundbom12ab00b2017-11-16 15:31:38 +010061 network_metrics.uplink_bandwidth_bps = uplink_bandwidth_bps;
minyuea6a6d652017-01-30 10:50:00 -080062 UpdateNetworkMetrics(network_metrics);
minyuecaa9cb22016-09-13 13:34:15 -070063}
64
65void AudioNetworkAdaptorImpl::SetUplinkPacketLossFraction(
66 float uplink_packet_loss_fraction) {
Oskar Sundbom12ab00b2017-11-16 15:31:38 +010067 last_metrics_.uplink_packet_loss_fraction = uplink_packet_loss_fraction;
minyue25f6a392016-09-22 22:23:20 -070068 DumpNetworkMetrics();
minyuea6a6d652017-01-30 10:50:00 -080069
70 Controller::NetworkMetrics network_metrics;
Oskar Sundbom12ab00b2017-11-16 15:31:38 +010071 network_metrics.uplink_packet_loss_fraction = uplink_packet_loss_fraction;
minyuea6a6d652017-01-30 10:50:00 -080072 UpdateNetworkMetrics(network_metrics);
minyue25f6a392016-09-22 22:23:20 -070073}
minyuecaa9cb22016-09-13 13:34:15 -070074
elad.alondadb4dc2017-03-23 15:29:50 -070075void AudioNetworkAdaptorImpl::SetUplinkRecoverablePacketLossFraction(
76 float uplink_recoverable_packet_loss_fraction) {
77 last_metrics_.uplink_recoverable_packet_loss_fraction =
Oskar Sundbom12ab00b2017-11-16 15:31:38 +010078 uplink_recoverable_packet_loss_fraction;
elad.alondadb4dc2017-03-23 15:29:50 -070079 DumpNetworkMetrics();
80
81 Controller::NetworkMetrics network_metrics;
82 network_metrics.uplink_recoverable_packet_loss_fraction =
Oskar Sundbom12ab00b2017-11-16 15:31:38 +010083 uplink_recoverable_packet_loss_fraction;
elad.alondadb4dc2017-03-23 15:29:50 -070084 UpdateNetworkMetrics(network_metrics);
85}
86
minyuec9e80ee2016-11-29 13:00:28 -080087void AudioNetworkAdaptorImpl::SetRtt(int rtt_ms) {
Oskar Sundbom12ab00b2017-11-16 15:31:38 +010088 last_metrics_.rtt_ms = rtt_ms;
minyuec9e80ee2016-11-29 13:00:28 -080089 DumpNetworkMetrics();
minyuea6a6d652017-01-30 10:50:00 -080090
91 Controller::NetworkMetrics network_metrics;
Oskar Sundbom12ab00b2017-11-16 15:31:38 +010092 network_metrics.rtt_ms = rtt_ms;
minyuea6a6d652017-01-30 10:50:00 -080093 UpdateNetworkMetrics(network_metrics);
minyuec9e80ee2016-11-29 13:00:28 -080094}
95
minyuee5e632f2016-09-27 12:54:19 -070096void AudioNetworkAdaptorImpl::SetTargetAudioBitrate(
97 int target_audio_bitrate_bps) {
Oskar Sundbom12ab00b2017-11-16 15:31:38 +010098 last_metrics_.target_audio_bitrate_bps = target_audio_bitrate_bps;
minyuee5e632f2016-09-27 12:54:19 -070099 DumpNetworkMetrics();
minyuea6a6d652017-01-30 10:50:00 -0800100
101 Controller::NetworkMetrics network_metrics;
Oskar Sundbom12ab00b2017-11-16 15:31:38 +0100102 network_metrics.target_audio_bitrate_bps = target_audio_bitrate_bps;
minyuea6a6d652017-01-30 10:50:00 -0800103 UpdateNetworkMetrics(network_metrics);
minyuee5e632f2016-09-27 12:54:19 -0700104}
105
minyuec9e80ee2016-11-29 13:00:28 -0800106void AudioNetworkAdaptorImpl::SetOverhead(size_t overhead_bytes_per_packet) {
Oskar Sundbom12ab00b2017-11-16 15:31:38 +0100107 last_metrics_.overhead_bytes_per_packet = overhead_bytes_per_packet;
minyue25f6a392016-09-22 22:23:20 -0700108 DumpNetworkMetrics();
minyuea6a6d652017-01-30 10:50:00 -0800109
110 Controller::NetworkMetrics network_metrics;
Oskar Sundbom12ab00b2017-11-16 15:31:38 +0100111 network_metrics.overhead_bytes_per_packet = overhead_bytes_per_packet;
minyuea6a6d652017-01-30 10:50:00 -0800112 UpdateNetworkMetrics(network_metrics);
minyuecaa9cb22016-09-13 13:34:15 -0700113}
114
michaeltcde46b72017-04-06 05:59:10 -0700115AudioEncoderRuntimeConfig AudioNetworkAdaptorImpl::GetEncoderRuntimeConfig() {
116 AudioEncoderRuntimeConfig config;
minyuecaa9cb22016-09-13 13:34:15 -0700117 for (auto& controller :
118 controller_manager_->GetSortedControllers(last_metrics_))
minyuea6a6d652017-01-30 10:50:00 -0800119 controller->MakeDecision(&config);
minyuecaa9cb22016-09-13 13:34:15 -0700120
ivoc17289092017-09-09 08:45:40 -0700121 // Update ANA stats.
Danil Chapovalovb6021232018-06-19 13:26:36 +0200122 auto increment_opt = [](absl::optional<uint32_t>& a) {
Oskar Sundbom12ab00b2017-11-16 15:31:38 +0100123 a = a.value_or(0) + 1;
ivoc17289092017-09-09 08:45:40 -0700124 };
125 if (prev_config_) {
126 if (config.bitrate_bps != prev_config_->bitrate_bps) {
127 increment_opt(stats_.bitrate_action_counter);
128 }
129 if (config.enable_dtx != prev_config_->enable_dtx) {
130 increment_opt(stats_.dtx_action_counter);
131 }
132 if (config.enable_fec != prev_config_->enable_fec) {
133 increment_opt(stats_.fec_action_counter);
134 }
135 if (config.frame_length_ms && prev_config_->frame_length_ms) {
136 if (*config.frame_length_ms > *prev_config_->frame_length_ms) {
137 increment_opt(stats_.frame_length_increase_counter);
138 } else if (*config.frame_length_ms < *prev_config_->frame_length_ms) {
139 increment_opt(stats_.frame_length_decrease_counter);
140 }
141 }
142 if (config.num_channels != prev_config_->num_channels) {
143 increment_opt(stats_.channel_action_counter);
144 }
145 if (config.uplink_packet_loss_fraction) {
Oskar Sundbom12ab00b2017-11-16 15:31:38 +0100146 stats_.uplink_packet_loss_fraction = *config.uplink_packet_loss_fraction;
ivoc17289092017-09-09 08:45:40 -0700147 }
148 }
Oskar Sundbom12ab00b2017-11-16 15:31:38 +0100149 prev_config_ = config;
ivoc17289092017-09-09 08:45:40 -0700150
minyue25f6a392016-09-22 22:23:20 -0700151 if (debug_dump_writer_)
michaelt92aef172017-04-18 00:11:48 -0700152 debug_dump_writer_->DumpEncoderRuntimeConfig(config, rtc::TimeMillis());
minyuecaa9cb22016-09-13 13:34:15 -0700153
minyue4b7c9522017-01-24 04:54:59 -0800154 if (event_log_writer_)
155 event_log_writer_->MaybeLogEncoderConfig(config);
156
minyuecaa9cb22016-09-13 13:34:15 -0700157 return config;
158}
159
minyuecaa9cb22016-09-13 13:34:15 -0700160void AudioNetworkAdaptorImpl::StartDebugDump(FILE* file_handle) {
minyue25f6a392016-09-22 22:23:20 -0700161 debug_dump_writer_ = DebugDumpWriter::Create(file_handle);
162}
163
164void AudioNetworkAdaptorImpl::StopDebugDump() {
165 debug_dump_writer_.reset(nullptr);
166}
167
ivoce1198e02017-09-08 08:13:19 -0700168ANAStats AudioNetworkAdaptorImpl::GetStats() const {
ivoc17289092017-09-09 08:45:40 -0700169 return stats_;
ivoce1198e02017-09-08 08:13:19 -0700170}
171
minyue25f6a392016-09-22 22:23:20 -0700172void AudioNetworkAdaptorImpl::DumpNetworkMetrics() {
173 if (debug_dump_writer_)
michaelt92aef172017-04-18 00:11:48 -0700174 debug_dump_writer_->DumpNetworkMetrics(last_metrics_, rtc::TimeMillis());
minyuecaa9cb22016-09-13 13:34:15 -0700175}
176
minyuea6a6d652017-01-30 10:50:00 -0800177void AudioNetworkAdaptorImpl::UpdateNetworkMetrics(
178 const Controller::NetworkMetrics& network_metrics) {
179 for (auto& controller : controller_manager_->GetControllers())
180 controller->UpdateNetworkMetrics(network_metrics);
181}
182
minyuecaa9cb22016-09-13 13:34:15 -0700183} // namespace webrtc