1*4e366538SXin Li /*
2*4e366538SXin Li * Copyright 2023 The LibYuv Project Authors. All rights reserved.
3*4e366538SXin Li *
4*4e366538SXin Li * Use of this source code is governed by a BSD-style license
5*4e366538SXin Li * that can be found in the LICENSE file in the root of the source
6*4e366538SXin Li * tree. An additional intellectual property rights grant can be found
7*4e366538SXin Li * in the file PATENTS. All contributing project authors may
8*4e366538SXin Li * be found in the AUTHORS file in the root of the source tree.
9*4e366538SXin Li */
10*4e366538SXin Li
11*4e366538SXin Li #include <assert.h>
12*4e366538SXin Li #include <stdlib.h>
13*4e366538SXin Li #include <time.h>
14*4e366538SXin Li
15*4e366538SXin Li #include "libyuv/basic_types.h"
16*4e366538SXin Li #include "libyuv/compare.h"
17*4e366538SXin Li #include "libyuv/convert.h"
18*4e366538SXin Li #include "libyuv/convert_argb.h"
19*4e366538SXin Li #include "libyuv/convert_from.h"
20*4e366538SXin Li #include "libyuv/convert_from_argb.h"
21*4e366538SXin Li #include "libyuv/cpu_id.h"
22*4e366538SXin Li #ifdef HAVE_JPEG
23*4e366538SXin Li #include "libyuv/mjpeg_decoder.h"
24*4e366538SXin Li #endif
25*4e366538SXin Li #include "../unit_test/unit_test.h"
26*4e366538SXin Li #include "libyuv/planar_functions.h"
27*4e366538SXin Li #include "libyuv/rotate.h"
28*4e366538SXin Li #include "libyuv/video_common.h"
29*4e366538SXin Li
30*4e366538SXin Li #ifdef ENABLE_ROW_TESTS
31*4e366538SXin Li #include "libyuv/row.h" /* For ARGBToAR30Row_AVX2 */
32*4e366538SXin Li #endif
33*4e366538SXin Li
34*4e366538SXin Li #if defined(__riscv) && !defined(__clang__)
35*4e366538SXin Li #define DISABLE_SLOW_TESTS
36*4e366538SXin Li #undef ENABLE_FULL_TESTS
37*4e366538SXin Li #undef ENABLE_ROW_TESTS
38*4e366538SXin Li #define LEAN_TESTS
39*4e366538SXin Li #endif
40*4e366538SXin Li
41*4e366538SXin Li // Some functions fail on big endian. Enable these tests on all cpus except
42*4e366538SXin Li // PowerPC, but they are not optimized so disabled by default.
43*4e366538SXin Li #if !defined(DISABLE_SLOW_TESTS) && !defined(__powerpc__)
44*4e366538SXin Li #define LITTLE_ENDIAN_ONLY_TEST 1
45*4e366538SXin Li #endif
46*4e366538SXin Li #if !defined(DISABLE_SLOW_TESTS) || defined(__x86_64__) || defined(__i386__)
47*4e366538SXin Li // SLOW TESTS are those that are unoptimized C code.
48*4e366538SXin Li // FULL TESTS are optimized but test many variations of the same code.
49*4e366538SXin Li #define ENABLE_FULL_TESTS
50*4e366538SXin Li #endif
51*4e366538SXin Li
52*4e366538SXin Li namespace libyuv {
53*4e366538SXin Li
54*4e366538SXin Li // Alias to copy pixels as is
55*4e366538SXin Li #define AR30ToAR30 ARGBCopy
56*4e366538SXin Li #define ABGRToABGR ARGBCopy
57*4e366538SXin Li
58*4e366538SXin Li // subsample amount uses a divide.
59*4e366538SXin Li #define SUBSAMPLE(v, a) ((((v) + (a)-1)) / (a))
60*4e366538SXin Li
61*4e366538SXin Li #define ALIGNINT(V, ALIGN) (((V) + (ALIGN)-1) / (ALIGN) * (ALIGN))
62*4e366538SXin Li
63*4e366538SXin Li #define TESTBPTOPI(SRC_FMT_PLANAR, SRC_T, SRC_BPC, SRC_SUBSAMP_X, \
64*4e366538SXin Li SRC_SUBSAMP_Y, FMT_PLANAR, DST_T, DST_BPC, DST_SUBSAMP_X, \
65*4e366538SXin Li DST_SUBSAMP_Y, W1280, N, NEG, OFF, SRC_DEPTH, TILE_WIDTH, \
66*4e366538SXin Li TILE_HEIGHT) \
67*4e366538SXin Li TEST_F(LibYUVConvertTest, SRC_FMT_PLANAR##To##FMT_PLANAR##N) { \
68*4e366538SXin Li static_assert(SRC_BPC == 1 || SRC_BPC == 2, "SRC BPC unsupported"); \
69*4e366538SXin Li static_assert(DST_BPC == 1 || DST_BPC == 2, "DST BPC unsupported"); \
70*4e366538SXin Li static_assert(SRC_SUBSAMP_X == 1 || SRC_SUBSAMP_X == 2, \
71*4e366538SXin Li "SRC_SUBSAMP_X unsupported"); \
72*4e366538SXin Li static_assert(SRC_SUBSAMP_Y == 1 || SRC_SUBSAMP_Y == 2, \
73*4e366538SXin Li "SRC_SUBSAMP_Y unsupported"); \
74*4e366538SXin Li static_assert(DST_SUBSAMP_X == 1 || DST_SUBSAMP_X == 2, \
75*4e366538SXin Li "DST_SUBSAMP_X unsupported"); \
76*4e366538SXin Li static_assert(DST_SUBSAMP_Y == 1 || DST_SUBSAMP_Y == 2, \
77*4e366538SXin Li "DST_SUBSAMP_Y unsupported"); \
78*4e366538SXin Li const int kWidth = W1280; \
79*4e366538SXin Li const int kHeight = benchmark_height_; \
80*4e366538SXin Li const int kSrcHalfWidth = SUBSAMPLE(kWidth, SRC_SUBSAMP_X); \
81*4e366538SXin Li const int kDstHalfWidth = SUBSAMPLE(kWidth, DST_SUBSAMP_X); \
82*4e366538SXin Li const int kDstHalfHeight = SUBSAMPLE(kHeight, DST_SUBSAMP_Y); \
83*4e366538SXin Li const int kPaddedWidth = (kWidth + (TILE_WIDTH - 1)) & ~(TILE_WIDTH - 1); \
84*4e366538SXin Li const int kPaddedHeight = \
85*4e366538SXin Li (kHeight + (TILE_HEIGHT - 1)) & ~(TILE_HEIGHT - 1); \
86*4e366538SXin Li const int kSrcHalfPaddedWidth = SUBSAMPLE(kPaddedWidth, SRC_SUBSAMP_X); \
87*4e366538SXin Li const int kSrcHalfPaddedHeight = SUBSAMPLE(kPaddedHeight, SRC_SUBSAMP_Y); \
88*4e366538SXin Li align_buffer_page_end(src_y, kPaddedWidth* kPaddedHeight* SRC_BPC + OFF); \
89*4e366538SXin Li align_buffer_page_end( \
90*4e366538SXin Li src_uv, kSrcHalfPaddedWidth* kSrcHalfPaddedHeight* SRC_BPC * 2 + OFF); \
91*4e366538SXin Li align_buffer_page_end(dst_y_c, kWidth* kHeight* DST_BPC); \
92*4e366538SXin Li align_buffer_page_end(dst_u_c, kDstHalfWidth* kDstHalfHeight* DST_BPC); \
93*4e366538SXin Li align_buffer_page_end(dst_v_c, kDstHalfWidth* kDstHalfHeight* DST_BPC); \
94*4e366538SXin Li align_buffer_page_end(dst_y_opt, kWidth* kHeight* DST_BPC); \
95*4e366538SXin Li align_buffer_page_end(dst_u_opt, kDstHalfWidth* kDstHalfHeight* DST_BPC); \
96*4e366538SXin Li align_buffer_page_end(dst_v_opt, kDstHalfWidth* kDstHalfHeight* DST_BPC); \
97*4e366538SXin Li SRC_T* src_y_p = reinterpret_cast<SRC_T*>(src_y + OFF); \
98*4e366538SXin Li SRC_T* src_uv_p = reinterpret_cast<SRC_T*>(src_uv + OFF); \
99*4e366538SXin Li for (int i = 0; i < kPaddedWidth * kPaddedHeight; ++i) { \
100*4e366538SXin Li src_y_p[i] = \
101*4e366538SXin Li (fastrand() & (((SRC_T)(-1)) << ((8 * SRC_BPC) - SRC_DEPTH))); \
102*4e366538SXin Li } \
103*4e366538SXin Li for (int i = 0; i < kSrcHalfPaddedWidth * kSrcHalfPaddedHeight * 2; ++i) { \
104*4e366538SXin Li src_uv_p[i] = \
105*4e366538SXin Li (fastrand() & (((SRC_T)(-1)) << ((8 * SRC_BPC) - SRC_DEPTH))); \
106*4e366538SXin Li } \
107*4e366538SXin Li memset(dst_y_c, 1, kWidth* kHeight* DST_BPC); \
108*4e366538SXin Li memset(dst_u_c, 2, kDstHalfWidth* kDstHalfHeight* DST_BPC); \
109*4e366538SXin Li memset(dst_v_c, 3, kDstHalfWidth* kDstHalfHeight* DST_BPC); \
110*4e366538SXin Li memset(dst_y_opt, 101, kWidth* kHeight* DST_BPC); \
111*4e366538SXin Li memset(dst_u_opt, 102, kDstHalfWidth* kDstHalfHeight* DST_BPC); \
112*4e366538SXin Li memset(dst_v_opt, 103, kDstHalfWidth* kDstHalfHeight* DST_BPC); \
113*4e366538SXin Li MaskCpuFlags(disable_cpu_flags_); \
114*4e366538SXin Li SRC_FMT_PLANAR##To##FMT_PLANAR( \
115*4e366538SXin Li src_y_p, kWidth, src_uv_p, kSrcHalfWidth * 2, \
116*4e366538SXin Li reinterpret_cast<DST_T*>(dst_y_c), kWidth, \
117*4e366538SXin Li reinterpret_cast<DST_T*>(dst_u_c), kDstHalfWidth, \
118*4e366538SXin Li reinterpret_cast<DST_T*>(dst_v_c), kDstHalfWidth, kWidth, \
119*4e366538SXin Li NEG kHeight); \
120*4e366538SXin Li MaskCpuFlags(benchmark_cpu_info_); \
121*4e366538SXin Li for (int i = 0; i < benchmark_iterations_; ++i) { \
122*4e366538SXin Li SRC_FMT_PLANAR##To##FMT_PLANAR( \
123*4e366538SXin Li src_y_p, kWidth, src_uv_p, kSrcHalfWidth * 2, \
124*4e366538SXin Li reinterpret_cast<DST_T*>(dst_y_opt), kWidth, \
125*4e366538SXin Li reinterpret_cast<DST_T*>(dst_u_opt), kDstHalfWidth, \
126*4e366538SXin Li reinterpret_cast<DST_T*>(dst_v_opt), kDstHalfWidth, kWidth, \
127*4e366538SXin Li NEG kHeight); \
128*4e366538SXin Li } \
129*4e366538SXin Li for (int i = 0; i < kHeight * kWidth * DST_BPC; ++i) { \
130*4e366538SXin Li EXPECT_EQ(dst_y_c[i], dst_y_opt[i]); \
131*4e366538SXin Li } \
132*4e366538SXin Li for (int i = 0; i < kDstHalfWidth * kDstHalfHeight * DST_BPC; ++i) { \
133*4e366538SXin Li EXPECT_EQ(dst_u_c[i], dst_u_opt[i]); \
134*4e366538SXin Li EXPECT_EQ(dst_v_c[i], dst_v_opt[i]); \
135*4e366538SXin Li } \
136*4e366538SXin Li free_aligned_buffer_page_end(dst_y_c); \
137*4e366538SXin Li free_aligned_buffer_page_end(dst_u_c); \
138*4e366538SXin Li free_aligned_buffer_page_end(dst_v_c); \
139*4e366538SXin Li free_aligned_buffer_page_end(dst_y_opt); \
140*4e366538SXin Li free_aligned_buffer_page_end(dst_u_opt); \
141*4e366538SXin Li free_aligned_buffer_page_end(dst_v_opt); \
142*4e366538SXin Li free_aligned_buffer_page_end(src_y); \
143*4e366538SXin Li free_aligned_buffer_page_end(src_uv); \
144*4e366538SXin Li }
145*4e366538SXin Li
146*4e366538SXin Li #if defined(ENABLE_FULL_TESTS)
147*4e366538SXin Li #define TESTBPTOP(SRC_FMT_PLANAR, SRC_T, SRC_BPC, SRC_SUBSAMP_X, \
148*4e366538SXin Li SRC_SUBSAMP_Y, FMT_PLANAR, DST_T, DST_BPC, DST_SUBSAMP_X, \
149*4e366538SXin Li DST_SUBSAMP_Y, SRC_DEPTH, TILE_WIDTH, TILE_HEIGHT) \
150*4e366538SXin Li TESTBPTOPI(SRC_FMT_PLANAR, SRC_T, SRC_BPC, SRC_SUBSAMP_X, SRC_SUBSAMP_Y, \
151*4e366538SXin Li FMT_PLANAR, DST_T, DST_BPC, DST_SUBSAMP_X, DST_SUBSAMP_Y, \
152*4e366538SXin Li benchmark_width_ + 1, _Any, +, 0, SRC_DEPTH, TILE_WIDTH, \
153*4e366538SXin Li TILE_HEIGHT) \
154*4e366538SXin Li TESTBPTOPI(SRC_FMT_PLANAR, SRC_T, SRC_BPC, SRC_SUBSAMP_X, SRC_SUBSAMP_Y, \
155*4e366538SXin Li FMT_PLANAR, DST_T, DST_BPC, DST_SUBSAMP_X, DST_SUBSAMP_Y, \
156*4e366538SXin Li benchmark_width_, _Unaligned, +, 2, SRC_DEPTH, TILE_WIDTH, \
157*4e366538SXin Li TILE_HEIGHT) \
158*4e366538SXin Li TESTBPTOPI(SRC_FMT_PLANAR, SRC_T, SRC_BPC, SRC_SUBSAMP_X, SRC_SUBSAMP_Y, \
159*4e366538SXin Li FMT_PLANAR, DST_T, DST_BPC, DST_SUBSAMP_X, DST_SUBSAMP_Y, \
160*4e366538SXin Li benchmark_width_, _Invert, -, 0, SRC_DEPTH, TILE_WIDTH, \
161*4e366538SXin Li TILE_HEIGHT) \
162*4e366538SXin Li TESTBPTOPI(SRC_FMT_PLANAR, SRC_T, SRC_BPC, SRC_SUBSAMP_X, SRC_SUBSAMP_Y, \
163*4e366538SXin Li FMT_PLANAR, DST_T, DST_BPC, DST_SUBSAMP_X, DST_SUBSAMP_Y, \
164*4e366538SXin Li benchmark_width_, _Opt, +, 0, SRC_DEPTH, TILE_WIDTH, TILE_HEIGHT)
165*4e366538SXin Li #else
166*4e366538SXin Li #define TESTBPTOP(SRC_FMT_PLANAR, SRC_T, SRC_BPC, SRC_SUBSAMP_X, \
167*4e366538SXin Li SRC_SUBSAMP_Y, FMT_PLANAR, DST_T, DST_BPC, DST_SUBSAMP_X, \
168*4e366538SXin Li DST_SUBSAMP_Y, SRC_DEPTH, TILE_WIDTH, TILE_HEIGHT) \
169*4e366538SXin Li TESTBPTOPI(SRC_FMT_PLANAR, SRC_T, SRC_BPC, SRC_SUBSAMP_X, SRC_SUBSAMP_Y, \
170*4e366538SXin Li FMT_PLANAR, DST_T, DST_BPC, DST_SUBSAMP_X, DST_SUBSAMP_Y, \
171*4e366538SXin Li benchmark_width_, _Opt, +, 0, SRC_DEPTH, TILE_WIDTH, TILE_HEIGHT)
172*4e366538SXin Li #endif
173*4e366538SXin Li
174*4e366538SXin Li TESTBPTOP(NV12, uint8_t, 1, 2, 2, I420, uint8_t, 1, 2, 2, 8, 1, 1)
175*4e366538SXin Li TESTBPTOP(NV21, uint8_t, 1, 2, 2, I420, uint8_t, 1, 2, 2, 8, 1, 1)
176*4e366538SXin Li TESTBPTOP(MM21, uint8_t, 1, 2, 2, I420, uint8_t, 1, 2, 2, 8, 16, 32)
177*4e366538SXin Li TESTBPTOP(P010, uint16_t, 2, 2, 2, I010, uint16_t, 2, 2, 2, 10, 1, 1)
178*4e366538SXin Li TESTBPTOP(P012, uint16_t, 2, 2, 2, I012, uint16_t, 2, 2, 2, 12, 1, 1)
179*4e366538SXin Li
180*4e366538SXin Li // Provide matrix wrappers for full range bt.709
181*4e366538SXin Li #define F420ToABGR(a, b, c, d, e, f, g, h, i, j) \
182*4e366538SXin Li I420ToARGBMatrix(a, b, e, f, c, d, g, h, &kYvuF709Constants, i, j)
183*4e366538SXin Li #define F420ToARGB(a, b, c, d, e, f, g, h, i, j) \
184*4e366538SXin Li I420ToARGBMatrix(a, b, c, d, e, f, g, h, &kYuvF709Constants, i, j)
185*4e366538SXin Li #define F422ToABGR(a, b, c, d, e, f, g, h, i, j) \
186*4e366538SXin Li I422ToARGBMatrix(a, b, e, f, c, d, g, h, &kYvuF709Constants, i, j)
187*4e366538SXin Li #define F422ToARGB(a, b, c, d, e, f, g, h, i, j) \
188*4e366538SXin Li I422ToARGBMatrix(a, b, c, d, e, f, g, h, &kYuvF709Constants, i, j)
189*4e366538SXin Li #define F444ToABGR(a, b, c, d, e, f, g, h, i, j) \
190*4e366538SXin Li I444ToARGBMatrix(a, b, e, f, c, d, g, h, &kYvuF709Constants, i, j)
191*4e366538SXin Li #define F444ToARGB(a, b, c, d, e, f, g, h, i, j) \
192*4e366538SXin Li I444ToARGBMatrix(a, b, c, d, e, f, g, h, &kYuvF709Constants, i, j)
193*4e366538SXin Li
194*4e366538SXin Li // Provide matrix wrappers for full range bt.2020
195*4e366538SXin Li #define V420ToABGR(a, b, c, d, e, f, g, h, i, j) \
196*4e366538SXin Li I420ToARGBMatrix(a, b, e, f, c, d, g, h, &kYvuV2020Constants, i, j)
197*4e366538SXin Li #define V420ToARGB(a, b, c, d, e, f, g, h, i, j) \
198*4e366538SXin Li I420ToARGBMatrix(a, b, c, d, e, f, g, h, &kYuvV2020Constants, i, j)
199*4e366538SXin Li #define V422ToABGR(a, b, c, d, e, f, g, h, i, j) \
200*4e366538SXin Li I422ToARGBMatrix(a, b, e, f, c, d, g, h, &kYvuV2020Constants, i, j)
201*4e366538SXin Li #define V422ToARGB(a, b, c, d, e, f, g, h, i, j) \
202*4e366538SXin Li I422ToARGBMatrix(a, b, c, d, e, f, g, h, &kYuvV2020Constants, i, j)
203*4e366538SXin Li #define V444ToABGR(a, b, c, d, e, f, g, h, i, j) \
204*4e366538SXin Li I444ToARGBMatrix(a, b, e, f, c, d, g, h, &kYvuV2020Constants, i, j)
205*4e366538SXin Li #define V444ToARGB(a, b, c, d, e, f, g, h, i, j) \
206*4e366538SXin Li I444ToARGBMatrix(a, b, c, d, e, f, g, h, &kYuvV2020Constants, i, j)
207*4e366538SXin Li
208*4e366538SXin Li #define I420ToARGBFilter(a, b, c, d, e, f, g, h, i, j) \
209*4e366538SXin Li I420ToARGBMatrixFilter(a, b, c, d, e, f, g, h, &kYuvI601Constants, i, j, \
210*4e366538SXin Li kFilterBilinear)
211*4e366538SXin Li #define I422ToARGBFilter(a, b, c, d, e, f, g, h, i, j) \
212*4e366538SXin Li I422ToARGBMatrixFilter(a, b, c, d, e, f, g, h, &kYuvI601Constants, i, j, \
213*4e366538SXin Li kFilterBilinear)
214*4e366538SXin Li #define I420ToRGB24Filter(a, b, c, d, e, f, g, h, i, j) \
215*4e366538SXin Li I420ToRGB24MatrixFilter(a, b, c, d, e, f, g, h, &kYuvI601Constants, i, j, \
216*4e366538SXin Li kFilterBilinear)
217*4e366538SXin Li #define I422ToRGB24Filter(a, b, c, d, e, f, g, h, i, j) \
218*4e366538SXin Li I420ToRGB24MatrixFilter(a, b, c, d, e, f, g, h, &kYuvI601Constants, i, j, \
219*4e366538SXin Li kFilterBilinear)
220*4e366538SXin Li
221*4e366538SXin Li #define TESTPLANARTOBI(FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y, FMT_B, BPP_B, ALIGN, \
222*4e366538SXin Li YALIGN, W1280, N, NEG, OFF) \
223*4e366538SXin Li TEST_F(LibYUVConvertTest, FMT_PLANAR##To##FMT_B##N) { \
224*4e366538SXin Li const int kWidth = W1280; \
225*4e366538SXin Li const int kHeight = ALIGNINT(benchmark_height_, YALIGN); \
226*4e366538SXin Li const int kStrideB = ALIGNINT(kWidth * BPP_B, ALIGN); \
227*4e366538SXin Li const int kStrideUV = SUBSAMPLE(kWidth, SUBSAMP_X); \
228*4e366538SXin Li const int kSizeUV = kStrideUV * SUBSAMPLE(kHeight, SUBSAMP_Y); \
229*4e366538SXin Li align_buffer_page_end(src_y, kWidth* kHeight + OFF); \
230*4e366538SXin Li align_buffer_page_end(src_u, kSizeUV + OFF); \
231*4e366538SXin Li align_buffer_page_end(src_v, kSizeUV + OFF); \
232*4e366538SXin Li align_buffer_page_end(dst_argb_c, kStrideB* kHeight + OFF); \
233*4e366538SXin Li align_buffer_page_end(dst_argb_opt, kStrideB* kHeight + OFF); \
234*4e366538SXin Li for (int i = 0; i < kWidth * kHeight; ++i) { \
235*4e366538SXin Li src_y[i + OFF] = (fastrand() & 0xff); \
236*4e366538SXin Li } \
237*4e366538SXin Li for (int i = 0; i < kSizeUV; ++i) { \
238*4e366538SXin Li src_u[i + OFF] = (fastrand() & 0xff); \
239*4e366538SXin Li src_v[i + OFF] = (fastrand() & 0xff); \
240*4e366538SXin Li } \
241*4e366538SXin Li memset(dst_argb_c + OFF, 1, kStrideB * kHeight); \
242*4e366538SXin Li memset(dst_argb_opt + OFF, 101, kStrideB * kHeight); \
243*4e366538SXin Li MaskCpuFlags(disable_cpu_flags_); \
244*4e366538SXin Li double time0 = get_time(); \
245*4e366538SXin Li FMT_PLANAR##To##FMT_B(src_y + OFF, kWidth, src_u + OFF, kStrideUV, \
246*4e366538SXin Li src_v + OFF, kStrideUV, dst_argb_c + OFF, kStrideB, \
247*4e366538SXin Li kWidth, NEG kHeight); \
248*4e366538SXin Li double time1 = get_time(); \
249*4e366538SXin Li MaskCpuFlags(benchmark_cpu_info_); \
250*4e366538SXin Li for (int i = 0; i < benchmark_iterations_; ++i) { \
251*4e366538SXin Li FMT_PLANAR##To##FMT_B(src_y + OFF, kWidth, src_u + OFF, kStrideUV, \
252*4e366538SXin Li src_v + OFF, kStrideUV, dst_argb_opt + OFF, \
253*4e366538SXin Li kStrideB, kWidth, NEG kHeight); \
254*4e366538SXin Li } \
255*4e366538SXin Li double time2 = get_time(); \
256*4e366538SXin Li printf(" %8d us C - %8d us OPT\n", \
257*4e366538SXin Li static_cast<int>((time1 - time0) * 1e6), \
258*4e366538SXin Li static_cast<int>((time2 - time1) * 1e6 / benchmark_iterations_)); \
259*4e366538SXin Li for (int i = 0; i < kWidth * BPP_B * kHeight; ++i) { \
260*4e366538SXin Li EXPECT_EQ(dst_argb_c[i + OFF], dst_argb_opt[i + OFF]); \
261*4e366538SXin Li } \
262*4e366538SXin Li free_aligned_buffer_page_end(src_y); \
263*4e366538SXin Li free_aligned_buffer_page_end(src_u); \
264*4e366538SXin Li free_aligned_buffer_page_end(src_v); \
265*4e366538SXin Li free_aligned_buffer_page_end(dst_argb_c); \
266*4e366538SXin Li free_aligned_buffer_page_end(dst_argb_opt); \
267*4e366538SXin Li }
268*4e366538SXin Li
269*4e366538SXin Li #if defined(ENABLE_FULL_TESTS)
270*4e366538SXin Li #define TESTPLANARTOB(FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y, FMT_B, BPP_B, ALIGN, \
271*4e366538SXin Li YALIGN) \
272*4e366538SXin Li TESTPLANARTOBI(FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y, FMT_B, BPP_B, ALIGN, \
273*4e366538SXin Li YALIGN, benchmark_width_ + 1, _Any, +, 0) \
274*4e366538SXin Li TESTPLANARTOBI(FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y, FMT_B, BPP_B, ALIGN, \
275*4e366538SXin Li YALIGN, benchmark_width_, _Unaligned, +, 4) \
276*4e366538SXin Li TESTPLANARTOBI(FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y, FMT_B, BPP_B, ALIGN, \
277*4e366538SXin Li YALIGN, benchmark_width_, _Invert, -, 0) \
278*4e366538SXin Li TESTPLANARTOBI(FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y, FMT_B, BPP_B, ALIGN, \
279*4e366538SXin Li YALIGN, benchmark_width_, _Opt, +, 0)
280*4e366538SXin Li #else
281*4e366538SXin Li #define TESTPLANARTOB(FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y, FMT_B, BPP_B, ALIGN, \
282*4e366538SXin Li YALIGN) \
283*4e366538SXin Li TESTPLANARTOBI(FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y, FMT_B, BPP_B, ALIGN, \
284*4e366538SXin Li YALIGN, benchmark_width_, _Opt, +, 0)
285*4e366538SXin Li #endif
286*4e366538SXin Li
287*4e366538SXin Li #if defined(ENABLE_FULL_TESTS)
288*4e366538SXin Li TESTPLANARTOB(I420, 2, 2, ARGB, 4, 4, 1)
289*4e366538SXin Li TESTPLANARTOB(I420, 2, 2, ABGR, 4, 4, 1)
290*4e366538SXin Li TESTPLANARTOB(J420, 2, 2, ARGB, 4, 4, 1)
291*4e366538SXin Li TESTPLANARTOB(J420, 2, 2, ABGR, 4, 4, 1)
292*4e366538SXin Li TESTPLANARTOB(F420, 2, 2, ARGB, 4, 4, 1)
293*4e366538SXin Li TESTPLANARTOB(F420, 2, 2, ABGR, 4, 4, 1)
294*4e366538SXin Li TESTPLANARTOB(H420, 2, 2, ARGB, 4, 4, 1)
295*4e366538SXin Li TESTPLANARTOB(H420, 2, 2, ABGR, 4, 4, 1)
296*4e366538SXin Li TESTPLANARTOB(U420, 2, 2, ARGB, 4, 4, 1)
297*4e366538SXin Li TESTPLANARTOB(U420, 2, 2, ABGR, 4, 4, 1)
298*4e366538SXin Li TESTPLANARTOB(V420, 2, 2, ARGB, 4, 4, 1)
299*4e366538SXin Li TESTPLANARTOB(V420, 2, 2, ABGR, 4, 4, 1)
300*4e366538SXin Li TESTPLANARTOB(I420, 2, 2, BGRA, 4, 4, 1)
301*4e366538SXin Li TESTPLANARTOB(I420, 2, 2, RGBA, 4, 4, 1)
302*4e366538SXin Li TESTPLANARTOB(I420, 2, 2, RAW, 3, 3, 1)
303*4e366538SXin Li TESTPLANARTOB(I420, 2, 2, RGB24, 3, 3, 1)
304*4e366538SXin Li TESTPLANARTOB(J420, 2, 2, RAW, 3, 3, 1)
305*4e366538SXin Li TESTPLANARTOB(J420, 2, 2, RGB24, 3, 3, 1)
306*4e366538SXin Li TESTPLANARTOB(H420, 2, 2, RAW, 3, 3, 1)
307*4e366538SXin Li TESTPLANARTOB(H420, 2, 2, RGB24, 3, 3, 1)
308*4e366538SXin Li #ifdef LITTLE_ENDIAN_ONLY_TEST
309*4e366538SXin Li TESTPLANARTOB(I420, 2, 2, RGB565, 2, 2, 1)
310*4e366538SXin Li TESTPLANARTOB(J420, 2, 2, RGB565, 2, 2, 1)
311*4e366538SXin Li TESTPLANARTOB(H420, 2, 2, RGB565, 2, 2, 1)
312*4e366538SXin Li TESTPLANARTOB(I420, 2, 2, ARGB1555, 2, 2, 1)
313*4e366538SXin Li TESTPLANARTOB(I420, 2, 2, ARGB4444, 2, 2, 1)
314*4e366538SXin Li TESTPLANARTOB(I422, 2, 1, RGB565, 2, 2, 1)
315*4e366538SXin Li #endif
316*4e366538SXin Li TESTPLANARTOB(I422, 2, 1, ARGB, 4, 4, 1)
317*4e366538SXin Li TESTPLANARTOB(I422, 2, 1, ABGR, 4, 4, 1)
318*4e366538SXin Li TESTPLANARTOB(J422, 2, 1, ARGB, 4, 4, 1)
319*4e366538SXin Li TESTPLANARTOB(J422, 2, 1, ABGR, 4, 4, 1)
320*4e366538SXin Li TESTPLANARTOB(H422, 2, 1, ARGB, 4, 4, 1)
321*4e366538SXin Li TESTPLANARTOB(H422, 2, 1, ABGR, 4, 4, 1)
322*4e366538SXin Li TESTPLANARTOB(U422, 2, 1, ARGB, 4, 4, 1)
323*4e366538SXin Li TESTPLANARTOB(U422, 2, 1, ABGR, 4, 4, 1)
324*4e366538SXin Li TESTPLANARTOB(V422, 2, 1, ARGB, 4, 4, 1)
325*4e366538SXin Li TESTPLANARTOB(V422, 2, 1, ABGR, 4, 4, 1)
326*4e366538SXin Li TESTPLANARTOB(I422, 2, 1, BGRA, 4, 4, 1)
327*4e366538SXin Li TESTPLANARTOB(I422, 2, 1, RGBA, 4, 4, 1)
328*4e366538SXin Li TESTPLANARTOB(I422, 1, 1, RGB24, 3, 3, 1)
329*4e366538SXin Li TESTPLANARTOB(I422, 1, 1, RAW, 3, 3, 1)
330*4e366538SXin Li TESTPLANARTOB(I444, 1, 1, ARGB, 4, 4, 1)
331*4e366538SXin Li TESTPLANARTOB(I444, 1, 1, ABGR, 4, 4, 1)
332*4e366538SXin Li TESTPLANARTOB(I444, 1, 1, RGB24, 3, 3, 1)
333*4e366538SXin Li TESTPLANARTOB(I444, 1, 1, RAW, 3, 3, 1)
334*4e366538SXin Li TESTPLANARTOB(J444, 1, 1, ARGB, 4, 4, 1)
335*4e366538SXin Li TESTPLANARTOB(J444, 1, 1, ABGR, 4, 4, 1)
336*4e366538SXin Li TESTPLANARTOB(H444, 1, 1, ARGB, 4, 4, 1)
337*4e366538SXin Li TESTPLANARTOB(H444, 1, 1, ABGR, 4, 4, 1)
338*4e366538SXin Li TESTPLANARTOB(U444, 1, 1, ARGB, 4, 4, 1)
339*4e366538SXin Li TESTPLANARTOB(U444, 1, 1, ABGR, 4, 4, 1)
340*4e366538SXin Li TESTPLANARTOB(V444, 1, 1, ARGB, 4, 4, 1)
341*4e366538SXin Li TESTPLANARTOB(V444, 1, 1, ABGR, 4, 4, 1)
342*4e366538SXin Li TESTPLANARTOB(I420, 2, 2, YUY2, 2, 4, 1)
343*4e366538SXin Li TESTPLANARTOB(I420, 2, 2, UYVY, 2, 4, 1)
344*4e366538SXin Li TESTPLANARTOB(I422, 2, 1, YUY2, 2, 4, 1)
345*4e366538SXin Li TESTPLANARTOB(I422, 2, 1, UYVY, 2, 4, 1)
346*4e366538SXin Li TESTPLANARTOB(I420, 2, 2, I400, 1, 1, 1)
347*4e366538SXin Li TESTPLANARTOB(J420, 2, 2, J400, 1, 1, 1)
348*4e366538SXin Li #ifdef LITTLE_ENDIAN_ONLY_TEST
349*4e366538SXin Li TESTPLANARTOB(I420, 2, 2, AR30, 4, 4, 1)
350*4e366538SXin Li TESTPLANARTOB(H420, 2, 2, AR30, 4, 4, 1)
351*4e366538SXin Li TESTPLANARTOB(I420, 2, 2, AB30, 4, 4, 1)
352*4e366538SXin Li TESTPLANARTOB(H420, 2, 2, AB30, 4, 4, 1)
353*4e366538SXin Li #endif
354*4e366538SXin Li TESTPLANARTOB(I420, 2, 2, ARGBFilter, 4, 4, 1)
355*4e366538SXin Li TESTPLANARTOB(I422, 2, 1, ARGBFilter, 4, 4, 1)
356*4e366538SXin Li TESTPLANARTOB(I420, 2, 2, RGB24Filter, 3, 3, 1)
357*4e366538SXin Li TESTPLANARTOB(I422, 2, 2, RGB24Filter, 3, 3, 1)
358*4e366538SXin Li #else // FULL_TESTS
359*4e366538SXin Li TESTPLANARTOB(I420, 2, 2, ABGR, 4, 4, 1)
360*4e366538SXin Li TESTPLANARTOB(I420, 2, 2, ARGB, 4, 4, 1)
361*4e366538SXin Li TESTPLANARTOB(I420, 2, 2, BGRA, 4, 4, 1)
362*4e366538SXin Li TESTPLANARTOB(I420, 2, 2, RAW, 3, 3, 1)
363*4e366538SXin Li TESTPLANARTOB(I420, 2, 2, RGB24, 3, 3, 1)
364*4e366538SXin Li TESTPLANARTOB(I420, 2, 2, RGBA, 4, 4, 1)
365*4e366538SXin Li #ifdef LITTLE_ENDIAN_ONLY_TEST
366*4e366538SXin Li TESTPLANARTOB(I420, 2, 2, RGB565, 2, 2, 1)
367*4e366538SXin Li TESTPLANARTOB(I420, 2, 2, ARGB1555, 2, 2, 1)
368*4e366538SXin Li TESTPLANARTOB(I420, 2, 2, ARGB4444, 2, 2, 1)
369*4e366538SXin Li TESTPLANARTOB(I422, 2, 1, RGB565, 2, 2, 1)
370*4e366538SXin Li #endif
371*4e366538SXin Li TESTPLANARTOB(I420, 2, 2, I400, 1, 1, 1)
372*4e366538SXin Li TESTPLANARTOB(I420, 2, 2, UYVY, 2, 4, 1)
373*4e366538SXin Li TESTPLANARTOB(I420, 2, 2, YUY2, 2, 4, 1)
374*4e366538SXin Li TESTPLANARTOB(I422, 2, 1, ABGR, 4, 4, 1)
375*4e366538SXin Li TESTPLANARTOB(I422, 2, 1, ARGB, 4, 4, 1)
376*4e366538SXin Li TESTPLANARTOB(I422, 2, 1, BGRA, 4, 4, 1)
377*4e366538SXin Li TESTPLANARTOB(I422, 2, 1, RGBA, 4, 4, 1)
378*4e366538SXin Li TESTPLANARTOB(I422, 2, 1, UYVY, 2, 4, 1)
379*4e366538SXin Li TESTPLANARTOB(I422, 2, 1, YUY2, 2, 4, 1)
380*4e366538SXin Li TESTPLANARTOB(I420, 2, 2, ARGBFilter, 4, 4, 1)
381*4e366538SXin Li TESTPLANARTOB(I422, 2, 1, ARGBFilter, 4, 4, 1)
382*4e366538SXin Li TESTPLANARTOB(I420, 2, 2, RGB24Filter, 3, 3, 1)
383*4e366538SXin Li TESTPLANARTOB(I444, 1, 1, ABGR, 4, 4, 1)
384*4e366538SXin Li TESTPLANARTOB(I444, 1, 1, ARGB, 4, 4, 1)
385*4e366538SXin Li #endif
386*4e366538SXin Li
387*4e366538SXin Li #define TESTBPTOBI(FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y, FMT_B, FMT_C, BPP_B, \
388*4e366538SXin Li W1280, N, NEG, OFF) \
389*4e366538SXin Li TEST_F(LibYUVConvertTest, FMT_PLANAR##To##FMT_B##N) { \
390*4e366538SXin Li const int kWidth = W1280; \
391*4e366538SXin Li const int kHeight = benchmark_height_; \
392*4e366538SXin Li const int kStrideB = kWidth * BPP_B; \
393*4e366538SXin Li const int kStrideUV = SUBSAMPLE(kWidth, SUBSAMP_X); \
394*4e366538SXin Li align_buffer_page_end(src_y, kWidth* kHeight + OFF); \
395*4e366538SXin Li align_buffer_page_end(src_uv, \
396*4e366538SXin Li kStrideUV* SUBSAMPLE(kHeight, SUBSAMP_Y) * 2 + OFF); \
397*4e366538SXin Li align_buffer_page_end(dst_argb_c, kStrideB* kHeight); \
398*4e366538SXin Li align_buffer_page_end(dst_argb_opt, kStrideB* kHeight); \
399*4e366538SXin Li for (int i = 0; i < kHeight; ++i) \
400*4e366538SXin Li for (int j = 0; j < kWidth; ++j) \
401*4e366538SXin Li src_y[i * kWidth + j + OFF] = (fastrand() & 0xff); \
402*4e366538SXin Li for (int i = 0; i < SUBSAMPLE(kHeight, SUBSAMP_Y); ++i) { \
403*4e366538SXin Li for (int j = 0; j < kStrideUV * 2; ++j) { \
404*4e366538SXin Li src_uv[i * kStrideUV * 2 + j + OFF] = (fastrand() & 0xff); \
405*4e366538SXin Li } \
406*4e366538SXin Li } \
407*4e366538SXin Li memset(dst_argb_c, 1, kStrideB* kHeight); \
408*4e366538SXin Li memset(dst_argb_opt, 101, kStrideB* kHeight); \
409*4e366538SXin Li MaskCpuFlags(disable_cpu_flags_); \
410*4e366538SXin Li FMT_PLANAR##To##FMT_B(src_y + OFF, kWidth, src_uv + OFF, kStrideUV * 2, \
411*4e366538SXin Li dst_argb_c, kWidth * BPP_B, kWidth, NEG kHeight); \
412*4e366538SXin Li MaskCpuFlags(benchmark_cpu_info_); \
413*4e366538SXin Li for (int i = 0; i < benchmark_iterations_; ++i) { \
414*4e366538SXin Li FMT_PLANAR##To##FMT_B(src_y + OFF, kWidth, src_uv + OFF, kStrideUV * 2, \
415*4e366538SXin Li dst_argb_opt, kWidth * BPP_B, kWidth, \
416*4e366538SXin Li NEG kHeight); \
417*4e366538SXin Li } \
418*4e366538SXin Li /* Convert to ARGB so 565 is expanded to bytes that can be compared. */ \
419*4e366538SXin Li align_buffer_page_end(dst_argb32_c, kWidth * 4 * kHeight); \
420*4e366538SXin Li align_buffer_page_end(dst_argb32_opt, kWidth * 4 * kHeight); \
421*4e366538SXin Li memset(dst_argb32_c, 2, kWidth * 4 * kHeight); \
422*4e366538SXin Li memset(dst_argb32_opt, 102, kWidth * 4 * kHeight); \
423*4e366538SXin Li FMT_C##ToARGB(dst_argb_c, kStrideB, dst_argb32_c, kWidth * 4, kWidth, \
424*4e366538SXin Li kHeight); \
425*4e366538SXin Li FMT_C##ToARGB(dst_argb_opt, kStrideB, dst_argb32_opt, kWidth * 4, kWidth, \
426*4e366538SXin Li kHeight); \
427*4e366538SXin Li for (int i = 0; i < kHeight; ++i) { \
428*4e366538SXin Li for (int j = 0; j < kWidth * 4; ++j) { \
429*4e366538SXin Li EXPECT_EQ(dst_argb32_c[i * kWidth * 4 + j], \
430*4e366538SXin Li dst_argb32_opt[i * kWidth * 4 + j]); \
431*4e366538SXin Li } \
432*4e366538SXin Li } \
433*4e366538SXin Li free_aligned_buffer_page_end(src_y); \
434*4e366538SXin Li free_aligned_buffer_page_end(src_uv); \
435*4e366538SXin Li free_aligned_buffer_page_end(dst_argb_c); \
436*4e366538SXin Li free_aligned_buffer_page_end(dst_argb_opt); \
437*4e366538SXin Li free_aligned_buffer_page_end(dst_argb32_c); \
438*4e366538SXin Li free_aligned_buffer_page_end(dst_argb32_opt); \
439*4e366538SXin Li }
440*4e366538SXin Li
441*4e366538SXin Li #if defined(ENABLE_FULL_TESTS)
442*4e366538SXin Li #define TESTBPTOB(FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y, FMT_B, FMT_C, BPP_B) \
443*4e366538SXin Li TESTBPTOBI(FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y, FMT_B, FMT_C, BPP_B, \
444*4e366538SXin Li benchmark_width_ + 1, _Any, +, 0) \
445*4e366538SXin Li TESTBPTOBI(FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y, FMT_B, FMT_C, BPP_B, \
446*4e366538SXin Li benchmark_width_, _Unaligned, +, 2) \
447*4e366538SXin Li TESTBPTOBI(FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y, FMT_B, FMT_C, BPP_B, \
448*4e366538SXin Li benchmark_width_, _Invert, -, 0) \
449*4e366538SXin Li TESTBPTOBI(FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y, FMT_B, FMT_C, BPP_B, \
450*4e366538SXin Li benchmark_width_, _Opt, +, 0)
451*4e366538SXin Li #else
452*4e366538SXin Li #define TESTBPTOB(FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y, FMT_B, FMT_C, BPP_B) \
453*4e366538SXin Li TESTBPTOBI(FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y, FMT_B, FMT_C, BPP_B, \
454*4e366538SXin Li benchmark_width_, _Opt, +, 0)
455*4e366538SXin Li #endif
456*4e366538SXin Li
457*4e366538SXin Li #define JNV12ToARGB(a, b, c, d, e, f, g, h) \
458*4e366538SXin Li NV12ToARGBMatrix(a, b, c, d, e, f, &kYuvJPEGConstants, g, h)
459*4e366538SXin Li #define JNV21ToARGB(a, b, c, d, e, f, g, h) \
460*4e366538SXin Li NV21ToARGBMatrix(a, b, c, d, e, f, &kYuvJPEGConstants, g, h)
461*4e366538SXin Li #define JNV12ToABGR(a, b, c, d, e, f, g, h) \
462*4e366538SXin Li NV21ToARGBMatrix(a, b, c, d, e, f, &kYvuJPEGConstants, g, h)
463*4e366538SXin Li #define JNV21ToABGR(a, b, c, d, e, f, g, h) \
464*4e366538SXin Li NV12ToARGBMatrix(a, b, c, d, e, f, &kYvuJPEGConstants, g, h)
465*4e366538SXin Li #define JNV12ToRGB24(a, b, c, d, e, f, g, h) \
466*4e366538SXin Li NV12ToRGB24Matrix(a, b, c, d, e, f, &kYuvJPEGConstants, g, h)
467*4e366538SXin Li #define JNV21ToRGB24(a, b, c, d, e, f, g, h) \
468*4e366538SXin Li NV21ToRGB24Matrix(a, b, c, d, e, f, &kYuvJPEGConstants, g, h)
469*4e366538SXin Li #define JNV12ToRAW(a, b, c, d, e, f, g, h) \
470*4e366538SXin Li NV21ToRGB24Matrix(a, b, c, d, e, f, &kYvuJPEGConstants, g, h)
471*4e366538SXin Li #define JNV21ToRAW(a, b, c, d, e, f, g, h) \
472*4e366538SXin Li NV12ToRGB24Matrix(a, b, c, d, e, f, &kYvuJPEGConstants, g, h)
473*4e366538SXin Li #define JNV12ToRGB565(a, b, c, d, e, f, g, h) \
474*4e366538SXin Li NV12ToRGB565Matrix(a, b, c, d, e, f, &kYuvJPEGConstants, g, h)
475*4e366538SXin Li
476*4e366538SXin Li TESTBPTOB(JNV12, 2, 2, ARGB, ARGB, 4)
477*4e366538SXin Li TESTBPTOB(JNV21, 2, 2, ARGB, ARGB, 4)
478*4e366538SXin Li TESTBPTOB(JNV12, 2, 2, ABGR, ABGR, 4)
479*4e366538SXin Li TESTBPTOB(JNV21, 2, 2, ABGR, ABGR, 4)
480*4e366538SXin Li TESTBPTOB(JNV12, 2, 2, RGB24, RGB24, 3)
481*4e366538SXin Li TESTBPTOB(JNV21, 2, 2, RGB24, RGB24, 3)
482*4e366538SXin Li TESTBPTOB(JNV12, 2, 2, RAW, RAW, 3)
483*4e366538SXin Li TESTBPTOB(JNV21, 2, 2, RAW, RAW, 3)
484*4e366538SXin Li #ifdef LITTLE_ENDIAN_ONLY_TEST
485*4e366538SXin Li TESTBPTOB(JNV12, 2, 2, RGB565, RGB565, 2)
486*4e366538SXin Li #endif
487*4e366538SXin Li
488*4e366538SXin Li TESTBPTOB(NV12, 2, 2, ARGB, ARGB, 4)
489*4e366538SXin Li TESTBPTOB(NV21, 2, 2, ARGB, ARGB, 4)
490*4e366538SXin Li TESTBPTOB(NV12, 2, 2, ABGR, ABGR, 4)
491*4e366538SXin Li TESTBPTOB(NV21, 2, 2, ABGR, ABGR, 4)
492*4e366538SXin Li TESTBPTOB(NV12, 2, 2, RGB24, RGB24, 3)
493*4e366538SXin Li TESTBPTOB(NV21, 2, 2, RGB24, RGB24, 3)
494*4e366538SXin Li TESTBPTOB(NV12, 2, 2, RAW, RAW, 3)
495*4e366538SXin Li TESTBPTOB(NV21, 2, 2, RAW, RAW, 3)
496*4e366538SXin Li TESTBPTOB(NV21, 2, 2, YUV24, RAW, 3)
497*4e366538SXin Li #ifdef LITTLE_ENDIAN_ONLY_TEST
498*4e366538SXin Li TESTBPTOB(NV12, 2, 2, RGB565, RGB565, 2)
499*4e366538SXin Li #endif
500*4e366538SXin Li
501*4e366538SXin Li #define TESTATOBI(FMT_A, TYPE_A, EPP_A, STRIDE_A, HEIGHT_A, FMT_B, TYPE_B, \
502*4e366538SXin Li EPP_B, STRIDE_B, HEIGHT_B, W1280, N, NEG, OFF) \
503*4e366538SXin Li TEST_F(LibYUVConvertTest, FMT_A##To##FMT_B##N) { \
504*4e366538SXin Li const int kWidth = W1280; \
505*4e366538SXin Li const int kHeight = benchmark_height_; \
506*4e366538SXin Li const int kHeightA = (kHeight + HEIGHT_A - 1) / HEIGHT_A * HEIGHT_A; \
507*4e366538SXin Li const int kHeightB = (kHeight + HEIGHT_B - 1) / HEIGHT_B * HEIGHT_B; \
508*4e366538SXin Li const int kStrideA = \
509*4e366538SXin Li (kWidth * EPP_A + STRIDE_A - 1) / STRIDE_A * STRIDE_A; \
510*4e366538SXin Li const int kStrideB = \
511*4e366538SXin Li (kWidth * EPP_B + STRIDE_B - 1) / STRIDE_B * STRIDE_B; \
512*4e366538SXin Li align_buffer_page_end(src_argb, \
513*4e366538SXin Li kStrideA* kHeightA*(int)sizeof(TYPE_A) + OFF); \
514*4e366538SXin Li align_buffer_page_end(dst_argb_c, kStrideB* kHeightB*(int)sizeof(TYPE_B)); \
515*4e366538SXin Li align_buffer_page_end(dst_argb_opt, \
516*4e366538SXin Li kStrideB* kHeightB*(int)sizeof(TYPE_B)); \
517*4e366538SXin Li for (int i = 0; i < kStrideA * kHeightA * (int)sizeof(TYPE_A); ++i) { \
518*4e366538SXin Li src_argb[i + OFF] = (fastrand() & 0xff); \
519*4e366538SXin Li } \
520*4e366538SXin Li memset(dst_argb_c, 1, kStrideB* kHeightB); \
521*4e366538SXin Li memset(dst_argb_opt, 101, kStrideB* kHeightB); \
522*4e366538SXin Li MaskCpuFlags(disable_cpu_flags_); \
523*4e366538SXin Li FMT_A##To##FMT_B((TYPE_A*)(src_argb + OFF), kStrideA, (TYPE_B*)dst_argb_c, \
524*4e366538SXin Li kStrideB, kWidth, NEG kHeight); \
525*4e366538SXin Li MaskCpuFlags(benchmark_cpu_info_); \
526*4e366538SXin Li for (int i = 0; i < benchmark_iterations_; ++i) { \
527*4e366538SXin Li FMT_A##To##FMT_B((TYPE_A*)(src_argb + OFF), kStrideA, \
528*4e366538SXin Li (TYPE_B*)dst_argb_opt, kStrideB, kWidth, NEG kHeight); \
529*4e366538SXin Li } \
530*4e366538SXin Li for (int i = 0; i < kStrideB * kHeightB * (int)sizeof(TYPE_B); ++i) { \
531*4e366538SXin Li EXPECT_EQ(dst_argb_c[i], dst_argb_opt[i]); \
532*4e366538SXin Li } \
533*4e366538SXin Li free_aligned_buffer_page_end(src_argb); \
534*4e366538SXin Li free_aligned_buffer_page_end(dst_argb_c); \
535*4e366538SXin Li free_aligned_buffer_page_end(dst_argb_opt); \
536*4e366538SXin Li }
537*4e366538SXin Li
538*4e366538SXin Li #define TESTATOBRANDOM(FMT_A, TYPE_A, EPP_A, STRIDE_A, HEIGHT_A, FMT_B, \
539*4e366538SXin Li TYPE_B, EPP_B, STRIDE_B, HEIGHT_B) \
540*4e366538SXin Li TEST_F(LibYUVConvertTest, FMT_A##To##FMT_B##_Random) { \
541*4e366538SXin Li for (int times = 0; times < benchmark_iterations_; ++times) { \
542*4e366538SXin Li const int kWidth = (fastrand() & 63) + 1; \
543*4e366538SXin Li const int kHeight = (fastrand() & 31) + 1; \
544*4e366538SXin Li const int kHeightA = (kHeight + HEIGHT_A - 1) / HEIGHT_A * HEIGHT_A; \
545*4e366538SXin Li const int kHeightB = (kHeight + HEIGHT_B - 1) / HEIGHT_B * HEIGHT_B; \
546*4e366538SXin Li const int kStrideA = \
547*4e366538SXin Li (kWidth * EPP_A + STRIDE_A - 1) / STRIDE_A * STRIDE_A; \
548*4e366538SXin Li const int kStrideB = \
549*4e366538SXin Li (kWidth * EPP_B + STRIDE_B - 1) / STRIDE_B * STRIDE_B; \
550*4e366538SXin Li align_buffer_page_end(src_argb, kStrideA* kHeightA*(int)sizeof(TYPE_A)); \
551*4e366538SXin Li align_buffer_page_end(dst_argb_c, \
552*4e366538SXin Li kStrideB* kHeightB*(int)sizeof(TYPE_B)); \
553*4e366538SXin Li align_buffer_page_end(dst_argb_opt, \
554*4e366538SXin Li kStrideB* kHeightB*(int)sizeof(TYPE_B)); \
555*4e366538SXin Li for (int i = 0; i < kStrideA * kHeightA * (int)sizeof(TYPE_A); ++i) { \
556*4e366538SXin Li src_argb[i] = 0xfe; \
557*4e366538SXin Li } \
558*4e366538SXin Li memset(dst_argb_c, 123, kStrideB* kHeightB); \
559*4e366538SXin Li memset(dst_argb_opt, 123, kStrideB* kHeightB); \
560*4e366538SXin Li MaskCpuFlags(disable_cpu_flags_); \
561*4e366538SXin Li FMT_A##To##FMT_B((TYPE_A*)src_argb, kStrideA, (TYPE_B*)dst_argb_c, \
562*4e366538SXin Li kStrideB, kWidth, kHeight); \
563*4e366538SXin Li MaskCpuFlags(benchmark_cpu_info_); \
564*4e366538SXin Li FMT_A##To##FMT_B((TYPE_A*)src_argb, kStrideA, (TYPE_B*)dst_argb_opt, \
565*4e366538SXin Li kStrideB, kWidth, kHeight); \
566*4e366538SXin Li for (int i = 0; i < kStrideB * kHeightB * (int)sizeof(TYPE_B); ++i) { \
567*4e366538SXin Li EXPECT_EQ(dst_argb_c[i], dst_argb_opt[i]); \
568*4e366538SXin Li } \
569*4e366538SXin Li free_aligned_buffer_page_end(src_argb); \
570*4e366538SXin Li free_aligned_buffer_page_end(dst_argb_c); \
571*4e366538SXin Li free_aligned_buffer_page_end(dst_argb_opt); \
572*4e366538SXin Li } \
573*4e366538SXin Li }
574*4e366538SXin Li
575*4e366538SXin Li #if defined(ENABLE_FULL_TESTS)
576*4e366538SXin Li #define TESTATOB(FMT_A, TYPE_A, EPP_A, STRIDE_A, HEIGHT_A, FMT_B, TYPE_B, \
577*4e366538SXin Li EPP_B, STRIDE_B, HEIGHT_B) \
578*4e366538SXin Li TESTATOBI(FMT_A, TYPE_A, EPP_A, STRIDE_A, HEIGHT_A, FMT_B, TYPE_B, EPP_B, \
579*4e366538SXin Li STRIDE_B, HEIGHT_B, benchmark_width_ + 1, _Any, +, 0) \
580*4e366538SXin Li TESTATOBI(FMT_A, TYPE_A, EPP_A, STRIDE_A, HEIGHT_A, FMT_B, TYPE_B, EPP_B, \
581*4e366538SXin Li STRIDE_B, HEIGHT_B, benchmark_width_, _Unaligned, +, 4) \
582*4e366538SXin Li TESTATOBI(FMT_A, TYPE_A, EPP_A, STRIDE_A, HEIGHT_A, FMT_B, TYPE_B, EPP_B, \
583*4e366538SXin Li STRIDE_B, HEIGHT_B, benchmark_width_, _Invert, -, 0) \
584*4e366538SXin Li TESTATOBI(FMT_A, TYPE_A, EPP_A, STRIDE_A, HEIGHT_A, FMT_B, TYPE_B, EPP_B, \
585*4e366538SXin Li STRIDE_B, HEIGHT_B, benchmark_width_, _Opt, +, 0) \
586*4e366538SXin Li TESTATOBRANDOM(FMT_A, TYPE_A, EPP_A, STRIDE_A, HEIGHT_A, FMT_B, TYPE_B, \
587*4e366538SXin Li EPP_B, STRIDE_B, HEIGHT_B)
588*4e366538SXin Li #else
589*4e366538SXin Li #define TESTATOB(FMT_A, TYPE_A, EPP_A, STRIDE_A, HEIGHT_A, FMT_B, TYPE_B, \
590*4e366538SXin Li EPP_B, STRIDE_B, HEIGHT_B) \
591*4e366538SXin Li TESTATOBI(FMT_A, TYPE_A, EPP_A, STRIDE_A, HEIGHT_A, FMT_B, TYPE_B, EPP_B, \
592*4e366538SXin Li STRIDE_B, HEIGHT_B, benchmark_width_, _Opt, +, 0)
593*4e366538SXin Li #endif
594*4e366538SXin Li
595*4e366538SXin Li TESTATOB(AB30, uint8_t, 4, 4, 1, ABGR, uint8_t, 4, 4, 1)
596*4e366538SXin Li TESTATOB(AB30, uint8_t, 4, 4, 1, ARGB, uint8_t, 4, 4, 1)
597*4e366538SXin Li #ifdef LITTLE_ENDIAN_ONLY_TEST
598*4e366538SXin Li TESTATOB(ABGR, uint8_t, 4, 4, 1, AR30, uint8_t, 4, 4, 1)
599*4e366538SXin Li #endif
600*4e366538SXin Li TESTATOB(ABGR, uint8_t, 4, 4, 1, ARGB, uint8_t, 4, 4, 1)
601*4e366538SXin Li #ifdef LITTLE_ENDIAN_ONLY_TEST
602*4e366538SXin Li TESTATOB(AR30, uint8_t, 4, 4, 1, AB30, uint8_t, 4, 4, 1)
603*4e366538SXin Li #endif
604*4e366538SXin Li TESTATOB(AR30, uint8_t, 4, 4, 1, ABGR, uint8_t, 4, 4, 1)
605*4e366538SXin Li #ifdef LITTLE_ENDIAN_ONLY_TEST
606*4e366538SXin Li TESTATOB(AR30, uint8_t, 4, 4, 1, AR30, uint8_t, 4, 4, 1)
607*4e366538SXin Li TESTATOB(AR30, uint8_t, 4, 4, 1, ARGB, uint8_t, 4, 4, 1)
608*4e366538SXin Li #endif
609*4e366538SXin Li TESTATOB(ARGB, uint8_t, 4, 4, 1, ABGR, uint8_t, 4, 4, 1)
610*4e366538SXin Li #ifdef LITTLE_ENDIAN_ONLY_TEST
611*4e366538SXin Li TESTATOB(ARGB, uint8_t, 4, 4, 1, AR30, uint8_t, 4, 4, 1)
612*4e366538SXin Li #endif
613*4e366538SXin Li TESTATOB(ARGB, uint8_t, 4, 4, 1, ARGB, uint8_t, 4, 4, 1)
614*4e366538SXin Li TESTATOB(ARGB, uint8_t, 4, 4, 1, ARGB1555, uint8_t, 2, 2, 1)
615*4e366538SXin Li TESTATOB(ARGB, uint8_t, 4, 4, 1, ARGB4444, uint8_t, 2, 2, 1)
616*4e366538SXin Li TESTATOB(ARGB, uint8_t, 4, 4, 1, ARGBMirror, uint8_t, 4, 4, 1)
617*4e366538SXin Li TESTATOB(ARGB, uint8_t, 4, 4, 1, BGRA, uint8_t, 4, 4, 1)
618*4e366538SXin Li TESTATOB(ARGB, uint8_t, 4, 4, 1, I400, uint8_t, 1, 1, 1)
619*4e366538SXin Li TESTATOB(ARGB, uint8_t, 4, 4, 1, J400, uint8_t, 1, 1, 1)
620*4e366538SXin Li TESTATOB(ABGR, uint8_t, 4, 4, 1, J400, uint8_t, 1, 1, 1)
621*4e366538SXin Li TESTATOB(RGBA, uint8_t, 4, 4, 1, J400, uint8_t, 1, 1, 1)
622*4e366538SXin Li TESTATOB(ARGB, uint8_t, 4, 4, 1, RAW, uint8_t, 3, 3, 1)
623*4e366538SXin Li TESTATOB(ARGB, uint8_t, 4, 4, 1, RGB24, uint8_t, 3, 3, 1)
624*4e366538SXin Li TESTATOB(ABGR, uint8_t, 4, 4, 1, RAW, uint8_t, 3, 3, 1)
625*4e366538SXin Li TESTATOB(ABGR, uint8_t, 4, 4, 1, RGB24, uint8_t, 3, 3, 1)
626*4e366538SXin Li #ifdef LITTLE_ENDIAN_ONLY_TEST
627*4e366538SXin Li TESTATOB(ARGB, uint8_t, 4, 4, 1, RGB565, uint8_t, 2, 2, 1)
628*4e366538SXin Li #endif
629*4e366538SXin Li TESTATOB(ARGB, uint8_t, 4, 4, 1, RGBA, uint8_t, 4, 4, 1)
630*4e366538SXin Li TESTATOB(ARGB, uint8_t, 4, 4, 1, UYVY, uint8_t, 2, 4, 1)
631*4e366538SXin Li TESTATOB(ARGB, uint8_t, 4, 4, 1, YUY2, uint8_t, 2, 4, 1)
632*4e366538SXin Li TESTATOB(ARGB1555, uint8_t, 2, 2, 1, ARGB, uint8_t, 4, 4, 1)
633*4e366538SXin Li TESTATOB(ARGB4444, uint8_t, 2, 2, 1, ARGB, uint8_t, 4, 4, 1)
634*4e366538SXin Li TESTATOB(BGRA, uint8_t, 4, 4, 1, ARGB, uint8_t, 4, 4, 1)
635*4e366538SXin Li TESTATOB(I400, uint8_t, 1, 1, 1, ARGB, uint8_t, 4, 4, 1)
636*4e366538SXin Li TESTATOB(I400, uint8_t, 1, 1, 1, I400, uint8_t, 1, 1, 1)
637*4e366538SXin Li TESTATOB(I400, uint8_t, 1, 1, 1, I400Mirror, uint8_t, 1, 1, 1)
638*4e366538SXin Li TESTATOB(J400, uint8_t, 1, 1, 1, ARGB, uint8_t, 4, 4, 1)
639*4e366538SXin Li TESTATOB(J400, uint8_t, 1, 1, 1, J400, uint8_t, 1, 1, 1)
640*4e366538SXin Li TESTATOB(RAW, uint8_t, 3, 3, 1, ARGB, uint8_t, 4, 4, 1)
641*4e366538SXin Li TESTATOB(RAW, uint8_t, 3, 3, 1, RGBA, uint8_t, 4, 4, 1)
642*4e366538SXin Li TESTATOB(RAW, uint8_t, 3, 3, 1, RGB24, uint8_t, 3, 3, 1)
643*4e366538SXin Li TESTATOB(RGB24, uint8_t, 3, 3, 1, ARGB, uint8_t, 4, 4, 1)
644*4e366538SXin Li TESTATOB(RGB24, uint8_t, 3, 3, 1, J400, uint8_t, 1, 1, 1)
645*4e366538SXin Li TESTATOB(RGB24, uint8_t, 3, 3, 1, RGB24Mirror, uint8_t, 3, 3, 1)
646*4e366538SXin Li TESTATOB(RAW, uint8_t, 3, 3, 1, J400, uint8_t, 1, 1, 1)
647*4e366538SXin Li #ifdef LITTLE_ENDIAN_ONLY_TEST
648*4e366538SXin Li TESTATOB(RGB565, uint8_t, 2, 2, 1, ARGB, uint8_t, 4, 4, 1)
649*4e366538SXin Li #endif
650*4e366538SXin Li TESTATOB(RGBA, uint8_t, 4, 4, 1, ARGB, uint8_t, 4, 4, 1)
651*4e366538SXin Li TESTATOB(UYVY, uint8_t, 2, 4, 1, ARGB, uint8_t, 4, 4, 1)
652*4e366538SXin Li TESTATOB(YUY2, uint8_t, 2, 4, 1, ARGB, uint8_t, 4, 4, 1)
653*4e366538SXin Li TESTATOB(YUY2, uint8_t, 2, 4, 1, Y, uint8_t, 1, 1, 1)
654*4e366538SXin Li TESTATOB(ARGB, uint8_t, 4, 4, 1, AR64, uint16_t, 4, 4, 1)
655*4e366538SXin Li TESTATOB(ARGB, uint8_t, 4, 4, 1, AB64, uint16_t, 4, 4, 1)
656*4e366538SXin Li TESTATOB(ABGR, uint8_t, 4, 4, 1, AR64, uint16_t, 4, 4, 1)
657*4e366538SXin Li TESTATOB(ABGR, uint8_t, 4, 4, 1, AB64, uint16_t, 4, 4, 1)
658*4e366538SXin Li TESTATOB(AR64, uint16_t, 4, 4, 1, ARGB, uint8_t, 4, 4, 1)
659*4e366538SXin Li TESTATOB(AB64, uint16_t, 4, 4, 1, ARGB, uint8_t, 4, 4, 1)
660*4e366538SXin Li TESTATOB(AR64, uint16_t, 4, 4, 1, ABGR, uint8_t, 4, 4, 1)
661*4e366538SXin Li TESTATOB(AB64, uint16_t, 4, 4, 1, ABGR, uint8_t, 4, 4, 1)
662*4e366538SXin Li TESTATOB(AR64, uint16_t, 4, 4, 1, AB64, uint16_t, 4, 4, 1)
663*4e366538SXin Li TESTATOB(AB64, uint16_t, 4, 4, 1, AR64, uint16_t, 4, 4, 1)
664*4e366538SXin Li
665*4e366538SXin Li // in place test
666*4e366538SXin Li #define TESTATOAI(FMT_A, TYPE_A, EPP_A, STRIDE_A, HEIGHT_A, FMT_B, TYPE_B, \
667*4e366538SXin Li EPP_B, STRIDE_B, HEIGHT_B, W1280, N, NEG, OFF) \
668*4e366538SXin Li TEST_F(LibYUVConvertTest, FMT_A##To##FMT_B##N) { \
669*4e366538SXin Li const int kWidth = W1280; \
670*4e366538SXin Li const int kHeight = benchmark_height_; \
671*4e366538SXin Li const int kHeightA = (kHeight + HEIGHT_A - 1) / HEIGHT_A * HEIGHT_A; \
672*4e366538SXin Li const int kHeightB = (kHeight + HEIGHT_B - 1) / HEIGHT_B * HEIGHT_B; \
673*4e366538SXin Li const int kStrideA = \
674*4e366538SXin Li (kWidth * EPP_A + STRIDE_A - 1) / STRIDE_A * STRIDE_A; \
675*4e366538SXin Li const int kStrideB = \
676*4e366538SXin Li (kWidth * EPP_B + STRIDE_B - 1) / STRIDE_B * STRIDE_B; \
677*4e366538SXin Li align_buffer_page_end(src_argb, \
678*4e366538SXin Li kStrideA* kHeightA*(int)sizeof(TYPE_A) + OFF); \
679*4e366538SXin Li align_buffer_page_end(dst_argb_c, \
680*4e366538SXin Li kStrideA* kHeightA*(int)sizeof(TYPE_A) + OFF); \
681*4e366538SXin Li align_buffer_page_end(dst_argb_opt, \
682*4e366538SXin Li kStrideA* kHeightA*(int)sizeof(TYPE_A) + OFF); \
683*4e366538SXin Li for (int i = 0; i < kStrideA * kHeightA * (int)sizeof(TYPE_A); ++i) { \
684*4e366538SXin Li src_argb[i + OFF] = (fastrand() & 0xff); \
685*4e366538SXin Li } \
686*4e366538SXin Li memcpy(dst_argb_c + OFF, src_argb, \
687*4e366538SXin Li kStrideA * kHeightA * (int)sizeof(TYPE_A)); \
688*4e366538SXin Li memcpy(dst_argb_opt + OFF, src_argb, \
689*4e366538SXin Li kStrideA * kHeightA * (int)sizeof(TYPE_A)); \
690*4e366538SXin Li MaskCpuFlags(disable_cpu_flags_); \
691*4e366538SXin Li FMT_A##To##FMT_B((TYPE_A*)(dst_argb_c /* src */ + OFF), kStrideA, \
692*4e366538SXin Li (TYPE_B*)dst_argb_c, kStrideB, kWidth, NEG kHeight); \
693*4e366538SXin Li MaskCpuFlags(benchmark_cpu_info_); \
694*4e366538SXin Li for (int i = 0; i < benchmark_iterations_; ++i) { \
695*4e366538SXin Li FMT_A##To##FMT_B((TYPE_A*)(dst_argb_opt /* src */ + OFF), kStrideA, \
696*4e366538SXin Li (TYPE_B*)dst_argb_opt, kStrideB, kWidth, NEG kHeight); \
697*4e366538SXin Li } \
698*4e366538SXin Li memcpy(dst_argb_opt + OFF, src_argb, \
699*4e366538SXin Li kStrideA * kHeightA * (int)sizeof(TYPE_A)); \
700*4e366538SXin Li FMT_A##To##FMT_B((TYPE_A*)(dst_argb_opt /* src */ + OFF), kStrideA, \
701*4e366538SXin Li (TYPE_B*)dst_argb_opt, kStrideB, kWidth, NEG kHeight); \
702*4e366538SXin Li for (int i = 0; i < kStrideB * kHeightB * (int)sizeof(TYPE_B); ++i) { \
703*4e366538SXin Li EXPECT_EQ(dst_argb_c[i], dst_argb_opt[i]); \
704*4e366538SXin Li } \
705*4e366538SXin Li free_aligned_buffer_page_end(src_argb); \
706*4e366538SXin Li free_aligned_buffer_page_end(dst_argb_c); \
707*4e366538SXin Li free_aligned_buffer_page_end(dst_argb_opt); \
708*4e366538SXin Li }
709*4e366538SXin Li
710*4e366538SXin Li #define TESTATOA(FMT_A, TYPE_A, EPP_A, STRIDE_A, HEIGHT_A, FMT_B, TYPE_B, \
711*4e366538SXin Li EPP_B, STRIDE_B, HEIGHT_B) \
712*4e366538SXin Li TESTATOAI(FMT_A, TYPE_A, EPP_A, STRIDE_A, HEIGHT_A, FMT_B, TYPE_B, EPP_B, \
713*4e366538SXin Li STRIDE_B, HEIGHT_B, benchmark_width_, _Inplace, +, 0)
714*4e366538SXin Li
715*4e366538SXin Li TESTATOA(AB30, uint8_t, 4, 4, 1, ABGR, uint8_t, 4, 4, 1)
716*4e366538SXin Li TESTATOA(AB30, uint8_t, 4, 4, 1, ARGB, uint8_t, 4, 4, 1)
717*4e366538SXin Li #ifdef LITTLE_ENDIAN_ONLY_TEST
718*4e366538SXin Li TESTATOA(ABGR, uint8_t, 4, 4, 1, AR30, uint8_t, 4, 4, 1)
719*4e366538SXin Li #endif
720*4e366538SXin Li TESTATOA(ABGR, uint8_t, 4, 4, 1, ARGB, uint8_t, 4, 4, 1)
721*4e366538SXin Li #ifdef LITTLE_ENDIAN_ONLY_TEST
722*4e366538SXin Li TESTATOA(AR30, uint8_t, 4, 4, 1, AB30, uint8_t, 4, 4, 1)
723*4e366538SXin Li #endif
724*4e366538SXin Li TESTATOA(AR30, uint8_t, 4, 4, 1, ABGR, uint8_t, 4, 4, 1)
725*4e366538SXin Li #ifdef LITTLE_ENDIAN_ONLY_TEST
726*4e366538SXin Li TESTATOA(AR30, uint8_t, 4, 4, 1, AR30, uint8_t, 4, 4, 1)
727*4e366538SXin Li TESTATOA(AR30, uint8_t, 4, 4, 1, ARGB, uint8_t, 4, 4, 1)
728*4e366538SXin Li #endif
729*4e366538SXin Li TESTATOA(ARGB, uint8_t, 4, 4, 1, ABGR, uint8_t, 4, 4, 1)
730*4e366538SXin Li #ifdef LITTLE_ENDIAN_ONLY_TEST
731*4e366538SXin Li TESTATOA(ARGB, uint8_t, 4, 4, 1, AR30, uint8_t, 4, 4, 1)
732*4e366538SXin Li #endif
733*4e366538SXin Li TESTATOA(ARGB, uint8_t, 4, 4, 1, ARGB, uint8_t, 4, 4, 1)
734*4e366538SXin Li TESTATOA(ARGB, uint8_t, 4, 4, 1, ARGB1555, uint8_t, 2, 2, 1)
735*4e366538SXin Li TESTATOA(ARGB, uint8_t, 4, 4, 1, ARGB4444, uint8_t, 2, 2, 1)
736*4e366538SXin Li // TODO(fbarchard): Support in place for mirror.
737*4e366538SXin Li // TESTATOA(ARGB, uint8_t, 4, 4, 1, ARGBMirror, uint8_t, 4, 4, 1)
738*4e366538SXin Li TESTATOA(ARGB, uint8_t, 4, 4, 1, BGRA, uint8_t, 4, 4, 1)
739*4e366538SXin Li TESTATOA(ARGB, uint8_t, 4, 4, 1, I400, uint8_t, 1, 1, 1)
740*4e366538SXin Li TESTATOA(ARGB, uint8_t, 4, 4, 1, J400, uint8_t, 1, 1, 1)
741*4e366538SXin Li TESTATOA(RGBA, uint8_t, 4, 4, 1, J400, uint8_t, 1, 1, 1)
742*4e366538SXin Li TESTATOA(ARGB, uint8_t, 4, 4, 1, RAW, uint8_t, 3, 3, 1)
743*4e366538SXin Li TESTATOA(ARGB, uint8_t, 4, 4, 1, RGB24, uint8_t, 3, 3, 1)
744*4e366538SXin Li TESTATOA(ABGR, uint8_t, 4, 4, 1, RAW, uint8_t, 3, 3, 1)
745*4e366538SXin Li TESTATOA(ABGR, uint8_t, 4, 4, 1, RGB24, uint8_t, 3, 3, 1)
746*4e366538SXin Li #ifdef LITTLE_ENDIAN_ONLY_TEST
747*4e366538SXin Li TESTATOA(ARGB, uint8_t, 4, 4, 1, RGB565, uint8_t, 2, 2, 1)
748*4e366538SXin Li #endif
749*4e366538SXin Li TESTATOA(ARGB, uint8_t, 4, 4, 1, RGBA, uint8_t, 4, 4, 1)
750*4e366538SXin Li TESTATOA(ARGB, uint8_t, 4, 4, 1, UYVY, uint8_t, 2, 4, 1)
751*4e366538SXin Li TESTATOA(ARGB, uint8_t, 4, 4, 1, YUY2, uint8_t, 2, 4, 1)
752*4e366538SXin Li // TODO(fbarchard): Support in place for conversions that increase bpp.
753*4e366538SXin Li // TESTATOA(ARGB1555, uint8_t, 2, 2, 1, ARGB, uint8_t, 4, 4, 1)
754*4e366538SXin Li // TESTATOA(ARGB4444, uint8_t, 2, 2, 1, ARGB, uint8_t, 4, 4, 1)
755*4e366538SXin Li TESTATOA(BGRA, uint8_t, 4, 4, 1, ARGB, uint8_t, 4, 4, 1)
756*4e366538SXin Li // TESTATOA(I400, uint8_t, 1, 1, 1, ARGB, uint8_t, 4, 4, 1)
757*4e366538SXin Li TESTATOA(I400, uint8_t, 1, 1, 1, I400, uint8_t, 1, 1, 1)
758*4e366538SXin Li // TESTATOA(I400, uint8_t, 1, 1, 1, I400Mirror, uint8_t, 1, 1, 1)
759*4e366538SXin Li // TESTATOA(J400, uint8_t, 1, 1, 1, ARGB, uint8_t, 4, 4, 1)
760*4e366538SXin Li TESTATOA(J400, uint8_t, 1, 1, 1, J400, uint8_t, 1, 1, 1)
761*4e366538SXin Li // TESTATOA(RAW, uint8_t, 3, 3, 1, ARGB, uint8_t, 4, 4, 1)
762*4e366538SXin Li // TESTATOA(RAW, uint8_t, 3, 3, 1, RGBA, uint8_t, 4, 4, 1)
763*4e366538SXin Li TESTATOA(RAW, uint8_t, 3, 3, 1, RGB24, uint8_t, 3, 3, 1)
764*4e366538SXin Li // TESTATOA(RGB24, uint8_t, 3, 3, 1, ARGB, uint8_t, 4, 4, 1)
765*4e366538SXin Li TESTATOA(RGB24, uint8_t, 3, 3, 1, J400, uint8_t, 1, 1, 1)
766*4e366538SXin Li // TESTATOA(RGB24, uint8_t, 3, 3, 1, RGB24Mirror, uint8_t, 3, 3, 1)
767*4e366538SXin Li TESTATOA(RAW, uint8_t, 3, 3, 1, J400, uint8_t, 1, 1, 1)
768*4e366538SXin Li #ifdef LITTLE_ENDIAN_ONLY_TEST
769*4e366538SXin Li // TESTATOA(RGB565, uint8_t, 2, 2, 1, ARGB, uint8_t, 4, 4, 1)
770*4e366538SXin Li #endif
771*4e366538SXin Li TESTATOA(RGBA, uint8_t, 4, 4, 1, ARGB, uint8_t, 4, 4, 1)
772*4e366538SXin Li // TESTATOA(UYVY, uint8_t, 2, 4, 1, ARGB, uint8_t, 4, 4, 1)
773*4e366538SXin Li // TESTATOA(YUY2, uint8_t, 2, 4, 1, ARGB, uint8_t, 4, 4, 1)
774*4e366538SXin Li TESTATOA(YUY2, uint8_t, 2, 4, 1, Y, uint8_t, 1, 1, 1)
775*4e366538SXin Li // TESTATOA(ARGB, uint8_t, 4, 4, 1, AR64, uint16_t, 4, 4, 1)
776*4e366538SXin Li // TESTATOA(ARGB, uint8_t, 4, 4, 1, AB64, uint16_t, 4, 4, 1)
777*4e366538SXin Li // TESTATOA(ABGR, uint8_t, 4, 4, 1, AR64, uint16_t, 4, 4, 1)
778*4e366538SXin Li // TESTATOA(ABGR, uint8_t, 4, 4, 1, AB64, uint16_t, 4, 4, 1)
779*4e366538SXin Li TESTATOA(AR64, uint16_t, 4, 4, 1, ARGB, uint8_t, 4, 4, 1)
780*4e366538SXin Li TESTATOA(AB64, uint16_t, 4, 4, 1, ARGB, uint8_t, 4, 4, 1)
781*4e366538SXin Li TESTATOA(AR64, uint16_t, 4, 4, 1, ABGR, uint8_t, 4, 4, 1)
782*4e366538SXin Li TESTATOA(AB64, uint16_t, 4, 4, 1, ABGR, uint8_t, 4, 4, 1)
783*4e366538SXin Li TESTATOA(AR64, uint16_t, 4, 4, 1, AB64, uint16_t, 4, 4, 1)
784*4e366538SXin Li TESTATOA(AB64, uint16_t, 4, 4, 1, AR64, uint16_t, 4, 4, 1)
785*4e366538SXin Li
786*4e366538SXin Li #define TESTATOBDI(FMT_A, BPP_A, STRIDE_A, HEIGHT_A, FMT_B, BPP_B, STRIDE_B, \
787*4e366538SXin Li HEIGHT_B, W1280, N, NEG, OFF) \
788*4e366538SXin Li TEST_F(LibYUVConvertTest, FMT_A##To##FMT_B##Dither##N) { \
789*4e366538SXin Li const int kWidth = W1280; \
790*4e366538SXin Li const int kHeight = benchmark_height_; \
791*4e366538SXin Li const int kHeightA = (kHeight + HEIGHT_A - 1) / HEIGHT_A * HEIGHT_A; \
792*4e366538SXin Li const int kHeightB = (kHeight + HEIGHT_B - 1) / HEIGHT_B * HEIGHT_B; \
793*4e366538SXin Li const int kStrideA = \
794*4e366538SXin Li (kWidth * BPP_A + STRIDE_A - 1) / STRIDE_A * STRIDE_A; \
795*4e366538SXin Li const int kStrideB = \
796*4e366538SXin Li (kWidth * BPP_B + STRIDE_B - 1) / STRIDE_B * STRIDE_B; \
797*4e366538SXin Li align_buffer_page_end(src_argb, kStrideA* kHeightA + OFF); \
798*4e366538SXin Li align_buffer_page_end(dst_argb_c, kStrideB* kHeightB); \
799*4e366538SXin Li align_buffer_page_end(dst_argb_opt, kStrideB* kHeightB); \
800*4e366538SXin Li for (int i = 0; i < kStrideA * kHeightA; ++i) { \
801*4e366538SXin Li src_argb[i + OFF] = (fastrand() & 0xff); \
802*4e366538SXin Li } \
803*4e366538SXin Li memset(dst_argb_c, 1, kStrideB* kHeightB); \
804*4e366538SXin Li memset(dst_argb_opt, 101, kStrideB* kHeightB); \
805*4e366538SXin Li MaskCpuFlags(disable_cpu_flags_); \
806*4e366538SXin Li FMT_A##To##FMT_B##Dither(src_argb + OFF, kStrideA, dst_argb_c, kStrideB, \
807*4e366538SXin Li NULL, kWidth, NEG kHeight); \
808*4e366538SXin Li MaskCpuFlags(benchmark_cpu_info_); \
809*4e366538SXin Li for (int i = 0; i < benchmark_iterations_; ++i) { \
810*4e366538SXin Li FMT_A##To##FMT_B##Dither(src_argb + OFF, kStrideA, dst_argb_opt, \
811*4e366538SXin Li kStrideB, NULL, kWidth, NEG kHeight); \
812*4e366538SXin Li } \
813*4e366538SXin Li for (int i = 0; i < kStrideB * kHeightB; ++i) { \
814*4e366538SXin Li EXPECT_EQ(dst_argb_c[i], dst_argb_opt[i]); \
815*4e366538SXin Li } \
816*4e366538SXin Li free_aligned_buffer_page_end(src_argb); \
817*4e366538SXin Li free_aligned_buffer_page_end(dst_argb_c); \
818*4e366538SXin Li free_aligned_buffer_page_end(dst_argb_opt); \
819*4e366538SXin Li }
820*4e366538SXin Li
821*4e366538SXin Li #define TESTATOBDRANDOM(FMT_A, BPP_A, STRIDE_A, HEIGHT_A, FMT_B, BPP_B, \
822*4e366538SXin Li STRIDE_B, HEIGHT_B) \
823*4e366538SXin Li TEST_F(LibYUVConvertTest, FMT_A##To##FMT_B##Dither_Random) { \
824*4e366538SXin Li for (int times = 0; times < benchmark_iterations_; ++times) { \
825*4e366538SXin Li const int kWidth = (fastrand() & 63) + 1; \
826*4e366538SXin Li const int kHeight = (fastrand() & 31) + 1; \
827*4e366538SXin Li const int kHeightA = (kHeight + HEIGHT_A - 1) / HEIGHT_A * HEIGHT_A; \
828*4e366538SXin Li const int kHeightB = (kHeight + HEIGHT_B - 1) / HEIGHT_B * HEIGHT_B; \
829*4e366538SXin Li const int kStrideA = \
830*4e366538SXin Li (kWidth * BPP_A + STRIDE_A - 1) / STRIDE_A * STRIDE_A; \
831*4e366538SXin Li const int kStrideB = \
832*4e366538SXin Li (kWidth * BPP_B + STRIDE_B - 1) / STRIDE_B * STRIDE_B; \
833*4e366538SXin Li align_buffer_page_end(src_argb, kStrideA* kHeightA); \
834*4e366538SXin Li align_buffer_page_end(dst_argb_c, kStrideB* kHeightB); \
835*4e366538SXin Li align_buffer_page_end(dst_argb_opt, kStrideB* kHeightB); \
836*4e366538SXin Li for (int i = 0; i < kStrideA * kHeightA; ++i) { \
837*4e366538SXin Li src_argb[i] = (fastrand() & 0xff); \
838*4e366538SXin Li } \
839*4e366538SXin Li memset(dst_argb_c, 123, kStrideB* kHeightB); \
840*4e366538SXin Li memset(dst_argb_opt, 123, kStrideB* kHeightB); \
841*4e366538SXin Li MaskCpuFlags(disable_cpu_flags_); \
842*4e366538SXin Li FMT_A##To##FMT_B##Dither(src_argb, kStrideA, dst_argb_c, kStrideB, NULL, \
843*4e366538SXin Li kWidth, kHeight); \
844*4e366538SXin Li MaskCpuFlags(benchmark_cpu_info_); \
845*4e366538SXin Li FMT_A##To##FMT_B##Dither(src_argb, kStrideA, dst_argb_opt, kStrideB, \
846*4e366538SXin Li NULL, kWidth, kHeight); \
847*4e366538SXin Li for (int i = 0; i < kStrideB * kHeightB; ++i) { \
848*4e366538SXin Li EXPECT_EQ(dst_argb_c[i], dst_argb_opt[i]); \
849*4e366538SXin Li } \
850*4e366538SXin Li free_aligned_buffer_page_end(src_argb); \
851*4e366538SXin Li free_aligned_buffer_page_end(dst_argb_c); \
852*4e366538SXin Li free_aligned_buffer_page_end(dst_argb_opt); \
853*4e366538SXin Li } \
854*4e366538SXin Li }
855*4e366538SXin Li
856*4e366538SXin Li #if defined(ENABLE_FULL_TESTS)
857*4e366538SXin Li #define TESTATOBD(FMT_A, BPP_A, STRIDE_A, HEIGHT_A, FMT_B, BPP_B, STRIDE_B, \
858*4e366538SXin Li HEIGHT_B) \
859*4e366538SXin Li TESTATOBDI(FMT_A, BPP_A, STRIDE_A, HEIGHT_A, FMT_B, BPP_B, STRIDE_B, \
860*4e366538SXin Li HEIGHT_B, benchmark_width_ + 1, _Any, +, 0) \
861*4e366538SXin Li TESTATOBDI(FMT_A, BPP_A, STRIDE_A, HEIGHT_A, FMT_B, BPP_B, STRIDE_B, \
862*4e366538SXin Li HEIGHT_B, benchmark_width_, _Unaligned, +, 2) \
863*4e366538SXin Li TESTATOBDI(FMT_A, BPP_A, STRIDE_A, HEIGHT_A, FMT_B, BPP_B, STRIDE_B, \
864*4e366538SXin Li HEIGHT_B, benchmark_width_, _Invert, -, 0) \
865*4e366538SXin Li TESTATOBDI(FMT_A, BPP_A, STRIDE_A, HEIGHT_A, FMT_B, BPP_B, STRIDE_B, \
866*4e366538SXin Li HEIGHT_B, benchmark_width_, _Opt, +, 0) \
867*4e366538SXin Li TESTATOBDRANDOM(FMT_A, BPP_A, STRIDE_A, HEIGHT_A, FMT_B, BPP_B, STRIDE_B, \
868*4e366538SXin Li HEIGHT_B)
869*4e366538SXin Li #else
870*4e366538SXin Li #define TESTATOBD(FMT_A, BPP_A, STRIDE_A, HEIGHT_A, FMT_B, BPP_B, STRIDE_B, \
871*4e366538SXin Li HEIGHT_B) \
872*4e366538SXin Li TESTATOBDRANDOM(FMT_A, BPP_A, STRIDE_A, HEIGHT_A, FMT_B, BPP_B, STRIDE_B, \
873*4e366538SXin Li HEIGHT_B)
874*4e366538SXin Li #endif
875*4e366538SXin Li
876*4e366538SXin Li #ifdef LITTLE_ENDIAN_ONLY_TEST
877*4e366538SXin Li TESTATOBD(ARGB, 4, 4, 1, RGB565, 2, 2, 1)
878*4e366538SXin Li #endif
879*4e366538SXin Li
880*4e366538SXin Li // These conversions called twice, produce the original result.
881*4e366538SXin Li // e.g. endian swap twice.
882*4e366538SXin Li #define TESTENDI(FMT_ATOB, TYPE_A, EPP_A, STRIDE_A, HEIGHT_A, W1280, N, NEG, \
883*4e366538SXin Li OFF) \
884*4e366538SXin Li TEST_F(LibYUVConvertTest, FMT_ATOB##_Endswap##N) { \
885*4e366538SXin Li const int kWidth = W1280; \
886*4e366538SXin Li const int kHeight = benchmark_height_; \
887*4e366538SXin Li const int kHeightA = (kHeight + HEIGHT_A - 1) / HEIGHT_A * HEIGHT_A; \
888*4e366538SXin Li const int kStrideA = \
889*4e366538SXin Li (kWidth * EPP_A + STRIDE_A - 1) / STRIDE_A * STRIDE_A; \
890*4e366538SXin Li align_buffer_page_end(src_argb, \
891*4e366538SXin Li kStrideA* kHeightA*(int)sizeof(TYPE_A) + OFF); \
892*4e366538SXin Li align_buffer_page_end(dst_argb_c, kStrideA* kHeightA*(int)sizeof(TYPE_A)); \
893*4e366538SXin Li align_buffer_page_end(dst_argb_opt, \
894*4e366538SXin Li kStrideA* kHeightA*(int)sizeof(TYPE_A)); \
895*4e366538SXin Li for (int i = 0; i < kStrideA * kHeightA * (int)sizeof(TYPE_A); ++i) { \
896*4e366538SXin Li src_argb[i + OFF] = (fastrand() & 0xff); \
897*4e366538SXin Li } \
898*4e366538SXin Li memset(dst_argb_c, 1, kStrideA* kHeightA); \
899*4e366538SXin Li memset(dst_argb_opt, 101, kStrideA* kHeightA); \
900*4e366538SXin Li MaskCpuFlags(disable_cpu_flags_); \
901*4e366538SXin Li FMT_ATOB((TYPE_A*)(src_argb + OFF), kStrideA, (TYPE_A*)dst_argb_c, \
902*4e366538SXin Li kStrideA, kWidth, NEG kHeight); \
903*4e366538SXin Li MaskCpuFlags(benchmark_cpu_info_); \
904*4e366538SXin Li for (int i = 0; i < benchmark_iterations_; ++i) { \
905*4e366538SXin Li FMT_ATOB((TYPE_A*)(src_argb + OFF), kStrideA, (TYPE_A*)dst_argb_opt, \
906*4e366538SXin Li kStrideA, kWidth, NEG kHeight); \
907*4e366538SXin Li } \
908*4e366538SXin Li MaskCpuFlags(disable_cpu_flags_); \
909*4e366538SXin Li FMT_ATOB((TYPE_A*)dst_argb_c, kStrideA, (TYPE_A*)dst_argb_c, kStrideA, \
910*4e366538SXin Li kWidth, NEG kHeight); \
911*4e366538SXin Li MaskCpuFlags(benchmark_cpu_info_); \
912*4e366538SXin Li FMT_ATOB((TYPE_A*)dst_argb_opt, kStrideA, (TYPE_A*)dst_argb_opt, kStrideA, \
913*4e366538SXin Li kWidth, NEG kHeight); \
914*4e366538SXin Li for (int i = 0; i < kStrideA * kHeightA * (int)sizeof(TYPE_A); ++i) { \
915*4e366538SXin Li EXPECT_EQ(src_argb[i + OFF], dst_argb_opt[i]); \
916*4e366538SXin Li EXPECT_EQ(dst_argb_c[i], dst_argb_opt[i]); \
917*4e366538SXin Li } \
918*4e366538SXin Li free_aligned_buffer_page_end(src_argb); \
919*4e366538SXin Li free_aligned_buffer_page_end(dst_argb_c); \
920*4e366538SXin Li free_aligned_buffer_page_end(dst_argb_opt); \
921*4e366538SXin Li }
922*4e366538SXin Li
923*4e366538SXin Li #if defined(ENABLE_FULL_TESTS)
924*4e366538SXin Li #define TESTEND(FMT_ATOB, TYPE_A, EPP_A, STRIDE_A, HEIGHT_A) \
925*4e366538SXin Li TESTENDI(FMT_ATOB, TYPE_A, EPP_A, STRIDE_A, HEIGHT_A, benchmark_width_ + 1, \
926*4e366538SXin Li _Any, +, 0) \
927*4e366538SXin Li TESTENDI(FMT_ATOB, TYPE_A, EPP_A, STRIDE_A, HEIGHT_A, benchmark_width_, \
928*4e366538SXin Li _Unaligned, +, 2) \
929*4e366538SXin Li TESTENDI(FMT_ATOB, TYPE_A, EPP_A, STRIDE_A, HEIGHT_A, benchmark_width_, \
930*4e366538SXin Li _Opt, +, 0)
931*4e366538SXin Li #else
932*4e366538SXin Li #define TESTEND(FMT_ATOB, TYPE_A, EPP_A, STRIDE_A, HEIGHT_A) \
933*4e366538SXin Li TESTENDI(FMT_ATOB, TYPE_A, EPP_A, STRIDE_A, HEIGHT_A, benchmark_width_, \
934*4e366538SXin Li _Opt, +, 0)
935*4e366538SXin Li #endif
936*4e366538SXin Li
937*4e366538SXin Li TESTEND(ARGBToBGRA, uint8_t, 4, 4, 1)
938*4e366538SXin Li TESTEND(ARGBToABGR, uint8_t, 4, 4, 1)
939*4e366538SXin Li TESTEND(BGRAToARGB, uint8_t, 4, 4, 1)
940*4e366538SXin Li TESTEND(ABGRToARGB, uint8_t, 4, 4, 1)
941*4e366538SXin Li TESTEND(AB64ToAR64, uint16_t, 4, 4, 1)
942*4e366538SXin Li
943*4e366538SXin Li #define TESTQPLANARTOBI(FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y, FMT_B, BPP_B, ALIGN, \
944*4e366538SXin Li YALIGN, W1280, N, NEG, OFF, ATTEN) \
945*4e366538SXin Li TEST_F(LibYUVConvertTest, FMT_PLANAR##To##FMT_B##N) { \
946*4e366538SXin Li const int kWidth = W1280; \
947*4e366538SXin Li const int kHeight = ALIGNINT(benchmark_height_, YALIGN); \
948*4e366538SXin Li const int kStrideB = ALIGNINT(kWidth * BPP_B, ALIGN); \
949*4e366538SXin Li const int kStrideUV = SUBSAMPLE(kWidth, SUBSAMP_X); \
950*4e366538SXin Li const int kSizeUV = kStrideUV * SUBSAMPLE(kHeight, SUBSAMP_Y); \
951*4e366538SXin Li align_buffer_page_end(src_y, kWidth* kHeight + OFF); \
952*4e366538SXin Li align_buffer_page_end(src_u, kSizeUV + OFF); \
953*4e366538SXin Li align_buffer_page_end(src_v, kSizeUV + OFF); \
954*4e366538SXin Li align_buffer_page_end(src_a, kWidth* kHeight + OFF); \
955*4e366538SXin Li align_buffer_page_end(dst_argb_c, kStrideB* kHeight + OFF); \
956*4e366538SXin Li align_buffer_page_end(dst_argb_opt, kStrideB* kHeight + OFF); \
957*4e366538SXin Li for (int i = 0; i < kWidth * kHeight; ++i) { \
958*4e366538SXin Li src_y[i + OFF] = (fastrand() & 0xff); \
959*4e366538SXin Li src_a[i + OFF] = (fastrand() & 0xff); \
960*4e366538SXin Li } \
961*4e366538SXin Li for (int i = 0; i < kSizeUV; ++i) { \
962*4e366538SXin Li src_u[i + OFF] = (fastrand() & 0xff); \
963*4e366538SXin Li src_v[i + OFF] = (fastrand() & 0xff); \
964*4e366538SXin Li } \
965*4e366538SXin Li memset(dst_argb_c + OFF, 1, kStrideB * kHeight); \
966*4e366538SXin Li memset(dst_argb_opt + OFF, 101, kStrideB * kHeight); \
967*4e366538SXin Li MaskCpuFlags(disable_cpu_flags_); \
968*4e366538SXin Li FMT_PLANAR##To##FMT_B(src_y + OFF, kWidth, src_u + OFF, kStrideUV, \
969*4e366538SXin Li src_v + OFF, kStrideUV, src_a + OFF, kWidth, \
970*4e366538SXin Li dst_argb_c + OFF, kStrideB, kWidth, NEG kHeight, \
971*4e366538SXin Li ATTEN); \
972*4e366538SXin Li MaskCpuFlags(benchmark_cpu_info_); \
973*4e366538SXin Li for (int i = 0; i < benchmark_iterations_; ++i) { \
974*4e366538SXin Li FMT_PLANAR##To##FMT_B(src_y + OFF, kWidth, src_u + OFF, kStrideUV, \
975*4e366538SXin Li src_v + OFF, kStrideUV, src_a + OFF, kWidth, \
976*4e366538SXin Li dst_argb_opt + OFF, kStrideB, kWidth, NEG kHeight, \
977*4e366538SXin Li ATTEN); \
978*4e366538SXin Li } \
979*4e366538SXin Li for (int i = 0; i < kWidth * BPP_B * kHeight; ++i) { \
980*4e366538SXin Li EXPECT_EQ(dst_argb_c[i + OFF], dst_argb_opt[i + OFF]); \
981*4e366538SXin Li } \
982*4e366538SXin Li free_aligned_buffer_page_end(src_y); \
983*4e366538SXin Li free_aligned_buffer_page_end(src_u); \
984*4e366538SXin Li free_aligned_buffer_page_end(src_v); \
985*4e366538SXin Li free_aligned_buffer_page_end(src_a); \
986*4e366538SXin Li free_aligned_buffer_page_end(dst_argb_c); \
987*4e366538SXin Li free_aligned_buffer_page_end(dst_argb_opt); \
988*4e366538SXin Li }
989*4e366538SXin Li
990*4e366538SXin Li #if defined(ENABLE_FULL_TESTS)
991*4e366538SXin Li #define TESTQPLANARTOB(FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y, FMT_B, BPP_B, ALIGN, \
992*4e366538SXin Li YALIGN) \
993*4e366538SXin Li TESTQPLANARTOBI(FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y, FMT_B, BPP_B, ALIGN, \
994*4e366538SXin Li YALIGN, benchmark_width_ + 1, _Any, +, 0, 0) \
995*4e366538SXin Li TESTQPLANARTOBI(FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y, FMT_B, BPP_B, ALIGN, \
996*4e366538SXin Li YALIGN, benchmark_width_, _Unaligned, +, 2, 0) \
997*4e366538SXin Li TESTQPLANARTOBI(FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y, FMT_B, BPP_B, ALIGN, \
998*4e366538SXin Li YALIGN, benchmark_width_, _Invert, -, 0, 0) \
999*4e366538SXin Li TESTQPLANARTOBI(FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y, FMT_B, BPP_B, ALIGN, \
1000*4e366538SXin Li YALIGN, benchmark_width_, _Opt, +, 0, 0) \
1001*4e366538SXin Li TESTQPLANARTOBI(FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y, FMT_B, BPP_B, ALIGN, \
1002*4e366538SXin Li YALIGN, benchmark_width_, _Premult, +, 0, 1)
1003*4e366538SXin Li #else
1004*4e366538SXin Li #define TESTQPLANARTOB(FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y, FMT_B, BPP_B, ALIGN, \
1005*4e366538SXin Li YALIGN) \
1006*4e366538SXin Li TESTQPLANARTOBI(FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y, FMT_B, BPP_B, ALIGN, \
1007*4e366538SXin Li YALIGN, benchmark_width_, _Opt, +, 0, 0)
1008*4e366538SXin Li #endif
1009*4e366538SXin Li
1010*4e366538SXin Li #define J420AlphaToARGB(a, b, c, d, e, f, g, h, i, j, k, l, m) \
1011*4e366538SXin Li I420AlphaToARGBMatrix(a, b, c, d, e, f, g, h, i, j, &kYuvJPEGConstants, k, \
1012*4e366538SXin Li l, m)
1013*4e366538SXin Li #define J420AlphaToABGR(a, b, c, d, e, f, g, h, i, j, k, l, m) \
1014*4e366538SXin Li I420AlphaToABGRMatrix(a, b, c, d, e, f, g, h, i, j, &kYuvJPEGConstants, k, \
1015*4e366538SXin Li l, m)
1016*4e366538SXin Li #define F420AlphaToARGB(a, b, c, d, e, f, g, h, i, j, k, l, m) \
1017*4e366538SXin Li I420AlphaToARGBMatrix(a, b, c, d, e, f, g, h, i, j, &kYuvF709Constants, k, \
1018*4e366538SXin Li l, m)
1019*4e366538SXin Li #define F420AlphaToABGR(a, b, c, d, e, f, g, h, i, j, k, l, m) \
1020*4e366538SXin Li I420AlphaToABGRMatrix(a, b, c, d, e, f, g, h, i, j, &kYuvF709Constants, k, \
1021*4e366538SXin Li l, m)
1022*4e366538SXin Li #define H420AlphaToARGB(a, b, c, d, e, f, g, h, i, j, k, l, m) \
1023*4e366538SXin Li I420AlphaToARGBMatrix(a, b, c, d, e, f, g, h, i, j, &kYuvH709Constants, k, \
1024*4e366538SXin Li l, m)
1025*4e366538SXin Li #define H420AlphaToABGR(a, b, c, d, e, f, g, h, i, j, k, l, m) \
1026*4e366538SXin Li I420AlphaToABGRMatrix(a, b, c, d, e, f, g, h, i, j, &kYuvH709Constants, k, \
1027*4e366538SXin Li l, m)
1028*4e366538SXin Li #define U420AlphaToARGB(a, b, c, d, e, f, g, h, i, j, k, l, m) \
1029*4e366538SXin Li I420AlphaToARGBMatrix(a, b, c, d, e, f, g, h, i, j, &kYuv2020Constants, k, \
1030*4e366538SXin Li l, m)
1031*4e366538SXin Li #define U420AlphaToABGR(a, b, c, d, e, f, g, h, i, j, k, l, m) \
1032*4e366538SXin Li I420AlphaToABGRMatrix(a, b, c, d, e, f, g, h, i, j, &kYuv2020Constants, k, \
1033*4e366538SXin Li l, m)
1034*4e366538SXin Li #define V420AlphaToARGB(a, b, c, d, e, f, g, h, i, j, k, l, m) \
1035*4e366538SXin Li I420AlphaToARGBMatrix(a, b, c, d, e, f, g, h, i, j, &kYuvV2020Constants, k, \
1036*4e366538SXin Li l, m)
1037*4e366538SXin Li #define V420AlphaToABGR(a, b, c, d, e, f, g, h, i, j, k, l, m) \
1038*4e366538SXin Li I420AlphaToABGRMatrix(a, b, c, d, e, f, g, h, i, j, &kYuvV2020Constants, k, \
1039*4e366538SXin Li l, m)
1040*4e366538SXin Li #define J422AlphaToARGB(a, b, c, d, e, f, g, h, i, j, k, l, m) \
1041*4e366538SXin Li I422AlphaToARGBMatrix(a, b, c, d, e, f, g, h, i, j, &kYuvJPEGConstants, k, \
1042*4e366538SXin Li l, m)
1043*4e366538SXin Li #define J422AlphaToABGR(a, b, c, d, e, f, g, h, i, j, k, l, m) \
1044*4e366538SXin Li I422AlphaToABGRMatrix(a, b, c, d, e, f, g, h, i, j, &kYuvJPEGConstants, k, \
1045*4e366538SXin Li l, m)
1046*4e366538SXin Li #define F422AlphaToARGB(a, b, c, d, e, f, g, h, i, j, k, l, m) \
1047*4e366538SXin Li I422AlphaToARGBMatrix(a, b, c, d, e, f, g, h, i, j, &kYuvF709Constants, k, \
1048*4e366538SXin Li l, m)
1049*4e366538SXin Li #define F422AlphaToABGR(a, b, c, d, e, f, g, h, i, j, k, l, m) \
1050*4e366538SXin Li I422AlphaToABGRMatrix(a, b, c, d, e, f, g, h, i, j, &kYuvF709Constants, k, \
1051*4e366538SXin Li l, m)
1052*4e366538SXin Li #define H422AlphaToARGB(a, b, c, d, e, f, g, h, i, j, k, l, m) \
1053*4e366538SXin Li I422AlphaToARGBMatrix(a, b, c, d, e, f, g, h, i, j, &kYuvH709Constants, k, \
1054*4e366538SXin Li l, m)
1055*4e366538SXin Li #define H422AlphaToABGR(a, b, c, d, e, f, g, h, i, j, k, l, m) \
1056*4e366538SXin Li I422AlphaToABGRMatrix(a, b, c, d, e, f, g, h, i, j, &kYuvH709Constants, k, \
1057*4e366538SXin Li l, m)
1058*4e366538SXin Li #define U422AlphaToARGB(a, b, c, d, e, f, g, h, i, j, k, l, m) \
1059*4e366538SXin Li I422AlphaToARGBMatrix(a, b, c, d, e, f, g, h, i, j, &kYuv2020Constants, k, \
1060*4e366538SXin Li l, m)
1061*4e366538SXin Li #define U422AlphaToABGR(a, b, c, d, e, f, g, h, i, j, k, l, m) \
1062*4e366538SXin Li I422AlphaToABGRMatrix(a, b, c, d, e, f, g, h, i, j, &kYuv2020Constants, k, \
1063*4e366538SXin Li l, m)
1064*4e366538SXin Li #define V422AlphaToARGB(a, b, c, d, e, f, g, h, i, j, k, l, m) \
1065*4e366538SXin Li I422AlphaToARGBMatrix(a, b, c, d, e, f, g, h, i, j, &kYuvV2020Constants, k, \
1066*4e366538SXin Li l, m)
1067*4e366538SXin Li #define V422AlphaToABGR(a, b, c, d, e, f, g, h, i, j, k, l, m) \
1068*4e366538SXin Li I422AlphaToABGRMatrix(a, b, c, d, e, f, g, h, i, j, &kYuvV2020Constants, k, \
1069*4e366538SXin Li l, m)
1070*4e366538SXin Li #define J444AlphaToARGB(a, b, c, d, e, f, g, h, i, j, k, l, m) \
1071*4e366538SXin Li I444AlphaToARGBMatrix(a, b, c, d, e, f, g, h, i, j, &kYuvJPEGConstants, k, \
1072*4e366538SXin Li l, m)
1073*4e366538SXin Li #define J444AlphaToABGR(a, b, c, d, e, f, g, h, i, j, k, l, m) \
1074*4e366538SXin Li I444AlphaToABGRMatrix(a, b, c, d, e, f, g, h, i, j, &kYuvJPEGConstants, k, \
1075*4e366538SXin Li l, m)
1076*4e366538SXin Li #define F444AlphaToARGB(a, b, c, d, e, f, g, h, i, j, k, l, m) \
1077*4e366538SXin Li I444AlphaToARGBMatrix(a, b, c, d, e, f, g, h, i, j, &kYuvF709Constants, k, \
1078*4e366538SXin Li l, m)
1079*4e366538SXin Li #define F444AlphaToABGR(a, b, c, d, e, f, g, h, i, j, k, l, m) \
1080*4e366538SXin Li I444AlphaToABGRMatrix(a, b, c, d, e, f, g, h, i, j, &kYuvF709Constants, k, \
1081*4e366538SXin Li l, m)
1082*4e366538SXin Li #define H444AlphaToARGB(a, b, c, d, e, f, g, h, i, j, k, l, m) \
1083*4e366538SXin Li I444AlphaToARGBMatrix(a, b, c, d, e, f, g, h, i, j, &kYuvH709Constants, k, \
1084*4e366538SXin Li l, m)
1085*4e366538SXin Li #define H444AlphaToABGR(a, b, c, d, e, f, g, h, i, j, k, l, m) \
1086*4e366538SXin Li I444AlphaToABGRMatrix(a, b, c, d, e, f, g, h, i, j, &kYuvH709Constants, k, \
1087*4e366538SXin Li l, m)
1088*4e366538SXin Li #define U444AlphaToARGB(a, b, c, d, e, f, g, h, i, j, k, l, m) \
1089*4e366538SXin Li I444AlphaToARGBMatrix(a, b, c, d, e, f, g, h, i, j, &kYuv2020Constants, k, \
1090*4e366538SXin Li l, m)
1091*4e366538SXin Li #define U444AlphaToABGR(a, b, c, d, e, f, g, h, i, j, k, l, m) \
1092*4e366538SXin Li I444AlphaToABGRMatrix(a, b, c, d, e, f, g, h, i, j, &kYuv2020Constants, k, \
1093*4e366538SXin Li l, m)
1094*4e366538SXin Li #define V444AlphaToARGB(a, b, c, d, e, f, g, h, i, j, k, l, m) \
1095*4e366538SXin Li I444AlphaToARGBMatrix(a, b, c, d, e, f, g, h, i, j, &kYuvV2020Constants, k, \
1096*4e366538SXin Li l, m)
1097*4e366538SXin Li #define V444AlphaToABGR(a, b, c, d, e, f, g, h, i, j, k, l, m) \
1098*4e366538SXin Li I444AlphaToABGRMatrix(a, b, c, d, e, f, g, h, i, j, &kYuvV2020Constants, k, \
1099*4e366538SXin Li l, m)
1100*4e366538SXin Li
1101*4e366538SXin Li #define I420AlphaToARGBFilter(a, b, c, d, e, f, g, h, i, j, k, l, m) \
1102*4e366538SXin Li I420AlphaToARGBMatrixFilter(a, b, c, d, e, f, g, h, i, j, \
1103*4e366538SXin Li &kYuvI601Constants, k, l, m, kFilterBilinear)
1104*4e366538SXin Li #define I422AlphaToARGBFilter(a, b, c, d, e, f, g, h, i, j, k, l, m) \
1105*4e366538SXin Li I422AlphaToARGBMatrixFilter(a, b, c, d, e, f, g, h, i, j, \
1106*4e366538SXin Li &kYuvI601Constants, k, l, m, kFilterBilinear)
1107*4e366538SXin Li
1108*4e366538SXin Li #if defined(ENABLE_FULL_TESTS)
1109*4e366538SXin Li TESTQPLANARTOB(I420Alpha, 2, 2, ARGB, 4, 4, 1)
1110*4e366538SXin Li TESTQPLANARTOB(I420Alpha, 2, 2, ABGR, 4, 4, 1)
1111*4e366538SXin Li TESTQPLANARTOB(J420Alpha, 2, 2, ARGB, 4, 4, 1)
1112*4e366538SXin Li TESTQPLANARTOB(J420Alpha, 2, 2, ABGR, 4, 4, 1)
1113*4e366538SXin Li TESTQPLANARTOB(H420Alpha, 2, 2, ARGB, 4, 4, 1)
1114*4e366538SXin Li TESTQPLANARTOB(H420Alpha, 2, 2, ABGR, 4, 4, 1)
1115*4e366538SXin Li TESTQPLANARTOB(F420Alpha, 2, 2, ARGB, 4, 4, 1)
1116*4e366538SXin Li TESTQPLANARTOB(F420Alpha, 2, 2, ABGR, 4, 4, 1)
1117*4e366538SXin Li TESTQPLANARTOB(U420Alpha, 2, 2, ARGB, 4, 4, 1)
1118*4e366538SXin Li TESTQPLANARTOB(U420Alpha, 2, 2, ABGR, 4, 4, 1)
1119*4e366538SXin Li TESTQPLANARTOB(V420Alpha, 2, 2, ARGB, 4, 4, 1)
1120*4e366538SXin Li TESTQPLANARTOB(V420Alpha, 2, 2, ABGR, 4, 4, 1)
1121*4e366538SXin Li TESTQPLANARTOB(I422Alpha, 2, 1, ARGB, 4, 4, 1)
1122*4e366538SXin Li TESTQPLANARTOB(I422Alpha, 2, 1, ABGR, 4, 4, 1)
1123*4e366538SXin Li TESTQPLANARTOB(J422Alpha, 2, 1, ARGB, 4, 4, 1)
1124*4e366538SXin Li TESTQPLANARTOB(J422Alpha, 2, 1, ABGR, 4, 4, 1)
1125*4e366538SXin Li TESTQPLANARTOB(H422Alpha, 2, 1, ARGB, 4, 4, 1)
1126*4e366538SXin Li TESTQPLANARTOB(H422Alpha, 2, 1, ABGR, 4, 4, 1)
1127*4e366538SXin Li TESTQPLANARTOB(F422Alpha, 2, 1, ARGB, 4, 4, 1)
1128*4e366538SXin Li TESTQPLANARTOB(F422Alpha, 2, 1, ABGR, 4, 4, 1)
1129*4e366538SXin Li TESTQPLANARTOB(U422Alpha, 2, 1, ARGB, 4, 4, 1)
1130*4e366538SXin Li TESTQPLANARTOB(U422Alpha, 2, 1, ABGR, 4, 4, 1)
1131*4e366538SXin Li TESTQPLANARTOB(V422Alpha, 2, 1, ARGB, 4, 4, 1)
1132*4e366538SXin Li TESTQPLANARTOB(V422Alpha, 2, 1, ABGR, 4, 4, 1)
1133*4e366538SXin Li TESTQPLANARTOB(I444Alpha, 1, 1, ARGB, 4, 4, 1)
1134*4e366538SXin Li TESTQPLANARTOB(I444Alpha, 1, 1, ABGR, 4, 4, 1)
1135*4e366538SXin Li TESTQPLANARTOB(J444Alpha, 1, 1, ARGB, 4, 4, 1)
1136*4e366538SXin Li TESTQPLANARTOB(J444Alpha, 1, 1, ABGR, 4, 4, 1)
1137*4e366538SXin Li TESTQPLANARTOB(H444Alpha, 1, 1, ARGB, 4, 4, 1)
1138*4e366538SXin Li TESTQPLANARTOB(H444Alpha, 1, 1, ABGR, 4, 4, 1)
1139*4e366538SXin Li TESTQPLANARTOB(F444Alpha, 1, 1, ARGB, 4, 4, 1)
1140*4e366538SXin Li TESTQPLANARTOB(F444Alpha, 1, 1, ABGR, 4, 4, 1)
1141*4e366538SXin Li TESTQPLANARTOB(U444Alpha, 1, 1, ARGB, 4, 4, 1)
1142*4e366538SXin Li TESTQPLANARTOB(U444Alpha, 1, 1, ABGR, 4, 4, 1)
1143*4e366538SXin Li TESTQPLANARTOB(V444Alpha, 1, 1, ARGB, 4, 4, 1)
1144*4e366538SXin Li TESTQPLANARTOB(V444Alpha, 1, 1, ABGR, 4, 4, 1)
1145*4e366538SXin Li TESTQPLANARTOB(I420Alpha, 2, 2, ARGBFilter, 4, 4, 1)
1146*4e366538SXin Li TESTQPLANARTOB(I422Alpha, 2, 1, ARGBFilter, 4, 4, 1)
1147*4e366538SXin Li #else
1148*4e366538SXin Li TESTQPLANARTOB(I420Alpha, 2, 2, ARGB, 4, 4, 1)
1149*4e366538SXin Li TESTQPLANARTOB(I422Alpha, 2, 1, ARGB, 4, 4, 1)
1150*4e366538SXin Li TESTQPLANARTOB(I444Alpha, 1, 1, ARGB, 4, 4, 1)
1151*4e366538SXin Li TESTQPLANARTOB(I420Alpha, 2, 2, ARGBFilter, 4, 4, 1)
1152*4e366538SXin Li TESTQPLANARTOB(I422Alpha, 2, 1, ARGBFilter, 4, 4, 1)
1153*4e366538SXin Li #endif
1154*4e366538SXin Li
TEST_F(LibYUVConvertTest,TestYToARGB)1155*4e366538SXin Li TEST_F(LibYUVConvertTest, TestYToARGB) {
1156*4e366538SXin Li uint8_t y[32];
1157*4e366538SXin Li uint8_t expectedg[32];
1158*4e366538SXin Li for (int i = 0; i < 32; ++i) {
1159*4e366538SXin Li y[i] = i * 5 + 17;
1160*4e366538SXin Li expectedg[i] = static_cast<int>((y[i] - 16) * 1.164f + 0.5f);
1161*4e366538SXin Li }
1162*4e366538SXin Li uint8_t argb[32 * 4];
1163*4e366538SXin Li YToARGB(y, 0, argb, 0, 32, 1);
1164*4e366538SXin Li
1165*4e366538SXin Li for (int i = 0; i < 32; ++i) {
1166*4e366538SXin Li printf("%2d %d: %d <-> %d,%d,%d,%d\n", i, y[i], expectedg[i],
1167*4e366538SXin Li argb[i * 4 + 0], argb[i * 4 + 1], argb[i * 4 + 2], argb[i * 4 + 3]);
1168*4e366538SXin Li }
1169*4e366538SXin Li for (int i = 0; i < 32; ++i) {
1170*4e366538SXin Li EXPECT_EQ(expectedg[i], argb[i * 4 + 0]);
1171*4e366538SXin Li }
1172*4e366538SXin Li }
1173*4e366538SXin Li
1174*4e366538SXin Li static const uint8_t kNoDither4x4[16] = {
1175*4e366538SXin Li 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1176*4e366538SXin Li };
1177*4e366538SXin Li
TEST_F(LibYUVConvertTest,TestNoDither)1178*4e366538SXin Li TEST_F(LibYUVConvertTest, TestNoDither) {
1179*4e366538SXin Li align_buffer_page_end(src_argb, benchmark_width_ * benchmark_height_ * 4);
1180*4e366538SXin Li align_buffer_page_end(dst_rgb565, benchmark_width_ * benchmark_height_ * 2);
1181*4e366538SXin Li align_buffer_page_end(dst_rgb565dither,
1182*4e366538SXin Li benchmark_width_ * benchmark_height_ * 2);
1183*4e366538SXin Li MemRandomize(src_argb, benchmark_width_ * benchmark_height_ * 4);
1184*4e366538SXin Li MemRandomize(dst_rgb565, benchmark_width_ * benchmark_height_ * 2);
1185*4e366538SXin Li MemRandomize(dst_rgb565dither, benchmark_width_ * benchmark_height_ * 2);
1186*4e366538SXin Li ARGBToRGB565(src_argb, benchmark_width_ * 4, dst_rgb565, benchmark_width_ * 2,
1187*4e366538SXin Li benchmark_width_, benchmark_height_);
1188*4e366538SXin Li ARGBToRGB565Dither(src_argb, benchmark_width_ * 4, dst_rgb565dither,
1189*4e366538SXin Li benchmark_width_ * 2, kNoDither4x4, benchmark_width_,
1190*4e366538SXin Li benchmark_height_);
1191*4e366538SXin Li for (int i = 0; i < benchmark_width_ * benchmark_height_ * 2; ++i) {
1192*4e366538SXin Li EXPECT_EQ(dst_rgb565[i], dst_rgb565dither[i]);
1193*4e366538SXin Li }
1194*4e366538SXin Li
1195*4e366538SXin Li free_aligned_buffer_page_end(src_argb);
1196*4e366538SXin Li free_aligned_buffer_page_end(dst_rgb565);
1197*4e366538SXin Li free_aligned_buffer_page_end(dst_rgb565dither);
1198*4e366538SXin Li }
1199*4e366538SXin Li
1200*4e366538SXin Li // Ordered 4x4 dither for 888 to 565. Values from 0 to 7.
1201*4e366538SXin Li static const uint8_t kDither565_4x4[16] = {
1202*4e366538SXin Li 0, 4, 1, 5, 6, 2, 7, 3, 1, 5, 0, 4, 7, 3, 6, 2,
1203*4e366538SXin Li };
1204*4e366538SXin Li
TEST_F(LibYUVConvertTest,TestDither)1205*4e366538SXin Li TEST_F(LibYUVConvertTest, TestDither) {
1206*4e366538SXin Li align_buffer_page_end(src_argb, benchmark_width_ * benchmark_height_ * 4);
1207*4e366538SXin Li align_buffer_page_end(dst_rgb565, benchmark_width_ * benchmark_height_ * 2);
1208*4e366538SXin Li align_buffer_page_end(dst_rgb565dither,
1209*4e366538SXin Li benchmark_width_ * benchmark_height_ * 2);
1210*4e366538SXin Li align_buffer_page_end(dst_argb, benchmark_width_ * benchmark_height_ * 4);
1211*4e366538SXin Li align_buffer_page_end(dst_argbdither,
1212*4e366538SXin Li benchmark_width_ * benchmark_height_ * 4);
1213*4e366538SXin Li MemRandomize(src_argb, benchmark_width_ * benchmark_height_ * 4);
1214*4e366538SXin Li MemRandomize(dst_rgb565, benchmark_width_ * benchmark_height_ * 2);
1215*4e366538SXin Li MemRandomize(dst_rgb565dither, benchmark_width_ * benchmark_height_ * 2);
1216*4e366538SXin Li MemRandomize(dst_argb, benchmark_width_ * benchmark_height_ * 4);
1217*4e366538SXin Li MemRandomize(dst_argbdither, benchmark_width_ * benchmark_height_ * 4);
1218*4e366538SXin Li ARGBToRGB565(src_argb, benchmark_width_ * 4, dst_rgb565, benchmark_width_ * 2,
1219*4e366538SXin Li benchmark_width_, benchmark_height_);
1220*4e366538SXin Li ARGBToRGB565Dither(src_argb, benchmark_width_ * 4, dst_rgb565dither,
1221*4e366538SXin Li benchmark_width_ * 2, kDither565_4x4, benchmark_width_,
1222*4e366538SXin Li benchmark_height_);
1223*4e366538SXin Li RGB565ToARGB(dst_rgb565, benchmark_width_ * 2, dst_argb, benchmark_width_ * 4,
1224*4e366538SXin Li benchmark_width_, benchmark_height_);
1225*4e366538SXin Li RGB565ToARGB(dst_rgb565dither, benchmark_width_ * 2, dst_argbdither,
1226*4e366538SXin Li benchmark_width_ * 4, benchmark_width_, benchmark_height_);
1227*4e366538SXin Li
1228*4e366538SXin Li for (int i = 0; i < benchmark_width_ * benchmark_height_ * 4; ++i) {
1229*4e366538SXin Li EXPECT_NEAR(dst_argb[i], dst_argbdither[i], 9);
1230*4e366538SXin Li }
1231*4e366538SXin Li free_aligned_buffer_page_end(src_argb);
1232*4e366538SXin Li free_aligned_buffer_page_end(dst_rgb565);
1233*4e366538SXin Li free_aligned_buffer_page_end(dst_rgb565dither);
1234*4e366538SXin Li free_aligned_buffer_page_end(dst_argb);
1235*4e366538SXin Li free_aligned_buffer_page_end(dst_argbdither);
1236*4e366538SXin Li }
1237*4e366538SXin Li
1238*4e366538SXin Li #define TESTPLANARTOBID(FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y, FMT_B, BPP_B, ALIGN, \
1239*4e366538SXin Li YALIGN, W1280, N, NEG, OFF, FMT_C, BPP_C) \
1240*4e366538SXin Li TEST_F(LibYUVConvertTest, FMT_PLANAR##To##FMT_B##Dither##N) { \
1241*4e366538SXin Li const int kWidth = W1280; \
1242*4e366538SXin Li const int kHeight = ALIGNINT(benchmark_height_, YALIGN); \
1243*4e366538SXin Li const int kStrideB = ALIGNINT(kWidth * BPP_B, ALIGN); \
1244*4e366538SXin Li const int kStrideUV = SUBSAMPLE(kWidth, SUBSAMP_X); \
1245*4e366538SXin Li const int kSizeUV = kStrideUV * SUBSAMPLE(kHeight, SUBSAMP_Y); \
1246*4e366538SXin Li align_buffer_page_end(src_y, kWidth* kHeight + OFF); \
1247*4e366538SXin Li align_buffer_page_end(src_u, kSizeUV + OFF); \
1248*4e366538SXin Li align_buffer_page_end(src_v, kSizeUV + OFF); \
1249*4e366538SXin Li align_buffer_page_end(dst_argb_c, kStrideB* kHeight + OFF); \
1250*4e366538SXin Li align_buffer_page_end(dst_argb_opt, kStrideB* kHeight + OFF); \
1251*4e366538SXin Li for (int i = 0; i < kWidth * kHeight; ++i) { \
1252*4e366538SXin Li src_y[i + OFF] = (fastrand() & 0xff); \
1253*4e366538SXin Li } \
1254*4e366538SXin Li for (int i = 0; i < kSizeUV; ++i) { \
1255*4e366538SXin Li src_u[i + OFF] = (fastrand() & 0xff); \
1256*4e366538SXin Li src_v[i + OFF] = (fastrand() & 0xff); \
1257*4e366538SXin Li } \
1258*4e366538SXin Li memset(dst_argb_c + OFF, 1, kStrideB * kHeight); \
1259*4e366538SXin Li memset(dst_argb_opt + OFF, 101, kStrideB * kHeight); \
1260*4e366538SXin Li MaskCpuFlags(disable_cpu_flags_); \
1261*4e366538SXin Li FMT_PLANAR##To##FMT_B##Dither(src_y + OFF, kWidth, src_u + OFF, kStrideUV, \
1262*4e366538SXin Li src_v + OFF, kStrideUV, dst_argb_c + OFF, \
1263*4e366538SXin Li kStrideB, NULL, kWidth, NEG kHeight); \
1264*4e366538SXin Li MaskCpuFlags(benchmark_cpu_info_); \
1265*4e366538SXin Li for (int i = 0; i < benchmark_iterations_; ++i) { \
1266*4e366538SXin Li FMT_PLANAR##To##FMT_B##Dither( \
1267*4e366538SXin Li src_y + OFF, kWidth, src_u + OFF, kStrideUV, src_v + OFF, kStrideUV, \
1268*4e366538SXin Li dst_argb_opt + OFF, kStrideB, NULL, kWidth, NEG kHeight); \
1269*4e366538SXin Li } \
1270*4e366538SXin Li /* Convert to ARGB so 565 is expanded to bytes that can be compared. */ \
1271*4e366538SXin Li align_buffer_page_end(dst_argb32_c, kWidth* BPP_C* kHeight); \
1272*4e366538SXin Li align_buffer_page_end(dst_argb32_opt, kWidth* BPP_C* kHeight); \
1273*4e366538SXin Li memset(dst_argb32_c, 2, kWidth* BPP_C* kHeight); \
1274*4e366538SXin Li memset(dst_argb32_opt, 102, kWidth* BPP_C* kHeight); \
1275*4e366538SXin Li FMT_B##To##FMT_C(dst_argb_c + OFF, kStrideB, dst_argb32_c, kWidth * BPP_C, \
1276*4e366538SXin Li kWidth, kHeight); \
1277*4e366538SXin Li FMT_B##To##FMT_C(dst_argb_opt + OFF, kStrideB, dst_argb32_opt, \
1278*4e366538SXin Li kWidth * BPP_C, kWidth, kHeight); \
1279*4e366538SXin Li for (int i = 0; i < kWidth * BPP_C * kHeight; ++i) { \
1280*4e366538SXin Li EXPECT_EQ(dst_argb32_c[i], dst_argb32_opt[i]); \
1281*4e366538SXin Li } \
1282*4e366538SXin Li free_aligned_buffer_page_end(src_y); \
1283*4e366538SXin Li free_aligned_buffer_page_end(src_u); \
1284*4e366538SXin Li free_aligned_buffer_page_end(src_v); \
1285*4e366538SXin Li free_aligned_buffer_page_end(dst_argb_c); \
1286*4e366538SXin Li free_aligned_buffer_page_end(dst_argb_opt); \
1287*4e366538SXin Li free_aligned_buffer_page_end(dst_argb32_c); \
1288*4e366538SXin Li free_aligned_buffer_page_end(dst_argb32_opt); \
1289*4e366538SXin Li }
1290*4e366538SXin Li
1291*4e366538SXin Li #if defined(ENABLE_FULL_TESTS)
1292*4e366538SXin Li #define TESTPLANARTOBD(FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y, FMT_B, BPP_B, ALIGN, \
1293*4e366538SXin Li YALIGN, FMT_C, BPP_C) \
1294*4e366538SXin Li TESTPLANARTOBID(FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y, FMT_B, BPP_B, ALIGN, \
1295*4e366538SXin Li YALIGN, benchmark_width_ + 1, _Any, +, 0, FMT_C, BPP_C) \
1296*4e366538SXin Li TESTPLANARTOBID(FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y, FMT_B, BPP_B, ALIGN, \
1297*4e366538SXin Li YALIGN, benchmark_width_, _Unaligned, +, 2, FMT_C, BPP_C) \
1298*4e366538SXin Li TESTPLANARTOBID(FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y, FMT_B, BPP_B, ALIGN, \
1299*4e366538SXin Li YALIGN, benchmark_width_, _Invert, -, 0, FMT_C, BPP_C) \
1300*4e366538SXin Li TESTPLANARTOBID(FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y, FMT_B, BPP_B, ALIGN, \
1301*4e366538SXin Li YALIGN, benchmark_width_, _Opt, +, 0, FMT_C, BPP_C)
1302*4e366538SXin Li #else
1303*4e366538SXin Li #define TESTPLANARTOBD(FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y, FMT_B, BPP_B, ALIGN, \
1304*4e366538SXin Li YALIGN, FMT_C, BPP_C) \
1305*4e366538SXin Li TESTPLANARTOBID(FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y, FMT_B, BPP_B, ALIGN, \
1306*4e366538SXin Li YALIGN, benchmark_width_, _Opt, +, 0, FMT_C, BPP_C)
1307*4e366538SXin Li #endif
1308*4e366538SXin Li
1309*4e366538SXin Li #ifdef LITTLE_ENDIAN_ONLY_TEST
1310*4e366538SXin Li TESTPLANARTOBD(I420, 2, 2, RGB565, 2, 2, 1, ARGB, 4)
1311*4e366538SXin Li #endif
1312*4e366538SXin Li
1313*4e366538SXin Li // Transitive test. A to B to C is same as A to C.
1314*4e366538SXin Li // Benchmarks A To B to C for comparison to 1 step, benchmarked elsewhere.
1315*4e366538SXin Li #define TESTPLANARTOEI(FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y, FMT_B, SUB_B, BPP_B, \
1316*4e366538SXin Li W1280, N, NEG, OFF, FMT_C, BPP_C) \
1317*4e366538SXin Li TEST_F(LibYUVConvertTest, FMT_PLANAR##To##FMT_B##To##FMT_C##N) { \
1318*4e366538SXin Li const int kWidth = W1280; \
1319*4e366538SXin Li const int kHeight = benchmark_height_; \
1320*4e366538SXin Li const int kStrideB = SUBSAMPLE(kWidth, SUB_B) * BPP_B; \
1321*4e366538SXin Li const int kStrideUV = SUBSAMPLE(kWidth, SUBSAMP_X); \
1322*4e366538SXin Li const int kSizeUV = kStrideUV * SUBSAMPLE(kHeight, SUBSAMP_Y); \
1323*4e366538SXin Li align_buffer_page_end(src_y, kWidth* kHeight + OFF); \
1324*4e366538SXin Li align_buffer_page_end(src_u, kSizeUV + OFF); \
1325*4e366538SXin Li align_buffer_page_end(src_v, kSizeUV + OFF); \
1326*4e366538SXin Li align_buffer_page_end(dst_argb_b, kStrideB* kHeight + OFF); \
1327*4e366538SXin Li for (int i = 0; i < kWidth * kHeight; ++i) { \
1328*4e366538SXin Li src_y[i + OFF] = (fastrand() & 0xff); \
1329*4e366538SXin Li } \
1330*4e366538SXin Li for (int i = 0; i < kSizeUV; ++i) { \
1331*4e366538SXin Li src_u[i + OFF] = (fastrand() & 0xff); \
1332*4e366538SXin Li src_v[i + OFF] = (fastrand() & 0xff); \
1333*4e366538SXin Li } \
1334*4e366538SXin Li memset(dst_argb_b + OFF, 1, kStrideB * kHeight); \
1335*4e366538SXin Li FMT_PLANAR##To##FMT_B(src_y + OFF, kWidth, src_u + OFF, kStrideUV, \
1336*4e366538SXin Li src_v + OFF, kStrideUV, dst_argb_b + OFF, kStrideB, \
1337*4e366538SXin Li kWidth, NEG kHeight); \
1338*4e366538SXin Li /* Convert to a 3rd format in 1 step and 2 steps and compare */ \
1339*4e366538SXin Li const int kStrideC = kWidth * BPP_C; \
1340*4e366538SXin Li align_buffer_page_end(dst_argb_c, kStrideC* kHeight + OFF); \
1341*4e366538SXin Li align_buffer_page_end(dst_argb_bc, kStrideC* kHeight + OFF); \
1342*4e366538SXin Li memset(dst_argb_c + OFF, 2, kStrideC * kHeight); \
1343*4e366538SXin Li memset(dst_argb_bc + OFF, 3, kStrideC * kHeight); \
1344*4e366538SXin Li for (int i = 0; i < benchmark_iterations_; ++i) { \
1345*4e366538SXin Li FMT_PLANAR##To##FMT_C(src_y + OFF, kWidth, src_u + OFF, kStrideUV, \
1346*4e366538SXin Li src_v + OFF, kStrideUV, dst_argb_c + OFF, \
1347*4e366538SXin Li kStrideC, kWidth, NEG kHeight); \
1348*4e366538SXin Li /* Convert B to C */ \
1349*4e366538SXin Li FMT_B##To##FMT_C(dst_argb_b + OFF, kStrideB, dst_argb_bc + OFF, \
1350*4e366538SXin Li kStrideC, kWidth, kHeight); \
1351*4e366538SXin Li } \
1352*4e366538SXin Li for (int i = 0; i < kStrideC * kHeight; ++i) { \
1353*4e366538SXin Li EXPECT_EQ(dst_argb_c[i + OFF], dst_argb_bc[i + OFF]); \
1354*4e366538SXin Li } \
1355*4e366538SXin Li free_aligned_buffer_page_end(src_y); \
1356*4e366538SXin Li free_aligned_buffer_page_end(src_u); \
1357*4e366538SXin Li free_aligned_buffer_page_end(src_v); \
1358*4e366538SXin Li free_aligned_buffer_page_end(dst_argb_b); \
1359*4e366538SXin Li free_aligned_buffer_page_end(dst_argb_c); \
1360*4e366538SXin Li free_aligned_buffer_page_end(dst_argb_bc); \
1361*4e366538SXin Li }
1362*4e366538SXin Li
1363*4e366538SXin Li #if defined(ENABLE_FULL_TESTS)
1364*4e366538SXin Li #define TESTPLANARTOE(FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y, FMT_B, SUB_B, BPP_B, \
1365*4e366538SXin Li FMT_C, BPP_C) \
1366*4e366538SXin Li TESTPLANARTOEI(FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y, FMT_B, SUB_B, BPP_B, \
1367*4e366538SXin Li benchmark_width_ + 1, _Any, +, 0, FMT_C, BPP_C) \
1368*4e366538SXin Li TESTPLANARTOEI(FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y, FMT_B, SUB_B, BPP_B, \
1369*4e366538SXin Li benchmark_width_, _Unaligned, +, 2, FMT_C, BPP_C) \
1370*4e366538SXin Li TESTPLANARTOEI(FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y, FMT_B, SUB_B, BPP_B, \
1371*4e366538SXin Li benchmark_width_, _Invert, -, 0, FMT_C, BPP_C) \
1372*4e366538SXin Li TESTPLANARTOEI(FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y, FMT_B, SUB_B, BPP_B, \
1373*4e366538SXin Li benchmark_width_, _Opt, +, 0, FMT_C, BPP_C)
1374*4e366538SXin Li #else
1375*4e366538SXin Li #define TESTPLANARTOE(FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y, FMT_B, SUB_B, BPP_B, \
1376*4e366538SXin Li FMT_C, BPP_C) \
1377*4e366538SXin Li TESTPLANARTOEI(FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y, FMT_B, SUB_B, BPP_B, \
1378*4e366538SXin Li benchmark_width_, _Opt, +, 0, FMT_C, BPP_C)
1379*4e366538SXin Li #endif
1380*4e366538SXin Li
1381*4e366538SXin Li #if defined(ENABLE_FULL_TESTS)
1382*4e366538SXin Li TESTPLANARTOE(I420, 2, 2, ABGR, 1, 4, ARGB, 4)
1383*4e366538SXin Li TESTPLANARTOE(I420, 2, 2, ARGB, 1, 4, ABGR, 4)
1384*4e366538SXin Li TESTPLANARTOE(I420, 2, 2, ARGB, 1, 4, RAW, 3)
1385*4e366538SXin Li TESTPLANARTOE(I420, 2, 2, ARGB, 1, 4, RGB24, 3)
1386*4e366538SXin Li TESTPLANARTOE(I420, 2, 2, BGRA, 1, 4, ARGB, 4)
1387*4e366538SXin Li TESTPLANARTOE(I420, 2, 2, RAW, 1, 3, ARGB, 4)
1388*4e366538SXin Li TESTPLANARTOE(I420, 2, 2, RAW, 1, 3, RGB24, 3)
1389*4e366538SXin Li TESTPLANARTOE(I420, 2, 2, RGB24, 1, 3, ARGB, 4)
1390*4e366538SXin Li TESTPLANARTOE(I420, 2, 2, RGB24, 1, 3, RAW, 3)
1391*4e366538SXin Li TESTPLANARTOE(I420, 2, 2, RGBA, 1, 4, ARGB, 4)
1392*4e366538SXin Li TESTPLANARTOE(H420, 2, 2, ABGR, 1, 4, ARGB, 4)
1393*4e366538SXin Li TESTPLANARTOE(H420, 2, 2, ARGB, 1, 4, ABGR, 4)
1394*4e366538SXin Li TESTPLANARTOE(H420, 2, 2, ARGB, 1, 4, RAW, 3)
1395*4e366538SXin Li TESTPLANARTOE(H420, 2, 2, ARGB, 1, 4, RGB24, 3)
1396*4e366538SXin Li TESTPLANARTOE(H420, 2, 2, RAW, 1, 3, ARGB, 4)
1397*4e366538SXin Li TESTPLANARTOE(H420, 2, 2, RAW, 1, 3, RGB24, 3)
1398*4e366538SXin Li TESTPLANARTOE(H420, 2, 2, RGB24, 1, 3, ARGB, 4)
1399*4e366538SXin Li TESTPLANARTOE(H420, 2, 2, RGB24, 1, 3, RAW, 3)
1400*4e366538SXin Li TESTPLANARTOE(J420, 2, 2, ABGR, 1, 4, ARGB, 4)
1401*4e366538SXin Li TESTPLANARTOE(J420, 2, 2, ARGB, 1, 4, ARGB, 4)
1402*4e366538SXin Li TESTPLANARTOE(U420, 2, 2, ABGR, 1, 4, ARGB, 4)
1403*4e366538SXin Li TESTPLANARTOE(U420, 2, 2, ARGB, 1, 4, ARGB, 4)
1404*4e366538SXin Li #ifdef LITTLE_ENDIAN_ONLY_TEST
1405*4e366538SXin Li TESTPLANARTOE(I420, 2, 2, ARGB, 1, 4, RGB565, 2)
1406*4e366538SXin Li TESTPLANARTOE(I420, 2, 2, ARGB, 1, 4, ARGB1555, 2)
1407*4e366538SXin Li TESTPLANARTOE(I420, 2, 2, ARGB, 1, 4, ARGB4444, 2)
1408*4e366538SXin Li TESTPLANARTOE(I422, 2, 1, ARGB, 1, 4, RGB565, 2)
1409*4e366538SXin Li #endif
1410*4e366538SXin Li TESTPLANARTOE(I422, 2, 1, ARGB, 1, 4, ABGR, 4)
1411*4e366538SXin Li TESTPLANARTOE(I422, 2, 1, ABGR, 1, 4, ARGB, 4)
1412*4e366538SXin Li TESTPLANARTOE(J422, 2, 1, ARGB, 1, 4, ARGB, 4)
1413*4e366538SXin Li TESTPLANARTOE(J422, 2, 1, ABGR, 1, 4, ARGB, 4)
1414*4e366538SXin Li TESTPLANARTOE(H422, 2, 1, ARGB, 1, 4, ARGB, 4)
1415*4e366538SXin Li TESTPLANARTOE(H422, 2, 1, ABGR, 1, 4, ARGB, 4)
1416*4e366538SXin Li TESTPLANARTOE(U422, 2, 1, ARGB, 1, 4, ARGB, 4)
1417*4e366538SXin Li TESTPLANARTOE(U422, 2, 1, ABGR, 1, 4, ARGB, 4)
1418*4e366538SXin Li TESTPLANARTOE(V422, 2, 1, ARGB, 1, 4, ARGB, 4)
1419*4e366538SXin Li TESTPLANARTOE(V422, 2, 1, ABGR, 1, 4, ARGB, 4)
1420*4e366538SXin Li TESTPLANARTOE(I422, 2, 1, BGRA, 1, 4, ARGB, 4)
1421*4e366538SXin Li TESTPLANARTOE(I422, 2, 1, RGBA, 1, 4, ARGB, 4)
1422*4e366538SXin Li TESTPLANARTOE(I444, 1, 1, ARGB, 1, 4, ABGR, 4)
1423*4e366538SXin Li TESTPLANARTOE(I444, 1, 1, ABGR, 1, 4, ARGB, 4)
1424*4e366538SXin Li TESTPLANARTOE(J444, 1, 1, ARGB, 1, 4, ARGB, 4)
1425*4e366538SXin Li TESTPLANARTOE(J444, 1, 1, ABGR, 1, 4, ARGB, 4)
1426*4e366538SXin Li TESTPLANARTOE(H444, 1, 1, ARGB, 1, 4, ARGB, 4)
1427*4e366538SXin Li TESTPLANARTOE(H444, 1, 1, ABGR, 1, 4, ARGB, 4)
1428*4e366538SXin Li TESTPLANARTOE(U444, 1, 1, ARGB, 1, 4, ARGB, 4)
1429*4e366538SXin Li TESTPLANARTOE(U444, 1, 1, ABGR, 1, 4, ARGB, 4)
1430*4e366538SXin Li TESTPLANARTOE(V444, 1, 1, ARGB, 1, 4, ARGB, 4)
1431*4e366538SXin Li TESTPLANARTOE(V444, 1, 1, ABGR, 1, 4, ARGB, 4)
1432*4e366538SXin Li TESTPLANARTOE(I420, 2, 2, YUY2, 2, 4, ARGB, 4)
1433*4e366538SXin Li TESTPLANARTOE(I420, 2, 2, UYVY, 2, 4, ARGB, 4)
1434*4e366538SXin Li TESTPLANARTOE(I422, 2, 1, YUY2, 2, 4, ARGB, 4)
1435*4e366538SXin Li TESTPLANARTOE(I422, 2, 1, UYVY, 2, 4, ARGB, 4)
1436*4e366538SXin Li #else
1437*4e366538SXin Li TESTPLANARTOE(I420, 2, 2, ABGR, 1, 4, ARGB, 4)
1438*4e366538SXin Li TESTPLANARTOE(I420, 2, 2, ARGB, 1, 4, ARGB1555, 2)
1439*4e366538SXin Li TESTPLANARTOE(I420, 2, 2, ARGB, 1, 4, ARGB4444, 2)
1440*4e366538SXin Li TESTPLANARTOE(I420, 2, 2, ARGB, 1, 4, RAW, 3)
1441*4e366538SXin Li TESTPLANARTOE(I420, 2, 2, ARGB, 1, 4, RGB24, 3)
1442*4e366538SXin Li TESTPLANARTOE(I420, 2, 2, ARGB, 1, 4, RGB565, 2)
1443*4e366538SXin Li TESTPLANARTOE(I420, 2, 2, BGRA, 1, 4, ARGB, 4)
1444*4e366538SXin Li TESTPLANARTOE(I420, 2, 2, RAW, 1, 3, ARGB, 4)
1445*4e366538SXin Li TESTPLANARTOE(I420, 2, 2, RAW, 1, 3, RGB24, 3)
1446*4e366538SXin Li TESTPLANARTOE(I420, 2, 2, RGB24, 1, 3, ARGB, 4)
1447*4e366538SXin Li TESTPLANARTOE(I420, 2, 2, RGB24, 1, 3, RAW, 3)
1448*4e366538SXin Li TESTPLANARTOE(I420, 2, 2, RGBA, 1, 4, ARGB, 4)
1449*4e366538SXin Li TESTPLANARTOE(I420, 2, 2, UYVY, 2, 4, ARGB, 4)
1450*4e366538SXin Li TESTPLANARTOE(I420, 2, 2, YUY2, 2, 4, ARGB, 4)
1451*4e366538SXin Li TESTPLANARTOE(I422, 2, 1, ABGR, 1, 4, ARGB, 4)
1452*4e366538SXin Li TESTPLANARTOE(I422, 2, 1, ARGB, 1, 4, RGB565, 2)
1453*4e366538SXin Li TESTPLANARTOE(I422, 2, 1, BGRA, 1, 4, ARGB, 4)
1454*4e366538SXin Li TESTPLANARTOE(I422, 2, 1, RGBA, 1, 4, ARGB, 4)
1455*4e366538SXin Li TESTPLANARTOE(I422, 2, 1, UYVY, 2, 4, ARGB, 4)
1456*4e366538SXin Li TESTPLANARTOE(I422, 2, 1, YUY2, 2, 4, ARGB, 4)
1457*4e366538SXin Li TESTPLANARTOE(I444, 1, 1, ABGR, 1, 4, ARGB, 4)
1458*4e366538SXin Li #endif
1459*4e366538SXin Li
1460*4e366538SXin Li // Transitive test: Compare 1 step vs 2 step conversion for YUVA to ARGB.
1461*4e366538SXin Li // Benchmark 2 step conversion for comparison to 1 step conversion.
1462*4e366538SXin Li #define TESTQPLANARTOEI(FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y, FMT_B, SUB_B, BPP_B, \
1463*4e366538SXin Li W1280, N, NEG, OFF, FMT_C, BPP_C, ATTEN) \
1464*4e366538SXin Li TEST_F(LibYUVConvertTest, FMT_PLANAR##To##FMT_B##To##FMT_C##N) { \
1465*4e366538SXin Li const int kWidth = W1280; \
1466*4e366538SXin Li const int kHeight = benchmark_height_; \
1467*4e366538SXin Li const int kStrideB = SUBSAMPLE(kWidth, SUB_B) * BPP_B; \
1468*4e366538SXin Li const int kSizeUV = \
1469*4e366538SXin Li SUBSAMPLE(kWidth, SUBSAMP_X) * SUBSAMPLE(kHeight, SUBSAMP_Y); \
1470*4e366538SXin Li align_buffer_page_end(src_y, kWidth* kHeight + OFF); \
1471*4e366538SXin Li align_buffer_page_end(src_u, kSizeUV + OFF); \
1472*4e366538SXin Li align_buffer_page_end(src_v, kSizeUV + OFF); \
1473*4e366538SXin Li align_buffer_page_end(src_a, kWidth* kHeight + OFF); \
1474*4e366538SXin Li align_buffer_page_end(dst_argb_b, kStrideB* kHeight + OFF); \
1475*4e366538SXin Li const int kStrideC = kWidth * BPP_C; \
1476*4e366538SXin Li align_buffer_page_end(dst_argb_c, kStrideC* kHeight + OFF); \
1477*4e366538SXin Li align_buffer_page_end(dst_argb_bc, kStrideC* kHeight + OFF); \
1478*4e366538SXin Li memset(dst_argb_c + OFF, 2, kStrideC * kHeight); \
1479*4e366538SXin Li memset(dst_argb_b + OFF, 1, kStrideB * kHeight); \
1480*4e366538SXin Li memset(dst_argb_bc + OFF, 3, kStrideC * kHeight); \
1481*4e366538SXin Li for (int i = 0; i < kWidth * kHeight; ++i) { \
1482*4e366538SXin Li src_y[i + OFF] = (fastrand() & 0xff); \
1483*4e366538SXin Li src_a[i + OFF] = (fastrand() & 0xff); \
1484*4e366538SXin Li } \
1485*4e366538SXin Li for (int i = 0; i < kSizeUV; ++i) { \
1486*4e366538SXin Li src_u[i + OFF] = (fastrand() & 0xff); \
1487*4e366538SXin Li src_v[i + OFF] = (fastrand() & 0xff); \
1488*4e366538SXin Li } \
1489*4e366538SXin Li for (int i = 0; i < benchmark_iterations_; ++i) { \
1490*4e366538SXin Li /* Convert A to B */ \
1491*4e366538SXin Li FMT_PLANAR##To##FMT_B( \
1492*4e366538SXin Li src_y + OFF, kWidth, src_u + OFF, SUBSAMPLE(kWidth, SUBSAMP_X), \
1493*4e366538SXin Li src_v + OFF, SUBSAMPLE(kWidth, SUBSAMP_X), src_a + OFF, kWidth, \
1494*4e366538SXin Li dst_argb_b + OFF, kStrideB, kWidth, NEG kHeight, ATTEN); \
1495*4e366538SXin Li /* Convert B to C */ \
1496*4e366538SXin Li FMT_B##To##FMT_C(dst_argb_b + OFF, kStrideB, dst_argb_bc + OFF, \
1497*4e366538SXin Li kStrideC, kWidth, kHeight); \
1498*4e366538SXin Li } \
1499*4e366538SXin Li /* Convert A to C */ \
1500*4e366538SXin Li FMT_PLANAR##To##FMT_C( \
1501*4e366538SXin Li src_y + OFF, kWidth, src_u + OFF, SUBSAMPLE(kWidth, SUBSAMP_X), \
1502*4e366538SXin Li src_v + OFF, SUBSAMPLE(kWidth, SUBSAMP_X), src_a + OFF, kWidth, \
1503*4e366538SXin Li dst_argb_c + OFF, kStrideC, kWidth, NEG kHeight, ATTEN); \
1504*4e366538SXin Li for (int i = 0; i < kStrideC * kHeight; ++i) { \
1505*4e366538SXin Li EXPECT_EQ(dst_argb_c[i + OFF], dst_argb_bc[i + OFF]); \
1506*4e366538SXin Li } \
1507*4e366538SXin Li free_aligned_buffer_page_end(src_y); \
1508*4e366538SXin Li free_aligned_buffer_page_end(src_u); \
1509*4e366538SXin Li free_aligned_buffer_page_end(src_v); \
1510*4e366538SXin Li free_aligned_buffer_page_end(src_a); \
1511*4e366538SXin Li free_aligned_buffer_page_end(dst_argb_b); \
1512*4e366538SXin Li free_aligned_buffer_page_end(dst_argb_c); \
1513*4e366538SXin Li free_aligned_buffer_page_end(dst_argb_bc); \
1514*4e366538SXin Li }
1515*4e366538SXin Li
1516*4e366538SXin Li #if defined(ENABLE_FULL_TESTS)
1517*4e366538SXin Li #define TESTQPLANARTOE(FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y, FMT_B, SUB_B, BPP_B, \
1518*4e366538SXin Li FMT_C, BPP_C) \
1519*4e366538SXin Li TESTQPLANARTOEI(FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y, FMT_B, SUB_B, BPP_B, \
1520*4e366538SXin Li benchmark_width_ + 1, _Any, +, 0, FMT_C, BPP_C, 0) \
1521*4e366538SXin Li TESTQPLANARTOEI(FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y, FMT_B, SUB_B, BPP_B, \
1522*4e366538SXin Li benchmark_width_, _Unaligned, +, 2, FMT_C, BPP_C, 0) \
1523*4e366538SXin Li TESTQPLANARTOEI(FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y, FMT_B, SUB_B, BPP_B, \
1524*4e366538SXin Li benchmark_width_, _Invert, -, 0, FMT_C, BPP_C, 0) \
1525*4e366538SXin Li TESTQPLANARTOEI(FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y, FMT_B, SUB_B, BPP_B, \
1526*4e366538SXin Li benchmark_width_, _Opt, +, 0, FMT_C, BPP_C, 0) \
1527*4e366538SXin Li TESTQPLANARTOEI(FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y, FMT_B, SUB_B, BPP_B, \
1528*4e366538SXin Li benchmark_width_, _Premult, +, 0, FMT_C, BPP_C, 1)
1529*4e366538SXin Li #else
1530*4e366538SXin Li #define TESTQPLANARTOE(FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y, FMT_B, SUB_B, BPP_B, \
1531*4e366538SXin Li FMT_C, BPP_C) \
1532*4e366538SXin Li TESTQPLANARTOEI(FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y, FMT_B, SUB_B, BPP_B, \
1533*4e366538SXin Li benchmark_width_, _Opt, +, 0, FMT_C, BPP_C, 0)
1534*4e366538SXin Li #endif
1535*4e366538SXin Li
1536*4e366538SXin Li #if defined(ENABLE_FULL_TESTS)
1537*4e366538SXin Li TESTQPLANARTOE(I420Alpha, 2, 2, ARGB, 1, 4, ABGR, 4)
1538*4e366538SXin Li TESTQPLANARTOE(I420Alpha, 2, 2, ABGR, 1, 4, ARGB, 4)
1539*4e366538SXin Li TESTQPLANARTOE(J420Alpha, 2, 2, ARGB, 1, 4, ABGR, 4)
1540*4e366538SXin Li TESTQPLANARTOE(J420Alpha, 2, 2, ABGR, 1, 4, ARGB, 4)
1541*4e366538SXin Li TESTQPLANARTOE(H420Alpha, 2, 2, ARGB, 1, 4, ABGR, 4)
1542*4e366538SXin Li TESTQPLANARTOE(H420Alpha, 2, 2, ABGR, 1, 4, ARGB, 4)
1543*4e366538SXin Li TESTQPLANARTOE(F420Alpha, 2, 2, ARGB, 1, 4, ABGR, 4)
1544*4e366538SXin Li TESTQPLANARTOE(F420Alpha, 2, 2, ABGR, 1, 4, ARGB, 4)
1545*4e366538SXin Li TESTQPLANARTOE(U420Alpha, 2, 2, ARGB, 1, 4, ABGR, 4)
1546*4e366538SXin Li TESTQPLANARTOE(U420Alpha, 2, 2, ABGR, 1, 4, ARGB, 4)
1547*4e366538SXin Li TESTQPLANARTOE(V420Alpha, 2, 2, ARGB, 1, 4, ABGR, 4)
1548*4e366538SXin Li TESTQPLANARTOE(V420Alpha, 2, 2, ABGR, 1, 4, ARGB, 4)
1549*4e366538SXin Li TESTQPLANARTOE(I422Alpha, 2, 1, ARGB, 1, 4, ABGR, 4)
1550*4e366538SXin Li TESTQPLANARTOE(I422Alpha, 2, 1, ABGR, 1, 4, ARGB, 4)
1551*4e366538SXin Li TESTQPLANARTOE(J422Alpha, 2, 1, ARGB, 1, 4, ABGR, 4)
1552*4e366538SXin Li TESTQPLANARTOE(J422Alpha, 2, 1, ABGR, 1, 4, ARGB, 4)
1553*4e366538SXin Li TESTQPLANARTOE(F422Alpha, 2, 1, ARGB, 1, 4, ABGR, 4)
1554*4e366538SXin Li TESTQPLANARTOE(F422Alpha, 2, 1, ABGR, 1, 4, ARGB, 4)
1555*4e366538SXin Li TESTQPLANARTOE(H422Alpha, 2, 1, ARGB, 1, 4, ABGR, 4)
1556*4e366538SXin Li TESTQPLANARTOE(H422Alpha, 2, 1, ABGR, 1, 4, ARGB, 4)
1557*4e366538SXin Li TESTQPLANARTOE(U422Alpha, 2, 1, ARGB, 1, 4, ABGR, 4)
1558*4e366538SXin Li TESTQPLANARTOE(U422Alpha, 2, 1, ABGR, 1, 4, ARGB, 4)
1559*4e366538SXin Li TESTQPLANARTOE(V422Alpha, 2, 1, ARGB, 1, 4, ABGR, 4)
1560*4e366538SXin Li TESTQPLANARTOE(V422Alpha, 2, 1, ABGR, 1, 4, ARGB, 4)
1561*4e366538SXin Li TESTQPLANARTOE(I444Alpha, 1, 1, ARGB, 1, 4, ABGR, 4)
1562*4e366538SXin Li TESTQPLANARTOE(I444Alpha, 1, 1, ABGR, 1, 4, ARGB, 4)
1563*4e366538SXin Li TESTQPLANARTOE(J444Alpha, 1, 1, ARGB, 1, 4, ABGR, 4)
1564*4e366538SXin Li TESTQPLANARTOE(J444Alpha, 1, 1, ABGR, 1, 4, ARGB, 4)
1565*4e366538SXin Li TESTQPLANARTOE(H444Alpha, 1, 1, ARGB, 1, 4, ABGR, 4)
1566*4e366538SXin Li TESTQPLANARTOE(H444Alpha, 1, 1, ABGR, 1, 4, ARGB, 4)
1567*4e366538SXin Li TESTQPLANARTOE(U444Alpha, 1, 1, ARGB, 1, 4, ABGR, 4)
1568*4e366538SXin Li TESTQPLANARTOE(U444Alpha, 1, 1, ABGR, 1, 4, ARGB, 4)
1569*4e366538SXin Li TESTQPLANARTOE(V444Alpha, 1, 1, ARGB, 1, 4, ABGR, 4)
1570*4e366538SXin Li TESTQPLANARTOE(V444Alpha, 1, 1, ABGR, 1, 4, ARGB, 4)
1571*4e366538SXin Li #else
1572*4e366538SXin Li TESTQPLANARTOE(I420Alpha, 2, 2, ABGR, 1, 4, ARGB, 4)
1573*4e366538SXin Li TESTQPLANARTOE(I422Alpha, 2, 1, ABGR, 1, 4, ARGB, 4)
1574*4e366538SXin Li TESTQPLANARTOE(I444Alpha, 1, 1, ABGR, 1, 4, ARGB, 4)
1575*4e366538SXin Li #endif
1576*4e366538SXin Li
1577*4e366538SXin Li #define TESTPLANETOEI(FMT_A, SUB_A, BPP_A, FMT_B, SUB_B, BPP_B, W1280, N, NEG, \
1578*4e366538SXin Li OFF, FMT_C, BPP_C) \
1579*4e366538SXin Li TEST_F(LibYUVConvertTest, FMT_A##To##FMT_B##To##FMT_C##N) { \
1580*4e366538SXin Li const int kWidth = W1280; \
1581*4e366538SXin Li const int kHeight = benchmark_height_; \
1582*4e366538SXin Li const int kStrideA = SUBSAMPLE(kWidth, SUB_A) * BPP_A; \
1583*4e366538SXin Li const int kStrideB = SUBSAMPLE(kWidth, SUB_B) * BPP_B; \
1584*4e366538SXin Li align_buffer_page_end(src_argb_a, kStrideA* kHeight + OFF); \
1585*4e366538SXin Li align_buffer_page_end(dst_argb_b, kStrideB* kHeight + OFF); \
1586*4e366538SXin Li MemRandomize(src_argb_a + OFF, kStrideA * kHeight); \
1587*4e366538SXin Li memset(dst_argb_b + OFF, 1, kStrideB * kHeight); \
1588*4e366538SXin Li FMT_A##To##FMT_B(src_argb_a + OFF, kStrideA, dst_argb_b + OFF, kStrideB, \
1589*4e366538SXin Li kWidth, NEG kHeight); \
1590*4e366538SXin Li /* Convert to a 3rd format in 1 step and 2 steps and compare */ \
1591*4e366538SXin Li const int kStrideC = kWidth * BPP_C; \
1592*4e366538SXin Li align_buffer_page_end(dst_argb_c, kStrideC* kHeight + OFF); \
1593*4e366538SXin Li align_buffer_page_end(dst_argb_bc, kStrideC* kHeight + OFF); \
1594*4e366538SXin Li memset(dst_argb_c + OFF, 2, kStrideC * kHeight); \
1595*4e366538SXin Li memset(dst_argb_bc + OFF, 3, kStrideC * kHeight); \
1596*4e366538SXin Li for (int i = 0; i < benchmark_iterations_; ++i) { \
1597*4e366538SXin Li FMT_A##To##FMT_C(src_argb_a + OFF, kStrideA, dst_argb_c + OFF, kStrideC, \
1598*4e366538SXin Li kWidth, NEG kHeight); \
1599*4e366538SXin Li /* Convert B to C */ \
1600*4e366538SXin Li FMT_B##To##FMT_C(dst_argb_b + OFF, kStrideB, dst_argb_bc + OFF, \
1601*4e366538SXin Li kStrideC, kWidth, kHeight); \
1602*4e366538SXin Li } \
1603*4e366538SXin Li for (int i = 0; i < kStrideC * kHeight; i += 4) { \
1604*4e366538SXin Li EXPECT_EQ(dst_argb_c[i + OFF + 0], dst_argb_bc[i + OFF + 0]); \
1605*4e366538SXin Li EXPECT_EQ(dst_argb_c[i + OFF + 1], dst_argb_bc[i + OFF + 1]); \
1606*4e366538SXin Li EXPECT_EQ(dst_argb_c[i + OFF + 2], dst_argb_bc[i + OFF + 2]); \
1607*4e366538SXin Li EXPECT_NEAR(dst_argb_c[i + OFF + 3], dst_argb_bc[i + OFF + 3], 64); \
1608*4e366538SXin Li } \
1609*4e366538SXin Li free_aligned_buffer_page_end(src_argb_a); \
1610*4e366538SXin Li free_aligned_buffer_page_end(dst_argb_b); \
1611*4e366538SXin Li free_aligned_buffer_page_end(dst_argb_c); \
1612*4e366538SXin Li free_aligned_buffer_page_end(dst_argb_bc); \
1613*4e366538SXin Li }
1614*4e366538SXin Li
1615*4e366538SXin Li #if defined(ENABLE_FULL_TESTS)
1616*4e366538SXin Li #define TESTPLANETOE(FMT_A, SUB_A, BPP_A, FMT_B, SUB_B, BPP_B, FMT_C, BPP_C) \
1617*4e366538SXin Li TESTPLANETOEI(FMT_A, SUB_A, BPP_A, FMT_B, SUB_B, BPP_B, \
1618*4e366538SXin Li benchmark_width_ + 1, _Any, +, 0, FMT_C, BPP_C) \
1619*4e366538SXin Li TESTPLANETOEI(FMT_A, SUB_A, BPP_A, FMT_B, SUB_B, BPP_B, benchmark_width_, \
1620*4e366538SXin Li _Unaligned, +, 4, FMT_C, BPP_C) \
1621*4e366538SXin Li TESTPLANETOEI(FMT_A, SUB_A, BPP_A, FMT_B, SUB_B, BPP_B, benchmark_width_, \
1622*4e366538SXin Li _Invert, -, 0, FMT_C, BPP_C) \
1623*4e366538SXin Li TESTPLANETOEI(FMT_A, SUB_A, BPP_A, FMT_B, SUB_B, BPP_B, benchmark_width_, \
1624*4e366538SXin Li _Opt, +, 0, FMT_C, BPP_C)
1625*4e366538SXin Li #else
1626*4e366538SXin Li #define TESTPLANETOE(FMT_A, SUB_A, BPP_A, FMT_B, SUB_B, BPP_B, FMT_C, BPP_C) \
1627*4e366538SXin Li TESTPLANETOEI(FMT_A, SUB_A, BPP_A, FMT_B, SUB_B, BPP_B, benchmark_width_, \
1628*4e366538SXin Li _Opt, +, 0, FMT_C, BPP_C)
1629*4e366538SXin Li #endif
1630*4e366538SXin Li
1631*4e366538SXin Li // Caveat: Destination needs to be 4 bytes
1632*4e366538SXin Li #ifdef LITTLE_ENDIAN_ONLY_TEST
1633*4e366538SXin Li TESTPLANETOE(ARGB, 1, 4, AR30, 1, 4, ARGB, 4)
1634*4e366538SXin Li TESTPLANETOE(ABGR, 1, 4, AR30, 1, 4, ABGR, 4)
1635*4e366538SXin Li TESTPLANETOE(AR30, 1, 4, ARGB, 1, 4, ABGR, 4)
1636*4e366538SXin Li TESTPLANETOE(AR30, 1, 4, ABGR, 1, 4, ARGB, 4)
1637*4e366538SXin Li TESTPLANETOE(ARGB, 1, 4, AB30, 1, 4, ARGB, 4)
1638*4e366538SXin Li TESTPLANETOE(ABGR, 1, 4, AB30, 1, 4, ABGR, 4)
1639*4e366538SXin Li TESTPLANETOE(AB30, 1, 4, ARGB, 1, 4, ABGR, 4)
1640*4e366538SXin Li TESTPLANETOE(AB30, 1, 4, ABGR, 1, 4, ARGB, 4)
1641*4e366538SXin Li #endif
1642*4e366538SXin Li
TEST_F(LibYUVConvertTest,RotateWithARGBSource)1643*4e366538SXin Li TEST_F(LibYUVConvertTest, RotateWithARGBSource) {
1644*4e366538SXin Li // 2x2 frames
1645*4e366538SXin Li uint32_t src[4];
1646*4e366538SXin Li uint32_t dst[4];
1647*4e366538SXin Li // some random input
1648*4e366538SXin Li src[0] = 0x11000000;
1649*4e366538SXin Li src[1] = 0x00450000;
1650*4e366538SXin Li src[2] = 0x00009f00;
1651*4e366538SXin Li src[3] = 0x000000ff;
1652*4e366538SXin Li // zeros on destination
1653*4e366538SXin Li dst[0] = 0x00000000;
1654*4e366538SXin Li dst[1] = 0x00000000;
1655*4e366538SXin Li dst[2] = 0x00000000;
1656*4e366538SXin Li dst[3] = 0x00000000;
1657*4e366538SXin Li
1658*4e366538SXin Li int r = ConvertToARGB(reinterpret_cast<uint8_t*>(src),
1659*4e366538SXin Li 16, // input size
1660*4e366538SXin Li reinterpret_cast<uint8_t*>(dst),
1661*4e366538SXin Li 8, // destination stride
1662*4e366538SXin Li 0, // crop_x
1663*4e366538SXin Li 0, // crop_y
1664*4e366538SXin Li 2, // width
1665*4e366538SXin Li 2, // height
1666*4e366538SXin Li 2, // crop width
1667*4e366538SXin Li 2, // crop height
1668*4e366538SXin Li kRotate90, FOURCC_ARGB);
1669*4e366538SXin Li
1670*4e366538SXin Li EXPECT_EQ(r, 0);
1671*4e366538SXin Li // 90 degrees rotation, no conversion
1672*4e366538SXin Li EXPECT_EQ(dst[0], src[2]);
1673*4e366538SXin Li EXPECT_EQ(dst[1], src[0]);
1674*4e366538SXin Li EXPECT_EQ(dst[2], src[3]);
1675*4e366538SXin Li EXPECT_EQ(dst[3], src[1]);
1676*4e366538SXin Li }
1677*4e366538SXin Li
1678*4e366538SXin Li #ifdef HAS_ARGBTOAR30ROW_AVX2
TEST_F(LibYUVConvertTest,ARGBToAR30Row_Opt)1679*4e366538SXin Li TEST_F(LibYUVConvertTest, ARGBToAR30Row_Opt) {
1680*4e366538SXin Li // ARGBToAR30Row_AVX2 expects a multiple of 8 pixels.
1681*4e366538SXin Li const int kPixels = (benchmark_width_ * benchmark_height_ + 7) & ~7;
1682*4e366538SXin Li align_buffer_page_end(src, kPixels * 4);
1683*4e366538SXin Li align_buffer_page_end(dst_opt, kPixels * 4);
1684*4e366538SXin Li align_buffer_page_end(dst_c, kPixels * 4);
1685*4e366538SXin Li MemRandomize(src, kPixels * 4);
1686*4e366538SXin Li memset(dst_opt, 0, kPixels * 4);
1687*4e366538SXin Li memset(dst_c, 1, kPixels * 4);
1688*4e366538SXin Li
1689*4e366538SXin Li ARGBToAR30Row_C(src, dst_c, kPixels);
1690*4e366538SXin Li
1691*4e366538SXin Li int has_avx2 = TestCpuFlag(kCpuHasAVX2);
1692*4e366538SXin Li int has_ssse3 = TestCpuFlag(kCpuHasSSSE3);
1693*4e366538SXin Li for (int i = 0; i < benchmark_iterations_; ++i) {
1694*4e366538SXin Li if (has_avx2) {
1695*4e366538SXin Li ARGBToAR30Row_AVX2(src, dst_opt, kPixels);
1696*4e366538SXin Li } else if (has_ssse3) {
1697*4e366538SXin Li ARGBToAR30Row_SSSE3(src, dst_opt, kPixels);
1698*4e366538SXin Li } else {
1699*4e366538SXin Li ARGBToAR30Row_C(src, dst_opt, kPixels);
1700*4e366538SXin Li }
1701*4e366538SXin Li }
1702*4e366538SXin Li for (int i = 0; i < kPixels * 4; ++i) {
1703*4e366538SXin Li EXPECT_EQ(dst_opt[i], dst_c[i]);
1704*4e366538SXin Li }
1705*4e366538SXin Li
1706*4e366538SXin Li free_aligned_buffer_page_end(src);
1707*4e366538SXin Li free_aligned_buffer_page_end(dst_opt);
1708*4e366538SXin Li free_aligned_buffer_page_end(dst_c);
1709*4e366538SXin Li }
1710*4e366538SXin Li #endif // HAS_ARGBTOAR30ROW_AVX2
1711*4e366538SXin Li
1712*4e366538SXin Li #ifdef HAS_ABGRTOAR30ROW_AVX2
TEST_F(LibYUVConvertTest,ABGRToAR30Row_Opt)1713*4e366538SXin Li TEST_F(LibYUVConvertTest, ABGRToAR30Row_Opt) {
1714*4e366538SXin Li // ABGRToAR30Row_AVX2 expects a multiple of 8 pixels.
1715*4e366538SXin Li const int kPixels = (benchmark_width_ * benchmark_height_ + 7) & ~7;
1716*4e366538SXin Li align_buffer_page_end(src, kPixels * 4);
1717*4e366538SXin Li align_buffer_page_end(dst_opt, kPixels * 4);
1718*4e366538SXin Li align_buffer_page_end(dst_c, kPixels * 4);
1719*4e366538SXin Li MemRandomize(src, kPixels * 4);
1720*4e366538SXin Li memset(dst_opt, 0, kPixels * 4);
1721*4e366538SXin Li memset(dst_c, 1, kPixels * 4);
1722*4e366538SXin Li
1723*4e366538SXin Li ABGRToAR30Row_C(src, dst_c, kPixels);
1724*4e366538SXin Li
1725*4e366538SXin Li int has_avx2 = TestCpuFlag(kCpuHasAVX2);
1726*4e366538SXin Li int has_ssse3 = TestCpuFlag(kCpuHasSSSE3);
1727*4e366538SXin Li for (int i = 0; i < benchmark_iterations_; ++i) {
1728*4e366538SXin Li if (has_avx2) {
1729*4e366538SXin Li ABGRToAR30Row_AVX2(src, dst_opt, kPixels);
1730*4e366538SXin Li } else if (has_ssse3) {
1731*4e366538SXin Li ABGRToAR30Row_SSSE3(src, dst_opt, kPixels);
1732*4e366538SXin Li } else {
1733*4e366538SXin Li ABGRToAR30Row_C(src, dst_opt, kPixels);
1734*4e366538SXin Li }
1735*4e366538SXin Li }
1736*4e366538SXin Li for (int i = 0; i < kPixels * 4; ++i) {
1737*4e366538SXin Li EXPECT_EQ(dst_opt[i], dst_c[i]);
1738*4e366538SXin Li }
1739*4e366538SXin Li
1740*4e366538SXin Li free_aligned_buffer_page_end(src);
1741*4e366538SXin Li free_aligned_buffer_page_end(dst_opt);
1742*4e366538SXin Li free_aligned_buffer_page_end(dst_c);
1743*4e366538SXin Li }
1744*4e366538SXin Li #endif // HAS_ABGRTOAR30ROW_AVX2
1745*4e366538SXin Li
1746*4e366538SXin Li #if !defined(LEAN_TESTS)
1747*4e366538SXin Li
1748*4e366538SXin Li // Provide matrix wrappers for 12 bit YUV
1749*4e366538SXin Li #define I012ToARGB(a, b, c, d, e, f, g, h, i, j) \
1750*4e366538SXin Li I012ToARGBMatrix(a, b, c, d, e, f, g, h, &kYuvI601Constants, i, j)
1751*4e366538SXin Li #define I012ToAR30(a, b, c, d, e, f, g, h, i, j) \
1752*4e366538SXin Li I012ToAR30Matrix(a, b, c, d, e, f, g, h, &kYuvI601Constants, i, j)
1753*4e366538SXin Li #define I012ToAB30(a, b, c, d, e, f, g, h, i, j) \
1754*4e366538SXin Li I012ToAB30Matrix(a, b, c, d, e, f, g, h, &kYuvI601Constants, i, j)
1755*4e366538SXin Li
1756*4e366538SXin Li #define I410ToARGB(a, b, c, d, e, f, g, h, i, j) \
1757*4e366538SXin Li I410ToARGBMatrix(a, b, c, d, e, f, g, h, &kYuvI601Constants, i, j)
1758*4e366538SXin Li #define I410ToABGR(a, b, c, d, e, f, g, h, i, j) \
1759*4e366538SXin Li I410ToABGRMatrix(a, b, c, d, e, f, g, h, &kYuvI601Constants, i, j)
1760*4e366538SXin Li #define H410ToARGB(a, b, c, d, e, f, g, h, i, j) \
1761*4e366538SXin Li I410ToARGBMatrix(a, b, c, d, e, f, g, h, &kYuvH709Constants, i, j)
1762*4e366538SXin Li #define H410ToABGR(a, b, c, d, e, f, g, h, i, j) \
1763*4e366538SXin Li I410ToABGRMatrix(a, b, c, d, e, f, g, h, &kYuvH709Constants, i, j)
1764*4e366538SXin Li #define U410ToARGB(a, b, c, d, e, f, g, h, i, j) \
1765*4e366538SXin Li I410ToARGBMatrix(a, b, c, d, e, f, g, h, &kYuv2020Constants, i, j)
1766*4e366538SXin Li #define U410ToABGR(a, b, c, d, e, f, g, h, i, j) \
1767*4e366538SXin Li I410ToABGRMatrix(a, b, c, d, e, f, g, h, &kYuv2020Constants, i, j)
1768*4e366538SXin Li #define I410ToAR30(a, b, c, d, e, f, g, h, i, j) \
1769*4e366538SXin Li I410ToAR30Matrix(a, b, c, d, e, f, g, h, &kYuvI601Constants, i, j)
1770*4e366538SXin Li #define I410ToAB30(a, b, c, d, e, f, g, h, i, j) \
1771*4e366538SXin Li I410ToAB30Matrix(a, b, c, d, e, f, g, h, &kYuvI601Constants, i, j)
1772*4e366538SXin Li #define H410ToAR30(a, b, c, d, e, f, g, h, i, j) \
1773*4e366538SXin Li I410ToAR30Matrix(a, b, c, d, e, f, g, h, &kYuvH709Constants, i, j)
1774*4e366538SXin Li #define H410ToAB30(a, b, c, d, e, f, g, h, i, j) \
1775*4e366538SXin Li I410ToAB30Matrix(a, b, c, d, e, f, g, h, &kYuvH709Constants, i, j)
1776*4e366538SXin Li #define U410ToAR30(a, b, c, d, e, f, g, h, i, j) \
1777*4e366538SXin Li I410ToAR30Matrix(a, b, c, d, e, f, g, h, &kYuv2020Constants, i, j)
1778*4e366538SXin Li #define U410ToAB30(a, b, c, d, e, f, g, h, i, j) \
1779*4e366538SXin Li I410ToAB30Matrix(a, b, c, d, e, f, g, h, &kYuv2020Constants, i, j)
1780*4e366538SXin Li
1781*4e366538SXin Li #define I010ToARGBFilter(a, b, c, d, e, f, g, h, i, j) \
1782*4e366538SXin Li I010ToARGBMatrixFilter(a, b, c, d, e, f, g, h, &kYuvI601Constants, i, j, \
1783*4e366538SXin Li kFilterBilinear)
1784*4e366538SXin Li #define I010ToAR30Filter(a, b, c, d, e, f, g, h, i, j) \
1785*4e366538SXin Li I010ToAR30MatrixFilter(a, b, c, d, e, f, g, h, &kYuvI601Constants, i, j, \
1786*4e366538SXin Li kFilterBilinear)
1787*4e366538SXin Li #define I210ToARGBFilter(a, b, c, d, e, f, g, h, i, j) \
1788*4e366538SXin Li I210ToARGBMatrixFilter(a, b, c, d, e, f, g, h, &kYuvI601Constants, i, j, \
1789*4e366538SXin Li kFilterBilinear)
1790*4e366538SXin Li #define I210ToAR30Filter(a, b, c, d, e, f, g, h, i, j) \
1791*4e366538SXin Li I210ToAR30MatrixFilter(a, b, c, d, e, f, g, h, &kYuvI601Constants, i, j, \
1792*4e366538SXin Li kFilterBilinear)
1793*4e366538SXin Li
1794*4e366538SXin Li // TODO(fbarchard): Fix clamping issue affected by U channel.
1795*4e366538SXin Li #define TESTPLANAR16TOBI(FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y, FMT_MASK, FMT_B, \
1796*4e366538SXin Li BPP_B, ALIGN, YALIGN, W1280, N, NEG, SOFF, DOFF) \
1797*4e366538SXin Li TEST_F(LibYUVConvertTest, FMT_PLANAR##To##FMT_B##N) { \
1798*4e366538SXin Li const int kWidth = W1280; \
1799*4e366538SXin Li const int kHeight = ALIGNINT(benchmark_height_, YALIGN); \
1800*4e366538SXin Li const int kStrideB = ALIGNINT(kWidth * BPP_B, ALIGN); \
1801*4e366538SXin Li const int kStrideUV = SUBSAMPLE(kWidth, SUBSAMP_X); \
1802*4e366538SXin Li const int kSizeUV = kStrideUV * SUBSAMPLE(kHeight, SUBSAMP_Y); \
1803*4e366538SXin Li const int kBpc = 2; \
1804*4e366538SXin Li align_buffer_page_end(src_y, kWidth* kHeight* kBpc + SOFF); \
1805*4e366538SXin Li align_buffer_page_end(src_u, kSizeUV* kBpc + SOFF); \
1806*4e366538SXin Li align_buffer_page_end(src_v, kSizeUV* kBpc + SOFF); \
1807*4e366538SXin Li align_buffer_page_end(dst_argb_c, kStrideB* kHeight + DOFF); \
1808*4e366538SXin Li align_buffer_page_end(dst_argb_opt, kStrideB* kHeight + DOFF); \
1809*4e366538SXin Li for (int i = 0; i < kWidth * kHeight; ++i) { \
1810*4e366538SXin Li reinterpret_cast<uint16_t*>(src_y + SOFF)[i] = (fastrand() & FMT_MASK); \
1811*4e366538SXin Li } \
1812*4e366538SXin Li for (int i = 0; i < kSizeUV; ++i) { \
1813*4e366538SXin Li reinterpret_cast<uint16_t*>(src_u + SOFF)[i] = (fastrand() & FMT_MASK); \
1814*4e366538SXin Li reinterpret_cast<uint16_t*>(src_v + SOFF)[i] = (fastrand() & FMT_MASK); \
1815*4e366538SXin Li } \
1816*4e366538SXin Li memset(dst_argb_c + DOFF, 1, kStrideB * kHeight); \
1817*4e366538SXin Li memset(dst_argb_opt + DOFF, 101, kStrideB * kHeight); \
1818*4e366538SXin Li MaskCpuFlags(disable_cpu_flags_); \
1819*4e366538SXin Li FMT_PLANAR##To##FMT_B( \
1820*4e366538SXin Li reinterpret_cast<uint16_t*>(src_y + SOFF), kWidth, \
1821*4e366538SXin Li reinterpret_cast<uint16_t*>(src_u + SOFF), kStrideUV, \
1822*4e366538SXin Li reinterpret_cast<uint16_t*>(src_v + SOFF), kStrideUV, \
1823*4e366538SXin Li dst_argb_c + DOFF, kStrideB, kWidth, NEG kHeight); \
1824*4e366538SXin Li MaskCpuFlags(benchmark_cpu_info_); \
1825*4e366538SXin Li for (int i = 0; i < benchmark_iterations_; ++i) { \
1826*4e366538SXin Li FMT_PLANAR##To##FMT_B( \
1827*4e366538SXin Li reinterpret_cast<uint16_t*>(src_y + SOFF), kWidth, \
1828*4e366538SXin Li reinterpret_cast<uint16_t*>(src_u + SOFF), kStrideUV, \
1829*4e366538SXin Li reinterpret_cast<uint16_t*>(src_v + SOFF), kStrideUV, \
1830*4e366538SXin Li dst_argb_opt + DOFF, kStrideB, kWidth, NEG kHeight); \
1831*4e366538SXin Li } \
1832*4e366538SXin Li for (int i = 0; i < kWidth * BPP_B * kHeight; ++i) { \
1833*4e366538SXin Li EXPECT_EQ(dst_argb_c[i + DOFF], dst_argb_opt[i + DOFF]); \
1834*4e366538SXin Li } \
1835*4e366538SXin Li free_aligned_buffer_page_end(src_y); \
1836*4e366538SXin Li free_aligned_buffer_page_end(src_u); \
1837*4e366538SXin Li free_aligned_buffer_page_end(src_v); \
1838*4e366538SXin Li free_aligned_buffer_page_end(dst_argb_c); \
1839*4e366538SXin Li free_aligned_buffer_page_end(dst_argb_opt); \
1840*4e366538SXin Li }
1841*4e366538SXin Li
1842*4e366538SXin Li #if defined(ENABLE_FULL_TESTS)
1843*4e366538SXin Li #define TESTPLANAR16TOB(FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y, FMT_MASK, FMT_B, \
1844*4e366538SXin Li BPP_B, ALIGN, YALIGN) \
1845*4e366538SXin Li TESTPLANAR16TOBI(FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y, FMT_MASK, FMT_B, BPP_B, \
1846*4e366538SXin Li ALIGN, YALIGN, benchmark_width_ + 1, _Any, +, 0, 0) \
1847*4e366538SXin Li TESTPLANAR16TOBI(FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y, FMT_MASK, FMT_B, BPP_B, \
1848*4e366538SXin Li ALIGN, YALIGN, benchmark_width_, _Unaligned, +, 4, 4) \
1849*4e366538SXin Li TESTPLANAR16TOBI(FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y, FMT_MASK, FMT_B, BPP_B, \
1850*4e366538SXin Li ALIGN, YALIGN, benchmark_width_, _Invert, -, 0, 0) \
1851*4e366538SXin Li TESTPLANAR16TOBI(FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y, FMT_MASK, FMT_B, BPP_B, \
1852*4e366538SXin Li ALIGN, YALIGN, benchmark_width_, _Opt, +, 0, 0)
1853*4e366538SXin Li #else
1854*4e366538SXin Li #define TESTPLANAR16TOB(FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y, FMT_MASK, FMT_B, \
1855*4e366538SXin Li BPP_B, ALIGN, YALIGN) \
1856*4e366538SXin Li TESTPLANAR16TOBI(FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y, FMT_MASK, FMT_B, BPP_B, \
1857*4e366538SXin Li ALIGN, YALIGN, benchmark_width_, _Opt, +, 0, 0)
1858*4e366538SXin Li #endif
1859*4e366538SXin Li
1860*4e366538SXin Li // These conversions are only optimized for x86
1861*4e366538SXin Li #if !defined(DISABLE_SLOW_TESTS) || defined(__x86_64__) || defined(__i386__)
1862*4e366538SXin Li TESTPLANAR16TOB(I010, 2, 2, 0x3ff, ARGB, 4, 4, 1)
1863*4e366538SXin Li TESTPLANAR16TOB(I010, 2, 2, 0x3ff, ABGR, 4, 4, 1)
1864*4e366538SXin Li TESTPLANAR16TOB(H010, 2, 2, 0x3ff, ARGB, 4, 4, 1)
1865*4e366538SXin Li TESTPLANAR16TOB(H010, 2, 2, 0x3ff, ABGR, 4, 4, 1)
1866*4e366538SXin Li TESTPLANAR16TOB(U010, 2, 2, 0x3ff, ARGB, 4, 4, 1)
1867*4e366538SXin Li TESTPLANAR16TOB(U010, 2, 2, 0x3ff, ABGR, 4, 4, 1)
1868*4e366538SXin Li TESTPLANAR16TOB(I210, 2, 1, 0x3ff, ARGB, 4, 4, 1)
1869*4e366538SXin Li TESTPLANAR16TOB(I210, 2, 1, 0x3ff, ABGR, 4, 4, 1)
1870*4e366538SXin Li TESTPLANAR16TOB(H210, 2, 1, 0x3ff, ARGB, 4, 4, 1)
1871*4e366538SXin Li TESTPLANAR16TOB(H210, 2, 1, 0x3ff, ABGR, 4, 4, 1)
1872*4e366538SXin Li TESTPLANAR16TOB(U210, 2, 1, 0x3ff, ARGB, 4, 4, 1)
1873*4e366538SXin Li TESTPLANAR16TOB(U210, 2, 1, 0x3ff, ABGR, 4, 4, 1)
1874*4e366538SXin Li TESTPLANAR16TOB(I410, 1, 1, 0x3ff, ARGB, 4, 4, 1)
1875*4e366538SXin Li TESTPLANAR16TOB(I410, 1, 1, 0x3ff, ABGR, 4, 4, 1)
1876*4e366538SXin Li TESTPLANAR16TOB(H410, 1, 1, 0x3ff, ARGB, 4, 4, 1)
1877*4e366538SXin Li TESTPLANAR16TOB(H410, 1, 1, 0x3ff, ABGR, 4, 4, 1)
1878*4e366538SXin Li TESTPLANAR16TOB(U410, 1, 1, 0x3ff, ARGB, 4, 4, 1)
1879*4e366538SXin Li TESTPLANAR16TOB(U410, 1, 1, 0x3ff, ABGR, 4, 4, 1)
1880*4e366538SXin Li TESTPLANAR16TOB(I012, 2, 2, 0xfff, ARGB, 4, 4, 1)
1881*4e366538SXin Li TESTPLANAR16TOB(I010, 2, 2, 0x3ff, ARGBFilter, 4, 4, 1)
1882*4e366538SXin Li TESTPLANAR16TOB(I210, 2, 1, 0x3ff, ARGBFilter, 4, 4, 1)
1883*4e366538SXin Li
1884*4e366538SXin Li #ifdef LITTLE_ENDIAN_ONLY_TEST
1885*4e366538SXin Li TESTPLANAR16TOB(I010, 2, 2, 0x3ff, AR30, 4, 4, 1)
1886*4e366538SXin Li TESTPLANAR16TOB(I010, 2, 2, 0x3ff, AB30, 4, 4, 1)
1887*4e366538SXin Li TESTPLANAR16TOB(H010, 2, 2, 0x3ff, AR30, 4, 4, 1)
1888*4e366538SXin Li TESTPLANAR16TOB(H010, 2, 2, 0x3ff, AB30, 4, 4, 1)
1889*4e366538SXin Li TESTPLANAR16TOB(U010, 2, 2, 0x3ff, AR30, 4, 4, 1)
1890*4e366538SXin Li TESTPLANAR16TOB(U010, 2, 2, 0x3ff, AB30, 4, 4, 1)
1891*4e366538SXin Li TESTPLANAR16TOB(I210, 2, 1, 0x3ff, AR30, 4, 4, 1)
1892*4e366538SXin Li TESTPLANAR16TOB(I210, 2, 1, 0x3ff, AB30, 4, 4, 1)
1893*4e366538SXin Li TESTPLANAR16TOB(H210, 2, 1, 0x3ff, AR30, 4, 4, 1)
1894*4e366538SXin Li TESTPLANAR16TOB(H210, 2, 1, 0x3ff, AB30, 4, 4, 1)
1895*4e366538SXin Li TESTPLANAR16TOB(U210, 2, 1, 0x3ff, AR30, 4, 4, 1)
1896*4e366538SXin Li TESTPLANAR16TOB(U210, 2, 1, 0x3ff, AB30, 4, 4, 1)
1897*4e366538SXin Li TESTPLANAR16TOB(I410, 1, 1, 0x3ff, AR30, 4, 4, 1)
1898*4e366538SXin Li TESTPLANAR16TOB(I410, 1, 1, 0x3ff, AB30, 4, 4, 1)
1899*4e366538SXin Li TESTPLANAR16TOB(H410, 1, 1, 0x3ff, AR30, 4, 4, 1)
1900*4e366538SXin Li TESTPLANAR16TOB(H410, 1, 1, 0x3ff, AB30, 4, 4, 1)
1901*4e366538SXin Li TESTPLANAR16TOB(U410, 1, 1, 0x3ff, AR30, 4, 4, 1)
1902*4e366538SXin Li TESTPLANAR16TOB(U410, 1, 1, 0x3ff, AB30, 4, 4, 1)
1903*4e366538SXin Li TESTPLANAR16TOB(I012, 2, 2, 0xfff, AR30, 4, 4, 1)
1904*4e366538SXin Li TESTPLANAR16TOB(I012, 2, 2, 0xfff, AB30, 4, 4, 1)
1905*4e366538SXin Li TESTPLANAR16TOB(I010, 2, 2, 0x3ff, AR30Filter, 4, 4, 1)
1906*4e366538SXin Li TESTPLANAR16TOB(I210, 2, 1, 0x3ff, AR30Filter, 4, 4, 1)
1907*4e366538SXin Li #endif // LITTLE_ENDIAN_ONLY_TEST
1908*4e366538SXin Li #endif // DISABLE_SLOW_TESTS
1909*4e366538SXin Li
1910*4e366538SXin Li #define TESTQPLANAR16TOBI(FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y, FMT_B, BPP_B, \
1911*4e366538SXin Li ALIGN, YALIGN, W1280, N, NEG, OFF, ATTEN, S_DEPTH) \
1912*4e366538SXin Li TEST_F(LibYUVConvertTest, FMT_PLANAR##To##FMT_B##N) { \
1913*4e366538SXin Li const int kWidth = W1280; \
1914*4e366538SXin Li const int kHeight = ALIGNINT(benchmark_height_, YALIGN); \
1915*4e366538SXin Li const int kStrideB = ALIGNINT(kWidth * BPP_B, ALIGN); \
1916*4e366538SXin Li const int kStrideUV = SUBSAMPLE(kWidth, SUBSAMP_X); \
1917*4e366538SXin Li const int kSizeUV = kStrideUV * SUBSAMPLE(kHeight, SUBSAMP_Y); \
1918*4e366538SXin Li const int kBpc = 2; \
1919*4e366538SXin Li align_buffer_page_end(src_y, kWidth* kHeight* kBpc + OFF); \
1920*4e366538SXin Li align_buffer_page_end(src_u, kSizeUV* kBpc + OFF); \
1921*4e366538SXin Li align_buffer_page_end(src_v, kSizeUV* kBpc + OFF); \
1922*4e366538SXin Li align_buffer_page_end(src_a, kWidth* kHeight* kBpc + OFF); \
1923*4e366538SXin Li align_buffer_page_end(dst_argb_c, kStrideB* kHeight + OFF); \
1924*4e366538SXin Li align_buffer_page_end(dst_argb_opt, kStrideB* kHeight + OFF); \
1925*4e366538SXin Li for (int i = 0; i < kWidth * kHeight; ++i) { \
1926*4e366538SXin Li reinterpret_cast<uint16_t*>(src_y + OFF)[i] = \
1927*4e366538SXin Li (fastrand() & ((1 << S_DEPTH) - 1)); \
1928*4e366538SXin Li reinterpret_cast<uint16_t*>(src_a + OFF)[i] = \
1929*4e366538SXin Li (fastrand() & ((1 << S_DEPTH) - 1)); \
1930*4e366538SXin Li } \
1931*4e366538SXin Li for (int i = 0; i < kSizeUV; ++i) { \
1932*4e366538SXin Li reinterpret_cast<uint16_t*>(src_u + OFF)[i] = \
1933*4e366538SXin Li (fastrand() & ((1 << S_DEPTH) - 1)); \
1934*4e366538SXin Li reinterpret_cast<uint16_t*>(src_v + OFF)[i] = \
1935*4e366538SXin Li (fastrand() & ((1 << S_DEPTH) - 1)); \
1936*4e366538SXin Li } \
1937*4e366538SXin Li memset(dst_argb_c + OFF, 1, kStrideB * kHeight); \
1938*4e366538SXin Li memset(dst_argb_opt + OFF, 101, kStrideB * kHeight); \
1939*4e366538SXin Li MaskCpuFlags(disable_cpu_flags_); \
1940*4e366538SXin Li FMT_PLANAR##To##FMT_B(reinterpret_cast<uint16_t*>(src_y + OFF), kWidth, \
1941*4e366538SXin Li reinterpret_cast<uint16_t*>(src_u + OFF), kStrideUV, \
1942*4e366538SXin Li reinterpret_cast<uint16_t*>(src_v + OFF), kStrideUV, \
1943*4e366538SXin Li reinterpret_cast<uint16_t*>(src_a + OFF), kWidth, \
1944*4e366538SXin Li dst_argb_c + OFF, kStrideB, kWidth, NEG kHeight, \
1945*4e366538SXin Li ATTEN); \
1946*4e366538SXin Li MaskCpuFlags(benchmark_cpu_info_); \
1947*4e366538SXin Li for (int i = 0; i < benchmark_iterations_; ++i) { \
1948*4e366538SXin Li FMT_PLANAR##To##FMT_B( \
1949*4e366538SXin Li reinterpret_cast<uint16_t*>(src_y + OFF), kWidth, \
1950*4e366538SXin Li reinterpret_cast<uint16_t*>(src_u + OFF), kStrideUV, \
1951*4e366538SXin Li reinterpret_cast<uint16_t*>(src_v + OFF), kStrideUV, \
1952*4e366538SXin Li reinterpret_cast<uint16_t*>(src_a + OFF), kWidth, \
1953*4e366538SXin Li dst_argb_opt + OFF, kStrideB, kWidth, NEG kHeight, ATTEN); \
1954*4e366538SXin Li } \
1955*4e366538SXin Li for (int i = 0; i < kWidth * BPP_B * kHeight; ++i) { \
1956*4e366538SXin Li EXPECT_EQ(dst_argb_c[i + OFF], dst_argb_opt[i + OFF]); \
1957*4e366538SXin Li } \
1958*4e366538SXin Li free_aligned_buffer_page_end(src_y); \
1959*4e366538SXin Li free_aligned_buffer_page_end(src_u); \
1960*4e366538SXin Li free_aligned_buffer_page_end(src_v); \
1961*4e366538SXin Li free_aligned_buffer_page_end(src_a); \
1962*4e366538SXin Li free_aligned_buffer_page_end(dst_argb_c); \
1963*4e366538SXin Li free_aligned_buffer_page_end(dst_argb_opt); \
1964*4e366538SXin Li }
1965*4e366538SXin Li
1966*4e366538SXin Li #if defined(ENABLE_FULL_TESTS)
1967*4e366538SXin Li #define TESTQPLANAR16TOB(FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y, FMT_B, BPP_B, \
1968*4e366538SXin Li ALIGN, YALIGN, S_DEPTH) \
1969*4e366538SXin Li TESTQPLANAR16TOBI(FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y, FMT_B, BPP_B, ALIGN, \
1970*4e366538SXin Li YALIGN, benchmark_width_ + 1, _Any, +, 0, 0, S_DEPTH) \
1971*4e366538SXin Li TESTQPLANAR16TOBI(FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y, FMT_B, BPP_B, ALIGN, \
1972*4e366538SXin Li YALIGN, benchmark_width_, _Unaligned, +, 2, 0, S_DEPTH) \
1973*4e366538SXin Li TESTQPLANAR16TOBI(FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y, FMT_B, BPP_B, ALIGN, \
1974*4e366538SXin Li YALIGN, benchmark_width_, _Invert, -, 0, 0, S_DEPTH) \
1975*4e366538SXin Li TESTQPLANAR16TOBI(FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y, FMT_B, BPP_B, ALIGN, \
1976*4e366538SXin Li YALIGN, benchmark_width_, _Opt, +, 0, 0, S_DEPTH) \
1977*4e366538SXin Li TESTQPLANAR16TOBI(FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y, FMT_B, BPP_B, ALIGN, \
1978*4e366538SXin Li YALIGN, benchmark_width_, _Premult, +, 0, 1, S_DEPTH)
1979*4e366538SXin Li #else
1980*4e366538SXin Li #define TESTQPLANAR16TOB(FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y, FMT_B, BPP_B, \
1981*4e366538SXin Li ALIGN, YALIGN, S_DEPTH) \
1982*4e366538SXin Li TESTQPLANAR16TOBI(FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y, FMT_B, BPP_B, ALIGN, \
1983*4e366538SXin Li YALIGN, benchmark_width_, _Opt, +, 0, 0, S_DEPTH)
1984*4e366538SXin Li #endif
1985*4e366538SXin Li
1986*4e366538SXin Li #define I010AlphaToARGB(a, b, c, d, e, f, g, h, i, j, k, l, m) \
1987*4e366538SXin Li I010AlphaToARGBMatrix(a, b, c, d, e, f, g, h, i, j, &kYuvI601Constants, k, \
1988*4e366538SXin Li l, m)
1989*4e366538SXin Li #define I010AlphaToABGR(a, b, c, d, e, f, g, h, i, j, k, l, m) \
1990*4e366538SXin Li I010AlphaToABGRMatrix(a, b, c, d, e, f, g, h, i, j, &kYuvI601Constants, k, \
1991*4e366538SXin Li l, m)
1992*4e366538SXin Li #define J010AlphaToARGB(a, b, c, d, e, f, g, h, i, j, k, l, m) \
1993*4e366538SXin Li I010AlphaToARGBMatrix(a, b, c, d, e, f, g, h, i, j, &kYuvJPEGConstants, k, \
1994*4e366538SXin Li l, m)
1995*4e366538SXin Li #define J010AlphaToABGR(a, b, c, d, e, f, g, h, i, j, k, l, m) \
1996*4e366538SXin Li I010AlphaToABGRMatrix(a, b, c, d, e, f, g, h, i, j, &kYuvJPEGConstants, k, \
1997*4e366538SXin Li l, m)
1998*4e366538SXin Li #define F010AlphaToARGB(a, b, c, d, e, f, g, h, i, j, k, l, m) \
1999*4e366538SXin Li I010AlphaToARGBMatrix(a, b, c, d, e, f, g, h, i, j, &kYuvF709Constants, k, \
2000*4e366538SXin Li l, m)
2001*4e366538SXin Li #define F010AlphaToABGR(a, b, c, d, e, f, g, h, i, j, k, l, m) \
2002*4e366538SXin Li I010AlphaToABGRMatrix(a, b, c, d, e, f, g, h, i, j, &kYuvF709Constants, k, \
2003*4e366538SXin Li l, m)
2004*4e366538SXin Li #define H010AlphaToARGB(a, b, c, d, e, f, g, h, i, j, k, l, m) \
2005*4e366538SXin Li I010AlphaToARGBMatrix(a, b, c, d, e, f, g, h, i, j, &kYuvH709Constants, k, \
2006*4e366538SXin Li l, m)
2007*4e366538SXin Li #define H010AlphaToABGR(a, b, c, d, e, f, g, h, i, j, k, l, m) \
2008*4e366538SXin Li I010AlphaToABGRMatrix(a, b, c, d, e, f, g, h, i, j, &kYuvH709Constants, k, \
2009*4e366538SXin Li l, m)
2010*4e366538SXin Li #define U010AlphaToARGB(a, b, c, d, e, f, g, h, i, j, k, l, m) \
2011*4e366538SXin Li I010AlphaToARGBMatrix(a, b, c, d, e, f, g, h, i, j, &kYuv2020Constants, k, \
2012*4e366538SXin Li l, m)
2013*4e366538SXin Li #define U010AlphaToABGR(a, b, c, d, e, f, g, h, i, j, k, l, m) \
2014*4e366538SXin Li I010AlphaToABGRMatrix(a, b, c, d, e, f, g, h, i, j, &kYuv2020Constants, k, \
2015*4e366538SXin Li l, m)
2016*4e366538SXin Li #define V010AlphaToARGB(a, b, c, d, e, f, g, h, i, j, k, l, m) \
2017*4e366538SXin Li I010AlphaToARGBMatrix(a, b, c, d, e, f, g, h, i, j, &kYuvV2020Constants, k, \
2018*4e366538SXin Li l, m)
2019*4e366538SXin Li #define V010AlphaToABGR(a, b, c, d, e, f, g, h, i, j, k, l, m) \
2020*4e366538SXin Li I010AlphaToABGRMatrix(a, b, c, d, e, f, g, h, i, j, &kYuvV2020Constants, k, \
2021*4e366538SXin Li l, m)
2022*4e366538SXin Li #define I210AlphaToARGB(a, b, c, d, e, f, g, h, i, j, k, l, m) \
2023*4e366538SXin Li I210AlphaToARGBMatrix(a, b, c, d, e, f, g, h, i, j, &kYuvI601Constants, k, \
2024*4e366538SXin Li l, m)
2025*4e366538SXin Li #define I210AlphaToABGR(a, b, c, d, e, f, g, h, i, j, k, l, m) \
2026*4e366538SXin Li I210AlphaToABGRMatrix(a, b, c, d, e, f, g, h, i, j, &kYuvI601Constants, k, \
2027*4e366538SXin Li l, m)
2028*4e366538SXin Li #define J210AlphaToARGB(a, b, c, d, e, f, g, h, i, j, k, l, m) \
2029*4e366538SXin Li I210AlphaToARGBMatrix(a, b, c, d, e, f, g, h, i, j, &kYuvJPEGConstants, k, \
2030*4e366538SXin Li l, m)
2031*4e366538SXin Li #define J210AlphaToABGR(a, b, c, d, e, f, g, h, i, j, k, l, m) \
2032*4e366538SXin Li I210AlphaToABGRMatrix(a, b, c, d, e, f, g, h, i, j, &kYuvJPEGConstants, k, \
2033*4e366538SXin Li l, m)
2034*4e366538SXin Li #define F210AlphaToARGB(a, b, c, d, e, f, g, h, i, j, k, l, m) \
2035*4e366538SXin Li I210AlphaToARGBMatrix(a, b, c, d, e, f, g, h, i, j, &kYuvF709Constants, k, \
2036*4e366538SXin Li l, m)
2037*4e366538SXin Li #define F210AlphaToABGR(a, b, c, d, e, f, g, h, i, j, k, l, m) \
2038*4e366538SXin Li I210AlphaToABGRMatrix(a, b, c, d, e, f, g, h, i, j, &kYuvF709Constants, k, \
2039*4e366538SXin Li l, m)
2040*4e366538SXin Li #define H210AlphaToARGB(a, b, c, d, e, f, g, h, i, j, k, l, m) \
2041*4e366538SXin Li I210AlphaToARGBMatrix(a, b, c, d, e, f, g, h, i, j, &kYuvH709Constants, k, \
2042*4e366538SXin Li l, m)
2043*4e366538SXin Li #define H210AlphaToABGR(a, b, c, d, e, f, g, h, i, j, k, l, m) \
2044*4e366538SXin Li I210AlphaToABGRMatrix(a, b, c, d, e, f, g, h, i, j, &kYuvH709Constants, k, \
2045*4e366538SXin Li l, m)
2046*4e366538SXin Li #define U210AlphaToARGB(a, b, c, d, e, f, g, h, i, j, k, l, m) \
2047*4e366538SXin Li I210AlphaToARGBMatrix(a, b, c, d, e, f, g, h, i, j, &kYuv2020Constants, k, \
2048*4e366538SXin Li l, m)
2049*4e366538SXin Li #define U210AlphaToABGR(a, b, c, d, e, f, g, h, i, j, k, l, m) \
2050*4e366538SXin Li I210AlphaToABGRMatrix(a, b, c, d, e, f, g, h, i, j, &kYuv2020Constants, k, \
2051*4e366538SXin Li l, m)
2052*4e366538SXin Li #define V210AlphaToARGB(a, b, c, d, e, f, g, h, i, j, k, l, m) \
2053*4e366538SXin Li I210AlphaToARGBMatrix(a, b, c, d, e, f, g, h, i, j, &kYuvV2020Constants, k, \
2054*4e366538SXin Li l, m)
2055*4e366538SXin Li #define V210AlphaToABGR(a, b, c, d, e, f, g, h, i, j, k, l, m) \
2056*4e366538SXin Li I210AlphaToABGRMatrix(a, b, c, d, e, f, g, h, i, j, &kYuvV2020Constants, k, \
2057*4e366538SXin Li l, m)
2058*4e366538SXin Li #define I410AlphaToARGB(a, b, c, d, e, f, g, h, i, j, k, l, m) \
2059*4e366538SXin Li I410AlphaToARGBMatrix(a, b, c, d, e, f, g, h, i, j, &kYuvI601Constants, k, \
2060*4e366538SXin Li l, m)
2061*4e366538SXin Li #define I410AlphaToABGR(a, b, c, d, e, f, g, h, i, j, k, l, m) \
2062*4e366538SXin Li I410AlphaToABGRMatrix(a, b, c, d, e, f, g, h, i, j, &kYuvI601Constants, k, \
2063*4e366538SXin Li l, m)
2064*4e366538SXin Li #define J410AlphaToARGB(a, b, c, d, e, f, g, h, i, j, k, l, m) \
2065*4e366538SXin Li I410AlphaToARGBMatrix(a, b, c, d, e, f, g, h, i, j, &kYuvJPEGConstants, k, \
2066*4e366538SXin Li l, m)
2067*4e366538SXin Li #define J410AlphaToABGR(a, b, c, d, e, f, g, h, i, j, k, l, m) \
2068*4e366538SXin Li I410AlphaToABGRMatrix(a, b, c, d, e, f, g, h, i, j, &kYuvJPEGConstants, k, \
2069*4e366538SXin Li l, m)
2070*4e366538SXin Li #define F410AlphaToARGB(a, b, c, d, e, f, g, h, i, j, k, l, m) \
2071*4e366538SXin Li I410AlphaToARGBMatrix(a, b, c, d, e, f, g, h, i, j, &kYuvF709Constants, k, \
2072*4e366538SXin Li l, m)
2073*4e366538SXin Li #define F410AlphaToABGR(a, b, c, d, e, f, g, h, i, j, k, l, m) \
2074*4e366538SXin Li I410AlphaToABGRMatrix(a, b, c, d, e, f, g, h, i, j, &kYuvF709Constants, k, \
2075*4e366538SXin Li l, m)
2076*4e366538SXin Li #define H410AlphaToARGB(a, b, c, d, e, f, g, h, i, j, k, l, m) \
2077*4e366538SXin Li I410AlphaToARGBMatrix(a, b, c, d, e, f, g, h, i, j, &kYuvH709Constants, k, \
2078*4e366538SXin Li l, m)
2079*4e366538SXin Li #define H410AlphaToABGR(a, b, c, d, e, f, g, h, i, j, k, l, m) \
2080*4e366538SXin Li I410AlphaToABGRMatrix(a, b, c, d, e, f, g, h, i, j, &kYuvH709Constants, k, \
2081*4e366538SXin Li l, m)
2082*4e366538SXin Li #define U410AlphaToARGB(a, b, c, d, e, f, g, h, i, j, k, l, m) \
2083*4e366538SXin Li I410AlphaToARGBMatrix(a, b, c, d, e, f, g, h, i, j, &kYuv2020Constants, k, \
2084*4e366538SXin Li l, m)
2085*4e366538SXin Li #define U410AlphaToABGR(a, b, c, d, e, f, g, h, i, j, k, l, m) \
2086*4e366538SXin Li I410AlphaToABGRMatrix(a, b, c, d, e, f, g, h, i, j, &kYuv2020Constants, k, \
2087*4e366538SXin Li l, m)
2088*4e366538SXin Li #define V410AlphaToARGB(a, b, c, d, e, f, g, h, i, j, k, l, m) \
2089*4e366538SXin Li I410AlphaToARGBMatrix(a, b, c, d, e, f, g, h, i, j, &kYuvV2020Constants, k, \
2090*4e366538SXin Li l, m)
2091*4e366538SXin Li #define V410AlphaToABGR(a, b, c, d, e, f, g, h, i, j, k, l, m) \
2092*4e366538SXin Li I410AlphaToABGRMatrix(a, b, c, d, e, f, g, h, i, j, &kYuvV2020Constants, k, \
2093*4e366538SXin Li l, m)
2094*4e366538SXin Li #define I010AlphaToARGBFilter(a, b, c, d, e, f, g, h, i, j, k, l, m) \
2095*4e366538SXin Li I010AlphaToARGBMatrixFilter(a, b, c, d, e, f, g, h, i, j, \
2096*4e366538SXin Li &kYuvI601Constants, k, l, m, kFilterBilinear)
2097*4e366538SXin Li #define I210AlphaToARGBFilter(a, b, c, d, e, f, g, h, i, j, k, l, m) \
2098*4e366538SXin Li I010AlphaToARGBMatrixFilter(a, b, c, d, e, f, g, h, i, j, \
2099*4e366538SXin Li &kYuvI601Constants, k, l, m, kFilterBilinear)
2100*4e366538SXin Li
2101*4e366538SXin Li // These conversions are only optimized for x86
2102*4e366538SXin Li #if !defined(DISABLE_SLOW_TESTS) || defined(__x86_64__) || defined(__i386__)
2103*4e366538SXin Li TESTQPLANAR16TOB(I010Alpha, 2, 2, ARGB, 4, 4, 1, 10)
2104*4e366538SXin Li TESTQPLANAR16TOB(I010Alpha, 2, 2, ABGR, 4, 4, 1, 10)
2105*4e366538SXin Li TESTQPLANAR16TOB(J010Alpha, 2, 2, ARGB, 4, 4, 1, 10)
2106*4e366538SXin Li TESTQPLANAR16TOB(J010Alpha, 2, 2, ABGR, 4, 4, 1, 10)
2107*4e366538SXin Li TESTQPLANAR16TOB(H010Alpha, 2, 2, ARGB, 4, 4, 1, 10)
2108*4e366538SXin Li TESTQPLANAR16TOB(H010Alpha, 2, 2, ABGR, 4, 4, 1, 10)
2109*4e366538SXin Li TESTQPLANAR16TOB(F010Alpha, 2, 2, ARGB, 4, 4, 1, 10)
2110*4e366538SXin Li TESTQPLANAR16TOB(F010Alpha, 2, 2, ABGR, 4, 4, 1, 10)
2111*4e366538SXin Li TESTQPLANAR16TOB(U010Alpha, 2, 2, ARGB, 4, 4, 1, 10)
2112*4e366538SXin Li TESTQPLANAR16TOB(U010Alpha, 2, 2, ABGR, 4, 4, 1, 10)
2113*4e366538SXin Li TESTQPLANAR16TOB(V010Alpha, 2, 2, ARGB, 4, 4, 1, 10)
2114*4e366538SXin Li TESTQPLANAR16TOB(V010Alpha, 2, 2, ABGR, 4, 4, 1, 10)
2115*4e366538SXin Li TESTQPLANAR16TOB(I210Alpha, 2, 1, ARGB, 4, 4, 1, 10)
2116*4e366538SXin Li TESTQPLANAR16TOB(I210Alpha, 2, 1, ABGR, 4, 4, 1, 10)
2117*4e366538SXin Li TESTQPLANAR16TOB(J210Alpha, 2, 1, ARGB, 4, 4, 1, 10)
2118*4e366538SXin Li TESTQPLANAR16TOB(J210Alpha, 2, 1, ABGR, 4, 4, 1, 10)
2119*4e366538SXin Li TESTQPLANAR16TOB(H210Alpha, 2, 1, ARGB, 4, 4, 1, 10)
2120*4e366538SXin Li TESTQPLANAR16TOB(H210Alpha, 2, 1, ABGR, 4, 4, 1, 10)
2121*4e366538SXin Li TESTQPLANAR16TOB(F210Alpha, 2, 1, ARGB, 4, 4, 1, 10)
2122*4e366538SXin Li TESTQPLANAR16TOB(F210Alpha, 2, 1, ABGR, 4, 4, 1, 10)
2123*4e366538SXin Li TESTQPLANAR16TOB(U210Alpha, 2, 1, ARGB, 4, 4, 1, 10)
2124*4e366538SXin Li TESTQPLANAR16TOB(U210Alpha, 2, 1, ABGR, 4, 4, 1, 10)
2125*4e366538SXin Li TESTQPLANAR16TOB(V210Alpha, 2, 1, ARGB, 4, 4, 1, 10)
2126*4e366538SXin Li TESTQPLANAR16TOB(V210Alpha, 2, 1, ABGR, 4, 4, 1, 10)
2127*4e366538SXin Li TESTQPLANAR16TOB(I410Alpha, 1, 1, ARGB, 4, 4, 1, 10)
2128*4e366538SXin Li TESTQPLANAR16TOB(I410Alpha, 1, 1, ABGR, 4, 4, 1, 10)
2129*4e366538SXin Li TESTQPLANAR16TOB(J410Alpha, 1, 1, ARGB, 4, 4, 1, 10)
2130*4e366538SXin Li TESTQPLANAR16TOB(J410Alpha, 1, 1, ABGR, 4, 4, 1, 10)
2131*4e366538SXin Li TESTQPLANAR16TOB(H410Alpha, 1, 1, ARGB, 4, 4, 1, 10)
2132*4e366538SXin Li TESTQPLANAR16TOB(H410Alpha, 1, 1, ABGR, 4, 4, 1, 10)
2133*4e366538SXin Li TESTQPLANAR16TOB(F410Alpha, 1, 1, ARGB, 4, 4, 1, 10)
2134*4e366538SXin Li TESTQPLANAR16TOB(F410Alpha, 1, 1, ABGR, 4, 4, 1, 10)
2135*4e366538SXin Li TESTQPLANAR16TOB(U410Alpha, 1, 1, ARGB, 4, 4, 1, 10)
2136*4e366538SXin Li TESTQPLANAR16TOB(U410Alpha, 1, 1, ABGR, 4, 4, 1, 10)
2137*4e366538SXin Li TESTQPLANAR16TOB(V410Alpha, 1, 1, ARGB, 4, 4, 1, 10)
2138*4e366538SXin Li TESTQPLANAR16TOB(V410Alpha, 1, 1, ABGR, 4, 4, 1, 10)
2139*4e366538SXin Li TESTQPLANAR16TOB(I010Alpha, 2, 2, ARGBFilter, 4, 4, 1, 10)
2140*4e366538SXin Li TESTQPLANAR16TOB(I210Alpha, 2, 1, ARGBFilter, 4, 4, 1, 10)
2141*4e366538SXin Li #endif // DISABLE_SLOW_TESTS
2142*4e366538SXin Li
2143*4e366538SXin Li #define TESTBP16TOBI(FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y, FMT_B, BPP_B, ALIGN, \
2144*4e366538SXin Li YALIGN, W1280, N, NEG, SOFF, DOFF, S_DEPTH) \
2145*4e366538SXin Li TEST_F(LibYUVConvertTest, FMT_PLANAR##To##FMT_B##N) { \
2146*4e366538SXin Li const int kWidth = W1280; \
2147*4e366538SXin Li const int kHeight = ALIGNINT(benchmark_height_, YALIGN); \
2148*4e366538SXin Li const int kStrideB = ALIGNINT(kWidth * BPP_B, ALIGN); \
2149*4e366538SXin Li const int kStrideUV = SUBSAMPLE(kWidth, SUBSAMP_X) * 2; \
2150*4e366538SXin Li const int kSizeUV = kStrideUV * SUBSAMPLE(kHeight, SUBSAMP_Y) * 2; \
2151*4e366538SXin Li const int kBpc = 2; \
2152*4e366538SXin Li align_buffer_page_end(src_y, kWidth* kHeight* kBpc + SOFF); \
2153*4e366538SXin Li align_buffer_page_end(src_uv, kSizeUV* kBpc + SOFF); \
2154*4e366538SXin Li align_buffer_page_end(dst_argb_c, kStrideB* kHeight + DOFF); \
2155*4e366538SXin Li align_buffer_page_end(dst_argb_opt, kStrideB* kHeight + DOFF); \
2156*4e366538SXin Li for (int i = 0; i < kWidth * kHeight; ++i) { \
2157*4e366538SXin Li reinterpret_cast<uint16_t*>(src_y + SOFF)[i] = \
2158*4e366538SXin Li (fastrand() & (((uint16_t)(-1)) << (16 - S_DEPTH))); \
2159*4e366538SXin Li } \
2160*4e366538SXin Li for (int i = 0; i < kSizeUV; ++i) { \
2161*4e366538SXin Li reinterpret_cast<uint16_t*>(src_uv + SOFF)[i] = \
2162*4e366538SXin Li (fastrand() & (((uint16_t)(-1)) << (16 - S_DEPTH))); \
2163*4e366538SXin Li } \
2164*4e366538SXin Li memset(dst_argb_c + DOFF, 1, kStrideB * kHeight); \
2165*4e366538SXin Li memset(dst_argb_opt + DOFF, 101, kStrideB * kHeight); \
2166*4e366538SXin Li MaskCpuFlags(disable_cpu_flags_); \
2167*4e366538SXin Li FMT_PLANAR##To##FMT_B(reinterpret_cast<uint16_t*>(src_y + SOFF), kWidth, \
2168*4e366538SXin Li reinterpret_cast<uint16_t*>(src_uv + SOFF), \
2169*4e366538SXin Li kStrideUV, dst_argb_c + DOFF, kStrideB, kWidth, \
2170*4e366538SXin Li NEG kHeight); \
2171*4e366538SXin Li MaskCpuFlags(benchmark_cpu_info_); \
2172*4e366538SXin Li for (int i = 0; i < benchmark_iterations_; ++i) { \
2173*4e366538SXin Li FMT_PLANAR##To##FMT_B(reinterpret_cast<uint16_t*>(src_y + SOFF), kWidth, \
2174*4e366538SXin Li reinterpret_cast<uint16_t*>(src_uv + SOFF), \
2175*4e366538SXin Li kStrideUV, dst_argb_opt + DOFF, kStrideB, kWidth, \
2176*4e366538SXin Li NEG kHeight); \
2177*4e366538SXin Li } \
2178*4e366538SXin Li for (int i = 0; i < kWidth * BPP_B * kHeight; ++i) { \
2179*4e366538SXin Li EXPECT_EQ(dst_argb_c[i + DOFF], dst_argb_opt[i + DOFF]); \
2180*4e366538SXin Li } \
2181*4e366538SXin Li free_aligned_buffer_page_end(src_y); \
2182*4e366538SXin Li free_aligned_buffer_page_end(src_uv); \
2183*4e366538SXin Li free_aligned_buffer_page_end(dst_argb_c); \
2184*4e366538SXin Li free_aligned_buffer_page_end(dst_argb_opt); \
2185*4e366538SXin Li }
2186*4e366538SXin Li
2187*4e366538SXin Li #if defined(ENABLE_FULL_TESTS)
2188*4e366538SXin Li #define TESTBP16TOB(FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y, FMT_B, BPP_B, ALIGN, \
2189*4e366538SXin Li YALIGN, S_DEPTH) \
2190*4e366538SXin Li TESTBP16TOBI(FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y, FMT_B, BPP_B, ALIGN, YALIGN, \
2191*4e366538SXin Li benchmark_width_ + 1, _Any, +, 0, 0, S_DEPTH) \
2192*4e366538SXin Li TESTBP16TOBI(FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y, FMT_B, BPP_B, ALIGN, YALIGN, \
2193*4e366538SXin Li benchmark_width_, _Unaligned, +, 4, 4, S_DEPTH) \
2194*4e366538SXin Li TESTBP16TOBI(FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y, FMT_B, BPP_B, ALIGN, YALIGN, \
2195*4e366538SXin Li benchmark_width_, _Invert, -, 0, 0, S_DEPTH) \
2196*4e366538SXin Li TESTBP16TOBI(FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y, FMT_B, BPP_B, ALIGN, YALIGN, \
2197*4e366538SXin Li benchmark_width_, _Opt, +, 0, 0, S_DEPTH)
2198*4e366538SXin Li #else
2199*4e366538SXin Li #define TESTBP16TOB(FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y, FMT_B, BPP_B, ALIGN, \
2200*4e366538SXin Li YALIGN, S_DEPTH) \
2201*4e366538SXin Li TESTBP16TOBI(FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y, FMT_B, BPP_B, ALIGN, YALIGN, \
2202*4e366538SXin Li benchmark_width_, _Opt, +, 0, 0, S_DEPTH)
2203*4e366538SXin Li #endif
2204*4e366538SXin Li
2205*4e366538SXin Li #define P010ToARGB(a, b, c, d, e, f, g, h) \
2206*4e366538SXin Li P010ToARGBMatrix(a, b, c, d, e, f, &kYuvH709Constants, g, h)
2207*4e366538SXin Li #define P210ToARGB(a, b, c, d, e, f, g, h) \
2208*4e366538SXin Li P210ToARGBMatrix(a, b, c, d, e, f, &kYuvH709Constants, g, h)
2209*4e366538SXin Li #define P010ToAR30(a, b, c, d, e, f, g, h) \
2210*4e366538SXin Li P010ToAR30Matrix(a, b, c, d, e, f, &kYuvH709Constants, g, h)
2211*4e366538SXin Li #define P210ToAR30(a, b, c, d, e, f, g, h) \
2212*4e366538SXin Li P210ToAR30Matrix(a, b, c, d, e, f, &kYuvH709Constants, g, h)
2213*4e366538SXin Li
2214*4e366538SXin Li #define P012ToARGB(a, b, c, d, e, f, g, h) \
2215*4e366538SXin Li P012ToARGBMatrix(a, b, c, d, e, f, &kYuvH709Constants, g, h)
2216*4e366538SXin Li #define P212ToARGB(a, b, c, d, e, f, g, h) \
2217*4e366538SXin Li P212ToARGBMatrix(a, b, c, d, e, f, &kYuvH709Constants, g, h)
2218*4e366538SXin Li #define P012ToAR30(a, b, c, d, e, f, g, h) \
2219*4e366538SXin Li P012ToAR30Matrix(a, b, c, d, e, f, &kYuvH709Constants, g, h)
2220*4e366538SXin Li #define P212ToAR30(a, b, c, d, e, f, g, h) \
2221*4e366538SXin Li P212ToAR30Matrix(a, b, c, d, e, f, &kYuvH709Constants, g, h)
2222*4e366538SXin Li
2223*4e366538SXin Li #define P016ToARGB(a, b, c, d, e, f, g, h) \
2224*4e366538SXin Li P016ToARGBMatrix(a, b, c, d, e, f, &kYuvH709Constants, g, h)
2225*4e366538SXin Li #define P216ToARGB(a, b, c, d, e, f, g, h) \
2226*4e366538SXin Li P216ToARGBMatrix(a, b, c, d, e, f, &kYuvH709Constants, g, h)
2227*4e366538SXin Li #define P016ToAR30(a, b, c, d, e, f, g, h) \
2228*4e366538SXin Li P016ToAR30Matrix(a, b, c, d, e, f, &kYuvH709Constants, g, h)
2229*4e366538SXin Li #define P216ToAR30(a, b, c, d, e, f, g, h) \
2230*4e366538SXin Li P216ToAR30Matrix(a, b, c, d, e, f, &kYuvH709Constants, g, h)
2231*4e366538SXin Li
2232*4e366538SXin Li #define P010ToARGBFilter(a, b, c, d, e, f, g, h) \
2233*4e366538SXin Li P010ToARGBMatrixFilter(a, b, c, d, e, f, &kYuvH709Constants, g, h, \
2234*4e366538SXin Li kFilterBilinear)
2235*4e366538SXin Li #define P210ToARGBFilter(a, b, c, d, e, f, g, h) \
2236*4e366538SXin Li P210ToARGBMatrixFilter(a, b, c, d, e, f, &kYuvH709Constants, g, h, \
2237*4e366538SXin Li kFilterBilinear)
2238*4e366538SXin Li #define P010ToAR30Filter(a, b, c, d, e, f, g, h) \
2239*4e366538SXin Li P010ToAR30MatrixFilter(a, b, c, d, e, f, &kYuvH709Constants, g, h, \
2240*4e366538SXin Li kFilterBilinear)
2241*4e366538SXin Li #define P210ToAR30Filter(a, b, c, d, e, f, g, h) \
2242*4e366538SXin Li P210ToAR30MatrixFilter(a, b, c, d, e, f, &kYuvH709Constants, g, h, \
2243*4e366538SXin Li kFilterBilinear)
2244*4e366538SXin Li
2245*4e366538SXin Li #if !defined(DISABLE_SLOW_TESTS) || defined(__x86_64__) || defined(__i386__)
2246*4e366538SXin Li TESTBP16TOB(P010, 2, 2, ARGB, 4, 4, 1, 10)
2247*4e366538SXin Li TESTBP16TOB(P210, 2, 1, ARGB, 4, 4, 1, 10)
2248*4e366538SXin Li TESTBP16TOB(P012, 2, 2, ARGB, 4, 4, 1, 12)
2249*4e366538SXin Li TESTBP16TOB(P212, 2, 1, ARGB, 4, 4, 1, 12)
2250*4e366538SXin Li TESTBP16TOB(P016, 2, 2, ARGB, 4, 4, 1, 16)
2251*4e366538SXin Li TESTBP16TOB(P216, 2, 1, ARGB, 4, 4, 1, 16)
2252*4e366538SXin Li TESTBP16TOB(P010, 2, 2, ARGBFilter, 4, 4, 1, 10)
2253*4e366538SXin Li TESTBP16TOB(P210, 2, 1, ARGBFilter, 4, 4, 1, 10)
2254*4e366538SXin Li #ifdef LITTLE_ENDIAN_ONLY_TEST
2255*4e366538SXin Li TESTBP16TOB(P010, 2, 2, AR30, 4, 4, 1, 10)
2256*4e366538SXin Li TESTBP16TOB(P210, 2, 1, AR30, 4, 4, 1, 10)
2257*4e366538SXin Li TESTBP16TOB(P012, 2, 2, AR30, 4, 4, 1, 12)
2258*4e366538SXin Li TESTBP16TOB(P212, 2, 1, AR30, 4, 4, 1, 12)
2259*4e366538SXin Li TESTBP16TOB(P016, 2, 2, AR30, 4, 4, 1, 16)
2260*4e366538SXin Li TESTBP16TOB(P216, 2, 1, AR30, 4, 4, 1, 16)
2261*4e366538SXin Li TESTBP16TOB(P010, 2, 2, AR30Filter, 4, 4, 1, 10)
2262*4e366538SXin Li TESTBP16TOB(P210, 2, 1, AR30Filter, 4, 4, 1, 10)
2263*4e366538SXin Li #endif // LITTLE_ENDIAN_ONLY_TEST
2264*4e366538SXin Li #endif // DISABLE_SLOW_TESTS
2265*4e366538SXin Li
Clamp(int y)2266*4e366538SXin Li static int Clamp(int y) {
2267*4e366538SXin Li if (y < 0) {
2268*4e366538SXin Li y = 0;
2269*4e366538SXin Li }
2270*4e366538SXin Li if (y > 255) {
2271*4e366538SXin Li y = 255;
2272*4e366538SXin Li }
2273*4e366538SXin Li return y;
2274*4e366538SXin Li }
2275*4e366538SXin Li
Clamp10(int y)2276*4e366538SXin Li static int Clamp10(int y) {
2277*4e366538SXin Li if (y < 0) {
2278*4e366538SXin Li y = 0;
2279*4e366538SXin Li }
2280*4e366538SXin Li if (y > 1023) {
2281*4e366538SXin Li y = 1023;
2282*4e366538SXin Li }
2283*4e366538SXin Li return y;
2284*4e366538SXin Li }
2285*4e366538SXin Li
2286*4e366538SXin Li // Test 8 bit YUV to 8 bit RGB
TEST_F(LibYUVConvertTest,TestH420ToARGB)2287*4e366538SXin Li TEST_F(LibYUVConvertTest, TestH420ToARGB) {
2288*4e366538SXin Li const int kSize = 256;
2289*4e366538SXin Li int histogram_b[256];
2290*4e366538SXin Li int histogram_g[256];
2291*4e366538SXin Li int histogram_r[256];
2292*4e366538SXin Li memset(histogram_b, 0, sizeof(histogram_b));
2293*4e366538SXin Li memset(histogram_g, 0, sizeof(histogram_g));
2294*4e366538SXin Li memset(histogram_r, 0, sizeof(histogram_r));
2295*4e366538SXin Li align_buffer_page_end(orig_yuv, kSize + kSize / 2 * 2);
2296*4e366538SXin Li align_buffer_page_end(argb_pixels, kSize * 4);
2297*4e366538SXin Li uint8_t* orig_y = orig_yuv;
2298*4e366538SXin Li uint8_t* orig_u = orig_y + kSize;
2299*4e366538SXin Li uint8_t* orig_v = orig_u + kSize / 2;
2300*4e366538SXin Li
2301*4e366538SXin Li // Test grey scale
2302*4e366538SXin Li for (int i = 0; i < kSize; ++i) {
2303*4e366538SXin Li orig_y[i] = i;
2304*4e366538SXin Li }
2305*4e366538SXin Li for (int i = 0; i < kSize / 2; ++i) {
2306*4e366538SXin Li orig_u[i] = 128; // 128 is 0.
2307*4e366538SXin Li orig_v[i] = 128;
2308*4e366538SXin Li }
2309*4e366538SXin Li
2310*4e366538SXin Li H420ToARGB(orig_y, 0, orig_u, 0, orig_v, 0, argb_pixels, 0, kSize, 1);
2311*4e366538SXin Li
2312*4e366538SXin Li for (int i = 0; i < kSize; ++i) {
2313*4e366538SXin Li int b = argb_pixels[i * 4 + 0];
2314*4e366538SXin Li int g = argb_pixels[i * 4 + 1];
2315*4e366538SXin Li int r = argb_pixels[i * 4 + 2];
2316*4e366538SXin Li int a = argb_pixels[i * 4 + 3];
2317*4e366538SXin Li ++histogram_b[b];
2318*4e366538SXin Li ++histogram_g[g];
2319*4e366538SXin Li ++histogram_r[r];
2320*4e366538SXin Li // Reference formula for Y channel contribution in YUV to RGB conversions:
2321*4e366538SXin Li int expected_y = Clamp(static_cast<int>((i - 16) * 1.164f + 0.5f));
2322*4e366538SXin Li EXPECT_EQ(b, expected_y);
2323*4e366538SXin Li EXPECT_EQ(g, expected_y);
2324*4e366538SXin Li EXPECT_EQ(r, expected_y);
2325*4e366538SXin Li EXPECT_EQ(a, 255);
2326*4e366538SXin Li }
2327*4e366538SXin Li
2328*4e366538SXin Li int count_b = 0;
2329*4e366538SXin Li int count_g = 0;
2330*4e366538SXin Li int count_r = 0;
2331*4e366538SXin Li for (int i = 0; i < kSize; ++i) {
2332*4e366538SXin Li if (histogram_b[i]) {
2333*4e366538SXin Li ++count_b;
2334*4e366538SXin Li }
2335*4e366538SXin Li if (histogram_g[i]) {
2336*4e366538SXin Li ++count_g;
2337*4e366538SXin Li }
2338*4e366538SXin Li if (histogram_r[i]) {
2339*4e366538SXin Li ++count_r;
2340*4e366538SXin Li }
2341*4e366538SXin Li }
2342*4e366538SXin Li printf("uniques: B %d, G, %d, R %d\n", count_b, count_g, count_r);
2343*4e366538SXin Li
2344*4e366538SXin Li free_aligned_buffer_page_end(orig_yuv);
2345*4e366538SXin Li free_aligned_buffer_page_end(argb_pixels);
2346*4e366538SXin Li }
2347*4e366538SXin Li
2348*4e366538SXin Li // Test 10 bit YUV to 8 bit RGB
TEST_F(LibYUVConvertTest,TestH010ToARGB)2349*4e366538SXin Li TEST_F(LibYUVConvertTest, TestH010ToARGB) {
2350*4e366538SXin Li const int kSize = 1024;
2351*4e366538SXin Li int histogram_b[1024];
2352*4e366538SXin Li int histogram_g[1024];
2353*4e366538SXin Li int histogram_r[1024];
2354*4e366538SXin Li memset(histogram_b, 0, sizeof(histogram_b));
2355*4e366538SXin Li memset(histogram_g, 0, sizeof(histogram_g));
2356*4e366538SXin Li memset(histogram_r, 0, sizeof(histogram_r));
2357*4e366538SXin Li align_buffer_page_end(orig_yuv, kSize * 2 + kSize / 2 * 2 * 2);
2358*4e366538SXin Li align_buffer_page_end(argb_pixels, kSize * 4);
2359*4e366538SXin Li uint16_t* orig_y = reinterpret_cast<uint16_t*>(orig_yuv);
2360*4e366538SXin Li uint16_t* orig_u = orig_y + kSize;
2361*4e366538SXin Li uint16_t* orig_v = orig_u + kSize / 2;
2362*4e366538SXin Li
2363*4e366538SXin Li // Test grey scale
2364*4e366538SXin Li for (int i = 0; i < kSize; ++i) {
2365*4e366538SXin Li orig_y[i] = i;
2366*4e366538SXin Li }
2367*4e366538SXin Li for (int i = 0; i < kSize / 2; ++i) {
2368*4e366538SXin Li orig_u[i] = 512; // 512 is 0.
2369*4e366538SXin Li orig_v[i] = 512;
2370*4e366538SXin Li }
2371*4e366538SXin Li
2372*4e366538SXin Li H010ToARGB(orig_y, 0, orig_u, 0, orig_v, 0, argb_pixels, 0, kSize, 1);
2373*4e366538SXin Li
2374*4e366538SXin Li for (int i = 0; i < kSize; ++i) {
2375*4e366538SXin Li int b = argb_pixels[i * 4 + 0];
2376*4e366538SXin Li int g = argb_pixels[i * 4 + 1];
2377*4e366538SXin Li int r = argb_pixels[i * 4 + 2];
2378*4e366538SXin Li int a = argb_pixels[i * 4 + 3];
2379*4e366538SXin Li ++histogram_b[b];
2380*4e366538SXin Li ++histogram_g[g];
2381*4e366538SXin Li ++histogram_r[r];
2382*4e366538SXin Li int expected_y = Clamp(static_cast<int>((i - 64) * 1.164f / 4));
2383*4e366538SXin Li EXPECT_NEAR(b, expected_y, 1);
2384*4e366538SXin Li EXPECT_NEAR(g, expected_y, 1);
2385*4e366538SXin Li EXPECT_NEAR(r, expected_y, 1);
2386*4e366538SXin Li EXPECT_EQ(a, 255);
2387*4e366538SXin Li }
2388*4e366538SXin Li
2389*4e366538SXin Li int count_b = 0;
2390*4e366538SXin Li int count_g = 0;
2391*4e366538SXin Li int count_r = 0;
2392*4e366538SXin Li for (int i = 0; i < kSize; ++i) {
2393*4e366538SXin Li if (histogram_b[i]) {
2394*4e366538SXin Li ++count_b;
2395*4e366538SXin Li }
2396*4e366538SXin Li if (histogram_g[i]) {
2397*4e366538SXin Li ++count_g;
2398*4e366538SXin Li }
2399*4e366538SXin Li if (histogram_r[i]) {
2400*4e366538SXin Li ++count_r;
2401*4e366538SXin Li }
2402*4e366538SXin Li }
2403*4e366538SXin Li printf("uniques: B %d, G, %d, R %d\n", count_b, count_g, count_r);
2404*4e366538SXin Li
2405*4e366538SXin Li free_aligned_buffer_page_end(orig_yuv);
2406*4e366538SXin Li free_aligned_buffer_page_end(argb_pixels);
2407*4e366538SXin Li }
2408*4e366538SXin Li
2409*4e366538SXin Li // Test 10 bit YUV to 10 bit RGB
2410*4e366538SXin Li // Caveat: Result is near due to float rounding in expected
2411*4e366538SXin Li // result.
TEST_F(LibYUVConvertTest,TestH010ToAR30)2412*4e366538SXin Li TEST_F(LibYUVConvertTest, TestH010ToAR30) {
2413*4e366538SXin Li const int kSize = 1024;
2414*4e366538SXin Li int histogram_b[1024];
2415*4e366538SXin Li int histogram_g[1024];
2416*4e366538SXin Li int histogram_r[1024];
2417*4e366538SXin Li memset(histogram_b, 0, sizeof(histogram_b));
2418*4e366538SXin Li memset(histogram_g, 0, sizeof(histogram_g));
2419*4e366538SXin Li memset(histogram_r, 0, sizeof(histogram_r));
2420*4e366538SXin Li
2421*4e366538SXin Li align_buffer_page_end(orig_yuv, kSize * 2 + kSize / 2 * 2 * 2);
2422*4e366538SXin Li align_buffer_page_end(ar30_pixels, kSize * 4);
2423*4e366538SXin Li uint16_t* orig_y = reinterpret_cast<uint16_t*>(orig_yuv);
2424*4e366538SXin Li uint16_t* orig_u = orig_y + kSize;
2425*4e366538SXin Li uint16_t* orig_v = orig_u + kSize / 2;
2426*4e366538SXin Li
2427*4e366538SXin Li // Test grey scale
2428*4e366538SXin Li for (int i = 0; i < kSize; ++i) {
2429*4e366538SXin Li orig_y[i] = i;
2430*4e366538SXin Li }
2431*4e366538SXin Li for (int i = 0; i < kSize / 2; ++i) {
2432*4e366538SXin Li orig_u[i] = 512; // 512 is 0.
2433*4e366538SXin Li orig_v[i] = 512;
2434*4e366538SXin Li }
2435*4e366538SXin Li
2436*4e366538SXin Li H010ToAR30(orig_y, 0, orig_u, 0, orig_v, 0, ar30_pixels, 0, kSize, 1);
2437*4e366538SXin Li
2438*4e366538SXin Li for (int i = 0; i < kSize; ++i) {
2439*4e366538SXin Li int b10 = reinterpret_cast<uint32_t*>(ar30_pixels)[i] & 1023;
2440*4e366538SXin Li int g10 = (reinterpret_cast<uint32_t*>(ar30_pixels)[i] >> 10) & 1023;
2441*4e366538SXin Li int r10 = (reinterpret_cast<uint32_t*>(ar30_pixels)[i] >> 20) & 1023;
2442*4e366538SXin Li int a2 = (reinterpret_cast<uint32_t*>(ar30_pixels)[i] >> 30) & 3;
2443*4e366538SXin Li ++histogram_b[b10];
2444*4e366538SXin Li ++histogram_g[g10];
2445*4e366538SXin Li ++histogram_r[r10];
2446*4e366538SXin Li int expected_y = Clamp10(static_cast<int>((i - 64) * 1.164f + 0.5));
2447*4e366538SXin Li EXPECT_NEAR(b10, expected_y, 4);
2448*4e366538SXin Li EXPECT_NEAR(g10, expected_y, 4);
2449*4e366538SXin Li EXPECT_NEAR(r10, expected_y, 4);
2450*4e366538SXin Li EXPECT_EQ(a2, 3);
2451*4e366538SXin Li }
2452*4e366538SXin Li
2453*4e366538SXin Li int count_b = 0;
2454*4e366538SXin Li int count_g = 0;
2455*4e366538SXin Li int count_r = 0;
2456*4e366538SXin Li for (int i = 0; i < kSize; ++i) {
2457*4e366538SXin Li if (histogram_b[i]) {
2458*4e366538SXin Li ++count_b;
2459*4e366538SXin Li }
2460*4e366538SXin Li if (histogram_g[i]) {
2461*4e366538SXin Li ++count_g;
2462*4e366538SXin Li }
2463*4e366538SXin Li if (histogram_r[i]) {
2464*4e366538SXin Li ++count_r;
2465*4e366538SXin Li }
2466*4e366538SXin Li }
2467*4e366538SXin Li printf("uniques: B %d, G, %d, R %d\n", count_b, count_g, count_r);
2468*4e366538SXin Li
2469*4e366538SXin Li free_aligned_buffer_page_end(orig_yuv);
2470*4e366538SXin Li free_aligned_buffer_page_end(ar30_pixels);
2471*4e366538SXin Li }
2472*4e366538SXin Li
2473*4e366538SXin Li // Test 10 bit YUV to 10 bit RGB
2474*4e366538SXin Li // Caveat: Result is near due to float rounding in expected
2475*4e366538SXin Li // result.
TEST_F(LibYUVConvertTest,TestH010ToAB30)2476*4e366538SXin Li TEST_F(LibYUVConvertTest, TestH010ToAB30) {
2477*4e366538SXin Li const int kSize = 1024;
2478*4e366538SXin Li int histogram_b[1024];
2479*4e366538SXin Li int histogram_g[1024];
2480*4e366538SXin Li int histogram_r[1024];
2481*4e366538SXin Li memset(histogram_b, 0, sizeof(histogram_b));
2482*4e366538SXin Li memset(histogram_g, 0, sizeof(histogram_g));
2483*4e366538SXin Li memset(histogram_r, 0, sizeof(histogram_r));
2484*4e366538SXin Li
2485*4e366538SXin Li align_buffer_page_end(orig_yuv, kSize * 2 + kSize / 2 * 2 * 2);
2486*4e366538SXin Li align_buffer_page_end(ab30_pixels, kSize * 4);
2487*4e366538SXin Li uint16_t* orig_y = reinterpret_cast<uint16_t*>(orig_yuv);
2488*4e366538SXin Li uint16_t* orig_u = orig_y + kSize;
2489*4e366538SXin Li uint16_t* orig_v = orig_u + kSize / 2;
2490*4e366538SXin Li
2491*4e366538SXin Li // Test grey scale
2492*4e366538SXin Li for (int i = 0; i < kSize; ++i) {
2493*4e366538SXin Li orig_y[i] = i;
2494*4e366538SXin Li }
2495*4e366538SXin Li for (int i = 0; i < kSize / 2; ++i) {
2496*4e366538SXin Li orig_u[i] = 512; // 512 is 0.
2497*4e366538SXin Li orig_v[i] = 512;
2498*4e366538SXin Li }
2499*4e366538SXin Li
2500*4e366538SXin Li H010ToAB30(orig_y, 0, orig_u, 0, orig_v, 0, ab30_pixels, 0, kSize, 1);
2501*4e366538SXin Li
2502*4e366538SXin Li for (int i = 0; i < kSize; ++i) {
2503*4e366538SXin Li int r10 = reinterpret_cast<uint32_t*>(ab30_pixels)[i] & 1023;
2504*4e366538SXin Li int g10 = (reinterpret_cast<uint32_t*>(ab30_pixels)[i] >> 10) & 1023;
2505*4e366538SXin Li int b10 = (reinterpret_cast<uint32_t*>(ab30_pixels)[i] >> 20) & 1023;
2506*4e366538SXin Li int a2 = (reinterpret_cast<uint32_t*>(ab30_pixels)[i] >> 30) & 3;
2507*4e366538SXin Li ++histogram_b[b10];
2508*4e366538SXin Li ++histogram_g[g10];
2509*4e366538SXin Li ++histogram_r[r10];
2510*4e366538SXin Li int expected_y = Clamp10(static_cast<int>((i - 64) * 1.164f));
2511*4e366538SXin Li EXPECT_NEAR(b10, expected_y, 4);
2512*4e366538SXin Li EXPECT_NEAR(g10, expected_y, 4);
2513*4e366538SXin Li EXPECT_NEAR(r10, expected_y, 4);
2514*4e366538SXin Li EXPECT_EQ(a2, 3);
2515*4e366538SXin Li }
2516*4e366538SXin Li
2517*4e366538SXin Li int count_b = 0;
2518*4e366538SXin Li int count_g = 0;
2519*4e366538SXin Li int count_r = 0;
2520*4e366538SXin Li for (int i = 0; i < kSize; ++i) {
2521*4e366538SXin Li if (histogram_b[i]) {
2522*4e366538SXin Li ++count_b;
2523*4e366538SXin Li }
2524*4e366538SXin Li if (histogram_g[i]) {
2525*4e366538SXin Li ++count_g;
2526*4e366538SXin Li }
2527*4e366538SXin Li if (histogram_r[i]) {
2528*4e366538SXin Li ++count_r;
2529*4e366538SXin Li }
2530*4e366538SXin Li }
2531*4e366538SXin Li printf("uniques: B %d, G, %d, R %d\n", count_b, count_g, count_r);
2532*4e366538SXin Li
2533*4e366538SXin Li free_aligned_buffer_page_end(orig_yuv);
2534*4e366538SXin Li free_aligned_buffer_page_end(ab30_pixels);
2535*4e366538SXin Li }
2536*4e366538SXin Li
2537*4e366538SXin Li // Test 8 bit YUV to 10 bit RGB
TEST_F(LibYUVConvertTest,TestH420ToAR30)2538*4e366538SXin Li TEST_F(LibYUVConvertTest, TestH420ToAR30) {
2539*4e366538SXin Li const int kSize = 256;
2540*4e366538SXin Li const int kHistSize = 1024;
2541*4e366538SXin Li int histogram_b[kHistSize];
2542*4e366538SXin Li int histogram_g[kHistSize];
2543*4e366538SXin Li int histogram_r[kHistSize];
2544*4e366538SXin Li memset(histogram_b, 0, sizeof(histogram_b));
2545*4e366538SXin Li memset(histogram_g, 0, sizeof(histogram_g));
2546*4e366538SXin Li memset(histogram_r, 0, sizeof(histogram_r));
2547*4e366538SXin Li align_buffer_page_end(orig_yuv, kSize + kSize / 2 * 2);
2548*4e366538SXin Li align_buffer_page_end(ar30_pixels, kSize * 4);
2549*4e366538SXin Li uint8_t* orig_y = orig_yuv;
2550*4e366538SXin Li uint8_t* orig_u = orig_y + kSize;
2551*4e366538SXin Li uint8_t* orig_v = orig_u + kSize / 2;
2552*4e366538SXin Li
2553*4e366538SXin Li // Test grey scale
2554*4e366538SXin Li for (int i = 0; i < kSize; ++i) {
2555*4e366538SXin Li orig_y[i] = i;
2556*4e366538SXin Li }
2557*4e366538SXin Li for (int i = 0; i < kSize / 2; ++i) {
2558*4e366538SXin Li orig_u[i] = 128; // 128 is 0.
2559*4e366538SXin Li orig_v[i] = 128;
2560*4e366538SXin Li }
2561*4e366538SXin Li
2562*4e366538SXin Li H420ToAR30(orig_y, 0, orig_u, 0, orig_v, 0, ar30_pixels, 0, kSize, 1);
2563*4e366538SXin Li
2564*4e366538SXin Li for (int i = 0; i < kSize; ++i) {
2565*4e366538SXin Li int b10 = reinterpret_cast<uint32_t*>(ar30_pixels)[i] & 1023;
2566*4e366538SXin Li int g10 = (reinterpret_cast<uint32_t*>(ar30_pixels)[i] >> 10) & 1023;
2567*4e366538SXin Li int r10 = (reinterpret_cast<uint32_t*>(ar30_pixels)[i] >> 20) & 1023;
2568*4e366538SXin Li int a2 = (reinterpret_cast<uint32_t*>(ar30_pixels)[i] >> 30) & 3;
2569*4e366538SXin Li ++histogram_b[b10];
2570*4e366538SXin Li ++histogram_g[g10];
2571*4e366538SXin Li ++histogram_r[r10];
2572*4e366538SXin Li int expected_y = Clamp10(static_cast<int>((i - 16) * 1.164f * 4.f));
2573*4e366538SXin Li EXPECT_NEAR(b10, expected_y, 4);
2574*4e366538SXin Li EXPECT_NEAR(g10, expected_y, 4);
2575*4e366538SXin Li EXPECT_NEAR(r10, expected_y, 4);
2576*4e366538SXin Li EXPECT_EQ(a2, 3);
2577*4e366538SXin Li }
2578*4e366538SXin Li
2579*4e366538SXin Li int count_b = 0;
2580*4e366538SXin Li int count_g = 0;
2581*4e366538SXin Li int count_r = 0;
2582*4e366538SXin Li for (int i = 0; i < kHistSize; ++i) {
2583*4e366538SXin Li if (histogram_b[i]) {
2584*4e366538SXin Li ++count_b;
2585*4e366538SXin Li }
2586*4e366538SXin Li if (histogram_g[i]) {
2587*4e366538SXin Li ++count_g;
2588*4e366538SXin Li }
2589*4e366538SXin Li if (histogram_r[i]) {
2590*4e366538SXin Li ++count_r;
2591*4e366538SXin Li }
2592*4e366538SXin Li }
2593*4e366538SXin Li printf("uniques: B %d, G, %d, R %d\n", count_b, count_g, count_r);
2594*4e366538SXin Li
2595*4e366538SXin Li free_aligned_buffer_page_end(orig_yuv);
2596*4e366538SXin Li free_aligned_buffer_page_end(ar30_pixels);
2597*4e366538SXin Li }
2598*4e366538SXin Li
2599*4e366538SXin Li // Test I400 with jpeg matrix is same as J400
TEST_F(LibYUVConvertTest,TestI400)2600*4e366538SXin Li TEST_F(LibYUVConvertTest, TestI400) {
2601*4e366538SXin Li const int kSize = 256;
2602*4e366538SXin Li align_buffer_page_end(orig_i400, kSize);
2603*4e366538SXin Li align_buffer_page_end(argb_pixels_i400, kSize * 4);
2604*4e366538SXin Li align_buffer_page_end(argb_pixels_j400, kSize * 4);
2605*4e366538SXin Li align_buffer_page_end(argb_pixels_jpeg_i400, kSize * 4);
2606*4e366538SXin Li align_buffer_page_end(argb_pixels_h709_i400, kSize * 4);
2607*4e366538SXin Li align_buffer_page_end(argb_pixels_2020_i400, kSize * 4);
2608*4e366538SXin Li
2609*4e366538SXin Li // Test grey scale
2610*4e366538SXin Li for (int i = 0; i < kSize; ++i) {
2611*4e366538SXin Li orig_i400[i] = i;
2612*4e366538SXin Li }
2613*4e366538SXin Li
2614*4e366538SXin Li J400ToARGB(orig_i400, 0, argb_pixels_j400, 0, kSize, 1);
2615*4e366538SXin Li I400ToARGB(orig_i400, 0, argb_pixels_i400, 0, kSize, 1);
2616*4e366538SXin Li I400ToARGBMatrix(orig_i400, 0, argb_pixels_jpeg_i400, 0, &kYuvJPEGConstants,
2617*4e366538SXin Li kSize, 1);
2618*4e366538SXin Li I400ToARGBMatrix(orig_i400, 0, argb_pixels_h709_i400, 0, &kYuvH709Constants,
2619*4e366538SXin Li kSize, 1);
2620*4e366538SXin Li I400ToARGBMatrix(orig_i400, 0, argb_pixels_2020_i400, 0, &kYuv2020Constants,
2621*4e366538SXin Li kSize, 1);
2622*4e366538SXin Li
2623*4e366538SXin Li EXPECT_EQ(0, argb_pixels_i400[0]);
2624*4e366538SXin Li EXPECT_EQ(0, argb_pixels_j400[0]);
2625*4e366538SXin Li EXPECT_EQ(0, argb_pixels_jpeg_i400[0]);
2626*4e366538SXin Li EXPECT_EQ(0, argb_pixels_h709_i400[0]);
2627*4e366538SXin Li EXPECT_EQ(0, argb_pixels_2020_i400[0]);
2628*4e366538SXin Li EXPECT_EQ(0, argb_pixels_i400[16 * 4]);
2629*4e366538SXin Li EXPECT_EQ(16, argb_pixels_j400[16 * 4]);
2630*4e366538SXin Li EXPECT_EQ(16, argb_pixels_jpeg_i400[16 * 4]);
2631*4e366538SXin Li EXPECT_EQ(0, argb_pixels_h709_i400[16 * 4]);
2632*4e366538SXin Li EXPECT_EQ(0, argb_pixels_2020_i400[16 * 4]);
2633*4e366538SXin Li EXPECT_EQ(130, argb_pixels_i400[128 * 4]);
2634*4e366538SXin Li EXPECT_EQ(128, argb_pixels_j400[128 * 4]);
2635*4e366538SXin Li EXPECT_EQ(128, argb_pixels_jpeg_i400[128 * 4]);
2636*4e366538SXin Li EXPECT_EQ(130, argb_pixels_h709_i400[128 * 4]);
2637*4e366538SXin Li EXPECT_EQ(130, argb_pixels_2020_i400[128 * 4]);
2638*4e366538SXin Li EXPECT_EQ(255, argb_pixels_i400[255 * 4]);
2639*4e366538SXin Li EXPECT_EQ(255, argb_pixels_j400[255 * 4]);
2640*4e366538SXin Li EXPECT_EQ(255, argb_pixels_jpeg_i400[255 * 4]);
2641*4e366538SXin Li EXPECT_EQ(255, argb_pixels_h709_i400[255 * 4]);
2642*4e366538SXin Li EXPECT_EQ(255, argb_pixels_2020_i400[255 * 4]);
2643*4e366538SXin Li
2644*4e366538SXin Li for (int i = 0; i < kSize * 4; ++i) {
2645*4e366538SXin Li if ((i & 3) == 3) {
2646*4e366538SXin Li EXPECT_EQ(255, argb_pixels_j400[i]);
2647*4e366538SXin Li } else {
2648*4e366538SXin Li EXPECT_EQ(i / 4, argb_pixels_j400[i]);
2649*4e366538SXin Li }
2650*4e366538SXin Li EXPECT_EQ(argb_pixels_jpeg_i400[i], argb_pixels_j400[i]);
2651*4e366538SXin Li }
2652*4e366538SXin Li
2653*4e366538SXin Li free_aligned_buffer_page_end(orig_i400);
2654*4e366538SXin Li free_aligned_buffer_page_end(argb_pixels_i400);
2655*4e366538SXin Li free_aligned_buffer_page_end(argb_pixels_j400);
2656*4e366538SXin Li free_aligned_buffer_page_end(argb_pixels_jpeg_i400);
2657*4e366538SXin Li free_aligned_buffer_page_end(argb_pixels_h709_i400);
2658*4e366538SXin Li free_aligned_buffer_page_end(argb_pixels_2020_i400);
2659*4e366538SXin Li }
2660*4e366538SXin Li
2661*4e366538SXin Li // Test RGB24 to ARGB and back to RGB24
TEST_F(LibYUVConvertTest,TestARGBToRGB24)2662*4e366538SXin Li TEST_F(LibYUVConvertTest, TestARGBToRGB24) {
2663*4e366538SXin Li const int kSize = 256;
2664*4e366538SXin Li align_buffer_page_end(orig_rgb24, kSize * 3);
2665*4e366538SXin Li align_buffer_page_end(argb_pixels, kSize * 4);
2666*4e366538SXin Li align_buffer_page_end(dest_rgb24, kSize * 3);
2667*4e366538SXin Li
2668*4e366538SXin Li // Test grey scale
2669*4e366538SXin Li for (int i = 0; i < kSize * 3; ++i) {
2670*4e366538SXin Li orig_rgb24[i] = i;
2671*4e366538SXin Li }
2672*4e366538SXin Li
2673*4e366538SXin Li RGB24ToARGB(orig_rgb24, 0, argb_pixels, 0, kSize, 1);
2674*4e366538SXin Li ARGBToRGB24(argb_pixels, 0, dest_rgb24, 0, kSize, 1);
2675*4e366538SXin Li
2676*4e366538SXin Li for (int i = 0; i < kSize * 3; ++i) {
2677*4e366538SXin Li EXPECT_EQ(orig_rgb24[i], dest_rgb24[i]);
2678*4e366538SXin Li }
2679*4e366538SXin Li
2680*4e366538SXin Li free_aligned_buffer_page_end(orig_rgb24);
2681*4e366538SXin Li free_aligned_buffer_page_end(argb_pixels);
2682*4e366538SXin Li free_aligned_buffer_page_end(dest_rgb24);
2683*4e366538SXin Li }
2684*4e366538SXin Li
TEST_F(LibYUVConvertTest,Test565)2685*4e366538SXin Li TEST_F(LibYUVConvertTest, Test565) {
2686*4e366538SXin Li SIMD_ALIGNED(uint8_t orig_pixels[256][4]);
2687*4e366538SXin Li SIMD_ALIGNED(uint8_t pixels565[256][2]);
2688*4e366538SXin Li
2689*4e366538SXin Li for (int i = 0; i < 256; ++i) {
2690*4e366538SXin Li for (int j = 0; j < 4; ++j) {
2691*4e366538SXin Li orig_pixels[i][j] = i;
2692*4e366538SXin Li }
2693*4e366538SXin Li }
2694*4e366538SXin Li ARGBToRGB565(&orig_pixels[0][0], 0, &pixels565[0][0], 0, 256, 1);
2695*4e366538SXin Li uint32_t checksum = HashDjb2(&pixels565[0][0], sizeof(pixels565), 5381);
2696*4e366538SXin Li EXPECT_EQ(610919429u, checksum);
2697*4e366538SXin Li }
2698*4e366538SXin Li #endif // !defined(LEAN_TESTS)
2699*4e366538SXin Li
2700*4e366538SXin Li } // namespace libyuv
2701