Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(20)

Side by Side Diff: webrtc/modules/audio_coding/codecs/opus/audio_encoder_opus.cc

Issue 2390883004: Hooking up audio network adaptor to VoE. (Closed)
Patch Set: go back to old API for some tests. Created 4 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 /* 1 /*
2 * Copyright (c) 2014 The WebRTC project authors. All Rights Reserved. 2 * Copyright (c) 2014 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/codecs/opus/audio_encoder_opus.h" 11 #include "webrtc/modules/audio_coding/codecs/opus/audio_encoder_opus.h"
12 12
13 #include <algorithm> 13 #include <algorithm>
14 14
15 #include "webrtc/base/checks.h" 15 #include "webrtc/base/checks.h"
16 #include "webrtc/base/exp_filter.h"
16 #include "webrtc/base/safe_conversions.h" 17 #include "webrtc/base/safe_conversions.h"
17 #include "webrtc/common_types.h" 18 #include "webrtc/common_types.h"
18 #include "webrtc/modules/audio_coding/audio_network_adaptor/audio_network_adapto r_impl.h" 19 #include "webrtc/modules/audio_coding/audio_network_adaptor/audio_network_adapto r_impl.h"
19 #include "webrtc/modules/audio_coding/audio_network_adaptor/controller_manager.h " 20 #include "webrtc/modules/audio_coding/audio_network_adaptor/controller_manager.h "
20 #include "webrtc/modules/audio_coding/codecs/opus/opus_interface.h" 21 #include "webrtc/modules/audio_coding/codecs/opus/opus_interface.h"
21 #include "webrtc/system_wrappers/include/clock.h" 22 #include "webrtc/system_wrappers/include/clock.h"
22 23
23 namespace webrtc { 24 namespace webrtc {
24 25
25 namespace { 26 namespace {
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
75 return kPacketLossRate5; 76 return kPacketLossRate5;
76 } else if (new_loss_rate >= kPacketLossRate1) { 77 } else if (new_loss_rate >= kPacketLossRate1) {
77 return kPacketLossRate1; 78 return kPacketLossRate1;
78 } else { 79 } else {
79 return 0.0; 80 return 0.0;
80 } 81 }
81 } 82 }
82 83
83 } // namespace 84 } // namespace
84 85
86 class AudioEncoderOpus::PacketLossFractionSmoother {
87 public:
88 explicit PacketLossFractionSmoother(const Clock* clock)
89 : clock_(clock),
90 last_sample_time_ms_(clock_->TimeInMilliseconds()),
91 smoother_(0.9999f) {}
the sun 2016/10/11 17:52:42 Would be nice with a comment about what the filter
minyue-webrtc 2016/10/12 11:27:35 I do not quite recall what that number means :P, t
92
93 // Gets the smoothed packet loss fraction.
94 float GetAverage() const {
95 float value = smoother_.filtered();
96 return (value == rtc::ExpFilter::kValueUndefined) ? 0.0f : value;
97 }
98
99 // Add new observation to the packet loss fraction smoother.
100 void AddSample(float packet_loss_fraction) {
101 int64_t now_ms = clock_->TimeInMilliseconds();
102 smoother_.Apply(static_cast<float>(now_ms - last_sample_time_ms_),
103 packet_loss_fraction);
104 last_sample_time_ms_ = now_ms;
105 }
106
107 private:
108 const Clock* const clock_;
109 int64_t last_sample_time_ms_;
110
111 // An exponential filter is used to smooth the packet loss fraction.
112 rtc::ExpFilter smoother_;
113 };
114
85 AudioEncoderOpus::Config::Config() = default; 115 AudioEncoderOpus::Config::Config() = default;
86 AudioEncoderOpus::Config::Config(const Config&) = default; 116 AudioEncoderOpus::Config::Config(const Config&) = default;
87 AudioEncoderOpus::Config::~Config() = default; 117 AudioEncoderOpus::Config::~Config() = default;
88 auto AudioEncoderOpus::Config::operator=(const Config&) -> Config& = default; 118 auto AudioEncoderOpus::Config::operator=(const Config&) -> Config& = default;
89 119
90 bool AudioEncoderOpus::Config::IsOk() const { 120 bool AudioEncoderOpus::Config::IsOk() const {
91 if (frame_size_ms <= 0 || frame_size_ms % 10 != 0) 121 if (frame_size_ms <= 0 || frame_size_ms % 10 != 0)
92 return false; 122 return false;
93 if (num_channels != 1 && num_channels != 2) 123 if (num_channels != 1 && num_channels != 2)
94 return false; 124 return false;
(...skipping 11 matching lines...) Expand all
106 return *bitrate_bps; // Explicitly set value. 136 return *bitrate_bps; // Explicitly set value.
107 else 137 else
108 return num_channels == 1 ? 32000 : 64000; // Default value. 138 return num_channels == 1 ? 32000 : 64000; // Default value.
109 } 139 }
110 140
111 AudioEncoderOpus::AudioEncoderOpus( 141 AudioEncoderOpus::AudioEncoderOpus(
112 const Config& config, 142 const Config& config,
113 AudioNetworkAdaptorCreator&& audio_network_adaptor_creator) 143 AudioNetworkAdaptorCreator&& audio_network_adaptor_creator)
114 : packet_loss_rate_(0.0), 144 : packet_loss_rate_(0.0),
115 inst_(nullptr), 145 inst_(nullptr),
146 packet_loss_fraction_smoother_(new PacketLossFractionSmoother(
147 config.clock ? config.clock : Clock::GetRealTimeClock())),
116 audio_network_adaptor_creator_( 148 audio_network_adaptor_creator_(
117 audio_network_adaptor_creator 149 audio_network_adaptor_creator
118 ? audio_network_adaptor_creator 150 ? std::move(audio_network_adaptor_creator)
119 : [this](const std::string& config_string, const Clock* clock) { 151 : [this](const std::string& config_string, const Clock* clock) {
120 return DefaultAudioNetworkAdaptorCreator(config_string, 152 return DefaultAudioNetworkAdaptorCreator(config_string,
121 clock); 153 clock);
122 }) { 154 }) {
123 RTC_CHECK(RecreateEncoderInstance(config)); 155 RTC_CHECK(RecreateEncoderInstance(config));
124 } 156 }
125 157
126 AudioEncoderOpus::AudioEncoderOpus(const CodecInst& codec_inst) 158 AudioEncoderOpus::AudioEncoderOpus(const CodecInst& codec_inst)
127 : AudioEncoderOpus(CreateConfig(codec_inst), nullptr) {} 159 : AudioEncoderOpus(CreateConfig(codec_inst), nullptr) {}
128 160
(...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after
227 259
228 void AudioEncoderOpus::OnReceivedUplinkBandwidth(int uplink_bandwidth_bps) { 260 void AudioEncoderOpus::OnReceivedUplinkBandwidth(int uplink_bandwidth_bps) {
229 if (!audio_network_adaptor_) 261 if (!audio_network_adaptor_)
230 return; 262 return;
231 audio_network_adaptor_->SetUplinkBandwidth(uplink_bandwidth_bps); 263 audio_network_adaptor_->SetUplinkBandwidth(uplink_bandwidth_bps);
232 ApplyAudioNetworkAdaptor(); 264 ApplyAudioNetworkAdaptor();
233 } 265 }
234 266
235 void AudioEncoderOpus::OnReceivedUplinkPacketLossFraction( 267 void AudioEncoderOpus::OnReceivedUplinkPacketLossFraction(
236 float uplink_packet_loss_fraction) { 268 float uplink_packet_loss_fraction) {
237 if (!audio_network_adaptor_) 269 if (!audio_network_adaptor_) {
238 return; 270 packet_loss_fraction_smoother_->AddSample(uplink_packet_loss_fraction);
271 float average_fraction_loss = packet_loss_fraction_smoother_->GetAverage();
272 return SetProjectedPacketLossRate(average_fraction_loss);
273 }
239 audio_network_adaptor_->SetUplinkPacketLossFraction( 274 audio_network_adaptor_->SetUplinkPacketLossFraction(
240 uplink_packet_loss_fraction); 275 uplink_packet_loss_fraction);
241 ApplyAudioNetworkAdaptor(); 276 ApplyAudioNetworkAdaptor();
242 } 277 }
243 278
244 void AudioEncoderOpus::OnReceivedTargetAudioBitrate( 279 void AudioEncoderOpus::OnReceivedTargetAudioBitrate(
245 int target_audio_bitrate_bps) { 280 int target_audio_bitrate_bps) {
246 if (!audio_network_adaptor_) 281 if (!audio_network_adaptor_)
247 return; 282 return SetTargetBitrate(target_audio_bitrate_bps);
248 audio_network_adaptor_->SetTargetAudioBitrate(target_audio_bitrate_bps); 283 audio_network_adaptor_->SetTargetAudioBitrate(target_audio_bitrate_bps);
249 ApplyAudioNetworkAdaptor(); 284 ApplyAudioNetworkAdaptor();
250 } 285 }
251 286
252 void AudioEncoderOpus::OnReceivedRtt(int rtt_ms) { 287 void AudioEncoderOpus::OnReceivedRtt(int rtt_ms) {
253 if (!audio_network_adaptor_) 288 if (!audio_network_adaptor_)
254 return; 289 return;
255 audio_network_adaptor_->SetRtt(rtt_ms); 290 audio_network_adaptor_->SetRtt(rtt_ms);
256 ApplyAudioNetworkAdaptor(); 291 ApplyAudioNetworkAdaptor();
257 } 292 }
(...skipping 149 matching lines...) Expand 10 before | Expand all | Expand 10 after
407 AudioNetworkAdaptorImpl::Config config; 442 AudioNetworkAdaptorImpl::Config config;
408 config.clock = clock; 443 config.clock = clock;
409 return std::unique_ptr<AudioNetworkAdaptor>(new AudioNetworkAdaptorImpl( 444 return std::unique_ptr<AudioNetworkAdaptor>(new AudioNetworkAdaptorImpl(
410 config, ControllerManagerImpl::Create( 445 config, ControllerManagerImpl::Create(
411 config_string, NumChannels(), kSupportedFrameLengths, 446 config_string, NumChannels(), kSupportedFrameLengths,
412 num_channels_to_encode_, next_frame_length_ms_, 447 num_channels_to_encode_, next_frame_length_ms_,
413 GetTargetBitrate(), config_.fec_enabled, GetDtx(), clock))); 448 GetTargetBitrate(), config_.fec_enabled, GetDtx(), clock)));
414 } 449 }
415 450
416 } // namespace webrtc 451 } // namespace webrtc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698