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

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

Issue 2546493002: Update smoothed bitrate. (Closed)
Patch Set: Deprecated OnReceivedTargetAudioBitrate. Created 3 years, 12 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
(...skipping 154 matching lines...) Expand 10 before | Expand all | Expand 10 after
165 // Within the hysteresis window; make no change. 165 // Within the hysteresis window; make no change.
166 return rtc::Optional<int>(); 166 return rtc::Optional<int>();
167 } 167 }
168 return bitrate_bps <= complexity_threshold_bps 168 return bitrate_bps <= complexity_threshold_bps
169 ? rtc::Optional<int>(low_rate_complexity) 169 ? rtc::Optional<int>(low_rate_complexity)
170 : rtc::Optional<int>(complexity); 170 : rtc::Optional<int>(complexity);
171 } 171 }
172 172
173 AudioEncoderOpus::AudioEncoderOpus( 173 AudioEncoderOpus::AudioEncoderOpus(
174 const Config& config, 174 const Config& config,
175 AudioNetworkAdaptorCreator&& audio_network_adaptor_creator) 175 AudioNetworkAdaptorCreator&& audio_network_adaptor_creator,
176 std::unique_ptr<SmoothingFilter> bitrate_smoother)
176 : packet_loss_rate_(0.0), 177 : packet_loss_rate_(0.0),
177 inst_(nullptr), 178 inst_(nullptr),
178 packet_loss_fraction_smoother_(new PacketLossFractionSmoother( 179 packet_loss_fraction_smoother_(new PacketLossFractionSmoother(
179 config.clock ? config.clock : Clock::GetRealTimeClock())), 180 config.clock ? config.clock : Clock::GetRealTimeClock())),
180 audio_network_adaptor_creator_( 181 audio_network_adaptor_creator_(
181 audio_network_adaptor_creator 182 audio_network_adaptor_creator
182 ? std::move(audio_network_adaptor_creator) 183 ? std::move(audio_network_adaptor_creator)
183 : [this](const std::string& config_string, const Clock* clock) { 184 : [this](const std::string& config_string, const Clock* clock) {
184 return DefaultAudioNetworkAdaptorCreator(config_string, 185 return DefaultAudioNetworkAdaptorCreator(config_string,
185 clock); 186 clock);
186 }) { 187 }),
188 bitrate_smoother_(bitrate_smoother
189 ? std::move(bitrate_smoother) : std::unique_ptr<SmoothingFilter>(
190 new SmoothingFilterImpl(500, config.clock))) {
minyue-webrtc 2016/12/28 08:46:07 add a comment on the choice of 500
michaelt 2017/01/09 09:24:05 Done.
187 RTC_CHECK(RecreateEncoderInstance(config)); 191 RTC_CHECK(RecreateEncoderInstance(config));
188 } 192 }
189 193
190 AudioEncoderOpus::AudioEncoderOpus(const CodecInst& codec_inst) 194 AudioEncoderOpus::AudioEncoderOpus(const CodecInst& codec_inst)
191 : AudioEncoderOpus(CreateConfig(codec_inst), nullptr) {} 195 : AudioEncoderOpus(CreateConfig(codec_inst), nullptr) {}
192 196
193 AudioEncoderOpus::~AudioEncoderOpus() { 197 AudioEncoderOpus::~AudioEncoderOpus() {
194 RTC_CHECK_EQ(0, WebRtcOpus_EncoderFree(inst_)); 198 RTC_CHECK_EQ(0, WebRtcOpus_EncoderFree(inst_));
195 } 199 }
196 200
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after
265 const std::string& config_string, 269 const std::string& config_string,
266 const Clock* clock) { 270 const Clock* clock) {
267 audio_network_adaptor_ = audio_network_adaptor_creator_(config_string, clock); 271 audio_network_adaptor_ = audio_network_adaptor_creator_(config_string, clock);
268 return audio_network_adaptor_.get() != nullptr; 272 return audio_network_adaptor_.get() != nullptr;
269 } 273 }
270 274
271 void AudioEncoderOpus::DisableAudioNetworkAdaptor() { 275 void AudioEncoderOpus::DisableAudioNetworkAdaptor() {
272 audio_network_adaptor_.reset(nullptr); 276 audio_network_adaptor_.reset(nullptr);
273 } 277 }
274 278
275 void AudioEncoderOpus::OnReceivedUplinkBandwidth(int uplink_bandwidth_bps) {
276 if (!audio_network_adaptor_)
277 return;
278 audio_network_adaptor_->SetUplinkBandwidth(uplink_bandwidth_bps);
279 ApplyAudioNetworkAdaptor();
280 }
281
282 void AudioEncoderOpus::OnReceivedUplinkPacketLossFraction( 279 void AudioEncoderOpus::OnReceivedUplinkPacketLossFraction(
283 float uplink_packet_loss_fraction) { 280 float uplink_packet_loss_fraction) {
284 if (!audio_network_adaptor_) { 281 if (!audio_network_adaptor_) {
285 packet_loss_fraction_smoother_->AddSample(uplink_packet_loss_fraction); 282 packet_loss_fraction_smoother_->AddSample(uplink_packet_loss_fraction);
286 float average_fraction_loss = packet_loss_fraction_smoother_->GetAverage(); 283 float average_fraction_loss = packet_loss_fraction_smoother_->GetAverage();
287 return SetProjectedPacketLossRate(average_fraction_loss); 284 return SetProjectedPacketLossRate(average_fraction_loss);
288 } 285 }
289 audio_network_adaptor_->SetUplinkPacketLossFraction( 286 audio_network_adaptor_->SetUplinkPacketLossFraction(
290 uplink_packet_loss_fraction); 287 uplink_packet_loss_fraction);
291 ApplyAudioNetworkAdaptor(); 288 ApplyAudioNetworkAdaptor();
292 } 289 }
293 290
294 void AudioEncoderOpus::OnReceivedTargetAudioBitrate( 291 void AudioEncoderOpus::OnReceivedTargetAudioBitrate(
295 int target_audio_bitrate_bps) { 292 int target_audio_bitrate_bps,
293 rtc::Optional<int64_t> probing_interval_ms) {
296 if (audio_network_adaptor_) { 294 if (audio_network_adaptor_) {
297 audio_network_adaptor_->SetTargetAudioBitrate(target_audio_bitrate_bps); 295 audio_network_adaptor_->SetTargetAudioBitrate(target_audio_bitrate_bps);
296 // We give smoothed bitrate allocation to audio network adaptor as
297 // the uplink bandwidth.
298 // The probing spikes should not affect the bitrate smoother more than 25%.
299 // To simplify the calculations we use a step response as input signal.
300 // The step response of an exponential filter is
301 // u(t) = 1 - e^(-t / time_constant).
302 // In order to limit the affect of a BWE spike within 25% of its value
303 // before
304 // the next probing, we would choose a time constant that fulfills
305 // 1 - e^(-probing_interval_ms / time_constant) < 0.25
306 // Then 4 * probing_interval_ms is a good choice.
307 if (probing_interval_ms)
308 bitrate_smoother_->SetTimeConstantMs(*probing_interval_ms * 4);
309 bitrate_smoother_->AddSample(target_audio_bitrate_bps);
310
298 ApplyAudioNetworkAdaptor(); 311 ApplyAudioNetworkAdaptor();
299 } else if (webrtc::field_trial::FindFullName( 312 } else if (webrtc::field_trial::FindFullName(
300 "WebRTC-SendSideBwe-WithOverhead") == "Enabled") { 313 "WebRTC-SendSideBwe-WithOverhead") == "Enabled") {
301 if (!overhead_bytes_per_packet_) { 314 if (!overhead_bytes_per_packet_) {
302 LOG(LS_INFO) 315 LOG(LS_INFO)
303 << "AudioEncoderOpus: Overhead unknown, target audio bitrate " 316 << "AudioEncoderOpus: Overhead unknown, target audio bitrate "
304 << target_audio_bitrate_bps << " bps is ignored."; 317 << target_audio_bitrate_bps << " bps is ignored.";
305 return; 318 return;
306 } 319 }
307 const int overhead_bps = static_cast<int>( 320 const int overhead_bps = static_cast<int>(
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
347 frame_length_ms <= max_frame_length_ms; 360 frame_length_ms <= max_frame_length_ms;
348 }); 361 });
349 RTC_DCHECK(std::is_sorted(config_.supported_frame_lengths_ms.begin(), 362 RTC_DCHECK(std::is_sorted(config_.supported_frame_lengths_ms.begin(),
350 config_.supported_frame_lengths_ms.end())); 363 config_.supported_frame_lengths_ms.end()));
351 } 364 }
352 365
353 AudioEncoder::EncodedInfo AudioEncoderOpus::EncodeImpl( 366 AudioEncoder::EncodedInfo AudioEncoderOpus::EncodeImpl(
354 uint32_t rtp_timestamp, 367 uint32_t rtp_timestamp,
355 rtc::ArrayView<const int16_t> audio, 368 rtc::ArrayView<const int16_t> audio,
356 rtc::Buffer* encoded) { 369 rtc::Buffer* encoded) {
370 MaybeUpdateUplinkBandwidth();
357 371
358 if (input_buffer_.empty()) 372 if (input_buffer_.empty())
359 first_timestamp_in_buffer_ = rtp_timestamp; 373 first_timestamp_in_buffer_ = rtp_timestamp;
360 374
361 input_buffer_.insert(input_buffer_.end(), audio.cbegin(), audio.cend()); 375 input_buffer_.insert(input_buffer_.end(), audio.cbegin(), audio.cend());
362 if (input_buffer_.size() < 376 if (input_buffer_.size() <
363 (Num10msFramesPerPacket() * SamplesPer10msFrame())) { 377 (Num10msFramesPerPacket() * SamplesPer10msFrame())) {
364 return EncodedInfo(); 378 return EncodedInfo();
365 } 379 }
366 RTC_CHECK_EQ(input_buffer_.size(), 380 RTC_CHECK_EQ(input_buffer_.size(),
(...skipping 149 matching lines...) Expand 10 before | Expand all | Expand 10 after
516 const Clock* clock) const { 530 const Clock* clock) const {
517 AudioNetworkAdaptorImpl::Config config; 531 AudioNetworkAdaptorImpl::Config config;
518 config.clock = clock; 532 config.clock = clock;
519 return std::unique_ptr<AudioNetworkAdaptor>(new AudioNetworkAdaptorImpl( 533 return std::unique_ptr<AudioNetworkAdaptor>(new AudioNetworkAdaptorImpl(
520 config, ControllerManagerImpl::Create( 534 config, ControllerManagerImpl::Create(
521 config_string, NumChannels(), supported_frame_lengths_ms(), 535 config_string, NumChannels(), supported_frame_lengths_ms(),
522 num_channels_to_encode_, next_frame_length_ms_, 536 num_channels_to_encode_, next_frame_length_ms_,
523 GetTargetBitrate(), config_.fec_enabled, GetDtx(), clock))); 537 GetTargetBitrate(), config_.fec_enabled, GetDtx(), clock)));
524 } 538 }
525 539
540 void AudioEncoderOpus::MaybeUpdateUplinkBandwidth() {
541 if (audio_network_adaptor_) {
542 int64_t now = config_.clock->TimeInMilliseconds();
543 if (!bitrate_smoother_last_update_time_ ||
544 now - *bitrate_smoother_last_update_time_ >=
545 config_.update_uplink_bandwidth_interval_ms) {
546 rtc::Optional<float> smoothed_bitrate = bitrate_smoother_->GetAverage();
547 if (smoothed_bitrate)
548 audio_network_adaptor_->SetUplinkBandwidth(*smoothed_bitrate);
549 bitrate_smoother_last_update_time_ = rtc::Optional<int64_t>(now);
550 }
551 }
552 }
553
526 } // namespace webrtc 554 } // namespace webrtc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698