From 87da40488330817c483e2f27848f73ea730a1c4f Mon Sep 17 00:00:00 2001 From: sakal Date: Mon, 31 Oct 2016 06:53:47 -0700 Subject: [PATCH] Implement qpSum stat for video send ssrc stats. Implemented as defined by this pull request: https://github.com/w3c/webrtc-stats/pull/70 BUG=webrtc:6541 Review-Url: https://codereview.webrtc.org/2430603003 Cr-Commit-Position: refs/heads/master@{#14851} --- webrtc/api/statscollector.cc | 2 ++ webrtc/api/statscollector_unittest.cc | 3 ++ webrtc/api/statstypes.cc | 2 ++ webrtc/api/statstypes.h | 1 + webrtc/media/base/mediachannel.h | 1 + webrtc/media/engine/webrtcvideoengine2.cc | 1 + .../engine/webrtcvideoengine2_unittest.cc | 11 +++++++ webrtc/video/send_statistics_proxy.cc | 29 ++++++++++++------- .../video/send_statistics_proxy_unittest.cc | 22 ++++++++++++++ webrtc/video_send_stream.h | 1 + 10 files changed, 62 insertions(+), 11 deletions(-) diff --git a/webrtc/api/statscollector.cc b/webrtc/api/statscollector.cc index 819f31b048..a40835c77e 100644 --- a/webrtc/api/statscollector.cc +++ b/webrtc/api/statscollector.cc @@ -253,6 +253,8 @@ void ExtractStats(const cricket::VideoSenderInfo& info, StatsReport* report) { (info.adapt_reason & 0x1) > 0); report->AddBoolean(StatsReport::kStatsValueNameViewLimitedResolution, (info.adapt_reason & 0x4) > 0); + if (info.qp_sum) + report->AddInt(StatsReport::kStatsValueNameQpSum, *info.qp_sum); const IntForAdd ints[] = { { StatsReport::kStatsValueNameAdaptationChanges, info.adapt_changes }, diff --git a/webrtc/api/statscollector_unittest.cc b/webrtc/api/statscollector_unittest.cc index 8c82811d76..10fe1e3392 100644 --- a/webrtc/api/statscollector_unittest.cc +++ b/webrtc/api/statscollector_unittest.cc @@ -1926,6 +1926,7 @@ TEST_F(StatsCollectorTest, VerifyVideoSendSsrcStats) { // Construct a stats value to read. video_sender_info.add_ssrc(1234); video_sender_info.frames_encoded = 10; + video_sender_info.qp_sum = rtc::Optional(11); stats_read.senders.push_back(video_sender_info); EXPECT_CALL(session_, video_channel()).WillRepeatedly(Return(&video_channel)); @@ -1937,6 +1938,8 @@ TEST_F(StatsCollectorTest, VerifyVideoSendSsrcStats) { EXPECT_EQ(rtc::ToString(video_sender_info.frames_encoded), ExtractSsrcStatsValue(reports, StatsReport::kStatsValueNameFramesEncoded)); + EXPECT_EQ(rtc::ToString(*video_sender_info.qp_sum), + ExtractSsrcStatsValue(reports, StatsReport::kStatsValueNameQpSum)); } // This test verifies that stats are correctly set in video receive ssrc stats. diff --git a/webrtc/api/statstypes.cc b/webrtc/api/statstypes.cc index 8f25d0543b..354f115011 100644 --- a/webrtc/api/statstypes.cc +++ b/webrtc/api/statstypes.cc @@ -401,6 +401,8 @@ const char* StatsReport::Value::display_name() const { return "codecImplementationName"; case kStatsValueNameMediaType: return "mediaType"; + case kStatsValueNameQpSum: + return "qpSum"; // 'goog' prefixed constants. case kStatsValueNameAccelerateRate: return "googAccelerateRate"; diff --git a/webrtc/api/statstypes.h b/webrtc/api/statstypes.h index 366b6efa0f..9501c299b6 100644 --- a/webrtc/api/statstypes.h +++ b/webrtc/api/statstypes.h @@ -113,6 +113,7 @@ class StatsReport { kStatsValueNamePacketsReceived, kStatsValueNamePacketsSent, kStatsValueNameProtocol, + kStatsValueNameQpSum, kStatsValueNameReceiving, kStatsValueNameSelectedCandidatePairId, kStatsValueNameSsrc, diff --git a/webrtc/media/base/mediachannel.h b/webrtc/media/base/mediachannel.h index dc29b9fa61..863b4dcf9e 100644 --- a/webrtc/media/base/mediachannel.h +++ b/webrtc/media/base/mediachannel.h @@ -709,6 +709,7 @@ struct VideoSenderInfo : public MediaSenderInfo { int avg_encode_ms; int encode_usage_percent; uint32_t frames_encoded; + rtc::Optional qp_sum; }; struct VideoReceiverInfo : public MediaReceiverInfo { diff --git a/webrtc/media/engine/webrtcvideoengine2.cc b/webrtc/media/engine/webrtcvideoengine2.cc index 98b3adf18a..fcc92546dd 100644 --- a/webrtc/media/engine/webrtcvideoengine2.cc +++ b/webrtc/media/engine/webrtcvideoengine2.cc @@ -2124,6 +2124,7 @@ VideoSenderInfo WebRtcVideoChannel2::WebRtcVideoSendStream::GetVideoSenderInfo( info.avg_encode_ms = stats.avg_encode_time_ms; info.encode_usage_percent = stats.encode_usage_percent; info.frames_encoded = stats.frames_encoded; + info.qp_sum = stats.qp_sum; info.nominal_bitrate = stats.media_bitrate_bps; info.preferred_bitrate = stats.preferred_media_bitrate_bps; diff --git a/webrtc/media/engine/webrtcvideoengine2_unittest.cc b/webrtc/media/engine/webrtcvideoengine2_unittest.cc index 5d7b2b3155..d3a604735d 100644 --- a/webrtc/media/engine/webrtcvideoengine2_unittest.cc +++ b/webrtc/media/engine/webrtcvideoengine2_unittest.cc @@ -2875,6 +2875,17 @@ TEST_F(WebRtcVideoChannel2Test, GetStatsReportsFramesEncoded) { EXPECT_EQ(stats.frames_encoded, info.senders[0].frames_encoded); } +TEST_F(WebRtcVideoChannel2Test, GetStatsReportsQpSum) { + FakeVideoSendStream* stream = AddSendStream(); + webrtc::VideoSendStream::Stats stats; + stats.qp_sum = rtc::Optional(13); + stream->SetStats(stats); + + cricket::VideoMediaInfo info; + ASSERT_TRUE(channel_->GetStats(&info)); + EXPECT_EQ(stats.qp_sum, info.senders[0].qp_sum); +} + TEST_F(WebRtcVideoChannel2Test, GetStatsReportsUpperResolution) { FakeVideoSendStream* stream = AddSendStream(); webrtc::VideoSendStream::Stats stats; diff --git a/webrtc/video/send_statistics_proxy.cc b/webrtc/video/send_statistics_proxy.cc index 6bebd46212..370f119832 100644 --- a/webrtc/video/send_statistics_proxy.cc +++ b/webrtc/video/send_statistics_proxy.cc @@ -495,17 +495,24 @@ void SendStatisticsProxy::OnSendEncodedImage( } } - if (encoded_image.qp_ != -1 && codec_info) { - if (codec_info->codecType == kVideoCodecVP8) { - int spatial_idx = (rtp_config_.ssrcs.size() == 1) - ? -1 - : static_cast(simulcast_idx); - uma_container_->qp_counters_[spatial_idx].vp8.Add(encoded_image.qp_); - } else if (codec_info->codecType == kVideoCodecVP9) { - int spatial_idx = (codec_info->codecSpecific.VP9.num_spatial_layers == 1) - ? -1 - : codec_info->codecSpecific.VP9.spatial_idx; - uma_container_->qp_counters_[spatial_idx].vp9.Add(encoded_image.qp_); + if (encoded_image.qp_ != -1) { + if (!stats_.qp_sum) + stats_.qp_sum = rtc::Optional(0); + *stats_.qp_sum += encoded_image.qp_; + + if (codec_info) { + if (codec_info->codecType == kVideoCodecVP8) { + int spatial_idx = (rtp_config_.ssrcs.size() == 1) + ? -1 + : static_cast(simulcast_idx); + uma_container_->qp_counters_[spatial_idx].vp8.Add(encoded_image.qp_); + } else if (codec_info->codecType == kVideoCodecVP9) { + int spatial_idx = + (codec_info->codecSpecific.VP9.num_spatial_layers == 1) + ? -1 + : codec_info->codecSpecific.VP9.spatial_idx; + uma_container_->qp_counters_[spatial_idx].vp9.Add(encoded_image.qp_); + } } } diff --git a/webrtc/video/send_statistics_proxy_unittest.cc b/webrtc/video/send_statistics_proxy_unittest.cc index 488d57534c..e661e0e3af 100644 --- a/webrtc/video/send_statistics_proxy_unittest.cc +++ b/webrtc/video/send_statistics_proxy_unittest.cc @@ -311,6 +311,28 @@ TEST_F(SendStatisticsProxyTest, OnSendEncodedImageIncreasesFramesEncoded) { } } +TEST_F(SendStatisticsProxyTest, OnSendEncodedImageIncreasesQpSum) { + EncodedImage encoded_image; + CodecSpecificInfo codec_info; + EXPECT_EQ(rtc::Optional(), statistics_proxy_->GetStats().qp_sum); + encoded_image.qp_ = 3; + statistics_proxy_->OnSendEncodedImage(encoded_image, &codec_info); + EXPECT_EQ(rtc::Optional(3u), statistics_proxy_->GetStats().qp_sum); + encoded_image.qp_ = 127; + statistics_proxy_->OnSendEncodedImage(encoded_image, &codec_info); + EXPECT_EQ(rtc::Optional(130u), + statistics_proxy_->GetStats().qp_sum); +} + +TEST_F(SendStatisticsProxyTest, OnSendEncodedImageWithoutQpQpSumWontExist) { + EncodedImage encoded_image; + CodecSpecificInfo codec_info; + encoded_image.qp_ = -1; + EXPECT_EQ(rtc::Optional(), statistics_proxy_->GetStats().qp_sum); + statistics_proxy_->OnSendEncodedImage(encoded_image, &codec_info); + EXPECT_EQ(rtc::Optional(), statistics_proxy_->GetStats().qp_sum); +} + TEST_F(SendStatisticsProxyTest, SwitchContentTypeUpdatesHistograms) { const int kWidth = 640; const int kHeight = 480; diff --git a/webrtc/video_send_stream.h b/webrtc/video_send_stream.h index c0bee4ed3c..4ca9fa72f4 100644 --- a/webrtc/video_send_stream.h +++ b/webrtc/video_send_stream.h @@ -57,6 +57,7 @@ class VideoSendStream { int avg_encode_time_ms = 0; int encode_usage_percent = 0; uint32_t frames_encoded = 0; + rtc::Optional qp_sum; // Bitrate the encoder is currently configured to use due to bandwidth // limitations. int target_media_bitrate_bps = 0;