text: /*
   *  Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
   *
   *  Use of this source code is governed by a BSD-style license
   *  that can be found in the LICENSE file in the root of the source
   *  tree. An additional intellectual property rights grant can be found
   *  in the file PATENTS.  All contributing project authors may
   *  be found in the AUTHORS file in the root of the source tree.
   */
  
  #ifndef WEBRTC_TESTSUPPORT_METRICS_VIDEO_METRICS_H_
  #define WEBRTC_TESTSUPPORT_METRICS_VIDEO_METRICS_H_
  
  #include <limits>
  #include <vector>
  
  namespace webrtc {
  namespace test {
  
  // The highest PSNR value our algorithms will return.
  extern double kMetricsPerfectPSNR;
  
  // Contains video quality metrics result for a single frame.
  struct FrameResult {
    int frame_number;
    double value;
  };
  
  // Result from a PSNR/SSIM calculation operation.
  // The frames in this data structure are 0-indexed.
  struct QualityMetricsResult {
    QualityMetricsResult() :
      average(0.0),
      min(std::numeric_limits<double>::max()),
      max(std::numeric_limits<double>::min()),
      min_frame_number(-1),
      max_frame_number(-1)
    {};
    double average;
    double min;
    double max;
    int min_frame_number;
    int max_frame_number;
    std::vector<FrameResult> frames;
  };
  
  // Calculates PSNR and SSIM values for the reference and test video files
  // (must be in I420 format). All calculated values are filled into the
  // QualityMetricsResult structs.
  //
  // PSNR values have the unit decibel (dB) where a high value means the test file
  // is similar to the reference file. The higher value, the more similar. The
  // maximum PSNR value is kMetricsInfinitePSNR. For more info about PSNR, see
  // http://en.wikipedia.org/wiki/PSNR.
  //
  // SSIM values range between -1.0 and 1.0, where 1.0 means the files are
  // identical. For more info about SSIM, see http://en.wikipedia.org/wiki/SSIM
  // This function only compares video frames up to the point when the shortest
  // video ends.
  // Return value:
  //  0 if successful, negative on errors:
  // -1 if the source file cannot be opened
  // -2 if the test file cannot be opened
  // -3 if any of the files are empty
  // -4 if any arguments are invalid.
  int I420MetricsFromFiles(const char* ref_filename,
                           const char* test_filename,
                           int width,
                           int height,
                           QualityMetricsResult* psnr_result,
                           QualityMetricsResult* ssim_result);
  
  // Calculates PSNR values for the reference and test video files (must be in
  // I420 format). All calculated values are filled into the QualityMetricsResult
  // struct.
  //
  // PSNR values have the unit decibel (dB) where a high value means the test file
  // is similar to the reference file. The higher value, the more similar. The
  // maximum PSNR value is kMetricsInfinitePSNR. For more info about PSNR, see
  // http://en.wikipedia.org/wiki/PSNR.
  //
  // This function only compares video frames up to the point when the shortest
  // video ends.
  //
  // Return value:
  //  0 if successful, negative on errors:
  // -1 if the source file cannot be opened
  // -2 if the test file cannot be opened
  // -3 if any of the files are empty
  // -4 if any arguments are invalid.
  int I420PSNRFromFiles(const char* ref_filename,
                        const char* test_filename,
                        int width,
                        int height,
                        QualityMetricsResult* result);
  
  // Calculates SSIM values for the reference and test video files (must be in
  // I420 format). All calculated values are filled into the QualityMetricsResult
  // struct.
  // SSIM values range between -1.0 and 1.0, where 1.0 means the files are
  // identical.
  // This function only compares video frames up to the point when the shortest
  // video ends.
  // For more info about SSIM, see http://en.wikipedia.org/wiki/SSIM
  //
  // Return value:
  //  0 if successful, negative on errors:
  // -1 if the source file cannot be opened
  // -2 if the test file cannot be opened
  // -3 if any of the files are empty
  // -4 if any arguments are invalid.
  int I420SSIMFromFiles(const char* ref_filename,
                        const char* test_filename,
                        int width,
                        int height,
                        QualityMetricsResult* result);
  
  }  // namespace test
  }  // namespace webrtc
  
  #endif // WEBRTC_TESTSUPPORT_METRICS_VIDEO_METRICS_H_
  