| 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),
|
|
|