Reland "Add hugeFramesSent GetStats metric"

This is a reland of f9f71b91ae073fdd2b89ff9df1204835aa3137eb
after the change in chromium tests.

Chromium change done here:
https://chromium-review.googlesource.com/c/chromium/src/+/950776

Original reviewed on: https://webrtc-review.googlesource.com/c/src/+/54420

No changes to the original patchset were done.

TBR=hta@webrtc.org,hbos@webrtc.org,sprang@webrtc.org,solenberg@webrtc.org

Bug: webrtc:8901
Change-Id: Ic88c3cb963dceea0426eb90519743e3c1a4533c1
Reviewed-on: https://webrtc-review.googlesource.com/60140
Commit-Queue: Ilya Nikolaevskiy <ilnik@webrtc.org>
Reviewed-by: Harald Alvestrand <hta@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#22310}
This commit is contained in:
Ilya Nikolaevskiy 2018-02-28 16:35:03 +01:00 committed by Commit Bot
parent 1e0c804f19
commit 70473fcac4
13 changed files with 46 additions and 14 deletions

View File

@ -279,6 +279,7 @@ class RTCMediaStreamTrackStats final : public RTCStats {
// TODO(hbos): Not collected by |RTCStatsCollector|. crbug.com/659137 // TODO(hbos): Not collected by |RTCStatsCollector|. crbug.com/659137
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> frames_received; RTCStatsMember<uint32_t> frames_received;
RTCStatsMember<uint32_t> frames_decoded; RTCStatsMember<uint32_t> frames_decoded;
RTCStatsMember<uint32_t> frames_dropped; RTCStatsMember<uint32_t> frames_dropped;

View File

@ -558,6 +558,8 @@ const char* StatsReport::Value::display_name() const {
return "googFrameWidthSent"; return "googFrameWidthSent";
case kStatsValueNameHasEnteredLowResolution: case kStatsValueNameHasEnteredLowResolution:
return "googHasEnteredLowResolution"; return "googHasEnteredLowResolution";
case kStatsValueNameHugeFramesSent:
return "hugeFramesSent";
case kStatsValueNameInitiator: case kStatsValueNameInitiator:
return "googInitiator"; return "googInitiator";
case kStatsValueNameInterframeDelayMaxMs: case kStatsValueNameInterframeDelayMaxMs:

View File

@ -189,6 +189,7 @@ class StatsReport {
kStatsValueNameFrameWidthReceived, kStatsValueNameFrameWidthReceived,
kStatsValueNameFrameWidthSent, kStatsValueNameFrameWidthSent,
kStatsValueNameHasEnteredLowResolution, kStatsValueNameHasEnteredLowResolution,
kStatsValueNameHugeFramesSent,
kStatsValueNameInitiator, kStatsValueNameInitiator,
kStatsValueNameInterframeDelayMaxMs, // Max over last 10 seconds. kStatsValueNameInterframeDelayMaxMs, // Max over last 10 seconds.
kStatsValueNameIssuerId, kStatsValueNameIssuerId,

View File

@ -91,6 +91,7 @@ class VideoSendStream {
std::map<uint32_t, StreamStats> substreams; std::map<uint32_t, StreamStats> substreams;
webrtc::VideoContentType content_type = webrtc::VideoContentType content_type =
webrtc::VideoContentType::UNSPECIFIED; webrtc::VideoContentType::UNSPECIFIED;
uint32_t huge_frames_sent = 0;
}; };
struct Config { struct Config {

View File

@ -466,6 +466,8 @@ struct VideoSenderInfo : public MediaSenderInfo {
bool has_entered_low_resolution = false; bool has_entered_low_resolution = false;
rtc::Optional<uint64_t> qp_sum; rtc::Optional<uint64_t> qp_sum;
webrtc::VideoContentType content_type = webrtc::VideoContentType::UNSPECIFIED; webrtc::VideoContentType content_type = webrtc::VideoContentType::UNSPECIFIED;
// https://w3c.github.io/webrtc-stats/#dom-rtcvideosenderstats-hugeframessent
uint32_t huge_frames_sent = 0;
}; };
struct VideoReceiverInfo : public MediaReceiverInfo { struct VideoReceiverInfo : public MediaReceiverInfo {

View File

@ -2058,6 +2058,7 @@ VideoSenderInfo WebRtcVideoChannel::WebRtcVideoSendStream::GetVideoSenderInfo(
info.preferred_bitrate = stats.preferred_media_bitrate_bps; info.preferred_bitrate = stats.preferred_media_bitrate_bps;
info.content_type = stats.content_type; info.content_type = stats.content_type;
info.huge_frames_sent = stats.huge_frames_sent;
info.send_frame_width = 0; info.send_frame_width = 0;
info.send_frame_height = 0; info.send_frame_height = 0;

View File

@ -515,6 +515,7 @@ class RTCStatsReportVerifier {
verifier.TestMemberIsUndefined(media_stream_track.frames_per_second); verifier.TestMemberIsUndefined(media_stream_track.frames_per_second);
if (*media_stream_track.remote_source) { if (*media_stream_track.remote_source) {
verifier.TestMemberIsUndefined(media_stream_track.frames_sent); verifier.TestMemberIsUndefined(media_stream_track.frames_sent);
verifier.TestMemberIsUndefined(media_stream_track.huge_frames_sent);
verifier.TestMemberIsNonNegative<uint32_t>( verifier.TestMemberIsNonNegative<uint32_t>(
media_stream_track.frames_received); media_stream_track.frames_received);
verifier.TestMemberIsNonNegative<uint32_t>( verifier.TestMemberIsNonNegative<uint32_t>(
@ -524,6 +525,8 @@ class RTCStatsReportVerifier {
} else { } else {
verifier.TestMemberIsNonNegative<uint32_t>( verifier.TestMemberIsNonNegative<uint32_t>(
media_stream_track.frames_sent); media_stream_track.frames_sent);
verifier.TestMemberIsNonNegative<uint32_t>(
media_stream_track.huge_frames_sent);
verifier.TestMemberIsUndefined(media_stream_track.frames_received); verifier.TestMemberIsUndefined(media_stream_track.frames_received);
verifier.TestMemberIsUndefined(media_stream_track.frames_decoded); verifier.TestMemberIsUndefined(media_stream_track.frames_decoded);
verifier.TestMemberIsUndefined(media_stream_track.frames_dropped); verifier.TestMemberIsUndefined(media_stream_track.frames_dropped);
@ -546,6 +549,7 @@ class RTCStatsReportVerifier {
verifier.TestMemberIsUndefined(media_stream_track.frame_height); verifier.TestMemberIsUndefined(media_stream_track.frame_height);
verifier.TestMemberIsUndefined(media_stream_track.frames_per_second); verifier.TestMemberIsUndefined(media_stream_track.frames_per_second);
verifier.TestMemberIsUndefined(media_stream_track.frames_sent); verifier.TestMemberIsUndefined(media_stream_track.frames_sent);
verifier.TestMemberIsUndefined(media_stream_track.huge_frames_sent);
verifier.TestMemberIsUndefined(media_stream_track.frames_received); verifier.TestMemberIsUndefined(media_stream_track.frames_received);
verifier.TestMemberIsUndefined(media_stream_track.frames_decoded); verifier.TestMemberIsUndefined(media_stream_track.frames_decoded);
verifier.TestMemberIsUndefined(media_stream_track.frames_dropped); verifier.TestMemberIsUndefined(media_stream_track.frames_dropped);

View File

@ -455,6 +455,7 @@ ProduceMediaStreamTrackStatsFromVideoSenderInfo(
// TODO(hbos): Will reduce this by frames dropped due to congestion control // TODO(hbos): Will reduce this by frames dropped due to congestion control
// when available. https://crbug.com/659137 // when available. https://crbug.com/659137
video_track_stats->frames_sent = video_sender_info.frames_encoded; video_track_stats->frames_sent = video_sender_info.frames_encoded;
video_track_stats->huge_frames_sent = video_sender_info.huge_frames_sent;
return video_track_stats; return video_track_stats;
} }

View File

@ -1333,6 +1333,7 @@ TEST_F(RTCStatsCollectorTest,
video_sender_info_ssrc1.send_frame_width = 1234; video_sender_info_ssrc1.send_frame_width = 1234;
video_sender_info_ssrc1.send_frame_height = 4321; video_sender_info_ssrc1.send_frame_height = 4321;
video_sender_info_ssrc1.frames_encoded = 11; video_sender_info_ssrc1.frames_encoded = 11;
video_sender_info_ssrc1.huge_frames_sent = 1;
stats_->CreateMockRtpSendersReceiversAndChannels( stats_->CreateMockRtpSendersReceiversAndChannels(
{}, {}, {}, {},
@ -1367,6 +1368,7 @@ TEST_F(RTCStatsCollectorTest,
expected_local_video_track_ssrc1.frame_width = 1234; expected_local_video_track_ssrc1.frame_width = 1234;
expected_local_video_track_ssrc1.frame_height = 4321; expected_local_video_track_ssrc1.frame_height = 4321;
expected_local_video_track_ssrc1.frames_sent = 11; expected_local_video_track_ssrc1.frames_sent = 11;
expected_local_video_track_ssrc1.huge_frames_sent = 1;
ASSERT_TRUE(report->Get(expected_local_video_track_ssrc1.id())); ASSERT_TRUE(report->Get(expected_local_video_track_ssrc1.id()));
EXPECT_EQ(expected_local_video_track_ssrc1, EXPECT_EQ(expected_local_video_track_ssrc1,
report->Get(expected_local_video_track_ssrc1.id()) report->Get(expected_local_video_track_ssrc1.id())

View File

@ -313,20 +313,21 @@ void ExtractStats(const cricket::VideoSenderInfo& info, StatsReport* report) {
report->AddInt(StatsReport::kStatsValueNameQpSum, *info.qp_sum); report->AddInt(StatsReport::kStatsValueNameQpSum, *info.qp_sum);
const IntForAdd ints[] = { const IntForAdd ints[] = {
{ StatsReport::kStatsValueNameAdaptationChanges, info.adapt_changes }, {StatsReport::kStatsValueNameAdaptationChanges, info.adapt_changes},
{ StatsReport::kStatsValueNameAvgEncodeMs, info.avg_encode_ms }, {StatsReport::kStatsValueNameAvgEncodeMs, info.avg_encode_ms},
{ StatsReport::kStatsValueNameEncodeUsagePercent, {StatsReport::kStatsValueNameEncodeUsagePercent,
info.encode_usage_percent }, info.encode_usage_percent},
{ StatsReport::kStatsValueNameFirsReceived, info.firs_rcvd }, {StatsReport::kStatsValueNameFirsReceived, info.firs_rcvd},
{ StatsReport::kStatsValueNameFrameHeightSent, info.send_frame_height }, {StatsReport::kStatsValueNameFrameHeightSent, info.send_frame_height},
{ StatsReport::kStatsValueNameFrameRateInput, info.framerate_input }, {StatsReport::kStatsValueNameFrameRateInput, info.framerate_input},
{ StatsReport::kStatsValueNameFrameRateSent, info.framerate_sent }, {StatsReport::kStatsValueNameFrameRateSent, info.framerate_sent},
{ StatsReport::kStatsValueNameFrameWidthSent, info.send_frame_width }, {StatsReport::kStatsValueNameFrameWidthSent, info.send_frame_width},
{ StatsReport::kStatsValueNameNacksReceived, info.nacks_rcvd }, {StatsReport::kStatsValueNameNacksReceived, info.nacks_rcvd},
{ StatsReport::kStatsValueNamePacketsLost, info.packets_lost }, {StatsReport::kStatsValueNamePacketsLost, info.packets_lost},
{ StatsReport::kStatsValueNamePacketsSent, info.packets_sent }, {StatsReport::kStatsValueNamePacketsSent, info.packets_sent},
{ StatsReport::kStatsValueNamePlisReceived, info.plis_rcvd }, {StatsReport::kStatsValueNamePlisReceived, info.plis_rcvd},
{ StatsReport::kStatsValueNameFramesEncoded, info.frames_encoded }, {StatsReport::kStatsValueNameFramesEncoded, info.frames_encoded},
{StatsReport::kStatsValueNameHugeFramesSent, info.huge_frames_sent},
}; };
for (const auto& i : ints) for (const auto& i : ints)

View File

@ -383,6 +383,7 @@ WEBRTC_RTCSTATS_IMPL(RTCMediaStreamTrackStats, RTCStats, "track",
&frame_height, &frame_height,
&frames_per_second, &frames_per_second,
&frames_sent, &frames_sent,
&huge_frames_sent,
&frames_received, &frames_received,
&frames_decoded, &frames_decoded,
&frames_dropped, &frames_dropped,
@ -418,6 +419,7 @@ RTCMediaStreamTrackStats::RTCMediaStreamTrackStats(std::string&& id,
frame_height("frameHeight"), frame_height("frameHeight"),
frames_per_second("framesPerSecond"), frames_per_second("framesPerSecond"),
frames_sent("framesSent"), frames_sent("framesSent"),
huge_frames_sent("hugeFramesSent"),
frames_received("framesReceived"), frames_received("framesReceived"),
frames_decoded("framesDecoded"), frames_decoded("framesDecoded"),
frames_dropped("framesDropped"), frames_dropped("framesDropped"),
@ -449,6 +451,7 @@ RTCMediaStreamTrackStats::RTCMediaStreamTrackStats(
frame_height(other.frame_height), frame_height(other.frame_height),
frames_per_second(other.frames_per_second), frames_per_second(other.frames_per_second),
frames_sent(other.frames_sent), frames_sent(other.frames_sent),
huge_frames_sent(other.huge_frames_sent),
frames_received(other.frames_received), frames_received(other.frames_received),
frames_decoded(other.frames_decoded), frames_decoded(other.frames_decoded),
frames_dropped(other.frames_dropped), frames_dropped(other.frames_dropped),

View File

@ -914,6 +914,17 @@ void SendStatisticsProxy::OnSendEncodedImage(
} }
} }
// If any of the simulcast streams have a huge frame, it should be counted
// as a single difficult input frame.
// https://w3c.github.io/webrtc-stats/#dom-rtcvideosenderstats-hugeframessent
if (encoded_image.timing_.flags & TimingFrameFlags::kTriggeredBySize) {
if (!last_outlier_timestamp_ ||
*last_outlier_timestamp_ < encoded_image.capture_time_ms_) {
last_outlier_timestamp_.emplace(encoded_image.capture_time_ms_);
++stats_.huge_frames_sent;
}
}
media_byte_rate_tracker_.AddSamples(encoded_image._length); media_byte_rate_tracker_.AddSamples(encoded_image._length);
// Initialize to current since |is_limited_in_resolution| is only updated // Initialize to current since |is_limited_in_resolution| is only updated

View File

@ -249,6 +249,8 @@ class SendStatisticsProxy : public CpuOveruseMetricsObserver,
rtc::RateTracker media_byte_rate_tracker_ RTC_GUARDED_BY(crit_); rtc::RateTracker media_byte_rate_tracker_ RTC_GUARDED_BY(crit_);
rtc::RateTracker encoded_frame_rate_tracker_ RTC_GUARDED_BY(crit_); rtc::RateTracker encoded_frame_rate_tracker_ RTC_GUARDED_BY(crit_);
rtc::Optional<int64_t> last_outlier_timestamp_ RTC_GUARDED_BY(crit_);
// Contains stats used for UMA histograms. These stats will be reset if // Contains stats used for UMA histograms. These stats will be reset if
// content type changes between real-time video and screenshare, since these // content type changes between real-time video and screenshare, since these
// will be reported separately. // will be reported separately.