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