Index: webrtc/voice_engine/channel.cc |
diff --git a/webrtc/voice_engine/channel.cc b/webrtc/voice_engine/channel.cc |
index a9fe6fdfa52f8902259f4f146491f3355fc88ce2..fd1bdc093efbd94f6aebbb4a1106cb4784756133 100644 |
--- a/webrtc/voice_engine/channel.cc |
+++ b/webrtc/voice_engine/channel.cc |
@@ -33,6 +33,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_packet_received.h" |
#include "webrtc/modules/rtp_rtcp/source/rtp_receiver_strategy.h" |
#include "webrtc/modules/utility/include/process_thread.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 kPacketLossTrackerMaxWindowSizeMs = 15000; |
+constexpr size_t kPlrMinNumAckedPackets = 50; |
+constexpr size_t kRplrMinNumAckedPairs = 40; |
+ |
} // namespace |
const int kTelephoneEventAttenuationdB = 10; |
@@ -247,13 +253,14 @@ class TransportFeedbackProxy : public TransportFeedbackObserver { |
} |
// Implements TransportFeedbackObserver. |
- void AddPacket(uint16_t sequence_number, |
+ void AddPacket(uint32_t ssrc, |
+ uint16_t sequence_number, |
size_t length, |
const PacedPacketInfo& pacing_info) override { |
RTC_DCHECK(pacer_thread_.CalledOnValidThread()); |
rtc::CritScope lock(&crit_); |
if (feedback_observer_) |
- feedback_observer_->AddPacket(sequence_number, length, pacing_info); |
+ feedback_observer_->AddPacket(ssrc, sequence_number, length, pacing_info); |
} |
void OnTransportFeedback(const rtcp::TransportFeedback& feedback) override { |
@@ -913,7 +920,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), |
+ packet_loss_tracker_(kPacketLossTrackerMaxWindowSizeMs, |
+ kPlrMinNumAckedPackets, |
+ kRplrMinNumAckedPairs) { |
WEBRTC_TRACE(kTraceMemory, kTraceVoice, VoEId(_instanceId, _channelId), |
"Channel::Channel() - ctor"); |
AudioCodingModule::Config acm_config(config.acm_config); |
@@ -1304,6 +1316,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); |
@@ -2731,6 +2745,34 @@ void Channel::OnOverheadChanged(size_t overhead_bytes_per_packet) { |
UpdateOverheadForEncoder(); |
} |
+void Channel::HandleTransportFeedback( |
+ const std::vector<SentTransportPacketRecord>& |
+ packets_sent_since_last_feedback, |
+ const rtcp::TransportFeedback& feedback) { |
+ for (const auto& sent_packet : packets_sent_since_last_feedback) { |
+ packet_loss_tracker_.OnPacketAdded(sent_packet.sequence_number, |
+ sent_packet.sent_time_ms); |
+ } |
+ |
+ // 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::GetNetworkStatistics(NetworkStatistics& stats) { |
return audio_coding_->GetNetworkStatistics(&stats); |
} |