Home | History | Annotate | Download | only in vpx_dsp
      1 /*
      2  *  Copyright (c) 2014 The WebM 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 VPX_DSP_SSIM_H_
     12 #define VPX_DSP_SSIM_H_
     13 
     14 #ifdef __cplusplus
     15 extern "C" {
     16 #endif
     17 
     18 #include "./vpx_config.h"
     19 #include "vpx_scale/yv12config.h"
     20 
     21 // metrics used for calculating ssim, ssim2, dssim, and ssimc
     22 typedef struct {
     23   // source sum ( over 8x8 region )
     24   uint32_t sum_s;
     25 
     26   // reference sum (over 8x8 region )
     27   uint32_t sum_r;
     28 
     29   // source sum squared ( over 8x8 region )
     30   uint32_t sum_sq_s;
     31 
     32   // reference sum squared (over 8x8 region )
     33   uint32_t sum_sq_r;
     34 
     35   // sum of source times reference (over 8x8 region)
     36   uint32_t sum_sxr;
     37 
     38   // calculated ssim score between source and reference
     39   double ssim;
     40 } Ssimv;
     41 
     42 // metrics collected on a frame basis
     43 typedef struct {
     44   // ssim consistency error metric ( see code for explanation )
     45   double ssimc;
     46 
     47   // standard ssim
     48   double ssim;
     49 
     50   // revised ssim ( see code for explanation)
     51   double ssim2;
     52 
     53   // ssim restated as an error metric like sse
     54   double dssim;
     55 
     56   // dssim converted to decibels
     57   double dssimd;
     58 
     59   // ssimc converted to decibels
     60   double ssimcd;
     61 } Metrics;
     62 
     63 double vpx_get_ssim_metrics(uint8_t *img1, int img1_pitch, uint8_t *img2,
     64                       int img2_pitch, int width, int height, Ssimv *sv2,
     65                       Metrics *m, int do_inconsistency);
     66 
     67 double vpx_calc_ssim(const YV12_BUFFER_CONFIG *source,
     68                      const YV12_BUFFER_CONFIG *dest,
     69                      double *weight);
     70 
     71 double vpx_calc_ssimg(const YV12_BUFFER_CONFIG *source,
     72                       const YV12_BUFFER_CONFIG *dest,
     73                       double *ssim_y, double *ssim_u, double *ssim_v);
     74 
     75 double vpx_calc_fastssim(const YV12_BUFFER_CONFIG *source,
     76                          const YV12_BUFFER_CONFIG *dest,
     77                          double *ssim_y, double *ssim_u, double *ssim_v);
     78 
     79 double vpx_psnrhvs(const YV12_BUFFER_CONFIG *source,
     80                    const YV12_BUFFER_CONFIG *dest,
     81                    double *ssim_y, double *ssim_u, double *ssim_v);
     82 
     83 #if CONFIG_VP9_HIGHBITDEPTH
     84 double vpx_highbd_calc_ssim(const YV12_BUFFER_CONFIG *source,
     85                             const YV12_BUFFER_CONFIG *dest,
     86                             double *weight,
     87                             unsigned int bd);
     88 
     89 double vpx_highbd_calc_ssimg(const YV12_BUFFER_CONFIG *source,
     90                              const YV12_BUFFER_CONFIG *dest,
     91                              double *ssim_y,
     92                              double *ssim_u,
     93                              double *ssim_v,
     94                              unsigned int bd);
     95 #endif  // CONFIG_VP9_HIGHBITDEPTH
     96 
     97 #ifdef __cplusplus
     98 }  // extern "C"
     99 #endif
    100 
    101 #endif  // VPX_DSP_SSIM_H_
    102