Enable test system to detect transforms misusing 'stride' parameter

This would have caught the bug introduced in patch set 1 of
https://chromium-review.googlesource.com/#/c/397378/

Change-Id: I9c6d5d9c4c98aed5ac48c4fb1c4ff4131b0df1d5
diff --git a/test/av1_fht16x16_test.cc b/test/av1_fht16x16_test.cc
index 51fead7..4a44e16 100644
--- a/test/av1_fht16x16_test.cc
+++ b/test/av1_fht16x16_test.cc
@@ -68,6 +68,7 @@
     inv_txfm_ = GET_PARAM(1);
     tx_type_ = GET_PARAM(2);
     pitch_ = 16;
+    height_ = 16;
     fwd_txfm_ref = fht16x16_ref;
     bit_depth_ = GET_PARAM(3);
     mask_ = (1 << bit_depth_) - 1;
diff --git a/test/av1_fht16x32_test.cc b/test/av1_fht16x32_test.cc
index 9a55f3d..8ff96b3 100644
--- a/test/av1_fht16x32_test.cc
+++ b/test/av1_fht16x32_test.cc
@@ -47,6 +47,7 @@
     inv_txfm_ = GET_PARAM(1);
     tx_type_ = GET_PARAM(2);
     pitch_ = 16;
+    height_ = 32;
     fwd_txfm_ref = fht16x32_ref;
     inv_txfm_ref = iht16x32_ref;
     bit_depth_ = GET_PARAM(3);
diff --git a/test/av1_fht16x8_test.cc b/test/av1_fht16x8_test.cc
index 3917bf5..df429e1 100644
--- a/test/av1_fht16x8_test.cc
+++ b/test/av1_fht16x8_test.cc
@@ -43,6 +43,7 @@
     inv_txfm_ = GET_PARAM(1);
     tx_type_ = GET_PARAM(2);
     pitch_ = 16;
+    height_ = 8;
     fwd_txfm_ref = fht16x8_ref;
     bit_depth_ = GET_PARAM(3);
     mask_ = (1 << bit_depth_) - 1;
diff --git a/test/av1_fht32x16_test.cc b/test/av1_fht32x16_test.cc
index 3a7ca9b..41c0b1c 100644
--- a/test/av1_fht32x16_test.cc
+++ b/test/av1_fht32x16_test.cc
@@ -47,6 +47,7 @@
     inv_txfm_ = GET_PARAM(1);
     tx_type_ = GET_PARAM(2);
     pitch_ = 32;
+    height_ = 16;
     fwd_txfm_ref = fht32x16_ref;
     inv_txfm_ref = iht32x16_ref;
     bit_depth_ = GET_PARAM(3);
diff --git a/test/av1_fht4x4_test.cc b/test/av1_fht4x4_test.cc
index 104b865..075646c 100644
--- a/test/av1_fht4x4_test.cc
+++ b/test/av1_fht4x4_test.cc
@@ -59,6 +59,7 @@
     inv_txfm_ = GET_PARAM(1);
     tx_type_ = GET_PARAM(2);
     pitch_ = 4;
+    height_ = 4;
     fwd_txfm_ref = fht4x4_ref;
     bit_depth_ = GET_PARAM(3);
     mask_ = (1 << bit_depth_) - 1;
diff --git a/test/av1_fht4x8_test.cc b/test/av1_fht4x8_test.cc
index a344532..4a5f3ff 100644
--- a/test/av1_fht4x8_test.cc
+++ b/test/av1_fht4x8_test.cc
@@ -47,6 +47,7 @@
     inv_txfm_ = GET_PARAM(1);
     tx_type_ = GET_PARAM(2);
     pitch_ = 4;
+    height_ = 8;
     fwd_txfm_ref = fht4x8_ref;
     inv_txfm_ref = iht4x8_ref;
     bit_depth_ = GET_PARAM(3);
diff --git a/test/av1_fht8x16_test.cc b/test/av1_fht8x16_test.cc
index be50d7c..40390e5 100644
--- a/test/av1_fht8x16_test.cc
+++ b/test/av1_fht8x16_test.cc
@@ -43,6 +43,7 @@
     inv_txfm_ = GET_PARAM(1);
     tx_type_ = GET_PARAM(2);
     pitch_ = 8;
+    height_ = 16;
     fwd_txfm_ref = fht8x16_ref;
     bit_depth_ = GET_PARAM(3);
     mask_ = (1 << bit_depth_) - 1;
diff --git a/test/av1_fht8x4_test.cc b/test/av1_fht8x4_test.cc
index ee89e96..46e8c62 100644
--- a/test/av1_fht8x4_test.cc
+++ b/test/av1_fht8x4_test.cc
@@ -47,6 +47,7 @@
     inv_txfm_ = GET_PARAM(1);
     tx_type_ = GET_PARAM(2);
     pitch_ = 8;
+    height_ = 4;
     fwd_txfm_ref = fht8x4_ref;
     inv_txfm_ref = iht8x4_ref;
     bit_depth_ = GET_PARAM(3);
diff --git a/test/av1_fht8x8_test.cc b/test/av1_fht8x8_test.cc
index 3e8a4c8..54cb405 100644
--- a/test/av1_fht8x8_test.cc
+++ b/test/av1_fht8x8_test.cc
@@ -58,6 +58,7 @@
     inv_txfm_ = GET_PARAM(1);
     tx_type_ = GET_PARAM(2);
     pitch_ = 8;
+    height_ = 8;
     fwd_txfm_ref = fht8x8_ref;
     bit_depth_ = GET_PARAM(3);
     mask_ = (1 << bit_depth_) - 1;
diff --git a/test/av1_iht16x8_test.cc b/test/av1_iht16x8_test.cc
index 0d4406d..60adb33 100644
--- a/test/av1_iht16x8_test.cc
+++ b/test/av1_iht16x8_test.cc
@@ -44,7 +44,8 @@
   virtual void SetUp() {
     inv_txfm_ = GET_PARAM(0);
     tx_type_ = GET_PARAM(1);
-    pitch_ = 8;
+    pitch_ = 16;
+    height_ = 8;
     inv_txfm_ref = iht16x8_ref;
     fwd_txfm_ref = fht16x8_ref;
     bit_depth_ = GET_PARAM(2);
diff --git a/test/av1_iht8x16_test.cc b/test/av1_iht8x16_test.cc
index 21fdc6b..feb5735 100644
--- a/test/av1_iht8x16_test.cc
+++ b/test/av1_iht8x16_test.cc
@@ -45,6 +45,7 @@
     inv_txfm_ = GET_PARAM(0);
     tx_type_ = GET_PARAM(1);
     pitch_ = 8;
+    height_ = 16;
     inv_txfm_ref = iht8x16_ref;
     fwd_txfm_ref = fht8x16_ref;
     bit_depth_ = GET_PARAM(2);
diff --git a/test/fdct4x4_test.cc b/test/fdct4x4_test.cc
index 471f5b4..f7b0932 100644
--- a/test/fdct4x4_test.cc
+++ b/test/fdct4x4_test.cc
@@ -100,6 +100,7 @@
     inv_txfm_ = GET_PARAM(1);
     tx_type_ = GET_PARAM(2);
     pitch_ = 4;
+    height_ = 4;
     fwd_txfm_ref = fdct4x4_ref;
     bit_depth_ = GET_PARAM(3);
     mask_ = (1 << bit_depth_) - 1;
@@ -137,6 +138,7 @@
     inv_txfm_ = GET_PARAM(1);
     tx_type_ = GET_PARAM(2);
     pitch_ = 4;
+    height_ = 4;
     fwd_txfm_ref = fht4x4_ref;
     bit_depth_ = GET_PARAM(3);
     mask_ = (1 << bit_depth_) - 1;
@@ -175,6 +177,7 @@
     inv_txfm_ = GET_PARAM(1);
     tx_type_ = GET_PARAM(2);
     pitch_ = 4;
+    height_ = 4;
     fwd_txfm_ref = fwht4x4_ref;
     bit_depth_ = GET_PARAM(3);
     mask_ = (1 << bit_depth_) - 1;
diff --git a/test/transform_test_base.h b/test/transform_test_base.h
index fd39d33..195058e 100644
--- a/test/transform_test_base.h
+++ b/test/transform_test_base.h
@@ -123,33 +123,46 @@
     ACMRandom rnd(ACMRandom::DeterministicSeed());
     const int count_test_block = 5000;
 
+    // Use a stride value which is not the width of any transform, to catch
+    // cases where the transforms use the stride incorrectly.
+    int stride = 96;
+
     int16_t *input_block = reinterpret_cast<int16_t *>(
-        aom_memalign(16, sizeof(int16_t) * num_coeffs_));
+        aom_memalign(16, sizeof(int16_t) * stride * height_));
     tran_low_t *output_ref_block = reinterpret_cast<tran_low_t *>(
         aom_memalign(16, sizeof(tran_low_t) * num_coeffs_));
     tran_low_t *output_block = reinterpret_cast<tran_low_t *>(
         aom_memalign(16, sizeof(tran_low_t) * num_coeffs_));
 
     for (int i = 0; i < count_test_block; ++i) {
-      for (int j = 0; j < num_coeffs_; ++j) {
-        input_block[j] = (rnd.Rand16() & mask_) - (rnd.Rand16() & mask_);
-        if (bit_depth_ == AOM_BITS_8) {
-          output_block[j] = output_ref_block[j] = rnd.Rand8();
+      int j, k;
+      for (j = 0; j < height_; ++j) {
+        for (k = 0; k < pitch_; ++k) {
+          int in_idx = j * stride + k;
+          int out_idx = j * pitch_ + k;
+          input_block[in_idx] = (rnd.Rand16() & mask_) - (rnd.Rand16() & mask_);
+          if (bit_depth_ == AOM_BITS_8) {
+            output_block[out_idx] = output_ref_block[out_idx] = rnd.Rand8();
 #if CONFIG_AOM_HIGHBITDEPTH
-        } else {
-          output_block[j] = output_ref_block[j] = rnd.Rand16() & mask_;
+          } else {
+            output_block[out_idx] = output_ref_block[out_idx] =
+                rnd.Rand16() & mask_;
 #endif
+          }
         }
       }
 
-      fwd_txfm_ref(input_block, output_ref_block, pitch_, tx_type_);
-      ASM_REGISTER_STATE_CHECK(RunFwdTxfm(input_block, output_block, pitch_));
+      fwd_txfm_ref(input_block, output_ref_block, stride, tx_type_);
+      ASM_REGISTER_STATE_CHECK(RunFwdTxfm(input_block, output_block, stride));
 
       // The minimum quant value is 4.
-      for (int j = 0; j < num_coeffs_; ++j) {
-        ASSERT_EQ(output_block[j], output_ref_block[j])
-            << "Error: not bit-exact result at index: " << j
-            << " at test block: " << i;
+      for (j = 0; j < height_; ++j) {
+        for (k = 0; k < pitch_; ++k) {
+          int out_idx = j * pitch_ + k;
+          ASSERT_EQ(output_block[out_idx], output_ref_block[out_idx])
+              << "Error: not bit-exact result at index: " << out_idx
+              << " at test block: " << i;
+        }
       }
     }
     aom_free(input_block);
@@ -161,32 +174,44 @@
     ACMRandom rnd(ACMRandom::DeterministicSeed());
     const int count_test_block = 5000;
 
+    // Use a stride value which is not the width of any transform, to catch
+    // cases where the transforms use the stride incorrectly.
+    int stride = 96;
+
     int16_t *input_block = reinterpret_cast<int16_t *>(
         aom_memalign(16, sizeof(int16_t) * num_coeffs_));
     tran_low_t *trans_block = reinterpret_cast<tran_low_t *>(
         aom_memalign(16, sizeof(tran_low_t) * num_coeffs_));
     uint8_t *output_block = reinterpret_cast<uint8_t *>(
-        aom_memalign(16, sizeof(uint8_t) * num_coeffs_));
+        aom_memalign(16, sizeof(uint8_t) * stride * height_));
     uint8_t *output_ref_block = reinterpret_cast<uint8_t *>(
-        aom_memalign(16, sizeof(uint8_t) * num_coeffs_));
+        aom_memalign(16, sizeof(uint8_t) * stride * height_));
 
     for (int i = 0; i < count_test_block; ++i) {
       // Initialize a test block with input range [-mask_, mask_].
-      for (int j = 0; j < num_coeffs_; ++j) {
-        input_block[j] = (rnd.Rand16() & mask_) - (rnd.Rand16() & mask_);
-        output_ref_block[j] = rnd.Rand16() & mask_;
-        output_block[j] = output_ref_block[j];
+      int j, k;
+      for (j = 0; j < height_; ++j) {
+        for (k = 0; k < pitch_; ++k) {
+          int in_idx = j * pitch_ + k;
+          int out_idx = j * stride + k;
+          input_block[in_idx] = (rnd.Rand16() & mask_) - (rnd.Rand16() & mask_);
+          output_ref_block[out_idx] = rnd.Rand16() & mask_;
+          output_block[out_idx] = output_ref_block[out_idx];
+        }
       }
 
       fwd_txfm_ref(input_block, trans_block, pitch_, tx_type_);
 
-      inv_txfm_ref(trans_block, output_ref_block, pitch_, tx_type_);
-      ASM_REGISTER_STATE_CHECK(RunInvTxfm(trans_block, output_block, pitch_));
+      inv_txfm_ref(trans_block, output_ref_block, stride, tx_type_);
+      ASM_REGISTER_STATE_CHECK(RunInvTxfm(trans_block, output_block, stride));
 
-      for (int j = 0; j < num_coeffs_; ++j) {
-        ASSERT_EQ(output_block[j], output_ref_block[j])
-            << "Error: not bit-exact result at index: " << j
-            << " at test block: " << i;
+      for (j = 0; j < height_; ++j) {
+        for (k = 0; k < pitch_; ++k) {
+          int out_idx = j * stride + k;
+          ASSERT_EQ(output_block[out_idx], output_ref_block[out_idx])
+              << "Error: not bit-exact result at index: " << out_idx
+              << " at test block: " << i;
+        }
       }
     }
     aom_free(input_block);
@@ -305,6 +330,7 @@
   }
 
   int pitch_;
+  int height_;
   int tx_type_;
   FhtFunc fwd_txfm_ref;
   IhtFunc inv_txfm_ref;