]> granicus.if.org Git - libvpx/commitdiff
Calculate SSIM over both reconstruction as well as postproc buffer.
authorRonald S. Bultje <rbultje@google.com>
Mon, 1 Apr 2013 16:10:27 +0000 (09:10 -0700)
committerRonald S. Bultje <rbultje@google.com>
Mon, 1 Apr 2013 16:10:27 +0000 (09:10 -0700)
We used to calculate SSIM only over the postproc buffer, whereas we
calculate PSNR for both. Compared to postproc-SSIM, this is about 0.3%
higher for derf, 1.4% lower for hd and 0.5% lower for stdhd, although
it is highly variable on a per-clip basis.

Change-Id: I8dd491f0f5b4201dedfb15d288c854d5d4caa10f

vp9/encoder/vp9_onyx_if.c
vp9/encoder/vp9_onyx_int.h

index 490a63954ef02641b8894fa5776da537a3bcf473..00cfbef173395cb4160157eba10e695327b60ea5 100644 (file)
@@ -1536,6 +1536,8 @@ VP9_PTR vp9_create_compressor(VP9_CONFIG *oxcf) {
     cpi->tot_recode_hits = 0;
     cpi->summed_quality = 0;
     cpi->summed_weights = 0;
+    cpi->summedp_quality = 0;
+    cpi->summedp_weights = 0;
   }
 
   if (cpi->b_calculate_ssimg) {
@@ -1731,18 +1733,25 @@ void vp9_remove_compressor(VP9_PTR *ptr) {
       if (cpi->b_calculate_psnr) {
         YV12_BUFFER_CONFIG *lst_yv12 =
             &cpi->common.yv12_fb[cpi->common.ref_frame_map[cpi->lst_fb_idx]];
-        double samples = 3.0 / 2 * cpi->count * lst_yv12->y_width * lst_yv12->y_height;
+        double samples = 3.0 / 2 * cpi->count *
+                         lst_yv12->y_width * lst_yv12->y_height;
         double total_psnr = vp9_mse2psnr(samples, 255.0, cpi->total_sq_error);
         double total_psnr2 = vp9_mse2psnr(samples, 255.0, cpi->total_sq_error2);
-        double total_ssim = 100 * pow(cpi->summed_quality / cpi->summed_weights, 8.0);
-
-        fprintf(f, "Bitrate\tAVGPsnr\tGLBPsnr\tAVPsnrP\tGLPsnrP\tVPXSSIM\t  Time(ms)\n");
-        fprintf(f, "%7.2f\t%7.3f\t%7.3f\t%7.3f\t%7.3f\t%7.3f\t%8.0f\n",
-                dr, cpi->total / cpi->count, total_psnr, cpi->totalp / cpi->count, total_psnr2, total_ssim,
+        double total_ssim = 100 * pow(cpi->summed_quality /
+                                      cpi->summed_weights, 8.0);
+        double total_ssimp = 100 * pow(cpi->summedp_quality /
+                                       cpi->summedp_weights, 8.0);
+
+        fprintf(f, "Bitrate\tAVGPsnr\tGLBPsnr\tAVPsnrP\tGLPsnrP\t"
+                "VPXSSIM\tVPSSIMP\t  Time(ms)\n");
+        fprintf(f, "%7.2f\t%7.3f\t%7.3f\t%7.3f\t%7.3f\t%7.3f\t%7.3f\t%8.0f\n",
+                dr, cpi->total / cpi->count, total_psnr,
+                cpi->totalp / cpi->count, total_psnr2, total_ssim, total_ssimp,
                 total_encode_time);
-//                fprintf(f, "%7.3f\t%7.3f\t%7.3f\t%7.3f\t%7.3f\t%7.3f\t%8.0f %10ld\n",
-//                        dr, cpi->total / cpi->count, total_psnr, cpi->totalp / cpi->count, total_psnr2, total_ssim,
-//                        total_encode_time, cpi->tot_recode_hits);
+//         fprintf(f, "%7.3f\t%7.3f\t%7.3f\t%7.3f\t%7.3f\t%7.3f\t%8.0f %10ld\n",
+//                 dr, cpi->total / cpi->count, total_psnr,
+//                 cpi->totalp / cpi->count, total_psnr2, total_ssim,
+//                 total_encode_time, cpi->tot_recode_hits);
       }
 
       if (cpi->b_calculate_ssimg) {
@@ -3988,10 +3997,16 @@ int vp9_get_compressed_data(VP9_PTR ptr, unsigned int *frame_flags,
           cpi->totalp  += frame_psnr2;
 
           frame_ssim2 = vp9_calc_ssim(cpi->Source,
-                                      &cm->post_proc_buffer, 1, &weight);
+                                      recon, 1, &weight);
 
           cpi->summed_quality += frame_ssim2 * weight;
           cpi->summed_weights += weight;
+
+          frame_ssim2 = vp9_calc_ssim(cpi->Source,
+                                      &cm->post_proc_buffer, 1, &weight);
+
+          cpi->summedp_quality += frame_ssim2 * weight;
+          cpi->summedp_weights += weight;
 #if 0
           {
             FILE *f = fopen("q_used.stt", "a");
index 891cc3f5223fb748e340c7b91f0a7494c72618fd..9f9cb0e1cbee8bd51108c9de0023214507695f99 100644 (file)
@@ -640,6 +640,8 @@ typedef struct VP9_COMP {
   int    bytes;
   double summed_quality;
   double summed_weights;
+  double summedp_quality;
+  double summedp_weights;
   unsigned int tot_recode_hits;