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

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

Issue 2538493006: Reland "Renaming AudioEncoder::SetTargetBitrate and SetProjectedPacketLossRate." (Closed)
Patch Set: fixing Created 4 years 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 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
49 #endif 49 #endif
50 return config; 50 return config;
51 } 51 }
52 52
53 // Optimize the loss rate to configure Opus. Basically, optimized loss rate is 53 // Optimize the loss rate to configure Opus. Basically, optimized loss rate is
54 // the input loss rate rounded down to various levels, because a robustly good 54 // the input loss rate rounded down to various levels, because a robustly good
55 // audio quality is achieved by lowering the packet loss down. 55 // audio quality is achieved by lowering the packet loss down.
56 // Additionally, to prevent toggling, margins are used, i.e., when jumping to 56 // Additionally, to prevent toggling, margins are used, i.e., when jumping to
57 // a loss rate from below, a higher threshold is used than jumping to the same 57 // a loss rate from below, a higher threshold is used than jumping to the same
58 // level from above. 58 // level from above.
59 double OptimizePacketLossRate(double new_loss_rate, double old_loss_rate) { 59 float OptimizePacketLossRate(float new_loss_rate, float old_loss_rate) {
60 RTC_DCHECK_GE(new_loss_rate, 0.0); 60 RTC_DCHECK_GE(new_loss_rate, 0.0f);
61 RTC_DCHECK_LE(new_loss_rate, 1.0); 61 RTC_DCHECK_LE(new_loss_rate, 1.0f);
62 RTC_DCHECK_GE(old_loss_rate, 0.0); 62 RTC_DCHECK_GE(old_loss_rate, 0.0f);
63 RTC_DCHECK_LE(old_loss_rate, 1.0); 63 RTC_DCHECK_LE(old_loss_rate, 1.0f);
64 const double kPacketLossRate20 = 0.20; 64 constexpr float kPacketLossRate20 = 0.20f;
65 const double kPacketLossRate10 = 0.10; 65 constexpr float kPacketLossRate10 = 0.10f;
66 const double kPacketLossRate5 = 0.05; 66 constexpr float kPacketLossRate5 = 0.05f;
67 const double kPacketLossRate1 = 0.01; 67 constexpr float kPacketLossRate1 = 0.01f;
68 const double kLossRate20Margin = 0.02; 68 constexpr float kLossRate20Margin = 0.02f;
69 const double kLossRate10Margin = 0.01; 69 constexpr float kLossRate10Margin = 0.01f;
70 const double kLossRate5Margin = 0.01; 70 constexpr float kLossRate5Margin = 0.01f;
71 if (new_loss_rate >= 71 if (new_loss_rate >=
72 kPacketLossRate20 + 72 kPacketLossRate20 +
73 kLossRate20Margin * 73 kLossRate20Margin *
74 (kPacketLossRate20 - old_loss_rate > 0 ? 1 : -1)) { 74 (kPacketLossRate20 - old_loss_rate > 0 ? 1 : -1)) {
75 return kPacketLossRate20; 75 return kPacketLossRate20;
76 } else if (new_loss_rate >= 76 } else if (new_loss_rate >=
77 kPacketLossRate10 + 77 kPacketLossRate10 +
78 kLossRate10Margin * 78 kLossRate10Margin *
79 (kPacketLossRate10 - old_loss_rate > 0 ? 1 : -1)) { 79 (kPacketLossRate10 - old_loss_rate > 0 ? 1 : -1)) {
80 return kPacketLossRate10; 80 return kPacketLossRate10;
81 } else if (new_loss_rate >= 81 } else if (new_loss_rate >=
82 kPacketLossRate5 + 82 kPacketLossRate5 +
83 kLossRate5Margin * 83 kLossRate5Margin *
84 (kPacketLossRate5 - old_loss_rate > 0 ? 1 : -1)) { 84 (kPacketLossRate5 - old_loss_rate > 0 ? 1 : -1)) {
85 return kPacketLossRate5; 85 return kPacketLossRate5;
86 } else if (new_loss_rate >= kPacketLossRate1) { 86 } else if (new_loss_rate >= kPacketLossRate1) {
87 return kPacketLossRate1; 87 return kPacketLossRate1;
88 } else { 88 } else {
89 return 0.0; 89 return 0.0f;
90 } 90 }
91 } 91 }
92 92
93 } // namespace 93 } // namespace
94 94
95 class AudioEncoderOpus::PacketLossFractionSmoother { 95 class AudioEncoderOpus::PacketLossFractionSmoother {
96 public: 96 public:
97 explicit PacketLossFractionSmoother(const Clock* clock) 97 explicit PacketLossFractionSmoother(const Clock* clock)
98 : clock_(clock), 98 : clock_(clock),
99 last_sample_time_ms_(clock_->TimeInMilliseconds()), 99 last_sample_time_ms_(clock_->TimeInMilliseconds()),
(...skipping 152 matching lines...) Expand 10 before | Expand all | Expand 10 after
252 } 252 }
253 return RecreateEncoderInstance(conf); 253 return RecreateEncoderInstance(conf);
254 } 254 }
255 255
256 void AudioEncoderOpus::SetMaxPlaybackRate(int frequency_hz) { 256 void AudioEncoderOpus::SetMaxPlaybackRate(int frequency_hz) {
257 auto conf = config_; 257 auto conf = config_;
258 conf.max_playback_rate_hz = frequency_hz; 258 conf.max_playback_rate_hz = frequency_hz;
259 RTC_CHECK(RecreateEncoderInstance(conf)); 259 RTC_CHECK(RecreateEncoderInstance(conf));
260 } 260 }
261 261
262 void AudioEncoderOpus::SetProjectedPacketLossRate(double fraction) {
263 double opt_loss_rate = OptimizePacketLossRate(fraction, packet_loss_rate_);
264 if (packet_loss_rate_ != opt_loss_rate) {
265 packet_loss_rate_ = opt_loss_rate;
266 RTC_CHECK_EQ(
267 0, WebRtcOpus_SetPacketLossRate(
268 inst_, static_cast<int32_t>(packet_loss_rate_ * 100 + .5)));
269 }
270 }
271
272 void AudioEncoderOpus::SetTargetBitrate(int bits_per_second) {
273 config_.bitrate_bps = rtc::Optional<int>(
274 std::max(std::min(bits_per_second, kMaxBitrateBps), kMinBitrateBps));
275 RTC_DCHECK(config_.IsOk());
276 RTC_CHECK_EQ(0, WebRtcOpus_SetBitRate(inst_, config_.GetBitrateBps()));
277 const auto new_complexity = config_.GetNewComplexity();
278 if (new_complexity && complexity_ != *new_complexity) {
279 complexity_ = *new_complexity;
280 RTC_CHECK_EQ(0, WebRtcOpus_SetComplexity(inst_, complexity_));
281 }
282 }
283
284 bool AudioEncoderOpus::EnableAudioNetworkAdaptor( 262 bool AudioEncoderOpus::EnableAudioNetworkAdaptor(
285 const std::string& config_string, 263 const std::string& config_string,
286 const Clock* clock) { 264 const Clock* clock) {
287 audio_network_adaptor_ = audio_network_adaptor_creator_(config_string, clock); 265 audio_network_adaptor_ = audio_network_adaptor_creator_(config_string, clock);
288 return audio_network_adaptor_.get() != nullptr; 266 return audio_network_adaptor_.get() != nullptr;
289 } 267 }
290 268
291 void AudioEncoderOpus::DisableAudioNetworkAdaptor() { 269 void AudioEncoderOpus::DisableAudioNetworkAdaptor() {
292 audio_network_adaptor_.reset(nullptr); 270 audio_network_adaptor_.reset(nullptr);
293 } 271 }
(...skipping 161 matching lines...) Expand 10 before | Expand all | Expand 10 after
455 RTC_DCHECK_GT(num_channels_to_encode, 0); 433 RTC_DCHECK_GT(num_channels_to_encode, 0);
456 RTC_DCHECK_LE(num_channels_to_encode, config_.num_channels); 434 RTC_DCHECK_LE(num_channels_to_encode, config_.num_channels);
457 435
458 if (num_channels_to_encode_ == num_channels_to_encode) 436 if (num_channels_to_encode_ == num_channels_to_encode)
459 return; 437 return;
460 438
461 RTC_CHECK_EQ(0, WebRtcOpus_SetForceChannels(inst_, num_channels_to_encode)); 439 RTC_CHECK_EQ(0, WebRtcOpus_SetForceChannels(inst_, num_channels_to_encode));
462 num_channels_to_encode_ = num_channels_to_encode; 440 num_channels_to_encode_ = num_channels_to_encode;
463 } 441 }
464 442
443 void AudioEncoderOpus::SetProjectedPacketLossRate(float fraction) {
444 float opt_loss_rate = OptimizePacketLossRate(fraction, packet_loss_rate_);
445 if (packet_loss_rate_ != opt_loss_rate) {
446 packet_loss_rate_ = opt_loss_rate;
447 RTC_CHECK_EQ(
448 0, WebRtcOpus_SetPacketLossRate(
449 inst_, static_cast<int32_t>(packet_loss_rate_ * 100 + .5)));
450 }
451 }
452
453 void AudioEncoderOpus::SetTargetBitrate(int bits_per_second) {
454 config_.bitrate_bps = rtc::Optional<int>(
455 std::max(std::min(bits_per_second, kMaxBitrateBps), kMinBitrateBps));
456 RTC_DCHECK(config_.IsOk());
457 RTC_CHECK_EQ(0, WebRtcOpus_SetBitRate(inst_, config_.GetBitrateBps()));
458 const auto new_complexity = config_.GetNewComplexity();
459 if (new_complexity && complexity_ != *new_complexity) {
460 complexity_ = *new_complexity;
461 RTC_CHECK_EQ(0, WebRtcOpus_SetComplexity(inst_, complexity_));
462 }
463 }
464
465 void AudioEncoderOpus::ApplyAudioNetworkAdaptor() { 465 void AudioEncoderOpus::ApplyAudioNetworkAdaptor() {
466 auto config = audio_network_adaptor_->GetEncoderRuntimeConfig(); 466 auto config = audio_network_adaptor_->GetEncoderRuntimeConfig();
467 // |audio_network_adaptor_| is supposed to be configured to output all 467 // |audio_network_adaptor_| is supposed to be configured to output all
468 // following parameters. 468 // following parameters.
469 RTC_DCHECK(config.bitrate_bps); 469 RTC_DCHECK(config.bitrate_bps);
470 RTC_DCHECK(config.frame_length_ms); 470 RTC_DCHECK(config.frame_length_ms);
471 RTC_DCHECK(config.uplink_packet_loss_fraction); 471 RTC_DCHECK(config.uplink_packet_loss_fraction);
472 RTC_DCHECK(config.enable_fec); 472 RTC_DCHECK(config.enable_fec);
473 RTC_DCHECK(config.enable_dtx); 473 RTC_DCHECK(config.enable_dtx);
474 RTC_DCHECK(config.num_channels); 474 RTC_DCHECK(config.num_channels);
(...skipping 15 matching lines...) Expand all
490 AudioNetworkAdaptorImpl::Config config; 490 AudioNetworkAdaptorImpl::Config config;
491 config.clock = clock; 491 config.clock = clock;
492 return std::unique_ptr<AudioNetworkAdaptor>(new AudioNetworkAdaptorImpl( 492 return std::unique_ptr<AudioNetworkAdaptor>(new AudioNetworkAdaptorImpl(
493 config, ControllerManagerImpl::Create( 493 config, ControllerManagerImpl::Create(
494 config_string, NumChannels(), supported_frame_lengths_ms(), 494 config_string, NumChannels(), supported_frame_lengths_ms(),
495 num_channels_to_encode_, next_frame_length_ms_, 495 num_channels_to_encode_, next_frame_length_ms_,
496 GetTargetBitrate(), config_.fec_enabled, GetDtx(), clock))); 496 GetTargetBitrate(), config_.fec_enabled, GetDtx(), clock)));
497 } 497 }
498 498
499 } // namespace webrtc 499 } // namespace webrtc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698