Home | History | Annotate | Download | only in metrics
      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 {
     32   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