From 5b689efe8e5280fdb9d4e9ec28d873561085fe5d Mon Sep 17 00:00:00 2001 From: "phoglund@webrtc.org" Date: Thu, 13 Dec 2012 10:15:06 +0000 Subject: [PATCH] Will now only require near-perfect PSNR and SSIM. BUG= TEST=Ran test and checked we accept somewhat lower values. Committed: https://code.google.com/p/webrtc/source/detail?r=3269 Review URL: https://webrtc-codereview.appspot.com/964031 git-svn-id: http://webrtc.googlecode.com/svn/trunk@3278 4adac7df-926f-26a2-2b94-8c16560cd09d --- webrtc/common_video/libyuv/include/webrtc_libyuv.h | 2 +- webrtc/common_video/libyuv/webrtc_libyuv.cc | 4 ++-- webrtc/test/testsupport/metrics/video_metrics.cc | 2 +- webrtc/test/testsupport/metrics/video_metrics.h | 2 +- .../auto_test/automated/vie_video_verification_test.cc | 7 ++++--- 5 files changed, 9 insertions(+), 8 deletions(-) diff --git a/webrtc/common_video/libyuv/include/webrtc_libyuv.h b/webrtc/common_video/libyuv/include/webrtc_libyuv.h index 777e7c72d9..1bea4f1852 100644 --- a/webrtc/common_video/libyuv/include/webrtc_libyuv.h +++ b/webrtc/common_video/libyuv/include/webrtc_libyuv.h @@ -44,7 +44,7 @@ enum VideoType { }; // This is the max PSNR value our algorithms can return. -const double kInfinitePSNR = 48.0f; +const double kPerfectPSNR = 48.0f; // Conversion between the RawVideoType and the LibYuv videoType. // TODO(wu): Consolidate types into one type throughout WebRtc. diff --git a/webrtc/common_video/libyuv/webrtc_libyuv.cc b/webrtc/common_video/libyuv/webrtc_libyuv.cc index fdef255302..750235528f 100644 --- a/webrtc/common_video/libyuv/webrtc_libyuv.cc +++ b/webrtc/common_video/libyuv/webrtc_libyuv.cc @@ -354,7 +354,7 @@ double I420PSNR(const I420VideoFrame* ref_frame, test_frame->width(), test_frame->height()); // LibYuv sets the max psnr value to 128, we restrict it here. // In case of 0 mse in one frame, 128 can skew the results significantly. - return (psnr > kInfinitePSNR) ? kInfinitePSNR : psnr; + return (psnr > kPerfectPSNR) ? kPerfectPSNR : psnr; } // Compute SSIM for an I420 frame (all planes) @@ -409,7 +409,7 @@ double I420PSNR(const uint8_t* ref_frame, width, height); // LibYuv sets the max psnr value to 128, we restrict it here. // In case of 0 mse in one frame, 128 can skew the results significantly. - return (psnr > kInfinitePSNR) ? kInfinitePSNR : psnr; + return (psnr > kPerfectPSNR) ? kPerfectPSNR : psnr; } // Compute SSIM for an I420 frame (all planes) double I420SSIM(const uint8_t* ref_frame, diff --git a/webrtc/test/testsupport/metrics/video_metrics.cc b/webrtc/test/testsupport/metrics/video_metrics.cc index c9d6d9dcc5..632786af8a 100644 --- a/webrtc/test/testsupport/metrics/video_metrics.cc +++ b/webrtc/test/testsupport/metrics/video_metrics.cc @@ -21,7 +21,7 @@ namespace webrtc { namespace test { // Copy here so our callers won't need to include libyuv for this constant. -double kMetricsInfinitePSNR = kInfinitePSNR; +double kMetricsPerfectPSNR = kPerfectPSNR; // Used for calculating min and max values. static bool LessForFrameResultValue (const FrameResult& s1, diff --git a/webrtc/test/testsupport/metrics/video_metrics.h b/webrtc/test/testsupport/metrics/video_metrics.h index 36e62a0769..8448ccfd24 100644 --- a/webrtc/test/testsupport/metrics/video_metrics.h +++ b/webrtc/test/testsupport/metrics/video_metrics.h @@ -18,7 +18,7 @@ namespace webrtc { namespace test { // The highest PSNR value our algorithms will return. -extern double kMetricsInfinitePSNR; +extern double kMetricsPerfectPSNR; // Contains video quality metrics result for a single frame. struct FrameResult { diff --git a/webrtc/video_engine/test/auto_test/automated/vie_video_verification_test.cc b/webrtc/video_engine/test/auto_test/automated/vie_video_verification_test.cc index c0094dd83e..23e56a9fba 100644 --- a/webrtc/video_engine/test/auto_test/automated/vie_video_verification_test.cc +++ b/webrtc/video_engine/test/auto_test/automated/vie_video_verification_test.cc @@ -160,6 +160,8 @@ TEST_F(ViEVideoVerificationTest, RunsBaseStandardTestWithoutErrors) { // However, it's hard to make 100% stringent requirements on the video engine // since for instance the jitter buffer has non-deterministic elements. If it // breaks five times in a row though, you probably introduced a bug. + const double kReasonablePsnr = webrtc::test::kMetricsPerfectPSNR - 2.0f; + const double kReasonableSsim = 0.99f; const int kNumAttempts = 5; for (int attempt = 0; attempt < kNumAttempts; ++attempt) { InitializeFileRenderers(); @@ -176,8 +178,7 @@ TEST_F(ViEVideoVerificationTest, RunsBaseStandardTestWithoutErrors) { TearDownFileRenderers(); - if (actual_psnr == webrtc::test::kMetricsInfinitePSNR && - actual_ssim == 1.0f) { + if (actual_psnr > kReasonablePsnr && actual_ssim > kReasonableSsim) { // Test successful. return; } else { @@ -185,7 +186,7 @@ TEST_F(ViEVideoVerificationTest, RunsBaseStandardTestWithoutErrors) { } } - FAIL() << "Failed to achieve perfect PSNR and SSIM results after " << + FAIL() << "Failed to achieve near-perfect PSNR and SSIM results after " << kNumAttempts << " attempts."; }