Revert "Merge "Change highbd variance rounding to prevent negative variance.""
This reverts commitea48370a50, reversing changes made to15939cb2d7. The commit was insufficiently tested and causes failures. Change-Id: I623d6fc2cd3ae6fd42d0abab1f8eada465ae57a7
This commit is contained in:
		@@ -54,11 +54,11 @@ static void RoundHighBitDepth(int bit_depth, int64_t *se, uint64_t *sse) {
 | 
			
		||||
  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:
 | 
			
		||||
 
 | 
			
		||||
@@ -275,7 +275,7 @@ void vpx_comp_avg_pred_c(uint8_t *comp_pred, const uint8_t *pred,
 | 
			
		||||
#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,26 +298,30 @@ static void highbd_8_variance(const uint8_t *a8, int  a_stride,
 | 
			
		||||
                              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,
 | 
			
		||||
                               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,
 | 
			
		||||
                               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) \
 | 
			
		||||
 
 | 
			
		||||
@@ -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
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -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 @@ static void highbd_10_variance_sse2(const uint16_t *src, int src_stride,
 | 
			
		||||
      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 @@ static void highbd_12_variance_sse2(const uint16_t *src, int src_stride,
 | 
			
		||||
      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 @@ void vpx_highbd_10_get##S##x##S##var_sse2(const uint8_t *src8, int src_stride, \
 | 
			
		||||
  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 @@ void vpx_highbd_12_get##S##x##S##var_sse2(const uint8_t *src8, int src_stride, \
 | 
			
		||||
  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 @@ uint32_t vpx_highbd_10_sub_pixel_variance##w##x##h##_##opt( \
 | 
			
		||||
      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 @@ uint32_t vpx_highbd_12_sub_pixel_variance##w##x##h##_##opt( \
 | 
			
		||||
      }\
 | 
			
		||||
    } \
 | 
			
		||||
  } \
 | 
			
		||||
  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 @@ uint32_t vpx_highbd_10_sub_pixel_avg_variance##w##x##h##_##opt( \
 | 
			
		||||
      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 @@ uint32_t vpx_highbd_12_sub_pixel_avg_variance##w##x##h##_##opt( \
 | 
			
		||||
      } \
 | 
			
		||||
    } \
 | 
			
		||||
  } \
 | 
			
		||||
  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)); \
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user