Re-enable ResizeAndExtendTest for SSSE3 The scale_plane_1_to_2_phase_0() function, as its name suggests, assume phase == 0. So has_normative_scaler_ssse3() should check phase == 0 when the scaling ratio is 1 to 2 (upscaling). In addition, the scale_plane_1_to_2_phase_0() function writes 16 bytes (__m128i) at a time to the dst buffer, so has_normative_scaler_ssse3() should also check src_w % 8 == 0 when the scaling ratio is 1 to 2 (upscaling). Bug: 363916152 Change-Id: Id495cc0eb3e2434b25aff0f23f4b872b8176d33b
diff --git a/av1/common/x86/resize_ssse3.c b/av1/common/x86/resize_ssse3.c index e8dfa4a..48afd25 100644 --- a/av1/common/x86/resize_ssse3.c +++ b/av1/common/x86/resize_ssse3.c
@@ -742,6 +742,8 @@ uint8_t *tmp[9]; __m128i f[4]; + // The for loop below only works if src_w is a multiple of 8. + assert(src_w % 8 == 0); max_width = (src_w + 7) & ~7; tmp[0] = temp_buffer + 0 * max_width; tmp[1] = temp_buffer + 1 * max_width; @@ -814,12 +816,14 @@ static inline bool has_normative_scaler_ssse3(const int src_width, const int src_height, const int dst_width, - const int dst_height) { + const int dst_height, + const int phase) { const bool has_normative_scaler = (2 * dst_width == src_width && 2 * dst_height == src_height) || (4 * dst_width == src_width && 4 * dst_height == src_height) || (4 * dst_width == 3 * src_width && 4 * dst_height == 3 * src_height) || - (dst_width == src_width * 2 && dst_height == src_height * 2); + (dst_width == src_width * 2 && dst_height == src_height * 2 && + phase == 0 && src_width % 8 == 0); return has_normative_scaler; } @@ -830,13 +834,13 @@ const int phase, const int num_planes) { bool has_normative_scaler = has_normative_scaler_ssse3(src->y_crop_width, src->y_crop_height, - dst->y_crop_width, dst->y_crop_height); + dst->y_crop_width, dst->y_crop_height, phase); if (num_planes > 1) { - has_normative_scaler = - has_normative_scaler && - has_normative_scaler_ssse3(src->uv_crop_width, src->uv_crop_height, - dst->uv_crop_width, dst->uv_crop_height); + has_normative_scaler = has_normative_scaler && + has_normative_scaler_ssse3( + src->uv_crop_width, src->uv_crop_height, + dst->uv_crop_width, dst->uv_crop_height, phase); } if (!has_normative_scaler) { @@ -949,8 +953,9 @@ dst_h, interp_kernel, phase, temp_buffer); free(temp_buffer); } else { - assert(dst_w == src_w * 2 && dst_h == src_h * 2); - // 1 to 2 + assert(dst_w == src_w * 2 && dst_h == src_h * 2 && phase == 0 && + src_w % 8 == 0); + // 1 to 2, phase 0, src_w a multiple of 8 uint8_t *const temp_buffer = (uint8_t *)malloc(8 * ((src_y_w + 7) & ~7)); if (!temp_buffer) { malloc_failed = 1;
diff --git a/test/av1_scale_test.cc b/test/av1_scale_test.cc index 14f5c4d..d79ca98 100644 --- a/test/av1_scale_test.cc +++ b/test/av1_scale_test.cc
@@ -274,10 +274,8 @@ TEST_P(ResizeAndExtendTest, ResizeFrame_Bilinear) { RunTest(BILINEAR); } TEST_P(ResizeAndExtendTest, DISABLED_Speed) { SpeedTest(); } -// TODO: bug aomedia:363916152 - Enable SSSE3 unit tests when implementation of -// av1_resize_and_extend_frame does not differ from scalar version #if HAVE_SSSE3 -INSTANTIATE_TEST_SUITE_P(DISABLED_SSSE3, ResizeAndExtendTest, +INSTANTIATE_TEST_SUITE_P(SSSE3, ResizeAndExtendTest, ::testing::Values(av1_resize_and_extend_frame_ssse3)); #endif // HAVE_SSSE3