blob: 612d2d35cc8ece00055ff9eb2c2faf4f11a0e46d [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
minyue161b3902016-09-22 14:16:55 -070011#include "webrtc/modules/audio_coding/audio_network_adaptor/audio_network_adaptor_impl.h"
12
minyue25f6a392016-09-22 22:23:20 -070013#include <utility>
14
minyue4b7c9522017-01-24 04:54:59 -080015#include "webrtc/base/logging.h"
16
minyuecaa9cb22016-09-13 13:34:15 -070017namespace webrtc {
18
minyue4b7c9522017-01-24 04:54:59 -080019namespace {
20constexpr int kEventLogMinBitrateChangeBps = 5000;
21constexpr float kEventLogMinBitrateChangeFraction = 0.25;
22constexpr float kEventLogMinPacketLossChangeFraction = 0.5;
23} // namespace
24
michaeltbf279fc2017-01-13 06:02:29 -080025AudioNetworkAdaptorImpl::Config::Config()
26 : event_log(nullptr), clock(nullptr){};
minyuecaa9cb22016-09-13 13:34:15 -070027
28AudioNetworkAdaptorImpl::Config::~Config() = default;
29
30AudioNetworkAdaptorImpl::AudioNetworkAdaptorImpl(
31 const Config& config,
minyue25f6a392016-09-22 22:23:20 -070032 std::unique_ptr<ControllerManager> controller_manager,
33 std::unique_ptr<DebugDumpWriter> debug_dump_writer)
34 : config_(config),
35 controller_manager_(std::move(controller_manager)),
minyue4b7c9522017-01-24 04:54:59 -080036 debug_dump_writer_(std::move(debug_dump_writer)),
37 event_log_writer_(
38 config.event_log
39 ? new EventLogWriter(config.event_log,
40 kEventLogMinBitrateChangeBps,
41 kEventLogMinBitrateChangeFraction,
42 kEventLogMinPacketLossChangeFraction)
43 : nullptr) {
minyuecaa9cb22016-09-13 13:34:15 -070044 RTC_DCHECK(controller_manager_);
45}
46
47AudioNetworkAdaptorImpl::~AudioNetworkAdaptorImpl() = default;
48
49void AudioNetworkAdaptorImpl::SetUplinkBandwidth(int uplink_bandwidth_bps) {
50 last_metrics_.uplink_bandwidth_bps = rtc::Optional<int>(uplink_bandwidth_bps);
minyue25f6a392016-09-22 22:23:20 -070051 DumpNetworkMetrics();
minyuea6a6d652017-01-30 10:50:00 -080052
53 Controller::NetworkMetrics network_metrics;
54 network_metrics.uplink_bandwidth_bps =
55 rtc::Optional<int>(uplink_bandwidth_bps);
56 UpdateNetworkMetrics(network_metrics);
minyuecaa9cb22016-09-13 13:34:15 -070057}
58
59void AudioNetworkAdaptorImpl::SetUplinkPacketLossFraction(
60 float uplink_packet_loss_fraction) {
61 last_metrics_.uplink_packet_loss_fraction =
62 rtc::Optional<float>(uplink_packet_loss_fraction);
minyue25f6a392016-09-22 22:23:20 -070063 DumpNetworkMetrics();
minyuea6a6d652017-01-30 10:50:00 -080064
65 Controller::NetworkMetrics network_metrics;
66 network_metrics.uplink_packet_loss_fraction =
67 rtc::Optional<float>(uplink_packet_loss_fraction);
68 UpdateNetworkMetrics(network_metrics);
minyue25f6a392016-09-22 22:23:20 -070069}
minyuecaa9cb22016-09-13 13:34:15 -070070
minyuec9e80ee2016-11-29 13:00:28 -080071void AudioNetworkAdaptorImpl::SetRtt(int rtt_ms) {
72 last_metrics_.rtt_ms = rtc::Optional<int>(rtt_ms);
73 DumpNetworkMetrics();
minyuea6a6d652017-01-30 10:50:00 -080074
75 Controller::NetworkMetrics network_metrics;
76 network_metrics.rtt_ms = rtc::Optional<int>(rtt_ms);
77 UpdateNetworkMetrics(network_metrics);
minyuec9e80ee2016-11-29 13:00:28 -080078}
79
minyuee5e632f2016-09-27 12:54:19 -070080void AudioNetworkAdaptorImpl::SetTargetAudioBitrate(
81 int target_audio_bitrate_bps) {
82 last_metrics_.target_audio_bitrate_bps =
83 rtc::Optional<int>(target_audio_bitrate_bps);
84 DumpNetworkMetrics();
minyuea6a6d652017-01-30 10:50:00 -080085
86 Controller::NetworkMetrics network_metrics;
87 network_metrics.target_audio_bitrate_bps =
88 rtc::Optional<int>(target_audio_bitrate_bps);
89 UpdateNetworkMetrics(network_metrics);
minyuee5e632f2016-09-27 12:54:19 -070090}
91
minyuec9e80ee2016-11-29 13:00:28 -080092void AudioNetworkAdaptorImpl::SetOverhead(size_t overhead_bytes_per_packet) {
93 last_metrics_.overhead_bytes_per_packet =
94 rtc::Optional<size_t>(overhead_bytes_per_packet);
minyue25f6a392016-09-22 22:23:20 -070095 DumpNetworkMetrics();
minyuea6a6d652017-01-30 10:50:00 -080096
97 Controller::NetworkMetrics network_metrics;
98 network_metrics.overhead_bytes_per_packet =
99 rtc::Optional<size_t>(overhead_bytes_per_packet);
100 UpdateNetworkMetrics(network_metrics);
minyuecaa9cb22016-09-13 13:34:15 -0700101}
102
103AudioNetworkAdaptor::EncoderRuntimeConfig
104AudioNetworkAdaptorImpl::GetEncoderRuntimeConfig() {
105 EncoderRuntimeConfig config;
106 for (auto& controller :
107 controller_manager_->GetSortedControllers(last_metrics_))
minyuea6a6d652017-01-30 10:50:00 -0800108 controller->MakeDecision(&config);
minyuecaa9cb22016-09-13 13:34:15 -0700109
minyue25f6a392016-09-22 22:23:20 -0700110 if (debug_dump_writer_)
111 debug_dump_writer_->DumpEncoderRuntimeConfig(
112 config, config_.clock->TimeInMilliseconds());
minyuecaa9cb22016-09-13 13:34:15 -0700113
minyue4b7c9522017-01-24 04:54:59 -0800114 if (event_log_writer_)
115 event_log_writer_->MaybeLogEncoderConfig(config);
116
minyuecaa9cb22016-09-13 13:34:15 -0700117 return config;
118}
119
minyuecaa9cb22016-09-13 13:34:15 -0700120void AudioNetworkAdaptorImpl::StartDebugDump(FILE* file_handle) {
minyue25f6a392016-09-22 22:23:20 -0700121 debug_dump_writer_ = DebugDumpWriter::Create(file_handle);
122}
123
124void AudioNetworkAdaptorImpl::StopDebugDump() {
125 debug_dump_writer_.reset(nullptr);
126}
127
128void AudioNetworkAdaptorImpl::DumpNetworkMetrics() {
129 if (debug_dump_writer_)
130 debug_dump_writer_->DumpNetworkMetrics(last_metrics_,
131 config_.clock->TimeInMilliseconds());
minyuecaa9cb22016-09-13 13:34:15 -0700132}
133
minyuea6a6d652017-01-30 10:50:00 -0800134void AudioNetworkAdaptorImpl::UpdateNetworkMetrics(
135 const Controller::NetworkMetrics& network_metrics) {
136 for (auto& controller : controller_manager_->GetControllers())
137 controller->UpdateNetworkMetrics(network_metrics);
138}
139
minyuecaa9cb22016-09-13 13:34:15 -0700140} // namespace webrtc