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 
     12 #include <stdlib.h>
     13 
     14 unsigned int vp8_sad16x16_c(
     15     unsigned char *src_ptr,
     16     int  src_stride,
     17     unsigned char *ref_ptr,
     18     int  ref_stride,
     19     int max_sad)
     20 {
     21 
     22     int r, c;
     23     unsigned int sad = 0;
     24 
     25     for (r = 0; r < 16; r++)
     26     {
     27         for (c = 0; c < 16; c++)
     28         {
     29             sad += abs(src_ptr[c] - ref_ptr[c]);
     30         }
     31 
     32         src_ptr += src_stride;
     33         ref_ptr += ref_stride;
     34     }
     35 
     36     return sad;
     37 }
     38 
     39 
     40 static __inline
     41 unsigned int sad_mx_n_c(
     42     unsigned char *src_ptr,
     43     int  src_stride,
     44     unsigned char *ref_ptr,
     45     int  ref_stride,
     46     int m,
     47     int n)
     48 {
     49 
     50     int r, c;
     51     unsigned int sad = 0;
     52 
     53     for (r = 0; r < n; r++)
     54     {
     55         for (c = 0; c < m; c++)
     56         {
     57             sad += abs(src_ptr[c] - ref_ptr[c]);
     58         }
     59 
     60         src_ptr += src_stride;
     61         ref_ptr += ref_stride;
     62     }
     63 
     64     return sad;
     65 }
     66 
     67 
     68 unsigned int vp8_sad8x8_c(
     69     unsigned char *src_ptr,
     70     int  src_stride,
     71     unsigned char *ref_ptr,
     72     int  ref_stride,
     73     int max_sad)
     74 {
     75 
     76     return sad_mx_n_c(src_ptr, src_stride, ref_ptr, ref_stride, 8, 8);
     77 }
     78 
     79 
     80 unsigned int vp8_sad16x8_c(
     81     unsigned char *src_ptr,
     82     int  src_stride,
     83     unsigned char *ref_ptr,
     84     int  ref_stride,
     85     int max_sad)
     86 {
     87 
     88     return sad_mx_n_c(src_ptr, src_stride, ref_ptr, ref_stride, 16, 8);
     89 
     90 }
     91 
     92 
     93 unsigned int vp8_sad8x16_c(
     94     unsigned char *src_ptr,
     95     int  src_stride,
     96     unsigned char *ref_ptr,
     97     int  ref_stride,
     98     int max_sad)
     99 {
    100 
    101     return sad_mx_n_c(src_ptr, src_stride, ref_ptr, ref_stride, 8, 16);
    102 }
    103 
    104 
    105 unsigned int vp8_sad4x4_c(
    106     unsigned char *src_ptr,
    107     int  src_stride,
    108     unsigned char *ref_ptr,
    109     int  ref_stride,
    110     int max_sad)
    111 {
    112 
    113     return sad_mx_n_c(src_ptr, src_stride, ref_ptr, ref_stride, 4, 4);
    114 }
    115 
    116 void vp8_sad16x16x3_c(
    117     unsigned char *src_ptr,
    118     int  src_stride,
    119     unsigned char *ref_ptr,
    120     int  ref_stride,
    121     unsigned int *sad_array
    122 )
    123 {
    124     sad_array[0] = vp8_sad16x16_c(src_ptr, src_stride, ref_ptr  , ref_stride, 0x7fffffff);
    125     sad_array[1] = vp8_sad16x16_c(src_ptr, src_stride, ref_ptr + 1, ref_stride, 0x7fffffff);
    126     sad_array[2] = vp8_sad16x16_c(src_ptr, src_stride, ref_ptr + 2, ref_stride, 0x7fffffff);
    127 }
    128 
    129 void vp8_sad16x8x3_c(
    130     unsigned char *src_ptr,
    131     int  src_stride,
    132     unsigned char *ref_ptr,
    133     int  ref_stride,
    134     unsigned int *sad_array
    135 )
    136 {
    137     sad_array[0] = vp8_sad16x8_c(src_ptr, src_stride, ref_ptr  , ref_stride, 0x7fffffff);
    138     sad_array[1] = vp8_sad16x8_c(src_ptr, src_stride, ref_ptr + 1, ref_stride, 0x7fffffff);
    139     sad_array[2] = vp8_sad16x8_c(src_ptr, src_stride, ref_ptr + 2, ref_stride, 0x7fffffff);
    140 }
    141 
    142 void vp8_sad8x8x3_c(
    143     unsigned char *src_ptr,
    144     int  src_stride,
    145     unsigned char *ref_ptr,
    146     int  ref_stride,
    147     unsigned int *sad_array
    148 )
    149 {
    150     sad_array[0] = vp8_sad8x8_c(src_ptr, src_stride, ref_ptr  , ref_stride, 0x7fffffff);
    151     sad_array[1] = vp8_sad8x8_c(src_ptr, src_stride, ref_ptr + 1, ref_stride, 0x7fffffff);
    152     sad_array[2] = vp8_sad8x8_c(src_ptr, src_stride, ref_ptr + 2, ref_stride, 0x7fffffff);
    153 }
    154 
    155 void vp8_sad8x16x3_c(
    156     unsigned char *src_ptr,
    157     int  src_stride,
    158     unsigned char *ref_ptr,
    159     int  ref_stride,
    160     unsigned int *sad_array
    161 )
    162 {
    163     sad_array[0] = vp8_sad8x16_c(src_ptr, src_stride, ref_ptr  , ref_stride, 0x7fffffff);
    164     sad_array[1] = vp8_sad8x16_c(src_ptr, src_stride, ref_ptr + 1, ref_stride, 0x7fffffff);
    165     sad_array[2] = vp8_sad8x16_c(src_ptr, src_stride, ref_ptr + 2, ref_stride, 0x7fffffff);
    166 }
    167 
    168 void vp8_sad4x4x3_c(
    169     unsigned char *src_ptr,
    170     int  src_stride,
    171     unsigned char *ref_ptr,
    172     int  ref_stride,
    173     unsigned int *sad_array
    174 )
    175 {
    176     sad_array[0] = vp8_sad4x4_c(src_ptr, src_stride, ref_ptr  , ref_stride, 0x7fffffff);
    177     sad_array[1] = vp8_sad4x4_c(src_ptr, src_stride, ref_ptr + 1, ref_stride, 0x7fffffff);
    178     sad_array[2] = vp8_sad4x4_c(src_ptr, src_stride, ref_ptr + 2, ref_stride, 0x7fffffff);
    179 }
    180 
    181 void vp8_sad16x16x4d_c(
    182     unsigned char *src_ptr,
    183     int  src_stride,
    184     unsigned char *ref_ptr[],
    185     int  ref_stride,
    186     unsigned int *sad_array
    187 )
    188 {
    189     sad_array[0] = vp8_sad16x16_c(src_ptr, src_stride, ref_ptr[0], ref_stride, 0x7fffffff);
    190     sad_array[1] = vp8_sad16x16_c(src_ptr, src_stride, ref_ptr[1], ref_stride, 0x7fffffff);
    191     sad_array[2] = vp8_sad16x16_c(src_ptr, src_stride, ref_ptr[2], ref_stride, 0x7fffffff);
    192     sad_array[3] = vp8_sad16x16_c(src_ptr, src_stride, ref_ptr[3], ref_stride, 0x7fffffff);
    193 }
    194 
    195 void vp8_sad16x8x4d_c(
    196     unsigned char *src_ptr,
    197     int  src_stride,
    198     unsigned char *ref_ptr[],
    199     int  ref_stride,
    200     unsigned int *sad_array
    201 )
    202 {
    203     sad_array[0] = vp8_sad16x8_c(src_ptr, src_stride, ref_ptr[0], ref_stride, 0x7fffffff);
    204     sad_array[1] = vp8_sad16x8_c(src_ptr, src_stride, ref_ptr[1], ref_stride, 0x7fffffff);
    205     sad_array[2] = vp8_sad16x8_c(src_ptr, src_stride, ref_ptr[2], ref_stride, 0x7fffffff);
    206     sad_array[3] = vp8_sad16x8_c(src_ptr, src_stride, ref_ptr[3], ref_stride, 0x7fffffff);
    207 }
    208 
    209 void vp8_sad8x8x4d_c(
    210     unsigned char *src_ptr,
    211     int  src_stride,
    212     unsigned char *ref_ptr[],
    213     int  ref_stride,
    214     unsigned int *sad_array
    215 )
    216 {
    217     sad_array[0] = vp8_sad8x8_c(src_ptr, src_stride, ref_ptr[0], ref_stride, 0x7fffffff);
    218     sad_array[1] = vp8_sad8x8_c(src_ptr, src_stride, ref_ptr[1], ref_stride, 0x7fffffff);
    219     sad_array[2] = vp8_sad8x8_c(src_ptr, src_stride, ref_ptr[2], ref_stride, 0x7fffffff);
    220     sad_array[3] = vp8_sad8x8_c(src_ptr, src_stride, ref_ptr[3], ref_stride, 0x7fffffff);
    221 }
    222 
    223 void vp8_sad8x16x4d_c(
    224     unsigned char *src_ptr,
    225     int  src_stride,
    226     unsigned char *ref_ptr[],
    227     int  ref_stride,
    228     unsigned int *sad_array
    229 )
    230 {
    231     sad_array[0] = vp8_sad8x16_c(src_ptr, src_stride, ref_ptr[0], ref_stride, 0x7fffffff);
    232     sad_array[1] = vp8_sad8x16_c(src_ptr, src_stride, ref_ptr[1], ref_stride, 0x7fffffff);
    233     sad_array[2] = vp8_sad8x16_c(src_ptr, src_stride, ref_ptr[2], ref_stride, 0x7fffffff);
    234     sad_array[3] = vp8_sad8x16_c(src_ptr, src_stride, ref_ptr[3], ref_stride, 0x7fffffff);
    235 }
    236 
    237 void vp8_sad4x4x4d_c(
    238     unsigned char *src_ptr,
    239     int  src_stride,
    240     unsigned char *ref_ptr[],
    241     int  ref_stride,
    242     unsigned int *sad_array
    243 )
    244 {
    245     sad_array[0] = vp8_sad4x4_c(src_ptr, src_stride, ref_ptr[0], ref_stride, 0x7fffffff);
    246     sad_array[1] = vp8_sad4x4_c(src_ptr, src_stride, ref_ptr[1], ref_stride, 0x7fffffff);
    247     sad_array[2] = vp8_sad4x4_c(src_ptr, src_stride, ref_ptr[2], ref_stride, 0x7fffffff);
    248     sad_array[3] = vp8_sad4x4_c(src_ptr, src_stride, ref_ptr[3], ref_stride, 0x7fffffff);
    249 }
    250