17ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian/*
27ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian *  Copyright (c) 2015 The WebM project authors. All Rights Reserved.
37ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian *
47ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian *  Use of this source code is governed by a BSD-style license
57ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian *  that can be found in the LICENSE file in the root of the source
67ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian *  tree. An additional intellectual property rights grant can be found
77ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian *  in the file PATENTS.  All contributing project authors may
87ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian *  be found in the AUTHORS file in the root of the source tree.
97ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian */
107ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian
117ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian#include <stdlib.h>
127ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian
137ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian#include "./vpx_config.h"
147ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian#include "./vpx_dsp_rtcd.h"
157ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian
167ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian#include "vpx/vpx_integer.h"
177ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian#include "vpx_ports/mem.h"
187ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian
197ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian/* Sum the difference between every corresponding element of the buffers. */
207bc9febe8749e98a3812a0dc4380ceae75c29450Johannstatic INLINE unsigned int sad(const uint8_t *a, int a_stride, const uint8_t *b,
217bc9febe8749e98a3812a0dc4380ceae75c29450Johann                               int b_stride, int width, int height) {
227ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  int y, x;
237ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  unsigned int sad = 0;
247ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian
257ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  for (y = 0; y < height; y++) {
267bc9febe8749e98a3812a0dc4380ceae75c29450Johann    for (x = 0; x < width; x++) sad += abs(a[x] - b[x]);
277ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian
287ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    a += a_stride;
297ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    b += b_stride;
307ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  }
317ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  return sad;
327ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian}
337ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian
347bc9febe8749e98a3812a0dc4380ceae75c29450Johann#define sadMxN(m, n)                                                        \
357bc9febe8749e98a3812a0dc4380ceae75c29450Johann  unsigned int vpx_sad##m##x##n##_c(const uint8_t *src, int src_stride,     \
367bc9febe8749e98a3812a0dc4380ceae75c29450Johann                                    const uint8_t *ref, int ref_stride) {   \
377bc9febe8749e98a3812a0dc4380ceae75c29450Johann    return sad(src, src_stride, ref, ref_stride, m, n);                     \
387bc9febe8749e98a3812a0dc4380ceae75c29450Johann  }                                                                         \
397bc9febe8749e98a3812a0dc4380ceae75c29450Johann  unsigned int vpx_sad##m##x##n##_avg_c(const uint8_t *src, int src_stride, \
407bc9febe8749e98a3812a0dc4380ceae75c29450Johann                                        const uint8_t *ref, int ref_stride, \
417bc9febe8749e98a3812a0dc4380ceae75c29450Johann                                        const uint8_t *second_pred) {       \
428b92989c89bec8632aa47dc58dc162f199d62edcJames Zern    DECLARE_ALIGNED(16, uint8_t, comp_pred[m * n]);                         \
437bc9febe8749e98a3812a0dc4380ceae75c29450Johann    vpx_comp_avg_pred_c(comp_pred, second_pred, m, n, ref, ref_stride);     \
447bc9febe8749e98a3812a0dc4380ceae75c29450Johann    return sad(src, src_stride, comp_pred, m, m, n);                        \
457bc9febe8749e98a3812a0dc4380ceae75c29450Johann  }
467ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian
477ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian// depending on call sites, pass **ref_array to avoid & in subsequent call and
487ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian// de-dup with 4D below.
497bc9febe8749e98a3812a0dc4380ceae75c29450Johann#define sadMxNxK(m, n, k)                                                   \
507bc9febe8749e98a3812a0dc4380ceae75c29450Johann  void vpx_sad##m##x##n##x##k##_c(const uint8_t *src, int src_stride,       \
517bc9febe8749e98a3812a0dc4380ceae75c29450Johann                                  const uint8_t *ref_array, int ref_stride, \
527bc9febe8749e98a3812a0dc4380ceae75c29450Johann                                  uint32_t *sad_array) {                    \
537bc9febe8749e98a3812a0dc4380ceae75c29450Johann    int i;                                                                  \
547bc9febe8749e98a3812a0dc4380ceae75c29450Johann    for (i = 0; i < k; ++i)                                                 \
557bc9febe8749e98a3812a0dc4380ceae75c29450Johann      sad_array[i] =                                                        \
567bc9febe8749e98a3812a0dc4380ceae75c29450Johann          vpx_sad##m##x##n##_c(src, src_stride, &ref_array[i], ref_stride); \
577bc9febe8749e98a3812a0dc4380ceae75c29450Johann  }
587ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian
597ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian// This appears to be equivalent to the above when k == 4 and refs is const
607bc9febe8749e98a3812a0dc4380ceae75c29450Johann#define sadMxNx4D(m, n)                                                    \
617bc9febe8749e98a3812a0dc4380ceae75c29450Johann  void vpx_sad##m##x##n##x4d_c(const uint8_t *src, int src_stride,         \
627bc9febe8749e98a3812a0dc4380ceae75c29450Johann                               const uint8_t *const ref_array[],           \
637bc9febe8749e98a3812a0dc4380ceae75c29450Johann                               int ref_stride, uint32_t *sad_array) {      \
647bc9febe8749e98a3812a0dc4380ceae75c29450Johann    int i;                                                                 \
657bc9febe8749e98a3812a0dc4380ceae75c29450Johann    for (i = 0; i < 4; ++i)                                                \
667bc9febe8749e98a3812a0dc4380ceae75c29450Johann      sad_array[i] =                                                       \
677bc9febe8749e98a3812a0dc4380ceae75c29450Johann          vpx_sad##m##x##n##_c(src, src_stride, ref_array[i], ref_stride); \
687bc9febe8749e98a3812a0dc4380ceae75c29450Johann  }
697ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian
707bc9febe8749e98a3812a0dc4380ceae75c29450Johann/* clang-format off */
717ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian// 64x64
727ce0a1d1337c01056ba24006efab21f00e179e04Vignesh VenkatasubramaniansadMxN(64, 64)
737ce0a1d1337c01056ba24006efab21f00e179e04Vignesh VenkatasubramaniansadMxNxK(64, 64, 3)
747ce0a1d1337c01056ba24006efab21f00e179e04Vignesh VenkatasubramaniansadMxNxK(64, 64, 8)
757ce0a1d1337c01056ba24006efab21f00e179e04Vignesh VenkatasubramaniansadMxNx4D(64, 64)
767ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian
777ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian// 64x32
787ce0a1d1337c01056ba24006efab21f00e179e04Vignesh VenkatasubramaniansadMxN(64, 32)
797ce0a1d1337c01056ba24006efab21f00e179e04Vignesh VenkatasubramaniansadMxNx4D(64, 32)
807ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian
817ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian// 32x64
827ce0a1d1337c01056ba24006efab21f00e179e04Vignesh VenkatasubramaniansadMxN(32, 64)
837ce0a1d1337c01056ba24006efab21f00e179e04Vignesh VenkatasubramaniansadMxNx4D(32, 64)
847ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian
857ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian// 32x32
867ce0a1d1337c01056ba24006efab21f00e179e04Vignesh VenkatasubramaniansadMxN(32, 32)
877ce0a1d1337c01056ba24006efab21f00e179e04Vignesh VenkatasubramaniansadMxNxK(32, 32, 3)
887ce0a1d1337c01056ba24006efab21f00e179e04Vignesh VenkatasubramaniansadMxNxK(32, 32, 8)
897ce0a1d1337c01056ba24006efab21f00e179e04Vignesh VenkatasubramaniansadMxNx4D(32, 32)
907ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian
917ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian// 32x16
927ce0a1d1337c01056ba24006efab21f00e179e04Vignesh VenkatasubramaniansadMxN(32, 16)
937ce0a1d1337c01056ba24006efab21f00e179e04Vignesh VenkatasubramaniansadMxNx4D(32, 16)
947ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian
957ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian// 16x32
967ce0a1d1337c01056ba24006efab21f00e179e04Vignesh VenkatasubramaniansadMxN(16, 32)
977ce0a1d1337c01056ba24006efab21f00e179e04Vignesh VenkatasubramaniansadMxNx4D(16, 32)
987ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian
997ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian// 16x16
1007ce0a1d1337c01056ba24006efab21f00e179e04Vignesh VenkatasubramaniansadMxN(16, 16)
1017ce0a1d1337c01056ba24006efab21f00e179e04Vignesh VenkatasubramaniansadMxNxK(16, 16, 3)
1027ce0a1d1337c01056ba24006efab21f00e179e04Vignesh VenkatasubramaniansadMxNxK(16, 16, 8)
1037ce0a1d1337c01056ba24006efab21f00e179e04Vignesh VenkatasubramaniansadMxNx4D(16, 16)
1047ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian
1057ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian// 16x8
1067ce0a1d1337c01056ba24006efab21f00e179e04Vignesh VenkatasubramaniansadMxN(16, 8)
1077ce0a1d1337c01056ba24006efab21f00e179e04Vignesh VenkatasubramaniansadMxNxK(16, 8, 3)
1087ce0a1d1337c01056ba24006efab21f00e179e04Vignesh VenkatasubramaniansadMxNxK(16, 8, 8)
1097ce0a1d1337c01056ba24006efab21f00e179e04Vignesh VenkatasubramaniansadMxNx4D(16, 8)
1107ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian
1117ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian// 8x16
1127ce0a1d1337c01056ba24006efab21f00e179e04Vignesh VenkatasubramaniansadMxN(8, 16)
1137ce0a1d1337c01056ba24006efab21f00e179e04Vignesh VenkatasubramaniansadMxNxK(8, 16, 3)
1147ce0a1d1337c01056ba24006efab21f00e179e04Vignesh VenkatasubramaniansadMxNxK(8, 16, 8)
1157ce0a1d1337c01056ba24006efab21f00e179e04Vignesh VenkatasubramaniansadMxNx4D(8, 16)
1167ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian
1177ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian// 8x8
1187ce0a1d1337c01056ba24006efab21f00e179e04Vignesh VenkatasubramaniansadMxN(8, 8)
1197ce0a1d1337c01056ba24006efab21f00e179e04Vignesh VenkatasubramaniansadMxNxK(8, 8, 3)
1207ce0a1d1337c01056ba24006efab21f00e179e04Vignesh VenkatasubramaniansadMxNxK(8, 8, 8)
1217ce0a1d1337c01056ba24006efab21f00e179e04Vignesh VenkatasubramaniansadMxNx4D(8, 8)
1227ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian
1237ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian// 8x4
1247ce0a1d1337c01056ba24006efab21f00e179e04Vignesh VenkatasubramaniansadMxN(8, 4)
1257ce0a1d1337c01056ba24006efab21f00e179e04Vignesh VenkatasubramaniansadMxNxK(8, 4, 8)
1267ce0a1d1337c01056ba24006efab21f00e179e04Vignesh VenkatasubramaniansadMxNx4D(8, 4)
1277ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian
1287ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian// 4x8
1297ce0a1d1337c01056ba24006efab21f00e179e04Vignesh VenkatasubramaniansadMxN(4, 8)
1307ce0a1d1337c01056ba24006efab21f00e179e04Vignesh VenkatasubramaniansadMxNxK(4, 8, 8)
1317ce0a1d1337c01056ba24006efab21f00e179e04Vignesh VenkatasubramaniansadMxNx4D(4, 8)
1327ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian
1337ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian// 4x4
1347ce0a1d1337c01056ba24006efab21f00e179e04Vignesh VenkatasubramaniansadMxN(4, 4)
1357ce0a1d1337c01056ba24006efab21f00e179e04Vignesh VenkatasubramaniansadMxNxK(4, 4, 3)
1367ce0a1d1337c01056ba24006efab21f00e179e04Vignesh VenkatasubramaniansadMxNxK(4, 4, 8)
1377ce0a1d1337c01056ba24006efab21f00e179e04Vignesh VenkatasubramaniansadMxNx4D(4, 4)
1387bc9febe8749e98a3812a0dc4380ceae75c29450Johann/* clang-format on */
1397ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian
1407ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian#if CONFIG_VP9_HIGHBITDEPTH
1417bc9febe8749e98a3812a0dc4380ceae75c29450Johann        static INLINE
1427bc9febe8749e98a3812a0dc4380ceae75c29450Johann    unsigned int highbd_sad(const uint8_t *a8, int a_stride, const uint8_t *b8,
1437bc9febe8749e98a3812a0dc4380ceae75c29450Johann                            int b_stride, int width, int height) {
1447ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  int y, x;
1457ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  unsigned int sad = 0;
1467ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  const uint16_t *a = CONVERT_TO_SHORTPTR(a8);
1477ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  const uint16_t *b = CONVERT_TO_SHORTPTR(b8);
1487ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  for (y = 0; y < height; y++) {
1497bc9febe8749e98a3812a0dc4380ceae75c29450Johann    for (x = 0; x < width; x++) sad += abs(a[x] - b[x]);
1507ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian
1517ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    a += a_stride;
1527ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    b += b_stride;
1537ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  }
1547ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  return sad;
1557ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian}
1567ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian
1577ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanianstatic INLINE unsigned int highbd_sadb(const uint8_t *a8, int a_stride,
1587ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian                                       const uint16_t *b, int b_stride,
1597ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian                                       int width, int height) {
1607ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  int y, x;
1617ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  unsigned int sad = 0;
1627ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  const uint16_t *a = CONVERT_TO_SHORTPTR(a8);
1637ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  for (y = 0; y < height; y++) {
1647bc9febe8749e98a3812a0dc4380ceae75c29450Johann    for (x = 0; x < width; x++) sad += abs(a[x] - b[x]);
1657ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian
1667ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    a += a_stride;
1677ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    b += b_stride;
1687ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  }
1697ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  return sad;
1707ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian}
1717ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian
1727bc9febe8749e98a3812a0dc4380ceae75c29450Johann#define highbd_sadMxN(m, n)                                                    \
1737bc9febe8749e98a3812a0dc4380ceae75c29450Johann  unsigned int vpx_highbd_sad##m##x##n##_c(const uint8_t *src, int src_stride, \
1747bc9febe8749e98a3812a0dc4380ceae75c29450Johann                                           const uint8_t *ref,                 \
1757bc9febe8749e98a3812a0dc4380ceae75c29450Johann                                           int ref_stride) {                   \
1767bc9febe8749e98a3812a0dc4380ceae75c29450Johann    return highbd_sad(src, src_stride, ref, ref_stride, m, n);                 \
1777bc9febe8749e98a3812a0dc4380ceae75c29450Johann  }                                                                            \
1787bc9febe8749e98a3812a0dc4380ceae75c29450Johann  unsigned int vpx_highbd_sad##m##x##n##_avg_c(                                \
1797bc9febe8749e98a3812a0dc4380ceae75c29450Johann      const uint8_t *src, int src_stride, const uint8_t *ref, int ref_stride,  \
1807bc9febe8749e98a3812a0dc4380ceae75c29450Johann      const uint8_t *second_pred) {                                            \
1818b92989c89bec8632aa47dc58dc162f199d62edcJames Zern    DECLARE_ALIGNED(16, uint16_t, comp_pred[m * n]);                           \
1827bc9febe8749e98a3812a0dc4380ceae75c29450Johann    vpx_highbd_comp_avg_pred_c(comp_pred, second_pred, m, n, ref, ref_stride); \
1837bc9febe8749e98a3812a0dc4380ceae75c29450Johann    return highbd_sadb(src, src_stride, comp_pred, m, m, n);                   \
1847bc9febe8749e98a3812a0dc4380ceae75c29450Johann  }
1857ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian
1867bc9febe8749e98a3812a0dc4380ceae75c29450Johann#define highbd_sadMxNxK(m, n, k)                                             \
1877bc9febe8749e98a3812a0dc4380ceae75c29450Johann  void vpx_highbd_sad##m##x##n##x##k##_c(                                    \
1887bc9febe8749e98a3812a0dc4380ceae75c29450Johann      const uint8_t *src, int src_stride, const uint8_t *ref_array,          \
1897bc9febe8749e98a3812a0dc4380ceae75c29450Johann      int ref_stride, uint32_t *sad_array) {                                 \
1907bc9febe8749e98a3812a0dc4380ceae75c29450Johann    int i;                                                                   \
1917bc9febe8749e98a3812a0dc4380ceae75c29450Johann    for (i = 0; i < k; ++i) {                                                \
1927bc9febe8749e98a3812a0dc4380ceae75c29450Johann      sad_array[i] = vpx_highbd_sad##m##x##n##_c(src, src_stride,            \
1937bc9febe8749e98a3812a0dc4380ceae75c29450Johann                                                 &ref_array[i], ref_stride); \
1947bc9febe8749e98a3812a0dc4380ceae75c29450Johann    }                                                                        \
1957bc9febe8749e98a3812a0dc4380ceae75c29450Johann  }
1967ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian
1977bc9febe8749e98a3812a0dc4380ceae75c29450Johann#define highbd_sadMxNx4D(m, n)                                               \
1987bc9febe8749e98a3812a0dc4380ceae75c29450Johann  void vpx_highbd_sad##m##x##n##x4d_c(const uint8_t *src, int src_stride,    \
1997bc9febe8749e98a3812a0dc4380ceae75c29450Johann                                      const uint8_t *const ref_array[],      \
2007bc9febe8749e98a3812a0dc4380ceae75c29450Johann                                      int ref_stride, uint32_t *sad_array) { \
2017bc9febe8749e98a3812a0dc4380ceae75c29450Johann    int i;                                                                   \
2027bc9febe8749e98a3812a0dc4380ceae75c29450Johann    for (i = 0; i < 4; ++i) {                                                \
2037bc9febe8749e98a3812a0dc4380ceae75c29450Johann      sad_array[i] = vpx_highbd_sad##m##x##n##_c(src, src_stride,            \
2047bc9febe8749e98a3812a0dc4380ceae75c29450Johann                                                 ref_array[i], ref_stride);  \
2057bc9febe8749e98a3812a0dc4380ceae75c29450Johann    }                                                                        \
2067bc9febe8749e98a3812a0dc4380ceae75c29450Johann  }
2077ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian
2087bc9febe8749e98a3812a0dc4380ceae75c29450Johann/* clang-format off */
2097ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian// 64x64
2107ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanianhighbd_sadMxN(64, 64)
2117ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanianhighbd_sadMxNxK(64, 64, 3)
2127ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanianhighbd_sadMxNxK(64, 64, 8)
2137ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanianhighbd_sadMxNx4D(64, 64)
2147ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian
2157ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian// 64x32
2167ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanianhighbd_sadMxN(64, 32)
2177ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanianhighbd_sadMxNx4D(64, 32)
2187ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian
2197ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian// 32x64
2207ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanianhighbd_sadMxN(32, 64)
2217ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanianhighbd_sadMxNx4D(32, 64)
2227ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian
2237ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian// 32x32
2247ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanianhighbd_sadMxN(32, 32)
2257ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanianhighbd_sadMxNxK(32, 32, 3)
2267ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanianhighbd_sadMxNxK(32, 32, 8)
2277ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanianhighbd_sadMxNx4D(32, 32)
2287ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian
2297ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian// 32x16
2307ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanianhighbd_sadMxN(32, 16)
2317ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanianhighbd_sadMxNx4D(32, 16)
2327ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian
2337ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian// 16x32
2347ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanianhighbd_sadMxN(16, 32)
2357ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanianhighbd_sadMxNx4D(16, 32)
2367ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian
2377ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian// 16x16
2387ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanianhighbd_sadMxN(16, 16)
2397ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanianhighbd_sadMxNxK(16, 16, 3)
2407ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanianhighbd_sadMxNxK(16, 16, 8)
2417ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanianhighbd_sadMxNx4D(16, 16)
2427ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian
2437ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian// 16x8
2447ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanianhighbd_sadMxN(16, 8)
2457ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanianhighbd_sadMxNxK(16, 8, 3)
2467ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanianhighbd_sadMxNxK(16, 8, 8)
2477ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanianhighbd_sadMxNx4D(16, 8)
2487ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian
2497ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian// 8x16
2507ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanianhighbd_sadMxN(8, 16)
2517ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanianhighbd_sadMxNxK(8, 16, 3)
2527ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanianhighbd_sadMxNxK(8, 16, 8)
2537ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanianhighbd_sadMxNx4D(8, 16)
2547ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian
2557ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian// 8x8
2567ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanianhighbd_sadMxN(8, 8)
2577ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanianhighbd_sadMxNxK(8, 8, 3)
2587ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanianhighbd_sadMxNxK(8, 8, 8)
2597ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanianhighbd_sadMxNx4D(8, 8)
2607ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian
2617ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian// 8x4
2627ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanianhighbd_sadMxN(8, 4)
2637ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanianhighbd_sadMxNxK(8, 4, 8)
2647ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanianhighbd_sadMxNx4D(8, 4)
2657ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian
2667ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian// 4x8
2677ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanianhighbd_sadMxN(4, 8)
2687ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanianhighbd_sadMxNxK(4, 8, 8)
2697ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanianhighbd_sadMxNx4D(4, 8)
2707ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian
2717ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian// 4x4
2727ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanianhighbd_sadMxN(4, 4)
2737ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanianhighbd_sadMxNxK(4, 4, 3)
2747ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanianhighbd_sadMxNxK(4, 4, 8)
2757ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanianhighbd_sadMxNx4D(4, 4)
2767bc9febe8749e98a3812a0dc4380ceae75c29450Johann/* clang-format on */
2777ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian
2787ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian#endif  // CONFIG_VP9_HIGHBITDEPTH
279