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:
committed by
WebRTC LUCI CQ
parent
7b4fd5ca59
commit
7d23535108
@ -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
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
@ -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;
|
||||||
|
|||||||
@ -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);
|
||||||
|
|||||||
@ -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),
|
||||||
|
|||||||
Reference in New Issue
Block a user