/*
 * 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.
 */
#ifndef AOM_DSP_X86_CONVOLVE_H_
#define AOM_DSP_X86_CONVOLVE_H_

#include <assert.h>

#include "./aom_config.h"
#include "aom/aom_integer.h"
#include "aom_ports/mem.h"
#include "aom_dsp/aom_convolve.h"

typedef void filter8_1dfunction(const uint8_t *src_ptr, ptrdiff_t src_pitch,
                                uint8_t *output_ptr, ptrdiff_t out_pitch,
                                uint32_t output_height, const int16_t *filter);

#define FUN_CONV_1D(name, step_q4, filter, dir, src_start, avg, opt)         \
  void aom_convolve8_##name##_##opt(                                         \
      const uint8_t *src, ptrdiff_t src_stride, uint8_t *dst,                \
      ptrdiff_t dst_stride, const int16_t *filter_x, int x_step_q4,          \
      const int16_t *filter_y, int y_step_q4, int w, int h) {                \
    assert(filter[3] != 128);                                                \
    assert(step_q4 == 16);                                                   \
    if (filter[0] | filter[1] | filter[2]) {                                 \
      while (w >= 16) {                                                      \
        aom_filter_block1d16_##dir##8_##avg##opt(src_start, src_stride, dst, \
                                                 dst_stride, h, filter);     \
        src += 16;                                                           \
        dst += 16;                                                           \
        w -= 16;                                                             \
      }                                                                      \
      if (w == 8) {                                                          \
        aom_filter_block1d8_##dir##8_##avg##opt(src_start, src_stride, dst,  \
                                                dst_stride, h, filter);      \
      } else if (w == 4) {                                                   \
        aom_filter_block1d4_##dir##8_##avg##opt(src_start, src_stride, dst,  \
                                                dst_stride, h, filter);      \
      }                                                                      \
    } else {                                                                 \
      while (w >= 16) {                                                      \
        aom_filter_block1d16_##dir##2_##avg##opt(src, src_stride, dst,       \
                                                 dst_stride, h, filter);     \
        src += 16;                                                           \
        dst += 16;                                                           \
        w -= 16;                                                             \
      }                                                                      \
      if (w == 8) {                                                          \
        aom_filter_block1d8_##dir##2_##avg##opt(src, src_stride, dst,        \
                                                dst_stride, h, filter);      \
      } else if (w == 4) {                                                   \
        aom_filter_block1d4_##dir##2_##avg##opt(src, src_stride, dst,        \
                                                dst_stride, h, filter);      \
      }                                                                      \
    }                                                                        \
  }

#define FUN_CONV_2D(avg, opt)                                                \
  void aom_convolve8_##avg##opt(                                             \
      const uint8_t *src, ptrdiff_t src_stride, uint8_t *dst,                \
      ptrdiff_t dst_stride, const int16_t *filter_x, int x_step_q4,          \
      const int16_t *filter_y, int y_step_q4, int w, int h) {                \
    assert(filter_x[3] != 128);                                              \
    assert(filter_y[3] != 128);                                              \
    assert(w <= MAX_SB_SIZE);                                                \
    assert(h <= MAX_SB_SIZE);                                                \
    assert(x_step_q4 == 16);                                                 \
    assert(y_step_q4 == 16);                                                 \
    if (filter_x[0] || filter_x[1] || filter_x[2] || filter_y[0] ||          \
        filter_y[1] || filter_y[2]) {                                        \
      DECLARE_ALIGNED(16, uint8_t, fdata2[MAX_SB_SIZE * (MAX_SB_SIZE + 7)]); \
      aom_convolve8_horiz_##opt(src - 3 * src_stride, src_stride, fdata2,    \
                                MAX_SB_SIZE, filter_x, x_step_q4, filter_y,  \
                                y_step_q4, w, h + 7);                        \
      aom_convolve8_##avg##vert_##opt(fdata2 + 3 * MAX_SB_SIZE, MAX_SB_SIZE, \
                                      dst, dst_stride, filter_x, x_step_q4,  \
                                      filter_y, y_step_q4, w, h);            \
    } else {                                                                 \
      DECLARE_ALIGNED(16, uint8_t, fdata2[MAX_SB_SIZE * (MAX_SB_SIZE + 1)]); \
      aom_convolve8_horiz_##opt(src, src_stride, fdata2, MAX_SB_SIZE,        \
                                filter_x, x_step_q4, filter_y, y_step_q4, w, \
                                h + 1);                                      \
      aom_convolve8_##avg##vert_##opt(fdata2, MAX_SB_SIZE, dst, dst_stride,  \
                                      filter_x, x_step_q4, filter_y,         \
                                      y_step_q4, w, h);                      \
    }                                                                        \
  }

#if CONFIG_AOM_HIGHBITDEPTH

typedef void highbd_filter8_1dfunction(const uint16_t *src_ptr,
                                       const ptrdiff_t src_pitch,
                                       uint16_t *output_ptr,
                                       ptrdiff_t out_pitch,
                                       unsigned int output_height,
                                       const int16_t *filter, int bd);

#define HIGH_FUN_CONV_1D(name, step_q4, filter, dir, src_start, avg, opt) \
  void aom_highbd_convolve8_##name##_##opt(                               \
      const uint8_t *src8, ptrdiff_t src_stride, uint8_t *dst8,           \
      ptrdiff_t dst_stride, const int16_t *filter_x, int x_step_q4,       \
      const int16_t *filter_y, int y_step_q4, int w, int h, int bd) {     \
    if (step_q4 == 16 && filter[3] != 128) {                              \
      uint16_t *src = CONVERT_TO_SHORTPTR(src8);                          \
      uint16_t *dst = CONVERT_TO_SHORTPTR(dst8);                          \
      if (filter[0] | filter[1] | filter[2]) {                            \
        while (w >= 16) {                                                 \
          aom_highbd_filter_block1d16_##dir##8_##avg##opt(                \
              src_start, src_stride, dst, dst_stride, h, filter, bd);     \
          src += 16;                                                      \
          dst += 16;                                                      \
          w -= 16;                                                        \
        }                                                                 \
        while (w >= 8) {                                                  \
          aom_highbd_filter_block1d8_##dir##8_##avg##opt(                 \
              src_start, src_stride, dst, dst_stride, h, filter, bd);     \
          src += 8;                                                       \
          dst += 8;                                                       \
          w -= 8;                                                         \
        }                                                                 \
        while (w >= 4) {                                                  \
          aom_highbd_filter_block1d4_##dir##8_##avg##opt(                 \
              src_start, src_stride, dst, dst_stride, h, filter, bd);     \
          src += 4;                                                       \
          dst += 4;                                                       \
          w -= 4;                                                         \
        }                                                                 \
      } else {                                                            \
        while (w >= 16) {                                                 \
          aom_highbd_filter_block1d16_##dir##2_##avg##opt(                \
              src, src_stride, dst, dst_stride, h, filter, bd);           \
          src += 16;                                                      \
          dst += 16;                                                      \
          w -= 16;                                                        \
        }                                                                 \
        while (w >= 8) {                                                  \
          aom_highbd_filter_block1d8_##dir##2_##avg##opt(                 \
              src, src_stride, dst, dst_stride, h, filter, bd);           \
          src += 8;                                                       \
          dst += 8;                                                       \
          w -= 8;                                                         \
        }                                                                 \
        while (w >= 4) {                                                  \
          aom_highbd_filter_block1d4_##dir##2_##avg##opt(                 \
              src, src_stride, dst, dst_stride, h, filter, bd);           \
          src += 4;                                                       \
          dst += 4;                                                       \
          w -= 4;                                                         \
        }                                                                 \
      }                                                                   \
    }                                                                     \
    if (w) {                                                              \
      aom_highbd_convolve8_##name##_c(src8, src_stride, dst8, dst_stride, \
                                      filter_x, x_step_q4, filter_y,      \
                                      y_step_q4, w, h, bd);               \
    }                                                                     \
  }

#define HIGH_FUN_CONV_2D(avg, opt)                                            \
  void aom_highbd_convolve8_##avg##opt(                                       \
      const uint8_t *src, ptrdiff_t src_stride, uint8_t *dst,                 \
      ptrdiff_t dst_stride, const int16_t *filter_x, int x_step_q4,           \
      const int16_t *filter_y, int y_step_q4, int w, int h, int bd) {         \
    assert(w <= MAX_SB_SIZE);                                                 \
    assert(h <= MAX_SB_SIZE);                                                 \
    if (x_step_q4 == 16 && y_step_q4 == 16) {                                 \
      if (filter_x[0] || filter_x[1] || filter_x[2] || filter_x[3] == 128 ||  \
          filter_y[0] || filter_y[1] || filter_y[2] || filter_y[3] == 128) {  \
        DECLARE_ALIGNED(16, uint16_t,                                         \
                        fdata2[MAX_SB_SIZE * (MAX_SB_SIZE + 7)]);             \
        aom_highbd_convolve8_horiz_##opt(src - 3 * src_stride, src_stride,    \
                                         CONVERT_TO_BYTEPTR(fdata2),          \
                                         MAX_SB_SIZE, filter_x, x_step_q4,    \
                                         filter_y, y_step_q4, w, h + 7, bd);  \
        aom_highbd_convolve8_##avg##vert_##opt(                               \
            CONVERT_TO_BYTEPTR(fdata2) + 3 * MAX_SB_SIZE, MAX_SB_SIZE, dst,   \
            dst_stride, filter_x, x_step_q4, filter_y, y_step_q4, w, h, bd);  \
      } else {                                                                \
        DECLARE_ALIGNED(16, uint16_t,                                         \
                        fdata2[MAX_SB_SIZE * (MAX_SB_SIZE + 1)]);             \
        aom_highbd_convolve8_horiz_##opt(                                     \
            src, src_stride, CONVERT_TO_BYTEPTR(fdata2), MAX_SB_SIZE,         \
            filter_x, x_step_q4, filter_y, y_step_q4, w, h + 1, bd);          \
        aom_highbd_convolve8_##avg##vert_##opt(                               \
            CONVERT_TO_BYTEPTR(fdata2), MAX_SB_SIZE, dst, dst_stride,         \
            filter_x, x_step_q4, filter_y, y_step_q4, w, h, bd);              \
      }                                                                       \
    } else {                                                                  \
      aom_highbd_convolve8_##avg##c(src, src_stride, dst, dst_stride,         \
                                    filter_x, x_step_q4, filter_y, y_step_q4, \
                                    w, h, bd);                                \
    }                                                                         \
  }
#endif  // CONFIG_AOM_HIGHBITDEPTH

#endif  // AOM_DSP_X86_CONVOLVE_H_
