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 <stdlib.h>
     12 
     13 #include "./vp9_rtcd.h"
     14 #include "./vpx_config.h"
     15 
     16 #include "vpx/vpx_integer.h"
     17 #include "vp9/encoder/vp9_variance.h"
     18 
     19 static INLINE unsigned int sad(const uint8_t *a, int a_stride,
     20                                const uint8_t *b, int b_stride,
     21                                int width, int height) {
     22   int y, x;
     23   unsigned int sad = 0;
     24 
     25   for (y = 0; y < height; y++) {
     26     for (x = 0; x < width; x++)
     27       sad += abs(a[x] - b[x]);
     28 
     29     a += a_stride;
     30     b += b_stride;
     31   }
     32 
     33   return sad;
     34 }
     35 
     36 #define sad_mxn_func(m, n) \
     37 unsigned int vp9_sad##m##x##n##_c(const uint8_t *src_ptr, int src_stride, \
     38                                   const uint8_t *ref_ptr, int ref_stride, \
     39                                   unsigned int max_sad) { \
     40   return sad(src_ptr, src_stride, ref_ptr, ref_stride, m, n); \
     41 } \
     42 unsigned int vp9_sad##m##x##n##_avg_c(const uint8_t *src_ptr, int src_stride, \
     43                                       const uint8_t *ref_ptr, int ref_stride, \
     44                                       const uint8_t *second_pred, \
     45                                       unsigned int max_sad) { \
     46   uint8_t comp_pred[m * n]; \
     47   vp9_comp_avg_pred(comp_pred, second_pred, m, n, ref_ptr, ref_stride); \
     48   return sad(src_ptr, src_stride, comp_pred, m, m, n); \
     49 }
     50 
     51 sad_mxn_func(64, 64)
     52 sad_mxn_func(64, 32)
     53 sad_mxn_func(32, 64)
     54 sad_mxn_func(32, 32)
     55 sad_mxn_func(32, 16)
     56 sad_mxn_func(16, 32)
     57 sad_mxn_func(16, 16)
     58 sad_mxn_func(16, 8)
     59 sad_mxn_func(8, 16)
     60 sad_mxn_func(8, 8)
     61 sad_mxn_func(8, 4)
     62 sad_mxn_func(4, 8)
     63 sad_mxn_func(4, 4)
     64 
     65 void vp9_sad64x32x4d_c(const uint8_t *src_ptr, int src_stride,
     66                        const uint8_t* const ref_ptr[], int ref_stride,
     67                        unsigned int *sad_array) {
     68   int i;
     69   for (i = 0; i < 4; ++i)
     70     sad_array[i] = vp9_sad64x32(src_ptr, src_stride, ref_ptr[i], ref_stride,
     71                                 0x7fffffff);
     72 }
     73 
     74 void vp9_sad32x64x4d_c(const uint8_t *src_ptr, int src_stride,
     75                        const uint8_t* const ref_ptr[], int ref_stride,
     76                        unsigned int *sad_array) {
     77   int i;
     78   for (i = 0; i < 4; ++i)
     79     sad_array[i] = vp9_sad32x64(src_ptr, src_stride, ref_ptr[i], ref_stride,
     80                                 0x7fffffff);
     81 }
     82 
     83 void vp9_sad32x16x4d_c(const uint8_t *src_ptr, int src_stride,
     84                        const uint8_t* const ref_ptr[], int ref_stride,
     85                        unsigned int *sad_array) {
     86   int i;
     87   for (i = 0; i < 4; ++i)
     88     sad_array[i] = vp9_sad32x16(src_ptr, src_stride, ref_ptr[i], ref_stride,
     89                                 0x7fffffff);
     90 }
     91 
     92 void vp9_sad16x32x4d_c(const uint8_t *src_ptr, int src_stride,
     93                        const uint8_t* const ref_ptr[], int ref_stride,
     94                        unsigned int *sad_array) {
     95   int i;
     96   for (i = 0; i < 4; ++i)
     97     sad_array[i] = vp9_sad16x32(src_ptr, src_stride, ref_ptr[i], ref_stride,
     98                                 0x7fffffff);
     99 }
    100 
    101 void vp9_sad64x64x3_c(const uint8_t *src_ptr, int src_stride,
    102                       const uint8_t *ref_ptr, int ref_stride,
    103                       unsigned int *sad_array) {
    104   int i;
    105   for (i = 0; i < 3; ++i)
    106     sad_array[i] = vp9_sad64x64(src_ptr, src_stride, ref_ptr + i, ref_stride,
    107                                 0x7fffffff);
    108 }
    109 
    110 void vp9_sad32x32x3_c(const uint8_t *src_ptr, int src_stride,
    111                       const uint8_t *ref_ptr, int ref_stride,
    112                       unsigned int *sad_array) {
    113   int i;
    114   for (i = 0; i < 3; ++i)
    115     sad_array[i] = vp9_sad32x32(src_ptr, src_stride, ref_ptr + i, ref_stride,
    116                                 0x7fffffff);
    117 }
    118 
    119 void vp9_sad64x64x8_c(const uint8_t *src_ptr, int src_stride,
    120                       const uint8_t *ref_ptr, int ref_stride,
    121                       unsigned int *sad_array) {
    122   int i;
    123   for (i = 0; i < 8; ++i)
    124     sad_array[i] = vp9_sad64x64(src_ptr, src_stride, ref_ptr + i, ref_stride,
    125                                 0x7fffffff);
    126 }
    127 
    128 void vp9_sad32x32x8_c(const uint8_t *src_ptr, int src_stride,
    129                       const uint8_t *ref_ptr, int ref_stride,
    130                       unsigned int *sad_array) {
    131   int i;
    132   for (i = 0; i < 8; ++i)
    133     sad_array[i] = vp9_sad32x32(src_ptr, src_stride, ref_ptr + i, ref_stride,
    134                                 0x7fffffff);
    135 }
    136 
    137 void vp9_sad16x16x3_c(const uint8_t *src_ptr, int src_stride,
    138                       const uint8_t *ref_ptr, int ref_stride,
    139                       unsigned int *sad_array) {
    140   int i;
    141   for (i = 0; i < 3; ++i)
    142     sad_array[i] = vp9_sad16x16(src_ptr, src_stride, ref_ptr + i, ref_stride,
    143                                 0x7fffffff);
    144 }
    145 
    146 void vp9_sad16x16x8_c(const uint8_t *src_ptr, int src_stride,
    147                       const uint8_t *ref_ptr, int ref_stride,
    148                       uint32_t *sad_array) {
    149   int i;
    150   for (i = 0; i < 8; ++i)
    151     sad_array[i] = vp9_sad16x16(src_ptr, src_stride, ref_ptr + i, ref_stride,
    152                                 0x7fffffff);
    153 }
    154 
    155 void vp9_sad16x8x3_c(const uint8_t *src_ptr, int src_stride,
    156                      const uint8_t *ref_ptr, int ref_stride,
    157                      unsigned int *sad_array) {
    158   int i;
    159   for (i = 0; i < 3; ++i)
    160     sad_array[i] = vp9_sad16x8(src_ptr, src_stride, ref_ptr + i, ref_stride,
    161                                0x7fffffff);
    162 }
    163 
    164 void vp9_sad16x8x8_c(const uint8_t *src_ptr, int src_stride,
    165                      const uint8_t *ref_ptr, int ref_stride,
    166                      uint32_t *sad_array) {
    167   int i;
    168   for (i = 0; i < 8; ++i)
    169     sad_array[i] = vp9_sad16x8(src_ptr, src_stride, ref_ptr + i, ref_stride,
    170                                0x7fffffff);
    171 }
    172 
    173 void vp9_sad8x8x3_c(const uint8_t *src_ptr, int src_stride,
    174                     const uint8_t *ref_ptr, int ref_stride,
    175                     unsigned int *sad_array) {
    176   int i;
    177   for (i = 0; i < 3; ++i)
    178     sad_array[i] = vp9_sad8x8(src_ptr, src_stride, ref_ptr + i, ref_stride,
    179                               0x7fffffff);
    180 }
    181 
    182 void vp9_sad8x8x8_c(const uint8_t *src_ptr, int src_stride,
    183                     const uint8_t *ref_ptr, int ref_stride,
    184                     uint32_t *sad_array) {
    185   int i;
    186   for (i = 0; i < 8; ++i)
    187     sad_array[i] = vp9_sad8x8(src_ptr, src_stride, ref_ptr + i, ref_stride,
    188                               0x7fffffff);
    189 }
    190 
    191 void vp9_sad8x16x3_c(const uint8_t *src_ptr, int src_stride,
    192                      const uint8_t *ref_ptr, int ref_stride,
    193                      unsigned int *sad_array) {
    194   int i;
    195   for (i = 0; i < 3; ++i)
    196     sad_array[i] = vp9_sad8x16(src_ptr, src_stride, ref_ptr + i, ref_stride,
    197                                0x7fffffff);
    198 }
    199 
    200 void vp9_sad8x16x8_c(const uint8_t *src_ptr, int src_stride,
    201                      const uint8_t *ref_ptr, int ref_stride,
    202                      uint32_t *sad_array) {
    203   int i;
    204   for (i = 0; i < 8; ++i)
    205     sad_array[i] = vp9_sad8x16(src_ptr, src_stride, ref_ptr + i, ref_stride,
    206                                0x7fffffff);
    207 }
    208 
    209 void vp9_sad4x4x3_c(const uint8_t *src_ptr, int src_stride,
    210                     const uint8_t *ref_ptr, int ref_stride,
    211                     unsigned int *sad_array) {
    212   int i;
    213   for (i = 0; i < 3; ++i)
    214     sad_array[i] = vp9_sad4x4(src_ptr, src_stride, ref_ptr + i, ref_stride,
    215                               0x7fffffff);
    216 }
    217 
    218 void vp9_sad4x4x8_c(const uint8_t *src_ptr, int src_stride,
    219                     const uint8_t *ref_ptr, int ref_stride,
    220                     uint32_t *sad_array) {
    221   int i;
    222   for (i = 0; i < 8; ++i)
    223     sad_array[i] = vp9_sad4x4(src_ptr, src_stride, ref_ptr + i, ref_stride,
    224                               0x7fffffff);
    225 }
    226 
    227 void vp9_sad64x64x4d_c(const uint8_t *src_ptr, int src_stride,
    228                        const uint8_t* const ref_ptr[], int ref_stride,
    229                        unsigned int *sad_array) {
    230   int i;
    231   for (i = 0; i < 4; ++i)
    232     sad_array[i] = vp9_sad64x64(src_ptr, src_stride, ref_ptr[i], ref_stride,
    233                                 0x7fffffff);
    234 }
    235 
    236 void vp9_sad32x32x4d_c(const uint8_t *src_ptr, int src_stride,
    237                        const uint8_t* const ref_ptr[], int ref_stride,
    238                        unsigned int *sad_array) {
    239   int i;
    240   for (i = 0; i < 4; ++i)
    241     sad_array[i] = vp9_sad32x32(src_ptr, src_stride, ref_ptr[i], ref_stride,
    242                                 0x7fffffff);
    243 }
    244 
    245 void vp9_sad16x16x4d_c(const uint8_t *src_ptr, int src_stride,
    246                        const uint8_t* const ref_ptr[], int ref_stride,
    247                        unsigned int *sad_array) {
    248   int i;
    249   for (i = 0; i < 4; ++i)
    250     sad_array[i] = vp9_sad16x16(src_ptr, src_stride, ref_ptr[i], ref_stride,
    251                                 0x7fffffff);
    252 }
    253 
    254 void vp9_sad16x8x4d_c(const uint8_t *src_ptr, int src_stride,
    255                       const uint8_t* const ref_ptr[], int ref_stride,
    256                       unsigned int *sad_array) {
    257   int i;
    258   for (i = 0; i < 4; ++i)
    259     sad_array[i] = vp9_sad16x8(src_ptr, src_stride, ref_ptr[i], ref_stride,
    260                                0x7fffffff);
    261 }
    262 
    263 void vp9_sad8x8x4d_c(const uint8_t *src_ptr, int src_stride,
    264                      const uint8_t* const ref_ptr[], int ref_stride,
    265                      unsigned int *sad_array) {
    266   int i;
    267   for (i = 0; i < 4; ++i)
    268     sad_array[i] = vp9_sad8x8(src_ptr, src_stride, ref_ptr[i], ref_stride,
    269                               0x7fffffff);
    270 }
    271 
    272 void vp9_sad8x16x4d_c(const uint8_t *src_ptr, int src_stride,
    273                       const uint8_t* const ref_ptr[], int ref_stride,
    274                       unsigned int *sad_array) {
    275   int i;
    276   for (i = 0; i < 4; ++i)
    277     sad_array[i] = vp9_sad8x16(src_ptr, src_stride, ref_ptr[i], ref_stride,
    278                                0x7fffffff);
    279 }
    280 
    281 void vp9_sad8x4x4d_c(const uint8_t *src_ptr, int src_stride,
    282                      const uint8_t* const ref_ptr[], int ref_stride,
    283                      unsigned int *sad_array) {
    284   int i;
    285   for (i = 0; i < 4; ++i)
    286     sad_array[i] = vp9_sad8x4(src_ptr, src_stride, ref_ptr[i], ref_stride,
    287                               0x7fffffff);
    288 }
    289 
    290 void vp9_sad8x4x8_c(const uint8_t *src_ptr, int src_stride,
    291                     const uint8_t *ref_ptr, int ref_stride,
    292                     uint32_t *sad_array) {
    293   int i;
    294   for (i = 0; i < 8; ++i)
    295     sad_array[i] = vp9_sad8x4(src_ptr, src_stride, ref_ptr + i, ref_stride,
    296                               0x7fffffff);
    297 }
    298 
    299 void vp9_sad4x8x4d_c(const uint8_t *src_ptr, int src_stride,
    300                      const uint8_t* const ref_ptr[], int ref_stride,
    301                      unsigned int *sad_array) {
    302   int i;
    303   for (i = 0; i < 4; ++i)
    304     sad_array[i] = vp9_sad4x8(src_ptr, src_stride, ref_ptr[i], ref_stride,
    305                               0x7fffffff);
    306 }
    307 
    308 void vp9_sad4x8x8_c(const uint8_t *src_ptr, int src_stride,
    309                     const uint8_t *ref_ptr, int ref_stride,
    310                     uint32_t *sad_array) {
    311   int i;
    312   for (i = 0; i < 8; ++i)
    313     sad_array[i] = vp9_sad4x8(src_ptr, src_stride, ref_ptr + i, ref_stride,
    314                               0x7fffffff);
    315 }
    316 
    317 void vp9_sad4x4x4d_c(const uint8_t *src_ptr, int src_stride,
    318                      const uint8_t* const ref_ptr[], int ref_stride,
    319                      unsigned int *sad_array) {
    320   int i;
    321   for (i = 0; i < 4; ++i)
    322     sad_array[i] = vp9_sad4x4(src_ptr, src_stride, ref_ptr[i], ref_stride,
    323                               0x7fffffff);
    324 }
    325