Home | History | Annotate | Download | only in encoder
      1 /*
      2  *  Copyright (c) 2010 The WebM project authors. All Rights Reserved.
      3  *
      4  *  Use of this source code is governed by a BSD-style license
      5  *  that can be found in the LICENSE file in the root of the source
      6  *  tree. An additional intellectual property rights grant can be found
      7  *  in the file PATENTS.  All contributing project authors may
      8  *  be found in the AUTHORS file in the root of the source tree.
      9  */
     10 
     11 #include "./vp9_rtcd.h"
     12 
     13 #include "vpx_ports/mem.h"
     14 #include "vpx/vpx_integer.h"
     15 
     16 #include "vp9/common/vp9_common.h"
     17 #include "vp9/common/vp9_filter.h"
     18 
     19 #include "vp9/encoder/vp9_variance.h"
     20 
     21 void variance(const uint8_t *a, int  a_stride,
     22               const uint8_t *b, int  b_stride,
     23               int  w, int  h, unsigned int *sse, int *sum) {
     24   int i, j;
     25 
     26   *sum = 0;
     27   *sse = 0;
     28 
     29   for (i = 0; i < h; i++) {
     30     for (j = 0; j < w; j++) {
     31       const int diff = a[j] - b[j];
     32       *sum += diff;
     33       *sse += diff * diff;
     34     }
     35 
     36     a += a_stride;
     37     b += b_stride;
     38   }
     39 }
     40 
     41 // Applies a 1-D 2-tap bi-linear filter to the source block in either horizontal
     42 // or vertical direction to produce the filtered output block. Used to implement
     43 // first-pass of 2-D separable filter.
     44 //
     45 // Produces int32_t output to retain precision for next pass. Two filter taps
     46 // should sum to VP9_FILTER_WEIGHT. pixel_step defines whether the filter is
     47 // applied horizontally (pixel_step=1) or vertically (pixel_step=stride). It
     48 // defines the offset required to move from one input to the next.
     49 static void var_filter_block2d_bil_first_pass(const uint8_t *src_ptr,
     50                                               uint16_t *output_ptr,
     51                                               unsigned int src_pixels_per_line,
     52                                               int pixel_step,
     53                                               unsigned int output_height,
     54                                               unsigned int output_width,
     55                                               const int16_t *vp9_filter) {
     56   unsigned int i, j;
     57 
     58   for (i = 0; i < output_height; i++) {
     59     for (j = 0; j < output_width; j++) {
     60       output_ptr[j] = ROUND_POWER_OF_TWO((int)src_ptr[0] * vp9_filter[0] +
     61                           (int)src_ptr[pixel_step] * vp9_filter[1],
     62                           FILTER_BITS);
     63 
     64       src_ptr++;
     65     }
     66 
     67     // Next row...
     68     src_ptr    += src_pixels_per_line - output_width;
     69     output_ptr += output_width;
     70   }
     71 }
     72 
     73 // Applies a 1-D 2-tap bi-linear filter to the source block in either horizontal
     74 // or vertical direction to produce the filtered output block. Used to implement
     75 // second-pass of 2-D separable filter.
     76 //
     77 // Requires 32-bit input as produced by filter_block2d_bil_first_pass. Two
     78 // filter taps should sum to VP9_FILTER_WEIGHT. pixel_step defines whether the
     79 // filter is applied horizontally (pixel_step=1) or vertically (pixel_step=
     80 // stride). It defines the offset required to move from one input to the next.
     81 static void var_filter_block2d_bil_second_pass(const uint16_t *src_ptr,
     82                                                uint8_t *output_ptr,
     83                                                unsigned int src_pixels_per_line,
     84                                                unsigned int pixel_step,
     85                                                unsigned int output_height,
     86                                                unsigned int output_width,
     87                                                const int16_t *vp9_filter) {
     88   unsigned int  i, j;
     89 
     90   for (i = 0; i < output_height; i++) {
     91     for (j = 0; j < output_width; j++) {
     92       output_ptr[j] = ROUND_POWER_OF_TWO((int)src_ptr[0] * vp9_filter[0] +
     93                           (int)src_ptr[pixel_step] * vp9_filter[1],
     94                           FILTER_BITS);
     95       src_ptr++;
     96     }
     97 
     98     src_ptr += src_pixels_per_line - output_width;
     99     output_ptr += output_width;
    100   }
    101 }
    102 
    103 unsigned int vp9_get_mb_ss_c(const int16_t *src_ptr) {
    104   unsigned int i, sum = 0;
    105 
    106   for (i = 0; i < 256; ++i) {
    107     sum += src_ptr[i] * src_ptr[i];
    108   }
    109 
    110   return sum;
    111 }
    112 
    113 #define VAR(W, H) \
    114 unsigned int vp9_variance##W##x##H##_c(const uint8_t *a, int a_stride, \
    115                                        const uint8_t *b, int b_stride, \
    116                                        unsigned int *sse) { \
    117   int sum; \
    118   variance(a, a_stride, b, b_stride, W, H, sse, &sum); \
    119   return *sse - (((int64_t)sum * sum) / (W * H)); \
    120 }
    121 
    122 #define SUBPIX_VAR(W, H) \
    123 unsigned int vp9_sub_pixel_variance##W##x##H##_c( \
    124   const uint8_t *src, int  src_stride, \
    125   int xoffset, int  yoffset, \
    126   const uint8_t *dst, int dst_stride, \
    127   unsigned int *sse) { \
    128   uint16_t fdata3[(H + 1) * W]; \
    129   uint8_t temp2[H * W]; \
    130 \
    131   var_filter_block2d_bil_first_pass(src, fdata3, src_stride, 1, H + 1, W, \
    132                                     BILINEAR_FILTERS_2TAP(xoffset)); \
    133   var_filter_block2d_bil_second_pass(fdata3, temp2, W, W, H, W, \
    134                                      BILINEAR_FILTERS_2TAP(yoffset)); \
    135 \
    136   return vp9_variance##W##x##H##_c(temp2, W, dst, dst_stride, sse); \
    137 }
    138 
    139 #define SUBPIX_AVG_VAR(W, H) \
    140 unsigned int vp9_sub_pixel_avg_variance##W##x##H##_c( \
    141   const uint8_t *src, int  src_stride, \
    142   int xoffset, int  yoffset, \
    143   const uint8_t *dst, int dst_stride, \
    144   unsigned int *sse, \
    145   const uint8_t *second_pred) { \
    146   uint16_t fdata3[(H + 1) * W]; \
    147   uint8_t temp2[H * W]; \
    148   DECLARE_ALIGNED_ARRAY(16, uint8_t, temp3, H * W); \
    149 \
    150   var_filter_block2d_bil_first_pass(src, fdata3, src_stride, 1, H + 1, W, \
    151                                     BILINEAR_FILTERS_2TAP(xoffset)); \
    152   var_filter_block2d_bil_second_pass(fdata3, temp2, W, W, H, W, \
    153                                      BILINEAR_FILTERS_2TAP(yoffset)); \
    154 \
    155   vp9_comp_avg_pred(temp3, second_pred, W, H, temp2, W); \
    156 \
    157   return vp9_variance##W##x##H##_c(temp3, W, dst, dst_stride, sse); \
    158 }
    159 
    160 void vp9_get16x16var_c(const uint8_t *src_ptr, int source_stride,
    161                        const uint8_t *ref_ptr, int ref_stride,
    162                        unsigned int *sse, int *sum) {
    163   variance(src_ptr, source_stride, ref_ptr, ref_stride, 16, 16, sse, sum);
    164 }
    165 
    166 void vp9_get8x8var_c(const uint8_t *src_ptr, int source_stride,
    167                      const uint8_t *ref_ptr, int ref_stride,
    168                      unsigned int *sse, int *sum) {
    169   variance(src_ptr, source_stride, ref_ptr, ref_stride, 8, 8, sse, sum);
    170 }
    171 
    172 unsigned int vp9_mse16x16_c(const uint8_t *src, int src_stride,
    173                             const uint8_t *ref, int ref_stride,
    174                             unsigned int *sse) {
    175   int sum;
    176   variance(src, src_stride, ref, ref_stride, 16, 16, sse, &sum);
    177   return *sse;
    178 }
    179 
    180 unsigned int vp9_mse16x8_c(const uint8_t *src, int src_stride,
    181                            const uint8_t *ref, int ref_stride,
    182                            unsigned int *sse) {
    183   int sum;
    184   variance(src, src_stride, ref, ref_stride, 16, 8, sse, &sum);
    185   return *sse;
    186 }
    187 
    188 unsigned int vp9_mse8x16_c(const uint8_t *src, int src_stride,
    189                            const uint8_t *ref, int ref_stride,
    190                            unsigned int *sse) {
    191   int sum;
    192   variance(src, src_stride, ref, ref_stride, 8, 16, sse, &sum);
    193   return *sse;
    194 }
    195 
    196 unsigned int vp9_mse8x8_c(const uint8_t *src, int src_stride,
    197                           const uint8_t *ref, int ref_stride,
    198                           unsigned int *sse) {
    199   int sum;
    200   variance(src, src_stride, ref, ref_stride, 8, 8, sse, &sum);
    201   return *sse;
    202 }
    203 
    204 VAR(4, 4)
    205 SUBPIX_VAR(4, 4)
    206 SUBPIX_AVG_VAR(4, 4)
    207 
    208 VAR(4, 8)
    209 SUBPIX_VAR(4, 8)
    210 SUBPIX_AVG_VAR(4, 8)
    211 
    212 VAR(8, 4)
    213 SUBPIX_VAR(8, 4)
    214 SUBPIX_AVG_VAR(8, 4)
    215 
    216 VAR(8, 8)
    217 SUBPIX_VAR(8, 8)
    218 SUBPIX_AVG_VAR(8, 8)
    219 
    220 VAR(8, 16)
    221 SUBPIX_VAR(8, 16)
    222 SUBPIX_AVG_VAR(8, 16)
    223 
    224 VAR(16, 8)
    225 SUBPIX_VAR(16, 8)
    226 SUBPIX_AVG_VAR(16, 8)
    227 
    228 VAR(16, 16)
    229 SUBPIX_VAR(16, 16)
    230 SUBPIX_AVG_VAR(16, 16)
    231 
    232 VAR(16, 32)
    233 SUBPIX_VAR(16, 32)
    234 SUBPIX_AVG_VAR(16, 32)
    235 
    236 VAR(32, 16)
    237 SUBPIX_VAR(32, 16)
    238 SUBPIX_AVG_VAR(32, 16)
    239 
    240 VAR(32, 32)
    241 SUBPIX_VAR(32, 32)
    242 SUBPIX_AVG_VAR(32, 32)
    243 
    244 VAR(32, 64)
    245 SUBPIX_VAR(32, 64)
    246 SUBPIX_AVG_VAR(32, 64)
    247 
    248 VAR(64, 32)
    249 SUBPIX_VAR(64, 32)
    250 SUBPIX_AVG_VAR(64, 32)
    251 
    252 VAR(64, 64)
    253 SUBPIX_VAR(64, 64)
    254 SUBPIX_AVG_VAR(64, 64)
    255 
    256 void vp9_comp_avg_pred(uint8_t *comp_pred, const uint8_t *pred, int width,
    257                        int height, const uint8_t *ref, int ref_stride) {
    258   int i, j;
    259 
    260   for (i = 0; i < height; i++) {
    261     for (j = 0; j < width; j++) {
    262       const int tmp = pred[j] + ref[j];
    263       comp_pred[j] = ROUND_POWER_OF_TWO(tmp, 1);
    264     }
    265     comp_pred += width;
    266     pred += width;
    267     ref += ref_stride;
    268   }
    269 }
    270 
    271 #if CONFIG_VP9_HIGHBITDEPTH
    272 void high_variance64(const uint8_t *a8, int  a_stride,
    273                      const uint8_t *b8, int  b_stride,
    274                      int w, int h, uint64_t *sse,
    275                      uint64_t *sum) {
    276   int i, j;
    277 
    278   uint16_t *a = CONVERT_TO_SHORTPTR(a8);
    279   uint16_t *b = CONVERT_TO_SHORTPTR(b8);
    280   *sum = 0;
    281   *sse = 0;
    282 
    283   for (i = 0; i < h; i++) {
    284     for (j = 0; j < w; j++) {
    285       const int diff = a[j] - b[j];
    286       *sum += diff;
    287       *sse += diff * diff;
    288     }
    289     a += a_stride;
    290     b += b_stride;
    291   }
    292 }
    293 
    294 void high_variance(const uint8_t *a8, int  a_stride,
    295                    const uint8_t *b8, int  b_stride,
    296                    int w, int h, unsigned int *sse,
    297                    int *sum) {
    298   uint64_t sse_long = 0;
    299   uint64_t sum_long = 0;
    300   high_variance64(a8, a_stride, b8, b_stride, w, h, &sse_long, &sum_long);
    301   *sse = sse_long;
    302   *sum = sum_long;
    303 }
    304 
    305 void high_10_variance(const uint8_t *a8, int  a_stride,
    306                       const uint8_t *b8, int  b_stride,
    307                       int w, int h, unsigned int *sse,
    308                       int *sum) {
    309   uint64_t sse_long = 0;
    310   uint64_t sum_long = 0;
    311   high_variance64(a8, a_stride, b8, b_stride, w, h, &sse_long, &sum_long);
    312   *sum = ROUND_POWER_OF_TWO(sum_long, 2);
    313   *sse = ROUND_POWER_OF_TWO(sse_long, 4);
    314 }
    315 
    316 void high_12_variance(const uint8_t *a8, int  a_stride,
    317                       const uint8_t *b8, int  b_stride,
    318                       int w, int h, unsigned int *sse,
    319                       int *sum) {
    320   uint64_t sse_long = 0;
    321   uint64_t sum_long = 0;
    322   high_variance64(a8, a_stride, b8, b_stride, w, h, &sse_long, &sum_long);
    323   *sum = ROUND_POWER_OF_TWO(sum_long, 4);
    324   *sse = ROUND_POWER_OF_TWO(sse_long, 8);
    325 }
    326 
    327 static void high_var_filter_block2d_bil_first_pass(
    328     const uint8_t *src_ptr8,
    329     uint16_t *output_ptr,
    330     unsigned int src_pixels_per_line,
    331     int pixel_step,
    332     unsigned int output_height,
    333     unsigned int output_width,
    334     const int16_t *vp9_filter) {
    335   unsigned int i, j;
    336   uint16_t *src_ptr = CONVERT_TO_SHORTPTR(src_ptr8);
    337   for (i = 0; i < output_height; i++) {
    338     for (j = 0; j < output_width; j++) {
    339       output_ptr[j] =
    340           ROUND_POWER_OF_TWO((int)src_ptr[0] * vp9_filter[0] +
    341                              (int)src_ptr[pixel_step] * vp9_filter[1],
    342                              FILTER_BITS);
    343 
    344       src_ptr++;
    345     }
    346 
    347     // Next row...
    348     src_ptr += src_pixels_per_line - output_width;
    349     output_ptr += output_width;
    350   }
    351 }
    352 
    353 static void high_var_filter_block2d_bil_second_pass(
    354     const uint16_t *src_ptr,
    355     uint16_t *output_ptr,
    356     unsigned int src_pixels_per_line,
    357     unsigned int pixel_step,
    358     unsigned int output_height,
    359     unsigned int output_width,
    360     const int16_t *vp9_filter) {
    361   unsigned int  i, j;
    362 
    363   for (i = 0; i < output_height; i++) {
    364     for (j = 0; j < output_width; j++) {
    365       output_ptr[j] =
    366           ROUND_POWER_OF_TWO((int)src_ptr[0] * vp9_filter[0] +
    367                              (int)src_ptr[pixel_step] * vp9_filter[1],
    368                              FILTER_BITS);
    369       src_ptr++;
    370     }
    371 
    372     src_ptr += src_pixels_per_line - output_width;
    373     output_ptr += output_width;
    374   }
    375 }
    376 
    377 #define HIGH_VAR(W, H) \
    378 unsigned int vp9_high_variance##W##x##H##_c(const uint8_t *a, int a_stride, \
    379                                             const uint8_t *b, int b_stride, \
    380                                             unsigned int *sse) { \
    381   int sum; \
    382   high_variance(a, a_stride, b, b_stride, W, H, sse, &sum); \
    383   return *sse - (((int64_t)sum * sum) / (W * H)); \
    384 } \
    385 \
    386 unsigned int vp9_high_10_variance##W##x##H##_c(const uint8_t *a, int a_stride, \
    387                                                const uint8_t *b, int b_stride, \
    388                                                 unsigned int *sse) { \
    389   int sum; \
    390   high_10_variance(a, a_stride, b, b_stride, W, H, sse, &sum); \
    391   return *sse - (((int64_t)sum * sum) / (W * H)); \
    392 } \
    393 \
    394 unsigned int vp9_high_12_variance##W##x##H##_c(const uint8_t *a, int a_stride, \
    395                                                const uint8_t *b, int b_stride, \
    396                                                unsigned int *sse) { \
    397   int sum; \
    398   high_12_variance(a, a_stride, b, b_stride, W, H, sse, &sum); \
    399   return *sse - (((int64_t)sum * sum) / (W * H)); \
    400 }
    401 
    402 #define HIGH_SUBPIX_VAR(W, H) \
    403 unsigned int vp9_high_sub_pixel_variance##W##x##H##_c( \
    404   const uint8_t *src, int  src_stride, \
    405   int xoffset, int  yoffset, \
    406   const uint8_t *dst, int dst_stride, \
    407   unsigned int *sse) { \
    408   uint16_t fdata3[(H + 1) * W]; \
    409   uint16_t temp2[H * W]; \
    410 \
    411   high_var_filter_block2d_bil_first_pass(src, fdata3, src_stride, 1, H + 1, \
    412                                          W, BILINEAR_FILTERS_2TAP(xoffset)); \
    413   high_var_filter_block2d_bil_second_pass(fdata3, temp2, W, W, H, W, \
    414                                           BILINEAR_FILTERS_2TAP(yoffset)); \
    415 \
    416   return vp9_high_variance##W##x##H##_c(CONVERT_TO_BYTEPTR(temp2), W, dst, \
    417                                         dst_stride, sse); \
    418 } \
    419 \
    420 unsigned int vp9_high_10_sub_pixel_variance##W##x##H##_c( \
    421   const uint8_t *src, int  src_stride, \
    422   int xoffset, int  yoffset, \
    423   const uint8_t *dst, int dst_stride, \
    424   unsigned int *sse) { \
    425   uint16_t fdata3[(H + 1) * W]; \
    426   uint16_t temp2[H * W]; \
    427 \
    428   high_var_filter_block2d_bil_first_pass(src, fdata3, src_stride, 1, H + 1, \
    429                                          W, BILINEAR_FILTERS_2TAP(xoffset)); \
    430   high_var_filter_block2d_bil_second_pass(fdata3, temp2, W, W, H, W, \
    431                                           BILINEAR_FILTERS_2TAP(yoffset)); \
    432 \
    433   return vp9_high_10_variance##W##x##H##_c(CONVERT_TO_BYTEPTR(temp2), W, dst, \
    434                                            dst_stride, sse); \
    435 } \
    436 \
    437 unsigned int vp9_high_12_sub_pixel_variance##W##x##H##_c( \
    438   const uint8_t *src, int  src_stride, \
    439   int xoffset, int  yoffset, \
    440   const uint8_t *dst, int dst_stride, \
    441   unsigned int *sse) { \
    442   uint16_t fdata3[(H + 1) * W]; \
    443   uint16_t temp2[H * W]; \
    444 \
    445   high_var_filter_block2d_bil_first_pass(src, fdata3, src_stride, 1, H + 1, \
    446                                          W, BILINEAR_FILTERS_2TAP(xoffset)); \
    447   high_var_filter_block2d_bil_second_pass(fdata3, temp2, W, W, H, W, \
    448                                           BILINEAR_FILTERS_2TAP(yoffset)); \
    449 \
    450   return vp9_high_12_variance##W##x##H##_c(CONVERT_TO_BYTEPTR(temp2), W, dst, \
    451                                            dst_stride, sse); \
    452 }
    453 
    454 #define HIGH_SUBPIX_AVG_VAR(W, H) \
    455 unsigned int vp9_high_sub_pixel_avg_variance##W##x##H##_c( \
    456   const uint8_t *src, int  src_stride, \
    457   int xoffset, int  yoffset, \
    458   const uint8_t *dst, int dst_stride, \
    459   unsigned int *sse, \
    460   const uint8_t *second_pred) { \
    461   uint16_t fdata3[(H + 1) * W]; \
    462   uint16_t temp2[H * W]; \
    463   DECLARE_ALIGNED_ARRAY(16, uint16_t, temp3, H * W); \
    464 \
    465   high_var_filter_block2d_bil_first_pass(src, fdata3, src_stride, 1, H + 1, \
    466                                          W, BILINEAR_FILTERS_2TAP(xoffset)); \
    467   high_var_filter_block2d_bil_second_pass(fdata3, temp2, W, W, H, W, \
    468                                           BILINEAR_FILTERS_2TAP(yoffset)); \
    469 \
    470   vp9_high_comp_avg_pred(temp3, second_pred, W, H, CONVERT_TO_BYTEPTR(temp2), \
    471                          W); \
    472 \
    473   return vp9_high_variance##W##x##H##_c(CONVERT_TO_BYTEPTR(temp3), W, dst, \
    474                                         dst_stride, sse); \
    475 } \
    476 \
    477 unsigned int vp9_high_10_sub_pixel_avg_variance##W##x##H##_c( \
    478   const uint8_t *src, int  src_stride, \
    479   int xoffset, int  yoffset, \
    480   const uint8_t *dst, int dst_stride, \
    481   unsigned int *sse, \
    482   const uint8_t *second_pred) { \
    483   uint16_t fdata3[(H + 1) * W]; \
    484   uint16_t temp2[H * W]; \
    485   DECLARE_ALIGNED_ARRAY(16, uint16_t, temp3, H * W); \
    486 \
    487   high_var_filter_block2d_bil_first_pass(src, fdata3, src_stride, 1, H + 1, \
    488                                          W, BILINEAR_FILTERS_2TAP(xoffset)); \
    489   high_var_filter_block2d_bil_second_pass(fdata3, temp2, W, W, H, W, \
    490                                           BILINEAR_FILTERS_2TAP(yoffset)); \
    491 \
    492   vp9_high_comp_avg_pred(temp3, second_pred, W, H, CONVERT_TO_BYTEPTR(temp2), \
    493                          W); \
    494 \
    495   return vp9_high_10_variance##W##x##H##_c(CONVERT_TO_BYTEPTR(temp3), W, dst, \
    496                                         dst_stride, sse); \
    497 } \
    498 \
    499 unsigned int vp9_high_12_sub_pixel_avg_variance##W##x##H##_c( \
    500   const uint8_t *src, int  src_stride, \
    501   int xoffset, int  yoffset, \
    502   const uint8_t *dst, int dst_stride, \
    503   unsigned int *sse, \
    504   const uint8_t *second_pred) { \
    505   uint16_t fdata3[(H + 1) * W]; \
    506   uint16_t temp2[H * W]; \
    507   DECLARE_ALIGNED_ARRAY(16, uint16_t, temp3, H * W); \
    508 \
    509   high_var_filter_block2d_bil_first_pass(src, fdata3, src_stride, 1, H + 1, \
    510                                          W, BILINEAR_FILTERS_2TAP(xoffset)); \
    511   high_var_filter_block2d_bil_second_pass(fdata3, temp2, W, W, H, W, \
    512                                           BILINEAR_FILTERS_2TAP(yoffset)); \
    513 \
    514   vp9_high_comp_avg_pred(temp3, second_pred, W, H, CONVERT_TO_BYTEPTR(temp2), \
    515                          W); \
    516 \
    517   return vp9_high_12_variance##W##x##H##_c(CONVERT_TO_BYTEPTR(temp3), W, dst, \
    518                                         dst_stride, sse); \
    519 }
    520 
    521 #define HIGH_GET_VAR(S) \
    522 void vp9_high_get##S##x##S##var_c(const uint8_t *src, int src_stride, \
    523                                   const uint8_t *ref, int ref_stride, \
    524                                   unsigned int *sse, int *sum) { \
    525   high_variance(src, src_stride, ref, ref_stride, S, S, sse, sum); \
    526 } \
    527 \
    528 void vp9_high_10_get##S##x##S##var_c(const uint8_t *src, int src_stride, \
    529                                      const uint8_t *ref, int ref_stride, \
    530                                      unsigned int *sse, int *sum) { \
    531   high_10_variance(src, src_stride, ref, ref_stride, S, S, sse, sum); \
    532 } \
    533 \
    534 void vp9_high_12_get##S##x##S##var_c(const uint8_t *src, int src_stride, \
    535                                      const uint8_t *ref, int ref_stride, \
    536                                      unsigned int *sse, int *sum) { \
    537   high_12_variance(src, src_stride, ref, ref_stride, S, S, sse, sum); \
    538 }
    539 
    540 #define HIGH_MSE(W, H) \
    541 unsigned int vp9_high_mse##W##x##H##_c(const uint8_t *src, int src_stride, \
    542                                        const uint8_t *ref, int ref_stride, \
    543                                        unsigned int *sse) { \
    544   int sum; \
    545   high_variance(src, src_stride, ref, ref_stride, W, H, sse, &sum); \
    546   return *sse; \
    547 } \
    548 \
    549 unsigned int vp9_high_10_mse##W##x##H##_c(const uint8_t *src, int src_stride, \
    550                                           const uint8_t *ref, int ref_stride, \
    551                                           unsigned int *sse) { \
    552   int sum; \
    553   high_10_variance(src, src_stride, ref, ref_stride, W, H, sse, &sum); \
    554   return *sse; \
    555 } \
    556 \
    557 unsigned int vp9_high_12_mse##W##x##H##_c(const uint8_t *src, int src_stride, \
    558                                           const uint8_t *ref, int ref_stride, \
    559                                           unsigned int *sse) { \
    560   int sum; \
    561   high_12_variance(src, src_stride, ref, ref_stride, W, H, sse, &sum); \
    562   return *sse; \
    563 }
    564 
    565 HIGH_GET_VAR(8)
    566 HIGH_GET_VAR(16)
    567 
    568 HIGH_MSE(16, 16)
    569 HIGH_MSE(16, 8)
    570 HIGH_MSE(8, 16)
    571 HIGH_MSE(8, 8)
    572 
    573 HIGH_VAR(4, 4)
    574 HIGH_SUBPIX_VAR(4, 4)
    575 HIGH_SUBPIX_AVG_VAR(4, 4)
    576 
    577 HIGH_VAR(4, 8)
    578 HIGH_SUBPIX_VAR(4, 8)
    579 HIGH_SUBPIX_AVG_VAR(4, 8)
    580 
    581 HIGH_VAR(8, 4)
    582 HIGH_SUBPIX_VAR(8, 4)
    583 HIGH_SUBPIX_AVG_VAR(8, 4)
    584 
    585 HIGH_VAR(8, 8)
    586 HIGH_SUBPIX_VAR(8, 8)
    587 HIGH_SUBPIX_AVG_VAR(8, 8)
    588 
    589 HIGH_VAR(8, 16)
    590 HIGH_SUBPIX_VAR(8, 16)
    591 HIGH_SUBPIX_AVG_VAR(8, 16)
    592 
    593 HIGH_VAR(16, 8)
    594 HIGH_SUBPIX_VAR(16, 8)
    595 HIGH_SUBPIX_AVG_VAR(16, 8)
    596 
    597 HIGH_VAR(16, 16)
    598 HIGH_SUBPIX_VAR(16, 16)
    599 HIGH_SUBPIX_AVG_VAR(16, 16)
    600 
    601 HIGH_VAR(16, 32)
    602 HIGH_SUBPIX_VAR(16, 32)
    603 HIGH_SUBPIX_AVG_VAR(16, 32)
    604 
    605 HIGH_VAR(32, 16)
    606 HIGH_SUBPIX_VAR(32, 16)
    607 HIGH_SUBPIX_AVG_VAR(32, 16)
    608 
    609 HIGH_VAR(32, 32)
    610 HIGH_SUBPIX_VAR(32, 32)
    611 HIGH_SUBPIX_AVG_VAR(32, 32)
    612 
    613 HIGH_VAR(32, 64)
    614 HIGH_SUBPIX_VAR(32, 64)
    615 HIGH_SUBPIX_AVG_VAR(32, 64)
    616 
    617 HIGH_VAR(64, 32)
    618 HIGH_SUBPIX_VAR(64, 32)
    619 HIGH_SUBPIX_AVG_VAR(64, 32)
    620 
    621 HIGH_VAR(64, 64)
    622 HIGH_SUBPIX_VAR(64, 64)
    623 HIGH_SUBPIX_AVG_VAR(64, 64)
    624 
    625 void vp9_high_comp_avg_pred(uint16_t *comp_pred, const uint8_t *pred8,
    626                             int width, int height, const uint8_t *ref8,
    627                             int ref_stride) {
    628   int i, j;
    629   uint16_t *pred = CONVERT_TO_SHORTPTR(pred8);
    630   uint16_t *ref = CONVERT_TO_SHORTPTR(ref8);
    631   for (i = 0; i < height; i++) {
    632     for (j = 0; j < width; j++) {
    633       const int tmp = pred[j] + ref[j];
    634       comp_pred[j] = ROUND_POWER_OF_TWO(tmp, 1);
    635     }
    636     comp_pred += width;
    637     pred += width;
    638     ref += ref_stride;
    639   }
    640 }
    641 #endif  // CONFIG_VP9_HIGHBITDEPTH
    642