| Index: unit_test/convert_test.cc
|
| diff --git a/unit_test/convert_test.cc b/unit_test/convert_test.cc
|
| index 50d2569b2e6411818d4a7de9fbced8aba481e125..cd0b93984605fdda5dc4053b98d3cbd145838ec1 100644
|
| --- a/unit_test/convert_test.cc
|
| +++ b/unit_test/convert_test.cc
|
| @@ -30,107 +30,113 @@ namespace libyuv {
|
|
|
| #define SUBSAMPLE(v, a) ((((v) + (a)-1)) / (a))
|
|
|
| -#define TESTPLANARTOPI(SRC_FMT_PLANAR, SRC_SUBSAMP_X, SRC_SUBSAMP_Y, \
|
| - FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y, W1280, N, NEG, OFF) \
|
| - TEST_F(LibYUVConvertTest, SRC_FMT_PLANAR##To##FMT_PLANAR##N) { \
|
| - const int kWidth = ((W1280) > 0) ? (W1280) : 1; \
|
| - const int kHeight = benchmark_height_; \
|
| - align_buffer_page_end(src_y, kWidth* kHeight + OFF); \
|
| - align_buffer_page_end(src_u, SUBSAMPLE(kWidth, SRC_SUBSAMP_X) * \
|
| - SUBSAMPLE(kHeight, SRC_SUBSAMP_Y) + \
|
| - OFF); \
|
| - align_buffer_page_end(src_v, SUBSAMPLE(kWidth, SRC_SUBSAMP_X) * \
|
| - SUBSAMPLE(kHeight, SRC_SUBSAMP_Y) + \
|
| - OFF); \
|
| - align_buffer_page_end(dst_y_c, kWidth* kHeight); \
|
| - align_buffer_page_end(dst_u_c, SUBSAMPLE(kWidth, SUBSAMP_X) * \
|
| - SUBSAMPLE(kHeight, SUBSAMP_Y)); \
|
| - align_buffer_page_end(dst_v_c, SUBSAMPLE(kWidth, SUBSAMP_X) * \
|
| - SUBSAMPLE(kHeight, SUBSAMP_Y)); \
|
| - align_buffer_page_end(dst_y_opt, kWidth* kHeight); \
|
| - align_buffer_page_end(dst_u_opt, SUBSAMPLE(kWidth, SUBSAMP_X) * \
|
| - SUBSAMPLE(kHeight, SUBSAMP_Y)); \
|
| - align_buffer_page_end(dst_v_opt, SUBSAMPLE(kWidth, SUBSAMP_X) * \
|
| - SUBSAMPLE(kHeight, SUBSAMP_Y)); \
|
| - for (int i = 0; i < kHeight; ++i) \
|
| - for (int j = 0; j < kWidth; ++j) \
|
| - src_y[i * kWidth + j + OFF] = (fastrand() & 0xff); \
|
| - for (int i = 0; i < SUBSAMPLE(kHeight, SRC_SUBSAMP_Y); ++i) { \
|
| - for (int j = 0; j < SUBSAMPLE(kWidth, SRC_SUBSAMP_X); ++j) { \
|
| - src_u[(i * SUBSAMPLE(kWidth, SRC_SUBSAMP_X)) + j + OFF] = \
|
| - (fastrand() & 0xff); \
|
| - src_v[(i * SUBSAMPLE(kWidth, SRC_SUBSAMP_X)) + j + OFF] = \
|
| - (fastrand() & 0xff); \
|
| - } \
|
| - } \
|
| - memset(dst_y_c, 1, kWidth* kHeight); \
|
| - memset(dst_u_c, 2, \
|
| - SUBSAMPLE(kWidth, SUBSAMP_X) * SUBSAMPLE(kHeight, SUBSAMP_Y)); \
|
| - memset(dst_v_c, 3, \
|
| - SUBSAMPLE(kWidth, SUBSAMP_X) * SUBSAMPLE(kHeight, SUBSAMP_Y)); \
|
| - memset(dst_y_opt, 101, kWidth* kHeight); \
|
| - memset(dst_u_opt, 102, \
|
| - SUBSAMPLE(kWidth, SUBSAMP_X) * SUBSAMPLE(kHeight, SUBSAMP_Y)); \
|
| - memset(dst_v_opt, 103, \
|
| - SUBSAMPLE(kWidth, SUBSAMP_X) * SUBSAMPLE(kHeight, SUBSAMP_Y)); \
|
| - MaskCpuFlags(disable_cpu_flags_); \
|
| - SRC_FMT_PLANAR##To##FMT_PLANAR( \
|
| - src_y + OFF, kWidth, src_u + OFF, SUBSAMPLE(kWidth, SRC_SUBSAMP_X), \
|
| - src_v + OFF, SUBSAMPLE(kWidth, SRC_SUBSAMP_X), dst_y_c, kWidth, \
|
| - dst_u_c, SUBSAMPLE(kWidth, SUBSAMP_X), dst_v_c, \
|
| - SUBSAMPLE(kWidth, SUBSAMP_X), kWidth, NEG kHeight); \
|
| - MaskCpuFlags(benchmark_cpu_info_); \
|
| - for (int i = 0; i < benchmark_iterations_; ++i) { \
|
| - SRC_FMT_PLANAR##To##FMT_PLANAR( \
|
| - src_y + OFF, kWidth, src_u + OFF, SUBSAMPLE(kWidth, SRC_SUBSAMP_X), \
|
| - src_v + OFF, SUBSAMPLE(kWidth, SRC_SUBSAMP_X), dst_y_opt, kWidth, \
|
| - dst_u_opt, SUBSAMPLE(kWidth, SUBSAMP_X), dst_v_opt, \
|
| - SUBSAMPLE(kWidth, SUBSAMP_X), kWidth, NEG kHeight); \
|
| - } \
|
| - int max_diff = 0; \
|
| - for (int i = 0; i < kHeight; ++i) { \
|
| - for (int j = 0; j < kWidth; ++j) { \
|
| - int abs_diff = abs(static_cast<int>(dst_y_c[i * kWidth + j]) - \
|
| - static_cast<int>(dst_y_opt[i * kWidth + j])); \
|
| - if (abs_diff > max_diff) { \
|
| - max_diff = abs_diff; \
|
| - } \
|
| - } \
|
| - } \
|
| - EXPECT_EQ(0, max_diff); \
|
| - for (int i = 0; i < SUBSAMPLE(kHeight, SUBSAMP_Y); ++i) { \
|
| - for (int j = 0; j < SUBSAMPLE(kWidth, SUBSAMP_X); ++j) { \
|
| - int abs_diff = abs( \
|
| - static_cast<int>(dst_u_c[i * SUBSAMPLE(kWidth, SUBSAMP_X) + j]) - \
|
| - static_cast<int>( \
|
| - dst_u_opt[i * SUBSAMPLE(kWidth, SUBSAMP_X) + j])); \
|
| - if (abs_diff > max_diff) { \
|
| - max_diff = abs_diff; \
|
| - } \
|
| - } \
|
| - } \
|
| - EXPECT_LE(max_diff, 3); \
|
| - for (int i = 0; i < SUBSAMPLE(kHeight, SUBSAMP_Y); ++i) { \
|
| - for (int j = 0; j < SUBSAMPLE(kWidth, SUBSAMP_X); ++j) { \
|
| - int abs_diff = abs( \
|
| - static_cast<int>(dst_v_c[i * SUBSAMPLE(kWidth, SUBSAMP_X) + j]) - \
|
| - static_cast<int>( \
|
| - dst_v_opt[i * SUBSAMPLE(kWidth, SUBSAMP_X) + j])); \
|
| - if (abs_diff > max_diff) { \
|
| - max_diff = abs_diff; \
|
| - } \
|
| - } \
|
| - } \
|
| - EXPECT_LE(max_diff, 3); \
|
| - free_aligned_buffer_page_end(dst_y_c); \
|
| - free_aligned_buffer_page_end(dst_u_c); \
|
| - free_aligned_buffer_page_end(dst_v_c); \
|
| - free_aligned_buffer_page_end(dst_y_opt); \
|
| - free_aligned_buffer_page_end(dst_u_opt); \
|
| - free_aligned_buffer_page_end(dst_v_opt); \
|
| - free_aligned_buffer_page_end(src_y); \
|
| - free_aligned_buffer_page_end(src_u); \
|
| - free_aligned_buffer_page_end(src_v); \
|
| +#define TESTPLANARTOPI(SRC_FMT_PLANAR, SRC_SUBSAMP_X, SRC_SUBSAMP_Y, \
|
| + FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y, W1280, N, NEG, OFF) \
|
| + TEST_F(LibYUVConvertTest, SRC_FMT_PLANAR##To##FMT_PLANAR##N) { \
|
| + const int kWidth = ((W1280) > 0) ? (W1280) : 1; \
|
| + const int kHeight = benchmark_height_; \
|
| + align_buffer_page_end(src_y, kWidth* kHeight + OFF); \
|
| + align_buffer_page_end( \
|
| + src_u, \
|
| + SUBSAMPLE(kWidth, SRC_SUBSAMP_X) * SUBSAMPLE(kHeight, SRC_SUBSAMP_Y) + \
|
| + OFF); \
|
| + align_buffer_page_end( \
|
| + src_v, \
|
| + SUBSAMPLE(kWidth, SRC_SUBSAMP_X) * SUBSAMPLE(kHeight, SRC_SUBSAMP_Y) + \
|
| + OFF); \
|
| + align_buffer_page_end(dst_y_c, kWidth* kHeight); \
|
| + align_buffer_page_end( \
|
| + dst_u_c, \
|
| + SUBSAMPLE(kWidth, SUBSAMP_X) * SUBSAMPLE(kHeight, SUBSAMP_Y)); \
|
| + align_buffer_page_end( \
|
| + dst_v_c, \
|
| + SUBSAMPLE(kWidth, SUBSAMP_X) * SUBSAMPLE(kHeight, SUBSAMP_Y)); \
|
| + align_buffer_page_end(dst_y_opt, kWidth* kHeight); \
|
| + align_buffer_page_end( \
|
| + dst_u_opt, \
|
| + SUBSAMPLE(kWidth, SUBSAMP_X) * SUBSAMPLE(kHeight, SUBSAMP_Y)); \
|
| + align_buffer_page_end( \
|
| + dst_v_opt, \
|
| + SUBSAMPLE(kWidth, SUBSAMP_X) * SUBSAMPLE(kHeight, SUBSAMP_Y)); \
|
| + for (int i = 0; i < kHeight; ++i) \
|
| + for (int j = 0; j < kWidth; ++j) \
|
| + src_y[i * kWidth + j + OFF] = (fastrand() & 0xff); \
|
| + for (int i = 0; i < SUBSAMPLE(kHeight, SRC_SUBSAMP_Y); ++i) { \
|
| + for (int j = 0; j < SUBSAMPLE(kWidth, SRC_SUBSAMP_X); ++j) { \
|
| + src_u[(i * SUBSAMPLE(kWidth, SRC_SUBSAMP_X)) + j + OFF] = \
|
| + (fastrand() & 0xff); \
|
| + src_v[(i * SUBSAMPLE(kWidth, SRC_SUBSAMP_X)) + j + OFF] = \
|
| + (fastrand() & 0xff); \
|
| + } \
|
| + } \
|
| + memset(dst_y_c, 1, kWidth* kHeight); \
|
| + memset(dst_u_c, 2, \
|
| + SUBSAMPLE(kWidth, SUBSAMP_X) * SUBSAMPLE(kHeight, SUBSAMP_Y)); \
|
| + memset(dst_v_c, 3, \
|
| + SUBSAMPLE(kWidth, SUBSAMP_X) * SUBSAMPLE(kHeight, SUBSAMP_Y)); \
|
| + memset(dst_y_opt, 101, kWidth* kHeight); \
|
| + memset(dst_u_opt, 102, \
|
| + SUBSAMPLE(kWidth, SUBSAMP_X) * SUBSAMPLE(kHeight, SUBSAMP_Y)); \
|
| + memset(dst_v_opt, 103, \
|
| + SUBSAMPLE(kWidth, SUBSAMP_X) * SUBSAMPLE(kHeight, SUBSAMP_Y)); \
|
| + MaskCpuFlags(disable_cpu_flags_); \
|
| + SRC_FMT_PLANAR##To##FMT_PLANAR( \
|
| + src_y + OFF, kWidth, src_u + OFF, SUBSAMPLE(kWidth, SRC_SUBSAMP_X), \
|
| + src_v + OFF, SUBSAMPLE(kWidth, SRC_SUBSAMP_X), dst_y_c, kWidth, \
|
| + dst_u_c, SUBSAMPLE(kWidth, SUBSAMP_X), dst_v_c, \
|
| + SUBSAMPLE(kWidth, SUBSAMP_X), kWidth, NEG kHeight); \
|
| + MaskCpuFlags(benchmark_cpu_info_); \
|
| + for (int i = 0; i < benchmark_iterations_; ++i) { \
|
| + SRC_FMT_PLANAR##To##FMT_PLANAR( \
|
| + src_y + OFF, kWidth, src_u + OFF, SUBSAMPLE(kWidth, SRC_SUBSAMP_X), \
|
| + src_v + OFF, SUBSAMPLE(kWidth, SRC_SUBSAMP_X), dst_y_opt, kWidth, \
|
| + dst_u_opt, SUBSAMPLE(kWidth, SUBSAMP_X), dst_v_opt, \
|
| + SUBSAMPLE(kWidth, SUBSAMP_X), kWidth, NEG kHeight); \
|
| + } \
|
| + int max_diff = 0; \
|
| + for (int i = 0; i < kHeight; ++i) { \
|
| + for (int j = 0; j < kWidth; ++j) { \
|
| + int abs_diff = abs(static_cast<int>(dst_y_c[i * kWidth + j]) - \
|
| + static_cast<int>(dst_y_opt[i * kWidth + j])); \
|
| + if (abs_diff > max_diff) { \
|
| + max_diff = abs_diff; \
|
| + } \
|
| + } \
|
| + } \
|
| + EXPECT_EQ(0, max_diff); \
|
| + for (int i = 0; i < SUBSAMPLE(kHeight, SUBSAMP_Y); ++i) { \
|
| + for (int j = 0; j < SUBSAMPLE(kWidth, SUBSAMP_X); ++j) { \
|
| + int abs_diff = abs( \
|
| + static_cast<int>(dst_u_c[i * SUBSAMPLE(kWidth, SUBSAMP_X) + j]) - \
|
| + static_cast<int>( \
|
| + dst_u_opt[i * SUBSAMPLE(kWidth, SUBSAMP_X) + j])); \
|
| + if (abs_diff > max_diff) { \
|
| + max_diff = abs_diff; \
|
| + } \
|
| + } \
|
| + } \
|
| + EXPECT_LE(max_diff, 3); \
|
| + for (int i = 0; i < SUBSAMPLE(kHeight, SUBSAMP_Y); ++i) { \
|
| + for (int j = 0; j < SUBSAMPLE(kWidth, SUBSAMP_X); ++j) { \
|
| + int abs_diff = abs( \
|
| + static_cast<int>(dst_v_c[i * SUBSAMPLE(kWidth, SUBSAMP_X) + j]) - \
|
| + static_cast<int>( \
|
| + dst_v_opt[i * SUBSAMPLE(kWidth, SUBSAMP_X) + j])); \
|
| + if (abs_diff > max_diff) { \
|
| + max_diff = abs_diff; \
|
| + } \
|
| + } \
|
| + } \
|
| + EXPECT_LE(max_diff, 3); \
|
| + free_aligned_buffer_page_end(dst_y_c); \
|
| + free_aligned_buffer_page_end(dst_u_c); \
|
| + free_aligned_buffer_page_end(dst_v_c); \
|
| + free_aligned_buffer_page_end(dst_y_opt); \
|
| + free_aligned_buffer_page_end(dst_u_opt); \
|
| + free_aligned_buffer_page_end(dst_v_opt); \
|
| + free_aligned_buffer_page_end(src_y); \
|
| + free_aligned_buffer_page_end(src_u); \
|
| + free_aligned_buffer_page_end(src_v); \
|
| }
|
|
|
| #define TESTPLANARTOP(SRC_FMT_PLANAR, SRC_SUBSAMP_X, SRC_SUBSAMP_Y, \
|
| @@ -166,15 +172,19 @@ TESTPLANARTOP(I444, 1, 1, I444, 1, 1)
|
| align_buffer_page_end(src_uv, \
|
| kSizeUV*((PIXEL_STRIDE == 3) ? 3 : 2) + OFF); \
|
| align_buffer_page_end(dst_y_c, kWidth* kHeight); \
|
| - align_buffer_page_end(dst_u_c, SUBSAMPLE(kWidth, SUBSAMP_X) * \
|
| - SUBSAMPLE(kHeight, SUBSAMP_Y)); \
|
| - align_buffer_page_end(dst_v_c, SUBSAMPLE(kWidth, SUBSAMP_X) * \
|
| - SUBSAMPLE(kHeight, SUBSAMP_Y)); \
|
| + align_buffer_page_end( \
|
| + dst_u_c, \
|
| + SUBSAMPLE(kWidth, SUBSAMP_X) * SUBSAMPLE(kHeight, SUBSAMP_Y)); \
|
| + align_buffer_page_end( \
|
| + dst_v_c, \
|
| + SUBSAMPLE(kWidth, SUBSAMP_X) * SUBSAMPLE(kHeight, SUBSAMP_Y)); \
|
| align_buffer_page_end(dst_y_opt, kWidth* kHeight); \
|
| - align_buffer_page_end(dst_u_opt, SUBSAMPLE(kWidth, SUBSAMP_X) * \
|
| - SUBSAMPLE(kHeight, SUBSAMP_Y)); \
|
| - align_buffer_page_end(dst_v_opt, SUBSAMPLE(kWidth, SUBSAMP_X) * \
|
| - SUBSAMPLE(kHeight, SUBSAMP_Y)); \
|
| + align_buffer_page_end( \
|
| + dst_u_opt, \
|
| + SUBSAMPLE(kWidth, SUBSAMP_X) * SUBSAMPLE(kHeight, SUBSAMP_Y)); \
|
| + align_buffer_page_end( \
|
| + dst_v_opt, \
|
| + SUBSAMPLE(kWidth, SUBSAMP_X) * SUBSAMPLE(kHeight, SUBSAMP_Y)); \
|
| uint8* src_u = src_uv + OFF_U; \
|
| uint8* src_v = src_uv + (PIXEL_STRIDE == 1 ? kSizeUV : OFF_V); \
|
| int src_stride_uv = SUBSAMPLE(kWidth, SUBSAMP_X) * PIXEL_STRIDE; \
|
| @@ -278,84 +288,88 @@ TESTAPLANARTOP(Android420, I420, 1, 0, 0, 2, 2, I420, 2, 2)
|
| TESTAPLANARTOP(Android420, NV12, 2, 0, 1, 2, 2, I420, 2, 2)
|
| TESTAPLANARTOP(Android420, NV21, 2, 1, 0, 2, 2, I420, 2, 2)
|
|
|
| -#define TESTPLANARTOBPI(SRC_FMT_PLANAR, SRC_SUBSAMP_X, SRC_SUBSAMP_Y, \
|
| - FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y, W1280, N, NEG, OFF) \
|
| - TEST_F(LibYUVConvertTest, SRC_FMT_PLANAR##To##FMT_PLANAR##N) { \
|
| - const int kWidth = ((W1280) > 0) ? (W1280) : 1; \
|
| - const int kHeight = benchmark_height_; \
|
| - align_buffer_page_end(src_y, kWidth* kHeight + OFF); \
|
| - align_buffer_page_end(src_u, SUBSAMPLE(kWidth, SRC_SUBSAMP_X) * \
|
| - SUBSAMPLE(kHeight, SRC_SUBSAMP_Y) + \
|
| - OFF); \
|
| - align_buffer_page_end(src_v, SUBSAMPLE(kWidth, SRC_SUBSAMP_X) * \
|
| - SUBSAMPLE(kHeight, SRC_SUBSAMP_Y) + \
|
| - OFF); \
|
| - align_buffer_page_end(dst_y_c, kWidth* kHeight); \
|
| - align_buffer_page_end(dst_uv_c, SUBSAMPLE(kWidth * 2, SUBSAMP_X) * \
|
| - SUBSAMPLE(kHeight, SUBSAMP_Y)); \
|
| - align_buffer_page_end(dst_y_opt, kWidth* kHeight); \
|
| - align_buffer_page_end(dst_uv_opt, SUBSAMPLE(kWidth * 2, SUBSAMP_X) * \
|
| - SUBSAMPLE(kHeight, SUBSAMP_Y)); \
|
| - for (int i = 0; i < kHeight; ++i) \
|
| - for (int j = 0; j < kWidth; ++j) \
|
| - src_y[i * kWidth + j + OFF] = (fastrand() & 0xff); \
|
| - for (int i = 0; i < SUBSAMPLE(kHeight, SRC_SUBSAMP_Y); ++i) { \
|
| - for (int j = 0; j < SUBSAMPLE(kWidth, SRC_SUBSAMP_X); ++j) { \
|
| - src_u[(i * SUBSAMPLE(kWidth, SRC_SUBSAMP_X)) + j + OFF] = \
|
| - (fastrand() & 0xff); \
|
| - src_v[(i * SUBSAMPLE(kWidth, SRC_SUBSAMP_X)) + j + OFF] = \
|
| - (fastrand() & 0xff); \
|
| - } \
|
| - } \
|
| - memset(dst_y_c, 1, kWidth* kHeight); \
|
| - memset(dst_uv_c, 2, \
|
| - SUBSAMPLE(kWidth * 2, SUBSAMP_X) * SUBSAMPLE(kHeight, SUBSAMP_Y)); \
|
| - memset(dst_y_opt, 101, kWidth* kHeight); \
|
| - memset(dst_uv_opt, 102, \
|
| - SUBSAMPLE(kWidth * 2, SUBSAMP_X) * SUBSAMPLE(kHeight, SUBSAMP_Y)); \
|
| - MaskCpuFlags(disable_cpu_flags_); \
|
| - SRC_FMT_PLANAR##To##FMT_PLANAR( \
|
| - src_y + OFF, kWidth, src_u + OFF, SUBSAMPLE(kWidth, SRC_SUBSAMP_X), \
|
| - src_v + OFF, SUBSAMPLE(kWidth, SRC_SUBSAMP_X), dst_y_c, kWidth, \
|
| - dst_uv_c, SUBSAMPLE(kWidth * 2, SUBSAMP_X), kWidth, NEG kHeight); \
|
| - MaskCpuFlags(benchmark_cpu_info_); \
|
| - for (int i = 0; i < benchmark_iterations_; ++i) { \
|
| - SRC_FMT_PLANAR##To##FMT_PLANAR( \
|
| - src_y + OFF, kWidth, src_u + OFF, SUBSAMPLE(kWidth, SRC_SUBSAMP_X), \
|
| - src_v + OFF, SUBSAMPLE(kWidth, SRC_SUBSAMP_X), dst_y_opt, kWidth, \
|
| - dst_uv_opt, SUBSAMPLE(kWidth * 2, SUBSAMP_X), kWidth, NEG kHeight); \
|
| - } \
|
| - int max_diff = 0; \
|
| - for (int i = 0; i < kHeight; ++i) { \
|
| - for (int j = 0; j < kWidth; ++j) { \
|
| - int abs_diff = abs(static_cast<int>(dst_y_c[i * kWidth + j]) - \
|
| - static_cast<int>(dst_y_opt[i * kWidth + j])); \
|
| - if (abs_diff > max_diff) { \
|
| - max_diff = abs_diff; \
|
| - } \
|
| - } \
|
| - } \
|
| - EXPECT_LE(max_diff, 1); \
|
| - for (int i = 0; i < SUBSAMPLE(kHeight, SUBSAMP_Y); ++i) { \
|
| - for (int j = 0; j < SUBSAMPLE(kWidth * 2, SUBSAMP_X); ++j) { \
|
| - int abs_diff = \
|
| - abs(static_cast<int>( \
|
| - dst_uv_c[i * SUBSAMPLE(kWidth * 2, SUBSAMP_X) + j]) - \
|
| - static_cast<int>( \
|
| - dst_uv_opt[i * SUBSAMPLE(kWidth * 2, SUBSAMP_X) + j])); \
|
| - if (abs_diff > max_diff) { \
|
| - max_diff = abs_diff; \
|
| - } \
|
| - } \
|
| - } \
|
| - EXPECT_LE(max_diff, 1); \
|
| - free_aligned_buffer_page_end(dst_y_c); \
|
| - free_aligned_buffer_page_end(dst_uv_c); \
|
| - free_aligned_buffer_page_end(dst_y_opt); \
|
| - free_aligned_buffer_page_end(dst_uv_opt); \
|
| - free_aligned_buffer_page_end(src_y); \
|
| - free_aligned_buffer_page_end(src_u); \
|
| - free_aligned_buffer_page_end(src_v); \
|
| +#define TESTPLANARTOBPI(SRC_FMT_PLANAR, SRC_SUBSAMP_X, SRC_SUBSAMP_Y, \
|
| + FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y, W1280, N, NEG, OFF) \
|
| + TEST_F(LibYUVConvertTest, SRC_FMT_PLANAR##To##FMT_PLANAR##N) { \
|
| + const int kWidth = ((W1280) > 0) ? (W1280) : 1; \
|
| + const int kHeight = benchmark_height_; \
|
| + align_buffer_page_end(src_y, kWidth* kHeight + OFF); \
|
| + align_buffer_page_end( \
|
| + src_u, \
|
| + SUBSAMPLE(kWidth, SRC_SUBSAMP_X) * SUBSAMPLE(kHeight, SRC_SUBSAMP_Y) + \
|
| + OFF); \
|
| + align_buffer_page_end( \
|
| + src_v, \
|
| + SUBSAMPLE(kWidth, SRC_SUBSAMP_X) * SUBSAMPLE(kHeight, SRC_SUBSAMP_Y) + \
|
| + OFF); \
|
| + align_buffer_page_end(dst_y_c, kWidth* kHeight); \
|
| + align_buffer_page_end( \
|
| + dst_uv_c, \
|
| + SUBSAMPLE(kWidth * 2, SUBSAMP_X) * SUBSAMPLE(kHeight, SUBSAMP_Y)); \
|
| + align_buffer_page_end(dst_y_opt, kWidth* kHeight); \
|
| + align_buffer_page_end( \
|
| + dst_uv_opt, \
|
| + SUBSAMPLE(kWidth * 2, SUBSAMP_X) * SUBSAMPLE(kHeight, SUBSAMP_Y)); \
|
| + for (int i = 0; i < kHeight; ++i) \
|
| + for (int j = 0; j < kWidth; ++j) \
|
| + src_y[i * kWidth + j + OFF] = (fastrand() & 0xff); \
|
| + for (int i = 0; i < SUBSAMPLE(kHeight, SRC_SUBSAMP_Y); ++i) { \
|
| + for (int j = 0; j < SUBSAMPLE(kWidth, SRC_SUBSAMP_X); ++j) { \
|
| + src_u[(i * SUBSAMPLE(kWidth, SRC_SUBSAMP_X)) + j + OFF] = \
|
| + (fastrand() & 0xff); \
|
| + src_v[(i * SUBSAMPLE(kWidth, SRC_SUBSAMP_X)) + j + OFF] = \
|
| + (fastrand() & 0xff); \
|
| + } \
|
| + } \
|
| + memset(dst_y_c, 1, kWidth* kHeight); \
|
| + memset(dst_uv_c, 2, \
|
| + SUBSAMPLE(kWidth * 2, SUBSAMP_X) * SUBSAMPLE(kHeight, SUBSAMP_Y)); \
|
| + memset(dst_y_opt, 101, kWidth* kHeight); \
|
| + memset(dst_uv_opt, 102, \
|
| + SUBSAMPLE(kWidth * 2, SUBSAMP_X) * SUBSAMPLE(kHeight, SUBSAMP_Y)); \
|
| + MaskCpuFlags(disable_cpu_flags_); \
|
| + SRC_FMT_PLANAR##To##FMT_PLANAR( \
|
| + src_y + OFF, kWidth, src_u + OFF, SUBSAMPLE(kWidth, SRC_SUBSAMP_X), \
|
| + src_v + OFF, SUBSAMPLE(kWidth, SRC_SUBSAMP_X), dst_y_c, kWidth, \
|
| + dst_uv_c, SUBSAMPLE(kWidth * 2, SUBSAMP_X), kWidth, NEG kHeight); \
|
| + MaskCpuFlags(benchmark_cpu_info_); \
|
| + for (int i = 0; i < benchmark_iterations_; ++i) { \
|
| + SRC_FMT_PLANAR##To##FMT_PLANAR( \
|
| + src_y + OFF, kWidth, src_u + OFF, SUBSAMPLE(kWidth, SRC_SUBSAMP_X), \
|
| + src_v + OFF, SUBSAMPLE(kWidth, SRC_SUBSAMP_X), dst_y_opt, kWidth, \
|
| + dst_uv_opt, SUBSAMPLE(kWidth * 2, SUBSAMP_X), kWidth, NEG kHeight); \
|
| + } \
|
| + int max_diff = 0; \
|
| + for (int i = 0; i < kHeight; ++i) { \
|
| + for (int j = 0; j < kWidth; ++j) { \
|
| + int abs_diff = abs(static_cast<int>(dst_y_c[i * kWidth + j]) - \
|
| + static_cast<int>(dst_y_opt[i * kWidth + j])); \
|
| + if (abs_diff > max_diff) { \
|
| + max_diff = abs_diff; \
|
| + } \
|
| + } \
|
| + } \
|
| + EXPECT_LE(max_diff, 1); \
|
| + for (int i = 0; i < SUBSAMPLE(kHeight, SUBSAMP_Y); ++i) { \
|
| + for (int j = 0; j < SUBSAMPLE(kWidth * 2, SUBSAMP_X); ++j) { \
|
| + int abs_diff = \
|
| + abs(static_cast<int>( \
|
| + dst_uv_c[i * SUBSAMPLE(kWidth * 2, SUBSAMP_X) + j]) - \
|
| + static_cast<int>( \
|
| + dst_uv_opt[i * SUBSAMPLE(kWidth * 2, SUBSAMP_X) + j])); \
|
| + if (abs_diff > max_diff) { \
|
| + max_diff = abs_diff; \
|
| + } \
|
| + } \
|
| + } \
|
| + EXPECT_LE(max_diff, 1); \
|
| + free_aligned_buffer_page_end(dst_y_c); \
|
| + free_aligned_buffer_page_end(dst_uv_c); \
|
| + free_aligned_buffer_page_end(dst_y_opt); \
|
| + free_aligned_buffer_page_end(dst_uv_opt); \
|
| + free_aligned_buffer_page_end(src_y); \
|
| + free_aligned_buffer_page_end(src_u); \
|
| + free_aligned_buffer_page_end(src_v); \
|
| }
|
|
|
| #define TESTPLANARTOBP(SRC_FMT_PLANAR, SRC_SUBSAMP_X, SRC_SUBSAMP_Y, \
|
| @@ -379,19 +393,24 @@ TESTPLANARTOBP(I420, 2, 2, NV21, 2, 2)
|
| const int kWidth = ((W1280) > 0) ? (W1280) : 1; \
|
| const int kHeight = benchmark_height_; \
|
| align_buffer_page_end(src_y, kWidth* kHeight + OFF); \
|
| - align_buffer_page_end(src_uv, 2 * SUBSAMPLE(kWidth, SRC_SUBSAMP_X) * \
|
| - SUBSAMPLE(kHeight, SRC_SUBSAMP_Y) + \
|
| - OFF); \
|
| + align_buffer_page_end(src_uv, \
|
| + 2 * SUBSAMPLE(kWidth, SRC_SUBSAMP_X) * \
|
| + SUBSAMPLE(kHeight, SRC_SUBSAMP_Y) + \
|
| + OFF); \
|
| align_buffer_page_end(dst_y_c, kWidth* kHeight); \
|
| - align_buffer_page_end(dst_u_c, SUBSAMPLE(kWidth, SUBSAMP_X) * \
|
| - SUBSAMPLE(kHeight, SUBSAMP_Y)); \
|
| - align_buffer_page_end(dst_v_c, SUBSAMPLE(kWidth, SUBSAMP_X) * \
|
| - SUBSAMPLE(kHeight, SUBSAMP_Y)); \
|
| + align_buffer_page_end( \
|
| + dst_u_c, \
|
| + SUBSAMPLE(kWidth, SUBSAMP_X) * SUBSAMPLE(kHeight, SUBSAMP_Y)); \
|
| + align_buffer_page_end( \
|
| + dst_v_c, \
|
| + SUBSAMPLE(kWidth, SUBSAMP_X) * SUBSAMPLE(kHeight, SUBSAMP_Y)); \
|
| align_buffer_page_end(dst_y_opt, kWidth* kHeight); \
|
| - align_buffer_page_end(dst_u_opt, SUBSAMPLE(kWidth, SUBSAMP_X) * \
|
| - SUBSAMPLE(kHeight, SUBSAMP_Y)); \
|
| - align_buffer_page_end(dst_v_opt, SUBSAMPLE(kWidth, SUBSAMP_X) * \
|
| - SUBSAMPLE(kHeight, SUBSAMP_Y)); \
|
| + align_buffer_page_end( \
|
| + dst_u_opt, \
|
| + SUBSAMPLE(kWidth, SUBSAMP_X) * SUBSAMPLE(kHeight, SUBSAMP_Y)); \
|
| + align_buffer_page_end( \
|
| + dst_v_opt, \
|
| + SUBSAMPLE(kWidth, SUBSAMP_X) * SUBSAMPLE(kHeight, SUBSAMP_Y)); \
|
| for (int i = 0; i < kHeight; ++i) \
|
| for (int j = 0; j < kWidth; ++j) \
|
| src_y[i * kWidth + j + OFF] = (fastrand() & 0xff); \
|
| @@ -1369,10 +1388,12 @@ TEST_F(LibYUVConvertTest, MJPGToI420) {
|
| const int kSize = kImageSize + kOff;
|
| align_buffer_page_end(orig_pixels, kSize);
|
| align_buffer_page_end(dst_y_opt, benchmark_width_ * benchmark_height_);
|
| - align_buffer_page_end(dst_u_opt, SUBSAMPLE(benchmark_width_, 2) *
|
| - SUBSAMPLE(benchmark_height_, 2));
|
| - align_buffer_page_end(dst_v_opt, SUBSAMPLE(benchmark_width_, 2) *
|
| - SUBSAMPLE(benchmark_height_, 2));
|
| + align_buffer_page_end(
|
| + dst_u_opt,
|
| + SUBSAMPLE(benchmark_width_, 2) * SUBSAMPLE(benchmark_height_, 2));
|
| + align_buffer_page_end(
|
| + dst_v_opt,
|
| + SUBSAMPLE(benchmark_width_, 2) * SUBSAMPLE(benchmark_height_, 2));
|
|
|
| // EOI, SOI to make MJPG appear valid.
|
| memset(orig_pixels, 0, kSize);
|
| @@ -1444,16 +1465,20 @@ TEST_F(LibYUVConvertTest, NV12Crop) {
|
| uint8* src_uv = src_y + kWidth * kHeight;
|
|
|
| align_buffer_page_end(dst_y, kDestWidth * kDestHeight);
|
| - align_buffer_page_end(dst_u, SUBSAMPLE(kDestWidth, SUBSAMP_X) *
|
| - SUBSAMPLE(kDestHeight, SUBSAMP_Y));
|
| - align_buffer_page_end(dst_v, SUBSAMPLE(kDestWidth, SUBSAMP_X) *
|
| - SUBSAMPLE(kDestHeight, SUBSAMP_Y));
|
| + align_buffer_page_end(
|
| + dst_u,
|
| + SUBSAMPLE(kDestWidth, SUBSAMP_X) * SUBSAMPLE(kDestHeight, SUBSAMP_Y));
|
| + align_buffer_page_end(
|
| + dst_v,
|
| + SUBSAMPLE(kDestWidth, SUBSAMP_X) * SUBSAMPLE(kDestHeight, SUBSAMP_Y));
|
|
|
| align_buffer_page_end(dst_y_2, kDestWidth * kDestHeight);
|
| - align_buffer_page_end(dst_u_2, SUBSAMPLE(kDestWidth, SUBSAMP_X) *
|
| - SUBSAMPLE(kDestHeight, SUBSAMP_Y));
|
| - align_buffer_page_end(dst_v_2, SUBSAMPLE(kDestWidth, SUBSAMP_X) *
|
| - SUBSAMPLE(kDestHeight, SUBSAMP_Y));
|
| + align_buffer_page_end(
|
| + dst_u_2,
|
| + SUBSAMPLE(kDestWidth, SUBSAMP_X) * SUBSAMPLE(kDestHeight, SUBSAMP_Y));
|
| + align_buffer_page_end(
|
| + dst_v_2,
|
| + SUBSAMPLE(kDestWidth, SUBSAMP_X) * SUBSAMPLE(kDestHeight, SUBSAMP_Y));
|
|
|
| for (int i = 0; i < kHeight * kWidth; ++i) {
|
| src_y[i] = (fastrand() & 0xff);
|
|
|