1*fb1b10abSAndroid Build Coastguard Worker /* 2*fb1b10abSAndroid Build Coastguard Worker * Copyright (c) 2014 The WebM project authors. All Rights Reserved. 3*fb1b10abSAndroid Build Coastguard Worker * 4*fb1b10abSAndroid Build Coastguard Worker * Use of this source code is governed by a BSD-style license 5*fb1b10abSAndroid Build Coastguard Worker * that can be found in the LICENSE file in the root of the source 6*fb1b10abSAndroid Build Coastguard Worker * tree. An additional intellectual property rights grant can be found 7*fb1b10abSAndroid Build Coastguard Worker * in the file PATENTS. All contributing project authors may 8*fb1b10abSAndroid Build Coastguard Worker * be found in the AUTHORS file in the root of the source tree. 9*fb1b10abSAndroid Build Coastguard Worker */ 10*fb1b10abSAndroid Build Coastguard Worker 11*fb1b10abSAndroid Build Coastguard Worker #ifndef VPX_VPX_DSP_SSIM_H_ 12*fb1b10abSAndroid Build Coastguard Worker #define VPX_VPX_DSP_SSIM_H_ 13*fb1b10abSAndroid Build Coastguard Worker 14*fb1b10abSAndroid Build Coastguard Worker #define MAX_SSIM_DB 100.0; 15*fb1b10abSAndroid Build Coastguard Worker 16*fb1b10abSAndroid Build Coastguard Worker #ifdef __cplusplus 17*fb1b10abSAndroid Build Coastguard Worker extern "C" { 18*fb1b10abSAndroid Build Coastguard Worker #endif 19*fb1b10abSAndroid Build Coastguard Worker 20*fb1b10abSAndroid Build Coastguard Worker #include "./vpx_config.h" 21*fb1b10abSAndroid Build Coastguard Worker #include "vpx_scale/yv12config.h" 22*fb1b10abSAndroid Build Coastguard Worker 23*fb1b10abSAndroid Build Coastguard Worker // metrics used for calculating ssim, ssim2, dssim, and ssimc 24*fb1b10abSAndroid Build Coastguard Worker typedef struct { 25*fb1b10abSAndroid Build Coastguard Worker // source sum ( over 8x8 region ) 26*fb1b10abSAndroid Build Coastguard Worker uint32_t sum_s; 27*fb1b10abSAndroid Build Coastguard Worker 28*fb1b10abSAndroid Build Coastguard Worker // reference sum (over 8x8 region ) 29*fb1b10abSAndroid Build Coastguard Worker uint32_t sum_r; 30*fb1b10abSAndroid Build Coastguard Worker 31*fb1b10abSAndroid Build Coastguard Worker // source sum squared ( over 8x8 region ) 32*fb1b10abSAndroid Build Coastguard Worker uint32_t sum_sq_s; 33*fb1b10abSAndroid Build Coastguard Worker 34*fb1b10abSAndroid Build Coastguard Worker // reference sum squared (over 8x8 region ) 35*fb1b10abSAndroid Build Coastguard Worker uint32_t sum_sq_r; 36*fb1b10abSAndroid Build Coastguard Worker 37*fb1b10abSAndroid Build Coastguard Worker // sum of source times reference (over 8x8 region) 38*fb1b10abSAndroid Build Coastguard Worker uint32_t sum_sxr; 39*fb1b10abSAndroid Build Coastguard Worker 40*fb1b10abSAndroid Build Coastguard Worker // calculated ssim score between source and reference 41*fb1b10abSAndroid Build Coastguard Worker double ssim; 42*fb1b10abSAndroid Build Coastguard Worker } Ssimv; 43*fb1b10abSAndroid Build Coastguard Worker 44*fb1b10abSAndroid Build Coastguard Worker // metrics collected on a frame basis 45*fb1b10abSAndroid Build Coastguard Worker typedef struct { 46*fb1b10abSAndroid Build Coastguard Worker // ssim consistency error metric ( see code for explanation ) 47*fb1b10abSAndroid Build Coastguard Worker double ssimc; 48*fb1b10abSAndroid Build Coastguard Worker 49*fb1b10abSAndroid Build Coastguard Worker // standard ssim 50*fb1b10abSAndroid Build Coastguard Worker double ssim; 51*fb1b10abSAndroid Build Coastguard Worker 52*fb1b10abSAndroid Build Coastguard Worker // revised ssim ( see code for explanation) 53*fb1b10abSAndroid Build Coastguard Worker double ssim2; 54*fb1b10abSAndroid Build Coastguard Worker 55*fb1b10abSAndroid Build Coastguard Worker // ssim restated as an error metric like sse 56*fb1b10abSAndroid Build Coastguard Worker double dssim; 57*fb1b10abSAndroid Build Coastguard Worker 58*fb1b10abSAndroid Build Coastguard Worker // dssim converted to decibels 59*fb1b10abSAndroid Build Coastguard Worker double dssimd; 60*fb1b10abSAndroid Build Coastguard Worker 61*fb1b10abSAndroid Build Coastguard Worker // ssimc converted to decibels 62*fb1b10abSAndroid Build Coastguard Worker double ssimcd; 63*fb1b10abSAndroid Build Coastguard Worker } Metrics; 64*fb1b10abSAndroid Build Coastguard Worker 65*fb1b10abSAndroid Build Coastguard Worker double vpx_get_ssim_metrics(uint8_t *img1, int img1_pitch, uint8_t *img2, 66*fb1b10abSAndroid Build Coastguard Worker int img2_pitch, int width, int height, Ssimv *sv2, 67*fb1b10abSAndroid Build Coastguard Worker Metrics *m, int do_inconsistency); 68*fb1b10abSAndroid Build Coastguard Worker 69*fb1b10abSAndroid Build Coastguard Worker double vpx_calc_ssim(const YV12_BUFFER_CONFIG *source, 70*fb1b10abSAndroid Build Coastguard Worker const YV12_BUFFER_CONFIG *dest, double *weight); 71*fb1b10abSAndroid Build Coastguard Worker 72*fb1b10abSAndroid Build Coastguard Worker double vpx_calc_fastssim(const YV12_BUFFER_CONFIG *source, 73*fb1b10abSAndroid Build Coastguard Worker const YV12_BUFFER_CONFIG *dest, double *ssim_y, 74*fb1b10abSAndroid Build Coastguard Worker double *ssim_u, double *ssim_v, uint32_t bd, 75*fb1b10abSAndroid Build Coastguard Worker uint32_t in_bd); 76*fb1b10abSAndroid Build Coastguard Worker 77*fb1b10abSAndroid Build Coastguard Worker #if CONFIG_VP9_HIGHBITDEPTH 78*fb1b10abSAndroid Build Coastguard Worker double vpx_highbd_calc_ssim(const YV12_BUFFER_CONFIG *source, 79*fb1b10abSAndroid Build Coastguard Worker const YV12_BUFFER_CONFIG *dest, double *weight, 80*fb1b10abSAndroid Build Coastguard Worker uint32_t bd, uint32_t in_bd); 81*fb1b10abSAndroid Build Coastguard Worker #endif // CONFIG_VP9_HIGHBITDEPTH 82*fb1b10abSAndroid Build Coastguard Worker 83*fb1b10abSAndroid Build Coastguard Worker #ifdef __cplusplus 84*fb1b10abSAndroid Build Coastguard Worker } // extern "C" 85*fb1b10abSAndroid Build Coastguard Worker #endif 86*fb1b10abSAndroid Build Coastguard Worker 87*fb1b10abSAndroid Build Coastguard Worker #endif // VPX_VPX_DSP_SSIM_H_ 88