ssim.h 3.01 KB
Newer Older
Dmitry Kovalev's avatar
Dmitry Kovalev committed
1 2 3 4 5 6 7 8 9 10
/*
 *  Copyright (c) 2014 The WebM 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.
 */

11 12
#ifndef VPX_ENCODER_VP9_SSIM_H_
#define VPX_ENCODER_VP9_SSIM_H_
Dmitry Kovalev's avatar
Dmitry Kovalev committed
13 14 15 16 17

#ifdef __cplusplus
extern "C" {
#endif

18
#include "./vpx_config.h"
Dmitry Kovalev's avatar
Dmitry Kovalev committed
19 20
#include "vpx_scale/yv12config.h"

21 22 23 24 25 26 27 28
// TODO(aconverse): Unify vp8/vp9_clear_system_state
#if ARCH_X86 || ARCH_X86_64
void vpx_reset_mmx_state(void);
#define vpx_clear_system_state() vpx_reset_mmx_state()
#else
#define vpx_clear_system_state()
#endif

29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70
// metrics used for calculating ssim, ssim2, dssim, and ssimc
typedef struct {
  // source sum ( over 8x8 region )
  uint64_t sum_s;

  // reference sum (over 8x8 region )
  uint64_t sum_r;

  // source sum squared ( over 8x8 region )
  uint64_t sum_sq_s;

  // reference sum squared (over 8x8 region )
  uint64_t sum_sq_r;

  // sum of source times reference (over 8x8 region)
  uint64_t sum_sxr;

  // calculated ssim score between source and reference
  double ssim;
} Ssimv;

// metrics collected on a frame basis
typedef struct {
  // ssim consistency error metric ( see code for explanation )
  double ssimc;

  // standard ssim
  double ssim;

  // revised ssim ( see code for explanation)
  double ssim2;

  // ssim restated as an error metric like sse
  double dssim;

  // dssim converted to decibels
  double dssimd;

  // ssimc converted to decibels
  double ssimcd;
} Metrics;

71
double vpx_get_ssim_metrics(uint8_t *img1, int img1_pitch, uint8_t *img2,
72 73 74
                      int img2_pitch, int width, int height, Ssimv *sv2,
                      Metrics *m, int do_inconsistency);

75
double vpx_calc_ssim(YV12_BUFFER_CONFIG *source, YV12_BUFFER_CONFIG *dest,
76
                     double *weight);
Dmitry Kovalev's avatar
Dmitry Kovalev committed
77

78
double vpx_calc_ssimg(YV12_BUFFER_CONFIG *source, YV12_BUFFER_CONFIG *dest,
Dmitry Kovalev's avatar
Dmitry Kovalev committed
79 80
                      double *ssim_y, double *ssim_u, double *ssim_v);

81
double vpx_calc_fastssim(YV12_BUFFER_CONFIG *source, YV12_BUFFER_CONFIG *dest,
82 83
                         double *ssim_y, double *ssim_u, double *ssim_v);

84
double vpx_psnrhvs(YV12_BUFFER_CONFIG *source, YV12_BUFFER_CONFIG *dest,
Jim Bankoski's avatar
Jim Bankoski committed
85 86
                   double *ssim_y, double *ssim_u, double *ssim_v);

87
#if CONFIG_VP9_HIGHBITDEPTH
88
double vpx_highbd_calc_ssim(YV12_BUFFER_CONFIG *source,
89 90
                            YV12_BUFFER_CONFIG *dest,
                            double *weight,
Deb Mukherjee's avatar
Deb Mukherjee committed
91
                            unsigned int bd);
92

93
double vpx_highbd_calc_ssimg(YV12_BUFFER_CONFIG *source,
94 95 96 97
                             YV12_BUFFER_CONFIG *dest,
                             double *ssim_y,
                             double *ssim_u,
                             double *ssim_v,
Deb Mukherjee's avatar
Deb Mukherjee committed
98
                             unsigned int bd);
99 100
#endif  // CONFIG_VP9_HIGHBITDEPTH

Dmitry Kovalev's avatar
Dmitry Kovalev committed
101 102 103 104
#ifdef __cplusplus
}  // extern "C"
#endif

105
#endif  // VPX_ENCODER_VP9_SSIM_H_