Chromium Code Reviews| Index: webrtc/modules/audio_coding/codecs/opus/audio_encoder_opus.cc |
| diff --git a/webrtc/modules/audio_coding/codecs/opus/audio_encoder_opus.cc b/webrtc/modules/audio_coding/codecs/opus/audio_encoder_opus.cc |
| index af66cd3634ee1cdabcfab57f18c80c953a0a9391..1212920de955b8cd7daf1cf7b671849271a94d3f 100644 |
| --- a/webrtc/modules/audio_coding/codecs/opus/audio_encoder_opus.cc |
| +++ b/webrtc/modules/audio_coding/codecs/opus/audio_encoder_opus.cc |
| @@ -172,7 +172,8 @@ rtc::Optional<int> AudioEncoderOpus::Config::GetNewComplexity() const { |
| AudioEncoderOpus::AudioEncoderOpus( |
| const Config& config, |
| - AudioNetworkAdaptorCreator&& audio_network_adaptor_creator) |
| + AudioNetworkAdaptorCreator&& audio_network_adaptor_creator, |
| + std::unique_ptr<SmoothingFilter> bitrate_smoother) |
| : packet_loss_rate_(0.0), |
| inst_(nullptr), |
| packet_loss_fraction_smoother_(new PacketLossFractionSmoother( |
| @@ -183,7 +184,10 @@ AudioEncoderOpus::AudioEncoderOpus( |
| : [this](const std::string& config_string, const Clock* clock) { |
| return DefaultAudioNetworkAdaptorCreator(config_string, |
| clock); |
| - }) { |
| + }), |
| + bitrate_smoother_(bitrate_smoother |
| + ? std::move(bitrate_smoother) : std::unique_ptr<SmoothingFilter>( |
| + new SmoothingFilterImpl(500, config.clock))) { |
|
minyue-webrtc
2016/12/22 14:51:26
need to explain 500
|
| RTC_CHECK(RecreateEncoderInstance(config)); |
| } |
| @@ -272,13 +276,6 @@ void AudioEncoderOpus::DisableAudioNetworkAdaptor() { |
| audio_network_adaptor_.reset(nullptr); |
| } |
| -void AudioEncoderOpus::OnReceivedUplinkBandwidth(int uplink_bandwidth_bps) { |
| - if (!audio_network_adaptor_) |
| - return; |
| - audio_network_adaptor_->SetUplinkBandwidth(uplink_bandwidth_bps); |
| - ApplyAudioNetworkAdaptor(); |
| -} |
| - |
| void AudioEncoderOpus::OnReceivedUplinkPacketLossFraction( |
| float uplink_packet_loss_fraction) { |
| if (!audio_network_adaptor_) { |
| @@ -292,9 +289,25 @@ void AudioEncoderOpus::OnReceivedUplinkPacketLossFraction( |
| } |
| void AudioEncoderOpus::OnReceivedTargetAudioBitrate( |
| - int target_audio_bitrate_bps) { |
| + int target_audio_bitrate_bps, |
| + rtc::Optional<int64_t> probing_interval_ms) { |
| if (audio_network_adaptor_) { |
| audio_network_adaptor_->SetTargetAudioBitrate(target_audio_bitrate_bps); |
| + // We give smoothed bitrate allocation to audio network adaptor as |
| + // the uplink bandwidth. |
| + // The probing spikes should not affect the bitrate smoother more than 25%. |
| + // To simplify the calculations we use a step response as input signal. |
| + // The step response of an exponential filter is |
| + // u(t) = 1 - e^(-t / time_constant). |
| + // In order to limit the affect of a BWE spike within 25% of its value |
| + // before |
| + // the next probing, we would choose a time constant that fulfills |
| + // 1 - e^(-probing_interval_ms / time_constant) < 0.25 |
| + // Then 4 * probing_interval_ms is a good choice. |
| + if (probing_interval_ms) |
| + bitrate_smoother_->SetTimeConstantMs(*probing_interval_ms * 4); |
| + bitrate_smoother_->AddSample(target_audio_bitrate_bps); |
| + |
| ApplyAudioNetworkAdaptor(); |
| } else if (webrtc::field_trial::FindFullName( |
| "WebRTC-SendSideBwe-WithOverhead") == "Enabled") { |
| @@ -354,6 +367,7 @@ AudioEncoder::EncodedInfo AudioEncoderOpus::EncodeImpl( |
| uint32_t rtp_timestamp, |
| rtc::ArrayView<const int16_t> audio, |
| rtc::Buffer* encoded) { |
| + MayUpdateUplinkBandwidth(); |
| if (input_buffer_.empty()) |
| first_timestamp_in_buffer_ = rtp_timestamp; |
| @@ -523,4 +537,17 @@ AudioEncoderOpus::DefaultAudioNetworkAdaptorCreator( |
| GetTargetBitrate(), config_.fec_enabled, GetDtx(), clock))); |
| } |
| +void AudioEncoderOpus::MayUpdateUplinkBandwidth() { |
|
ossu
2016/12/22 14:01:15
nit: May -> Maybe
There are several Maybe functio
michaelt
2016/12/22 14:56:10
Done.
|
| + if (audio_network_adaptor_) { |
| + int64_t now = config_.clock->TimeInMilliseconds(); |
| + if (!last_smoothed_bandwith_update_ || |
| + now - *last_smoothed_bandwith_update_ >= |
| + config_.update_uplink_bandwidth_interval_ms) { |
| + audio_network_adaptor_->SetUplinkBandwidth( |
| + *bitrate_smoother_->GetAverage()); |
|
minyue-webrtc
2016/12/22 14:51:26
shall Dcheck bitrate_smoother_.GetAverage() is not
michaelt
2016/12/22 15:10:10
Added a if since this could relay happens.
|
| + last_smoothed_bandwith_update_ = rtc::Optional<int64_t>(now); |
| + } |
| + } |
| +} |
| + |
| } // namespace webrtc |