Chromium Code Reviews| Index: webrtc/voice_engine/channel.cc |
| diff --git a/webrtc/voice_engine/channel.cc b/webrtc/voice_engine/channel.cc |
| index 2791f7f8b4ed555ed9da3e8d3f45ab6b9fa18171..8e5a4ca30ae12971fc2a981bd59c4150f8ef0885 100644 |
| --- a/webrtc/voice_engine/channel.cc |
| +++ b/webrtc/voice_engine/channel.cc |
| @@ -32,6 +32,7 @@ |
| #include "webrtc/modules/rtp_rtcp/include/receive_statistics.h" |
| #include "webrtc/modules/rtp_rtcp/include/rtp_payload_registry.h" |
| #include "webrtc/modules/rtp_rtcp/include/rtp_receiver.h" |
| +#include "webrtc/modules/rtp_rtcp/source/rtcp_packet/transport_feedback.h" |
| #include "webrtc/modules/rtp_rtcp/source/rtp_receiver_strategy.h" |
| #include "webrtc/modules/utility/include/process_thread.h" |
| #include "webrtc/system_wrappers/include/trace.h" |
| @@ -50,6 +51,11 @@ namespace { |
| constexpr int64_t kMaxRetransmissionWindowMs = 1000; |
| constexpr int64_t kMinRetransmissionWindowMs = 30; |
| +// TODO(elad.alon): Subsequent CL will make these values experiment-dependent. |
| +constexpr size_t kPacketLossTrackerMinWindowSize = 100; |
| +constexpr size_t kPacketLossTrackerMaxWindowSize = 200; |
| +constexpr size_t kPacketLossTrackerMinPairsNumForRplr = 50; |
| + |
| } // namespace |
| const int kTelephoneEventAttenuationdB = 10; |
| @@ -202,13 +208,15 @@ class TransportFeedbackProxy : public TransportFeedbackObserver { |
| } |
| // Implements TransportFeedbackObserver. |
| - void AddPacket(uint16_t sequence_number, |
| + void AddPacket(uint32_t ssrc, |
| + uint16_t sequence_number, |
| size_t length, |
| int probe_cluster_id) override { |
| RTC_DCHECK(pacer_thread_.CalledOnValidThread()); |
| rtc::CritScope lock(&crit_); |
| if (feedback_observer_) |
| - feedback_observer_->AddPacket(sequence_number, length, probe_cluster_id); |
| + feedback_observer_->AddPacket(ssrc, sequence_number, length, |
| + probe_cluster_id); |
| } |
| void OnTransportFeedback(const rtcp::TransportFeedback& feedback) override { |
| RTC_DCHECK(network_thread_.CalledOnValidThread()); |
| @@ -934,7 +942,12 @@ Channel::Channel(int32_t channelId, |
| rtp_packet_sender_proxy_(new RtpPacketSenderProxy()), |
| retransmission_rate_limiter_(new RateLimiter(Clock::GetRealTimeClock(), |
| kMaxRetransmissionWindowMs)), |
| - decoder_factory_(config.acm_config.decoder_factory) { |
| + decoder_factory_(config.acm_config.decoder_factory), |
| + // TODO(elad.alon): Subsequent CL experiments with PLR source. |
| + use_twcc_plr_for_ana_(false), |
|
sprang_webrtc
2017/02/03 11:57:04
This is always false?
elad.alon_webrtc.org
2017/02/03 15:54:02
For now, yes. This is one CL in a series; one of t
|
| + packet_loss_tracker_(kPacketLossTrackerMaxWindowSize, |
| + kPacketLossTrackerMinWindowSize, |
| + kPacketLossTrackerMinPairsNumForRplr) { |
| WEBRTC_TRACE(kTraceMemory, kTraceVoice, VoEId(_instanceId, _channelId), |
| "Channel::Channel() - ctor"); |
| AudioCodingModule::Config acm_config(config.acm_config); |
| @@ -1347,6 +1360,8 @@ void Channel::SetBitRate(int bitrate_bps, int64_t probing_interval_ms) { |
| } |
| void Channel::OnIncomingFractionLoss(int fraction_lost) { |
| + if (use_twcc_plr_for_ana_) |
| + return; |
| audio_coding_->ModifyEncoder([&](std::unique_ptr<AudioEncoder>* encoder) { |
| if (*encoder) |
| (*encoder)->OnReceivedUplinkPacketLossFraction(fraction_lost / 255.0f); |
| @@ -2905,6 +2920,32 @@ void Channel::OnOverheadChanged(size_t overhead_bytes_per_packet) { |
| UpdateOverheadForEncoder(); |
| } |
| +void Channel::HandleTransportFeedback( |
| + const std::vector<uint16_t>& packets_sent_since_last_feedback, |
| + const rtcp::TransportFeedback& feedback) { |
| + for (uint16_t sent_sequence_number : packets_sent_since_last_feedback) { |
| + packet_loss_tracker_.OnPacketAdded(sent_sequence_number); |
|
sprang_webrtc
2017/02/03 11:57:04
Will this really work?
Maybe I'm missing something
elad.alon_webrtc.org
2017/02/03 15:54:02
You've reviewed 2629883003, but skipped 2632203002
|
| + } |
| + |
| + // TODO(elad.alon): Needed even when !use_twcc_plr_for_ana_, because |
| + // subsequent CLs will introduce pushing RPLR down to ANA, too, and that |
| + // would happen unconditionally. |
| + // (Rationale for unconditionality: it's cheap enough, and once |
| + // experimentation is over, we either always do it or never do it, in which |
| + // case the code involved will just be deleted.) |
| + packet_loss_tracker_.OnReceivedTransportFeedback(feedback); |
| + |
| + if (use_twcc_plr_for_ana_) { |
| + rtc::Optional<float> plr = packet_loss_tracker_.GetPacketLossRate(); |
| + if (plr) { |
| + audio_coding_->ModifyEncoder([&](std::unique_ptr<AudioEncoder>* encoder) { |
| + if (*encoder) |
| + (*encoder)->OnReceivedUplinkPacketLossFraction(*plr); |
| + }); |
| + } |
| + } |
| +} |
| + |
| int Channel::RegisterExternalMediaProcessing(ProcessingTypes type, |
| VoEMediaProcess& processObject) { |
| WEBRTC_TRACE(kTraceInfo, kTraceVoice, VoEId(_instanceId, _channelId), |