Index: source/libvpx/test/convolve_test.cc |
=================================================================== |
--- source/libvpx/test/convolve_test.cc (revision 219822) |
+++ source/libvpx/test/convolve_test.cc (working copy) |
@@ -456,45 +456,86 @@ |
{ 128} |
}; |
+/* This test exercises the horizontal and vertical filter functions. */ |
TEST_P(ConvolveTest, ChangeFilterWorks) { |
uint8_t* const in = input(); |
uint8_t* const out = output(); |
+ |
+ /* Assume that the first input sample is at the 8/16th position. */ |
+ const int kInitialSubPelOffset = 8; |
+ |
+ /* Filters are 8-tap, so the first filter tap will be applied to the pixel |
+ * at position -3 with respect to the current filtering position. Since |
+ * kInitialSubPelOffset is set to 8, we first select sub-pixel filter 8, |
+ * which is non-zero only in the last tap. So, applying the filter at the |
+ * current input position will result in an output equal to the pixel at |
+ * offset +4 (-3 + 7) with respect to the current filtering position. |
+ */ |
const int kPixelSelected = 4; |
+ /* Assume that each output pixel requires us to step on by 17/16th pixels in |
+ * the input. |
+ */ |
+ const int kInputPixelStep = 17; |
+ |
+ /* The filters are setup in such a way that the expected output produces |
+ * sets of 8 identical output samples. As the filter position moves to the |
+ * next 1/16th pixel position the only active (=128) filter tap moves one |
+ * position to the left, resulting in the same input pixel being replicated |
+ * in to the output for 8 consecutive samples. After each set of 8 positions |
+ * the filters select a different input pixel. kFilterPeriodAdjust below |
+ * computes which input pixel is written to the output for a specified |
+ * x or y position. |
+ */ |
+ |
+ /* Test the horizontal filter. */ |
REGISTER_STATE_CHECK(UUT_->h8_(in, kInputStride, out, kOutputStride, |
- kChangeFilters[8], 17, kChangeFilters[4], 16, |
- Width(), Height())); |
+ kChangeFilters[kInitialSubPelOffset], |
+ kInputPixelStep, NULL, 0, Width(), Height())); |
for (int x = 0; x < Width(); ++x) { |
- const int kQ4StepAdjust = x >> 4; |
const int kFilterPeriodAdjust = (x >> 3) << 3; |
- const int ref_x = kQ4StepAdjust + kFilterPeriodAdjust + kPixelSelected; |
- ASSERT_EQ(in[ref_x], out[x]) << "x == " << x; |
+ const int ref_x = |
+ kPixelSelected + ((kInitialSubPelOffset |
+ + kFilterPeriodAdjust * kInputPixelStep) |
+ >> SUBPEL_BITS); |
+ ASSERT_EQ(in[ref_x], out[x]) << "x == " << x << "width = " << Width(); |
} |
+ /* Test the vertical filter. */ |
REGISTER_STATE_CHECK(UUT_->v8_(in, kInputStride, out, kOutputStride, |
- kChangeFilters[4], 16, kChangeFilters[8], 17, |
- Width(), Height())); |
+ NULL, 0, kChangeFilters[kInitialSubPelOffset], |
+ kInputPixelStep, Width(), Height())); |
for (int y = 0; y < Height(); ++y) { |
- const int kQ4StepAdjust = y >> 4; |
const int kFilterPeriodAdjust = (y >> 3) << 3; |
- const int ref_y = kQ4StepAdjust + kFilterPeriodAdjust + kPixelSelected; |
+ const int ref_y = |
+ kPixelSelected + ((kInitialSubPelOffset |
+ + kFilterPeriodAdjust * kInputPixelStep) |
+ >> SUBPEL_BITS); |
ASSERT_EQ(in[ref_y * kInputStride], out[y * kInputStride]) << "y == " << y; |
} |
+ /* Test the horizontal and vertical filters in combination. */ |
REGISTER_STATE_CHECK(UUT_->hv8_(in, kInputStride, out, kOutputStride, |
- kChangeFilters[8], 17, kChangeFilters[8], 17, |
+ kChangeFilters[kInitialSubPelOffset], |
+ kInputPixelStep, |
+ kChangeFilters[kInitialSubPelOffset], |
+ kInputPixelStep, |
Width(), Height())); |
for (int y = 0; y < Height(); ++y) { |
- const int kQ4StepAdjustY = y >> 4; |
const int kFilterPeriodAdjustY = (y >> 3) << 3; |
- const int ref_y = kQ4StepAdjustY + kFilterPeriodAdjustY + kPixelSelected; |
+ const int ref_y = |
+ kPixelSelected + ((kInitialSubPelOffset |
+ + kFilterPeriodAdjustY * kInputPixelStep) |
+ >> SUBPEL_BITS); |
for (int x = 0; x < Width(); ++x) { |
- const int kQ4StepAdjustX = x >> 4; |
const int kFilterPeriodAdjustX = (x >> 3) << 3; |
- const int ref_x = kQ4StepAdjustX + kFilterPeriodAdjustX + kPixelSelected; |
+ const int ref_x = |
+ kPixelSelected + ((kInitialSubPelOffset |
+ + kFilterPeriodAdjustX * kInputPixelStep) |
+ >> SUBPEL_BITS); |
ASSERT_EQ(in[ref_y * kInputStride + ref_x], out[y * kOutputStride + x]) |
<< "x == " << x << ", y == " << y; |
@@ -502,7 +543,6 @@ |
} |
} |
- |
using std::tr1::make_tuple; |
const ConvolveFunctions convolve8_c( |
@@ -527,9 +567,9 @@ |
#if HAVE_SSSE3 |
const ConvolveFunctions convolve8_ssse3( |
- vp9_convolve8_horiz_ssse3, vp9_convolve8_avg_horiz_c, |
- vp9_convolve8_vert_ssse3, vp9_convolve8_avg_vert_c, |
- vp9_convolve8_ssse3, vp9_convolve8_avg_c); |
+ vp9_convolve8_horiz_ssse3, vp9_convolve8_avg_horiz_ssse3, |
+ vp9_convolve8_vert_ssse3, vp9_convolve8_avg_vert_ssse3, |
+ vp9_convolve8_ssse3, vp9_convolve8_avg_ssse3); |
INSTANTIATE_TEST_CASE_P(SSSE3, ConvolveTest, ::testing::Values( |
make_tuple(4, 4, &convolve8_ssse3), |