2 * Copyright (c) 2010 The WebM project authors. All Rights Reserved.
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.
13 #include "./vp9_rtcd.h"
14 #include "./vpx_config.h"
15 #include "vp9/encoder/vp9_sadmxn.h"
16 #include "vp9/encoder/vp9_variance.h"
17 #include "vpx/vpx_integer.h"
19 #define sad_mxn_func(m, n) \
20 unsigned int vp9_sad##m##x##n##_c(const uint8_t *src_ptr, \
22 const uint8_t *ref_ptr, \
24 unsigned int max_sad) { \
25 return sad_mx_n_c(src_ptr, src_stride, ref_ptr, ref_stride, m, n); \
27 unsigned int vp9_sad##m##x##n##_avg_c(const uint8_t *src_ptr, \
29 const uint8_t *ref_ptr, \
31 const uint8_t *second_pred, \
32 unsigned int max_sad) { \
33 uint8_t comp_pred[m * n]; \
34 comp_avg_pred(comp_pred, second_pred, m, n, ref_ptr, ref_stride); \
35 return sad_mx_n_c(src_ptr, src_stride, comp_pred, m, m, n); \
52 void vp9_sad64x32x4d_c(const uint8_t *src_ptr,
54 const uint8_t* const ref_ptr[],
56 unsigned int *sad_array) {
57 sad_array[0] = vp9_sad64x32(src_ptr, src_stride,
58 ref_ptr[0], ref_stride, 0x7fffffff);
59 sad_array[1] = vp9_sad64x32(src_ptr, src_stride,
60 ref_ptr[1], ref_stride, 0x7fffffff);
61 sad_array[2] = vp9_sad64x32(src_ptr, src_stride,
62 ref_ptr[2], ref_stride, 0x7fffffff);
63 sad_array[3] = vp9_sad64x32(src_ptr, src_stride,
64 ref_ptr[3], ref_stride, 0x7fffffff);
67 void vp9_sad32x64x4d_c(const uint8_t *src_ptr,
69 const uint8_t* const ref_ptr[],
71 unsigned int *sad_array) {
72 sad_array[0] = vp9_sad32x64(src_ptr, src_stride,
73 ref_ptr[0], ref_stride, 0x7fffffff);
74 sad_array[1] = vp9_sad32x64(src_ptr, src_stride,
75 ref_ptr[1], ref_stride, 0x7fffffff);
76 sad_array[2] = vp9_sad32x64(src_ptr, src_stride,
77 ref_ptr[2], ref_stride, 0x7fffffff);
78 sad_array[3] = vp9_sad32x64(src_ptr, src_stride,
79 ref_ptr[3], ref_stride, 0x7fffffff);
82 void vp9_sad32x16x4d_c(const uint8_t *src_ptr,
84 const uint8_t* const ref_ptr[],
86 unsigned int *sad_array) {
87 sad_array[0] = vp9_sad32x16(src_ptr, src_stride,
88 ref_ptr[0], ref_stride, 0x7fffffff);
89 sad_array[1] = vp9_sad32x16(src_ptr, src_stride,
90 ref_ptr[1], ref_stride, 0x7fffffff);
91 sad_array[2] = vp9_sad32x16(src_ptr, src_stride,
92 ref_ptr[2], ref_stride, 0x7fffffff);
93 sad_array[3] = vp9_sad32x16(src_ptr, src_stride,
94 ref_ptr[3], ref_stride, 0x7fffffff);
97 void vp9_sad16x32x4d_c(const uint8_t *src_ptr,
99 const uint8_t* const ref_ptr[],
101 unsigned int *sad_array) {
102 sad_array[0] = vp9_sad16x32(src_ptr, src_stride,
103 ref_ptr[0], ref_stride, 0x7fffffff);
104 sad_array[1] = vp9_sad16x32(src_ptr, src_stride,
105 ref_ptr[1], ref_stride, 0x7fffffff);
106 sad_array[2] = vp9_sad16x32(src_ptr, src_stride,
107 ref_ptr[2], ref_stride, 0x7fffffff);
108 sad_array[3] = vp9_sad16x32(src_ptr, src_stride,
109 ref_ptr[3], ref_stride, 0x7fffffff);
112 void vp9_sad64x64x3_c(const uint8_t *src_ptr,
114 const uint8_t *ref_ptr,
116 unsigned int *sad_array) {
117 sad_array[0] = vp9_sad64x64(src_ptr, src_stride, ref_ptr, ref_stride,
119 sad_array[1] = vp9_sad64x64(src_ptr, src_stride, ref_ptr + 1, ref_stride,
121 sad_array[2] = vp9_sad64x64(src_ptr, src_stride, ref_ptr + 2, ref_stride,
125 void vp9_sad32x32x3_c(const uint8_t *src_ptr,
127 const uint8_t *ref_ptr,
129 unsigned int *sad_array) {
130 sad_array[0] = vp9_sad32x32(src_ptr, src_stride,
131 ref_ptr, ref_stride, 0x7fffffff);
132 sad_array[1] = vp9_sad32x32(src_ptr, src_stride,
133 ref_ptr + 1, ref_stride, 0x7fffffff);
134 sad_array[2] = vp9_sad32x32(src_ptr, src_stride,
135 ref_ptr + 2, ref_stride, 0x7fffffff);
138 void vp9_sad64x64x8_c(const uint8_t *src_ptr,
140 const uint8_t *ref_ptr,
142 unsigned int *sad_array) {
143 sad_array[0] = vp9_sad64x64(src_ptr, src_stride,
146 sad_array[1] = vp9_sad64x64(src_ptr, src_stride,
147 ref_ptr + 1, ref_stride,
149 sad_array[2] = vp9_sad64x64(src_ptr, src_stride,
150 ref_ptr + 2, ref_stride,
152 sad_array[3] = vp9_sad64x64(src_ptr, src_stride,
153 ref_ptr + 3, ref_stride,
155 sad_array[4] = vp9_sad64x64(src_ptr, src_stride,
156 ref_ptr + 4, ref_stride,
158 sad_array[5] = vp9_sad64x64(src_ptr, src_stride,
159 ref_ptr + 5, ref_stride,
161 sad_array[6] = vp9_sad64x64(src_ptr, src_stride,
162 ref_ptr + 6, ref_stride,
164 sad_array[7] = vp9_sad64x64(src_ptr, src_stride,
165 ref_ptr + 7, ref_stride,
169 void vp9_sad32x32x8_c(const uint8_t *src_ptr,
171 const uint8_t *ref_ptr,
173 unsigned int *sad_array) {
174 sad_array[0] = vp9_sad32x32(src_ptr, src_stride,
177 sad_array[1] = vp9_sad32x32(src_ptr, src_stride,
178 ref_ptr + 1, ref_stride,
180 sad_array[2] = vp9_sad32x32(src_ptr, src_stride,
181 ref_ptr + 2, ref_stride,
183 sad_array[3] = vp9_sad32x32(src_ptr, src_stride,
184 ref_ptr + 3, ref_stride,
186 sad_array[4] = vp9_sad32x32(src_ptr, src_stride,
187 ref_ptr + 4, ref_stride,
189 sad_array[5] = vp9_sad32x32(src_ptr, src_stride,
190 ref_ptr + 5, ref_stride,
192 sad_array[6] = vp9_sad32x32(src_ptr, src_stride,
193 ref_ptr + 6, ref_stride,
195 sad_array[7] = vp9_sad32x32(src_ptr, src_stride,
196 ref_ptr + 7, ref_stride,
200 void vp9_sad16x16x3_c(const uint8_t *src_ptr,
202 const uint8_t *ref_ptr,
204 unsigned int *sad_array) {
205 sad_array[0] = vp9_sad16x16(src_ptr, src_stride,
206 ref_ptr, ref_stride, 0x7fffffff);
207 sad_array[1] = vp9_sad16x16(src_ptr, src_stride,
208 ref_ptr + 1, ref_stride, 0x7fffffff);
209 sad_array[2] = vp9_sad16x16(src_ptr, src_stride,
210 ref_ptr + 2, ref_stride, 0x7fffffff);
213 void vp9_sad16x16x8_c(const uint8_t *src_ptr,
215 const uint8_t *ref_ptr,
217 uint32_t *sad_array) {
218 sad_array[0] = vp9_sad16x16(src_ptr, src_stride,
221 sad_array[1] = vp9_sad16x16(src_ptr, src_stride,
222 ref_ptr + 1, ref_stride,
224 sad_array[2] = vp9_sad16x16(src_ptr, src_stride,
225 ref_ptr + 2, ref_stride,
227 sad_array[3] = vp9_sad16x16(src_ptr, src_stride,
228 ref_ptr + 3, ref_stride,
230 sad_array[4] = vp9_sad16x16(src_ptr, src_stride,
231 ref_ptr + 4, ref_stride,
233 sad_array[5] = vp9_sad16x16(src_ptr, src_stride,
234 ref_ptr + 5, ref_stride,
236 sad_array[6] = vp9_sad16x16(src_ptr, src_stride,
237 ref_ptr + 6, ref_stride,
239 sad_array[7] = vp9_sad16x16(src_ptr, src_stride,
240 ref_ptr + 7, ref_stride,
244 void vp9_sad16x8x3_c(const uint8_t *src_ptr,
246 const uint8_t *ref_ptr,
248 unsigned int *sad_array) {
249 sad_array[0] = vp9_sad16x8(src_ptr, src_stride,
250 ref_ptr, ref_stride, 0x7fffffff);
251 sad_array[1] = vp9_sad16x8(src_ptr, src_stride,
252 ref_ptr + 1, ref_stride, 0x7fffffff);
253 sad_array[2] = vp9_sad16x8(src_ptr, src_stride,
254 ref_ptr + 2, ref_stride, 0x7fffffff);
257 void vp9_sad16x8x8_c(const uint8_t *src_ptr,
259 const uint8_t *ref_ptr,
261 uint32_t *sad_array) {
262 sad_array[0] = vp9_sad16x8(src_ptr, src_stride,
265 sad_array[1] = vp9_sad16x8(src_ptr, src_stride,
266 ref_ptr + 1, ref_stride,
268 sad_array[2] = vp9_sad16x8(src_ptr, src_stride,
269 ref_ptr + 2, ref_stride,
271 sad_array[3] = vp9_sad16x8(src_ptr, src_stride,
272 ref_ptr + 3, ref_stride,
274 sad_array[4] = vp9_sad16x8(src_ptr, src_stride,
275 ref_ptr + 4, ref_stride,
277 sad_array[5] = vp9_sad16x8(src_ptr, src_stride,
278 ref_ptr + 5, ref_stride,
280 sad_array[6] = vp9_sad16x8(src_ptr, src_stride,
281 ref_ptr + 6, ref_stride,
283 sad_array[7] = vp9_sad16x8(src_ptr, src_stride,
284 ref_ptr + 7, ref_stride,
288 void vp9_sad8x8x3_c(const uint8_t *src_ptr,
290 const uint8_t *ref_ptr,
292 unsigned int *sad_array) {
293 sad_array[0] = vp9_sad8x8(src_ptr, src_stride,
294 ref_ptr, ref_stride, 0x7fffffff);
295 sad_array[1] = vp9_sad8x8(src_ptr, src_stride,
296 ref_ptr + 1, ref_stride, 0x7fffffff);
297 sad_array[2] = vp9_sad8x8(src_ptr, src_stride,
298 ref_ptr + 2, ref_stride, 0x7fffffff);
301 void vp9_sad8x8x8_c(const uint8_t *src_ptr,
303 const uint8_t *ref_ptr,
305 uint32_t *sad_array) {
306 sad_array[0] = vp9_sad8x8(src_ptr, src_stride,
309 sad_array[1] = vp9_sad8x8(src_ptr, src_stride,
310 ref_ptr + 1, ref_stride,
312 sad_array[2] = vp9_sad8x8(src_ptr, src_stride,
313 ref_ptr + 2, ref_stride,
315 sad_array[3] = vp9_sad8x8(src_ptr, src_stride,
316 ref_ptr + 3, ref_stride,
318 sad_array[4] = vp9_sad8x8(src_ptr, src_stride,
319 ref_ptr + 4, ref_stride,
321 sad_array[5] = vp9_sad8x8(src_ptr, src_stride,
322 ref_ptr + 5, ref_stride,
324 sad_array[6] = vp9_sad8x8(src_ptr, src_stride,
325 ref_ptr + 6, ref_stride,
327 sad_array[7] = vp9_sad8x8(src_ptr, src_stride,
328 ref_ptr + 7, ref_stride,
332 void vp9_sad8x16x3_c(const uint8_t *src_ptr,
334 const uint8_t *ref_ptr,
336 unsigned int *sad_array) {
337 sad_array[0] = vp9_sad8x16(src_ptr, src_stride,
338 ref_ptr, ref_stride, 0x7fffffff);
339 sad_array[1] = vp9_sad8x16(src_ptr, src_stride,
340 ref_ptr + 1, ref_stride, 0x7fffffff);
341 sad_array[2] = vp9_sad8x16(src_ptr, src_stride,
342 ref_ptr + 2, ref_stride, 0x7fffffff);
345 void vp9_sad8x16x8_c(const uint8_t *src_ptr,
347 const uint8_t *ref_ptr,
349 uint32_t *sad_array) {
350 sad_array[0] = vp9_sad8x16(src_ptr, src_stride,
353 sad_array[1] = vp9_sad8x16(src_ptr, src_stride,
354 ref_ptr + 1, ref_stride,
356 sad_array[2] = vp9_sad8x16(src_ptr, src_stride,
357 ref_ptr + 2, ref_stride,
359 sad_array[3] = vp9_sad8x16(src_ptr, src_stride,
360 ref_ptr + 3, ref_stride,
362 sad_array[4] = vp9_sad8x16(src_ptr, src_stride,
363 ref_ptr + 4, ref_stride,
365 sad_array[5] = vp9_sad8x16(src_ptr, src_stride,
366 ref_ptr + 5, ref_stride,
368 sad_array[6] = vp9_sad8x16(src_ptr, src_stride,
369 ref_ptr + 6, ref_stride,
371 sad_array[7] = vp9_sad8x16(src_ptr, src_stride,
372 ref_ptr + 7, ref_stride,
376 void vp9_sad4x4x3_c(const uint8_t *src_ptr,
378 const uint8_t *ref_ptr,
380 unsigned int *sad_array) {
381 sad_array[0] = vp9_sad4x4(src_ptr, src_stride,
382 ref_ptr, ref_stride, 0x7fffffff);
383 sad_array[1] = vp9_sad4x4(src_ptr, src_stride,
384 ref_ptr + 1, ref_stride, 0x7fffffff);
385 sad_array[2] = vp9_sad4x4(src_ptr, src_stride,
386 ref_ptr + 2, ref_stride, 0x7fffffff);
389 void vp9_sad4x4x8_c(const uint8_t *src_ptr,
391 const uint8_t *ref_ptr,
393 uint32_t *sad_array) {
394 sad_array[0] = vp9_sad4x4(src_ptr, src_stride,
397 sad_array[1] = vp9_sad4x4(src_ptr, src_stride,
398 ref_ptr + 1, ref_stride,
400 sad_array[2] = vp9_sad4x4(src_ptr, src_stride,
401 ref_ptr + 2, ref_stride,
403 sad_array[3] = vp9_sad4x4(src_ptr, src_stride,
404 ref_ptr + 3, ref_stride,
406 sad_array[4] = vp9_sad4x4(src_ptr, src_stride,
407 ref_ptr + 4, ref_stride,
409 sad_array[5] = vp9_sad4x4(src_ptr, src_stride,
410 ref_ptr + 5, ref_stride,
412 sad_array[6] = vp9_sad4x4(src_ptr, src_stride,
413 ref_ptr + 6, ref_stride,
415 sad_array[7] = vp9_sad4x4(src_ptr, src_stride,
416 ref_ptr + 7, ref_stride,
420 void vp9_sad64x64x4d_c(const uint8_t *src_ptr,
422 const uint8_t* const ref_ptr[],
424 unsigned int *sad_array) {
425 sad_array[0] = vp9_sad64x64(src_ptr, src_stride,
426 ref_ptr[0], ref_stride, 0x7fffffff);
427 sad_array[1] = vp9_sad64x64(src_ptr, src_stride,
428 ref_ptr[1], ref_stride, 0x7fffffff);
429 sad_array[2] = vp9_sad64x64(src_ptr, src_stride,
430 ref_ptr[2], ref_stride, 0x7fffffff);
431 sad_array[3] = vp9_sad64x64(src_ptr, src_stride,
432 ref_ptr[3], ref_stride, 0x7fffffff);
435 void vp9_sad32x32x4d_c(const uint8_t *src_ptr,
437 const uint8_t* const ref_ptr[],
439 unsigned int *sad_array) {
440 sad_array[0] = vp9_sad32x32(src_ptr, src_stride,
441 ref_ptr[0], ref_stride, 0x7fffffff);
442 sad_array[1] = vp9_sad32x32(src_ptr, src_stride,
443 ref_ptr[1], ref_stride, 0x7fffffff);
444 sad_array[2] = vp9_sad32x32(src_ptr, src_stride,
445 ref_ptr[2], ref_stride, 0x7fffffff);
446 sad_array[3] = vp9_sad32x32(src_ptr, src_stride,
447 ref_ptr[3], ref_stride, 0x7fffffff);
450 void vp9_sad16x16x4d_c(const uint8_t *src_ptr,
452 const uint8_t* const ref_ptr[],
454 unsigned int *sad_array) {
455 sad_array[0] = vp9_sad16x16(src_ptr, src_stride,
456 ref_ptr[0], ref_stride, 0x7fffffff);
457 sad_array[1] = vp9_sad16x16(src_ptr, src_stride,
458 ref_ptr[1], ref_stride, 0x7fffffff);
459 sad_array[2] = vp9_sad16x16(src_ptr, src_stride,
460 ref_ptr[2], ref_stride, 0x7fffffff);
461 sad_array[3] = vp9_sad16x16(src_ptr, src_stride,
462 ref_ptr[3], ref_stride, 0x7fffffff);
465 void vp9_sad16x8x4d_c(const uint8_t *src_ptr,
467 const uint8_t* const ref_ptr[],
469 unsigned int *sad_array) {
470 sad_array[0] = vp9_sad16x8(src_ptr, src_stride,
471 ref_ptr[0], ref_stride, 0x7fffffff);
472 sad_array[1] = vp9_sad16x8(src_ptr, src_stride,
473 ref_ptr[1], ref_stride, 0x7fffffff);
474 sad_array[2] = vp9_sad16x8(src_ptr, src_stride,
475 ref_ptr[2], ref_stride, 0x7fffffff);
476 sad_array[3] = vp9_sad16x8(src_ptr, src_stride,
477 ref_ptr[3], ref_stride, 0x7fffffff);
480 void vp9_sad8x8x4d_c(const uint8_t *src_ptr,
482 const uint8_t* const ref_ptr[],
484 unsigned int *sad_array) {
485 sad_array[0] = vp9_sad8x8(src_ptr, src_stride,
486 ref_ptr[0], ref_stride, 0x7fffffff);
487 sad_array[1] = vp9_sad8x8(src_ptr, src_stride,
488 ref_ptr[1], ref_stride, 0x7fffffff);
489 sad_array[2] = vp9_sad8x8(src_ptr, src_stride,
490 ref_ptr[2], ref_stride, 0x7fffffff);
491 sad_array[3] = vp9_sad8x8(src_ptr, src_stride,
492 ref_ptr[3], ref_stride, 0x7fffffff);
495 void vp9_sad8x16x4d_c(const uint8_t *src_ptr,
497 const uint8_t* const ref_ptr[],
499 unsigned int *sad_array) {
500 sad_array[0] = vp9_sad8x16(src_ptr, src_stride,
501 ref_ptr[0], ref_stride, 0x7fffffff);
502 sad_array[1] = vp9_sad8x16(src_ptr, src_stride,
503 ref_ptr[1], ref_stride, 0x7fffffff);
504 sad_array[2] = vp9_sad8x16(src_ptr, src_stride,
505 ref_ptr[2], ref_stride, 0x7fffffff);
506 sad_array[3] = vp9_sad8x16(src_ptr, src_stride,
507 ref_ptr[3], ref_stride, 0x7fffffff);
510 void vp9_sad8x4x4d_c(const uint8_t *src_ptr,
512 const uint8_t* const ref_ptr[],
514 unsigned int *sad_array) {
515 sad_array[0] = vp9_sad8x4(src_ptr, src_stride,
516 ref_ptr[0], ref_stride, 0x7fffffff);
517 sad_array[1] = vp9_sad8x4(src_ptr, src_stride,
518 ref_ptr[1], ref_stride, 0x7fffffff);
519 sad_array[2] = vp9_sad8x4(src_ptr, src_stride,
520 ref_ptr[2], ref_stride, 0x7fffffff);
521 sad_array[3] = vp9_sad8x4(src_ptr, src_stride,
522 ref_ptr[3], ref_stride, 0x7fffffff);
525 void vp9_sad8x4x8_c(const uint8_t *src_ptr,
527 const uint8_t *ref_ptr,
529 uint32_t *sad_array) {
530 sad_array[0] = vp9_sad8x4(src_ptr, src_stride,
533 sad_array[1] = vp9_sad8x4(src_ptr, src_stride,
534 ref_ptr + 1, ref_stride,
536 sad_array[2] = vp9_sad8x4(src_ptr, src_stride,
537 ref_ptr + 2, ref_stride,
539 sad_array[3] = vp9_sad8x4(src_ptr, src_stride,
540 ref_ptr + 3, ref_stride,
542 sad_array[4] = vp9_sad8x4(src_ptr, src_stride,
543 ref_ptr + 4, ref_stride,
545 sad_array[5] = vp9_sad8x4(src_ptr, src_stride,
546 ref_ptr + 5, ref_stride,
548 sad_array[6] = vp9_sad8x4(src_ptr, src_stride,
549 ref_ptr + 6, ref_stride,
551 sad_array[7] = vp9_sad8x4(src_ptr, src_stride,
552 ref_ptr + 7, ref_stride,
556 void vp9_sad4x8x4d_c(const uint8_t *src_ptr,
558 const uint8_t* const ref_ptr[],
560 unsigned int *sad_array) {
561 sad_array[0] = vp9_sad4x8(src_ptr, src_stride,
562 ref_ptr[0], ref_stride, 0x7fffffff);
563 sad_array[1] = vp9_sad4x8(src_ptr, src_stride,
564 ref_ptr[1], ref_stride, 0x7fffffff);
565 sad_array[2] = vp9_sad4x8(src_ptr, src_stride,
566 ref_ptr[2], ref_stride, 0x7fffffff);
567 sad_array[3] = vp9_sad4x8(src_ptr, src_stride,
568 ref_ptr[3], ref_stride, 0x7fffffff);
571 void vp9_sad4x8x8_c(const uint8_t *src_ptr,
573 const uint8_t *ref_ptr,
575 uint32_t *sad_array) {
576 sad_array[0] = vp9_sad4x8(src_ptr, src_stride,
579 sad_array[1] = vp9_sad4x8(src_ptr, src_stride,
580 ref_ptr + 1, ref_stride,
582 sad_array[2] = vp9_sad4x8(src_ptr, src_stride,
583 ref_ptr + 2, ref_stride,
585 sad_array[3] = vp9_sad4x8(src_ptr, src_stride,
586 ref_ptr + 3, ref_stride,
588 sad_array[4] = vp9_sad4x8(src_ptr, src_stride,
589 ref_ptr + 4, ref_stride,
591 sad_array[5] = vp9_sad4x8(src_ptr, src_stride,
592 ref_ptr + 5, ref_stride,
594 sad_array[6] = vp9_sad4x8(src_ptr, src_stride,
595 ref_ptr + 6, ref_stride,
597 sad_array[7] = vp9_sad4x8(src_ptr, src_stride,
598 ref_ptr + 7, ref_stride,
602 void vp9_sad4x4x4d_c(const uint8_t *src_ptr,
604 const uint8_t* const ref_ptr[],
606 unsigned int *sad_array) {
607 sad_array[0] = vp9_sad4x4(src_ptr, src_stride,
608 ref_ptr[0], ref_stride, 0x7fffffff);
609 sad_array[1] = vp9_sad4x4(src_ptr, src_stride,
610 ref_ptr[1], ref_stride, 0x7fffffff);
611 sad_array[2] = vp9_sad4x4(src_ptr, src_stride,
612 ref_ptr[2], ref_stride, 0x7fffffff);
613 sad_array[3] = vp9_sad4x4(src_ptr, src_stride,
614 ref_ptr[3], ref_stride, 0x7fffffff);