| 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 | 15 |
| 15 #include "webrtc/base/checks.h" | 16 #include "webrtc/base/checks.h" |
| 16 #include "webrtc/base/exp_filter.h" | 17 #include "webrtc/base/exp_filter.h" |
| 17 #include "webrtc/base/safe_conversions.h" | 18 #include "webrtc/base/safe_conversions.h" |
| 18 #include "webrtc/common_types.h" | 19 #include "webrtc/common_types.h" |
| 19 #include "webrtc/modules/audio_coding/audio_network_adaptor/audio_network_adapto
r_impl.h" | 20 #include "webrtc/modules/audio_coding/audio_network_adaptor/audio_network_adapto
r_impl.h" |
| 20 #include "webrtc/modules/audio_coding/audio_network_adaptor/controller_manager.h
" | 21 #include "webrtc/modules/audio_coding/audio_network_adaptor/controller_manager.h
" |
| 21 #include "webrtc/modules/audio_coding/codecs/opus/opus_interface.h" | 22 #include "webrtc/modules/audio_coding/codecs/opus/opus_interface.h" |
| 22 #include "webrtc/system_wrappers/include/clock.h" | 23 #include "webrtc/system_wrappers/include/clock.h" |
| 23 | 24 |
| (...skipping 11 matching lines...) Expand all Loading... |
| 35 constexpr float kAlphaForPacketLossFractionSmoother = 0.9999f; | 36 constexpr float kAlphaForPacketLossFractionSmoother = 0.9999f; |
| 36 | 37 |
| 37 AudioEncoderOpus::Config CreateConfig(const CodecInst& codec_inst) { | 38 AudioEncoderOpus::Config CreateConfig(const CodecInst& codec_inst) { |
| 38 AudioEncoderOpus::Config config; | 39 AudioEncoderOpus::Config config; |
| 39 config.frame_size_ms = rtc::CheckedDivExact(codec_inst.pacsize, 48); | 40 config.frame_size_ms = rtc::CheckedDivExact(codec_inst.pacsize, 48); |
| 40 config.num_channels = codec_inst.channels; | 41 config.num_channels = codec_inst.channels; |
| 41 config.bitrate_bps = rtc::Optional<int>(codec_inst.rate); | 42 config.bitrate_bps = rtc::Optional<int>(codec_inst.rate); |
| 42 config.payload_type = codec_inst.pltype; | 43 config.payload_type = codec_inst.pltype; |
| 43 config.application = config.num_channels == 1 ? AudioEncoderOpus::kVoip | 44 config.application = config.num_channels == 1 ? AudioEncoderOpus::kVoip |
| 44 : AudioEncoderOpus::kAudio; | 45 : AudioEncoderOpus::kAudio; |
| 46 config.supported_frame_lengths_ms.push_back(config.frame_size_ms); |
| 45 return config; | 47 return config; |
| 46 } | 48 } |
| 47 | 49 |
| 48 // Optimize the loss rate to configure Opus. Basically, optimized loss rate is | 50 // Optimize the loss rate to configure Opus. Basically, optimized loss rate is |
| 49 // the input loss rate rounded down to various levels, because a robustly good | 51 // the input loss rate rounded down to various levels, because a robustly good |
| 50 // audio quality is achieved by lowering the packet loss down. | 52 // audio quality is achieved by lowering the packet loss down. |
| 51 // Additionally, to prevent toggling, margins are used, i.e., when jumping to | 53 // Additionally, to prevent toggling, margins are used, i.e., when jumping to |
| 52 // a loss rate from below, a higher threshold is used than jumping to the same | 54 // a loss rate from below, a higher threshold is used than jumping to the same |
| 53 // level from above. | 55 // level from above. |
| 54 double OptimizePacketLossRate(double new_loss_rate, double old_loss_rate) { | 56 double OptimizePacketLossRate(double new_loss_rate, double old_loss_rate) { |
| (...skipping 235 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 290 | 292 |
| 291 void AudioEncoderOpus::OnReceivedRtt(int rtt_ms) { | 293 void AudioEncoderOpus::OnReceivedRtt(int rtt_ms) { |
| 292 if (!audio_network_adaptor_) | 294 if (!audio_network_adaptor_) |
| 293 return; | 295 return; |
| 294 audio_network_adaptor_->SetRtt(rtt_ms); | 296 audio_network_adaptor_->SetRtt(rtt_ms); |
| 295 ApplyAudioNetworkAdaptor(); | 297 ApplyAudioNetworkAdaptor(); |
| 296 } | 298 } |
| 297 | 299 |
| 298 void AudioEncoderOpus::SetReceiverFrameLengthRange(int min_frame_length_ms, | 300 void AudioEncoderOpus::SetReceiverFrameLengthRange(int min_frame_length_ms, |
| 299 int max_frame_length_ms) { | 301 int max_frame_length_ms) { |
| 300 if (!audio_network_adaptor_) | 302 // Ensure that |SetReceiverFrameLengthRange| is called before |
| 301 return; | 303 // |EnableAudioNetworkAdaptor|, otherwise we need to recreate |
| 302 audio_network_adaptor_->SetReceiverFrameLengthRange(min_frame_length_ms, | 304 // |audio_network_adaptor_|, which is not a needed use case. |
| 303 max_frame_length_ms); | 305 RTC_DCHECK(!audio_network_adaptor_); |
| 304 ApplyAudioNetworkAdaptor(); | 306 |
| 307 config_.supported_frame_lengths_ms.clear(); |
| 308 std::copy_if(std::begin(kSupportedFrameLengths), |
| 309 std::end(kSupportedFrameLengths), |
| 310 std::back_inserter(config_.supported_frame_lengths_ms), |
| 311 [&](int frame_length_ms) { |
| 312 return frame_length_ms >= min_frame_length_ms && |
| 313 frame_length_ms <= max_frame_length_ms; |
| 314 }); |
| 315 RTC_DCHECK(std::is_sorted(config_.supported_frame_lengths_ms.begin(), |
| 316 config_.supported_frame_lengths_ms.end())); |
| 305 } | 317 } |
| 306 | 318 |
| 307 AudioEncoder::EncodedInfo AudioEncoderOpus::EncodeImpl( | 319 AudioEncoder::EncodedInfo AudioEncoderOpus::EncodeImpl( |
| 308 uint32_t rtp_timestamp, | 320 uint32_t rtp_timestamp, |
| 309 rtc::ArrayView<const int16_t> audio, | 321 rtc::ArrayView<const int16_t> audio, |
| 310 rtc::Buffer* encoded) { | 322 rtc::Buffer* encoded) { |
| 311 | 323 |
| 312 if (input_buffer_.empty()) | 324 if (input_buffer_.empty()) |
| 313 first_timestamp_in_buffer_ = rtp_timestamp; | 325 first_timestamp_in_buffer_ = rtp_timestamp; |
| 314 | 326 |
| (...skipping 125 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 440 } | 452 } |
| 441 | 453 |
| 442 std::unique_ptr<AudioNetworkAdaptor> | 454 std::unique_ptr<AudioNetworkAdaptor> |
| 443 AudioEncoderOpus::DefaultAudioNetworkAdaptorCreator( | 455 AudioEncoderOpus::DefaultAudioNetworkAdaptorCreator( |
| 444 const std::string& config_string, | 456 const std::string& config_string, |
| 445 const Clock* clock) const { | 457 const Clock* clock) const { |
| 446 AudioNetworkAdaptorImpl::Config config; | 458 AudioNetworkAdaptorImpl::Config config; |
| 447 config.clock = clock; | 459 config.clock = clock; |
| 448 return std::unique_ptr<AudioNetworkAdaptor>(new AudioNetworkAdaptorImpl( | 460 return std::unique_ptr<AudioNetworkAdaptor>(new AudioNetworkAdaptorImpl( |
| 449 config, ControllerManagerImpl::Create( | 461 config, ControllerManagerImpl::Create( |
| 450 config_string, NumChannels(), kSupportedFrameLengths, | 462 config_string, NumChannels(), supported_frame_lengths_ms(), |
| 451 num_channels_to_encode_, next_frame_length_ms_, | 463 num_channels_to_encode_, next_frame_length_ms_, |
| 452 GetTargetBitrate(), config_.fec_enabled, GetDtx(), clock))); | 464 GetTargetBitrate(), config_.fec_enabled, GetDtx(), clock))); |
| 453 } | 465 } |
| 454 | 466 |
| 455 } // namespace webrtc | 467 } // namespace webrtc |
| OLD | NEW |