blob: 83a34a3985deec99710690e11fec2b54748671ba [file] [log] [blame]
kjellander@webrtc.org82d91ae2011-12-05 13:03:38 +00001/*
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.org34741c82013-05-27 08:02:22 +000011#include "webrtc/test/testsupport/metrics/video_metrics.h"
kjellander@webrtc.org82d91ae2011-12-05 13:03:38 +000012
kwiberg77eab702016-09-28 17:42:01 -070013#include "webrtc/test/gtest.h"
pbos@webrtc.org34741c82013-05-27 08:02:22 +000014#include "webrtc/test/testsupport/fileutils.h"
kjellander@webrtc.org82d91ae2011-12-05 13:03:38 +000015
16namespace webrtc {
17
kjellander@webrtc.org82d91ae2011-12-05 13:03:38 +000018static const int kWidth = 352;
19static const int kHeight = 288;
20
21static const int kMissingReferenceFileReturnCode = -1;
22static const int kMissingTestFileReturnCode = -2;
23static const int kEmptyFileReturnCode = -3;
kjellander@webrtc.orgcc337372012-01-04 08:09:32 +000024static const double kPsnrPerfectResult = 48.0;
kjellander@webrtc.org82d91ae2011-12-05 13:03:38 +000025static const double kSsimPerfectResult = 1.0;
26
27class VideoMetricsTest: public testing::Test {
28 protected:
29 VideoMetricsTest() {
kjellander@webrtc.orgcc337372012-01-04 08:09:32 +000030 video_file_ = webrtc::test::ResourcePath("foreman_cif_short", "yuv");
kjellander@webrtc.org82d91ae2011-12-05 13:03:38 +000031 }
32 virtual ~VideoMetricsTest() {}
33 void SetUp() {
kjellander@webrtc.orge794c362014-09-29 11:47:28 +000034 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.org82d91ae2011-12-05 13:03:38 +000038 // Create an empty file:
kjellander@webrtc.orge794c362014-09-29 11:47:28 +000039 empty_file_ = webrtc::test::TempFilename(
40 webrtc::test::OutputPath(), "video_metrics_unittest_empty_file");
kjellander@webrtc.orgf746f4f2013-08-28 18:31:54 +000041 FILE* dummy = fopen(empty_file_.c_str(), "wb");
kjellander@webrtc.org82d91ae2011-12-05 13:03:38 +000042 fclose(dummy);
43 }
44 void TearDown() {
kjellander@webrtc.orgf746f4f2013-08-28 18:31:54 +000045 remove(empty_file_.c_str());
kjellander@webrtc.org82d91ae2011-12-05 13:03:38 +000046 }
kjellander@webrtc.orgcc337372012-01-04 08:09:32 +000047 webrtc::test::QualityMetricsResult psnr_result_;
48 webrtc::test::QualityMetricsResult ssim_result_;
kjellander@webrtc.orge794c362014-09-29 11:47:28 +000049 std::string non_existing_file_;
kjellander@webrtc.orgf746f4f2013-08-28 18:31:54 +000050 std::string empty_file_;
kjellander@webrtc.orgcc337372012-01-04 08:09:32 +000051 std::string video_file_;
kjellander@webrtc.org82d91ae2011-12-05 13:03:38 +000052};
53
54// Tests that it is possible to run with the same reference as test file
kjellander@webrtc.orgf746f4f2013-08-28 18:31:54 +000055TEST_F(VideoMetricsTest, ReturnsPerfectResultForIdenticalFilesPSNR) {
kjellander@webrtc.orgcc337372012-01-04 08:09:32 +000056 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.orgf746f4f2013-08-28 18:31:54 +000061TEST_F(VideoMetricsTest, ReturnsPerfectResultForIdenticalFilesSSIM) {
kjellander@webrtc.orgcc337372012-01-04 08:09:32 +000062 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.orgf746f4f2013-08-28 18:31:54 +000067TEST_F(VideoMetricsTest, ReturnsPerfectResultForIdenticalFilesBothMetrics) {
kjellander@webrtc.orgcc337372012-01-04 08:09:32 +000068 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.org82d91ae2011-12-05 13:03:38 +000073}
74
75// Tests that the right return code is given when the reference file is missing.
kjellander@webrtc.orgf746f4f2013-08-28 18:31:54 +000076TEST_F(VideoMetricsTest, MissingReferenceFilePSNR) {
kjellander@webrtc.org82d91ae2011-12-05 13:03:38 +000077 EXPECT_EQ(kMissingReferenceFileReturnCode,
kjellander@webrtc.orge794c362014-09-29 11:47:28 +000078 I420PSNRFromFiles(non_existing_file_.c_str(),
79 video_file_.c_str(), kWidth, kHeight,
80 &ssim_result_));
kjellander@webrtc.orgcc337372012-01-04 08:09:32 +000081}
82
kjellander@webrtc.orgf746f4f2013-08-28 18:31:54 +000083TEST_F(VideoMetricsTest, MissingReferenceFileSSIM) {
kjellander@webrtc.org82d91ae2011-12-05 13:03:38 +000084 EXPECT_EQ(kMissingReferenceFileReturnCode,
kjellander@webrtc.orge794c362014-09-29 11:47:28 +000085 I420SSIMFromFiles(non_existing_file_.c_str(),
86 video_file_.c_str(), kWidth, kHeight,
87 &ssim_result_));
kjellander@webrtc.orgcc337372012-01-04 08:09:32 +000088}
89
kjellander@webrtc.orgf746f4f2013-08-28 18:31:54 +000090TEST_F(VideoMetricsTest, MissingReferenceFileBothMetrics) {
kjellander@webrtc.orgcc337372012-01-04 08:09:32 +000091 EXPECT_EQ(kMissingReferenceFileReturnCode,
kjellander@webrtc.orge794c362014-09-29 11:47:28 +000092 I420MetricsFromFiles(non_existing_file_.c_str(),
93 video_file_.c_str(), kWidth, kHeight,
kjellander@webrtc.orgcc337372012-01-04 08:09:32 +000094 &psnr_result_, &ssim_result_));
kjellander@webrtc.org82d91ae2011-12-05 13:03:38 +000095}
96
97// Tests that the right return code is given when the test file is missing.
kjellander@webrtc.orgf746f4f2013-08-28 18:31:54 +000098TEST_F(VideoMetricsTest, MissingTestFilePSNR) {
kjellander@webrtc.org82d91ae2011-12-05 13:03:38 +000099 EXPECT_EQ(kMissingTestFileReturnCode,
kjellander@webrtc.orge794c362014-09-29 11:47:28 +0000100 I420PSNRFromFiles(video_file_.c_str(), non_existing_file_.c_str(),
kjellander@webrtc.orgcc337372012-01-04 08:09:32 +0000101 kWidth, kHeight, &ssim_result_));
102}
103
kjellander@webrtc.orgf746f4f2013-08-28 18:31:54 +0000104TEST_F(VideoMetricsTest, MissingTestFileSSIM) {
kjellander@webrtc.org82d91ae2011-12-05 13:03:38 +0000105 EXPECT_EQ(kMissingTestFileReturnCode,
kjellander@webrtc.orge794c362014-09-29 11:47:28 +0000106 I420SSIMFromFiles(video_file_.c_str(), non_existing_file_.c_str(),
kjellander@webrtc.orgcc337372012-01-04 08:09:32 +0000107 kWidth, kHeight, &ssim_result_));
108}
109
kjellander@webrtc.orgf746f4f2013-08-28 18:31:54 +0000110TEST_F(VideoMetricsTest, MissingTestFileBothMetrics) {
kjellander@webrtc.orgcc337372012-01-04 08:09:32 +0000111 EXPECT_EQ(kMissingTestFileReturnCode,
kjellander@webrtc.orge794c362014-09-29 11:47:28 +0000112 I420MetricsFromFiles(video_file_.c_str(),
113 non_existing_file_.c_str(), kWidth, kHeight,
kjellander@webrtc.orgcc337372012-01-04 08:09:32 +0000114 &psnr_result_, &ssim_result_));
kjellander@webrtc.org82d91ae2011-12-05 13:03:38 +0000115}
116
117// Tests that the method can be executed with empty files.
kjellander@webrtc.orgf746f4f2013-08-28 18:31:54 +0000118TEST_F(VideoMetricsTest, EmptyFilesPSNR) {
kjellander@webrtc.org82d91ae2011-12-05 13:03:38 +0000119 EXPECT_EQ(kEmptyFileReturnCode,
kjellander@webrtc.orgf746f4f2013-08-28 18:31:54 +0000120 I420PSNRFromFiles(empty_file_.c_str(), video_file_.c_str(),
kjellander@webrtc.orgcc337372012-01-04 08:09:32 +0000121 kWidth, kHeight, &ssim_result_));
kjellander@webrtc.org82d91ae2011-12-05 13:03:38 +0000122 EXPECT_EQ(kEmptyFileReturnCode,
kjellander@webrtc.orgf746f4f2013-08-28 18:31:54 +0000123 I420PSNRFromFiles(video_file_.c_str(), empty_file_.c_str(),
kjellander@webrtc.orgcc337372012-01-04 08:09:32 +0000124 kWidth, kHeight, &ssim_result_));
125}
126
kjellander@webrtc.orgf746f4f2013-08-28 18:31:54 +0000127TEST_F(VideoMetricsTest, EmptyFilesSSIM) {
kjellander@webrtc.org82d91ae2011-12-05 13:03:38 +0000128 EXPECT_EQ(kEmptyFileReturnCode,
kjellander@webrtc.orgf746f4f2013-08-28 18:31:54 +0000129 I420SSIMFromFiles(empty_file_.c_str(), video_file_.c_str(),
kjellander@webrtc.orgcc337372012-01-04 08:09:32 +0000130 kWidth, kHeight, &ssim_result_));
kjellander@webrtc.org82d91ae2011-12-05 13:03:38 +0000131 EXPECT_EQ(kEmptyFileReturnCode,
kjellander@webrtc.orgf746f4f2013-08-28 18:31:54 +0000132 I420SSIMFromFiles(video_file_.c_str(), empty_file_.c_str(),
kjellander@webrtc.orgcc337372012-01-04 08:09:32 +0000133 kWidth, kHeight, &ssim_result_));
134}
135
kjellander@webrtc.orgf746f4f2013-08-28 18:31:54 +0000136TEST_F(VideoMetricsTest, EmptyFilesBothMetrics) {
kjellander@webrtc.orgcc337372012-01-04 08:09:32 +0000137 EXPECT_EQ(kEmptyFileReturnCode,
kjellander@webrtc.orgf746f4f2013-08-28 18:31:54 +0000138 I420MetricsFromFiles(empty_file_.c_str(), video_file_.c_str(),
kjellander@webrtc.orgcc337372012-01-04 08:09:32 +0000139 kWidth, kHeight,
140 &psnr_result_, &ssim_result_));
141 EXPECT_EQ(kEmptyFileReturnCode,
kjellander@webrtc.orgf746f4f2013-08-28 18:31:54 +0000142 I420MetricsFromFiles(video_file_.c_str(), empty_file_.c_str(),
kjellander@webrtc.orgcc337372012-01-04 08:09:32 +0000143 kWidth, kHeight,
144 &psnr_result_, &ssim_result_));
kjellander@webrtc.org82d91ae2011-12-05 13:03:38 +0000145}
146
147} // namespace webrtc