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

#include <tuple>

#include "third_party/googletest/src/googletest/include/gtest/gtest.h"

#include "test/register_state_check.h"
#include "test/acm_random.h"
#include "test/util.h"

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

#include "aom/aom_integer.h"
#include "aom_ports/aom_timer.h"
#include "av1/encoder/pickrst.h"

#define MAX_DATA_BLOCK 384

namespace pickrst_test_lowbd {
static const int kIterations = 100;

typedef int64_t (*lowbd_pixel_proj_error_func)(
    const uint8_t *src8, int width, int height, int src_stride,
    const uint8_t *dat8, int dat_stride, int32_t *flt0, int flt0_stride,
    int32_t *flt1, int flt1_stride, int xq[2], const sgr_params_type *params);

////////////////////////////////////////////////////////////////////////////////
// 8 bit
////////////////////////////////////////////////////////////////////////////////

typedef std::tuple<const lowbd_pixel_proj_error_func> PixelProjErrorTestParam;

class PixelProjErrorTest
    : public ::testing::TestWithParam<PixelProjErrorTestParam> {
 public:
  virtual void SetUp() {
    target_func_ = GET_PARAM(0);
    src_ = (uint8_t *)(aom_malloc(MAX_DATA_BLOCK * MAX_DATA_BLOCK *
                                  sizeof(*src_)));
    ASSERT_NE(src_, nullptr);
    dgd_ = (uint8_t *)(aom_malloc(MAX_DATA_BLOCK * MAX_DATA_BLOCK *
                                  sizeof(*dgd_)));
    ASSERT_NE(dgd_, nullptr);
    flt0_ = (int32_t *)(aom_malloc(MAX_DATA_BLOCK * MAX_DATA_BLOCK *
                                   sizeof(*flt0_)));
    ASSERT_NE(flt0_, nullptr);
    flt1_ = (int32_t *)(aom_malloc(MAX_DATA_BLOCK * MAX_DATA_BLOCK *
                                   sizeof(*flt1_)));
    ASSERT_NE(flt1_, nullptr);
  }
  virtual void TearDown() {
    aom_free(src_);
    aom_free(dgd_);
    aom_free(flt0_);
    aom_free(flt1_);
  }
  void RunPixelProjErrorTest(int32_t run_times);
  void RunPixelProjErrorTest_ExtremeValues();

 private:
  lowbd_pixel_proj_error_func target_func_;
  libaom_test::ACMRandom rng_;
  uint8_t *src_;
  uint8_t *dgd_;
  int32_t *flt0_;
  int32_t *flt1_;
};
GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(PixelProjErrorTest);

void PixelProjErrorTest::RunPixelProjErrorTest(int32_t run_times) {
  int h_end = run_times != 1 ? 128 : (rng_.Rand16() % MAX_DATA_BLOCK) + 1;
  int v_end = run_times != 1 ? 128 : (rng_.Rand16() % MAX_DATA_BLOCK) + 1;
  const int dgd_stride = MAX_DATA_BLOCK;
  const int src_stride = MAX_DATA_BLOCK;
  const int flt0_stride = MAX_DATA_BLOCK;
  const int flt1_stride = MAX_DATA_BLOCK;
  sgr_params_type params;
  int xq[2];
  const int iters = run_times == 1 ? kIterations : 4;
  for (int iter = 0; iter < iters && !HasFatalFailure(); ++iter) {
    int64_t err_ref = 0, err_test = 1;
    for (int i = 0; i < MAX_DATA_BLOCK * MAX_DATA_BLOCK; ++i) {
      dgd_[i] = rng_.Rand8();
      src_[i] = rng_.Rand8();
      flt0_[i] = rng_.Rand15Signed();
      flt1_[i] = rng_.Rand15Signed();
    }
    xq[0] = rng_.Rand8() % (1 << SGRPROJ_PRJ_BITS);
    xq[1] = rng_.Rand8() % (1 << SGRPROJ_PRJ_BITS);
    params.r[0] = run_times == 1 ? (rng_.Rand8() % MAX_RADIUS) : (iter % 2);
    params.r[1] = run_times == 1 ? (rng_.Rand8() % MAX_RADIUS) : (iter / 2);
    params.s[0] = run_times == 1 ? (rng_.Rand8() % MAX_RADIUS) : (iter % 2);
    params.s[1] = run_times == 1 ? (rng_.Rand8() % MAX_RADIUS) : (iter / 2);
    uint8_t *dgd = dgd_;
    uint8_t *src = src_;

    aom_usec_timer timer;
    aom_usec_timer_start(&timer);
    for (int i = 0; i < run_times; ++i) {
      err_ref = av1_lowbd_pixel_proj_error_c(src, h_end, v_end, src_stride, dgd,
                                             dgd_stride, flt0_, flt0_stride,
                                             flt1_, flt1_stride, xq, &params);
    }
    aom_usec_timer_mark(&timer);
    const double time1 = static_cast<double>(aom_usec_timer_elapsed(&timer));
    aom_usec_timer_start(&timer);
    for (int i = 0; i < run_times; ++i) {
      err_test =
          target_func_(src, h_end, v_end, src_stride, dgd, dgd_stride, flt0_,
                       flt0_stride, flt1_, flt1_stride, xq, &params);
    }
    aom_usec_timer_mark(&timer);
    const double time2 = static_cast<double>(aom_usec_timer_elapsed(&timer));
    if (run_times > 10) {
      printf("r0 %d r1 %d %3dx%-3d:%7.2f/%7.2fns (%3.2f)\n", params.r[0],
             params.r[1], h_end, v_end, time1, time2, time1 / time2);
    }
    ASSERT_EQ(err_ref, err_test);
  }
}

void PixelProjErrorTest::RunPixelProjErrorTest_ExtremeValues() {
  const int h_start = 0;
  int h_end = 192;
  const int v_start = 0;
  int v_end = 192;
  const int dgd_stride = MAX_DATA_BLOCK;
  const int src_stride = MAX_DATA_BLOCK;
  const int flt0_stride = MAX_DATA_BLOCK;
  const int flt1_stride = MAX_DATA_BLOCK;
  sgr_params_type params;
  int xq[2];
  const int iters = kIterations;
  for (int iter = 0; iter < iters && !HasFatalFailure(); ++iter) {
    int64_t err_ref = 0, err_test = 1;
    for (int i = 0; i < MAX_DATA_BLOCK * MAX_DATA_BLOCK; ++i) {
      dgd_[i] = 0;
      src_[i] = 255;
      flt0_[i] = rng_.Rand15Signed();
      flt1_[i] = rng_.Rand15Signed();
    }
    xq[0] = rng_.Rand8() % (1 << SGRPROJ_PRJ_BITS);
    xq[1] = rng_.Rand8() % (1 << SGRPROJ_PRJ_BITS);
    params.r[0] = rng_.Rand8() % MAX_RADIUS;
    params.r[1] = rng_.Rand8() % MAX_RADIUS;
    params.s[0] = rng_.Rand8() % MAX_RADIUS;
    params.s[1] = rng_.Rand8() % MAX_RADIUS;
    uint8_t *dgd = dgd_;
    uint8_t *src = src_;

    err_ref = av1_lowbd_pixel_proj_error_c(
        src, h_end - h_start, v_end - v_start, src_stride, dgd, dgd_stride,
        flt0_, flt0_stride, flt1_, flt1_stride, xq, &params);

    err_test = target_func_(src, h_end - h_start, v_end - v_start, src_stride,
                            dgd, dgd_stride, flt0_, flt0_stride, flt1_,
                            flt1_stride, xq, &params);

    ASSERT_EQ(err_ref, err_test);
  }
}

TEST_P(PixelProjErrorTest, RandomValues) { RunPixelProjErrorTest(1); }

TEST_P(PixelProjErrorTest, ExtremeValues) {
  RunPixelProjErrorTest_ExtremeValues();
}

TEST_P(PixelProjErrorTest, DISABLED_Speed) { RunPixelProjErrorTest(200000); }

#if HAVE_SSE4_1
INSTANTIATE_TEST_SUITE_P(SSE4_1, PixelProjErrorTest,
                         ::testing::Values(av1_lowbd_pixel_proj_error_sse4_1));
#endif  // HAVE_SSE4_1

#if HAVE_AVX2

INSTANTIATE_TEST_SUITE_P(AVX2, PixelProjErrorTest,
                         ::testing::Values(av1_lowbd_pixel_proj_error_avx2));
#endif  // HAVE_AVX2

#if HAVE_NEON

INSTANTIATE_TEST_SUITE_P(NEON, PixelProjErrorTest,
                         ::testing::Values(av1_lowbd_pixel_proj_error_neon));
#endif  // HAVE_NEON

}  // namespace pickrst_test_lowbd

namespace pickrst_test_highbd {
static const int kIterations = 100;

typedef int64_t (*highbd_pixel_proj_error_func)(
    const uint8_t *src8, int width, int height, int src_stride,
    const uint8_t *dat8, int dat_stride, int32_t *flt0, int flt0_stride,
    int32_t *flt1, int flt1_stride, int xq[2], const sgr_params_type *params);

////////////////////////////////////////////////////////////////////////////////
// High bit-depth
////////////////////////////////////////////////////////////////////////////////

typedef std::tuple<const highbd_pixel_proj_error_func> PixelProjErrorTestParam;

class PixelProjHighbdErrorTest
    : public ::testing::TestWithParam<PixelProjErrorTestParam> {
 public:
  virtual void SetUp() {
    target_func_ = GET_PARAM(0);
    src_ =
        (uint16_t *)aom_malloc(MAX_DATA_BLOCK * MAX_DATA_BLOCK * sizeof(*src_));
    ASSERT_NE(src_, nullptr);
    dgd_ =
        (uint16_t *)aom_malloc(MAX_DATA_BLOCK * MAX_DATA_BLOCK * sizeof(*dgd_));
    ASSERT_NE(dgd_, nullptr);
    flt0_ =
        (int32_t *)aom_malloc(MAX_DATA_BLOCK * MAX_DATA_BLOCK * sizeof(*flt0_));
    ASSERT_NE(flt0_, nullptr);
    flt1_ =
        (int32_t *)aom_malloc(MAX_DATA_BLOCK * MAX_DATA_BLOCK * sizeof(*flt1_));
    ASSERT_NE(flt1_, nullptr);
  }
  virtual void TearDown() {
    aom_free(src_);
    aom_free(dgd_);
    aom_free(flt0_);
    aom_free(flt1_);
  }
  void RunPixelProjErrorTest(int32_t run_times);
  void RunPixelProjErrorTest_ExtremeValues();

 private:
  highbd_pixel_proj_error_func target_func_;
  libaom_test::ACMRandom rng_;
  uint16_t *src_;
  uint16_t *dgd_;
  int32_t *flt0_;
  int32_t *flt1_;
};
GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(PixelProjHighbdErrorTest);

void PixelProjHighbdErrorTest::RunPixelProjErrorTest(int32_t run_times) {
  int h_end = run_times != 1 ? 128 : (rng_.Rand16() % MAX_DATA_BLOCK) + 1;
  int v_end = run_times != 1 ? 128 : (rng_.Rand16() % MAX_DATA_BLOCK) + 1;
  const int dgd_stride = MAX_DATA_BLOCK;
  const int src_stride = MAX_DATA_BLOCK;
  const int flt0_stride = MAX_DATA_BLOCK;
  const int flt1_stride = MAX_DATA_BLOCK;
  sgr_params_type params;
  int xq[2];
  const int iters = run_times == 1 ? kIterations : 4;
  for (int iter = 0; iter < iters && !HasFatalFailure(); ++iter) {
    int64_t err_ref = 0, err_test = 1;
    for (int i = 0; i < MAX_DATA_BLOCK * MAX_DATA_BLOCK; ++i) {
      dgd_[i] = rng_.Rand16() % (1 << 12);
      src_[i] = rng_.Rand16() % (1 << 12);
      flt0_[i] = rng_.Rand15Signed();
      flt1_[i] = rng_.Rand15Signed();
    }
    xq[0] = rng_.Rand8() % (1 << SGRPROJ_PRJ_BITS);
    xq[1] = rng_.Rand8() % (1 << SGRPROJ_PRJ_BITS);
    params.r[0] = run_times == 1 ? (rng_.Rand8() % MAX_RADIUS) : (iter % 2);
    params.r[1] = run_times == 1 ? (rng_.Rand8() % MAX_RADIUS) : (iter / 2);
    params.s[0] = run_times == 1 ? (rng_.Rand8() % MAX_RADIUS) : (iter % 2);
    params.s[1] = run_times == 1 ? (rng_.Rand8() % MAX_RADIUS) : (iter / 2);
    uint8_t *dgd8 = CONVERT_TO_BYTEPTR(dgd_);
    uint8_t *src8 = CONVERT_TO_BYTEPTR(src_);

    aom_usec_timer timer;
    aom_usec_timer_start(&timer);
    for (int i = 0; i < run_times; ++i) {
      err_ref = av1_highbd_pixel_proj_error_c(
          src8, h_end, v_end, src_stride, dgd8, dgd_stride, flt0_, flt0_stride,
          flt1_, flt1_stride, xq, &params);
    }
    aom_usec_timer_mark(&timer);
    const double time1 = static_cast<double>(aom_usec_timer_elapsed(&timer));
    aom_usec_timer_start(&timer);
    for (int i = 0; i < run_times; ++i) {
      err_test =
          target_func_(src8, h_end, v_end, src_stride, dgd8, dgd_stride, flt0_,
                       flt0_stride, flt1_, flt1_stride, xq, &params);
    }
    aom_usec_timer_mark(&timer);
    const double time2 = static_cast<double>(aom_usec_timer_elapsed(&timer));
    if (run_times > 10) {
      printf("r0 %d r1 %d %3dx%-3d:%7.2f/%7.2fns (%3.2f)\n", params.r[0],
             params.r[1], h_end, v_end, time1, time2, time1 / time2);
    }
    ASSERT_EQ(err_ref, err_test);
  }
}

void PixelProjHighbdErrorTest::RunPixelProjErrorTest_ExtremeValues() {
  const int h_start = 0;
  int h_end = 192;
  const int v_start = 0;
  int v_end = 192;
  const int dgd_stride = MAX_DATA_BLOCK;
  const int src_stride = MAX_DATA_BLOCK;
  const int flt0_stride = MAX_DATA_BLOCK;
  const int flt1_stride = MAX_DATA_BLOCK;
  sgr_params_type params;
  int xq[2];
  const int iters = kIterations;
  for (int iter = 0; iter < iters && !HasFatalFailure(); ++iter) {
    int64_t err_ref = 0, err_test = 1;
    for (int i = 0; i < MAX_DATA_BLOCK * MAX_DATA_BLOCK; ++i) {
      dgd_[i] = 0;
      src_[i] = (1 << 12) - 1;
      flt0_[i] = rng_.Rand15Signed();
      flt1_[i] = rng_.Rand15Signed();
    }
    xq[0] = rng_.Rand8() % (1 << SGRPROJ_PRJ_BITS);
    xq[1] = rng_.Rand8() % (1 << SGRPROJ_PRJ_BITS);
    params.r[0] = rng_.Rand8() % MAX_RADIUS;
    params.r[1] = rng_.Rand8() % MAX_RADIUS;
    params.s[0] = rng_.Rand8() % MAX_RADIUS;
    params.s[1] = rng_.Rand8() % MAX_RADIUS;
    uint8_t *dgd8 = CONVERT_TO_BYTEPTR(dgd_);
    uint8_t *src8 = CONVERT_TO_BYTEPTR(src_);

    err_ref = av1_highbd_pixel_proj_error_c(
        src8, h_end - h_start, v_end - v_start, src_stride, dgd8, dgd_stride,
        flt0_, flt0_stride, flt1_, flt1_stride, xq, &params);

    err_test = target_func_(src8, h_end - h_start, v_end - v_start, src_stride,
                            dgd8, dgd_stride, flt0_, flt0_stride, flt1_,
                            flt1_stride, xq, &params);

    ASSERT_EQ(err_ref, err_test);
  }
}

TEST_P(PixelProjHighbdErrorTest, RandomValues) { RunPixelProjErrorTest(1); }

TEST_P(PixelProjHighbdErrorTest, ExtremeValues) {
  RunPixelProjErrorTest_ExtremeValues();
}

TEST_P(PixelProjHighbdErrorTest, DISABLED_Speed) {
  RunPixelProjErrorTest(200000);
}

#if HAVE_SSE4_1
INSTANTIATE_TEST_SUITE_P(SSE4_1, PixelProjHighbdErrorTest,
                         ::testing::Values(av1_highbd_pixel_proj_error_sse4_1));
#endif  // HAVE_SSE4_1

#if HAVE_AVX2

INSTANTIATE_TEST_SUITE_P(AVX2, PixelProjHighbdErrorTest,
                         ::testing::Values(av1_highbd_pixel_proj_error_avx2));
#endif  // HAVE_AVX2

}  // namespace pickrst_test_highbd

////////////////////////////////////////////////////////////////////////////////
// Get_proj_subspace_Test
////////////////////////////////////////////////////////////////////////////////

namespace get_proj_subspace_test_lowbd {
static const int kIterations = 100;

typedef void (*set_get_proj_subspace)(const uint8_t *src8, int width,
                                      int height, int src_stride,
                                      const uint8_t *dat8, int dat_stride,
                                      int32_t *flt0, int flt0_stride,
                                      int32_t *flt1, int flt1_stride,
                                      int64_t H[2][2], int64_t C[2],
                                      const sgr_params_type *params);

typedef std::tuple<const set_get_proj_subspace> GetProjSubspaceTestParam;

class GetProjSubspaceTest
    : public ::testing::TestWithParam<GetProjSubspaceTestParam> {
 public:
  virtual void SetUp() {
    target_func_ = GET_PARAM(0);
    src_ = (uint8_t *)(aom_malloc(MAX_DATA_BLOCK * MAX_DATA_BLOCK *
                                  sizeof(*src_)));
    ASSERT_NE(src_, nullptr);
    dgd_ = (uint8_t *)(aom_malloc(MAX_DATA_BLOCK * MAX_DATA_BLOCK *
                                  sizeof(*dgd_)));
    ASSERT_NE(dgd_, nullptr);
    flt0_ = (int32_t *)(aom_malloc(MAX_DATA_BLOCK * MAX_DATA_BLOCK *
                                   sizeof(*flt0_)));
    ASSERT_NE(flt0_, nullptr);
    flt1_ = (int32_t *)(aom_malloc(MAX_DATA_BLOCK * MAX_DATA_BLOCK *
                                   sizeof(*flt1_)));
    ASSERT_NE(flt1_, nullptr);
  }
  virtual void TearDown() {
    aom_free(src_);
    aom_free(dgd_);
    aom_free(flt0_);
    aom_free(flt1_);
  }
  void RunGetProjSubspaceTest(int32_t run_times);
  void RunGetProjSubspaceTest_ExtremeValues();

 private:
  set_get_proj_subspace target_func_;
  libaom_test::ACMRandom rng_;
  uint8_t *src_;
  uint8_t *dgd_;
  int32_t *flt0_;
  int32_t *flt1_;
};
GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(GetProjSubspaceTest);

void GetProjSubspaceTest::RunGetProjSubspaceTest(int32_t run_times) {
  int h_end = run_times != 1
                  ? 128
                  : ((rng_.Rand16() % MAX_DATA_BLOCK) &
                     2147483640);  // We test for widths divisible by 8.
  int v_end =
      run_times != 1 ? 128 : ((rng_.Rand16() % MAX_DATA_BLOCK) & 2147483640);
  const int dgd_stride = MAX_DATA_BLOCK;
  const int src_stride = MAX_DATA_BLOCK;
  const int flt0_stride = MAX_DATA_BLOCK;
  const int flt1_stride = MAX_DATA_BLOCK;
  sgr_params_type params;
  const int iters = run_times == 1 ? kIterations : 4;
  for (int iter = 0; iter < iters && !HasFatalFailure(); ++iter) {
    int64_t C_ref[2] = { 0 }, C_test[2] = { 0 };
    int64_t H_ref[2][2] = { { 0, 0 }, { 0, 0 } };
    int64_t H_test[2][2] = { { 0, 0 }, { 0, 0 } };
    for (int i = 0; i < MAX_DATA_BLOCK * MAX_DATA_BLOCK; ++i) {
      dgd_[i] = rng_.Rand8();
      src_[i] = rng_.Rand8();
      flt0_[i] = rng_.Rand15Signed();
      flt1_[i] = rng_.Rand15Signed();
    }

    params.r[0] = run_times == 1 ? (rng_.Rand8() % MAX_RADIUS) : 1;
    params.r[1] = run_times == 1 ? (rng_.Rand8() % MAX_RADIUS) : 1;
    params.s[0] = run_times == 1 ? (rng_.Rand8() % MAX_RADIUS) : (iter % 2);
    params.s[1] = run_times == 1 ? (rng_.Rand8() % MAX_RADIUS) : (iter / 2);
    uint8_t *dgd = dgd_;
    uint8_t *src = src_;

    aom_usec_timer timer;
    aom_usec_timer_start(&timer);
    for (int i = 0; i < run_times; ++i) {
      av1_calc_proj_params_c(src, v_end, h_end, src_stride, dgd, dgd_stride,
                             flt0_, flt0_stride, flt1_, flt1_stride, H_ref,
                             C_ref, &params);
    }
    aom_usec_timer_mark(&timer);
    const double time1 = static_cast<double>(aom_usec_timer_elapsed(&timer));
    aom_usec_timer_start(&timer);
    for (int i = 0; i < run_times; ++i) {
      target_func_(src, v_end, h_end, src_stride, dgd, dgd_stride, flt0_,
                   flt0_stride, flt1_, flt1_stride, H_test, C_test, &params);
    }
    aom_usec_timer_mark(&timer);
    const double time2 = static_cast<double>(aom_usec_timer_elapsed(&timer));
    if (run_times > 10) {
      printf("r0 %d r1 %d %3dx%-3d:%7.2f/%7.2fns (%3.2f)\n", params.r[0],
             params.r[1], h_end, v_end, time1, time2, time1 / time2);
    } else {
      ASSERT_EQ(H_ref[0][0], H_test[0][0]);
      ASSERT_EQ(H_ref[0][1], H_test[0][1]);
      ASSERT_EQ(H_ref[1][0], H_test[1][0]);
      ASSERT_EQ(H_ref[1][1], H_test[1][1]);
      ASSERT_EQ(C_ref[0], C_test[0]);
      ASSERT_EQ(C_ref[1], C_test[1]);
    }
  }
}

void GetProjSubspaceTest::RunGetProjSubspaceTest_ExtremeValues() {
  const int h_start = 0;
  int h_end = MAX_DATA_BLOCK;
  const int v_start = 0;
  int v_end = MAX_DATA_BLOCK;
  const int dgd_stride = MAX_DATA_BLOCK;
  const int src_stride = MAX_DATA_BLOCK;
  const int flt0_stride = MAX_DATA_BLOCK;
  const int flt1_stride = MAX_DATA_BLOCK;
  sgr_params_type params;
  const int iters = kIterations;
  for (int iter = 0; iter < iters && !HasFatalFailure(); ++iter) {
    int64_t C_ref[2] = { 0 }, C_test[2] = { 0 };
    int64_t H_ref[2][2] = { { 0, 0 }, { 0, 0 } };
    int64_t H_test[2][2] = { { 0, 0 }, { 0, 0 } };
    for (int i = 0; i < MAX_DATA_BLOCK * MAX_DATA_BLOCK; ++i) {
      dgd_[i] = 0;
      src_[i] = 255;
      flt0_[i] = rng_.Rand15Signed();
      flt1_[i] = rng_.Rand15Signed();
    }
    params.r[0] = 1;
    params.r[1] = 1;
    params.s[0] = rng_.Rand8() % MAX_RADIUS;
    params.s[1] = rng_.Rand8() % MAX_RADIUS;
    uint8_t *dgd = dgd_;
    uint8_t *src = src_;

    av1_calc_proj_params_c(src, h_end - h_start, v_end - v_start, src_stride,
                           dgd, dgd_stride, flt0_, flt0_stride, flt1_,
                           flt1_stride, H_ref, C_ref, &params);

    target_func_(src, h_end - h_start, v_end - v_start, src_stride, dgd,
                 dgd_stride, flt0_, flt0_stride, flt1_, flt1_stride, H_test,
                 C_test, &params);

    ASSERT_EQ(H_ref[0][0], H_test[0][0]);
    ASSERT_EQ(H_ref[0][1], H_test[0][1]);
    ASSERT_EQ(H_ref[1][0], H_test[1][0]);
    ASSERT_EQ(H_ref[1][1], H_test[1][1]);
    ASSERT_EQ(C_ref[0], C_test[0]);
    ASSERT_EQ(C_ref[1], C_test[1]);
  }
}

TEST_P(GetProjSubspaceTest, RandomValues) { RunGetProjSubspaceTest(1); }

TEST_P(GetProjSubspaceTest, ExtremeValues) {
  RunGetProjSubspaceTest_ExtremeValues();
}

TEST_P(GetProjSubspaceTest, DISABLED_Speed) { RunGetProjSubspaceTest(200000); }

#if HAVE_AVX2

INSTANTIATE_TEST_SUITE_P(AVX2, GetProjSubspaceTest,
                         ::testing::Values(av1_calc_proj_params_avx2));
#endif  // HAVE_AVX2

}  // namespace get_proj_subspace_test_lowbd
