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

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: moving packet loss rate smoothing to AudioEncoderOpus. 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 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
73 kLossRate5Margin * 74 kLossRate5Margin *
74 (kPacketLossRate5 - old_loss_rate > 0 ? 1 : -1)) { 75 (kPacketLossRate5 - old_loss_rate > 0 ? 1 : -1)) {
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
84 class PacketLossFractionSmoother {
85 public:
86 explicit PacketLossFractionSmoother(const Clock* clock)
87 : clock_(clock),
88 last_sample_time_ms_(clock_->TimeInMilliseconds()),
89 smoother_(new rtc::ExpFilter(0.9999f)) {}
90
91 ~PacketLossFractionSmoother() = default;
kwiberg-webrtc 2016/10/11 14:56:19 I don't think this line does anything. This is wha
minyue-webrtc 2016/10/11 15:31:09 Done.
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 std::unique_ptr<rtc::ExpFilter> smoother_;
kwiberg-webrtc 2016/10/11 14:56:19 Do you need to point to the ExpFilter? Can't you e
minyue-webrtc 2016/10/11 15:31:09 no. I simply copied from the old implementation. B
113 };
114
83 } // namespace 115 } // namespace
84 116
85 AudioEncoderOpus::Config::Config() = default; 117 AudioEncoderOpus::Config::Config() = default;
86 AudioEncoderOpus::Config::Config(const Config&) = default; 118 AudioEncoderOpus::Config::Config(const Config&) = default;
87 AudioEncoderOpus::Config::~Config() = default; 119 AudioEncoderOpus::Config::~Config() = default;
88 auto AudioEncoderOpus::Config::operator=(const Config&) -> Config& = default; 120 auto AudioEncoderOpus::Config::operator=(const Config&) -> Config& = default;
89 121
90 bool AudioEncoderOpus::Config::IsOk() const { 122 bool AudioEncoderOpus::Config::IsOk() const {
91 if (frame_size_ms <= 0 || frame_size_ms % 10 != 0) 123 if (frame_size_ms <= 0 || frame_size_ms % 10 != 0)
92 return false; 124 return false;
(...skipping 13 matching lines...) Expand all
106 return *bitrate_bps; // Explicitly set value. 138 return *bitrate_bps; // Explicitly set value.
107 else 139 else
108 return num_channels == 1 ? 32000 : 64000; // Default value. 140 return num_channels == 1 ? 32000 : 64000; // Default value.
109 } 141 }
110 142
111 AudioEncoderOpus::AudioEncoderOpus( 143 AudioEncoderOpus::AudioEncoderOpus(
112 const Config& config, 144 const Config& config,
113 AudioNetworkAdaptorCreator&& audio_network_adaptor_creator) 145 AudioNetworkAdaptorCreator&& audio_network_adaptor_creator)
114 : packet_loss_rate_(0.0), 146 : packet_loss_rate_(0.0),
115 inst_(nullptr), 147 inst_(nullptr),
148 packet_loss_fraction_smoother_(new PacketLossFractionSmoother(
149 config.clock ? config.clock : Clock::GetRealTimeClock())),
116 audio_network_adaptor_creator_( 150 audio_network_adaptor_creator_(
117 audio_network_adaptor_creator 151 audio_network_adaptor_creator
118 ? audio_network_adaptor_creator 152 ? std::move(audio_network_adaptor_creator)
119 : [this](const std::string& config_string, const Clock* clock) { 153 : [this](const std::string& config_string, const Clock* clock) {
120 return DefaultAudioNetworkAdaptorCreator(config_string, 154 return DefaultAudioNetworkAdaptorCreator(config_string,
121 clock); 155 clock);
122 }) { 156 }) {
123 RTC_CHECK(RecreateEncoderInstance(config)); 157 RTC_CHECK(RecreateEncoderInstance(config));
124 } 158 }
125 159
126 AudioEncoderOpus::AudioEncoderOpus(const CodecInst& codec_inst) 160 AudioEncoderOpus::AudioEncoderOpus(const CodecInst& codec_inst)
127 : AudioEncoderOpus(CreateConfig(codec_inst), nullptr) {} 161 : AudioEncoderOpus(CreateConfig(codec_inst), nullptr) {}
128 162
(...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after
227 261
228 void AudioEncoderOpus::OnReceivedUplinkBandwidth(int uplink_bandwidth_bps) { 262 void AudioEncoderOpus::OnReceivedUplinkBandwidth(int uplink_bandwidth_bps) {
229 if (!audio_network_adaptor_) 263 if (!audio_network_adaptor_)
230 return; 264 return;
231 audio_network_adaptor_->SetUplinkBandwidth(uplink_bandwidth_bps); 265 audio_network_adaptor_->SetUplinkBandwidth(uplink_bandwidth_bps);
232 ApplyAudioNetworkAdaptor(); 266 ApplyAudioNetworkAdaptor();
233 } 267 }
234 268
235 void AudioEncoderOpus::OnReceivedUplinkPacketLossFraction( 269 void AudioEncoderOpus::OnReceivedUplinkPacketLossFraction(
236 float uplink_packet_loss_fraction) { 270 float uplink_packet_loss_fraction) {
237 if (!audio_network_adaptor_) 271 if (!audio_network_adaptor_) {
238 return; 272 packet_loss_fraction_smoother_->AddSample(uplink_packet_loss_fraction);
273 float average_fraction_loss = packet_loss_fraction_smoother_->GetAverage();
274 return SetProjectedPacketLossRate(average_fraction_loss);
275 }
239 audio_network_adaptor_->SetUplinkPacketLossFraction( 276 audio_network_adaptor_->SetUplinkPacketLossFraction(
240 uplink_packet_loss_fraction); 277 uplink_packet_loss_fraction);
241 ApplyAudioNetworkAdaptor(); 278 ApplyAudioNetworkAdaptor();
242 } 279 }
243 280
244 void AudioEncoderOpus::OnReceivedTargetAudioBitrate( 281 void AudioEncoderOpus::OnReceivedTargetAudioBitrate(
245 int target_audio_bitrate_bps) { 282 int target_audio_bitrate_bps) {
246 if (!audio_network_adaptor_) 283 if (!audio_network_adaptor_)
247 return; 284 return SetTargetBitrate(target_audio_bitrate_bps);
248 audio_network_adaptor_->SetTargetAudioBitrate(target_audio_bitrate_bps); 285 audio_network_adaptor_->SetTargetAudioBitrate(target_audio_bitrate_bps);
249 ApplyAudioNetworkAdaptor(); 286 ApplyAudioNetworkAdaptor();
250 } 287 }
251 288
252 void AudioEncoderOpus::OnReceivedRtt(int rtt_ms) { 289 void AudioEncoderOpus::OnReceivedRtt(int rtt_ms) {
253 if (!audio_network_adaptor_) 290 if (!audio_network_adaptor_)
254 return; 291 return;
255 audio_network_adaptor_->SetRtt(rtt_ms); 292 audio_network_adaptor_->SetRtt(rtt_ms);
256 ApplyAudioNetworkAdaptor(); 293 ApplyAudioNetworkAdaptor();
257 } 294 }
(...skipping 149 matching lines...) Expand 10 before | Expand all | Expand 10 after
407 AudioNetworkAdaptorImpl::Config config; 444 AudioNetworkAdaptorImpl::Config config;
408 config.clock = clock; 445 config.clock = clock;
409 return std::unique_ptr<AudioNetworkAdaptor>(new AudioNetworkAdaptorImpl( 446 return std::unique_ptr<AudioNetworkAdaptor>(new AudioNetworkAdaptorImpl(
410 config, ControllerManagerImpl::Create( 447 config, ControllerManagerImpl::Create(
411 config_string, NumChannels(), kSupportedFrameLengths, 448 config_string, NumChannels(), kSupportedFrameLengths,
412 num_channels_to_encode_, next_frame_length_ms_, 449 num_channels_to_encode_, next_frame_length_ms_,
413 GetTargetBitrate(), config_.fec_enabled, GetDtx(), clock))); 450 GetTargetBitrate(), config_.fec_enabled, GetDtx(), clock)));
414 } 451 }
415 452
416 } // namespace webrtc 453 } // namespace webrtc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698