Populate qualityLimitationDurations stats for outbound RTP streams

Spec: https://w3c.github.io/webrtc-stats/#dom-rtcoutboundrtpstreamstats-qualitylimitationdurations
Tested in chromium using wpt/webrtc-stats.

Bug: webrtc:10686
Change-Id: I05ac344e6caa7a663675de4c06ccfd17e1efb6ee
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/219300
Reviewed-by: Henrik Boström <hbos@webrtc.org>
Commit-Queue: Henrik Boström <hbos@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#34179}
This commit is contained in:
Byoungchan Lee
2021-05-28 21:32:04 +09:00
committed by WebRTC LUCI CQ
parent 7b4fd5ca59
commit 7d23535108
5 changed files with 28 additions and 3 deletions

View File

@ -13,6 +13,7 @@
#include <stdint.h> #include <stdint.h>
#include <map>
#include <memory> #include <memory>
#include <string> #include <string>
#include <vector> #include <vector>
@ -542,10 +543,8 @@ class RTC_EXPORT RTCOutboundRTPStreamStats final : public RTCRTPStreamStats {
// implement it for audio as well. // implement it for audio as well.
RTCStatsMember<double> total_packet_send_delay; RTCStatsMember<double> total_packet_send_delay;
// Enum type RTCQualityLimitationReason // Enum type RTCQualityLimitationReason
// TODO(https://crbug.com/webrtc/10686): Also expose
// qualityLimitationDurations. Requires RTCStatsMember support for
// "record<DOMString, double>", see https://crbug.com/webrtc/10685.
RTCStatsMember<std::string> quality_limitation_reason; RTCStatsMember<std::string> quality_limitation_reason;
RTCStatsMember<std::map<std::string, double>> quality_limitation_durations;
// https://w3c.github.io/webrtc-stats/#dom-rtcoutboundrtpstreamstats-qualitylimitationresolutionchanges // https://w3c.github.io/webrtc-stats/#dom-rtcoutboundrtpstreamstats-qualitylimitationresolutionchanges
RTCStatsMember<uint32_t> quality_limitation_resolution_changes; RTCStatsMember<uint32_t> quality_limitation_resolution_changes;
// https://henbos.github.io/webrtc-provisional-stats/#dom-rtcoutboundrtpstreamstats-contenttype // https://henbos.github.io/webrtc-provisional-stats/#dom-rtcoutboundrtpstreamstats-contenttype

View File

@ -265,6 +265,17 @@ const char* QualityLimitationReasonToRTCQualityLimitationReason(
RTC_CHECK_NOTREACHED(); RTC_CHECK_NOTREACHED();
} }
std::map<std::string, double>
QualityLimitationDurationToRTCQualityLimitationDuration(
std::map<webrtc::QualityLimitationReason, int64_t> durations_ms) {
std::map<std::string, double> result;
for (const auto& elem : durations_ms) {
result[QualityLimitationReasonToRTCQualityLimitationReason(elem.first)] =
elem.second;
}
return result;
}
double DoubleAudioLevelFromIntAudioLevel(int audio_level) { double DoubleAudioLevelFromIntAudioLevel(int audio_level) {
RTC_DCHECK_GE(audio_level, 0); RTC_DCHECK_GE(audio_level, 0);
RTC_DCHECK_LE(audio_level, 32767); RTC_DCHECK_LE(audio_level, 32767);
@ -568,6 +579,9 @@ void SetOutboundRTPStreamStatsFromVideoSenderInfo(
outbound_video->quality_limitation_reason = outbound_video->quality_limitation_reason =
QualityLimitationReasonToRTCQualityLimitationReason( QualityLimitationReasonToRTCQualityLimitationReason(
video_sender_info.quality_limitation_reason); video_sender_info.quality_limitation_reason);
outbound_video->quality_limitation_durations =
QualityLimitationDurationToRTCQualityLimitationDuration(
video_sender_info.quality_limitation_durations_ms);
outbound_video->quality_limitation_resolution_changes = outbound_video->quality_limitation_resolution_changes =
video_sender_info.quality_limitation_resolution_changes; video_sender_info.quality_limitation_resolution_changes;
// TODO(https://crbug.com/webrtc/10529): When info's |content_info| is // TODO(https://crbug.com/webrtc/10529): When info's |content_info| is

View File

@ -2199,6 +2199,8 @@ TEST_F(RTCStatsCollectorTest, CollectRTCOutboundRTPStreamStats_Video) {
video_media_info.senders[0].total_packet_send_delay_ms = 10000; video_media_info.senders[0].total_packet_send_delay_ms = 10000;
video_media_info.senders[0].quality_limitation_reason = video_media_info.senders[0].quality_limitation_reason =
QualityLimitationReason::kBandwidth; QualityLimitationReason::kBandwidth;
video_media_info.senders[0].quality_limitation_durations_ms
[webrtc::QualityLimitationReason::kBandwidth] = 300;
video_media_info.senders[0].quality_limitation_resolution_changes = 56u; video_media_info.senders[0].quality_limitation_resolution_changes = 56u;
video_media_info.senders[0].qp_sum = absl::nullopt; video_media_info.senders[0].qp_sum = absl::nullopt;
video_media_info.senders[0].content_type = VideoContentType::UNSPECIFIED; video_media_info.senders[0].content_type = VideoContentType::UNSPECIFIED;
@ -2254,6 +2256,9 @@ TEST_F(RTCStatsCollectorTest, CollectRTCOutboundRTPStreamStats_Video) {
expected_video.total_encoded_bytes_target = 1234; expected_video.total_encoded_bytes_target = 1234;
expected_video.total_packet_send_delay = 10.0; expected_video.total_packet_send_delay = 10.0;
expected_video.quality_limitation_reason = "bandwidth"; expected_video.quality_limitation_reason = "bandwidth";
expected_video.quality_limitation_durations = std::map<std::string, double>{
std::pair<std::string, double>{"bandwidth", 300.0},
};
expected_video.quality_limitation_resolution_changes = 56u; expected_video.quality_limitation_resolution_changes = 56u;
expected_video.frame_width = 200u; expected_video.frame_width = 200u;
expected_video.frame_height = 100u; expected_video.frame_height = 100u;

View File

@ -973,6 +973,8 @@ class RTCStatsReportVerifier {
verifier.TestMemberIsNonNegative<double>( verifier.TestMemberIsNonNegative<double>(
outbound_stream.total_packet_send_delay); outbound_stream.total_packet_send_delay);
verifier.TestMemberIsDefined(outbound_stream.quality_limitation_reason); verifier.TestMemberIsDefined(outbound_stream.quality_limitation_reason);
verifier.TestMemberIsDefined(
outbound_stream.quality_limitation_durations);
verifier.TestMemberIsNonNegative<uint32_t>( verifier.TestMemberIsNonNegative<uint32_t>(
outbound_stream.quality_limitation_resolution_changes); outbound_stream.quality_limitation_resolution_changes);
// The integration test is not set up to test screen share; don't require // The integration test is not set up to test screen share; don't require
@ -1005,6 +1007,8 @@ class RTCStatsReportVerifier {
// TODO(https://crbug.com/webrtc/10635): Implement for audio as well. // TODO(https://crbug.com/webrtc/10635): Implement for audio as well.
verifier.TestMemberIsUndefined(outbound_stream.total_packet_send_delay); verifier.TestMemberIsUndefined(outbound_stream.total_packet_send_delay);
verifier.TestMemberIsUndefined(outbound_stream.quality_limitation_reason); verifier.TestMemberIsUndefined(outbound_stream.quality_limitation_reason);
verifier.TestMemberIsUndefined(
outbound_stream.quality_limitation_durations);
verifier.TestMemberIsUndefined( verifier.TestMemberIsUndefined(
outbound_stream.quality_limitation_resolution_changes); outbound_stream.quality_limitation_resolution_changes);
verifier.TestMemberIsUndefined(outbound_stream.content_type); verifier.TestMemberIsUndefined(outbound_stream.content_type);

View File

@ -811,6 +811,7 @@ WEBRTC_RTCSTATS_IMPL(
&huge_frames_sent, &huge_frames_sent,
&total_packet_send_delay, &total_packet_send_delay,
&quality_limitation_reason, &quality_limitation_reason,
&quality_limitation_durations,
&quality_limitation_resolution_changes, &quality_limitation_resolution_changes,
&content_type, &content_type,
&encoder_implementation, &encoder_implementation,
@ -847,6 +848,7 @@ RTCOutboundRTPStreamStats::RTCOutboundRTPStreamStats(std::string&& id,
huge_frames_sent("hugeFramesSent"), huge_frames_sent("hugeFramesSent"),
total_packet_send_delay("totalPacketSendDelay"), total_packet_send_delay("totalPacketSendDelay"),
quality_limitation_reason("qualityLimitationReason"), quality_limitation_reason("qualityLimitationReason"),
quality_limitation_durations("qualityLimitationDurations"),
quality_limitation_resolution_changes( quality_limitation_resolution_changes(
"qualityLimitationResolutionChanges"), "qualityLimitationResolutionChanges"),
content_type("contentType"), content_type("contentType"),
@ -879,6 +881,7 @@ RTCOutboundRTPStreamStats::RTCOutboundRTPStreamStats(
huge_frames_sent(other.huge_frames_sent), huge_frames_sent(other.huge_frames_sent),
total_packet_send_delay(other.total_packet_send_delay), total_packet_send_delay(other.total_packet_send_delay),
quality_limitation_reason(other.quality_limitation_reason), quality_limitation_reason(other.quality_limitation_reason),
quality_limitation_durations(other.quality_limitation_durations),
quality_limitation_resolution_changes( quality_limitation_resolution_changes(
other.quality_limitation_resolution_changes), other.quality_limitation_resolution_changes),
content_type(other.content_type), content_type(other.content_type),