/*
 * Copyright (c) 2019, 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 "third_party/googletest/src/googletest/include/gtest/gtest.h"

#include "config/av1_rtcd.h"
#include "test/acm_random.h"
#include "test/register_state_check.h"
#include "aom_ports/aom_timer.h"
#include "aom_ports/mem.h"

namespace {

using ::libaom_test::ACMRandom;

const int MAX_WIDTH = 32;
const int MAX_HEIGHT = 32;

typedef void (*YUVTemporalFilterFunc)(
    const YV12_BUFFER_CONFIG *ref_frame, const MACROBLOCKD *mbd,
    const BLOCK_SIZE block_size, const int mb_row, const int mb_col,
    const int strength, const int use_subblock, const int *blk_fw,
    const uint8_t *pred, uint32_t *accum, uint16_t *count);

struct TemporalFilterWithBd {
  TemporalFilterWithBd(YUVTemporalFilterFunc func, int bitdepth)
      : temporal_filter(func), bd(bitdepth) {}

  YUVTemporalFilterFunc temporal_filter;
  int bd;
};

std::ostream &operator<<(std::ostream &os, const TemporalFilterWithBd &tf) {
  return os << "Bitdepth: " << tf.bd;
}

int GetFilterWeight(unsigned int row, unsigned int col,
                    unsigned int block_height, unsigned int block_width,
                    const int *const blk_fw, int use_32x32) {
  if (use_32x32) {
    return blk_fw[0];
  }

  return blk_fw[2 * (row >= block_height / 2) + (col >= block_width / 2)];
}

template <typename PixelType>
int GetModIndex(int sum_dist, int index, int rounding, int strength,
                int filter_weight) {
  int mod = sum_dist * 3 / index;
  mod += rounding;
  mod >>= strength;

  mod = AOMMIN(16, mod);

  mod = 16 - mod;
  mod *= filter_weight;

  return mod;
}

// Lowbitdepth version
template <>
int GetModIndex<uint8_t>(int sum_dist, int index, int rounding, int strength,
                         int filter_weight) {
  unsigned int index_mult[14] = { 0,     0,     0,     0,     49152,
                                  39322, 32768, 28087, 24576, 21846,
                                  19661, 17874, 0,     15124 };

  assert(index >= 0 && index <= 13);
  assert(index_mult[index] != 0);

  int mod = (clamp(sum_dist, 0, UINT16_MAX) * index_mult[index]) >> 16;
  mod += rounding;
  mod >>= strength;

  mod = AOMMIN(16, mod);

  mod = 16 - mod;
  mod *= filter_weight;

  return mod;
}

// Highbitdepth version
template <>
int GetModIndex<uint16_t>(int sum_dist, int index, int rounding, int strength,
                          int filter_weight) {
  int64_t index_mult[14] = { 0U,          0U,          0U,          0U,
                             3221225472U, 2576980378U, 2147483648U, 1840700270U,
                             1610612736U, 1431655766U, 1288490189U, 1171354718U,
                             0U,          991146300U };

  assert(index >= 0 && index <= 13);
  assert(index_mult[index] != 0);

  int mod = static_cast<int>((sum_dist * index_mult[index]) >> 32);
  mod += rounding;
  mod >>= strength;

  mod = AOMMIN(16, mod);

  mod = 16 - mod;
  mod *= filter_weight;

  return mod;
}

template <typename PixelType>
void SetArray(PixelType *pixel_array, int width, int height, int stride,
              int val) {
  for (int row = 0; row < height; row++) {
    for (int col = 0; col < width; col++) {
      pixel_array[col] = val;
    }
    pixel_array += stride;
  }
}

template <typename PixelType>
void SetArray(PixelType *pixel_array, int width, int height, int stride,
              ACMRandom *rnd, int low_val, int high_val) {
  EXPECT_LE(low_val, high_val);

  for (int row = 0; row < height; row++) {
    for (int col = 0; col < width; col++) {
      const int val =
          static_cast<int>((*rnd).PseudoUniform(high_val - low_val));
      pixel_array[col] = low_val + val;
    }
    pixel_array += stride;
  }
}

template <typename ValueType>
bool CheckArrayEqual(const ValueType *arr_1, const ValueType *arr_2, int width,
                     int height, int stride_1, int stride_2) {
  for (int row = 0; row < height; row++) {
    for (int col = 0; col < width; col++) {
      if (arr_1[col] != arr_2[col]) {
        return false;
      }
    }
    arr_1 += stride_1;
    arr_2 += stride_2;
  }
  return true;
}

template <typename ValueType>
void PrintArrayDiff(const ValueType *arr_1, const ValueType *arr_2, int width,
                    int height, int stride_1, int stride_2) {
  const ValueType *arr_1_start = arr_1, *arr_2_start = arr_2;

  printf("Array 1:\n");
  for (int row = 0; row < height; ++row) {
    for (int col = 0; col < width; ++col) {
      if (arr_1[col] != arr_2[col]) {
        printf("*%3d", arr_1[col]);
      } else {
        printf("%4d", arr_1[col]);
      }
    }
    printf("\n");
    arr_1 += stride_1;
    arr_2 += stride_2;
  }

  arr_1 = arr_1_start;
  arr_2 = arr_2_start;

  printf("Array 2:\n");
  for (int row = 0; row < height; ++row) {
    for (int col = 0; col < width; ++col) {
      if (arr_1[col] != arr_2[col]) {
        printf("*%3d", arr_2[col]);
      } else {
        printf("%4d", arr_2[col]);
      }
    }
    printf("\n");
    arr_1 += stride_1;
    arr_2 += stride_2;
  }

  arr_1 = arr_1_start;
  arr_2 = arr_2_start;
  printf("Difference:\n");
  for (int row = 0; row < height; ++row) {
    for (int col = 0; col < width; ++col) {
      printf("%4d", arr_1[col] - arr_2[col]);
    }
    printf("\n");
    arr_1 += stride_1;
    arr_2 += stride_2;
  }
}

template <typename PixelType>
void ApplyReferenceFilter(const PixelType *y_src, const PixelType *y_pre,
                          const PixelType *u_src, const PixelType *v_src,
                          const PixelType *u_pre, const PixelType *v_pre,
                          unsigned int block_width, unsigned int block_height,
                          int ss_x, int ss_y, int strength,
                          const int *const blk_fw, int use_32x32,
                          uint32_t *y_accum, uint16_t *y_count,
                          uint32_t *u_accum, uint16_t *u_count,
                          uint32_t *v_accum, uint16_t *v_count) {
  const int uv_block_width = block_width >> ss_x,
            uv_block_height = block_height >> ss_y;
  const int y_src_stride = block_width, y_pre_stride = block_width;
  const int uv_src_stride = uv_block_width, uv_pre_stride = uv_block_width;
  const int y_diff_stride = block_width, uv_diff_stride = uv_block_width;
  const int y_count_stride = block_width, u_count_stride = uv_block_width,
            v_count_stride = uv_block_width;
  const int y_accum_stride = block_width, u_accum_stride = uv_block_width,
            v_accum_stride = uv_block_width;

  int y_dif[MAX_WIDTH * MAX_HEIGHT] = { 0 };
  int u_dif[MAX_WIDTH * MAX_HEIGHT] = { 0 };
  int v_dif[MAX_WIDTH * MAX_HEIGHT] = { 0 };

  const int rounding = (1 << strength) >> 1;

  // Get the square diffs
  for (int row = 0; row < (int)block_height; row++) {
    for (int col = 0; col < (int)block_width; col++) {
      const int diff =
          y_src[row * y_src_stride + col] - y_pre[row * y_pre_stride + col];
      y_dif[row * y_diff_stride + col] = diff * diff;
    }
  }

  for (int row = 0; row < (int)uv_block_height; row++) {
    for (int col = 0; col < (int)uv_block_width; col++) {
      const int u_diff =
          u_src[row * uv_src_stride + col] - u_pre[row * uv_pre_stride + col];
      const int v_diff =
          v_src[row * uv_src_stride + col] - v_pre[row * uv_pre_stride + col];
      u_dif[row * uv_diff_stride + col] = u_diff * u_diff;
      v_dif[row * uv_diff_stride + col] = v_diff * v_diff;
    }
  }

  // Apply the filter to luma
  for (int row = 0; row < (int)block_height; row++) {
    for (int col = 0; col < (int)block_width; col++) {
      const int uv_row = row >> ss_y;
      const int uv_col = col >> ss_x;
      const int filter_weight = GetFilterWeight(row, col, block_height,
                                                block_width, blk_fw, use_32x32);

      // First we get the modifier for the current y pixel
      const int y_pixel = y_pre[row * y_pre_stride + col];
      int y_num_used = 0;
      int y_mod = 0;

      // Sum the neighboring 3x3 y pixels
      for (int row_step = -1; row_step <= 1; row_step++) {
        for (int col_step = -1; col_step <= 1; col_step++) {
          const int sub_row = row + row_step;
          const int sub_col = col + col_step;

          if (sub_row >= 0 && sub_row < (int)block_height && sub_col >= 0 &&
              sub_col < (int)block_width) {
            y_mod += y_dif[sub_row * y_diff_stride + sub_col];
            y_num_used++;
          }
        }
      }

      // Sum the corresponding uv pixels to the current y modifier
      // Note we are rounding down instead of rounding to the nearest pixel.
      y_mod += u_dif[uv_row * uv_diff_stride + uv_col];
      y_mod += v_dif[uv_row * uv_diff_stride + uv_col];

      y_num_used += 2;

      // Set the modifier
      y_mod = GetModIndex<PixelType>(y_mod, y_num_used, rounding, strength,
                                     filter_weight);

      // Accumulate the result
      y_count[row * y_count_stride + col] += y_mod;
      y_accum[row * y_accum_stride + col] += y_mod * y_pixel;
    }
  }

  // Apply the filter to chroma
  for (int uv_row = 0; uv_row < (int)uv_block_height; uv_row++) {
    for (int uv_col = 0; uv_col < (int)uv_block_width; uv_col++) {
      const int y_row = uv_row << ss_y;
      const int y_col = uv_col << ss_x;
      const int filter_weight = GetFilterWeight(
          uv_row, uv_col, uv_block_height, uv_block_width, blk_fw, use_32x32);

      const int u_pixel = u_pre[uv_row * uv_pre_stride + uv_col];
      const int v_pixel = v_pre[uv_row * uv_pre_stride + uv_col];

      int uv_num_used = 0;
      int u_mod = 0, v_mod = 0;

      // Sum the neighboring 3x3 chromal pixels to the chroma modifier
      for (int row_step = -1; row_step <= 1; row_step++) {
        for (int col_step = -1; col_step <= 1; col_step++) {
          const int sub_row = uv_row + row_step;
          const int sub_col = uv_col + col_step;

          if (sub_row >= 0 && sub_row < uv_block_height && sub_col >= 0 &&
              sub_col < uv_block_width) {
            u_mod += u_dif[sub_row * uv_diff_stride + sub_col];
            v_mod += v_dif[sub_row * uv_diff_stride + sub_col];
            uv_num_used++;
          }
        }
      }

      // Sum all the luma pixels associated with the current luma pixel
      for (int row_step = 0; row_step < 1 + ss_y; row_step++) {
        for (int col_step = 0; col_step < 1 + ss_x; col_step++) {
          const int sub_row = y_row + row_step;
          const int sub_col = y_col + col_step;
          const int y_diff = y_dif[sub_row * y_diff_stride + sub_col];

          u_mod += y_diff;
          v_mod += y_diff;
          uv_num_used++;
        }
      }

      // Set the modifier
      u_mod = GetModIndex<PixelType>(u_mod, uv_num_used, rounding, strength,
                                     filter_weight);
      v_mod = GetModIndex<PixelType>(v_mod, uv_num_used, rounding, strength,
                                     filter_weight);

      // Accumulate the result
      u_count[uv_row * u_count_stride + uv_col] += u_mod;
      u_accum[uv_row * u_accum_stride + uv_col] += u_mod * u_pixel;
      v_count[uv_row * v_count_stride + uv_col] += v_mod;
      v_accum[uv_row * v_accum_stride + uv_col] += v_mod * v_pixel;
    }
  }
}

class YUVTemporalFilterTest
    : public ::testing::TestWithParam<TemporalFilterWithBd> {
 public:
  virtual void SetUp() {
    filter_func_ = GetParam().temporal_filter;
    bd_ = GetParam().bd;
    use_highbd_ = (bd_ != 8);

    rnd_.Reset(ACMRandom::DeterministicSeed());
    saturate_test_ = 0;
    num_repeats_ = 10;

    ASSERT_TRUE(bd_ == 8 || bd_ == 10 || bd_ == 12);
  }

 protected:
  template <typename PixelType>
  void CompareTestWithParam(int width, int height, int ss_x, int ss_y,
                            int filter_strength, int use_32x32,
                            const int *filter_weight);
  template <typename PixelType>
  void RunTestFilterWithParam(int width, int height, int ss_x, int ss_y,
                              int filter_strength, int use_32x32,
                              const int *filter_weight);
  template <typename PixelType>
  void ApplyTestFilter(const PixelType *y_src, int y_src_stride,
                       const PixelType *y_pre, int y_pre_stride,
                       const PixelType *u_src, const PixelType *v_src,
                       int uv_src_stride, const PixelType *u_pre,
                       const PixelType *v_pre, int uv_pre_stride,
                       unsigned int block_width, unsigned int block_height,
                       int ss_x, int ss_y, int strength, const int *blk_fw,
                       int use_32x32, uint32_t *y_accum, uint16_t *y_count,
                       uint32_t *u_accumu, uint16_t *u_count, uint32_t *v_accum,
                       uint16_t *v_count);

  YUVTemporalFilterFunc filter_func_;
  ACMRandom rnd_;
  int saturate_test_;
  int num_repeats_;
  int use_highbd_;
  int bd_;
};

template <>
void YUVTemporalFilterTest::ApplyTestFilter<uint8_t>(
    const uint8_t *y_src, int y_src_stride, const uint8_t *y_pre,
    int y_pre_stride, const uint8_t *u_src, const uint8_t *v_src,
    int uv_src_stride, const uint8_t *u_pre, const uint8_t *v_pre,
    int uv_pre_stride, unsigned int block_width, unsigned int block_height,
    int ss_x, int ss_y, int strength, const int *blk_fw, int use_32x32,
    uint32_t *y_accum, uint16_t *y_count, uint32_t *u_accum, uint16_t *u_count,
    uint32_t *v_accum, uint16_t *v_count) {
  (void)block_width;
  (void)block_height;
  (void)y_src_stride;
  (void)uv_src_stride;

  assert(block_width == MAX_WIDTH && MAX_WIDTH == 32);
  assert(block_height == MAX_HEIGHT && MAX_HEIGHT == 32);
  const BLOCK_SIZE block_size = BLOCK_32X32;
  const int mb_pels = MAX_WIDTH * MAX_HEIGHT;
  const int mb_row = 0;
  const int mb_col = 0;
  const int use_subblock = !(use_32x32);

  YV12_BUFFER_CONFIG *ref_frame =
      (YV12_BUFFER_CONFIG *)malloc(sizeof(YV12_BUFFER_CONFIG));
  ref_frame->strides[0] = y_pre_stride;
  ref_frame->strides[1] = uv_pre_stride;
  const int alloc_size = MAX_MB_PLANE * mb_pels;
  DECLARE_ALIGNED(16, uint8_t, src[alloc_size]);
  ref_frame->buffer_alloc = src;
  ref_frame->buffers[0] = ref_frame->buffer_alloc + 0 * mb_pels;
  ref_frame->buffers[1] = ref_frame->buffer_alloc + 1 * mb_pels;
  ref_frame->buffers[2] = ref_frame->buffer_alloc + 2 * mb_pels;

  MACROBLOCKD *mbd = (MACROBLOCKD *)malloc(sizeof(MACROBLOCKD));
  mbd->bd = bd_;
  mbd->plane[0].subsampling_y = 0;
  mbd->plane[0].subsampling_x = 0;
  mbd->plane[1].subsampling_y = ss_y;
  mbd->plane[1].subsampling_x = ss_x;
  mbd->plane[2].subsampling_y = ss_y;
  mbd->plane[2].subsampling_x = ss_x;

  DECLARE_ALIGNED(16, uint8_t, pred[alloc_size]);
  DECLARE_ALIGNED(16, uint32_t, accum[alloc_size]);
  DECLARE_ALIGNED(16, uint16_t, count[alloc_size]);
  memcpy(src + 0 * mb_pels, y_src, mb_pels * sizeof(uint8_t));
  memcpy(src + 1 * mb_pels, u_src, mb_pels * sizeof(uint8_t));
  memcpy(src + 2 * mb_pels, v_src, mb_pels * sizeof(uint8_t));
  memcpy(pred + 0 * mb_pels, y_pre, mb_pels * sizeof(uint8_t));
  memcpy(pred + 1 * mb_pels, u_pre, mb_pels * sizeof(uint8_t));
  memcpy(pred + 2 * mb_pels, v_pre, mb_pels * sizeof(uint8_t));
  memcpy(accum + 0 * mb_pels, y_accum, mb_pels * sizeof(uint32_t));
  memcpy(accum + 1 * mb_pels, u_accum, mb_pels * sizeof(uint32_t));
  memcpy(accum + 2 * mb_pels, v_accum, mb_pels * sizeof(uint32_t));
  memcpy(count + 0 * mb_pels, y_count, mb_pels * sizeof(uint16_t));
  memcpy(count + 1 * mb_pels, u_count, mb_pels * sizeof(uint16_t));
  memcpy(count + 2 * mb_pels, v_count, mb_pels * sizeof(uint16_t));

  ASM_REGISTER_STATE_CHECK(filter_func_(ref_frame, mbd, block_size, mb_row,
                                        mb_col, strength, use_subblock, blk_fw,
                                        pred, accum, count));

  memcpy(y_accum, accum + 0 * mb_pels, mb_pels * sizeof(uint32_t));
  memcpy(u_accum, accum + 1 * mb_pels, mb_pels * sizeof(uint32_t));
  memcpy(v_accum, accum + 2 * mb_pels, mb_pels * sizeof(uint32_t));
  memcpy(y_count, count + 0 * mb_pels, mb_pels * sizeof(uint16_t));
  memcpy(u_count, count + 1 * mb_pels, mb_pels * sizeof(uint16_t));
  memcpy(v_count, count + 2 * mb_pels, mb_pels * sizeof(uint16_t));

  free(ref_frame);
  free(mbd);
}

template <>
void YUVTemporalFilterTest::ApplyTestFilter<uint16_t>(
    const uint16_t *y_src, int y_src_stride, const uint16_t *y_pre,
    int y_pre_stride, const uint16_t *u_src, const uint16_t *v_src,
    int uv_src_stride, const uint16_t *u_pre, const uint16_t *v_pre,
    int uv_pre_stride, unsigned int block_width, unsigned int block_height,
    int ss_x, int ss_y, int strength, const int *blk_fw, int use_32x32,
    uint32_t *y_accum, uint16_t *y_count, uint32_t *u_accum, uint16_t *u_count,
    uint32_t *v_accum, uint16_t *v_count) {
  (void)block_width;
  (void)block_height;
  (void)y_src_stride;
  (void)uv_src_stride;

  assert(block_width == MAX_WIDTH && MAX_WIDTH == 32);
  assert(block_height == MAX_HEIGHT && MAX_HEIGHT == 32);
  const BLOCK_SIZE block_size = BLOCK_32X32;
  const int mb_pels = MAX_WIDTH * MAX_HEIGHT;
  const int mb_row = 0;
  const int mb_col = 0;
  const int use_subblock = !(use_32x32);

  YV12_BUFFER_CONFIG *ref_frame =
      (YV12_BUFFER_CONFIG *)malloc(sizeof(YV12_BUFFER_CONFIG));
  ref_frame->strides[0] = y_pre_stride;
  ref_frame->strides[1] = uv_pre_stride;
  const int alloc_size = MAX_MB_PLANE * mb_pels;
  DECLARE_ALIGNED(16, uint16_t, src16[alloc_size]);
  ref_frame->buffer_alloc = CONVERT_TO_BYTEPTR(src16);
  ref_frame->buffers[0] = ref_frame->buffer_alloc + 0 * mb_pels;
  ref_frame->buffers[1] = ref_frame->buffer_alloc + 1 * mb_pels;
  ref_frame->buffers[2] = ref_frame->buffer_alloc + 2 * mb_pels;

  MACROBLOCKD *mbd = (MACROBLOCKD *)malloc(sizeof(MACROBLOCKD));
  mbd->bd = bd_;
  mbd->plane[0].subsampling_y = 0;
  mbd->plane[0].subsampling_x = 0;
  mbd->plane[1].subsampling_y = ss_y;
  mbd->plane[1].subsampling_x = ss_x;
  mbd->plane[2].subsampling_y = ss_y;
  mbd->plane[2].subsampling_x = ss_x;

  DECLARE_ALIGNED(16, uint16_t, pred16[alloc_size]);
  DECLARE_ALIGNED(16, uint32_t, accum[alloc_size]);
  DECLARE_ALIGNED(16, uint16_t, count[alloc_size]);
  memcpy(src16 + 0 * mb_pels, y_src, mb_pels * sizeof(uint16_t));
  memcpy(src16 + 1 * mb_pels, u_src, mb_pels * sizeof(uint16_t));
  memcpy(src16 + 2 * mb_pels, v_src, mb_pels * sizeof(uint16_t));
  memcpy(pred16 + 0 * mb_pels, y_pre, mb_pels * sizeof(uint16_t));
  memcpy(pred16 + 1 * mb_pels, u_pre, mb_pels * sizeof(uint16_t));
  memcpy(pred16 + 2 * mb_pels, v_pre, mb_pels * sizeof(uint16_t));
  memcpy(accum + 0 * mb_pels, y_accum, mb_pels * sizeof(uint32_t));
  memcpy(accum + 1 * mb_pels, u_accum, mb_pels * sizeof(uint32_t));
  memcpy(accum + 2 * mb_pels, v_accum, mb_pels * sizeof(uint32_t));
  memcpy(count + 0 * mb_pels, y_count, mb_pels * sizeof(uint16_t));
  memcpy(count + 1 * mb_pels, u_count, mb_pels * sizeof(uint16_t));
  memcpy(count + 2 * mb_pels, v_count, mb_pels * sizeof(uint16_t));
  const uint8_t *pred = CONVERT_TO_BYTEPTR(pred16);

  ASM_REGISTER_STATE_CHECK(filter_func_(ref_frame, mbd, block_size, mb_row,
                                        mb_col, strength, use_subblock, blk_fw,
                                        pred, accum, count));

  memcpy(y_accum, accum + 0 * mb_pels, mb_pels * sizeof(uint32_t));
  memcpy(u_accum, accum + 1 * mb_pels, mb_pels * sizeof(uint32_t));
  memcpy(v_accum, accum + 2 * mb_pels, mb_pels * sizeof(uint32_t));
  memcpy(y_count, count + 0 * mb_pels, mb_pels * sizeof(uint16_t));
  memcpy(u_count, count + 1 * mb_pels, mb_pels * sizeof(uint16_t));
  memcpy(v_count, count + 2 * mb_pels, mb_pels * sizeof(uint16_t));

  free(ref_frame);
  free(mbd);
}

template <typename PixelType>
void YUVTemporalFilterTest::CompareTestWithParam(int width, int height,
                                                 int ss_x, int ss_y,
                                                 int filter_strength,
                                                 int use_32x32,
                                                 const int *filter_weight) {
  const int uv_width = width >> ss_x, uv_height = height >> ss_y;
  const int y_stride = width, uv_stride = uv_width;

  DECLARE_ALIGNED(16, PixelType, y_src[MAX_WIDTH * MAX_HEIGHT]) = { 0 };
  DECLARE_ALIGNED(16, PixelType, y_pre[MAX_WIDTH * MAX_HEIGHT]) = { 0 };
  DECLARE_ALIGNED(16, uint16_t, y_count_ref[MAX_WIDTH * MAX_HEIGHT]) = { 0 };
  DECLARE_ALIGNED(16, uint32_t, y_accum_ref[MAX_WIDTH * MAX_HEIGHT]) = { 0 };
  DECLARE_ALIGNED(16, uint16_t, y_count_tst[MAX_WIDTH * MAX_HEIGHT]) = { 0 };
  DECLARE_ALIGNED(16, uint32_t, y_accum_tst[MAX_WIDTH * MAX_HEIGHT]) = { 0 };

  DECLARE_ALIGNED(16, PixelType, u_src[MAX_WIDTH * MAX_HEIGHT]) = { 0 };
  DECLARE_ALIGNED(16, PixelType, u_pre[MAX_WIDTH * MAX_HEIGHT]) = { 0 };
  DECLARE_ALIGNED(16, uint16_t, u_count_ref[MAX_WIDTH * MAX_HEIGHT]) = { 0 };
  DECLARE_ALIGNED(16, uint32_t, u_accum_ref[MAX_WIDTH * MAX_HEIGHT]) = { 0 };
  DECLARE_ALIGNED(16, uint16_t, u_count_tst[MAX_WIDTH * MAX_HEIGHT]) = { 0 };
  DECLARE_ALIGNED(16, uint32_t, u_accum_tst[MAX_WIDTH * MAX_HEIGHT]) = { 0 };

  DECLARE_ALIGNED(16, PixelType, v_src[MAX_WIDTH * MAX_HEIGHT]) = { 0 };
  DECLARE_ALIGNED(16, PixelType, v_pre[MAX_WIDTH * MAX_HEIGHT]) = { 0 };
  DECLARE_ALIGNED(16, uint16_t, v_count_ref[MAX_WIDTH * MAX_HEIGHT]) = { 0 };
  DECLARE_ALIGNED(16, uint32_t, v_accum_ref[MAX_WIDTH * MAX_HEIGHT]) = { 0 };
  DECLARE_ALIGNED(16, uint16_t, v_count_tst[MAX_WIDTH * MAX_HEIGHT]) = { 0 };
  DECLARE_ALIGNED(16, uint32_t, v_accum_tst[MAX_WIDTH * MAX_HEIGHT]) = { 0 };

  for (int repeats = 0; repeats < num_repeats_; repeats++) {
    if (saturate_test_) {
      const int max_val = (1 << bd_) - 1;
      SetArray(y_src, width, height, y_stride, max_val);
      SetArray(y_pre, width, height, y_stride, 0);
      SetArray(u_src, uv_width, uv_height, uv_stride, max_val);
      SetArray(u_pre, uv_width, uv_height, uv_stride, 0);
      SetArray(v_src, uv_width, uv_height, uv_stride, max_val);
      SetArray(v_pre, uv_width, uv_height, uv_stride, 0);
    } else {
      const int max_val = 7 << (bd_ - 8);
      SetArray(y_src, width, height, y_stride, &rnd_, 0, max_val);
      SetArray(y_pre, width, height, y_stride, &rnd_, 0, max_val);
      SetArray(u_src, uv_width, uv_height, uv_stride, &rnd_, 0, max_val);
      SetArray(u_pre, uv_width, uv_height, uv_stride, &rnd_, 0, max_val);
      SetArray(v_src, uv_width, uv_height, uv_stride, &rnd_, 0, max_val);
      SetArray(v_pre, uv_width, uv_height, uv_stride, &rnd_, 0, max_val);
    }

    ApplyReferenceFilter<PixelType>(
        y_src, y_pre, u_src, v_src, u_pre, v_pre, width, height, ss_x, ss_y,
        filter_strength, filter_weight, use_32x32, y_accum_ref, y_count_ref,
        u_accum_ref, u_count_ref, v_accum_ref, v_count_ref);

    ApplyTestFilter(y_src, y_stride, y_pre, y_stride, u_src, v_src, uv_stride,
                    u_pre, v_pre, uv_stride, width, height, ss_x, ss_y,
                    filter_strength, filter_weight, use_32x32, y_accum_tst,
                    y_count_tst, u_accum_tst, u_count_tst, v_accum_tst,
                    v_count_tst);

    EXPECT_TRUE(CheckArrayEqual(y_accum_tst, y_accum_ref, width, height,
                                y_stride, y_stride));
    EXPECT_TRUE(CheckArrayEqual(y_count_tst, y_count_ref, width, height,
                                y_stride, y_stride));
    EXPECT_TRUE(CheckArrayEqual(u_accum_tst, u_accum_ref, uv_width, uv_height,
                                uv_stride, uv_stride));
    EXPECT_TRUE(CheckArrayEqual(u_count_tst, u_count_ref, uv_width, uv_height,
                                uv_stride, uv_stride));
    EXPECT_TRUE(CheckArrayEqual(v_accum_tst, v_accum_ref, uv_width, uv_height,
                                uv_stride, uv_stride));
    EXPECT_TRUE(CheckArrayEqual(v_count_tst, v_count_ref, uv_width, uv_height,
                                uv_stride, uv_stride));

    if (HasFailure()) {
      if (use_32x32) {
        printf("SS_X: %d, SS_Y: %d, Strength: %d, Weight: %d\n", ss_x, ss_y,
               filter_strength, *filter_weight);
      } else {
        printf("SS_X: %d, SS_Y: %d, Strength: %d, Weights: %d,%d,%d,%d\n", ss_x,
               ss_y, filter_strength, filter_weight[0], filter_weight[1],
               filter_weight[2], filter_weight[3]);
      }

      PrintArrayDiff(y_accum_ref, y_accum_tst, width, height, y_stride,
                     y_stride);
      PrintArrayDiff(y_count_ref, y_count_tst, width, height, y_stride,
                     y_stride);
      PrintArrayDiff(u_accum_ref, v_accum_tst, uv_width, uv_height, uv_stride,
                     uv_stride);
      PrintArrayDiff(u_count_ref, v_count_tst, uv_width, uv_height, uv_stride,
                     uv_stride);
      PrintArrayDiff(u_accum_ref, v_accum_tst, uv_width, uv_height, uv_stride,
                     uv_stride);
      PrintArrayDiff(u_count_ref, v_count_tst, uv_width, uv_height, uv_stride,
                     uv_stride);

      return;
    }
  }
}

template <typename PixelType>
void YUVTemporalFilterTest::RunTestFilterWithParam(int width, int height,
                                                   int ss_x, int ss_y,
                                                   int filter_strength,
                                                   int use_32x32,
                                                   const int *filter_weight) {
  PixelType y_src[MAX_WIDTH * MAX_HEIGHT] = { 0 };
  PixelType y_pre[MAX_WIDTH * MAX_HEIGHT] = { 0 };
  uint16_t y_count[MAX_WIDTH * MAX_HEIGHT] = { 0 };
  uint32_t y_accum[MAX_WIDTH * MAX_HEIGHT] = { 0 };

  PixelType u_src[MAX_WIDTH * MAX_HEIGHT] = { 0 };
  PixelType u_pre[MAX_WIDTH * MAX_HEIGHT] = { 0 };
  uint16_t u_count[MAX_WIDTH * MAX_HEIGHT] = { 0 };
  uint32_t u_accum[MAX_WIDTH * MAX_HEIGHT] = { 0 };

  PixelType v_src[MAX_WIDTH * MAX_HEIGHT] = { 0 };
  PixelType v_pre[MAX_WIDTH * MAX_HEIGHT] = { 0 };
  uint16_t v_count[MAX_WIDTH * MAX_HEIGHT] = { 0 };
  uint32_t v_accum[MAX_WIDTH * MAX_HEIGHT] = { 0 };

  SetArray(y_src, width, height, MAX_WIDTH, &rnd_, 0, 7 << (bd_ = 8));
  SetArray(y_pre, width, height, MAX_WIDTH, &rnd_, 0, 7 << (bd_ = 8));
  SetArray(u_src, width, height, MAX_WIDTH, &rnd_, 0, 7 << (bd_ = 8));
  SetArray(u_pre, width, height, MAX_WIDTH, &rnd_, 0, 7 << (bd_ = 8));
  SetArray(v_src, width, height, MAX_WIDTH, &rnd_, 0, 7 << (bd_ = 8));
  SetArray(v_pre, width, height, MAX_WIDTH, &rnd_, 0, 7 << (bd_ = 8));

  for (int repeats = 0; repeats < num_repeats_; repeats++) {
    ApplyTestFilter(y_src, MAX_WIDTH, y_pre, MAX_WIDTH, u_src, v_src, MAX_WIDTH,
                    u_pre, v_pre, MAX_WIDTH, width, height, ss_x, ss_y,
                    filter_strength, filter_weight, use_32x32, y_accum, y_count,
                    u_accum, u_count, v_accum, v_count);
  }
}

TEST_P(YUVTemporalFilterTest, Use32x32) {
  const int width = 32, height = 32;
  const int use_32x32 = 1;

  for (int ss_x = 0; ss_x <= 1; ss_x++) {
    for (int ss_y = 0; ss_y <= 1; ss_y++) {
      for (int filter_strength = 0; filter_strength <= 6;
           filter_strength += 2) {
        for (int filter_weight = 0; filter_weight <= 2; filter_weight++) {
          if (use_highbd_) {
            const int adjusted_strength = filter_strength + 2 * (bd_ - 8);
            CompareTestWithParam<uint16_t>(width, height, ss_x, ss_y,
                                           adjusted_strength, use_32x32,
                                           &filter_weight);
          } else {
            CompareTestWithParam<uint8_t>(width, height, ss_x, ss_y,
                                          filter_strength, use_32x32,
                                          &filter_weight);
          }
          ASSERT_FALSE(HasFailure());
        }
      }
    }
  }
}

TEST_P(YUVTemporalFilterTest, Use16x16) {
  const int width = 32, height = 32;
  const int use_32x32 = 0;

  for (int ss_x = 0; ss_x <= 1; ss_x++) {
    for (int ss_y = 0; ss_y <= 1; ss_y++) {
      for (int filter_idx = 0; filter_idx < 3 * 3 * 3 * 3; filter_idx++) {
        // Set up the filter
        int filter_weight[4];
        int filter_idx_cp = filter_idx;
        for (int idx = 0; idx < 4; idx++) {
          filter_weight[idx] = filter_idx_cp % 3;
          filter_idx_cp /= 3;
        }

        // Test each parameter
        for (int filter_strength = 0; filter_strength <= 6;
             filter_strength += 2) {
          if (use_highbd_) {
            const int adjusted_strength = filter_strength + 2 * (bd_ - 8);
            CompareTestWithParam<uint16_t>(width, height, ss_x, ss_y,
                                           adjusted_strength, use_32x32,
                                           filter_weight);
          } else {
            CompareTestWithParam<uint8_t>(width, height, ss_x, ss_y,
                                          filter_strength, use_32x32,
                                          filter_weight);
          }

          ASSERT_FALSE(HasFailure());
        }
      }
    }
  }
}

TEST_P(YUVTemporalFilterTest, SaturationTest) {
  const int width = 32, height = 32;
  const int use_32x32 = 1;
  const int filter_weight = 1;
  saturate_test_ = 1;

  for (int ss_x = 0; ss_x <= 1; ss_x++) {
    for (int ss_y = 0; ss_y <= 1; ss_y++) {
      for (int filter_strength = 0; filter_strength <= 6;
           filter_strength += 2) {
        if (use_highbd_) {
          const int adjusted_strength = filter_strength + 2 * (bd_ - 8);
          CompareTestWithParam<uint16_t>(width, height, ss_x, ss_y,
                                         adjusted_strength, use_32x32,
                                         &filter_weight);
        } else {
          CompareTestWithParam<uint8_t>(width, height, ss_x, ss_y,
                                        filter_strength, use_32x32,
                                        &filter_weight);
        }

        ASSERT_FALSE(HasFailure());
      }
    }
  }
}

TEST_P(YUVTemporalFilterTest, DISABLED_Speed) {
  const int width = 32, height = 32;
  num_repeats_ = 1000;

  for (int use_32x32 = 0; use_32x32 <= 1; use_32x32++) {
    const int num_filter_weights = use_32x32 ? 3 : 3 * 3 * 3 * 3;
    for (int ss_x = 0; ss_x <= 1; ss_x++) {
      for (int ss_y = 0; ss_y <= 1; ss_y++) {
        for (int filter_idx = 0; filter_idx < num_filter_weights;
             filter_idx++) {
          // Set up the filter
          int filter_weight[4];
          int filter_idx_cp = filter_idx;
          for (int idx = 0; idx < 4; idx++) {
            filter_weight[idx] = filter_idx_cp % 3;
            filter_idx_cp /= 3;
          }

          // Test each parameter
          for (int filter_strength = 0; filter_strength <= 6;
               filter_strength += 2) {
            aom_usec_timer timer;
            aom_usec_timer_start(&timer);

            if (use_highbd_) {
              RunTestFilterWithParam<uint16_t>(width, height, ss_x, ss_y,
                                               filter_strength, use_32x32,
                                               filter_weight);
            } else {
              RunTestFilterWithParam<uint8_t>(width, height, ss_x, ss_y,
                                              filter_strength, use_32x32,
                                              filter_weight);
            }

            aom_usec_timer_mark(&timer);
            const int elapsed_time =
                static_cast<int>(aom_usec_timer_elapsed(&timer));

            printf(
                "Bitdepth: %d, Use 32X32: %d, SS_X: %d, SS_Y: %d, Weight Idx: "
                "%d, Strength: %d, Time: %5d\n",
                bd_, use_32x32, ss_x, ss_y, filter_idx, filter_strength,
                elapsed_time);
          }
        }
      }
    }
  }
}

INSTANTIATE_TEST_CASE_P(
    C, YUVTemporalFilterTest,
    ::testing::Values(
        TemporalFilterWithBd(&av1_apply_temporal_filter_yuv_c, 8),
        TemporalFilterWithBd(&av1_highbd_apply_temporal_filter_yuv_c, 10),
        TemporalFilterWithBd(&av1_highbd_apply_temporal_filter_yuv_c, 12)));

#if HAVE_SSE4_1
INSTANTIATE_TEST_CASE_P(
    SSE4_1, YUVTemporalFilterTest,
    ::testing::Values(
        TemporalFilterWithBd(&av1_apply_temporal_filter_yuv_sse4_1, 8),
        TemporalFilterWithBd(&av1_highbd_apply_temporal_filter_yuv_sse4_1, 10),
        TemporalFilterWithBd(&av1_highbd_apply_temporal_filter_yuv_sse4_1,
                             12)));
#endif  // HAVE_SSE4_1

}  // namespace
