1478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project/* 2478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved. 3478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * 4478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * Use of this source code is governed by a BSD-style license 5478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * that can be found in the LICENSE file in the root of the source 6478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * tree. An additional intellectual property rights grant can be found 7478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * in the file PATENTS. All contributing project authors may 8478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * be found in the AUTHORS file in the root of the source tree. 9478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project */ 10478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 11478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#include "testsupport/metrics/video_metrics.h" 12478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 13478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#include "gtest/gtest.h" 14478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#include "testsupport/fileutils.h" 15478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 16478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Projectnamespace webrtc { 17478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 18478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Projectstatic const char* kEmptyFileName = "video_metrics_unittest_empty_file.tmp"; 19478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Projectstatic const char* kNonExistingFileName = "video_metrics_unittest_non_existing"; 20478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Projectstatic const int kWidth = 352; 21478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Projectstatic const int kHeight = 288; 22478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 23478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Projectstatic const int kMissingReferenceFileReturnCode = -1; 24478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Projectstatic const int kMissingTestFileReturnCode = -2; 25478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Projectstatic const int kEmptyFileReturnCode = -3; 26478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Projectstatic const double kPsnrPerfectResult = 48.0; 27478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Projectstatic const double kSsimPerfectResult = 1.0; 28478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 29478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Projectclass VideoMetricsTest: public testing::Test { 30478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project protected: 31478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project VideoMetricsTest() { 32478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project video_file_ = webrtc::test::ResourcePath("foreman_cif_short", "yuv"); 33478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project } 34511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall virtual ~VideoMetricsTest() {} 35478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project void SetUp() { 36478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project // Create an empty file: 37478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project FILE* dummy = fopen(kEmptyFileName, "wb"); 38478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project fclose(dummy); 39478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project } 40478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project void TearDown() { 41478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project std::remove(kEmptyFileName); 42511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall } 43478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project webrtc::test::QualityMetricsResult psnr_result_; 44478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project webrtc::test::QualityMetricsResult ssim_result_; 45478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project std::string video_file_; 46478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project}; 47478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 48478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project// Tests that it is possible to run with the same reference as test file 49478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source ProjectTEST_F(VideoMetricsTest, ReturnsPerfectResultForIdenticalFilesPSNR) { 50478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project EXPECT_EQ(0, I420PSNRFromFiles(video_file_.c_str(), video_file_.c_str(), 51478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project kWidth, kHeight, &psnr_result_)); 52478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project EXPECT_EQ(kPsnrPerfectResult, psnr_result_.average); 53478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project} 54478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 55478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source ProjectTEST_F(VideoMetricsTest, ReturnsPerfectResultForIdenticalFilesSSIM) { 56478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project EXPECT_EQ(0, I420SSIMFromFiles(video_file_.c_str(), video_file_.c_str(), 57478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project kWidth, kHeight, &ssim_result_)); 58478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project EXPECT_EQ(kSsimPerfectResult, ssim_result_.average); 59478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project} 60478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 61478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source ProjectTEST_F(VideoMetricsTest, ReturnsPerfectResultForIdenticalFilesBothMetrics) { 62478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project EXPECT_EQ(0, I420MetricsFromFiles(video_file_.c_str(), video_file_.c_str(), 63478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project kWidth, kHeight, &psnr_result_, 64478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project &ssim_result_)); 65478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project EXPECT_EQ(kPsnrPerfectResult, psnr_result_.average); 66478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project EXPECT_EQ(kSsimPerfectResult, ssim_result_.average); 67478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project} 68478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 69478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project// Tests that the right return code is given when the reference file is missing. 70478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source ProjectTEST_F(VideoMetricsTest, MissingReferenceFilePSNR) { 71478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project EXPECT_EQ(kMissingReferenceFileReturnCode, 72478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project I420PSNRFromFiles(kNonExistingFileName, video_file_.c_str(), 73478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project kWidth, kHeight, &ssim_result_)); 74478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project} 75478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 76478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source ProjectTEST_F(VideoMetricsTest, MissingReferenceFileSSIM) { 77478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project EXPECT_EQ(kMissingReferenceFileReturnCode, 78478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project I420SSIMFromFiles(kNonExistingFileName, video_file_.c_str(), 79478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project kWidth, kHeight, &ssim_result_)); 80478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project} 81478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 82478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source ProjectTEST_F(VideoMetricsTest, MissingReferenceFileBothMetrics) { 83478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project EXPECT_EQ(kMissingReferenceFileReturnCode, 84478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project I420MetricsFromFiles(kNonExistingFileName, video_file_.c_str(), 85478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project kWidth, kHeight, 86478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project &psnr_result_, &ssim_result_)); 87478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project} 88478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 89478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project// Tests that the right return code is given when the test file is missing. 90478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source ProjectTEST_F(VideoMetricsTest, MissingTestFilePSNR) { 91478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project EXPECT_EQ(kMissingTestFileReturnCode, 92478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project I420PSNRFromFiles(video_file_.c_str(), kNonExistingFileName, 93478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project kWidth, kHeight, &ssim_result_)); 94478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project} 95478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 96478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source ProjectTEST_F(VideoMetricsTest, MissingTestFileSSIM) { 97478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project EXPECT_EQ(kMissingTestFileReturnCode, 98478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project I420SSIMFromFiles(video_file_.c_str(), kNonExistingFileName, 99478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project kWidth, kHeight, &ssim_result_)); 100478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project} 101478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 102478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source ProjectTEST_F(VideoMetricsTest, MissingTestFileBothMetrics) { 103478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project EXPECT_EQ(kMissingTestFileReturnCode, 104478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project I420MetricsFromFiles(video_file_.c_str(), kNonExistingFileName, 105478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project kWidth, kHeight, 106478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project &psnr_result_, &ssim_result_)); 107478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project} 108478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 109478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project// Tests that the method can be executed with empty files. 110478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source ProjectTEST_F(VideoMetricsTest, EmptyFilesPSNR) { 111478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project EXPECT_EQ(kEmptyFileReturnCode, 112478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project I420PSNRFromFiles(kEmptyFileName, video_file_.c_str(), 113478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project kWidth, kHeight, &ssim_result_)); 114478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project EXPECT_EQ(kEmptyFileReturnCode, 115478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project I420PSNRFromFiles(video_file_.c_str(), kEmptyFileName, 116478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project kWidth, kHeight, &ssim_result_)); 117478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project} 118478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 119478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source ProjectTEST_F(VideoMetricsTest, EmptyFilesSSIM) { 120478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project EXPECT_EQ(kEmptyFileReturnCode, 121478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project I420SSIMFromFiles(kEmptyFileName, video_file_.c_str(), 122478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project kWidth, kHeight, &ssim_result_)); 123478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project EXPECT_EQ(kEmptyFileReturnCode, 124478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project I420SSIMFromFiles(video_file_.c_str(), kEmptyFileName, 125478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project kWidth, kHeight, &ssim_result_)); 126478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project} 127478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 128478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source ProjectTEST_F(VideoMetricsTest, EmptyFilesBothMetrics) { 129478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project EXPECT_EQ(kEmptyFileReturnCode, 130478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project I420MetricsFromFiles(kEmptyFileName, video_file_.c_str(), 131478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project kWidth, kHeight, 132478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project &psnr_result_, &ssim_result_)); 133478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project EXPECT_EQ(kEmptyFileReturnCode, 134478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project I420MetricsFromFiles(video_file_.c_str(), kEmptyFileName, 135478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project kWidth, kHeight, 136478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project &psnr_result_, &ssim_result_)); 137478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project} 138478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 139478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project} // namespace webrtc 140478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project