| OLD | NEW |
| 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 #include <iterator> | 14 #include <iterator> |
| 15 | 15 |
| 16 #include "webrtc/base/analytics/exp_filter.h" | 16 #include "webrtc/base/analytics/exp_filter.h" |
| 17 #include "webrtc/base/checks.h" | 17 #include "webrtc/base/checks.h" |
| 18 #include "webrtc/base/logging.h" |
| 18 #include "webrtc/base/safe_conversions.h" | 19 #include "webrtc/base/safe_conversions.h" |
| 19 #include "webrtc/common_types.h" | 20 #include "webrtc/common_types.h" |
| 20 #include "webrtc/modules/audio_coding/audio_network_adaptor/audio_network_adapto
r_impl.h" | 21 #include "webrtc/modules/audio_coding/audio_network_adaptor/audio_network_adapto
r_impl.h" |
| 21 #include "webrtc/modules/audio_coding/audio_network_adaptor/controller_manager.h
" | 22 #include "webrtc/modules/audio_coding/audio_network_adaptor/controller_manager.h
" |
| 22 #include "webrtc/modules/audio_coding/codecs/opus/opus_interface.h" | 23 #include "webrtc/modules/audio_coding/codecs/opus/opus_interface.h" |
| 23 #include "webrtc/system_wrappers/include/clock.h" | 24 #include "webrtc/system_wrappers/include/clock.h" |
| 25 #include "webrtc/system_wrappers/include/field_trial.h" |
| 24 | 26 |
| 25 namespace webrtc { | 27 namespace webrtc { |
| 26 | 28 |
| 27 namespace { | 29 namespace { |
| 28 | 30 |
| 29 constexpr int kSampleRateHz = 48000; | 31 constexpr int kSampleRateHz = 48000; |
| 30 constexpr int kMinBitrateBps = 500; | 32 constexpr int kMinBitrateBps = 500; |
| 31 constexpr int kMaxBitrateBps = 512000; | 33 constexpr int kMaxBitrateBps = 512000; |
| 32 constexpr int kSupportedFrameLengths[] = {20, 60}; | 34 constexpr int kSupportedFrameLengths[] = {20, 60}; |
| 33 | 35 |
| (...skipping 250 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 284 float average_fraction_loss = packet_loss_fraction_smoother_->GetAverage(); | 286 float average_fraction_loss = packet_loss_fraction_smoother_->GetAverage(); |
| 285 return SetProjectedPacketLossRate(average_fraction_loss); | 287 return SetProjectedPacketLossRate(average_fraction_loss); |
| 286 } | 288 } |
| 287 audio_network_adaptor_->SetUplinkPacketLossFraction( | 289 audio_network_adaptor_->SetUplinkPacketLossFraction( |
| 288 uplink_packet_loss_fraction); | 290 uplink_packet_loss_fraction); |
| 289 ApplyAudioNetworkAdaptor(); | 291 ApplyAudioNetworkAdaptor(); |
| 290 } | 292 } |
| 291 | 293 |
| 292 void AudioEncoderOpus::OnReceivedTargetAudioBitrate( | 294 void AudioEncoderOpus::OnReceivedTargetAudioBitrate( |
| 293 int target_audio_bitrate_bps) { | 295 int target_audio_bitrate_bps) { |
| 294 if (!audio_network_adaptor_) | 296 if (audio_network_adaptor_) { |
| 295 return SetTargetBitrate(target_audio_bitrate_bps); | 297 audio_network_adaptor_->SetTargetAudioBitrate(target_audio_bitrate_bps); |
| 296 audio_network_adaptor_->SetTargetAudioBitrate(target_audio_bitrate_bps); | 298 ApplyAudioNetworkAdaptor(); |
| 297 ApplyAudioNetworkAdaptor(); | 299 } else if (webrtc::field_trial::FindFullName( |
| 300 "WebRTC-SendSideBwe-WithOverhead") == "Enabled") { |
| 301 if (!overhead_bytes_per_packet_) { |
| 302 LOG(LS_INFO) |
| 303 << "AudioEncoderOpus: Overhead unknown, target audio bitrate " |
| 304 << target_audio_bitrate_bps << " bps is ignored."; |
| 305 return; |
| 306 } |
| 307 const int overhead_bps = static_cast<int>( |
| 308 *overhead_bytes_per_packet_ * 8 * 100 / Num10MsFramesInNextPacket()); |
| 309 SetTargetBitrate(std::min( |
| 310 kMaxBitrateBps, |
| 311 std::max(kMinBitrateBps, target_audio_bitrate_bps - overhead_bps))); |
| 312 } else { |
| 313 SetTargetBitrate(target_audio_bitrate_bps); |
| 314 } |
| 298 } | 315 } |
| 299 | 316 |
| 300 void AudioEncoderOpus::OnReceivedRtt(int rtt_ms) { | 317 void AudioEncoderOpus::OnReceivedRtt(int rtt_ms) { |
| 301 if (!audio_network_adaptor_) | 318 if (!audio_network_adaptor_) |
| 302 return; | 319 return; |
| 303 audio_network_adaptor_->SetRtt(rtt_ms); | 320 audio_network_adaptor_->SetRtt(rtt_ms); |
| 304 ApplyAudioNetworkAdaptor(); | 321 ApplyAudioNetworkAdaptor(); |
| 305 } | 322 } |
| 306 | 323 |
| 324 void AudioEncoderOpus::OnReceivedOverhead(size_t overhead_bytes_per_packet) { |
| 325 if (audio_network_adaptor_) { |
| 326 audio_network_adaptor_->SetOverhead(overhead_bytes_per_packet); |
| 327 ApplyAudioNetworkAdaptor(); |
| 328 } else { |
| 329 overhead_bytes_per_packet_ = |
| 330 rtc::Optional<size_t>(overhead_bytes_per_packet); |
| 331 } |
| 332 } |
| 333 |
| 307 void AudioEncoderOpus::SetReceiverFrameLengthRange(int min_frame_length_ms, | 334 void AudioEncoderOpus::SetReceiverFrameLengthRange(int min_frame_length_ms, |
| 308 int max_frame_length_ms) { | 335 int max_frame_length_ms) { |
| 309 // Ensure that |SetReceiverFrameLengthRange| is called before | 336 // Ensure that |SetReceiverFrameLengthRange| is called before |
| 310 // |EnableAudioNetworkAdaptor|, otherwise we need to recreate | 337 // |EnableAudioNetworkAdaptor|, otherwise we need to recreate |
| 311 // |audio_network_adaptor_|, which is not a needed use case. | 338 // |audio_network_adaptor_|, which is not a needed use case. |
| 312 RTC_DCHECK(!audio_network_adaptor_); | 339 RTC_DCHECK(!audio_network_adaptor_); |
| 313 | 340 |
| 314 config_.supported_frame_lengths_ms.clear(); | 341 config_.supported_frame_lengths_ms.clear(); |
| 315 std::copy_if(std::begin(kSupportedFrameLengths), | 342 std::copy_if(std::begin(kSupportedFrameLengths), |
| 316 std::end(kSupportedFrameLengths), | 343 std::end(kSupportedFrameLengths), |
| (...skipping 173 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 490 AudioNetworkAdaptorImpl::Config config; | 517 AudioNetworkAdaptorImpl::Config config; |
| 491 config.clock = clock; | 518 config.clock = clock; |
| 492 return std::unique_ptr<AudioNetworkAdaptor>(new AudioNetworkAdaptorImpl( | 519 return std::unique_ptr<AudioNetworkAdaptor>(new AudioNetworkAdaptorImpl( |
| 493 config, ControllerManagerImpl::Create( | 520 config, ControllerManagerImpl::Create( |
| 494 config_string, NumChannels(), supported_frame_lengths_ms(), | 521 config_string, NumChannels(), supported_frame_lengths_ms(), |
| 495 num_channels_to_encode_, next_frame_length_ms_, | 522 num_channels_to_encode_, next_frame_length_ms_, |
| 496 GetTargetBitrate(), config_.fec_enabled, GetDtx(), clock))); | 523 GetTargetBitrate(), config_.fec_enabled, GetDtx(), clock))); |
| 497 } | 524 } |
| 498 | 525 |
| 499 } // namespace webrtc | 526 } // namespace webrtc |
| OLD | NEW |