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