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 #ifndef VARIANCE_H
     13 #define VARIANCE_H
     14 
     15 #define prototype_sad(sym)\
     16     unsigned int (sym)\
     17     (\
     18      const unsigned char *src_ptr, \
     19      int source_stride, \
     20      const unsigned char *ref_ptr, \
     21      int  ref_stride, \
     22      int max_sad\
     23     )
     24 
     25 #define prototype_sad_multi_same_address(sym)\
     26     void (sym)\
     27     (\
     28      const unsigned char *src_ptr, \
     29      int source_stride, \
     30      const unsigned char *ref_ptr, \
     31      int  ref_stride, \
     32      unsigned int *sad_array\
     33     )
     34 
     35 #define prototype_sad_multi_same_address_1(sym)\
     36     void (sym)\
     37     (\
     38      const unsigned char *src_ptr, \
     39      int source_stride, \
     40      const unsigned char *ref_ptr, \
     41      int  ref_stride, \
     42      unsigned short *sad_array\
     43     )
     44 
     45 #define prototype_sad_multi_dif_address(sym)\
     46     void (sym)\
     47     (\
     48      const unsigned char *src_ptr, \
     49      int source_stride, \
     50      unsigned char *ref_ptr[4], \
     51      int  ref_stride, \
     52      unsigned int *sad_array\
     53     )
     54 
     55 #define prototype_variance(sym) \
     56     unsigned int (sym) \
     57     (\
     58      const unsigned char *src_ptr, \
     59      int source_stride, \
     60      const unsigned char *ref_ptr, \
     61      int  ref_stride, \
     62      unsigned int *sse\
     63     )
     64 
     65 #define prototype_variance2(sym) \
     66     unsigned int (sym) \
     67     (\
     68      const unsigned char *src_ptr, \
     69      int source_stride, \
     70      const unsigned char *ref_ptr, \
     71      int  ref_stride, \
     72      unsigned int *sse,\
     73      int *sum\
     74     )
     75 
     76 #define prototype_subpixvariance(sym) \
     77     unsigned int (sym) \
     78     ( \
     79       const unsigned char  *src_ptr, \
     80       int  source_stride, \
     81       int  xoffset, \
     82       int  yoffset, \
     83       const unsigned char *ref_ptr, \
     84       int Refstride, \
     85       unsigned int *sse \
     86     );
     87 
     88 
     89 #define prototype_getmbss(sym) unsigned int (sym)(const short *)
     90 
     91 #if ARCH_X86 || ARCH_X86_64
     92 #include "x86/variance_x86.h"
     93 #endif
     94 
     95 #if ARCH_ARM
     96 #include "arm/variance_arm.h"
     97 #endif
     98 
     99 #ifndef vp8_variance_sad4x4
    100 #define vp8_variance_sad4x4 vp8_sad4x4_c
    101 #endif
    102 extern prototype_sad(vp8_variance_sad4x4);
    103 
    104 #ifndef vp8_variance_sad8x8
    105 #define vp8_variance_sad8x8 vp8_sad8x8_c
    106 #endif
    107 extern prototype_sad(vp8_variance_sad8x8);
    108 
    109 #ifndef vp8_variance_sad8x16
    110 #define vp8_variance_sad8x16 vp8_sad8x16_c
    111 #endif
    112 extern prototype_sad(vp8_variance_sad8x16);
    113 
    114 #ifndef vp8_variance_sad16x8
    115 #define vp8_variance_sad16x8 vp8_sad16x8_c
    116 #endif
    117 extern prototype_sad(vp8_variance_sad16x8);
    118 
    119 #ifndef vp8_variance_sad16x16
    120 #define vp8_variance_sad16x16 vp8_sad16x16_c
    121 #endif
    122 extern prototype_sad(vp8_variance_sad16x16);
    123 
    124 //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
    125 
    126 #ifndef vp8_variance_sad16x16x3
    127 #define vp8_variance_sad16x16x3 vp8_sad16x16x3_c
    128 #endif
    129 extern prototype_sad_multi_same_address(vp8_variance_sad16x16x3);
    130 
    131 #ifndef vp8_variance_sad16x8x3
    132 #define vp8_variance_sad16x8x3 vp8_sad16x8x3_c
    133 #endif
    134 extern prototype_sad_multi_same_address(vp8_variance_sad16x8x3);
    135 
    136 #ifndef vp8_variance_sad8x8x3
    137 #define vp8_variance_sad8x8x3 vp8_sad8x8x3_c
    138 #endif
    139 extern prototype_sad_multi_same_address(vp8_variance_sad8x8x3);
    140 
    141 #ifndef vp8_variance_sad8x16x3
    142 #define vp8_variance_sad8x16x3 vp8_sad8x16x3_c
    143 #endif
    144 extern prototype_sad_multi_same_address(vp8_variance_sad8x16x3);
    145 
    146 #ifndef vp8_variance_sad4x4x3
    147 #define vp8_variance_sad4x4x3 vp8_sad4x4x3_c
    148 #endif
    149 extern prototype_sad_multi_same_address(vp8_variance_sad4x4x3);
    150 
    151 #ifndef vp8_variance_sad16x16x8
    152 #define vp8_variance_sad16x16x8 vp8_sad16x16x8_c
    153 #endif
    154 extern prototype_sad_multi_same_address_1(vp8_variance_sad16x16x8);
    155 
    156 #ifndef vp8_variance_sad16x8x8
    157 #define vp8_variance_sad16x8x8 vp8_sad16x8x8_c
    158 #endif
    159 extern prototype_sad_multi_same_address_1(vp8_variance_sad16x8x8);
    160 
    161 #ifndef vp8_variance_sad8x8x8
    162 #define vp8_variance_sad8x8x8 vp8_sad8x8x8_c
    163 #endif
    164 extern prototype_sad_multi_same_address_1(vp8_variance_sad8x8x8);
    165 
    166 #ifndef vp8_variance_sad8x16x8
    167 #define vp8_variance_sad8x16x8 vp8_sad8x16x8_c
    168 #endif
    169 extern prototype_sad_multi_same_address_1(vp8_variance_sad8x16x8);
    170 
    171 #ifndef vp8_variance_sad4x4x8
    172 #define vp8_variance_sad4x4x8 vp8_sad4x4x8_c
    173 #endif
    174 extern prototype_sad_multi_same_address_1(vp8_variance_sad4x4x8);
    175 
    176 //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
    177 
    178 #ifndef vp8_variance_sad16x16x4d
    179 #define vp8_variance_sad16x16x4d vp8_sad16x16x4d_c
    180 #endif
    181 extern prototype_sad_multi_dif_address(vp8_variance_sad16x16x4d);
    182 
    183 #ifndef vp8_variance_sad16x8x4d
    184 #define vp8_variance_sad16x8x4d vp8_sad16x8x4d_c
    185 #endif
    186 extern prototype_sad_multi_dif_address(vp8_variance_sad16x8x4d);
    187 
    188 #ifndef vp8_variance_sad8x8x4d
    189 #define vp8_variance_sad8x8x4d vp8_sad8x8x4d_c
    190 #endif
    191 extern prototype_sad_multi_dif_address(vp8_variance_sad8x8x4d);
    192 
    193 #ifndef vp8_variance_sad8x16x4d
    194 #define vp8_variance_sad8x16x4d vp8_sad8x16x4d_c
    195 #endif
    196 extern prototype_sad_multi_dif_address(vp8_variance_sad8x16x4d);
    197 
    198 #ifndef vp8_variance_sad4x4x4d
    199 #define vp8_variance_sad4x4x4d vp8_sad4x4x4d_c
    200 #endif
    201 extern prototype_sad_multi_dif_address(vp8_variance_sad4x4x4d);
    202 
    203 //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
    204 
    205 #ifndef vp8_variance_var4x4
    206 #define vp8_variance_var4x4 vp8_variance4x4_c
    207 #endif
    208 extern prototype_variance(vp8_variance_var4x4);
    209 
    210 #ifndef vp8_variance_var8x8
    211 #define vp8_variance_var8x8 vp8_variance8x8_c
    212 #endif
    213 extern prototype_variance(vp8_variance_var8x8);
    214 
    215 #ifndef vp8_variance_var8x16
    216 #define vp8_variance_var8x16 vp8_variance8x16_c
    217 #endif
    218 extern prototype_variance(vp8_variance_var8x16);
    219 
    220 #ifndef vp8_variance_var16x8
    221 #define vp8_variance_var16x8 vp8_variance16x8_c
    222 #endif
    223 extern prototype_variance(vp8_variance_var16x8);
    224 
    225 #ifndef vp8_variance_var16x16
    226 #define vp8_variance_var16x16 vp8_variance16x16_c
    227 #endif
    228 extern prototype_variance(vp8_variance_var16x16);
    229 
    230 //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
    231 
    232 #ifndef vp8_variance_subpixvar4x4
    233 #define vp8_variance_subpixvar4x4 vp8_sub_pixel_variance4x4_c
    234 #endif
    235 extern prototype_subpixvariance(vp8_variance_subpixvar4x4);
    236 
    237 #ifndef vp8_variance_subpixvar8x8
    238 #define vp8_variance_subpixvar8x8 vp8_sub_pixel_variance8x8_c
    239 #endif
    240 extern prototype_subpixvariance(vp8_variance_subpixvar8x8);
    241 
    242 #ifndef vp8_variance_subpixvar8x16
    243 #define vp8_variance_subpixvar8x16 vp8_sub_pixel_variance8x16_c
    244 #endif
    245 extern prototype_subpixvariance(vp8_variance_subpixvar8x16);
    246 
    247 #ifndef vp8_variance_subpixvar16x8
    248 #define vp8_variance_subpixvar16x8 vp8_sub_pixel_variance16x8_c
    249 #endif
    250 extern prototype_subpixvariance(vp8_variance_subpixvar16x8);
    251 
    252 #ifndef vp8_variance_subpixvar16x16
    253 #define vp8_variance_subpixvar16x16 vp8_sub_pixel_variance16x16_c
    254 #endif
    255 extern prototype_subpixvariance(vp8_variance_subpixvar16x16);
    256 
    257 #ifndef vp8_variance_halfpixvar16x16_h
    258 #define vp8_variance_halfpixvar16x16_h vp8_variance_halfpixvar16x16_h_c
    259 #endif
    260 extern prototype_variance(vp8_variance_halfpixvar16x16_h);
    261 
    262 #ifndef vp8_variance_halfpixvar16x16_v
    263 #define vp8_variance_halfpixvar16x16_v vp8_variance_halfpixvar16x16_v_c
    264 #endif
    265 extern prototype_variance(vp8_variance_halfpixvar16x16_v);
    266 
    267 #ifndef vp8_variance_halfpixvar16x16_hv
    268 #define vp8_variance_halfpixvar16x16_hv vp8_variance_halfpixvar16x16_hv_c
    269 #endif
    270 extern prototype_variance(vp8_variance_halfpixvar16x16_hv);
    271 
    272 #ifndef vp8_variance_subpixmse16x16
    273 #define vp8_variance_subpixmse16x16 vp8_sub_pixel_mse16x16_c
    274 #endif
    275 extern prototype_subpixvariance(vp8_variance_subpixmse16x16);
    276 
    277 //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
    278 
    279 #ifndef vp8_variance_getmbss
    280 #define vp8_variance_getmbss vp8_get_mb_ss_c
    281 #endif
    282 extern prototype_getmbss(vp8_variance_getmbss);
    283 
    284 #ifndef vp8_variance_mse16x16
    285 #define vp8_variance_mse16x16 vp8_mse16x16_c
    286 #endif
    287 extern prototype_variance(vp8_variance_mse16x16);
    288 
    289 #ifndef vp8_variance_get16x16prederror
    290 #define vp8_variance_get16x16prederror vp8_get16x16pred_error_c
    291 #endif
    292 extern prototype_sad(vp8_variance_get16x16prederror);
    293 
    294 #ifndef vp8_variance_get8x8var
    295 #define vp8_variance_get8x8var vp8_get8x8var_c
    296 #endif
    297 extern prototype_variance2(vp8_variance_get8x8var);
    298 
    299 #ifndef vp8_variance_get16x16var
    300 #define vp8_variance_get16x16var vp8_get16x16var_c
    301 #endif
    302 extern prototype_variance2(vp8_variance_get16x16var);
    303 
    304 #ifndef vp8_variance_get4x4sse_cs
    305 #define vp8_variance_get4x4sse_cs vp8_get4x4sse_cs_c
    306 #endif
    307 extern prototype_sad(vp8_variance_get4x4sse_cs);
    308 
    309 
    310 typedef prototype_sad(*vp8_sad_fn_t);
    311 typedef prototype_sad_multi_same_address(*vp8_sad_multi_fn_t);
    312 typedef prototype_sad_multi_same_address_1(*vp8_sad_multi1_fn_t);
    313 typedef prototype_sad_multi_dif_address(*vp8_sad_multi_d_fn_t);
    314 typedef prototype_variance(*vp8_variance_fn_t);
    315 typedef prototype_variance2(*vp8_variance2_fn_t);
    316 typedef prototype_subpixvariance(*vp8_subpixvariance_fn_t);
    317 typedef prototype_getmbss(*vp8_getmbss_fn_t);
    318 typedef struct
    319 {
    320     vp8_sad_fn_t             sad4x4;
    321     vp8_sad_fn_t             sad8x8;
    322     vp8_sad_fn_t             sad8x16;
    323     vp8_sad_fn_t             sad16x8;
    324     vp8_sad_fn_t             sad16x16;
    325 
    326     vp8_variance_fn_t        var4x4;
    327     vp8_variance_fn_t        var8x8;
    328     vp8_variance_fn_t        var8x16;
    329     vp8_variance_fn_t        var16x8;
    330     vp8_variance_fn_t        var16x16;
    331 
    332     vp8_subpixvariance_fn_t  subpixvar4x4;
    333     vp8_subpixvariance_fn_t  subpixvar8x8;
    334     vp8_subpixvariance_fn_t  subpixvar8x16;
    335     vp8_subpixvariance_fn_t  subpixvar16x8;
    336     vp8_subpixvariance_fn_t  subpixvar16x16;
    337     vp8_variance_fn_t        halfpixvar16x16_h;
    338     vp8_variance_fn_t        halfpixvar16x16_v;
    339     vp8_variance_fn_t        halfpixvar16x16_hv;
    340     vp8_subpixvariance_fn_t  subpixmse16x16;
    341 
    342     vp8_getmbss_fn_t         getmbss;
    343     vp8_variance_fn_t        mse16x16;
    344 
    345     vp8_sad_fn_t             get16x16prederror;
    346     vp8_variance2_fn_t       get8x8var;
    347     vp8_variance2_fn_t       get16x16var;
    348     vp8_sad_fn_t             get4x4sse_cs;
    349 
    350     vp8_sad_multi_fn_t       sad16x16x3;
    351     vp8_sad_multi_fn_t       sad16x8x3;
    352     vp8_sad_multi_fn_t       sad8x16x3;
    353     vp8_sad_multi_fn_t       sad8x8x3;
    354     vp8_sad_multi_fn_t       sad4x4x3;
    355 
    356     vp8_sad_multi1_fn_t      sad16x16x8;
    357     vp8_sad_multi1_fn_t      sad16x8x8;
    358     vp8_sad_multi1_fn_t      sad8x16x8;
    359     vp8_sad_multi1_fn_t      sad8x8x8;
    360     vp8_sad_multi1_fn_t      sad4x4x8;
    361 
    362     vp8_sad_multi_d_fn_t     sad16x16x4d;
    363     vp8_sad_multi_d_fn_t     sad16x8x4d;
    364     vp8_sad_multi_d_fn_t     sad8x16x4d;
    365     vp8_sad_multi_d_fn_t     sad8x8x4d;
    366     vp8_sad_multi_d_fn_t     sad4x4x4d;
    367 
    368 } vp8_variance_rtcd_vtable_t;
    369 
    370 typedef struct
    371 {
    372     vp8_sad_fn_t            sdf;
    373     vp8_variance_fn_t       vf;
    374     vp8_subpixvariance_fn_t svf;
    375     vp8_variance_fn_t       svf_halfpix_h;
    376     vp8_variance_fn_t       svf_halfpix_v;
    377     vp8_variance_fn_t       svf_halfpix_hv;
    378     vp8_sad_multi_fn_t      sdx3f;
    379     vp8_sad_multi1_fn_t     sdx8f;
    380     vp8_sad_multi_d_fn_t    sdx4df;
    381 } vp8_variance_fn_ptr_t;
    382 
    383 #if CONFIG_RUNTIME_CPU_DETECT
    384 #define VARIANCE_INVOKE(ctx,fn) (ctx)->fn
    385 #else
    386 #define VARIANCE_INVOKE(ctx,fn) vp8_variance_##fn
    387 #endif
    388 
    389 #endif
    390