shithub: libvpx

Download patch

ref: ed3df445d99b511d3e39615a2f0a9d23c18efa3a
parent: ea48370a500537906d62544ca4ed75301d79e772
author: Alex Converse <[email protected]>
date: Wed Jan 13 06:18:19 EST 2016

Revert "Merge "Change highbd variance rounding to prevent negative variance.""

This reverts commit ea48370a500537906d62544ca4ed75301d79e772, reversing
changes made to 15939cb2d76c773950cda40988ede89e111872ea.

The commit was insufficiently tested and causes failures.

Change-Id: I623d6fc2cd3ae6fd42d0abab1f8eada465ae57a7

--- a/test/variance_test.cc
+++ b/test/variance_test.cc
@@ -54,11 +54,11 @@
   switch (bit_depth) {
     case VPX_BITS_12:
       *sse = (*sse + 128) >> 8;
-      *se = *se / (1 << 4);
+      *se = (*se + 8) >> 4;
       break;
     case VPX_BITS_10:
       *sse = (*sse + 8) >> 4;
-      *se = *se / (1 << 2);
+      *se = (*se + 2) >> 2;
       break;
     case VPX_BITS_8:
     default:
--- a/vpx_dsp/variance.c
+++ b/vpx_dsp/variance.c
@@ -275,7 +275,7 @@
 #if CONFIG_VP9_HIGHBITDEPTH
 static void highbd_variance64(const uint8_t *a8, int  a_stride,
                               const uint8_t *b8, int  b_stride,
-                              int w, int h, uint64_t *sse, int *sum) {
+                              int w, int h, uint64_t *sse, uint64_t *sum) {
   int i, j;
 
   uint16_t *a = CONVERT_TO_SHORTPTR(a8);
@@ -298,8 +298,10 @@
                               const uint8_t *b8, int  b_stride,
                               int w, int h, uint32_t *sse, int *sum) {
   uint64_t sse_long = 0;
-  highbd_variance64(a8, a_stride, b8, b_stride, w, h, &sse_long, sum);
+  uint64_t sum_long = 0;
+  highbd_variance64(a8, a_stride, b8, b_stride, w, h, &sse_long, &sum_long);
   *sse = (uint32_t)sse_long;
+  *sum = (int)sum_long;
 }
 
 static void highbd_10_variance(const uint8_t *a8, int  a_stride,
@@ -306,9 +308,10 @@
                                const uint8_t *b8, int  b_stride,
                                int w, int h, uint32_t *sse, int *sum) {
   uint64_t sse_long = 0;
-  highbd_variance64(a8, a_stride, b8, b_stride, w, h, &sse_long, sum);
-  *sse = (uint32_t)ROUND_ZERO_POWER_OF_TWO(sse_long, 4);
-  *sum = ROUND_ZERO_POWER_OF_TWO(*sum, 2);
+  uint64_t sum_long = 0;
+  highbd_variance64(a8, a_stride, b8, b_stride, w, h, &sse_long, &sum_long);
+  *sse = (uint32_t)ROUND_POWER_OF_TWO(sse_long, 4);
+  *sum = (int)ROUND_POWER_OF_TWO(sum_long, 2);
 }
 
 static void highbd_12_variance(const uint8_t *a8, int  a_stride,
@@ -315,9 +318,10 @@
                                const uint8_t *b8, int  b_stride,
                                int w, int h, uint32_t *sse, int *sum) {
   uint64_t sse_long = 0;
-  highbd_variance64(a8, a_stride, b8, b_stride, w, h, &sse_long, sum);
-  *sse = (uint32_t)ROUND_ZERO_POWER_OF_TWO(sse_long, 8);
-  *sum = ROUND_ZERO_POWER_OF_TWO(*sum, 4);
+  uint64_t sum_long = 0;
+  highbd_variance64(a8, a_stride, b8, b_stride, w, h, &sse_long, &sum_long);
+  *sse = (uint32_t)ROUND_POWER_OF_TWO(sse_long, 8);
+  *sum = (int)ROUND_POWER_OF_TWO(sum_long, 4);
 }
 
 #define HIGHBD_VAR(W, H) \
--- a/vpx_dsp/variance.h
+++ b/vpx_dsp/variance.h
@@ -19,8 +19,6 @@
 extern "C" {
 #endif
 
-#define ROUND_ZERO_POWER_OF_TWO(value, n) ((value) / (1 << (n)))
-
 #define FILTER_BITS 7
 #define FILTER_WEIGHT 128
 
--- a/vpx_dsp/x86/highbd_variance_sse2.c
+++ b/vpx_dsp/x86/highbd_variance_sse2.c
@@ -9,7 +9,6 @@
  */
 #include "./vpx_config.h"
 
-#include "vpx_dsp/variance.h"
 #include "vpx_ports/mem.h"
 
 typedef uint32_t (*high_variance_fn_t) (const uint16_t *src, int src_stride,
@@ -63,8 +62,8 @@
       sum_long += sum0;
     }
   }
-  *sum = ROUND_ZERO_POWER_OF_TWO(sum_long, 2);
-  *sse = (uint32_t)ROUND_ZERO_POWER_OF_TWO(sse_long, 4);
+  *sum = ROUND_POWER_OF_TWO(sum_long, 2);
+  *sse = (uint32_t)ROUND_POWER_OF_TWO(sse_long, 4);
 }
 
 static void highbd_12_variance_sse2(const uint16_t *src, int src_stride,
@@ -85,8 +84,8 @@
       sum_long += sum0;
     }
   }
-  *sum = ROUND_ZERO_POWER_OF_TWO(sum_long, 4);
-  *sse = (uint32_t)ROUND_ZERO_POWER_OF_TWO(sse_long, 8);
+  *sum = ROUND_POWER_OF_TWO(sum_long, 4);
+  *sse = (uint32_t)ROUND_POWER_OF_TWO(sse_long, 8);
 }
 
 
@@ -107,7 +106,7 @@
   uint16_t *ref = CONVERT_TO_SHORTPTR(ref8); \
   vpx_highbd_calc##S##x##S##var_sse2(src, src_stride, ref, ref_stride, \
                                      sse, sum); \
-  *sum = ROUND_ZERO_POWER_OF_TWO(*sum, 2); \
+  *sum = ROUND_POWER_OF_TWO(*sum, 2); \
   *sse = ROUND_POWER_OF_TWO(*sse, 4); \
 } \
 \
@@ -118,7 +117,7 @@
   uint16_t *ref = CONVERT_TO_SHORTPTR(ref8); \
   vpx_highbd_calc##S##x##S##var_sse2(src, src_stride, ref, ref_stride, \
                                      sse, sum); \
-  *sum = ROUND_ZERO_POWER_OF_TWO(*sum, 4); \
+  *sum = ROUND_POWER_OF_TWO(*sum, 4); \
   *sse = ROUND_POWER_OF_TWO(*sse, 8); \
 }
 
@@ -346,7 +345,7 @@
       sse += sse2; \
     } \
   } \
-  se = ROUND_ZERO_POWER_OF_TWO(se, 2); \
+  se = ROUND_POWER_OF_TWO(se, 2); \
   sse = ROUND_POWER_OF_TWO(sse, 4); \
   *sse_ptr = sse; \
   return sse - ((cast se * se) >> (wlog2 + hlog2)); \
@@ -393,7 +392,7 @@
       }\
     } \
   } \
-  se = ROUND_ZERO_POWER_OF_TWO(se, 4); \
+  se = ROUND_POWER_OF_TWO(se, 4); \
   sse = (uint32_t)ROUND_POWER_OF_TWO(long_sse, 8); \
   *sse_ptr = sse; \
   return sse - ((cast se * se) >> (wlog2 + hlog2)); \
@@ -515,7 +514,7 @@
       sse += sse2; \
     } \
   } \
-  se = ROUND_ZERO_POWER_OF_TWO(se, 2); \
+  se = ROUND_POWER_OF_TWO(se, 2); \
   sse = ROUND_POWER_OF_TWO(sse, 4); \
   *sse_ptr = sse; \
   return sse - ((cast se * se) >> (wlog2 + hlog2)); \
@@ -567,7 +566,7 @@
       } \
     } \
   } \
-  se = ROUND_ZERO_POWER_OF_TWO(se, 4); \
+  se = ROUND_POWER_OF_TWO(se, 4); \
   sse = (uint32_t)ROUND_POWER_OF_TWO(long_sse, 8); \
   *sse_ptr = sse; \
   return sse - ((cast se * se) >> (wlog2 + hlog2)); \