/*
 *  Copyright (c) 2015 The WebM project authors. All Rights Reserved.
 *
 *  Use of this source code is governed by a BSD-style license
 *  that can be found in the LICENSE file in the root of the source
 *  tree. An additional intellectual property rights grant can be found
 *  in the file PATENTS.  All contributing project authors may
 *  be found in the AUTHORS file in the root of the source tree.
 */
#ifndef VPX_DSP_X86_CONVOLVE_H_
#define VPX_DSP_X86_CONVOLVE_H_

#include <assert.h>

#include "./vpx_config.h"
#include "vpx/vpx_integer.h"
#include "vpx_ports/mem.h"
#include "vpx_dsp/vpx_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 vpx_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) { \
      vpx_filter_block1d16_##dir##8_##avg##opt(src_start, \
                                               src_stride, \
                                               dst, \
                                               dst_stride, \
                                               h, \
                                               filter); \
      src += 16; \
      dst += 16; \
      w -= 16; \
    } \
    while (w >= 8) { \
      vpx_filter_block1d8_##dir##8_##avg##opt(src_start, \
                                              src_stride, \
                                              dst, \
                                              dst_stride, \
                                              h, \
                                              filter); \
      src += 8; \
      dst += 8; \
      w -= 8; \
    } \
    while (w >= 4) { \
      vpx_filter_block1d4_##dir##8_##avg##opt(src_start, \
                                              src_stride, \
                                              dst, \
                                              dst_stride, \
                                              h, \
                                              filter); \
      src += 4; \
      dst += 4; \
      w -= 4; \
    } \
  } else { \
    while (w >= 16) { \
      vpx_filter_block1d16_##dir##2_##avg##opt(src, \
                                               src_stride, \
                                               dst, \
                                               dst_stride, \
                                               h, \
                                               filter); \
      src += 16; \
      dst += 16; \
      w -= 16; \
    } \
    while (w >= 8) { \
      vpx_filter_block1d8_##dir##2_##avg##opt(src, \
                                              src_stride, \
                                              dst, \
                                              dst_stride, \
                                              h, \
                                              filter); \
      src += 8; \
      dst += 8; \
      w -= 8; \
    } \
    while (w >= 4) { \
      vpx_filter_block1d4_##dir##2_##avg##opt(src, \
                                              src_stride, \
                                              dst, \
                                              dst_stride, \
                                              h, \
                                              filter); \
      src += 4; \
      dst += 4; \
      w -= 4; \
    } \
  } \
}

#define FUN_CONV_2D(avg, opt) \
void vpx_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_CU_SIZE); \
  assert(h <= MAX_CU_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_CU_SIZE * (MAX_CU_SIZE+7)]); \
    vpx_convolve8_horiz_##opt(src - 3 * src_stride, src_stride, \
                              fdata2, MAX_CU_SIZE, \
                              filter_x, x_step_q4, filter_y, y_step_q4, \
                              w, h + 7); \
    vpx_convolve8_##avg##vert_##opt(fdata2 + 3 * MAX_CU_SIZE, MAX_CU_SIZE, \
                                    dst, dst_stride, \
                                    filter_x, x_step_q4, filter_y, \
                                    y_step_q4, w, h); \
  } else { \
    DECLARE_ALIGNED(16, uint8_t, fdata2[MAX_CU_SIZE * (MAX_CU_SIZE+1)]); \
    vpx_convolve8_horiz_##opt(src, src_stride, fdata2, MAX_CU_SIZE, \
                              filter_x, x_step_q4, filter_y, y_step_q4, \
                              w, h + 1); \
    vpx_convolve8_##avg##vert_##opt(fdata2, MAX_CU_SIZE, dst, dst_stride, \
                                    filter_x, x_step_q4, filter_y, \
                                    y_step_q4, w, h); \
  } \
}

#if CONFIG_VP9_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 vpx_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) { \
        vpx_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) { \
        vpx_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) { \
        vpx_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) { \
        vpx_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) { \
        vpx_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) { \
        vpx_highbd_filter_block1d4_##dir##2_##avg##opt(src, \
                                                       src_stride, \
                                                       dst, \
                                                       dst_stride, \
                                                       h, \
                                                       filter, \
                                                       bd); \
        src += 4; \
        dst += 4; \
        w -= 4; \
      } \
    } \
  } \
  if (w) { \
    vpx_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 vpx_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_CU_SIZE); \
  assert(h <= MAX_CU_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_CU_SIZE * (MAX_CU_SIZE+7)]); \
      vpx_highbd_convolve8_horiz_##opt(src - 3 * src_stride, \
                                       src_stride, \
                                       CONVERT_TO_BYTEPTR(fdata2), \
                                       MAX_CU_SIZE, \
                                       filter_x, x_step_q4, \
                                       filter_y, y_step_q4, \
                                       w, h + 7, bd); \
      vpx_highbd_convolve8_##avg##vert_##opt( \
        CONVERT_TO_BYTEPTR(fdata2) + 3 * MAX_CU_SIZE, \
        MAX_CU_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_CU_SIZE * (MAX_CU_SIZE+1)]); \
      vpx_highbd_convolve8_horiz_##opt(src, \
                                       src_stride, \
                                       CONVERT_TO_BYTEPTR(fdata2), \
                                       MAX_CU_SIZE, \
                                       filter_x, x_step_q4, \
                                       filter_y, y_step_q4, \
                                       w, h + 1, bd); \
      vpx_highbd_convolve8_##avg##vert_##opt(CONVERT_TO_BYTEPTR(fdata2), \
                                             MAX_CU_SIZE, \
                                             dst, \
                                             dst_stride, \
                                             filter_x, x_step_q4, \
                                             filter_y, y_step_q4, \
                                             w, h, bd); \
    } \
  } else { \
    vpx_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_VP9_HIGHBITDEPTH

#endif  // VPX_DSP_X86_CONVOLVE_H_
