minyue | caa9cb2 | 2016-09-13 13:34:15 -0700 | [diff] [blame] | 1 | /* |
| 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 | |
minyue | 161b390 | 2016-09-22 14:16:55 -0700 | [diff] [blame] | 11 | #include "webrtc/modules/audio_coding/audio_network_adaptor/audio_network_adaptor_impl.h" |
| 12 | |
minyue | 25f6a39 | 2016-09-22 22:23:20 -0700 | [diff] [blame] | 13 | #include <utility> |
| 14 | |
minyue | 4b7c952 | 2017-01-24 04:54:59 -0800 | [diff] [blame] | 15 | #include "webrtc/base/logging.h" |
| 16 | |
minyue | caa9cb2 | 2016-09-13 13:34:15 -0700 | [diff] [blame] | 17 | namespace webrtc { |
| 18 | |
minyue | 4b7c952 | 2017-01-24 04:54:59 -0800 | [diff] [blame] | 19 | namespace { |
| 20 | constexpr int kEventLogMinBitrateChangeBps = 5000; |
| 21 | constexpr float kEventLogMinBitrateChangeFraction = 0.25; |
| 22 | constexpr float kEventLogMinPacketLossChangeFraction = 0.5; |
| 23 | } // namespace |
| 24 | |
michaelt | bf279fc | 2017-01-13 06:02:29 -0800 | [diff] [blame] | 25 | AudioNetworkAdaptorImpl::Config::Config() |
| 26 | : event_log(nullptr), clock(nullptr){}; |
minyue | caa9cb2 | 2016-09-13 13:34:15 -0700 | [diff] [blame] | 27 | |
| 28 | AudioNetworkAdaptorImpl::Config::~Config() = default; |
| 29 | |
| 30 | AudioNetworkAdaptorImpl::AudioNetworkAdaptorImpl( |
| 31 | const Config& config, |
minyue | 25f6a39 | 2016-09-22 22:23:20 -0700 | [diff] [blame] | 32 | std::unique_ptr<ControllerManager> controller_manager, |
| 33 | std::unique_ptr<DebugDumpWriter> debug_dump_writer) |
| 34 | : config_(config), |
| 35 | controller_manager_(std::move(controller_manager)), |
minyue | 4b7c952 | 2017-01-24 04:54:59 -0800 | [diff] [blame] | 36 | 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) { |
minyue | caa9cb2 | 2016-09-13 13:34:15 -0700 | [diff] [blame] | 44 | RTC_DCHECK(controller_manager_); |
| 45 | } |
| 46 | |
| 47 | AudioNetworkAdaptorImpl::~AudioNetworkAdaptorImpl() = default; |
| 48 | |
| 49 | void AudioNetworkAdaptorImpl::SetUplinkBandwidth(int uplink_bandwidth_bps) { |
| 50 | last_metrics_.uplink_bandwidth_bps = rtc::Optional<int>(uplink_bandwidth_bps); |
minyue | 25f6a39 | 2016-09-22 22:23:20 -0700 | [diff] [blame] | 51 | DumpNetworkMetrics(); |
minyue | a6a6d65 | 2017-01-30 10:50:00 -0800 | [diff] [blame^] | 52 | |
| 53 | Controller::NetworkMetrics network_metrics; |
| 54 | network_metrics.uplink_bandwidth_bps = |
| 55 | rtc::Optional<int>(uplink_bandwidth_bps); |
| 56 | UpdateNetworkMetrics(network_metrics); |
minyue | caa9cb2 | 2016-09-13 13:34:15 -0700 | [diff] [blame] | 57 | } |
| 58 | |
| 59 | void AudioNetworkAdaptorImpl::SetUplinkPacketLossFraction( |
| 60 | float uplink_packet_loss_fraction) { |
| 61 | last_metrics_.uplink_packet_loss_fraction = |
| 62 | rtc::Optional<float>(uplink_packet_loss_fraction); |
minyue | 25f6a39 | 2016-09-22 22:23:20 -0700 | [diff] [blame] | 63 | DumpNetworkMetrics(); |
minyue | a6a6d65 | 2017-01-30 10:50:00 -0800 | [diff] [blame^] | 64 | |
| 65 | Controller::NetworkMetrics network_metrics; |
| 66 | network_metrics.uplink_packet_loss_fraction = |
| 67 | rtc::Optional<float>(uplink_packet_loss_fraction); |
| 68 | UpdateNetworkMetrics(network_metrics); |
minyue | 25f6a39 | 2016-09-22 22:23:20 -0700 | [diff] [blame] | 69 | } |
minyue | caa9cb2 | 2016-09-13 13:34:15 -0700 | [diff] [blame] | 70 | |
minyue | c9e80ee | 2016-11-29 13:00:28 -0800 | [diff] [blame] | 71 | void AudioNetworkAdaptorImpl::SetRtt(int rtt_ms) { |
| 72 | last_metrics_.rtt_ms = rtc::Optional<int>(rtt_ms); |
| 73 | DumpNetworkMetrics(); |
minyue | a6a6d65 | 2017-01-30 10:50:00 -0800 | [diff] [blame^] | 74 | |
| 75 | Controller::NetworkMetrics network_metrics; |
| 76 | network_metrics.rtt_ms = rtc::Optional<int>(rtt_ms); |
| 77 | UpdateNetworkMetrics(network_metrics); |
minyue | c9e80ee | 2016-11-29 13:00:28 -0800 | [diff] [blame] | 78 | } |
| 79 | |
minyue | e5e632f | 2016-09-27 12:54:19 -0700 | [diff] [blame] | 80 | void 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(); |
minyue | a6a6d65 | 2017-01-30 10:50:00 -0800 | [diff] [blame^] | 85 | |
| 86 | Controller::NetworkMetrics network_metrics; |
| 87 | network_metrics.target_audio_bitrate_bps = |
| 88 | rtc::Optional<int>(target_audio_bitrate_bps); |
| 89 | UpdateNetworkMetrics(network_metrics); |
minyue | e5e632f | 2016-09-27 12:54:19 -0700 | [diff] [blame] | 90 | } |
| 91 | |
minyue | c9e80ee | 2016-11-29 13:00:28 -0800 | [diff] [blame] | 92 | void AudioNetworkAdaptorImpl::SetOverhead(size_t overhead_bytes_per_packet) { |
| 93 | last_metrics_.overhead_bytes_per_packet = |
| 94 | rtc::Optional<size_t>(overhead_bytes_per_packet); |
minyue | 25f6a39 | 2016-09-22 22:23:20 -0700 | [diff] [blame] | 95 | DumpNetworkMetrics(); |
minyue | a6a6d65 | 2017-01-30 10:50:00 -0800 | [diff] [blame^] | 96 | |
| 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); |
minyue | caa9cb2 | 2016-09-13 13:34:15 -0700 | [diff] [blame] | 101 | } |
| 102 | |
| 103 | AudioNetworkAdaptor::EncoderRuntimeConfig |
| 104 | AudioNetworkAdaptorImpl::GetEncoderRuntimeConfig() { |
| 105 | EncoderRuntimeConfig config; |
| 106 | for (auto& controller : |
| 107 | controller_manager_->GetSortedControllers(last_metrics_)) |
minyue | a6a6d65 | 2017-01-30 10:50:00 -0800 | [diff] [blame^] | 108 | controller->MakeDecision(&config); |
minyue | caa9cb2 | 2016-09-13 13:34:15 -0700 | [diff] [blame] | 109 | |
minyue | 25f6a39 | 2016-09-22 22:23:20 -0700 | [diff] [blame] | 110 | if (debug_dump_writer_) |
| 111 | debug_dump_writer_->DumpEncoderRuntimeConfig( |
| 112 | config, config_.clock->TimeInMilliseconds()); |
minyue | caa9cb2 | 2016-09-13 13:34:15 -0700 | [diff] [blame] | 113 | |
minyue | 4b7c952 | 2017-01-24 04:54:59 -0800 | [diff] [blame] | 114 | if (event_log_writer_) |
| 115 | event_log_writer_->MaybeLogEncoderConfig(config); |
| 116 | |
minyue | caa9cb2 | 2016-09-13 13:34:15 -0700 | [diff] [blame] | 117 | return config; |
| 118 | } |
| 119 | |
minyue | caa9cb2 | 2016-09-13 13:34:15 -0700 | [diff] [blame] | 120 | void AudioNetworkAdaptorImpl::StartDebugDump(FILE* file_handle) { |
minyue | 25f6a39 | 2016-09-22 22:23:20 -0700 | [diff] [blame] | 121 | debug_dump_writer_ = DebugDumpWriter::Create(file_handle); |
| 122 | } |
| 123 | |
| 124 | void AudioNetworkAdaptorImpl::StopDebugDump() { |
| 125 | debug_dump_writer_.reset(nullptr); |
| 126 | } |
| 127 | |
| 128 | void AudioNetworkAdaptorImpl::DumpNetworkMetrics() { |
| 129 | if (debug_dump_writer_) |
| 130 | debug_dump_writer_->DumpNetworkMetrics(last_metrics_, |
| 131 | config_.clock->TimeInMilliseconds()); |
minyue | caa9cb2 | 2016-09-13 13:34:15 -0700 | [diff] [blame] | 132 | } |
| 133 | |
minyue | a6a6d65 | 2017-01-30 10:50:00 -0800 | [diff] [blame^] | 134 | void AudioNetworkAdaptorImpl::UpdateNetworkMetrics( |
| 135 | const Controller::NetworkMetrics& network_metrics) { |
| 136 | for (auto& controller : controller_manager_->GetControllers()) |
| 137 | controller->UpdateNetworkMetrics(network_metrics); |
| 138 | } |
| 139 | |
minyue | caa9cb2 | 2016-09-13 13:34:15 -0700 | [diff] [blame] | 140 | } // namespace webrtc |