From: Andreas Pehrson Date: Mon, 18 Jan 2021 11:04:00 +0100 Subject: Bug 1654112 - Include RtcpPacketTypeCounter in audio send stats, to not regress nackCount. r=ng This is similar to how it's already included for video send. Differential Revision: https://phabricator.services.mozilla.com/D102273 Mercurial Revision: https://hg.mozilla.org/mozilla-central/rev/d380a43d59f4f7cbc001f4eab9b63ee993b32cd8 --- audio/audio_send_stream.cc | 1 + audio/channel_send.cc | 31 +++++++++++++++++++++++++++++++ audio/channel_send.h | 1 + call/audio_send_stream.h | 2 ++ 4 files changed, 35 insertions(+) diff --git a/audio/audio_send_stream.cc b/audio/audio_send_stream.cc index 6e5bd18fef..831e6c2815 100644 --- a/audio/audio_send_stream.cc +++ b/audio/audio_send_stream.cc @@ -413,6 +413,7 @@ webrtc::AudioSendStream::Stats AudioSendStream::GetStats( stats.target_bitrate_bps = channel_send_->GetTargetBitrate(); webrtc::CallSendStatistics call_stats = channel_send_->GetRTCPStatistics(); + stats.rtcp_packet_type_counts = call_stats.rtcp_packet_type_counts; stats.payload_bytes_sent = call_stats.payload_bytes_sent; stats.header_and_padding_bytes_sent = call_stats.header_and_padding_bytes_sent; diff --git a/audio/channel_send.cc b/audio/channel_send.cc index 7b000341cc..b4087ec512 100644 --- a/audio/channel_send.cc +++ b/audio/channel_send.cc @@ -80,6 +80,31 @@ constexpr TimeDelta kMinRetransmissionWindow = TimeDelta::Millis(30); class RtpPacketSenderProxy; class TransportSequenceNumberProxy; +class RtcpCounterObserver : public RtcpPacketTypeCounterObserver { + public: + explicit RtcpCounterObserver(uint32_t ssrc) : ssrc_(ssrc) {} + + void RtcpPacketTypesCounterUpdated( + uint32_t ssrc, const RtcpPacketTypeCounter& packet_counter) override { + if (ssrc_ != ssrc) { + return; + } + + MutexLock lock(&mutex_); + packet_counter_ = packet_counter; + } + + RtcpPacketTypeCounter GetCounts() { + MutexLock lock(&mutex_); + return packet_counter_; + } + + private: + Mutex mutex_; + const uint32_t ssrc_; + RtcpPacketTypeCounter packet_counter_; +}; + class AudioBitrateAccountant { public: void RegisterPacketOverhead(int packet_byte_overhead) { @@ -282,6 +307,8 @@ class ChannelSend : public ChannelSendInterface, bool input_mute_ RTC_GUARDED_BY(volume_settings_mutex_) = false; bool previous_frame_muted_ RTC_GUARDED_BY(encoder_queue_checker_) = false; + const std::unique_ptr rtcp_counter_observer_; + PacketRouter* packet_router_ RTC_GUARDED_BY(&worker_thread_checker_) = nullptr; const std::unique_ptr rtp_packet_pacer_proxy_; @@ -493,6 +520,7 @@ ChannelSend::ChannelSend( RtpTransportControllerSendInterface* transport_controller) : env_(env), ssrc_(ssrc), + rtcp_counter_observer_(new RtcpCounterObserver(ssrc)), rtp_packet_pacer_proxy_(new RtpPacketSenderProxy()), retransmission_rate_limiter_( new RateLimiter(&env_.clock(), kMaxRetransmissionWindow.ms())), @@ -514,6 +542,8 @@ ChannelSend::ChannelSend( configuration.paced_sender = rtp_packet_pacer_proxy_.get(); configuration.rtt_stats = rtcp_rtt_stats; + configuration.rtcp_packet_type_counter_observer = + rtcp_counter_observer_.get(); if (env_.field_trials().IsDisabled("WebRTC-DisableRtxRateLimiter")) { configuration.retransmission_rate_limiter = retransmission_rate_limiter_.get(); @@ -776,6 +806,7 @@ CallSendStatistics ChannelSend::GetRTCPStatistics() const { RTC_DCHECK_RUN_ON(&worker_thread_checker_); CallSendStatistics stats = {0}; stats.rttMs = rtp_rtcp_->LastRtt().value_or(TimeDelta::Zero()).ms(); + stats.rtcp_packet_type_counts = rtcp_counter_observer_->GetCounts(); StreamDataCounters rtp_stats; StreamDataCounters rtx_stats; diff --git a/audio/channel_send.h b/audio/channel_send.h index 8cd5b4e875..9335f63f0d 100644 --- a/audio/channel_send.h +++ b/audio/channel_send.h @@ -49,6 +49,7 @@ struct CallSendStatistics { TimeDelta total_packet_send_delay = TimeDelta::Zero(); // https://w3c.github.io/webrtc-stats/#dom-rtcoutboundrtpstreamstats-retransmittedpacketssent uint64_t retransmitted_packets_sent; + RtcpPacketTypeCounter rtcp_packet_type_counts; // A snapshot of Report Blocks with additional data of interest to statistics. // Within this list, the sender-source SSRC pair is unique and per-pair the // ReportBlockData represents the latest Report Block that was received for diff --git a/call/audio_send_stream.h b/call/audio_send_stream.h index 2d2cc89b08..b305fa8bd1 100644 --- a/call/audio_send_stream.h +++ b/call/audio_send_stream.h @@ -32,6 +32,7 @@ #include "api/units/time_delta.h" #include "call/audio_sender.h" #include "modules/rtp_rtcp/include/report_block_data.h" +#include "modules/rtp_rtcp/include/rtcp_statistics.h" namespace webrtc { @@ -66,6 +67,7 @@ class AudioSendStream : public AudioSender { ANAStats ana_statistics; AudioProcessingStats apm_statistics; + RtcpPacketTypeCounter rtcp_packet_type_counts; int64_t target_bitrate_bps = 0; // A snapshot of Report Blocks with additional data of interest to