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 |