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