kjellander@webrtc.org | 82d91ae | 2011-12-05 13:03:38 +0000 | [diff] [blame] | 1 | /* |
| 2 | * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved. |
| 3 | * |
| 4 | * Use of this source code is governed by a BSD-style license |
| 5 | * that can be found in the LICENSE file in the root of the source |
| 6 | * tree. An additional intellectual property rights grant can be found |
| 7 | * in the file PATENTS. All contributing project authors may |
| 8 | * be found in the AUTHORS file in the root of the source tree. |
| 9 | */ |
| 10 | |
pbos@webrtc.org | 34741c8 | 2013-05-27 08:02:22 +0000 | [diff] [blame] | 11 | #include "webrtc/test/testsupport/metrics/video_metrics.h" |
kjellander@webrtc.org | 82d91ae | 2011-12-05 13:03:38 +0000 | [diff] [blame] | 12 | |
kwiberg | 77eab70 | 2016-09-28 17:42:01 -0700 | [diff] [blame] | 13 | #include "webrtc/test/gtest.h" |
pbos@webrtc.org | 34741c8 | 2013-05-27 08:02:22 +0000 | [diff] [blame] | 14 | #include "webrtc/test/testsupport/fileutils.h" |
kjellander@webrtc.org | 82d91ae | 2011-12-05 13:03:38 +0000 | [diff] [blame] | 15 | |
| 16 | namespace webrtc { |
| 17 | |
kjellander@webrtc.org | 82d91ae | 2011-12-05 13:03:38 +0000 | [diff] [blame] | 18 | static const int kWidth = 352; |
| 19 | static const int kHeight = 288; |
| 20 | |
| 21 | static const int kMissingReferenceFileReturnCode = -1; |
| 22 | static const int kMissingTestFileReturnCode = -2; |
| 23 | static const int kEmptyFileReturnCode = -3; |
kjellander@webrtc.org | cc33737 | 2012-01-04 08:09:32 +0000 | [diff] [blame] | 24 | static const double kPsnrPerfectResult = 48.0; |
kjellander@webrtc.org | 82d91ae | 2011-12-05 13:03:38 +0000 | [diff] [blame] | 25 | static const double kSsimPerfectResult = 1.0; |
| 26 | |
| 27 | class VideoMetricsTest: public testing::Test { |
| 28 | protected: |
| 29 | VideoMetricsTest() { |
kjellander@webrtc.org | cc33737 | 2012-01-04 08:09:32 +0000 | [diff] [blame] | 30 | video_file_ = webrtc::test::ResourcePath("foreman_cif_short", "yuv"); |
kjellander@webrtc.org | 82d91ae | 2011-12-05 13:03:38 +0000 | [diff] [blame] | 31 | } |
| 32 | virtual ~VideoMetricsTest() {} |
| 33 | void SetUp() { |
kjellander@webrtc.org | e794c36 | 2014-09-29 11:47:28 +0000 | [diff] [blame] | 34 | non_existing_file_ = webrtc::test::OutputPath() + |
| 35 | "video_metrics_unittest_non_existing"; |
| 36 | remove(non_existing_file_.c_str()); // To be sure it doesn't exist. |
| 37 | |
kjellander@webrtc.org | 82d91ae | 2011-12-05 13:03:38 +0000 | [diff] [blame] | 38 | // Create an empty file: |
kjellander@webrtc.org | e794c36 | 2014-09-29 11:47:28 +0000 | [diff] [blame] | 39 | empty_file_ = webrtc::test::TempFilename( |
| 40 | webrtc::test::OutputPath(), "video_metrics_unittest_empty_file"); |
kjellander@webrtc.org | f746f4f | 2013-08-28 18:31:54 +0000 | [diff] [blame] | 41 | FILE* dummy = fopen(empty_file_.c_str(), "wb"); |
kjellander@webrtc.org | 82d91ae | 2011-12-05 13:03:38 +0000 | [diff] [blame] | 42 | fclose(dummy); |
| 43 | } |
| 44 | void TearDown() { |
kjellander@webrtc.org | f746f4f | 2013-08-28 18:31:54 +0000 | [diff] [blame] | 45 | remove(empty_file_.c_str()); |
kjellander@webrtc.org | 82d91ae | 2011-12-05 13:03:38 +0000 | [diff] [blame] | 46 | } |
kjellander@webrtc.org | cc33737 | 2012-01-04 08:09:32 +0000 | [diff] [blame] | 47 | webrtc::test::QualityMetricsResult psnr_result_; |
| 48 | webrtc::test::QualityMetricsResult ssim_result_; |
kjellander@webrtc.org | e794c36 | 2014-09-29 11:47:28 +0000 | [diff] [blame] | 49 | std::string non_existing_file_; |
kjellander@webrtc.org | f746f4f | 2013-08-28 18:31:54 +0000 | [diff] [blame] | 50 | std::string empty_file_; |
kjellander@webrtc.org | cc33737 | 2012-01-04 08:09:32 +0000 | [diff] [blame] | 51 | std::string video_file_; |
kjellander@webrtc.org | 82d91ae | 2011-12-05 13:03:38 +0000 | [diff] [blame] | 52 | }; |
| 53 | |
| 54 | // Tests that it is possible to run with the same reference as test file |
kjellander@webrtc.org | f746f4f | 2013-08-28 18:31:54 +0000 | [diff] [blame] | 55 | TEST_F(VideoMetricsTest, ReturnsPerfectResultForIdenticalFilesPSNR) { |
kjellander@webrtc.org | cc33737 | 2012-01-04 08:09:32 +0000 | [diff] [blame] | 56 | EXPECT_EQ(0, I420PSNRFromFiles(video_file_.c_str(), video_file_.c_str(), |
| 57 | kWidth, kHeight, &psnr_result_)); |
| 58 | EXPECT_EQ(kPsnrPerfectResult, psnr_result_.average); |
| 59 | } |
| 60 | |
kjellander@webrtc.org | f746f4f | 2013-08-28 18:31:54 +0000 | [diff] [blame] | 61 | TEST_F(VideoMetricsTest, ReturnsPerfectResultForIdenticalFilesSSIM) { |
kjellander@webrtc.org | cc33737 | 2012-01-04 08:09:32 +0000 | [diff] [blame] | 62 | EXPECT_EQ(0, I420SSIMFromFiles(video_file_.c_str(), video_file_.c_str(), |
| 63 | kWidth, kHeight, &ssim_result_)); |
| 64 | EXPECT_EQ(kSsimPerfectResult, ssim_result_.average); |
| 65 | } |
| 66 | |
kjellander@webrtc.org | f746f4f | 2013-08-28 18:31:54 +0000 | [diff] [blame] | 67 | TEST_F(VideoMetricsTest, ReturnsPerfectResultForIdenticalFilesBothMetrics) { |
kjellander@webrtc.org | cc33737 | 2012-01-04 08:09:32 +0000 | [diff] [blame] | 68 | EXPECT_EQ(0, I420MetricsFromFiles(video_file_.c_str(), video_file_.c_str(), |
| 69 | kWidth, kHeight, &psnr_result_, |
| 70 | &ssim_result_)); |
| 71 | EXPECT_EQ(kPsnrPerfectResult, psnr_result_.average); |
| 72 | EXPECT_EQ(kSsimPerfectResult, ssim_result_.average); |
kjellander@webrtc.org | 82d91ae | 2011-12-05 13:03:38 +0000 | [diff] [blame] | 73 | } |
| 74 | |
| 75 | // Tests that the right return code is given when the reference file is missing. |
kjellander@webrtc.org | f746f4f | 2013-08-28 18:31:54 +0000 | [diff] [blame] | 76 | TEST_F(VideoMetricsTest, MissingReferenceFilePSNR) { |
kjellander@webrtc.org | 82d91ae | 2011-12-05 13:03:38 +0000 | [diff] [blame] | 77 | EXPECT_EQ(kMissingReferenceFileReturnCode, |
kjellander@webrtc.org | e794c36 | 2014-09-29 11:47:28 +0000 | [diff] [blame] | 78 | I420PSNRFromFiles(non_existing_file_.c_str(), |
| 79 | video_file_.c_str(), kWidth, kHeight, |
| 80 | &ssim_result_)); |
kjellander@webrtc.org | cc33737 | 2012-01-04 08:09:32 +0000 | [diff] [blame] | 81 | } |
| 82 | |
kjellander@webrtc.org | f746f4f | 2013-08-28 18:31:54 +0000 | [diff] [blame] | 83 | TEST_F(VideoMetricsTest, MissingReferenceFileSSIM) { |
kjellander@webrtc.org | 82d91ae | 2011-12-05 13:03:38 +0000 | [diff] [blame] | 84 | EXPECT_EQ(kMissingReferenceFileReturnCode, |
kjellander@webrtc.org | e794c36 | 2014-09-29 11:47:28 +0000 | [diff] [blame] | 85 | I420SSIMFromFiles(non_existing_file_.c_str(), |
| 86 | video_file_.c_str(), kWidth, kHeight, |
| 87 | &ssim_result_)); |
kjellander@webrtc.org | cc33737 | 2012-01-04 08:09:32 +0000 | [diff] [blame] | 88 | } |
| 89 | |
kjellander@webrtc.org | f746f4f | 2013-08-28 18:31:54 +0000 | [diff] [blame] | 90 | TEST_F(VideoMetricsTest, MissingReferenceFileBothMetrics) { |
kjellander@webrtc.org | cc33737 | 2012-01-04 08:09:32 +0000 | [diff] [blame] | 91 | EXPECT_EQ(kMissingReferenceFileReturnCode, |
kjellander@webrtc.org | e794c36 | 2014-09-29 11:47:28 +0000 | [diff] [blame] | 92 | I420MetricsFromFiles(non_existing_file_.c_str(), |
| 93 | video_file_.c_str(), kWidth, kHeight, |
kjellander@webrtc.org | cc33737 | 2012-01-04 08:09:32 +0000 | [diff] [blame] | 94 | &psnr_result_, &ssim_result_)); |
kjellander@webrtc.org | 82d91ae | 2011-12-05 13:03:38 +0000 | [diff] [blame] | 95 | } |
| 96 | |
| 97 | // Tests that the right return code is given when the test file is missing. |
kjellander@webrtc.org | f746f4f | 2013-08-28 18:31:54 +0000 | [diff] [blame] | 98 | TEST_F(VideoMetricsTest, MissingTestFilePSNR) { |
kjellander@webrtc.org | 82d91ae | 2011-12-05 13:03:38 +0000 | [diff] [blame] | 99 | EXPECT_EQ(kMissingTestFileReturnCode, |
kjellander@webrtc.org | e794c36 | 2014-09-29 11:47:28 +0000 | [diff] [blame] | 100 | I420PSNRFromFiles(video_file_.c_str(), non_existing_file_.c_str(), |
kjellander@webrtc.org | cc33737 | 2012-01-04 08:09:32 +0000 | [diff] [blame] | 101 | kWidth, kHeight, &ssim_result_)); |
| 102 | } |
| 103 | |
kjellander@webrtc.org | f746f4f | 2013-08-28 18:31:54 +0000 | [diff] [blame] | 104 | TEST_F(VideoMetricsTest, MissingTestFileSSIM) { |
kjellander@webrtc.org | 82d91ae | 2011-12-05 13:03:38 +0000 | [diff] [blame] | 105 | EXPECT_EQ(kMissingTestFileReturnCode, |
kjellander@webrtc.org | e794c36 | 2014-09-29 11:47:28 +0000 | [diff] [blame] | 106 | I420SSIMFromFiles(video_file_.c_str(), non_existing_file_.c_str(), |
kjellander@webrtc.org | cc33737 | 2012-01-04 08:09:32 +0000 | [diff] [blame] | 107 | kWidth, kHeight, &ssim_result_)); |
| 108 | } |
| 109 | |
kjellander@webrtc.org | f746f4f | 2013-08-28 18:31:54 +0000 | [diff] [blame] | 110 | TEST_F(VideoMetricsTest, MissingTestFileBothMetrics) { |
kjellander@webrtc.org | cc33737 | 2012-01-04 08:09:32 +0000 | [diff] [blame] | 111 | EXPECT_EQ(kMissingTestFileReturnCode, |
kjellander@webrtc.org | e794c36 | 2014-09-29 11:47:28 +0000 | [diff] [blame] | 112 | I420MetricsFromFiles(video_file_.c_str(), |
| 113 | non_existing_file_.c_str(), kWidth, kHeight, |
kjellander@webrtc.org | cc33737 | 2012-01-04 08:09:32 +0000 | [diff] [blame] | 114 | &psnr_result_, &ssim_result_)); |
kjellander@webrtc.org | 82d91ae | 2011-12-05 13:03:38 +0000 | [diff] [blame] | 115 | } |
| 116 | |
| 117 | // Tests that the method can be executed with empty files. |
kjellander@webrtc.org | f746f4f | 2013-08-28 18:31:54 +0000 | [diff] [blame] | 118 | TEST_F(VideoMetricsTest, EmptyFilesPSNR) { |
kjellander@webrtc.org | 82d91ae | 2011-12-05 13:03:38 +0000 | [diff] [blame] | 119 | EXPECT_EQ(kEmptyFileReturnCode, |
kjellander@webrtc.org | f746f4f | 2013-08-28 18:31:54 +0000 | [diff] [blame] | 120 | I420PSNRFromFiles(empty_file_.c_str(), video_file_.c_str(), |
kjellander@webrtc.org | cc33737 | 2012-01-04 08:09:32 +0000 | [diff] [blame] | 121 | kWidth, kHeight, &ssim_result_)); |
kjellander@webrtc.org | 82d91ae | 2011-12-05 13:03:38 +0000 | [diff] [blame] | 122 | EXPECT_EQ(kEmptyFileReturnCode, |
kjellander@webrtc.org | f746f4f | 2013-08-28 18:31:54 +0000 | [diff] [blame] | 123 | I420PSNRFromFiles(video_file_.c_str(), empty_file_.c_str(), |
kjellander@webrtc.org | cc33737 | 2012-01-04 08:09:32 +0000 | [diff] [blame] | 124 | kWidth, kHeight, &ssim_result_)); |
| 125 | } |
| 126 | |
kjellander@webrtc.org | f746f4f | 2013-08-28 18:31:54 +0000 | [diff] [blame] | 127 | TEST_F(VideoMetricsTest, EmptyFilesSSIM) { |
kjellander@webrtc.org | 82d91ae | 2011-12-05 13:03:38 +0000 | [diff] [blame] | 128 | EXPECT_EQ(kEmptyFileReturnCode, |
kjellander@webrtc.org | f746f4f | 2013-08-28 18:31:54 +0000 | [diff] [blame] | 129 | I420SSIMFromFiles(empty_file_.c_str(), video_file_.c_str(), |
kjellander@webrtc.org | cc33737 | 2012-01-04 08:09:32 +0000 | [diff] [blame] | 130 | kWidth, kHeight, &ssim_result_)); |
kjellander@webrtc.org | 82d91ae | 2011-12-05 13:03:38 +0000 | [diff] [blame] | 131 | EXPECT_EQ(kEmptyFileReturnCode, |
kjellander@webrtc.org | f746f4f | 2013-08-28 18:31:54 +0000 | [diff] [blame] | 132 | I420SSIMFromFiles(video_file_.c_str(), empty_file_.c_str(), |
kjellander@webrtc.org | cc33737 | 2012-01-04 08:09:32 +0000 | [diff] [blame] | 133 | kWidth, kHeight, &ssim_result_)); |
| 134 | } |
| 135 | |
kjellander@webrtc.org | f746f4f | 2013-08-28 18:31:54 +0000 | [diff] [blame] | 136 | TEST_F(VideoMetricsTest, EmptyFilesBothMetrics) { |
kjellander@webrtc.org | cc33737 | 2012-01-04 08:09:32 +0000 | [diff] [blame] | 137 | EXPECT_EQ(kEmptyFileReturnCode, |
kjellander@webrtc.org | f746f4f | 2013-08-28 18:31:54 +0000 | [diff] [blame] | 138 | I420MetricsFromFiles(empty_file_.c_str(), video_file_.c_str(), |
kjellander@webrtc.org | cc33737 | 2012-01-04 08:09:32 +0000 | [diff] [blame] | 139 | kWidth, kHeight, |
| 140 | &psnr_result_, &ssim_result_)); |
| 141 | EXPECT_EQ(kEmptyFileReturnCode, |
kjellander@webrtc.org | f746f4f | 2013-08-28 18:31:54 +0000 | [diff] [blame] | 142 | I420MetricsFromFiles(video_file_.c_str(), empty_file_.c_str(), |
kjellander@webrtc.org | cc33737 | 2012-01-04 08:09:32 +0000 | [diff] [blame] | 143 | kWidth, kHeight, |
| 144 | &psnr_result_, &ssim_result_)); |
kjellander@webrtc.org | 82d91ae | 2011-12-05 13:03:38 +0000 | [diff] [blame] | 145 | } |
| 146 | |
| 147 | } // namespace webrtc |