/*
 * 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 <math.h>
#include <stdlib.h>

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

#include "av1/common/cdef.h"
/*
This is Cdef_Directions (section 7.15.3) with 2 padding entries at the
beginning and end of the table. The cdef direction range is [0, 7] and the
first index is offset +/-2. This removes the need to constrain the first
index to the same range using e.g., & 7.
*/
DECLARE_ALIGNED(16, const int, cdef_directions_padded[12][2]) = {
  /* Padding: cdef_directions[6] */
  { 1 * CDEF_BSTRIDE + 0, 2 * CDEF_BSTRIDE + 0 },
  /* Padding: cdef_directions[7] */
  { 1 * CDEF_BSTRIDE + 0, 2 * CDEF_BSTRIDE - 1 },

  /* Begin cdef_directions */
  { -1 * CDEF_BSTRIDE + 1, -2 * CDEF_BSTRIDE + 2 },
  { 0 * CDEF_BSTRIDE + 1, -1 * CDEF_BSTRIDE + 2 },
  { 0 * CDEF_BSTRIDE + 1, 0 * CDEF_BSTRIDE + 2 },
  { 0 * CDEF_BSTRIDE + 1, 1 * CDEF_BSTRIDE + 2 },
  { 1 * CDEF_BSTRIDE + 1, 2 * CDEF_BSTRIDE + 2 },
  { 1 * CDEF_BSTRIDE + 0, 2 * CDEF_BSTRIDE + 1 },
  { 1 * CDEF_BSTRIDE + 0, 2 * CDEF_BSTRIDE + 0 },
  { 1 * CDEF_BSTRIDE + 0, 2 * CDEF_BSTRIDE - 1 },
  /* End cdef_directions */

  /* Padding: cdef_directions[0] */
  { -1 * CDEF_BSTRIDE + 1, -2 * CDEF_BSTRIDE + 2 },
  /* Padding: cdef_directions[1] */
  { 0 * CDEF_BSTRIDE + 1, -1 * CDEF_BSTRIDE + 2 },
};

const int (*const cdef_directions)[2] = cdef_directions_padded + 2;

/* Detect direction. 0 means 45-degree up-right, 2 is horizontal, and so on.
   The search minimizes the weighted variance along all the lines in a
   particular direction, i.e. the squared error between the input and a
   "predicted" block where each pixel is replaced by the average along a line
   in a particular direction. Since each direction have the same sum(x^2) term,
   that term is never computed. See Section 2, step 2, of:
   http://jmvalin.ca/notes/intra_paint.pdf */
int cdef_find_dir_c(const uint16_t *img, int stride, int32_t *var,
                    int coeff_shift) {
  int i;
  int32_t cost[8] = { 0 };
  int partial[8][15] = { { 0 } };
  int32_t best_cost = 0;
  int best_dir = 0;
  /* Instead of dividing by n between 2 and 8, we multiply by 3*5*7*8/n.
     The output is then 840 times larger, but we don't care for finding
     the max. */
  static const int div_table[] = { 0, 840, 420, 280, 210, 168, 140, 120, 105 };
  for (i = 0; i < 8; i++) {
    int j;
    for (j = 0; j < 8; j++) {
      int x;
      /* We subtract 128 here to reduce the maximum range of the squared
         partial sums. */
      x = (img[i * stride + j] >> coeff_shift) - 128;
      partial[0][i + j] += x;
      partial[1][i + j / 2] += x;
      partial[2][i] += x;
      partial[3][3 + i - j / 2] += x;
      partial[4][7 + i - j] += x;
      partial[5][3 - i / 2 + j] += x;
      partial[6][j] += x;
      partial[7][i / 2 + j] += x;
    }
  }
  for (i = 0; i < 8; i++) {
    cost[2] += partial[2][i] * partial[2][i];
    cost[6] += partial[6][i] * partial[6][i];
  }
  cost[2] *= div_table[8];
  cost[6] *= div_table[8];
  for (i = 0; i < 7; i++) {
    cost[0] += (partial[0][i] * partial[0][i] +
                partial[0][14 - i] * partial[0][14 - i]) *
               div_table[i + 1];
    cost[4] += (partial[4][i] * partial[4][i] +
                partial[4][14 - i] * partial[4][14 - i]) *
               div_table[i + 1];
  }
  cost[0] += partial[0][7] * partial[0][7] * div_table[8];
  cost[4] += partial[4][7] * partial[4][7] * div_table[8];
  for (i = 1; i < 8; i += 2) {
    int j;
    for (j = 0; j < 4 + 1; j++) {
      cost[i] += partial[i][3 + j] * partial[i][3 + j];
    }
    cost[i] *= div_table[8];
    for (j = 0; j < 4 - 1; j++) {
      cost[i] += (partial[i][j] * partial[i][j] +
                  partial[i][10 - j] * partial[i][10 - j]) *
                 div_table[2 * j + 2];
    }
  }
  for (i = 0; i < 8; i++) {
    if (cost[i] > best_cost) {
      best_cost = cost[i];
      best_dir = i;
    }
  }
  /* Difference between the optimal variance and the variance along the
     orthogonal direction. Again, the sum(x^2) terms cancel out. */
  *var = best_cost - cost[(best_dir + 4) & 7];
  /* We'd normally divide by 840, but dividing by 1024 is close enough
     for what we're going to do with this. */
  *var >>= 10;
  return best_dir;
}

void cdef_find_dir_dual_c(const uint16_t *img1, const uint16_t *img2,
                          int stride, int32_t *var1, int32_t *var2,
                          int coeff_shift, int *out1, int *out2) {
  *out1 = cdef_find_dir_c(img1, stride, var1, coeff_shift);
  *out2 = cdef_find_dir_c(img2, stride, var2, coeff_shift);
}

const int cdef_pri_taps[2][2] = { { 4, 2 }, { 3, 3 } };
const int cdef_sec_taps[2] = { 2, 1 };

/* Smooth in the direction detected. */
static void cdef_filter_block_internal(
    uint8_t *dst8, uint16_t *dst16, int dstride, const uint16_t *in,
    int pri_strength, int sec_strength, int dir, int pri_damping,
    int sec_damping, int coeff_shift, int block_width, int block_height,
    int enable_primary, int enable_secondary) {
  const int clipping_required = (enable_primary && enable_secondary);
  int i, j, k;
  const int s = CDEF_BSTRIDE;
  const int *pri_taps = cdef_pri_taps[(pri_strength >> coeff_shift) & 1];
  const int *sec_taps = cdef_sec_taps;
  for (i = 0; i < block_height; i++) {
    for (j = 0; j < block_width; j++) {
      int16_t sum = 0;
      int16_t y;
      int16_t x = in[i * s + j];
      int max = x;
      int min = x;
      for (k = 0; k < 2; k++) {
        if (enable_primary) {
          int16_t p0 = in[i * s + j + cdef_directions[dir][k]];
          int16_t p1 = in[i * s + j - cdef_directions[dir][k]];
          sum += pri_taps[k] * constrain(p0 - x, pri_strength, pri_damping);
          sum += pri_taps[k] * constrain(p1 - x, pri_strength, pri_damping);
          if (clipping_required) {
            if (p0 != CDEF_VERY_LARGE) max = AOMMAX(p0, max);
            if (p1 != CDEF_VERY_LARGE) max = AOMMAX(p1, max);
            min = AOMMIN(p0, min);
            min = AOMMIN(p1, min);
          }
        }
        if (enable_secondary) {
          int16_t s0 = in[i * s + j + cdef_directions[dir + 2][k]];
          int16_t s1 = in[i * s + j - cdef_directions[dir + 2][k]];
          int16_t s2 = in[i * s + j + cdef_directions[dir - 2][k]];
          int16_t s3 = in[i * s + j - cdef_directions[dir - 2][k]];
          if (clipping_required) {
            if (s0 != CDEF_VERY_LARGE) max = AOMMAX(s0, max);
            if (s1 != CDEF_VERY_LARGE) max = AOMMAX(s1, max);
            if (s2 != CDEF_VERY_LARGE) max = AOMMAX(s2, max);
            if (s3 != CDEF_VERY_LARGE) max = AOMMAX(s3, max);
            min = AOMMIN(s0, min);
            min = AOMMIN(s1, min);
            min = AOMMIN(s2, min);
            min = AOMMIN(s3, min);
          }
          sum += sec_taps[k] * constrain(s0 - x, sec_strength, sec_damping);
          sum += sec_taps[k] * constrain(s1 - x, sec_strength, sec_damping);
          sum += sec_taps[k] * constrain(s2 - x, sec_strength, sec_damping);
          sum += sec_taps[k] * constrain(s3 - x, sec_strength, sec_damping);
        }
      }
      y = ((int16_t)x + ((8 + sum - (sum < 0)) >> 4));
      if (clipping_required) {
        y = clamp(y, min, max);
      }

      if (dst8)
        dst8[i * dstride + j] = (uint8_t)y;
      else
        dst16[i * dstride + j] = (uint16_t)y;
    }
  }
}

void cdef_filter_8_0_c(void *dst8, int dstride, const uint16_t *in,
                       int pri_strength, int sec_strength, int dir,
                       int pri_damping, int sec_damping, int coeff_shift,
                       int block_width, int block_height) {
  cdef_filter_block_internal((uint8_t *)dst8, NULL, dstride, in, pri_strength,
                             sec_strength, dir, pri_damping, sec_damping,
                             coeff_shift, block_width, block_height,
                             /*enable_primary=*/1, /*enable_secondary=*/1);
}

void cdef_filter_8_1_c(void *dst8, int dstride, const uint16_t *in,
                       int pri_strength, int sec_strength, int dir,
                       int pri_damping, int sec_damping, int coeff_shift,
                       int block_width, int block_height) {
  cdef_filter_block_internal((uint8_t *)dst8, NULL, dstride, in, pri_strength,
                             sec_strength, dir, pri_damping, sec_damping,
                             coeff_shift, block_width, block_height,
                             /*enable_primary=*/1, /*enable_secondary=*/0);
}

void cdef_filter_8_2_c(void *dst8, int dstride, const uint16_t *in,
                       int pri_strength, int sec_strength, int dir,
                       int pri_damping, int sec_damping, int coeff_shift,
                       int block_width, int block_height) {
  cdef_filter_block_internal((uint8_t *)dst8, NULL, dstride, in, pri_strength,
                             sec_strength, dir, pri_damping, sec_damping,
                             coeff_shift, block_width, block_height,
                             /*enable_primary=*/0, /*enable_secondary=*/1);
}

void cdef_filter_8_3_c(void *dst8, int dstride, const uint16_t *in,
                       int pri_strength, int sec_strength, int dir,
                       int pri_damping, int sec_damping, int coeff_shift,
                       int block_width, int block_height) {
  cdef_filter_block_internal((uint8_t *)dst8, NULL, dstride, in, pri_strength,
                             sec_strength, dir, pri_damping, sec_damping,
                             coeff_shift, block_width, block_height,
                             /*enable_primary=*/0, /*enable_secondary=*/0);
}

void cdef_filter_16_0_c(void *dst16, int dstride, const uint16_t *in,
                        int pri_strength, int sec_strength, int dir,
                        int pri_damping, int sec_damping, int coeff_shift,
                        int block_width, int block_height) {
  cdef_filter_block_internal(NULL, (uint16_t *)dst16, dstride, in, pri_strength,
                             sec_strength, dir, pri_damping, sec_damping,
                             coeff_shift, block_width, block_height,
                             /*enable_primary=*/1, /*enable_secondary=*/1);
}

void cdef_filter_16_1_c(void *dst16, int dstride, const uint16_t *in,
                        int pri_strength, int sec_strength, int dir,
                        int pri_damping, int sec_damping, int coeff_shift,
                        int block_width, int block_height) {
  cdef_filter_block_internal(NULL, (uint16_t *)dst16, dstride, in, pri_strength,
                             sec_strength, dir, pri_damping, sec_damping,
                             coeff_shift, block_width, block_height,
                             /*enable_primary=*/1, /*enable_secondary=*/0);
}

void cdef_filter_16_2_c(void *dst16, int dstride, const uint16_t *in,
                        int pri_strength, int sec_strength, int dir,
                        int pri_damping, int sec_damping, int coeff_shift,
                        int block_width, int block_height) {
  cdef_filter_block_internal(NULL, (uint16_t *)dst16, dstride, in, pri_strength,
                             sec_strength, dir, pri_damping, sec_damping,
                             coeff_shift, block_width, block_height,
                             /*enable_primary=*/0, /*enable_secondary=*/1);
}

void cdef_filter_16_3_c(void *dst16, int dstride, const uint16_t *in,
                        int pri_strength, int sec_strength, int dir,
                        int pri_damping, int sec_damping, int coeff_shift,
                        int block_width, int block_height) {
  cdef_filter_block_internal(NULL, (uint16_t *)dst16, dstride, in, pri_strength,
                             sec_strength, dir, pri_damping, sec_damping,
                             coeff_shift, block_width, block_height,
                             /*enable_primary=*/0, /*enable_secondary=*/0);
}

/* Compute the primary filter strength for an 8x8 block based on the
   directional variance difference. A high variance difference means
   that we have a highly directional pattern (e.g. a high contrast
   edge), so we can apply more deringing. A low variance means that we
   either have a low contrast edge, or a non-directional texture, so
   we want to be careful not to blur. */
static INLINE int adjust_strength(int strength, int32_t var) {
  const int i = var >> 6 ? AOMMIN(get_msb(var >> 6), 12) : 0;
  /* We use the variance of 8x8 blocks to adjust the strength. */
  return var ? (strength * (4 + i) + 8) >> 4 : 0;
}

static AOM_INLINE void aom_cdef_find_dir(const uint16_t *in, cdef_list *dlist,
                                         int var[CDEF_NBLOCKS][CDEF_NBLOCKS],
                                         int cdef_count, int coeff_shift,
                                         int dir[CDEF_NBLOCKS][CDEF_NBLOCKS]) {
  int bi;

  // Find direction of two 8x8 blocks together.
  for (bi = 0; bi < cdef_count - 1; bi += 2) {
    const int by = dlist[bi].by;
    const int bx = dlist[bi].bx;
    const int by2 = dlist[bi + 1].by;
    const int bx2 = dlist[bi + 1].bx;
    const int pos1 = 8 * by * CDEF_BSTRIDE + 8 * bx;
    const int pos2 = 8 * by2 * CDEF_BSTRIDE + 8 * bx2;
    cdef_find_dir_dual(&in[pos1], &in[pos2], CDEF_BSTRIDE, &var[by][bx],
                       &var[by2][bx2], coeff_shift, &dir[by][bx],
                       &dir[by2][bx2]);
  }

  // Process remaining 8x8 blocks here. One 8x8 at a time.
  if (cdef_count % 2) {
    const int by = dlist[bi].by;
    const int bx = dlist[bi].bx;
    dir[by][bx] = cdef_find_dir(&in[8 * by * CDEF_BSTRIDE + 8 * bx],
                                CDEF_BSTRIDE, &var[by][bx], coeff_shift);
  }
}

void av1_cdef_filter_fb(uint8_t *dst8, uint16_t *dst16, int dstride,
                        const uint16_t *in, int xdec, int ydec,
                        int dir[CDEF_NBLOCKS][CDEF_NBLOCKS], int *dirinit,
                        int var[CDEF_NBLOCKS][CDEF_NBLOCKS], int pli,
                        cdef_list *dlist, int cdef_count, int level,
                        int sec_strength, int damping, int coeff_shift) {
  int bi;
  int bx;
  int by;
  const int pri_strength = level << coeff_shift;
  sec_strength <<= coeff_shift;
  damping += coeff_shift - (pli != AOM_PLANE_Y);
  const int bw_log2 = 3 - xdec;
  const int bh_log2 = 3 - ydec;
  if (dirinit && pri_strength == 0 && sec_strength == 0) {
    // If we're here, both primary and secondary strengths are 0, and
    // we still haven't written anything to y[] yet, so we just copy
    // the input to y[]. This is necessary only for av1_cdef_search()
    // and only av1_cdef_search() sets dirinit.
    for (bi = 0; bi < cdef_count; bi++) {
      by = dlist[bi].by;
      bx = dlist[bi].bx;
      // TODO(stemidts/jmvalin): SIMD optimisations
      for (int iy = 0; iy < 1 << bh_log2; iy++) {
        memcpy(&dst16[(bi << (bw_log2 + bh_log2)) + (iy << bw_log2)],
               &in[((by << bh_log2) + iy) * CDEF_BSTRIDE + (bx << bw_log2)],
               ((size_t)1 << bw_log2) * sizeof(*dst16));
      }
    }
    return;
  }

  if (pli == 0) {
    if (!dirinit || !*dirinit) {
      aom_cdef_find_dir(in, dlist, var, cdef_count, coeff_shift, dir);
      if (dirinit) *dirinit = 1;
    }
  }
  if (pli == 1 && xdec != ydec) {
    for (bi = 0; bi < cdef_count; bi++) {
      static const int conv422[8] = { 7, 0, 2, 4, 5, 6, 6, 6 };
      static const int conv440[8] = { 1, 2, 2, 2, 3, 4, 6, 0 };
      by = dlist[bi].by;
      bx = dlist[bi].bx;
      dir[by][bx] = (xdec ? conv422 : conv440)[dir[by][bx]];
    }
  }

  if (dst8) {
    const int block_width = 8 >> xdec;
    const int block_height = 8 >> ydec;
    /*
     * strength_index == 0 : enable_primary = 1, enable_secondary = 1
     * strength_index == 1 : enable_primary = 1, enable_secondary = 0
     * strength_index == 2 : enable_primary = 0, enable_secondary = 1
     * strength_index == 3 : enable_primary = 0, enable_secondary = 0
     */
    const cdef_filter_block_func cdef_filter_fn[4] = {
      cdef_filter_8_0, cdef_filter_8_1, cdef_filter_8_2, cdef_filter_8_3
    };

    for (bi = 0; bi < cdef_count; bi++) {
      by = dlist[bi].by;
      bx = dlist[bi].bx;
      const int t =
          (pli ? pri_strength : adjust_strength(pri_strength, var[by][bx]));
      const int strength_index = (sec_strength == 0) | ((t == 0) << 1);

      cdef_filter_fn[strength_index](
          &dst8[(by << bh_log2) * dstride + (bx << bw_log2)], dstride,
          &in[(by * CDEF_BSTRIDE << bh_log2) + (bx << bw_log2)], t,
          sec_strength, pri_strength ? dir[by][bx] : 0, damping, damping,
          coeff_shift, block_width, block_height);
    }
  } else {
    const int block_width = 8 >> xdec;
    const int block_height = 8 >> ydec;
    /*
     * strength_index == 0 : enable_primary = 1, enable_secondary = 1
     * strength_index == 1 : enable_primary = 1, enable_secondary = 0
     * strength_index == 2 : enable_primary = 0, enable_secondary = 1
     * strength_index == 3 : enable_primary = 0, enable_secondary = 0
     */
    const cdef_filter_block_func cdef_filter_fn[4] = {
      cdef_filter_16_0, cdef_filter_16_1, cdef_filter_16_2, cdef_filter_16_3
    };

    for (bi = 0; bi < cdef_count; bi++) {
      by = dlist[bi].by;
      bx = dlist[bi].bx;
      const int t =
          (pli ? pri_strength : adjust_strength(pri_strength, var[by][bx]));
      const int strength_index = (sec_strength == 0) | ((t == 0) << 1);

      cdef_filter_fn[strength_index](
          &dst16[dirinit ? bi << (bw_log2 + bh_log2)
                         : (by << bh_log2) * dstride + (bx << bw_log2)],
          dirinit ? 1 << bw_log2 : dstride,
          &in[(by * CDEF_BSTRIDE << bh_log2) + (bx << bw_log2)], t,
          sec_strength, pri_strength ? dir[by][bx] : 0, damping, damping,
          coeff_shift, block_width, block_height);
    }
  }
}
