| Index: source/libvpx/vp9/encoder/vp9_avg.c
|
| diff --git a/source/libvpx/vp9/encoder/vp9_avg.c b/source/libvpx/vp9/encoder/vp9_avg.c
|
| index 8d6cf0667c15b1ae80156c01b48d048bdbc64589..90d113c325143b3d2ddef08649d43cc85ce6e108 100644
|
| --- a/source/libvpx/vp9/encoder/vp9_avg.c
|
| +++ b/source/libvpx/vp9/encoder/vp9_avg.c
|
| @@ -32,11 +32,13 @@ unsigned int vp9_avg_4x4_c(const uint8_t *s, int p) {
|
| void vp9_int_pro_row_c(int16_t *hbuf, uint8_t const *ref,
|
| const int ref_stride, const int height) {
|
| int idx;
|
| + const int norm_factor = MAX(8, height >> 1);
|
| for (idx = 0; idx < 16; ++idx) {
|
| int i;
|
| hbuf[idx] = 0;
|
| for (i = 0; i < height; ++i)
|
| hbuf[idx] += ref[i * ref_stride];
|
| + hbuf[idx] /= norm_factor;
|
| ++ref;
|
| }
|
| }
|
| @@ -44,18 +46,26 @@ void vp9_int_pro_row_c(int16_t *hbuf, uint8_t const *ref,
|
| int16_t vp9_int_pro_col_c(uint8_t const *ref, const int width) {
|
| int idx;
|
| int16_t sum = 0;
|
| + const int norm_factor = MAX(8, width >> 1);
|
| for (idx = 0; idx < width; ++idx)
|
| sum += ref[idx];
|
| - return sum;
|
| + return sum / norm_factor;
|
| }
|
|
|
| -int vp9_vector_sad_c(int16_t const *ref, int16_t const *src,
|
| - const int width) {
|
| +int vp9_vector_var_c(int16_t const *ref, int16_t const *src,
|
| + const int bwl) {
|
| int i;
|
| - int this_sad = 0;
|
| - for (i = 0; i < width; ++i)
|
| - this_sad += abs(ref[i] - src[i]);
|
| - return this_sad;
|
| + int width = 4 << bwl;
|
| + int sse = 0, mean = 0, var;
|
| +
|
| + for (i = 0; i < width; ++i) {
|
| + int diff = ref[i] - src[i];
|
| + mean += diff;
|
| + sse += diff * diff;
|
| + }
|
| +
|
| + var = sse - ((mean * mean) >> (bwl + 2));
|
| + return var;
|
| }
|
|
|
| #if CONFIG_VP9_HIGHBITDEPTH
|
|
|