• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 #define prototype_ssimpf(sym) \
89     void (sym) \
90       ( \
91         unsigned char *s, \
92         int sp, \
93         unsigned char *r, \
94         int rp, \
95         unsigned long *sum_s, \
96         unsigned long *sum_r, \
97         unsigned long *sum_sq_s, \
98         unsigned long *sum_sq_r, \
99         unsigned long *sum_sxr \
100       );
101 
102 #define prototype_getmbss(sym) unsigned int (sym)(const short *)
103 
104 #if ARCH_X86 || ARCH_X86_64
105 #include "x86/variance_x86.h"
106 #endif
107 
108 #if ARCH_ARM
109 #include "arm/variance_arm.h"
110 #endif
111 
112 #ifndef vp8_variance_sad4x4
113 #define vp8_variance_sad4x4 vp8_sad4x4_c
114 #endif
115 extern prototype_sad(vp8_variance_sad4x4);
116 
117 #ifndef vp8_variance_sad8x8
118 #define vp8_variance_sad8x8 vp8_sad8x8_c
119 #endif
120 extern prototype_sad(vp8_variance_sad8x8);
121 
122 #ifndef vp8_variance_sad8x16
123 #define vp8_variance_sad8x16 vp8_sad8x16_c
124 #endif
125 extern prototype_sad(vp8_variance_sad8x16);
126 
127 #ifndef vp8_variance_sad16x8
128 #define vp8_variance_sad16x8 vp8_sad16x8_c
129 #endif
130 extern prototype_sad(vp8_variance_sad16x8);
131 
132 #ifndef vp8_variance_sad16x16
133 #define vp8_variance_sad16x16 vp8_sad16x16_c
134 #endif
135 extern prototype_sad(vp8_variance_sad16x16);
136 
137 //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
138 
139 #ifndef vp8_variance_sad16x16x3
140 #define vp8_variance_sad16x16x3 vp8_sad16x16x3_c
141 #endif
142 extern prototype_sad_multi_same_address(vp8_variance_sad16x16x3);
143 
144 #ifndef vp8_variance_sad16x8x3
145 #define vp8_variance_sad16x8x3 vp8_sad16x8x3_c
146 #endif
147 extern prototype_sad_multi_same_address(vp8_variance_sad16x8x3);
148 
149 #ifndef vp8_variance_sad8x8x3
150 #define vp8_variance_sad8x8x3 vp8_sad8x8x3_c
151 #endif
152 extern prototype_sad_multi_same_address(vp8_variance_sad8x8x3);
153 
154 #ifndef vp8_variance_sad8x16x3
155 #define vp8_variance_sad8x16x3 vp8_sad8x16x3_c
156 #endif
157 extern prototype_sad_multi_same_address(vp8_variance_sad8x16x3);
158 
159 #ifndef vp8_variance_sad4x4x3
160 #define vp8_variance_sad4x4x3 vp8_sad4x4x3_c
161 #endif
162 extern prototype_sad_multi_same_address(vp8_variance_sad4x4x3);
163 
164 #ifndef vp8_variance_sad16x16x8
165 #define vp8_variance_sad16x16x8 vp8_sad16x16x8_c
166 #endif
167 extern prototype_sad_multi_same_address_1(vp8_variance_sad16x16x8);
168 
169 #ifndef vp8_variance_sad16x8x8
170 #define vp8_variance_sad16x8x8 vp8_sad16x8x8_c
171 #endif
172 extern prototype_sad_multi_same_address_1(vp8_variance_sad16x8x8);
173 
174 #ifndef vp8_variance_sad8x8x8
175 #define vp8_variance_sad8x8x8 vp8_sad8x8x8_c
176 #endif
177 extern prototype_sad_multi_same_address_1(vp8_variance_sad8x8x8);
178 
179 #ifndef vp8_variance_sad8x16x8
180 #define vp8_variance_sad8x16x8 vp8_sad8x16x8_c
181 #endif
182 extern prototype_sad_multi_same_address_1(vp8_variance_sad8x16x8);
183 
184 #ifndef vp8_variance_sad4x4x8
185 #define vp8_variance_sad4x4x8 vp8_sad4x4x8_c
186 #endif
187 extern prototype_sad_multi_same_address_1(vp8_variance_sad4x4x8);
188 
189 //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
190 
191 #ifndef vp8_variance_sad16x16x4d
192 #define vp8_variance_sad16x16x4d vp8_sad16x16x4d_c
193 #endif
194 extern prototype_sad_multi_dif_address(vp8_variance_sad16x16x4d);
195 
196 #ifndef vp8_variance_sad16x8x4d
197 #define vp8_variance_sad16x8x4d vp8_sad16x8x4d_c
198 #endif
199 extern prototype_sad_multi_dif_address(vp8_variance_sad16x8x4d);
200 
201 #ifndef vp8_variance_sad8x8x4d
202 #define vp8_variance_sad8x8x4d vp8_sad8x8x4d_c
203 #endif
204 extern prototype_sad_multi_dif_address(vp8_variance_sad8x8x4d);
205 
206 #ifndef vp8_variance_sad8x16x4d
207 #define vp8_variance_sad8x16x4d vp8_sad8x16x4d_c
208 #endif
209 extern prototype_sad_multi_dif_address(vp8_variance_sad8x16x4d);
210 
211 #ifndef vp8_variance_sad4x4x4d
212 #define vp8_variance_sad4x4x4d vp8_sad4x4x4d_c
213 #endif
214 extern prototype_sad_multi_dif_address(vp8_variance_sad4x4x4d);
215 
216 //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
217 
218 #ifndef vp8_variance_var4x4
219 #define vp8_variance_var4x4 vp8_variance4x4_c
220 #endif
221 extern prototype_variance(vp8_variance_var4x4);
222 
223 #ifndef vp8_variance_var8x8
224 #define vp8_variance_var8x8 vp8_variance8x8_c
225 #endif
226 extern prototype_variance(vp8_variance_var8x8);
227 
228 #ifndef vp8_variance_var8x16
229 #define vp8_variance_var8x16 vp8_variance8x16_c
230 #endif
231 extern prototype_variance(vp8_variance_var8x16);
232 
233 #ifndef vp8_variance_var16x8
234 #define vp8_variance_var16x8 vp8_variance16x8_c
235 #endif
236 extern prototype_variance(vp8_variance_var16x8);
237 
238 #ifndef vp8_variance_var16x16
239 #define vp8_variance_var16x16 vp8_variance16x16_c
240 #endif
241 extern prototype_variance(vp8_variance_var16x16);
242 
243 //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
244 
245 #ifndef vp8_variance_subpixvar4x4
246 #define vp8_variance_subpixvar4x4 vp8_sub_pixel_variance4x4_c
247 #endif
248 extern prototype_subpixvariance(vp8_variance_subpixvar4x4);
249 
250 #ifndef vp8_variance_subpixvar8x8
251 #define vp8_variance_subpixvar8x8 vp8_sub_pixel_variance8x8_c
252 #endif
253 extern prototype_subpixvariance(vp8_variance_subpixvar8x8);
254 
255 #ifndef vp8_variance_subpixvar8x16
256 #define vp8_variance_subpixvar8x16 vp8_sub_pixel_variance8x16_c
257 #endif
258 extern prototype_subpixvariance(vp8_variance_subpixvar8x16);
259 
260 #ifndef vp8_variance_subpixvar16x8
261 #define vp8_variance_subpixvar16x8 vp8_sub_pixel_variance16x8_c
262 #endif
263 extern prototype_subpixvariance(vp8_variance_subpixvar16x8);
264 
265 #ifndef vp8_variance_subpixvar16x16
266 #define vp8_variance_subpixvar16x16 vp8_sub_pixel_variance16x16_c
267 #endif
268 extern prototype_subpixvariance(vp8_variance_subpixvar16x16);
269 
270 #ifndef vp8_variance_halfpixvar16x16_h
271 #define vp8_variance_halfpixvar16x16_h vp8_variance_halfpixvar16x16_h_c
272 #endif
273 extern prototype_variance(vp8_variance_halfpixvar16x16_h);
274 
275 #ifndef vp8_variance_halfpixvar16x16_v
276 #define vp8_variance_halfpixvar16x16_v vp8_variance_halfpixvar16x16_v_c
277 #endif
278 extern prototype_variance(vp8_variance_halfpixvar16x16_v);
279 
280 #ifndef vp8_variance_halfpixvar16x16_hv
281 #define vp8_variance_halfpixvar16x16_hv vp8_variance_halfpixvar16x16_hv_c
282 #endif
283 extern prototype_variance(vp8_variance_halfpixvar16x16_hv);
284 
285 #ifndef vp8_variance_subpixmse16x16
286 #define vp8_variance_subpixmse16x16 vp8_sub_pixel_mse16x16_c
287 #endif
288 extern prototype_subpixvariance(vp8_variance_subpixmse16x16);
289 
290 //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
291 
292 #ifndef vp8_variance_getmbss
293 #define vp8_variance_getmbss vp8_get_mb_ss_c
294 #endif
295 extern prototype_getmbss(vp8_variance_getmbss);
296 
297 #ifndef vp8_variance_mse16x16
298 #define vp8_variance_mse16x16 vp8_mse16x16_c
299 #endif
300 extern prototype_variance(vp8_variance_mse16x16);
301 
302 #ifndef vp8_variance_get16x16prederror
303 #define vp8_variance_get16x16prederror vp8_get16x16pred_error_c
304 #endif
305 extern prototype_sad(vp8_variance_get16x16prederror);
306 
307 #ifndef vp8_variance_get8x8var
308 #define vp8_variance_get8x8var vp8_get8x8var_c
309 #endif
310 extern prototype_variance2(vp8_variance_get8x8var);
311 
312 #ifndef vp8_variance_get16x16var
313 #define vp8_variance_get16x16var vp8_get16x16var_c
314 #endif
315 extern prototype_variance2(vp8_variance_get16x16var);
316 
317 #ifndef vp8_variance_get4x4sse_cs
318 #define vp8_variance_get4x4sse_cs vp8_get4x4sse_cs_c
319 #endif
320 extern prototype_sad(vp8_variance_get4x4sse_cs);
321 
322 #ifndef vp8_ssimpf
323 #define vp8_ssimpf ssim_parms_c
324 #endif
325 extern prototype_ssimpf(vp8_ssimpf)
326 
327 #ifndef vp8_ssimpf_8x8
328 #define vp8_ssimpf_8x8 ssim_parms_8x8_c
329 #endif
330 extern prototype_ssimpf(vp8_ssimpf_8x8)
331 
332 typedef prototype_sad(*vp8_sad_fn_t);
333 typedef prototype_sad_multi_same_address(*vp8_sad_multi_fn_t);
334 typedef prototype_sad_multi_same_address_1(*vp8_sad_multi1_fn_t);
335 typedef prototype_sad_multi_dif_address(*vp8_sad_multi_d_fn_t);
336 typedef prototype_variance(*vp8_variance_fn_t);
337 typedef prototype_variance2(*vp8_variance2_fn_t);
338 typedef prototype_subpixvariance(*vp8_subpixvariance_fn_t);
339 typedef prototype_getmbss(*vp8_getmbss_fn_t);
340 
341 typedef prototype_ssimpf(*vp8_ssimpf_fn_t)
342 
343 
344 typedef struct
345 {
346     vp8_sad_fn_t             sad4x4;
347     vp8_sad_fn_t             sad8x8;
348     vp8_sad_fn_t             sad8x16;
349     vp8_sad_fn_t             sad16x8;
350     vp8_sad_fn_t             sad16x16;
351 
352     vp8_variance_fn_t        var4x4;
353     vp8_variance_fn_t        var8x8;
354     vp8_variance_fn_t        var8x16;
355     vp8_variance_fn_t        var16x8;
356     vp8_variance_fn_t        var16x16;
357 
358     vp8_subpixvariance_fn_t  subpixvar4x4;
359     vp8_subpixvariance_fn_t  subpixvar8x8;
360     vp8_subpixvariance_fn_t  subpixvar8x16;
361     vp8_subpixvariance_fn_t  subpixvar16x8;
362     vp8_subpixvariance_fn_t  subpixvar16x16;
363     vp8_variance_fn_t        halfpixvar16x16_h;
364     vp8_variance_fn_t        halfpixvar16x16_v;
365     vp8_variance_fn_t        halfpixvar16x16_hv;
366     vp8_subpixvariance_fn_t  subpixmse16x16;
367 
368     vp8_getmbss_fn_t         getmbss;
369     vp8_variance_fn_t        mse16x16;
370 
371     vp8_sad_fn_t             get16x16prederror;
372     vp8_variance2_fn_t       get8x8var;
373     vp8_variance2_fn_t       get16x16var;
374     vp8_sad_fn_t             get4x4sse_cs;
375 
376     vp8_sad_multi_fn_t       sad16x16x3;
377     vp8_sad_multi_fn_t       sad16x8x3;
378     vp8_sad_multi_fn_t       sad8x16x3;
379     vp8_sad_multi_fn_t       sad8x8x3;
380     vp8_sad_multi_fn_t       sad4x4x3;
381 
382     vp8_sad_multi1_fn_t      sad16x16x8;
383     vp8_sad_multi1_fn_t      sad16x8x8;
384     vp8_sad_multi1_fn_t      sad8x16x8;
385     vp8_sad_multi1_fn_t      sad8x8x8;
386     vp8_sad_multi1_fn_t      sad4x4x8;
387 
388     vp8_sad_multi_d_fn_t     sad16x16x4d;
389     vp8_sad_multi_d_fn_t     sad16x8x4d;
390     vp8_sad_multi_d_fn_t     sad8x16x4d;
391     vp8_sad_multi_d_fn_t     sad8x8x4d;
392     vp8_sad_multi_d_fn_t     sad4x4x4d;
393 
394 #if CONFIG_PSNR
395     vp8_ssimpf_fn_t          ssimpf_8x8;
396     vp8_ssimpf_fn_t          ssimpf;
397 #endif
398 
399 } vp8_variance_rtcd_vtable_t;
400 
401 typedef struct
402 {
403     vp8_sad_fn_t            sdf;
404     vp8_variance_fn_t       vf;
405     vp8_subpixvariance_fn_t svf;
406     vp8_variance_fn_t       svf_halfpix_h;
407     vp8_variance_fn_t       svf_halfpix_v;
408     vp8_variance_fn_t       svf_halfpix_hv;
409     vp8_sad_multi_fn_t      sdx3f;
410     vp8_sad_multi1_fn_t     sdx8f;
411     vp8_sad_multi_d_fn_t    sdx4df;
412 
413 } vp8_variance_fn_ptr_t;
414 
415 #if CONFIG_RUNTIME_CPU_DETECT
416 #define VARIANCE_INVOKE(ctx,fn) (ctx)->fn
417 #else
418 #define VARIANCE_INVOKE(ctx,fn) vp8_variance_##fn
419 #endif
420 
421 #endif
422