/*
 * Copyright (c) 2021, Alliance for Open Media. All rights reserved
 *
 * This source code is subject to the terms of the BSD 3-Clause Clear License
 * and the Alliance for Open Media Patent License 1.0. If the BSD 3-Clause Clear
 * License was not distributed with this source code in the LICENSE file, you
 * can obtain it at aomedia.org/license/software-license/bsd-3-c-c/.  If the
 * Alliance for Open Media Patent License 1.0 was not distributed with this
 * source code in the PATENTS file, you can obtain it at
 * aomedia.org/license/patent-license/.
 */

#include <stdlib.h>

#include "config/aom_config.h"
#include "config/aom_dsp_rtcd.h"

#include "aom/aom_integer.h"
#include "aom_ports/mem.h"
#include "aom_dsp/blend.h"

static INLINE unsigned int highbd_sad(const uint16_t *a, int a_stride,
                                      const uint16_t *b, int b_stride,
                                      int width, int height) {
  int y, x;
  unsigned int sad = 0;
  for (y = 0; y < height; y++) {
    for (x = 0; x < width; x++) {
      sad += abs(a[x] - b[x]);
    }

    a += a_stride;
    b += b_stride;
  }
  return sad;
}

#if CONFIG_SUBBLK_REF_DS
static INLINE unsigned int highbd_sad_ds(const uint16_t *a, int a_stride,
                                         const uint16_t *b, int b_stride,
                                         int width, int height) {
  int y, x;
  unsigned int sad = 0;
  for (y = 0; y < height; y += 2) {
    for (x = 0; x < width; x++) {
      sad += abs(a[x] - b[x]);
    }

    a += a_stride;
    b += b_stride;
  }
  return sad;
}
#endif  // CONFIG_SUBBLK_REF_DS

#define highbd_sadMxN(m, n)                                     \
  unsigned int aom_highbd_sad##m##x##n##_c(                     \
      const uint16_t *src, int src_stride, const uint16_t *ref, \
      int ref_stride) {                                         \
    return highbd_sad(src, src_stride, ref, ref_stride, m, n);  \
  }

#if CONFIG_SUBBLK_REF_DS
#define highbd_sadMxN_ds(m, n)                                    \
  unsigned int aom_highbd_sad##m##x##n##_ds_c(                    \
      const uint16_t *src, int src_stride, const uint16_t *ref,   \
      int ref_stride) {                                           \
    return highbd_sad_ds(src, src_stride, ref, ref_stride, m, n); \
  }
highbd_sadMxN_ds(16, 16);
highbd_sadMxN_ds(16, 8);
highbd_sadMxN_ds(8, 8);
highbd_sadMxN_ds(8, 16);
highbd_sadMxN_ds(12, 20);
highbd_sadMxN_ds(20, 12);
highbd_sadMxN_ds(12, 12);
highbd_sadMxN_ds(20, 20);
#endif  // CONFIG_SUBBLK_REF_DS

#if CONFIG_BLOCK_256
// 256X256
highbd_sadMxN(256, 256);

// 256X128
highbd_sadMxN(256, 128);

// 128X256
highbd_sadMxN(128, 256);
#endif  // CONFIG_BLOCK_256

// 128x128
highbd_sadMxN(128, 128);

// 128x64
highbd_sadMxN(128, 64);

// 64x128
highbd_sadMxN(64, 128);

// 64x64
highbd_sadMxN(64, 64);

// 64x32
highbd_sadMxN(64, 32);

// 32x64
highbd_sadMxN(32, 64);

// 32x32
highbd_sadMxN(32, 32);

// 32x16
highbd_sadMxN(32, 16);

// 16x32
highbd_sadMxN(16, 32);

// 16x16
highbd_sadMxN(16, 16);

// 16x8
highbd_sadMxN(16, 8);

// 8x16
highbd_sadMxN(8, 16);

// 8x8
highbd_sadMxN(8, 8);

// 8x4
highbd_sadMxN(8, 4);

// 4x8
highbd_sadMxN(4, 8);

// 4x4
highbd_sadMxN(4, 4);

#if CONFIG_SUBBLK_REF_EXT
highbd_sadMxN(12, 12);
highbd_sadMxN(12, 20);
highbd_sadMxN(20, 12);
highbd_sadMxN(20, 20);
#endif  // CONFIG_SUBBLK_REF_EXT

highbd_sadMxN(4, 16);
highbd_sadMxN(16, 4);
highbd_sadMxN(8, 32);
highbd_sadMxN(32, 8);
highbd_sadMxN(16, 64);
highbd_sadMxN(64, 16);

#if CONFIG_FLEX_PARTITION
highbd_sadMxN(4, 32);
highbd_sadMxN(32, 4);
highbd_sadMxN(8, 64);
highbd_sadMxN(64, 8);
highbd_sadMxN(4, 64);
highbd_sadMxN(64, 4);
#endif  // CONFIG_FLEX_PARTITION
