From cb96f37afad1b54e89cc4d572b7bd121a38df777 Mon Sep 17 00:00:00 2001 From: "fbarchard@google.com" Date: Tue, 13 Jan 2015 18:58:17 +0000 Subject: [PATCH] Convert to and from J420 to test absolute conversion error. BUG=241 TESTED=TestJ420 R=tpsiaki@google.com Review URL: https://webrtc-codereview.appspot.com/36729004 git-svn-id: http://libyuv.googlecode.com/svn/trunk@1224 16f28f9a-4ce2-e073-06de-1de4eb20be90 --- README.chromium | 2 +- include/libyuv/version.h | 2 +- unit_test/convert_test.cc | 88 +++++++++++++++++++++++++++++++++++++++ 3 files changed, 90 insertions(+), 2 deletions(-) diff --git a/README.chromium b/README.chromium index e4cd56b95..645535461 100644 --- a/README.chromium +++ b/README.chromium @@ -1,6 +1,6 @@ Name: libyuv URL: http://code.google.com/p/libyuv/ -Version: 1222 +Version: 1224 License: BSD License File: LICENSE diff --git a/include/libyuv/version.h b/include/libyuv/version.h index 39cff222c..08b6bd688 100644 --- a/include/libyuv/version.h +++ b/include/libyuv/version.h @@ -11,6 +11,6 @@ #ifndef INCLUDE_LIBYUV_VERSION_H_ // NOLINT #define INCLUDE_LIBYUV_VERSION_H_ -#define LIBYUV_VERSION 1222 +#define LIBYUV_VERSION 1224 #endif // INCLUDE_LIBYUV_VERSION_H_ NOLINT diff --git a/unit_test/convert_test.cc b/unit_test/convert_test.cc index 8fd9c123e..548421a63 100644 --- a/unit_test/convert_test.cc +++ b/unit_test/convert_test.cc @@ -1242,4 +1242,92 @@ TEST_F(libyuvTest, HaveJPEG) { #endif } +TEST_F(libyuvTest, TestI420) { + const int kPixels = benchmark_width_ * benchmark_height_; + const int kHalfPixels = ((benchmark_width_ + 1) / 2) * + ((benchmark_height_ + 1) / 2); + align_buffer_64(orig_y, kPixels); + align_buffer_64(orig_u, kHalfPixels); + align_buffer_64(orig_v, kHalfPixels); + align_buffer_64(orig_pixels, kPixels * 4); + align_buffer_64(temp_y, kPixels); + align_buffer_64(temp_u, kHalfPixels); + align_buffer_64(temp_v, kHalfPixels); + align_buffer_64(dst_pixels_opt, kPixels * 4); + align_buffer_64(dst_pixels_c, kPixels * 4); + + MemRandomize(orig_pixels, kPixels * 4); + MemRandomize(orig_y, kPixels); + MemRandomize(orig_u, kHalfPixels); + MemRandomize(orig_v, kHalfPixels); + MemRandomize(temp_y, kPixels); + MemRandomize(temp_u, kHalfPixels); + MemRandomize(temp_v, kHalfPixels); + MemRandomize(dst_pixels_opt, kPixels * 4); + MemRandomize(dst_pixels_c, kPixels * 4); + + // The test is overall for color conversion matrix being reversible, so + // this initializes the pixel with 2x2 blocks to eliminate subsampling. + uint8* p = orig_y; + for (int y = 0; y < benchmark_height_ - 1; y += 2) { + for (int x = 0; x < benchmark_width_ - 1; x += 2) { + uint8 r = static_cast(random()); + p[0] = r; + p[1] = r; + p[benchmark_width_] = r; + p[benchmark_width_ + 1] = r; + p += 2; + } + p += benchmark_width_; + } + + // Start with YUV converted to ARGB. + I420ToARGB(orig_y, benchmark_width_, + orig_u, (benchmark_width_ + 1) / 2, + orig_v, (benchmark_width_ + 1) / 2, + orig_pixels, benchmark_width_ * 4, + benchmark_width_, benchmark_height_); + + ARGBToI420(orig_pixels, benchmark_width_ * 4, + temp_y, benchmark_width_, + temp_u, (benchmark_width_ + 1) / 2, + temp_v, (benchmark_width_ + 1) / 2, + benchmark_width_, benchmark_height_); + + MaskCpuFlags(0); + I420ToARGB(temp_y, benchmark_width_, + temp_u, (benchmark_width_ + 1) / 2, + temp_v, (benchmark_width_ + 1) / 2, + dst_pixels_c, benchmark_width_ * 4, + benchmark_width_, benchmark_height_); + MaskCpuFlags(-1); + + for (int i = 0; i < benchmark_iterations_; ++i) { + I420ToARGB(temp_y, benchmark_width_, + temp_u, (benchmark_width_ + 1) / 2, + temp_v, (benchmark_width_ + 1) / 2, + dst_pixels_opt, benchmark_width_ * 4, + benchmark_width_, benchmark_height_); + } + // Test C and SIMD match. + for (int i = 0; i < kPixels * 4; ++i) { + EXPECT_EQ(dst_pixels_c[i], dst_pixels_opt[i]); + } + // Test SIMD is close to original. + for (int i = 0; i < kPixels * 4; ++i) { + EXPECT_NEAR(static_cast(orig_pixels[i]), + static_cast(dst_pixels_opt[i]), 6); + } + + free_aligned_buffer_64(orig_pixels); + free_aligned_buffer_64(orig_y); + free_aligned_buffer_64(orig_u); + free_aligned_buffer_64(orig_v); + free_aligned_buffer_64(temp_y); + free_aligned_buffer_64(temp_u); + free_aligned_buffer_64(temp_v); + free_aligned_buffer_64(dst_pixels_opt); + free_aligned_buffer_64(dst_pixels_c); +} + } // namespace libyuv