[Stats] Expose totalPacketSendDelay for audio as well.

This information is now readily available. Let's expose it.

In practise we don't pace audio by default and the delay is ~0, however
we can tell that this metric is working as intended by setting
PacingController's pace_audio_ to true via the "WebRTC-Pacer-BlockAudio"
field trial. In this case chrome://webrtc-internals/ plots neats graphs
for audio send delay.

Bug: webrtc:10635
Change-Id: Iecfd93bb84ec61e5d54232769a9e7a500601b199
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/280523
Reviewed-by: Harald Alvestrand <hta@webrtc.org>
Reviewed-by: Erik Språng <sprang@webrtc.org>
Commit-Queue: Henrik Boström <hbos@webrtc.org>
Cr-Commit-Position: refs/heads/main@{#38483}
This commit is contained in:
Henrik Boström
2022-10-26 16:53:03 +02:00
committed by WebRTC LUCI CQ
parent 86cfcc5eef
commit aebba7b468
10 changed files with 17 additions and 11 deletions

View File

@ -549,8 +549,6 @@ class RTC_EXPORT RTCOutboundRTPStreamStats final : public RTCRTPStreamStats {
RTCStatsMember<double> frames_per_second;
RTCStatsMember<uint32_t> frames_sent;
RTCStatsMember<uint32_t> huge_frames_sent;
// TODO(https://crbug.com/webrtc/10635): This is only implemented for video;
// implement it for audio as well.
RTCStatsMember<double> total_packet_send_delay;
// Enum type RTCQualityLimitationReason
RTCStatsMember<std::string> quality_limitation_reason;

View File

@ -441,6 +441,7 @@ webrtc::AudioSendStream::Stats AudioSendStream::GetStats(
call_stats.header_and_padding_bytes_sent;
stats.retransmitted_bytes_sent = call_stats.retransmitted_bytes_sent;
stats.packets_sent = call_stats.packetsSent;
stats.total_packet_send_delay = call_stats.total_packet_send_delay;
stats.retransmitted_packets_sent = call_stats.retransmitted_packets_sent;
// RTT isn't known until a RTCP report is received. Until then, VoiceEngine
// returns 0 to indicate an error value.

View File

@ -779,6 +779,7 @@ CallSendStatistics ChannelSend::GetRTCPStatistics() const {
stats.retransmitted_bytes_sent = rtp_stats.retransmitted.payload_bytes;
stats.packetsSent =
rtp_stats.transmitted.packets + rtx_stats.transmitted.packets;
stats.total_packet_send_delay = rtp_stats.transmitted.total_packet_delay;
stats.retransmitted_packets_sent = rtp_stats.retransmitted.packets;
stats.report_block_datas = rtp_rtcp_->GetLatestReportBlockData();

View File

@ -39,6 +39,8 @@ struct CallSendStatistics {
// https://w3c.github.io/webrtc-stats/#dom-rtcoutboundrtpstreamstats-retransmittedbytessent
uint64_t retransmitted_bytes_sent;
int packetsSent;
// https://w3c.github.io/webrtc-stats/#dom-rtcoutboundrtpstreamstats-totalpacketsenddelay
TimeDelta total_packet_send_delay = TimeDelta::Zero();
// https://w3c.github.io/webrtc-stats/#dom-rtcoutboundrtpstreamstats-retransmittedpacketssent
uint64_t retransmitted_packets_sent;
// A snapshot of Report Blocks with additional data of interest to statistics.

View File

@ -46,6 +46,8 @@ class AudioSendStream : public AudioSender {
// https://w3c.github.io/webrtc-stats/#dom-rtcoutboundrtpstreamstats-retransmittedbytessent
uint64_t retransmitted_bytes_sent = 0;
int32_t packets_sent = 0;
// https://w3c.github.io/webrtc-stats/#dom-rtcoutboundrtpstreamstats-totalpacketsenddelay
TimeDelta total_packet_send_delay = TimeDelta::Zero();
// https://w3c.github.io/webrtc-stats/#dom-rtcoutboundrtpstreamstats-retransmittedpacketssent
uint64_t retransmitted_packets_sent = 0;
int32_t packets_lost = -1;

View File

@ -405,6 +405,8 @@ struct MediaSenderInfo {
// the SSRC of the corresponding outbound RTP stream, is unique.
std::vector<webrtc::ReportBlockData> report_block_datas;
absl::optional<bool> active;
// https://w3c.github.io/webrtc-stats/#dom-rtcoutboundrtpstreamstats-totalpacketsenddelay
webrtc::TimeDelta total_packet_send_delay = webrtc::TimeDelta::Zero();
};
struct MediaReceiverInfo {
@ -595,8 +597,6 @@ struct VideoSenderInfo : public MediaSenderInfo {
uint64_t total_encode_time_ms = 0;
// https://w3c.github.io/webrtc-stats/#dom-rtcoutboundrtpstreamstats-totalencodedbytestarget
uint64_t total_encoded_bytes_target = 0;
// https://w3c.github.io/webrtc-stats/#dom-rtcoutboundrtpstreamstats-totalpacketsenddelay
webrtc::TimeDelta total_packet_send_delay = webrtc::TimeDelta::Zero();
bool has_entered_low_resolution = false;
absl::optional<uint64_t> qp_sum;
webrtc::VideoContentType content_type = webrtc::VideoContentType::UNSPECIFIED;

View File

@ -2288,6 +2288,7 @@ bool WebRtcVoiceMediaChannel::GetStats(VoiceMediaInfo* info,
sinfo.header_and_padding_bytes_sent = stats.header_and_padding_bytes_sent;
sinfo.retransmitted_bytes_sent = stats.retransmitted_bytes_sent;
sinfo.packets_sent = stats.packets_sent;
sinfo.total_packet_send_delay = stats.total_packet_send_delay;
sinfo.retransmitted_packets_sent = stats.retransmitted_packets_sent;
sinfo.packets_lost = stats.packets_lost;
sinfo.fraction_lost = stats.fraction_lost;

View File

@ -665,6 +665,8 @@ void SetOutboundRTPStreamStatsFromMediaSenderInfo(
outbound_stats->ssrc = media_sender_info.ssrc();
outbound_stats->packets_sent =
static_cast<uint32_t>(media_sender_info.packets_sent);
outbound_stats->total_packet_send_delay =
media_sender_info.total_packet_send_delay.seconds<double>();
outbound_stats->retransmitted_packets_sent =
media_sender_info.retransmitted_packets_sent;
outbound_stats->bytes_sent =
@ -674,7 +676,6 @@ void SetOutboundRTPStreamStatsFromMediaSenderInfo(
outbound_stats->retransmitted_bytes_sent =
media_sender_info.retransmitted_bytes_sent;
outbound_stats->nack_count = media_sender_info.nacks_rcvd;
if (media_sender_info.active.has_value()) {
outbound_stats->active = *media_sender_info.active;
}
@ -764,8 +765,6 @@ void SetOutboundRTPStreamStatsFromVideoSenderInfo(
}
outbound_video->frames_sent = video_sender_info.frames_sent;
outbound_video->huge_frames_sent = video_sender_info.huge_frames_sent;
outbound_video->total_packet_send_delay =
video_sender_info.total_packet_send_delay.seconds<double>();
outbound_video->quality_limitation_reason =
QualityLimitationReasonToRTCQualityLimitationReason(
video_sender_info.quality_limitation_reason);

View File

@ -2758,6 +2758,7 @@ TEST_F(RTCStatsCollectorTest, CollectRTCOutboundRTPStreamStats_Audio) {
voice_media_info.senders[0].local_stats.push_back(cricket::SsrcSenderInfo());
voice_media_info.senders[0].local_stats[0].ssrc = 1;
voice_media_info.senders[0].packets_sent = 2;
voice_media_info.senders[0].total_packet_send_delay = TimeDelta::Seconds(1);
voice_media_info.senders[0].retransmitted_packets_sent = 20;
voice_media_info.senders[0].payload_bytes_sent = 3;
voice_media_info.senders[0].header_and_padding_bytes_sent = 12;
@ -2795,6 +2796,7 @@ TEST_F(RTCStatsCollectorTest, CollectRTCOutboundRTPStreamStats_Audio) {
expected_audio.transport_id = "TTransportName1";
expected_audio.codec_id = "COTTransportName1_42";
expected_audio.packets_sent = 2;
expected_audio.total_packet_send_delay = 1;
expected_audio.retransmitted_packets_sent = 20;
expected_audio.bytes_sent = 3;
expected_audio.header_bytes_sent = 12;
@ -3192,6 +3194,7 @@ TEST_F(RTCStatsCollectorTest, CollectNoStreamRTCOutboundRTPStreamStats_Audio) {
voice_media_info.senders[0].local_stats.push_back(cricket::SsrcSenderInfo());
voice_media_info.senders[0].local_stats[0].ssrc = 1;
voice_media_info.senders[0].packets_sent = 2;
voice_media_info.senders[0].total_packet_send_delay = TimeDelta::Seconds(0.5);
voice_media_info.senders[0].retransmitted_packets_sent = 20;
voice_media_info.senders[0].payload_bytes_sent = 3;
voice_media_info.senders[0].header_and_padding_bytes_sent = 4;
@ -3228,6 +3231,7 @@ TEST_F(RTCStatsCollectorTest, CollectNoStreamRTCOutboundRTPStreamStats_Audio) {
expected_audio.transport_id = "TTransportName1";
expected_audio.codec_id = "COTTransportName1_42";
expected_audio.packets_sent = 2;
expected_audio.total_packet_send_delay = 0.5;
expected_audio.retransmitted_packets_sent = 20;
expected_audio.bytes_sent = 3;
expected_audio.header_bytes_sent = 4;

View File

@ -998,6 +998,8 @@ class RTCStatsReportVerifier {
verifier.TestMemberIsOptionalIDReference(
outbound_stream.remote_id, RTCRemoteInboundRtpStreamStats::kType);
verifier.TestMemberIsNonNegative<uint32_t>(outbound_stream.packets_sent);
verifier.TestMemberIsNonNegative<double>(
outbound_stream.total_packet_send_delay);
verifier.TestMemberIsNonNegative<uint64_t>(
outbound_stream.retransmitted_packets_sent);
verifier.TestMemberIsNonNegative<uint64_t>(outbound_stream.bytes_sent);
@ -1013,8 +1015,6 @@ class RTCStatsReportVerifier {
outbound_stream.total_encode_time);
verifier.TestMemberIsNonNegative<uint64_t>(
outbound_stream.total_encoded_bytes_target);
verifier.TestMemberIsNonNegative<double>(
outbound_stream.total_packet_send_delay);
verifier.TestMemberIsDefined(outbound_stream.quality_limitation_reason);
verifier.TestMemberIsDefined(
outbound_stream.quality_limitation_durations);
@ -1047,8 +1047,6 @@ class RTCStatsReportVerifier {
verifier.TestMemberIsUndefined(outbound_stream.total_encode_time);
verifier.TestMemberIsUndefined(
outbound_stream.total_encoded_bytes_target);
// TODO(https://crbug.com/webrtc/10635): Implement for audio as well.
verifier.TestMemberIsUndefined(outbound_stream.total_packet_send_delay);
verifier.TestMemberIsUndefined(outbound_stream.quality_limitation_reason);
verifier.TestMemberIsUndefined(
outbound_stream.quality_limitation_durations);