/*
 * Copyright (c) 2016, Alliance for Open Media. All rights reserved.
 *
 * This source code is subject to the terms of the BSD 2 Clause License and
 * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License
 * was not distributed with this source code in the LICENSE file, you can
 * obtain it at www.aomedia.org/license/software. 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 www.aomedia.org/license/patent.
 */

#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"

/* Sum the difference between every corresponding element of the buffers. */
static INLINE unsigned int sad(const uint8_t *a, int a_stride, const uint8_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;
}

#define SADMXN(m, n)                                                          \
  unsigned int aom_sad##m##x##n##_c(const uint8_t *src, int src_stride,       \
                                    const uint8_t *ref, int ref_stride) {     \
    return sad(src, src_stride, ref, ref_stride, m, n);                       \
  }                                                                           \
  unsigned int aom_sad##m##x##n##_avg_c(const uint8_t *src, int src_stride,   \
                                        const uint8_t *ref, int ref_stride,   \
                                        const uint8_t *second_pred) {         \
    uint8_t comp_pred[m * n];                                                 \
    aom_comp_avg_pred(comp_pred, second_pred, m, n, ref, ref_stride);         \
    return sad(src, src_stride, comp_pred, m, m, n);                          \
  }                                                                           \
  unsigned int aom_dist_wtd_sad##m##x##n##_avg_c(                             \
      const uint8_t *src, int src_stride, const uint8_t *ref, int ref_stride, \
      const uint8_t *second_pred, const DIST_WTD_COMP_PARAMS *jcp_param) {    \
    uint8_t comp_pred[m * n];                                                 \
    aom_dist_wtd_comp_avg_pred_c(comp_pred, second_pred, m, n, ref,           \
                                 ref_stride, jcp_param);                      \
    return sad(src, src_stride, comp_pred, m, m, n);                          \
  }                                                                           \
  unsigned int aom_sad_skip_##m##x##n##_c(const uint8_t *src, int src_stride, \
                                          const uint8_t *ref,                 \
                                          int ref_stride) {                   \
    return 2 * sad(src, 2 * src_stride, ref, 2 * ref_stride, (m), (n / 2));   \
  }

// Calculate sad against 4 reference locations and store each in sad_array
#define SAD_MXNX4D(m, n)                                                      \
  void aom_sad##m##x##n##x4d_c(const uint8_t *src, int src_stride,            \
                               const uint8_t *const ref_array[4],             \
                               int ref_stride, uint32_t sad_array[4]) {       \
    int i;                                                                    \
    for (i = 0; i < 4; ++i) {                                                 \
      sad_array[i] =                                                          \
          aom_sad##m##x##n##_c(src, src_stride, ref_array[i], ref_stride);    \
    }                                                                         \
  }                                                                           \
  void aom_sad_skip_##m##x##n##x4d_c(const uint8_t *src, int src_stride,      \
                                     const uint8_t *const ref_array[4],       \
                                     int ref_stride, uint32_t sad_array[4]) { \
    int i;                                                                    \
    for (i = 0; i < 4; ++i) {                                                 \
      sad_array[i] = 2 * sad(src, 2 * src_stride, ref_array[i],               \
                             2 * ref_stride, (m), (n / 2));                   \
    }                                                                         \
  }
// Call SIMD version of aom_sad_mxnx4d if the 3d version is unavailable.
#define SAD_MXNX3D(m, n)                                                      \
  void aom_sad##m##x##n##x3d_c(const uint8_t *src, int src_stride,            \
                               const uint8_t *const ref_array[4],             \
                               int ref_stride, uint32_t sad_array[4]) {       \
    aom_sad##m##x##n##x4d(src, src_stride, ref_array, ref_stride, sad_array); \
  }

// 128x128
SADMXN(128, 128)
SAD_MXNX4D(128, 128)
SAD_MXNX3D(128, 128)

// 128x64
SADMXN(128, 64)
SAD_MXNX4D(128, 64)
SAD_MXNX3D(128, 64)

// 64x128
SADMXN(64, 128)
SAD_MXNX4D(64, 128)
SAD_MXNX3D(64, 128)

// 64x64
SADMXN(64, 64)
SAD_MXNX4D(64, 64)
SAD_MXNX3D(64, 64)

// 64x32
SADMXN(64, 32)
SAD_MXNX4D(64, 32)
SAD_MXNX3D(64, 32)

// 32x64
SADMXN(32, 64)
SAD_MXNX4D(32, 64)
SAD_MXNX3D(32, 64)

// 32x32
SADMXN(32, 32)
SAD_MXNX4D(32, 32)
SAD_MXNX3D(32, 32)

// 32x16
SADMXN(32, 16)
SAD_MXNX4D(32, 16)
SAD_MXNX3D(32, 16)

// 16x32
SADMXN(16, 32)
SAD_MXNX4D(16, 32)
SAD_MXNX3D(16, 32)

// 16x16
SADMXN(16, 16)
SAD_MXNX4D(16, 16)
SAD_MXNX3D(16, 16)

// 16x8
SADMXN(16, 8)
SAD_MXNX4D(16, 8)
SAD_MXNX3D(16, 8)

// 8x16
SADMXN(8, 16)
SAD_MXNX4D(8, 16)
SAD_MXNX3D(8, 16)

// 8x8
SADMXN(8, 8)
SAD_MXNX4D(8, 8)
SAD_MXNX3D(8, 8)

// 8x4
SADMXN(8, 4)
SAD_MXNX4D(8, 4)
SAD_MXNX3D(8, 4)

// 4x8
SADMXN(4, 8)
SAD_MXNX4D(4, 8)
SAD_MXNX3D(4, 8)

// 4x4
SADMXN(4, 4)
SAD_MXNX4D(4, 4)
SAD_MXNX3D(4, 4)

#if !CONFIG_REALTIME_ONLY
SADMXN(4, 16)
SAD_MXNX4D(4, 16)
SADMXN(16, 4)
SAD_MXNX4D(16, 4)
SADMXN(8, 32)
SAD_MXNX4D(8, 32)
SADMXN(32, 8)
SAD_MXNX4D(32, 8)
SADMXN(16, 64)
SAD_MXNX4D(16, 64)
SADMXN(64, 16)
SAD_MXNX4D(64, 16)
SAD_MXNX3D(4, 16)
SAD_MXNX3D(16, 4)
SAD_MXNX3D(8, 32)
SAD_MXNX3D(32, 8)
SAD_MXNX3D(16, 64)
SAD_MXNX3D(64, 16)
#endif  // !CONFIG_REALTIME_ONLY

#if CONFIG_AV1_HIGHBITDEPTH
static INLINE unsigned int highbd_sad(const uint8_t *a8, int a_stride,
                                      const uint8_t *b8, int b_stride,
                                      int width, int height) {
  int y, x;
  unsigned int sad = 0;
  const uint16_t *a = CONVERT_TO_SHORTPTR(a8);
  const uint16_t *b = CONVERT_TO_SHORTPTR(b8);
  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;
}

static INLINE unsigned int highbd_sadb(const uint8_t *a8, int a_stride,
                                       const uint8_t *b8, int b_stride,
                                       int width, int height) {
  int y, x;
  unsigned int sad = 0;
  const uint16_t *a = CONVERT_TO_SHORTPTR(a8);
  const uint16_t *b = CONVERT_TO_SHORTPTR(b8);
  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;
}

#define HIGHBD_SADMXN(m, n)                                                    \
  unsigned int aom_highbd_sad##m##x##n##_c(const uint8_t *src, int src_stride, \
                                           const uint8_t *ref,                 \
                                           int ref_stride) {                   \
    return highbd_sad(src, src_stride, ref, ref_stride, m, n);                 \
  }                                                                            \
  unsigned int aom_highbd_sad##m##x##n##_avg_c(                                \
      const uint8_t *src, int src_stride, const uint8_t *ref, int ref_stride,  \
      const uint8_t *second_pred) {                                            \
    uint16_t comp_pred[m * n];                                                 \
    uint8_t *const comp_pred8 = CONVERT_TO_BYTEPTR(comp_pred);                 \
    aom_highbd_comp_avg_pred(comp_pred8, second_pred, m, n, ref, ref_stride);  \
    return highbd_sadb(src, src_stride, comp_pred8, m, m, n);                  \
  }                                                                            \
  unsigned int aom_highbd_dist_wtd_sad##m##x##n##_avg_c(                       \
      const uint8_t *src, int src_stride, const uint8_t *ref, int ref_stride,  \
      const uint8_t *second_pred, const DIST_WTD_COMP_PARAMS *jcp_param) {     \
    uint16_t comp_pred[m * n];                                                 \
    uint8_t *const comp_pred8 = CONVERT_TO_BYTEPTR(comp_pred);                 \
    aom_highbd_dist_wtd_comp_avg_pred(comp_pred8, second_pred, m, n, ref,      \
                                      ref_stride, jcp_param);                  \
    return highbd_sadb(src, src_stride, comp_pred8, m, m, n);                  \
  }                                                                            \
  unsigned int aom_highbd_sad_skip_##m##x##n##_c(                              \
      const uint8_t *src, int src_stride, const uint8_t *ref,                  \
      int ref_stride) {                                                        \
    return 2 *                                                                 \
           highbd_sad(src, 2 * src_stride, ref, 2 * ref_stride, (m), (n / 2)); \
  }

#define HIGHBD_SAD_MXNX4D(m, n)                                                \
  void aom_highbd_sad##m##x##n##x4d_c(const uint8_t *src, int src_stride,      \
                                      const uint8_t *const ref_array[4],       \
                                      int ref_stride, uint32_t sad_array[4]) { \
    int i;                                                                     \
    for (i = 0; i < 4; ++i) {                                                  \
      sad_array[i] = aom_highbd_sad##m##x##n##_c(src, src_stride,              \
                                                 ref_array[i], ref_stride);    \
    }                                                                          \
  }                                                                            \
  void aom_highbd_sad_skip_##m##x##n##x4d_c(                                   \
      const uint8_t *src, int src_stride, const uint8_t *const ref_array[4],   \
      int ref_stride, uint32_t sad_array[4]) {                                 \
    int i;                                                                     \
    for (i = 0; i < 4; ++i) {                                                  \
      sad_array[i] = 2 * highbd_sad(src, 2 * src_stride, ref_array[i],         \
                                    2 * ref_stride, (m), (n / 2));             \
    }                                                                          \
  }
// Call SIMD version of aom_highbd_sad_mxnx4d if the 3d version is unavailable.
#define HIGHBD_SAD_MXNX3D(m, n)                                                \
  void aom_highbd_sad##m##x##n##x3d_c(const uint8_t *src, int src_stride,      \
                                      const uint8_t *const ref_array[4],       \
                                      int ref_stride, uint32_t sad_array[4]) { \
    aom_highbd_sad##m##x##n##x4d(src, src_stride, ref_array, ref_stride,       \
                                 sad_array);                                   \
  }

// 128x128
HIGHBD_SADMXN(128, 128)
HIGHBD_SAD_MXNX4D(128, 128)
HIGHBD_SAD_MXNX3D(128, 128)

// 128x64
HIGHBD_SADMXN(128, 64)
HIGHBD_SAD_MXNX4D(128, 64)
HIGHBD_SAD_MXNX3D(128, 64)

// 64x128
HIGHBD_SADMXN(64, 128)
HIGHBD_SAD_MXNX4D(64, 128)
HIGHBD_SAD_MXNX3D(64, 128)

// 64x64
HIGHBD_SADMXN(64, 64)
HIGHBD_SAD_MXNX4D(64, 64)
HIGHBD_SAD_MXNX3D(64, 64)

// 64x32
HIGHBD_SADMXN(64, 32)
HIGHBD_SAD_MXNX4D(64, 32)
HIGHBD_SAD_MXNX3D(64, 32)

// 32x64
HIGHBD_SADMXN(32, 64)
HIGHBD_SAD_MXNX4D(32, 64)
HIGHBD_SAD_MXNX3D(32, 64)

// 32x32
HIGHBD_SADMXN(32, 32)
HIGHBD_SAD_MXNX4D(32, 32)
HIGHBD_SAD_MXNX3D(32, 32)

// 32x16
HIGHBD_SADMXN(32, 16)
HIGHBD_SAD_MXNX4D(32, 16)
HIGHBD_SAD_MXNX3D(32, 16)

// 16x32
HIGHBD_SADMXN(16, 32)
HIGHBD_SAD_MXNX4D(16, 32)
HIGHBD_SAD_MXNX3D(16, 32)

// 16x16
HIGHBD_SADMXN(16, 16)
HIGHBD_SAD_MXNX4D(16, 16)
HIGHBD_SAD_MXNX3D(16, 16)

// 16x8
HIGHBD_SADMXN(16, 8)
HIGHBD_SAD_MXNX4D(16, 8)
HIGHBD_SAD_MXNX3D(16, 8)

// 8x16
HIGHBD_SADMXN(8, 16)
HIGHBD_SAD_MXNX4D(8, 16)
HIGHBD_SAD_MXNX3D(8, 16)

// 8x8
HIGHBD_SADMXN(8, 8)
HIGHBD_SAD_MXNX4D(8, 8)
HIGHBD_SAD_MXNX3D(8, 8)

// 8x4
HIGHBD_SADMXN(8, 4)
HIGHBD_SAD_MXNX4D(8, 4)
HIGHBD_SAD_MXNX3D(8, 4)

// 4x8
HIGHBD_SADMXN(4, 8)
HIGHBD_SAD_MXNX4D(4, 8)
HIGHBD_SAD_MXNX3D(4, 8)

// 4x4
HIGHBD_SADMXN(4, 4)
HIGHBD_SAD_MXNX4D(4, 4)
HIGHBD_SAD_MXNX3D(4, 4)

#if !CONFIG_REALTIME_ONLY
HIGHBD_SADMXN(4, 16)
HIGHBD_SAD_MXNX4D(4, 16)
HIGHBD_SADMXN(16, 4)
HIGHBD_SAD_MXNX4D(16, 4)
HIGHBD_SADMXN(8, 32)
HIGHBD_SAD_MXNX4D(8, 32)
HIGHBD_SADMXN(32, 8)
HIGHBD_SAD_MXNX4D(32, 8)
HIGHBD_SADMXN(16, 64)
HIGHBD_SAD_MXNX4D(16, 64)
HIGHBD_SADMXN(64, 16)
HIGHBD_SAD_MXNX4D(64, 16)

HIGHBD_SAD_MXNX3D(4, 16)
HIGHBD_SAD_MXNX3D(16, 4)
HIGHBD_SAD_MXNX3D(8, 32)
HIGHBD_SAD_MXNX3D(32, 8)
HIGHBD_SAD_MXNX3D(16, 64)
HIGHBD_SAD_MXNX3D(64, 16)
#endif  // !CONFIG_REALTIME_ONLY
#endif  // CONFIG_AV1_HIGHBITDEPTH
