[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:
committed by
WebRTC LUCI CQ
parent
86cfcc5eef
commit
aebba7b468
@ -549,8 +549,6 @@ class RTC_EXPORT RTCOutboundRTPStreamStats final : public RTCRTPStreamStats {
|
|||||||
RTCStatsMember<double> frames_per_second;
|
RTCStatsMember<double> frames_per_second;
|
||||||
RTCStatsMember<uint32_t> frames_sent;
|
RTCStatsMember<uint32_t> frames_sent;
|
||||||
RTCStatsMember<uint32_t> huge_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;
|
RTCStatsMember<double> total_packet_send_delay;
|
||||||
// Enum type RTCQualityLimitationReason
|
// Enum type RTCQualityLimitationReason
|
||||||
RTCStatsMember<std::string> quality_limitation_reason;
|
RTCStatsMember<std::string> quality_limitation_reason;
|
||||||
|
|||||||
@ -441,6 +441,7 @@ webrtc::AudioSendStream::Stats AudioSendStream::GetStats(
|
|||||||
call_stats.header_and_padding_bytes_sent;
|
call_stats.header_and_padding_bytes_sent;
|
||||||
stats.retransmitted_bytes_sent = call_stats.retransmitted_bytes_sent;
|
stats.retransmitted_bytes_sent = call_stats.retransmitted_bytes_sent;
|
||||||
stats.packets_sent = call_stats.packetsSent;
|
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;
|
stats.retransmitted_packets_sent = call_stats.retransmitted_packets_sent;
|
||||||
// RTT isn't known until a RTCP report is received. Until then, VoiceEngine
|
// RTT isn't known until a RTCP report is received. Until then, VoiceEngine
|
||||||
// returns 0 to indicate an error value.
|
// returns 0 to indicate an error value.
|
||||||
|
|||||||
@ -779,6 +779,7 @@ CallSendStatistics ChannelSend::GetRTCPStatistics() const {
|
|||||||
stats.retransmitted_bytes_sent = rtp_stats.retransmitted.payload_bytes;
|
stats.retransmitted_bytes_sent = rtp_stats.retransmitted.payload_bytes;
|
||||||
stats.packetsSent =
|
stats.packetsSent =
|
||||||
rtp_stats.transmitted.packets + rtx_stats.transmitted.packets;
|
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.retransmitted_packets_sent = rtp_stats.retransmitted.packets;
|
||||||
stats.report_block_datas = rtp_rtcp_->GetLatestReportBlockData();
|
stats.report_block_datas = rtp_rtcp_->GetLatestReportBlockData();
|
||||||
|
|
||||||
|
|||||||
@ -39,6 +39,8 @@ struct CallSendStatistics {
|
|||||||
// https://w3c.github.io/webrtc-stats/#dom-rtcoutboundrtpstreamstats-retransmittedbytessent
|
// https://w3c.github.io/webrtc-stats/#dom-rtcoutboundrtpstreamstats-retransmittedbytessent
|
||||||
uint64_t retransmitted_bytes_sent;
|
uint64_t retransmitted_bytes_sent;
|
||||||
int packetsSent;
|
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
|
// https://w3c.github.io/webrtc-stats/#dom-rtcoutboundrtpstreamstats-retransmittedpacketssent
|
||||||
uint64_t retransmitted_packets_sent;
|
uint64_t retransmitted_packets_sent;
|
||||||
// A snapshot of Report Blocks with additional data of interest to statistics.
|
// A snapshot of Report Blocks with additional data of interest to statistics.
|
||||||
|
|||||||
@ -46,6 +46,8 @@ class AudioSendStream : public AudioSender {
|
|||||||
// https://w3c.github.io/webrtc-stats/#dom-rtcoutboundrtpstreamstats-retransmittedbytessent
|
// https://w3c.github.io/webrtc-stats/#dom-rtcoutboundrtpstreamstats-retransmittedbytessent
|
||||||
uint64_t retransmitted_bytes_sent = 0;
|
uint64_t retransmitted_bytes_sent = 0;
|
||||||
int32_t packets_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
|
// https://w3c.github.io/webrtc-stats/#dom-rtcoutboundrtpstreamstats-retransmittedpacketssent
|
||||||
uint64_t retransmitted_packets_sent = 0;
|
uint64_t retransmitted_packets_sent = 0;
|
||||||
int32_t packets_lost = -1;
|
int32_t packets_lost = -1;
|
||||||
|
|||||||
@ -405,6 +405,8 @@ struct MediaSenderInfo {
|
|||||||
// the SSRC of the corresponding outbound RTP stream, is unique.
|
// the SSRC of the corresponding outbound RTP stream, is unique.
|
||||||
std::vector<webrtc::ReportBlockData> report_block_datas;
|
std::vector<webrtc::ReportBlockData> report_block_datas;
|
||||||
absl::optional<bool> active;
|
absl::optional<bool> active;
|
||||||
|
// https://w3c.github.io/webrtc-stats/#dom-rtcoutboundrtpstreamstats-totalpacketsenddelay
|
||||||
|
webrtc::TimeDelta total_packet_send_delay = webrtc::TimeDelta::Zero();
|
||||||
};
|
};
|
||||||
|
|
||||||
struct MediaReceiverInfo {
|
struct MediaReceiverInfo {
|
||||||
@ -595,8 +597,6 @@ struct VideoSenderInfo : public MediaSenderInfo {
|
|||||||
uint64_t total_encode_time_ms = 0;
|
uint64_t total_encode_time_ms = 0;
|
||||||
// https://w3c.github.io/webrtc-stats/#dom-rtcoutboundrtpstreamstats-totalencodedbytestarget
|
// https://w3c.github.io/webrtc-stats/#dom-rtcoutboundrtpstreamstats-totalencodedbytestarget
|
||||||
uint64_t total_encoded_bytes_target = 0;
|
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;
|
bool has_entered_low_resolution = false;
|
||||||
absl::optional<uint64_t> qp_sum;
|
absl::optional<uint64_t> qp_sum;
|
||||||
webrtc::VideoContentType content_type = webrtc::VideoContentType::UNSPECIFIED;
|
webrtc::VideoContentType content_type = webrtc::VideoContentType::UNSPECIFIED;
|
||||||
|
|||||||
@ -2288,6 +2288,7 @@ bool WebRtcVoiceMediaChannel::GetStats(VoiceMediaInfo* info,
|
|||||||
sinfo.header_and_padding_bytes_sent = stats.header_and_padding_bytes_sent;
|
sinfo.header_and_padding_bytes_sent = stats.header_and_padding_bytes_sent;
|
||||||
sinfo.retransmitted_bytes_sent = stats.retransmitted_bytes_sent;
|
sinfo.retransmitted_bytes_sent = stats.retransmitted_bytes_sent;
|
||||||
sinfo.packets_sent = stats.packets_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.retransmitted_packets_sent = stats.retransmitted_packets_sent;
|
||||||
sinfo.packets_lost = stats.packets_lost;
|
sinfo.packets_lost = stats.packets_lost;
|
||||||
sinfo.fraction_lost = stats.fraction_lost;
|
sinfo.fraction_lost = stats.fraction_lost;
|
||||||
|
|||||||
@ -665,6 +665,8 @@ void SetOutboundRTPStreamStatsFromMediaSenderInfo(
|
|||||||
outbound_stats->ssrc = media_sender_info.ssrc();
|
outbound_stats->ssrc = media_sender_info.ssrc();
|
||||||
outbound_stats->packets_sent =
|
outbound_stats->packets_sent =
|
||||||
static_cast<uint32_t>(media_sender_info.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 =
|
outbound_stats->retransmitted_packets_sent =
|
||||||
media_sender_info.retransmitted_packets_sent;
|
media_sender_info.retransmitted_packets_sent;
|
||||||
outbound_stats->bytes_sent =
|
outbound_stats->bytes_sent =
|
||||||
@ -674,7 +676,6 @@ void SetOutboundRTPStreamStatsFromMediaSenderInfo(
|
|||||||
outbound_stats->retransmitted_bytes_sent =
|
outbound_stats->retransmitted_bytes_sent =
|
||||||
media_sender_info.retransmitted_bytes_sent;
|
media_sender_info.retransmitted_bytes_sent;
|
||||||
outbound_stats->nack_count = media_sender_info.nacks_rcvd;
|
outbound_stats->nack_count = media_sender_info.nacks_rcvd;
|
||||||
|
|
||||||
if (media_sender_info.active.has_value()) {
|
if (media_sender_info.active.has_value()) {
|
||||||
outbound_stats->active = *media_sender_info.active;
|
outbound_stats->active = *media_sender_info.active;
|
||||||
}
|
}
|
||||||
@ -764,8 +765,6 @@ void SetOutboundRTPStreamStatsFromVideoSenderInfo(
|
|||||||
}
|
}
|
||||||
outbound_video->frames_sent = video_sender_info.frames_sent;
|
outbound_video->frames_sent = video_sender_info.frames_sent;
|
||||||
outbound_video->huge_frames_sent = video_sender_info.huge_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 =
|
outbound_video->quality_limitation_reason =
|
||||||
QualityLimitationReasonToRTCQualityLimitationReason(
|
QualityLimitationReasonToRTCQualityLimitationReason(
|
||||||
video_sender_info.quality_limitation_reason);
|
video_sender_info.quality_limitation_reason);
|
||||||
|
|||||||
@ -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.push_back(cricket::SsrcSenderInfo());
|
||||||
voice_media_info.senders[0].local_stats[0].ssrc = 1;
|
voice_media_info.senders[0].local_stats[0].ssrc = 1;
|
||||||
voice_media_info.senders[0].packets_sent = 2;
|
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].retransmitted_packets_sent = 20;
|
||||||
voice_media_info.senders[0].payload_bytes_sent = 3;
|
voice_media_info.senders[0].payload_bytes_sent = 3;
|
||||||
voice_media_info.senders[0].header_and_padding_bytes_sent = 12;
|
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.transport_id = "TTransportName1";
|
||||||
expected_audio.codec_id = "COTTransportName1_42";
|
expected_audio.codec_id = "COTTransportName1_42";
|
||||||
expected_audio.packets_sent = 2;
|
expected_audio.packets_sent = 2;
|
||||||
|
expected_audio.total_packet_send_delay = 1;
|
||||||
expected_audio.retransmitted_packets_sent = 20;
|
expected_audio.retransmitted_packets_sent = 20;
|
||||||
expected_audio.bytes_sent = 3;
|
expected_audio.bytes_sent = 3;
|
||||||
expected_audio.header_bytes_sent = 12;
|
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.push_back(cricket::SsrcSenderInfo());
|
||||||
voice_media_info.senders[0].local_stats[0].ssrc = 1;
|
voice_media_info.senders[0].local_stats[0].ssrc = 1;
|
||||||
voice_media_info.senders[0].packets_sent = 2;
|
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].retransmitted_packets_sent = 20;
|
||||||
voice_media_info.senders[0].payload_bytes_sent = 3;
|
voice_media_info.senders[0].payload_bytes_sent = 3;
|
||||||
voice_media_info.senders[0].header_and_padding_bytes_sent = 4;
|
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.transport_id = "TTransportName1";
|
||||||
expected_audio.codec_id = "COTTransportName1_42";
|
expected_audio.codec_id = "COTTransportName1_42";
|
||||||
expected_audio.packets_sent = 2;
|
expected_audio.packets_sent = 2;
|
||||||
|
expected_audio.total_packet_send_delay = 0.5;
|
||||||
expected_audio.retransmitted_packets_sent = 20;
|
expected_audio.retransmitted_packets_sent = 20;
|
||||||
expected_audio.bytes_sent = 3;
|
expected_audio.bytes_sent = 3;
|
||||||
expected_audio.header_bytes_sent = 4;
|
expected_audio.header_bytes_sent = 4;
|
||||||
|
|||||||
@ -998,6 +998,8 @@ class RTCStatsReportVerifier {
|
|||||||
verifier.TestMemberIsOptionalIDReference(
|
verifier.TestMemberIsOptionalIDReference(
|
||||||
outbound_stream.remote_id, RTCRemoteInboundRtpStreamStats::kType);
|
outbound_stream.remote_id, RTCRemoteInboundRtpStreamStats::kType);
|
||||||
verifier.TestMemberIsNonNegative<uint32_t>(outbound_stream.packets_sent);
|
verifier.TestMemberIsNonNegative<uint32_t>(outbound_stream.packets_sent);
|
||||||
|
verifier.TestMemberIsNonNegative<double>(
|
||||||
|
outbound_stream.total_packet_send_delay);
|
||||||
verifier.TestMemberIsNonNegative<uint64_t>(
|
verifier.TestMemberIsNonNegative<uint64_t>(
|
||||||
outbound_stream.retransmitted_packets_sent);
|
outbound_stream.retransmitted_packets_sent);
|
||||||
verifier.TestMemberIsNonNegative<uint64_t>(outbound_stream.bytes_sent);
|
verifier.TestMemberIsNonNegative<uint64_t>(outbound_stream.bytes_sent);
|
||||||
@ -1013,8 +1015,6 @@ class RTCStatsReportVerifier {
|
|||||||
outbound_stream.total_encode_time);
|
outbound_stream.total_encode_time);
|
||||||
verifier.TestMemberIsNonNegative<uint64_t>(
|
verifier.TestMemberIsNonNegative<uint64_t>(
|
||||||
outbound_stream.total_encoded_bytes_target);
|
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_reason);
|
||||||
verifier.TestMemberIsDefined(
|
verifier.TestMemberIsDefined(
|
||||||
outbound_stream.quality_limitation_durations);
|
outbound_stream.quality_limitation_durations);
|
||||||
@ -1047,8 +1047,6 @@ class RTCStatsReportVerifier {
|
|||||||
verifier.TestMemberIsUndefined(outbound_stream.total_encode_time);
|
verifier.TestMemberIsUndefined(outbound_stream.total_encode_time);
|
||||||
verifier.TestMemberIsUndefined(
|
verifier.TestMemberIsUndefined(
|
||||||
outbound_stream.total_encoded_bytes_target);
|
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_reason);
|
||||||
verifier.TestMemberIsUndefined(
|
verifier.TestMemberIsUndefined(
|
||||||
outbound_stream.quality_limitation_durations);
|
outbound_stream.quality_limitation_durations);
|
||||||
|
|||||||
Reference in New Issue
Block a user