| 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);
|
| }
|
|
|