1 /*
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 
11 #ifndef WEBRTC_TESTSUPPORT_METRICS_VIDEO_METRICS_H_
12 #define WEBRTC_TESTSUPPORT_METRICS_VIDEO_METRICS_H_
13 
14 #include <limits>
15 #include <vector>
16 
17 namespace webrtc {
18 namespace test {
19 
20 // The highest PSNR value our algorithms will return.
21 extern double kMetricsPerfectPSNR;
22 
23 // Contains video quality metrics result for a single frame.
24 struct FrameResult {
25   int frame_number;
26   double value;
27 };
28 
29 // Result from a PSNR/SSIM calculation operation.
30 // The frames in this data structure are 0-indexed.
31 struct QualityMetricsResult {
QualityMetricsResultQualityMetricsResult32   QualityMetricsResult() :
33     average(0.0),
34     min(std::numeric_limits<double>::max()),
35     max(std::numeric_limits<double>::min()),
36     min_frame_number(-1),
37     max_frame_number(-1)
38   {};
39   double average;
40   double min;
41   double max;
42   int min_frame_number;
43   int max_frame_number;
44   std::vector<FrameResult> frames;
45 };
46 
47 // Calculates PSNR and SSIM values for the reference and test video files
48 // (must be in I420 format). All calculated values are filled into the
49 // QualityMetricsResult structs.
50 //
51 // PSNR values have the unit decibel (dB) where a high value means the test file
52 // is similar to the reference file. The higher value, the more similar. The
53 // maximum PSNR value is kMetricsInfinitePSNR. For more info about PSNR, see
54 // http://en.wikipedia.org/wiki/PSNR.
55 //
56 // SSIM values range between -1.0 and 1.0, where 1.0 means the files are
57 // identical. For more info about SSIM, see http://en.wikipedia.org/wiki/SSIM
58 // This function only compares video frames up to the point when the shortest
59 // video ends.
60 // Return value:
61 //  0 if successful, negative on errors:
62 // -1 if the source file cannot be opened
63 // -2 if the test file cannot be opened
64 // -3 if any of the files are empty
65 // -4 if any arguments are invalid.
66 int I420MetricsFromFiles(const char* ref_filename,
67                          const char* test_filename,
68                          int width,
69                          int height,
70                          QualityMetricsResult* psnr_result,
71                          QualityMetricsResult* ssim_result);
72 
73 // Calculates PSNR values for the reference and test video files (must be in
74 // I420 format). All calculated values are filled into the QualityMetricsResult
75 // struct.
76 //
77 // PSNR values have the unit decibel (dB) where a high value means the test file
78 // is similar to the reference file. The higher value, the more similar. The
79 // maximum PSNR value is kMetricsInfinitePSNR. For more info about PSNR, see
80 // http://en.wikipedia.org/wiki/PSNR.
81 //
82 // This function only compares video frames up to the point when the shortest
83 // video ends.
84 //
85 // Return value:
86 //  0 if successful, negative on errors:
87 // -1 if the source file cannot be opened
88 // -2 if the test file cannot be opened
89 // -3 if any of the files are empty
90 // -4 if any arguments are invalid.
91 int I420PSNRFromFiles(const char* ref_filename,
92                       const char* test_filename,
93                       int width,
94                       int height,
95                       QualityMetricsResult* result);
96 
97 // Calculates SSIM values for the reference and test video files (must be in
98 // I420 format). All calculated values are filled into the QualityMetricsResult
99 // struct.
100 // SSIM values range between -1.0 and 1.0, where 1.0 means the files are
101 // identical.
102 // This function only compares video frames up to the point when the shortest
103 // video ends.
104 // For more info about SSIM, see http://en.wikipedia.org/wiki/SSIM
105 //
106 // Return value:
107 //  0 if successful, negative on errors:
108 // -1 if the source file cannot be opened
109 // -2 if the test file cannot be opened
110 // -3 if any of the files are empty
111 // -4 if any arguments are invalid.
112 int I420SSIMFromFiles(const char* ref_filename,
113                       const char* test_filename,
114                       int width,
115                       int height,
116                       QualityMetricsResult* result);
117 
118 }  // namespace test
119 }  // namespace webrtc
120 
121 #endif // WEBRTC_TESTSUPPORT_METRICS_VIDEO_METRICS_H_
122