Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1556)

Unified Diff: video/send_statistics_proxy_unittest.cc

Issue 3012863002: Add stats for forced software encoder fallback for VP8. (Closed)
Patch Set: Created 3 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « video/send_statistics_proxy.cc ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: video/send_statistics_proxy_unittest.cc
diff --git a/video/send_statistics_proxy_unittest.cc b/video/send_statistics_proxy_unittest.cc
index 912908c524369e745fc3d2331674bd7ba39da731..af9f6747b632a3f1ba32c6cb6835f577e4beebb7 100644
--- a/video/send_statistics_proxy_unittest.cc
+++ b/video/send_statistics_proxy_unittest.cc
@@ -17,6 +17,7 @@
#include "system_wrappers/include/metrics.h"
#include "system_wrappers/include/metrics_default.h"
+#include "test/field_trial.h"
#include "test/gtest.h"
namespace webrtc {
@@ -31,6 +32,7 @@ const int kWidth = 640;
const int kHeight = 480;
const int kQpIdx0 = 21;
const int kQpIdx1 = 39;
+const int kMinFirstFallbackIntervalMs = 1500;
const CodecSpecificInfo kDefaultCodecInfo = []() {
CodecSpecificInfo codec_info;
codec_info.codecType = kVideoCodecVP8;
@@ -41,8 +43,12 @@ const CodecSpecificInfo kDefaultCodecInfo = []() {
class SendStatisticsProxyTest : public ::testing::Test {
public:
- SendStatisticsProxyTest()
- : fake_clock_(1234), config_(GetTestConfig()), avg_delay_ms_(0),
+ SendStatisticsProxyTest() : SendStatisticsProxyTest("") {}
+ explicit SendStatisticsProxyTest(const std::string& field_trials)
+ : override_field_trials_(field_trials),
+ fake_clock_(1234),
+ config_(GetTestConfig()),
+ avg_delay_ms_(0),
max_delay_ms_(0) {}
virtual ~SendStatisticsProxyTest() {}
@@ -140,6 +146,7 @@ class SendStatisticsProxyTest : public ::testing::Test {
}
}
+ test::ScopedFieldTrials override_field_trials_;
SimulatedClock fake_clock_;
std::unique_ptr<SendStatisticsProxy> statistics_proxy_;
VideoSendStream::Config config_;
@@ -1799,4 +1806,165 @@ TEST_F(SendStatisticsProxyTest, FecBitrateNotReportedWhenNotEnabled) {
EXPECT_EQ(0, metrics::NumSamples("WebRTC.Video.FecBitrateSentInKbps"));
}
+TEST_F(SendStatisticsProxyTest, GetStatsReportsEncoderImplementationName) {
+ const char* kName = "encoderName";
+ EncodedImage encoded_image;
+ CodecSpecificInfo codec_info;
+ codec_info.codec_name = kName;
+ statistics_proxy_->OnSendEncodedImage(encoded_image, &codec_info);
+ EXPECT_STREQ(
+ kName, statistics_proxy_->GetStats().encoder_implementation_name.c_str());
+}
+
+class ForcedFallbackTest : public SendStatisticsProxyTest {
+ public:
+ explicit ForcedFallbackTest(const std::string& field_trials)
+ : SendStatisticsProxyTest(field_trials) {
+ codec_info_.codecType = kVideoCodecVP8;
+ codec_info_.codecSpecific.VP8.simulcastIdx = 0;
+ codec_info_.codecSpecific.VP8.temporalIdx = 0;
+ codec_info_.codec_name = "fake_codec";
+ }
+
+ ~ForcedFallbackTest() override {}
+
+ protected:
+ void InsertEncodedFrames(int num_frames, int interval_ms) {
+ // First frame is not updating stats, insert initial frame.
+ if (statistics_proxy_->GetStats().frames_encoded == 0) {
+ statistics_proxy_->OnSendEncodedImage(encoded_image_, &codec_info_);
+ }
+ for (int i = 0; i < num_frames; ++i) {
+ statistics_proxy_->OnSendEncodedImage(encoded_image_, &codec_info_);
+ fake_clock_.AdvanceTimeMilliseconds(interval_ms);
+ }
+ // Add frame to include last time interval.
+ statistics_proxy_->OnSendEncodedImage(encoded_image_, &codec_info_);
+ }
+
+ EncodedImage encoded_image_;
+ CodecSpecificInfo codec_info_;
+ const std::string kPrefix = "WebRTC.Video.Encoder.ForcedSw";
+ const int kFrameIntervalMs = 1000;
+ const int kMinFrames = 20; // Min run time 20 sec.
+};
+
+class ForcedFallbackDisabled : public ForcedFallbackTest {
+ public:
+ ForcedFallbackDisabled()
+ : ForcedFallbackTest("WebRTC-VP8-Forced-Fallback-Encoder/Disabled/") {}
+};
+
+class ForcedFallbackEnabled : public ForcedFallbackTest {
+ public:
+ ForcedFallbackEnabled()
+ : ForcedFallbackTest("WebRTC-VP8-Forced-Fallback-Encoder/Enabled-1,2," +
+ std::to_string(kMinFirstFallbackIntervalMs) +
+ ",4/") {}
+};
+
+TEST_F(ForcedFallbackEnabled, StatsNotUpdatedIfMinRunTimeHasNotPassed) {
+ InsertEncodedFrames(kMinFrames, kFrameIntervalMs - 1);
+ statistics_proxy_.reset();
+ EXPECT_EQ(0, metrics::NumSamples(kPrefix + "FallbackTimeInPercent.Vp8"));
+ EXPECT_EQ(0, metrics::NumSamples(kPrefix + "FallbackChangesPerMinute.Vp8"));
+}
+
+TEST_F(ForcedFallbackEnabled, StatsUpdated) {
+ InsertEncodedFrames(kMinFrames, kFrameIntervalMs);
+ statistics_proxy_.reset();
+ EXPECT_EQ(1, metrics::NumSamples(kPrefix + "FallbackTimeInPercent.Vp8"));
+ EXPECT_EQ(1, metrics::NumEvents(kPrefix + "FallbackTimeInPercent.Vp8", 0));
+ EXPECT_EQ(1, metrics::NumSamples(kPrefix + "FallbackChangesPerMinute.Vp8"));
+ EXPECT_EQ(1, metrics::NumEvents(kPrefix + "FallbackChangesPerMinute.Vp8", 0));
+}
+
+TEST_F(ForcedFallbackEnabled, StatsNotUpdatedIfNotVp8) {
+ codec_info_.codecType = kVideoCodecVP9;
+ InsertEncodedFrames(kMinFrames, kFrameIntervalMs);
+ statistics_proxy_.reset();
+ EXPECT_EQ(0, metrics::NumSamples(kPrefix + "FallbackTimeInPercent.Vp8"));
+ EXPECT_EQ(0, metrics::NumSamples(kPrefix + "FallbackChangesPerMinute.Vp8"));
+}
+
+TEST_F(ForcedFallbackEnabled, StatsNotUpdatedForTemporalLayers) {
+ codec_info_.codecSpecific.VP8.temporalIdx = 1;
+ InsertEncodedFrames(kMinFrames, kFrameIntervalMs);
+ statistics_proxy_.reset();
+ EXPECT_EQ(0, metrics::NumSamples(kPrefix + "FallbackTimeInPercent.Vp8"));
+ EXPECT_EQ(0, metrics::NumSamples(kPrefix + "FallbackChangesPerMinute.Vp8"));
+}
+
+TEST_F(ForcedFallbackEnabled, StatsNotUpdatedForSimulcast) {
+ codec_info_.codecSpecific.VP8.simulcastIdx = 1;
+ InsertEncodedFrames(kMinFrames, kFrameIntervalMs);
+ statistics_proxy_.reset();
+ EXPECT_EQ(0, metrics::NumSamples(kPrefix + "FallbackTimeInPercent.Vp8"));
+ EXPECT_EQ(0, metrics::NumSamples(kPrefix + "FallbackChangesPerMinute.Vp8"));
+}
+
+TEST_F(ForcedFallbackDisabled, StatsNotUpdatedIfNoFieldTrial) {
+ InsertEncodedFrames(kMinFrames, kFrameIntervalMs);
+ statistics_proxy_.reset();
+ EXPECT_EQ(0, metrics::NumSamples(kPrefix + "FallbackTimeInPercent.Vp8"));
+ EXPECT_EQ(0, metrics::NumSamples(kPrefix + "FallbackChangesPerMinute.Vp8"));
+}
+
+TEST_F(ForcedFallbackEnabled, OneFallbackEvent) {
+ // One change. Video: 20000 ms, fallback: 5000 ms (25%).
+ InsertEncodedFrames(15, 1000);
+ codec_info_.codec_name = "libvpx";
+ InsertEncodedFrames(5, 1000);
+
+ statistics_proxy_.reset();
+ EXPECT_EQ(1, metrics::NumSamples(kPrefix + "FallbackTimeInPercent.Vp8"));
+ EXPECT_EQ(1, metrics::NumEvents(kPrefix + "FallbackTimeInPercent.Vp8", 25));
+ EXPECT_EQ(1, metrics::NumSamples(kPrefix + "FallbackChangesPerMinute.Vp8"));
+ EXPECT_EQ(1, metrics::NumEvents(kPrefix + "FallbackChangesPerMinute.Vp8", 3));
+}
+
+TEST_F(ForcedFallbackEnabled, ThreeFallbackEvents) {
+ codec_info_.codecSpecific.VP8.temporalIdx = kNoTemporalIdx; // Should work.
+ const int kMaxFrameDiffMs = 2000;
+
+ // Three changes. Video: 60000 ms, fallback: 15000 ms (25%).
+ InsertEncodedFrames(10, 1000);
+ codec_info_.codec_name = "libvpx";
+ InsertEncodedFrames(15, 500);
+ codec_info_.codec_name = "notlibvpx";
+ InsertEncodedFrames(20, 1000);
+ InsertEncodedFrames(3, kMaxFrameDiffMs); // Should not be included.
+ InsertEncodedFrames(10, 1000);
+ codec_info_.codec_name = "notlibvpx2";
+ InsertEncodedFrames(10, 500);
+ codec_info_.codec_name = "libvpx";
+ InsertEncodedFrames(15, 500);
+
+ statistics_proxy_.reset();
+ EXPECT_EQ(1, metrics::NumSamples(kPrefix + "FallbackTimeInPercent.Vp8"));
+ EXPECT_EQ(1, metrics::NumEvents(kPrefix + "FallbackTimeInPercent.Vp8", 25));
+ EXPECT_EQ(1, metrics::NumSamples(kPrefix + "FallbackChangesPerMinute.Vp8"));
+ EXPECT_EQ(1, metrics::NumEvents(kPrefix + "FallbackChangesPerMinute.Vp8", 3));
+}
+
+TEST_F(ForcedFallbackEnabled, NoFallbackIfMinIntervalHasNotPassed) {
+ InsertEncodedFrames(1, kMinFirstFallbackIntervalMs - 1);
+ codec_info_.codec_name = "libvpx";
+ InsertEncodedFrames(kMinFrames, kFrameIntervalMs);
+
+ statistics_proxy_.reset();
+ EXPECT_EQ(0, metrics::NumSamples(kPrefix + "FallbackTimeInPercent.Vp8"));
+ EXPECT_EQ(0, metrics::NumSamples(kPrefix + "FallbackChangesPerMinute.Vp8"));
+}
+
+TEST_F(ForcedFallbackEnabled, FallbackIfMinIntervalPassed) {
+ InsertEncodedFrames(1, kMinFirstFallbackIntervalMs);
+ codec_info_.codec_name = "libvpx";
+ InsertEncodedFrames(kMinFrames, kFrameIntervalMs);
+
+ statistics_proxy_.reset();
+ EXPECT_EQ(1, metrics::NumSamples(kPrefix + "FallbackTimeInPercent.Vp8"));
+ EXPECT_EQ(1, metrics::NumSamples(kPrefix + "FallbackChangesPerMinute.Vp8"));
+}
+
} // namespace webrtc
« no previous file with comments | « video/send_statistics_proxy.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698