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