summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorfbarchard@google.com <fbarchard@google.com@16f28f9a-4ce2-e073-06de-1de4eb20be90>2014-07-18 18:18:35 +0000
committerfbarchard@google.com <fbarchard@google.com@16f28f9a-4ce2-e073-06de-1de4eb20be90>2014-07-18 18:18:35 +0000
commit74ce999a9a2328d5f25b608699eb1660772021a9 (patch)
treea6ced933420b05f2711898547ee62b90a1f5d6f3
parent451a7541b7fbbcb85199dfbc6faccdb1955ea1d5 (diff)
downloadlibyuv-74ce999a9a2328d5f25b608699eb1660772021a9.tar.gz
Add NV12 cropping unittest to confirm behavior.
BUG=344 TESTED=libyuv_unittest --gtest_filter=*CropNV12 R=tpsiaki@google.com Review URL: https://webrtc-codereview.appspot.com/16939004 git-svn-id: http://libyuv.googlecode.com/svn/trunk@1036 16f28f9a-4ce2-e073-06de-1de4eb20be90
-rw-r--r--unit_test/convert_test.cc132
1 files changed, 125 insertions, 7 deletions
diff --git a/unit_test/convert_test.cc b/unit_test/convert_test.cc
index 0697b9f..2f47761 100644
--- a/unit_test/convert_test.cc
+++ b/unit_test/convert_test.cc
@@ -24,6 +24,7 @@
#include "libyuv/planar_functions.h"
#include "libyuv/rotate.h"
#include "libyuv/row.h"
+#include "libyuv/video_common.h"
#include "../unit_test/unit_test.h"
#if defined(_MSC_VER)
@@ -811,13 +812,13 @@ TEST_F(libyuvTest, FMT_A##To##FMT_PLANAR##N) { \
#define TESTATOBIPLANAR(FMT_A, BPP_A, FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y) \
TESTATOBIPLANARI(FMT_A, BPP_A, FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y, \
- benchmark_width_ - 4, _Any, +, 0) \
+ benchmark_width_ - 4, _Any, +, 0) \
TESTATOBIPLANARI(FMT_A, BPP_A, FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y, \
- benchmark_width_, _Unaligned, +, 1) \
+ benchmark_width_, _Unaligned, +, 1) \
TESTATOBIPLANARI(FMT_A, BPP_A, FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y, \
- benchmark_width_, _Invert, -, 0) \
+ benchmark_width_, _Invert, -, 0) \
TESTATOBIPLANARI(FMT_A, BPP_A, FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y, \
- benchmark_width_, _Opt, +, 0)
+ benchmark_width_, _Opt, +, 0)
TESTATOBIPLANAR(ARGB, 4, NV12, 2, 2)
TESTATOBIPLANAR(ARGB, 4, NV21, 2, 2)
@@ -1008,11 +1009,11 @@ TEST_F(libyuvTest, FMT_ATOB##_Symetric##N) { \
#define TESTSYM(FMT_ATOB, BPP_A, STRIDE_A, HEIGHT_A) \
TESTSYMI(FMT_ATOB, BPP_A, STRIDE_A, HEIGHT_A, \
- benchmark_width_ - 4, _Any, +, 0) \
+ benchmark_width_ - 4, _Any, +, 0) \
TESTSYMI(FMT_ATOB, BPP_A, STRIDE_A, HEIGHT_A, \
- benchmark_width_, _Unaligned, +, 1) \
+ benchmark_width_, _Unaligned, +, 1) \
TESTSYMI(FMT_ATOB, BPP_A, STRIDE_A, HEIGHT_A, \
- benchmark_width_, _Opt, +, 0)
+ benchmark_width_, _Opt, +, 0)
TESTSYM(ARGBToARGB, 4, 4, 1)
TESTSYM(ARGBToBGRA, 4, 4, 1)
@@ -1156,4 +1157,121 @@ TEST_F(libyuvTest, MJPGToARGB) {
#endif // HAVE_JPEG
+TEST_F(libyuvTest, CropNV12) {
+ const int SUBSAMP_X = 2;
+ const int SUBSAMP_Y = 2;
+ const int kWidth = benchmark_width_;
+ const int kHeight = benchmark_height_;
+ const int crop_y =
+ (benchmark_height_ - (benchmark_height_ * 360 / 480)) / 2;
+ const int kDestWidth = benchmark_width_;
+ const int kDestHeight = benchmark_height_ - crop_y * 2;;
+ const int sample_size = kWidth * kHeight +
+ SUBSAMPLE(kWidth, SUBSAMP_X) *
+ SUBSAMPLE(kHeight, SUBSAMP_Y) * 2;
+ align_buffer_64(src_y, sample_size);
+ uint8* src_uv = src_y + kWidth * kHeight;
+
+ align_buffer_64(dst_y, kDestWidth * kDestHeight);
+ align_buffer_64(dst_u,
+ SUBSAMPLE(kDestWidth, SUBSAMP_X) *
+ SUBSAMPLE(kDestHeight, SUBSAMP_Y));
+ align_buffer_64(dst_v,
+ SUBSAMPLE(kDestWidth, SUBSAMP_X) *
+ SUBSAMPLE(kDestHeight, SUBSAMP_Y));
+
+ align_buffer_64(dst_y_2, kDestWidth * kDestHeight);
+ align_buffer_64(dst_u_2,
+ SUBSAMPLE(kDestWidth, SUBSAMP_X) *
+ SUBSAMPLE(kDestHeight, SUBSAMP_Y));
+ align_buffer_64(dst_v_2,
+ SUBSAMPLE(kDestWidth, SUBSAMP_X) *
+ SUBSAMPLE(kDestHeight, SUBSAMP_Y));
+
+ srandom(time(NULL));
+ for (int i = 0; i < kHeight; ++i)
+ for (int j = 0; j < kWidth; ++j)
+ src_y[(i * kWidth) + j] = (random() & 0xff);
+ for (int i = 0; i < SUBSAMPLE(kHeight, SUBSAMP_X); ++i) {
+ for (int j = 0; j < SUBSAMPLE(kWidth, SUBSAMP_X); ++j) {
+ src_uv[(i * SUBSAMPLE(kWidth, SUBSAMP_X)) + j * 2 + 0] =
+ (random() & 0xff);
+ src_uv[(i * SUBSAMPLE(kWidth, SUBSAMP_X)) + j * 2 + 1] =
+ (random() & 0xff);
+ }
+ }
+ memset(dst_y, 1, kDestWidth * kDestHeight);
+ memset(dst_u, 2, SUBSAMPLE(kDestWidth, SUBSAMP_X) *
+ SUBSAMPLE(kDestHeight, SUBSAMP_Y));
+ memset(dst_v, 3, SUBSAMPLE(kDestWidth, SUBSAMP_X) *
+ SUBSAMPLE(kDestHeight, SUBSAMP_Y));
+ memset(dst_y_2, 1, kDestWidth * kDestHeight);
+ memset(dst_u_2, 2, SUBSAMPLE(kDestWidth, SUBSAMP_X) *
+ SUBSAMPLE(kDestHeight, SUBSAMP_Y));
+ memset(dst_v_2, 3, SUBSAMPLE(kDestWidth, SUBSAMP_X) *
+ SUBSAMPLE(kDestHeight, SUBSAMP_Y));
+
+ NV12ToI420(src_y + crop_y * kWidth, kWidth,
+ src_uv + (crop_y / 2) * kWidth, kWidth,
+ dst_y, kDestWidth,
+ dst_u, SUBSAMPLE(kDestWidth, SUBSAMP_X),
+ dst_v, SUBSAMPLE(kDestWidth, SUBSAMP_X),
+ kDestWidth, kDestHeight);
+
+ ConvertToI420(src_y, sample_size,
+ dst_y_2, kDestWidth,
+ dst_u_2, SUBSAMPLE(kDestWidth, SUBSAMP_X),
+ dst_v_2, SUBSAMPLE(kDestWidth, SUBSAMP_X),
+ 0, crop_y,
+ kWidth, kHeight,
+ kDestWidth, kDestHeight,
+ libyuv::kRotate0, libyuv::FOURCC_NV12);
+
+ int max_diff = 0;
+ for (int i = 0; i < kDestHeight; ++i) {
+ for (int j = 0; j < kDestWidth; ++j) {
+ int abs_diff =
+ abs(static_cast<int>(dst_y[i * kWidth + j]) -
+ static_cast<int>(dst_y_2[i * kWidth + j]));
+ if (abs_diff > max_diff) {
+ max_diff = abs_diff;
+ }
+ }
+ }
+ EXPECT_LE(max_diff, 0);
+ for (int i = 0; i < SUBSAMPLE(kDestHeight, SUBSAMP_Y); ++i) {
+ for (int j = 0; j < SUBSAMPLE(kDestWidth, SUBSAMP_X); ++j) {
+ int abs_diff =
+ abs(static_cast<int>(dst_u[i *
+ SUBSAMPLE(kDestWidth, SUBSAMP_X) + j]) -
+ static_cast<int>(dst_u_2[i *
+ SUBSAMPLE(kDestWidth, SUBSAMP_X) + j]));
+ if (abs_diff > max_diff) {
+ max_diff = abs_diff;
+ }
+ }
+ }
+ EXPECT_LE(max_diff, 0);
+ for (int i = 0; i < SUBSAMPLE(kDestHeight, SUBSAMP_Y); ++i) {
+ for (int j = 0; j < SUBSAMPLE(kDestWidth, SUBSAMP_X); ++j) {
+ int abs_diff =
+ abs(static_cast<int>(dst_v[i *
+ SUBSAMPLE(kDestWidth, SUBSAMP_X) + j]) -
+ static_cast<int>(dst_v_2[i *
+ SUBSAMPLE(kDestWidth, SUBSAMP_X) + j]));
+ if (abs_diff > max_diff) {
+ max_diff = abs_diff;
+ }
+ }
+ }
+ EXPECT_LE(max_diff, 0);
+ free_aligned_buffer_64(dst_y);
+ free_aligned_buffer_64(dst_u);
+ free_aligned_buffer_64(dst_v);
+ free_aligned_buffer_64(dst_y_2);
+ free_aligned_buffer_64(dst_u_2);
+ free_aligned_buffer_64(dst_v_2);
+ free_aligned_buffer_64(src_y);
+}
+
} // namespace libyuv