133cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp/*
233cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp *  Copyright 2011 The LibYuv Project Authors. All rights reserved.
333cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp *
433cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp *  Use of this source code is governed by a BSD-style license
533cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp *  that can be found in the LICENSE file in the root of the source
633cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp *  tree. An additional intellectual property rights grant can be found
733cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp *  in the file PATENTS.  All contributing project authors may
833cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp *  be found in the AUTHORS file in the root of the source tree.
933cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp */
1033cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp
1133cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp#include <stdlib.h>
1233cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp#include <time.h>
1333cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp
1433cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp#include "libyuv/convert_argb.h"
1533cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp#include "libyuv/convert_from.h"
1633cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp#include "libyuv/compare.h"
1733cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp#include "libyuv/cpu_id.h"
1833cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp#include "libyuv/format_conversion.h"
1933cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp#include "libyuv/planar_functions.h"
2033cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp#include "libyuv/rotate.h"
2133cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp#include "../unit_test/unit_test.h"
2233cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp
2333cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp#if defined(_MSC_VER)
2433cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp#define SIMD_ALIGNED(var) __declspec(align(16)) var
2533cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp#else  // __GNUC__
2633cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp#define SIMD_ALIGNED(var) var __attribute__((aligned(16)))
2733cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp#endif
2833cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp
2933cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkampnamespace libyuv {
3033cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp
3133cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp#define TESTPLANARTOBI(FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y, FMT_B, BPP_B, N, NEG) \
3233cfdeb7b267ab635413797fffb046b73272f7ecHendrik DahlkampTEST_F(libyuvTest, FMT_PLANAR##To##FMT_B##N##_OptVsC) {                        \
3333cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  const int kWidth = 1280;                                                     \
3433cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  const int kHeight = 720;                                                     \
3533cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  const int kStride = (kWidth * 8 * BPP_B + 7) / 8;                            \
3633cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  align_buffer_16(src_y, kWidth * kHeight);                                    \
3733cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  align_buffer_16(src_u, kWidth / SUBSAMP_X * kHeight / SUBSAMP_Y);            \
3833cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  align_buffer_16(src_v, kWidth / SUBSAMP_X * kHeight / SUBSAMP_Y);            \
3933cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  align_buffer_16(dst_argb_c, kStride * kHeight);                              \
4033cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  align_buffer_16(dst_argb_opt, kStride * kHeight);                            \
4133cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  srandom(time(NULL));                                                         \
4233cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  for (int i = 0; i < kHeight; ++i)                                            \
4333cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp    for (int j = 0; j < kWidth; ++j)                                           \
4433cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp      src_y[(i * kWidth) + j] = (random() & 0xff);                             \
4533cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  for (int i = 0; i < kHeight / SUBSAMP_Y; ++i)                                \
4633cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp    for (int j = 0; j < kWidth / SUBSAMP_X; ++j) {                             \
4733cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp      src_u[(i * kWidth / SUBSAMP_X) + j] = (random() & 0xff);                 \
4833cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp      src_v[(i * kWidth / SUBSAMP_X) + j] = (random() & 0xff);                 \
4933cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp    }                                                                          \
5033cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  MaskCpuFlags(kCpuInitialized);                                               \
5133cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  FMT_PLANAR##To##FMT_B(src_y, kWidth,                                         \
5233cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp                        src_u, kWidth / SUBSAMP_X,                             \
5333cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp                        src_v, kWidth / SUBSAMP_X,                             \
5433cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp                        dst_argb_c, kStride,                                   \
5533cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp                        kWidth, NEG kHeight);                                  \
5633cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  MaskCpuFlags(-1);                                                            \
5733cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  for (int i = 0; i < benchmark_iterations_; ++i) {                            \
5833cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp    FMT_PLANAR##To##FMT_B(src_y, kWidth,                                       \
5933cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp                          src_u, kWidth / SUBSAMP_X,                           \
6033cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp                          src_v, kWidth / SUBSAMP_X,                           \
6133cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp                          dst_argb_opt, kStride,                               \
6233cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp                          kWidth, NEG kHeight);                                \
6333cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  }                                                                            \
6433cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  int max_diff = 0;                                                            \
6533cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  for (int i = 0; i < kHeight; ++i) {                                          \
6633cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp    for (int j = 0; j < kWidth * BPP_B; ++j) {                                 \
6733cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp      int abs_diff =                                                           \
6833cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp          abs(static_cast<int>(dst_argb_c[i * kWidth * BPP_B + j]) -           \
6933cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp              static_cast<int>(dst_argb_opt[i * kWidth * BPP_B + j]));         \
7033cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp      if (abs_diff > max_diff) {                                               \
7133cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp        max_diff = abs_diff;                                                   \
7233cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp      }                                                                        \
7333cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp    }                                                                          \
7433cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  }                                                                            \
7533cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  EXPECT_LE(max_diff, 2);                                                      \
7633cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  free_aligned_buffer_16(src_y)                                                \
7733cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  free_aligned_buffer_16(src_u)                                                \
7833cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  free_aligned_buffer_16(src_v)                                                \
7933cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  free_aligned_buffer_16(dst_argb_c)                                           \
8033cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  free_aligned_buffer_16(dst_argb_opt)                                         \
8133cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp}
8233cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp
8333cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp#define TESTPLANARTOB(FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y, FMT_B, BPP_B)          \
8433cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp    TESTPLANARTOBI(FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y, FMT_B, BPP_B, , +)        \
8533cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp    TESTPLANARTOBI(FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y, FMT_B, BPP_B, Invert, -)
8633cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp
8733cfdeb7b267ab635413797fffb046b73272f7ecHendrik DahlkampTESTPLANARTOB(I420, 2, 2, ARGB, 4)
8833cfdeb7b267ab635413797fffb046b73272f7ecHendrik DahlkampTESTPLANARTOB(I420, 2, 2, BGRA, 4)
8933cfdeb7b267ab635413797fffb046b73272f7ecHendrik DahlkampTESTPLANARTOB(I420, 2, 2, ABGR, 4)
9033cfdeb7b267ab635413797fffb046b73272f7ecHendrik DahlkampTESTPLANARTOB(I420, 2, 2, RGBA, 4)
9133cfdeb7b267ab635413797fffb046b73272f7ecHendrik DahlkampTESTPLANARTOB(I420, 2, 2, RAW, 3)
9233cfdeb7b267ab635413797fffb046b73272f7ecHendrik DahlkampTESTPLANARTOB(I420, 2, 2, RGB24, 3)
9333cfdeb7b267ab635413797fffb046b73272f7ecHendrik DahlkampTESTPLANARTOB(I420, 2, 2, RGB565, 2)
9433cfdeb7b267ab635413797fffb046b73272f7ecHendrik DahlkampTESTPLANARTOB(I420, 2, 2, ARGB1555, 2)
9533cfdeb7b267ab635413797fffb046b73272f7ecHendrik DahlkampTESTPLANARTOB(I420, 2, 2, ARGB4444, 2)
9633cfdeb7b267ab635413797fffb046b73272f7ecHendrik DahlkampTESTPLANARTOB(I422, 2, 1, ARGB, 4)
9733cfdeb7b267ab635413797fffb046b73272f7ecHendrik DahlkampTESTPLANARTOB(I422, 2, 1, BGRA, 4)
9833cfdeb7b267ab635413797fffb046b73272f7ecHendrik DahlkampTESTPLANARTOB(I422, 2, 1, ABGR, 4)
9933cfdeb7b267ab635413797fffb046b73272f7ecHendrik DahlkampTESTPLANARTOB(I422, 2, 1, RGBA, 4)
10033cfdeb7b267ab635413797fffb046b73272f7ecHendrik DahlkampTESTPLANARTOB(I411, 4, 1, ARGB, 4)
10133cfdeb7b267ab635413797fffb046b73272f7ecHendrik DahlkampTESTPLANARTOB(I444, 1, 1, ARGB, 4)
10233cfdeb7b267ab635413797fffb046b73272f7ecHendrik DahlkampTESTPLANARTOB(I420, 2, 2, YUY2, 2)
10333cfdeb7b267ab635413797fffb046b73272f7ecHendrik DahlkampTESTPLANARTOB(I420, 2, 2, UYVY, 2)
10433cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp// TODO(fbarchard): Re-enable test and fix valgrind.
10533cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp// TESTPLANARTOB(I420, 2, 2, V210, 16 / 6)
10633cfdeb7b267ab635413797fffb046b73272f7ecHendrik DahlkampTESTPLANARTOB(I420, 2, 2, I400, 1)
10733cfdeb7b267ab635413797fffb046b73272f7ecHendrik DahlkampTESTPLANARTOB(I420, 2, 2, BayerBGGR, 1)
10833cfdeb7b267ab635413797fffb046b73272f7ecHendrik DahlkampTESTPLANARTOB(I420, 2, 2, BayerRGGB, 1)
10933cfdeb7b267ab635413797fffb046b73272f7ecHendrik DahlkampTESTPLANARTOB(I420, 2, 2, BayerGBRG, 1)
11033cfdeb7b267ab635413797fffb046b73272f7ecHendrik DahlkampTESTPLANARTOB(I420, 2, 2, BayerGRBG, 1)
11133cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp
11233cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp#define TESTBIPLANARTOBI(FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y, FMT_B, BPP_B,       \
11333cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp                         N, NEG)                                               \
11433cfdeb7b267ab635413797fffb046b73272f7ecHendrik DahlkampTEST_F(libyuvTest, FMT_PLANAR##To##FMT_B##N##_OptVsC) {                        \
11533cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  const int kWidth = 1280;                                                     \
11633cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  const int kHeight = 720;                                                     \
11733cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  align_buffer_16(src_y, kWidth * kHeight);                                    \
11833cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  align_buffer_16(src_uv, kWidth / SUBSAMP_X * kHeight / SUBSAMP_Y * 2);       \
11933cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  align_buffer_16(dst_argb_c, (kWidth * BPP_B) * kHeight);                     \
12033cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  align_buffer_16(dst_argb_opt, (kWidth * BPP_B) * kHeight);                   \
12133cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  srandom(time(NULL));                                                         \
12233cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  for (int i = 0; i < kHeight; ++i)                                            \
12333cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp    for (int j = 0; j < kWidth; ++j)                                           \
12433cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp      src_y[(i * kWidth) + j] = (random() & 0xff);                             \
12533cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  for (int i = 0; i < kHeight / SUBSAMP_Y; ++i)                                \
12633cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp    for (int j = 0; j < kWidth / SUBSAMP_X * 2; ++j) {                         \
12733cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp      src_uv[(i * kWidth / SUBSAMP_X) * 2 + j] = (random() & 0xff);            \
12833cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp    }                                                                          \
12933cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  MaskCpuFlags(kCpuInitialized);                                               \
13033cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  FMT_PLANAR##To##FMT_B(src_y, kWidth,                                         \
13133cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp                        src_uv, kWidth / SUBSAMP_X * 2,                        \
13233cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp                        dst_argb_c, kWidth * BPP_B,                            \
13333cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp                        kWidth, NEG kHeight);                                  \
13433cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  MaskCpuFlags(-1);                                                            \
13533cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  for (int i = 0; i < benchmark_iterations_; ++i) {                            \
13633cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp    FMT_PLANAR##To##FMT_B(src_y, kWidth,                                       \
13733cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp                          src_uv, kWidth / SUBSAMP_X * 2,                      \
13833cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp                          dst_argb_opt, kWidth * BPP_B,                        \
13933cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp                          kWidth, NEG kHeight);                                \
14033cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  }                                                                            \
14133cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  int max_diff = 0;                                                            \
14233cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  for (int i = 0; i < kHeight; ++i) {                                          \
14333cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp    for (int j = 0; j < kWidth * BPP_B; ++j) {                                 \
14433cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp      int abs_diff =                                                           \
14533cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp        abs(static_cast<int>(dst_argb_c[i * kWidth * BPP_B + j]) -             \
14633cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp            static_cast<int>(dst_argb_opt[i * kWidth * BPP_B + j]));           \
14733cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp      if (abs_diff > max_diff) {                                               \
14833cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp        max_diff = abs_diff;                                                   \
14933cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp      }                                                                        \
15033cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp    }                                                                          \
15133cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  }                                                                            \
15233cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  EXPECT_LE(max_diff, 3);                                                      \
15333cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  free_aligned_buffer_16(src_y)                                                \
15433cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  free_aligned_buffer_16(src_uv)                                               \
15533cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  free_aligned_buffer_16(dst_argb_c)                                           \
15633cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  free_aligned_buffer_16(dst_argb_opt)                                         \
15733cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp}
15833cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp
15933cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp#define TESTBIPLANARTOB(FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y, FMT_B, BPP_B)        \
16033cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp    TESTBIPLANARTOBI(FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y, FMT_B, BPP_B, , +)      \
16133cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp    TESTBIPLANARTOBI(FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y, FMT_B, BPP_B, Invert, -)
16233cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp
16333cfdeb7b267ab635413797fffb046b73272f7ecHendrik DahlkampTESTBIPLANARTOB(NV12, 2, 2, ARGB, 4)
16433cfdeb7b267ab635413797fffb046b73272f7ecHendrik DahlkampTESTBIPLANARTOB(NV21, 2, 2, ARGB, 4)
16533cfdeb7b267ab635413797fffb046b73272f7ecHendrik DahlkampTESTBIPLANARTOB(NV12, 2, 2, RGB565, 2)
16633cfdeb7b267ab635413797fffb046b73272f7ecHendrik DahlkampTESTBIPLANARTOB(NV21, 2, 2, RGB565, 2)
16733cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp
16833cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp#define TESTATOPLANARI(FMT_A, BPP_A, FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y, N, NEG) \
16933cfdeb7b267ab635413797fffb046b73272f7ecHendrik DahlkampTEST_F(libyuvTest, FMT_A##To##FMT_PLANAR##N##_OptVsC) {                        \
17033cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  const int kWidth = 1280;                                                     \
17133cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  const int kHeight = 720;                                                     \
17233cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  const int kStride = (kWidth * 8 * BPP_A + 7) / 8;                            \
17333cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  align_buffer_16(src_argb, kStride * kHeight);                                \
17433cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  align_buffer_16(dst_y_c, kWidth * kHeight);                                  \
17533cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  align_buffer_16(dst_u_c, kWidth / SUBSAMP_X * kHeight / SUBSAMP_Y);          \
17633cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  align_buffer_16(dst_v_c, kWidth / SUBSAMP_X * kHeight / SUBSAMP_Y);          \
17733cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  align_buffer_16(dst_y_opt, kWidth * kHeight);                                \
17833cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  align_buffer_16(dst_u_opt, kWidth / SUBSAMP_X * kHeight / SUBSAMP_Y);        \
17933cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  align_buffer_16(dst_v_opt, kWidth / SUBSAMP_X * kHeight / SUBSAMP_Y);        \
18033cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  srandom(time(NULL));                                                         \
18133cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  for (int i = 0; i < kHeight; ++i)                                            \
18233cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp    for (int j = 0; j < kStride; ++j)                                          \
18333cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp      src_argb[(i * kStride) + j] = (random() & 0xff);                         \
18433cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  MaskCpuFlags(kCpuInitialized);                                               \
18533cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  FMT_A##To##FMT_PLANAR(src_argb, kStride,                                     \
18633cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp                        dst_y_c, kWidth,                                       \
18733cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp                        dst_u_c, kWidth / SUBSAMP_X,                           \
18833cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp                        dst_v_c, kWidth / SUBSAMP_X,                           \
18933cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp                        kWidth, NEG kHeight);                                  \
19033cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  MaskCpuFlags(-1);                                                            \
19133cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  for (int i = 0; i < benchmark_iterations_; ++i) {                            \
19233cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp    FMT_A##To##FMT_PLANAR(src_argb, kStride,                                   \
19333cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp                          dst_y_opt, kWidth,                                   \
19433cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp                          dst_u_opt, kWidth / SUBSAMP_X,                       \
19533cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp                          dst_v_opt, kWidth / SUBSAMP_X,                       \
19633cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp                          kWidth, NEG kHeight);                                \
19733cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  }                                                                            \
19833cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  int max_diff = 0;                                                            \
19933cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  for (int i = 0; i < kHeight; ++i) {                                          \
20033cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp    for (int j = 0; j < kWidth; ++j) {                                         \
20133cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp      int abs_diff =                                                           \
20233cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp          abs(static_cast<int>(dst_y_c[i * kWidth + j]) -                      \
20333cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp              static_cast<int>(dst_y_opt[i * kWidth + j]));                    \
20433cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp      if (abs_diff > max_diff) {                                               \
20533cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp        max_diff = abs_diff;                                                   \
20633cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp      }                                                                        \
20733cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp    }                                                                          \
20833cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  }                                                                            \
20933cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  EXPECT_LE(max_diff, 2);                                                      \
21033cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  for (int i = 0; i < kHeight / SUBSAMP_Y; ++i) {                              \
21133cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp    for (int j = 0; j < kWidth / SUBSAMP_X; ++j) {                             \
21233cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp      int abs_diff =                                                           \
21333cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp          abs(static_cast<int>(dst_u_c[i * kWidth / SUBSAMP_X + j]) -          \
21433cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp              static_cast<int>(dst_u_opt[i * kWidth / SUBSAMP_X + j]));        \
21533cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp      if (abs_diff > max_diff) {                                               \
21633cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp        max_diff = abs_diff;                                                   \
21733cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp      }                                                                        \
21833cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp    }                                                                          \
21933cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  }                                                                            \
22033cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  EXPECT_LE(max_diff, 2);                                                      \
22133cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  for (int i = 0; i < kHeight / SUBSAMP_Y; ++i) {                              \
22233cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp    for (int j = 0; j < kWidth / SUBSAMP_X; ++j) {                             \
22333cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp      int abs_diff =                                                           \
22433cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp          abs(static_cast<int>(dst_v_c[i * kWidth / SUBSAMP_X + j]) -          \
22533cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp              static_cast<int>(dst_v_opt[i * kWidth / SUBSAMP_X + j]));        \
22633cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp      if (abs_diff > max_diff) {                                               \
22733cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp        max_diff = abs_diff;                                                   \
22833cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp      }                                                                        \
22933cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp    }                                                                          \
23033cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  }                                                                            \
23133cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  EXPECT_LE(max_diff, 2);                                                      \
23233cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  free_aligned_buffer_16(dst_y_c)                                              \
23333cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  free_aligned_buffer_16(dst_u_c)                                              \
23433cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  free_aligned_buffer_16(dst_v_c)                                              \
23533cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  free_aligned_buffer_16(dst_y_opt)                                            \
23633cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  free_aligned_buffer_16(dst_u_opt)                                            \
23733cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  free_aligned_buffer_16(dst_v_opt)                                            \
23833cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  free_aligned_buffer_16(src_argb)                                             \
23933cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp}
24033cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp
24133cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp#define TESTATOPLANAR(FMT_A, BPP_A, FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y)          \
24233cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp    TESTATOPLANARI(FMT_A, BPP_A, FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y, , +)        \
24333cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp    TESTATOPLANARI(FMT_A, BPP_A, FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y, Invert, -)
24433cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp
24533cfdeb7b267ab635413797fffb046b73272f7ecHendrik DahlkampTESTATOPLANAR(ARGB, 4, I420, 2, 2)
24633cfdeb7b267ab635413797fffb046b73272f7ecHendrik DahlkampTESTATOPLANAR(BGRA, 4, I420, 2, 2)
24733cfdeb7b267ab635413797fffb046b73272f7ecHendrik DahlkampTESTATOPLANAR(ABGR, 4, I420, 2, 2)
24833cfdeb7b267ab635413797fffb046b73272f7ecHendrik DahlkampTESTATOPLANAR(RGBA, 4, I420, 2, 2)
24933cfdeb7b267ab635413797fffb046b73272f7ecHendrik DahlkampTESTATOPLANAR(RAW, 3, I420, 2, 2)
25033cfdeb7b267ab635413797fffb046b73272f7ecHendrik DahlkampTESTATOPLANAR(RGB24, 3, I420, 2, 2)
25133cfdeb7b267ab635413797fffb046b73272f7ecHendrik DahlkampTESTATOPLANAR(RGB565, 2, I420, 2, 2)
25233cfdeb7b267ab635413797fffb046b73272f7ecHendrik DahlkampTESTATOPLANAR(ARGB1555, 2, I420, 2, 2)
25333cfdeb7b267ab635413797fffb046b73272f7ecHendrik DahlkampTESTATOPLANAR(ARGB4444, 2, I420, 2, 2)
25433cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp// TESTATOPLANAR(ARGB, 4, I411, 4, 1)
25533cfdeb7b267ab635413797fffb046b73272f7ecHendrik DahlkampTESTATOPLANAR(ARGB, 4, I422, 2, 1)
25633cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp// TESTATOPLANAR(ARGB, 4, I444, 1, 1)
25733cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp// TODO(fbarchard): Implement and test 411 and 444
25833cfdeb7b267ab635413797fffb046b73272f7ecHendrik DahlkampTESTATOPLANAR(YUY2, 2, I420, 2, 2)
25933cfdeb7b267ab635413797fffb046b73272f7ecHendrik DahlkampTESTATOPLANAR(UYVY, 2, I420, 2, 2)
26033cfdeb7b267ab635413797fffb046b73272f7ecHendrik DahlkampTESTATOPLANAR(YUY2, 2, I422, 2, 1)
26133cfdeb7b267ab635413797fffb046b73272f7ecHendrik DahlkampTESTATOPLANAR(UYVY, 2, I422, 2, 1)
26233cfdeb7b267ab635413797fffb046b73272f7ecHendrik DahlkampTESTATOPLANAR(V210, 16 / 6, I420, 2, 2)
26333cfdeb7b267ab635413797fffb046b73272f7ecHendrik DahlkampTESTATOPLANAR(I400, 1, I420, 2, 2)
26433cfdeb7b267ab635413797fffb046b73272f7ecHendrik DahlkampTESTATOPLANAR(BayerBGGR, 1, I420, 2, 2)
26533cfdeb7b267ab635413797fffb046b73272f7ecHendrik DahlkampTESTATOPLANAR(BayerRGGB, 1, I420, 2, 2)
26633cfdeb7b267ab635413797fffb046b73272f7ecHendrik DahlkampTESTATOPLANAR(BayerGBRG, 1, I420, 2, 2)
26733cfdeb7b267ab635413797fffb046b73272f7ecHendrik DahlkampTESTATOPLANAR(BayerGRBG, 1, I420, 2, 2)
26833cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp
26933cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp#define TESTATOBI(FMT_A, BPP_A, STRIDE_A, FMT_B, BPP_B, N, NEG)                \
27033cfdeb7b267ab635413797fffb046b73272f7ecHendrik DahlkampTEST_F(libyuvTest, FMT_A##To##FMT_B##N##_OptVsC) {                             \
27133cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  const int kWidth = 1280;                                                     \
27233cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  const int kHeight = 720;                                                     \
27333cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  align_buffer_16(src_argb, (kWidth * BPP_A) * kHeight);                       \
27433cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  align_buffer_16(dst_argb_c, (kWidth * BPP_B) * kHeight);                     \
27533cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  align_buffer_16(dst_argb_opt, (kWidth * BPP_B) * kHeight);                   \
27633cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  srandom(time(NULL));                                                         \
27733cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  for (int i = 0; i < kHeight * kWidth * BPP_A; ++i) {                         \
27833cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp    src_argb[i] = (random() & 0xff);                                           \
27933cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  }                                                                            \
28033cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  MaskCpuFlags(kCpuInitialized);                                               \
28133cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  FMT_A##To##FMT_B(src_argb, kWidth * STRIDE_A,                                \
28233cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp                   dst_argb_c, kWidth * BPP_B,                                 \
28333cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp                   kWidth, NEG kHeight);                                       \
28433cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  MaskCpuFlags(-1);                                                            \
28533cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  for (int i = 0; i < benchmark_iterations_; ++i) {                            \
28633cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp    FMT_A##To##FMT_B(src_argb, kWidth * STRIDE_A,                              \
28733cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp                     dst_argb_opt, kWidth * BPP_B,                             \
28833cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp                     kWidth, NEG kHeight);                                     \
28933cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  }                                                                            \
29033cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  int max_diff = 0;                                                            \
29133cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  for (int i = 0; i < kHeight * kWidth * BPP_B; ++i) {                         \
29233cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp    int abs_diff =                                                             \
29333cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp        abs(static_cast<int>(dst_argb_c[i]) -                                  \
29433cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp            static_cast<int>(dst_argb_opt[i]));                                \
29533cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp    if (abs_diff > max_diff) {                                                 \
29633cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp      max_diff = abs_diff;                                                     \
29733cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp    }                                                                          \
29833cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  }                                                                            \
29933cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  EXPECT_LE(max_diff, 2);                                                      \
30033cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  free_aligned_buffer_16(src_argb)                                             \
30133cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  free_aligned_buffer_16(dst_argb_c)                                           \
30233cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  free_aligned_buffer_16(dst_argb_opt)                                         \
30333cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp}
30433cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp#define TESTATOB(FMT_A, BPP_A, STRIDE_A, FMT_B, BPP_B)                         \
30533cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp    TESTATOBI(FMT_A, BPP_A, STRIDE_A, FMT_B, BPP_B, , +)                       \
30633cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp    TESTATOBI(FMT_A, BPP_A, STRIDE_A, FMT_B, BPP_B, Invert, -)
30733cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp
30833cfdeb7b267ab635413797fffb046b73272f7ecHendrik DahlkampTESTATOB(I400, 1, 1, I400, 1)
30933cfdeb7b267ab635413797fffb046b73272f7ecHendrik DahlkampTESTATOB(ARGB, 4, 4, ARGB, 4)
31033cfdeb7b267ab635413797fffb046b73272f7ecHendrik DahlkampTESTATOB(ARGB, 4, 4, BGRA, 4)
31133cfdeb7b267ab635413797fffb046b73272f7ecHendrik DahlkampTESTATOB(ARGB, 4, 4, ABGR, 4)
31233cfdeb7b267ab635413797fffb046b73272f7ecHendrik DahlkampTESTATOB(ARGB, 4, 4, RGBA, 4)
31333cfdeb7b267ab635413797fffb046b73272f7ecHendrik DahlkampTESTATOB(ARGB, 4, 4, RAW, 3)
31433cfdeb7b267ab635413797fffb046b73272f7ecHendrik DahlkampTESTATOB(ARGB, 4, 4, RGB24, 3)
31533cfdeb7b267ab635413797fffb046b73272f7ecHendrik DahlkampTESTATOB(ARGB, 4, 4, RGB565, 2)
31633cfdeb7b267ab635413797fffb046b73272f7ecHendrik DahlkampTESTATOB(ARGB, 4, 4, ARGB1555, 2)
31733cfdeb7b267ab635413797fffb046b73272f7ecHendrik DahlkampTESTATOB(ARGB, 4, 4, ARGB4444, 2)
31833cfdeb7b267ab635413797fffb046b73272f7ecHendrik DahlkampTESTATOB(BGRA, 4, 4, ARGB, 4)
31933cfdeb7b267ab635413797fffb046b73272f7ecHendrik DahlkampTESTATOB(ABGR, 4, 4, ARGB, 4)
32033cfdeb7b267ab635413797fffb046b73272f7ecHendrik DahlkampTESTATOB(RGBA, 4, 4, ARGB, 4)
32133cfdeb7b267ab635413797fffb046b73272f7ecHendrik DahlkampTESTATOB(RAW, 3, 3, ARGB, 4)
32233cfdeb7b267ab635413797fffb046b73272f7ecHendrik DahlkampTESTATOB(RGB24, 3, 3, ARGB, 4)
32333cfdeb7b267ab635413797fffb046b73272f7ecHendrik DahlkampTESTATOB(RGB565, 2, 2, ARGB, 4)
32433cfdeb7b267ab635413797fffb046b73272f7ecHendrik DahlkampTESTATOB(ARGB1555, 2, 2, ARGB, 4)
32533cfdeb7b267ab635413797fffb046b73272f7ecHendrik DahlkampTESTATOB(ARGB4444, 2, 2, ARGB, 4)
32633cfdeb7b267ab635413797fffb046b73272f7ecHendrik DahlkampTESTATOB(YUY2, 2, 2, ARGB, 4)
32733cfdeb7b267ab635413797fffb046b73272f7ecHendrik DahlkampTESTATOB(UYVY, 2, 2, ARGB, 4)
32833cfdeb7b267ab635413797fffb046b73272f7ecHendrik DahlkampTESTATOB(M420, 3 / 2, 1, ARGB, 4)
32933cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp
33033cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkampstatic const int kReadPad = 16;  // Allow overread of 16 bytes.
33133cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp#define TESTATOBRANDOM(FMT_A, BPP_A, STRIDE_A, FMT_B, BPP_B)                   \
33233cfdeb7b267ab635413797fffb046b73272f7ecHendrik DahlkampTEST_F(libyuvTest, FMT_A##To##FMT_B##_Random) {                                \
33333cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  srandom(time(NULL));                                                         \
33433cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  for (int times = 0; times < benchmark_iterations_; ++times) {                \
33533cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp    const int kWidth = (random() & 63) + 1;                                    \
33633cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp    const int kHeight = (random() & 31) + 1;                                   \
33733cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp    align_buffer_page_end(src_argb, (kWidth * BPP_A) * kHeight + kReadPad);    \
33833cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp    align_buffer_page_end(dst_argb_c, (kWidth * BPP_B) * kHeight);             \
33933cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp    align_buffer_page_end(dst_argb_opt, (kWidth * BPP_B) * kHeight);           \
34033cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp    for (int i = 0; i < kHeight * kWidth * BPP_A; ++i) {                       \
34133cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp      src_argb[i] = (random() & 0xff);                                         \
34233cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp    }                                                                          \
34333cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp    MaskCpuFlags(kCpuInitialized);                                             \
34433cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp    FMT_A##To##FMT_B(src_argb, kWidth * STRIDE_A,                              \
34533cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp                     dst_argb_c, kWidth * BPP_B,                               \
34633cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp                     kWidth, kHeight);                                         \
34733cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp    MaskCpuFlags(-1);                                                          \
34833cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp    FMT_A##To##FMT_B(src_argb, kWidth * STRIDE_A,                              \
34933cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp                     dst_argb_opt, kWidth * BPP_B,                             \
35033cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp                     kWidth, kHeight);                                         \
35133cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp    int max_diff = 0;                                                          \
35233cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp    for (int i = 0; i < kHeight * kWidth * BPP_B; ++i) {                       \
35333cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp      int abs_diff =                                                           \
35433cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp          abs(static_cast<int>(dst_argb_c[i]) -                                \
35533cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp              static_cast<int>(dst_argb_opt[i]));                              \
35633cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp      if (abs_diff > max_diff) {                                               \
35733cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp        max_diff = abs_diff;                                                   \
35833cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp      }                                                                        \
35933cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp    }                                                                          \
36033cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp    EXPECT_LE(max_diff, 2);                                                    \
36133cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp    free_aligned_buffer_page_end(src_argb)                                     \
36233cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp    free_aligned_buffer_page_end(dst_argb_c)                                   \
36333cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp    free_aligned_buffer_page_end(dst_argb_opt)                                 \
36433cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  }                                                                            \
36533cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp}
36633cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp
36733cfdeb7b267ab635413797fffb046b73272f7ecHendrik DahlkampTESTATOBRANDOM(ARGB, 4, 4, ARGB, 4)
36833cfdeb7b267ab635413797fffb046b73272f7ecHendrik DahlkampTESTATOBRANDOM(ARGB, 4, 4, BGRA, 4)
36933cfdeb7b267ab635413797fffb046b73272f7ecHendrik DahlkampTESTATOBRANDOM(ARGB, 4, 4, ABGR, 4)
37033cfdeb7b267ab635413797fffb046b73272f7ecHendrik DahlkampTESTATOBRANDOM(ARGB, 4, 4, RGBA, 4)
37133cfdeb7b267ab635413797fffb046b73272f7ecHendrik DahlkampTESTATOBRANDOM(ARGB, 4, 4, RAW, 3)
37233cfdeb7b267ab635413797fffb046b73272f7ecHendrik DahlkampTESTATOBRANDOM(ARGB, 4, 4, RGB24, 3)
37333cfdeb7b267ab635413797fffb046b73272f7ecHendrik DahlkampTESTATOBRANDOM(ARGB, 4, 4, RGB565, 2)
37433cfdeb7b267ab635413797fffb046b73272f7ecHendrik DahlkampTESTATOBRANDOM(ARGB, 4, 4, ARGB1555, 2)
37533cfdeb7b267ab635413797fffb046b73272f7ecHendrik DahlkampTESTATOBRANDOM(ARGB, 4, 4, ARGB4444, 2)
37633cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp
37733cfdeb7b267ab635413797fffb046b73272f7ecHendrik DahlkampTESTATOBRANDOM(BGRA, 4, 4, ARGB, 4)
37833cfdeb7b267ab635413797fffb046b73272f7ecHendrik DahlkampTESTATOBRANDOM(ABGR, 4, 4, ARGB, 4)
37933cfdeb7b267ab635413797fffb046b73272f7ecHendrik DahlkampTESTATOBRANDOM(RGBA, 4, 4, ARGB, 4)
38033cfdeb7b267ab635413797fffb046b73272f7ecHendrik DahlkampTESTATOBRANDOM(RAW, 3, 3, ARGB, 4)
38133cfdeb7b267ab635413797fffb046b73272f7ecHendrik DahlkampTESTATOBRANDOM(RGB24, 3, 3, ARGB, 4)
38233cfdeb7b267ab635413797fffb046b73272f7ecHendrik DahlkampTESTATOBRANDOM(RGB565, 2, 2, ARGB, 4)
38333cfdeb7b267ab635413797fffb046b73272f7ecHendrik DahlkampTESTATOBRANDOM(ARGB1555, 2, 2, ARGB, 4)
38433cfdeb7b267ab635413797fffb046b73272f7ecHendrik DahlkampTESTATOBRANDOM(ARGB4444, 2, 2, ARGB, 4)
38533cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp
38633cfdeb7b267ab635413797fffb046b73272f7ecHendrik DahlkampTEST_F(libyuvTest, TestAttenuate) {
38733cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  SIMD_ALIGNED(uint8 orig_pixels[256][4]);
38833cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  SIMD_ALIGNED(uint8 atten_pixels[256][4]);
38933cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  SIMD_ALIGNED(uint8 unatten_pixels[256][4]);
39033cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  SIMD_ALIGNED(uint8 atten2_pixels[256][4]);
39133cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp
39233cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  // Test unattenuation clamps
39333cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  orig_pixels[0][0] = 200u;
39433cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  orig_pixels[0][1] = 129u;
39533cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  orig_pixels[0][2] = 127u;
39633cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  orig_pixels[0][3] = 128u;
39733cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  // Test unattenuation transparent and opaque are unaffected
39833cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  orig_pixels[1][0] = 16u;
39933cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  orig_pixels[1][1] = 64u;
40033cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  orig_pixels[1][2] = 192u;
40133cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  orig_pixels[1][3] = 0u;
40233cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  orig_pixels[2][0] = 16u;
40333cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  orig_pixels[2][1] = 64u;
40433cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  orig_pixels[2][2] = 192u;
40533cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  orig_pixels[2][3] = 255u;
40633cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  orig_pixels[3][0] = 16u;
40733cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  orig_pixels[3][1] = 64u;
40833cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  orig_pixels[3][2] = 192u;
40933cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  orig_pixels[3][3] = 128u;
41033cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  ARGBUnattenuate(&orig_pixels[0][0], 0, &unatten_pixels[0][0], 0, 4, 1);
41133cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  EXPECT_EQ(255u, unatten_pixels[0][0]);
41233cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  EXPECT_EQ(255u, unatten_pixels[0][1]);
41333cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  EXPECT_EQ(254u, unatten_pixels[0][2]);
41433cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  EXPECT_EQ(128u, unatten_pixels[0][3]);
41533cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  EXPECT_EQ(16u, unatten_pixels[1][0]);
41633cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  EXPECT_EQ(64u, unatten_pixels[1][1]);
41733cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  EXPECT_EQ(192u, unatten_pixels[1][2]);
41833cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  EXPECT_EQ(0u, unatten_pixels[1][3]);
41933cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  EXPECT_EQ(16u, unatten_pixels[2][0]);
42033cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  EXPECT_EQ(64u, unatten_pixels[2][1]);
42133cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  EXPECT_EQ(192u, unatten_pixels[2][2]);
42233cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  EXPECT_EQ(255u, unatten_pixels[2][3]);
42333cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  EXPECT_EQ(32u, unatten_pixels[3][0]);
42433cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  EXPECT_EQ(128u, unatten_pixels[3][1]);
42533cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  EXPECT_EQ(255u, unatten_pixels[3][2]);
42633cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  EXPECT_EQ(128u, unatten_pixels[3][3]);
42733cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp
42833cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  for (int i = 0; i < 256; ++i) {
42933cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp    orig_pixels[i][0] = i;
43033cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp    orig_pixels[i][1] = i / 2;
43133cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp    orig_pixels[i][2] = i / 3;
43233cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp    orig_pixels[i][3] = i;
43333cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  }
43433cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  ARGBAttenuate(&orig_pixels[0][0], 0, &atten_pixels[0][0], 0, 256, 1);
43533cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  ARGBUnattenuate(&atten_pixels[0][0], 0, &unatten_pixels[0][0], 0, 256, 1);
43633cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  for (int i = 0; i < benchmark_iterations_ * 1280 * 720 / 256; ++i) {
43733cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp    ARGBAttenuate(&unatten_pixels[0][0], 0, &atten2_pixels[0][0], 0, 256, 1);
43833cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  }
43933cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  for (int i = 0; i < 256; ++i) {
44033cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp    EXPECT_NEAR(atten_pixels[i][0], atten2_pixels[i][0], 2);
44133cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp    EXPECT_NEAR(atten_pixels[i][1], atten2_pixels[i][1], 2);
44233cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp    EXPECT_NEAR(atten_pixels[i][2], atten2_pixels[i][2], 2);
44333cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp    EXPECT_NEAR(atten_pixels[i][3], atten2_pixels[i][3], 2);
44433cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  }
44533cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  // Make sure transparent, 50% and opaque are fully accurate.
44633cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  EXPECT_EQ(0, atten_pixels[0][0]);
44733cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  EXPECT_EQ(0, atten_pixels[0][1]);
44833cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  EXPECT_EQ(0, atten_pixels[0][2]);
44933cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  EXPECT_EQ(0, atten_pixels[0][3]);
45033cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  EXPECT_EQ(64, atten_pixels[128][0]);
45133cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  EXPECT_EQ(32, atten_pixels[128][1]);
45233cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  EXPECT_EQ(21,  atten_pixels[128][2]);
45333cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  EXPECT_EQ(128, atten_pixels[128][3]);
45433cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  EXPECT_EQ(255, atten_pixels[255][0]);
45533cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  EXPECT_EQ(127, atten_pixels[255][1]);
45633cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  EXPECT_EQ(85,  atten_pixels[255][2]);
45733cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  EXPECT_EQ(255, atten_pixels[255][3]);
45833cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp}
45933cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp
46033cfdeb7b267ab635413797fffb046b73272f7ecHendrik DahlkampTEST_F(libyuvTest, TestARGBComputeCumulativeSum) {
46133cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  SIMD_ALIGNED(uint8 orig_pixels[16][16][4]);
46233cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  SIMD_ALIGNED(int32 added_pixels[16][16][4]);
46333cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp
46433cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  for (int y = 0; y < 16; ++y) {
46533cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp    for (int x = 0; x < 16; ++x) {
46633cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp      orig_pixels[y][x][0] = 1u;
46733cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp      orig_pixels[y][x][1] = 2u;
46833cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp      orig_pixels[y][x][2] = 3u;
46933cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp      orig_pixels[y][x][3] = 255u;
47033cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp    }
47133cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  }
47233cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp
47333cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  ARGBComputeCumulativeSum(&orig_pixels[0][0][0], 16 * 4,
47433cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp                           &added_pixels[0][0][0], 16 * 4,
47533cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp                           16, 16);
47633cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp
47733cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  for (int y = 0; y < 16; ++y) {
47833cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp    for (int x = 0; x < 16; ++x) {
47933cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp      EXPECT_EQ((x + 1) * (y + 1), added_pixels[y][x][0]);
48033cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp      EXPECT_EQ((x + 1) * (y + 1) * 2, added_pixels[y][x][1]);
48133cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp      EXPECT_EQ((x + 1) * (y + 1) * 3, added_pixels[y][x][2]);
48233cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp      EXPECT_EQ((x + 1) * (y + 1) * 255, added_pixels[y][x][3]);
48333cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp    }
48433cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  }
48533cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp}
48633cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp
48733cfdeb7b267ab635413797fffb046b73272f7ecHendrik DahlkampTEST_F(libyuvTest, TestARGBGray) {
48833cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  SIMD_ALIGNED(uint8 orig_pixels[256][4]);
48933cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp
49033cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  // Test blue
49133cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  orig_pixels[0][0] = 255u;
49233cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  orig_pixels[0][1] = 0u;
49333cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  orig_pixels[0][2] = 0u;
49433cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  orig_pixels[0][3] = 128u;
49533cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  // Test green
49633cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  orig_pixels[1][0] = 0u;
49733cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  orig_pixels[1][1] = 255u;
49833cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  orig_pixels[1][2] = 0u;
49933cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  orig_pixels[1][3] = 0u;
50033cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  // Test red
50133cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  orig_pixels[2][0] = 0u;
50233cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  orig_pixels[2][1] = 0u;
50333cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  orig_pixels[2][2] = 255u;
50433cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  orig_pixels[2][3] = 255u;
50533cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  // Test color
50633cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  orig_pixels[3][0] = 16u;
50733cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  orig_pixels[3][1] = 64u;
50833cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  orig_pixels[3][2] = 192u;
50933cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  orig_pixels[3][3] = 224u;
51033cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  // Do 16 to test asm version.
51133cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  ARGBGray(&orig_pixels[0][0], 0, 0, 0, 16, 1);
51233cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  EXPECT_EQ(27u, orig_pixels[0][0]);
51333cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  EXPECT_EQ(27u, orig_pixels[0][1]);
51433cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  EXPECT_EQ(27u, orig_pixels[0][2]);
51533cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  EXPECT_EQ(128u, orig_pixels[0][3]);
51633cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  EXPECT_EQ(151u, orig_pixels[1][0]);
51733cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  EXPECT_EQ(151u, orig_pixels[1][1]);
51833cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  EXPECT_EQ(151u, orig_pixels[1][2]);
51933cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  EXPECT_EQ(0u, orig_pixels[1][3]);
52033cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  EXPECT_EQ(75u, orig_pixels[2][0]);
52133cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  EXPECT_EQ(75u, orig_pixels[2][1]);
52233cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  EXPECT_EQ(75u, orig_pixels[2][2]);
52333cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  EXPECT_EQ(255u, orig_pixels[2][3]);
52433cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  EXPECT_EQ(96u, orig_pixels[3][0]);
52533cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  EXPECT_EQ(96u, orig_pixels[3][1]);
52633cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  EXPECT_EQ(96u, orig_pixels[3][2]);
52733cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  EXPECT_EQ(224u, orig_pixels[3][3]);
52833cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp
52933cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  for (int i = 0; i < 256; ++i) {
53033cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp    orig_pixels[i][0] = i;
53133cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp    orig_pixels[i][1] = i / 2;
53233cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp    orig_pixels[i][2] = i / 3;
53333cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp    orig_pixels[i][3] = i;
53433cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  }
53533cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp
53633cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  for (int i = 0; i < benchmark_iterations_ * 1280 * 720 / 256; ++i) {
53733cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp    ARGBGray(&orig_pixels[0][0], 0, 0, 0, 256, 1);
53833cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  }
53933cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp}
54033cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp
54133cfdeb7b267ab635413797fffb046b73272f7ecHendrik DahlkampTEST_F(libyuvTest, TestARGBGrayTo) {
54233cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  SIMD_ALIGNED(uint8 orig_pixels[256][4]);
54333cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  SIMD_ALIGNED(uint8 gray_pixels[256][4]);
54433cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp
54533cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  // Test blue
54633cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  orig_pixels[0][0] = 255u;
54733cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  orig_pixels[0][1] = 0u;
54833cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  orig_pixels[0][2] = 0u;
54933cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  orig_pixels[0][3] = 128u;
55033cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  // Test green
55133cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  orig_pixels[1][0] = 0u;
55233cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  orig_pixels[1][1] = 255u;
55333cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  orig_pixels[1][2] = 0u;
55433cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  orig_pixels[1][3] = 0u;
55533cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  // Test red
55633cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  orig_pixels[2][0] = 0u;
55733cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  orig_pixels[2][1] = 0u;
55833cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  orig_pixels[2][2] = 255u;
55933cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  orig_pixels[2][3] = 255u;
56033cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  // Test color
56133cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  orig_pixels[3][0] = 16u;
56233cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  orig_pixels[3][1] = 64u;
56333cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  orig_pixels[3][2] = 192u;
56433cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  orig_pixels[3][3] = 224u;
56533cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  // Do 16 to test asm version.
56633cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  ARGBGrayTo(&orig_pixels[0][0], 0, &gray_pixels[0][0], 0, 16, 1);
56733cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  EXPECT_EQ(27u, gray_pixels[0][0]);
56833cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  EXPECT_EQ(27u, gray_pixels[0][1]);
56933cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  EXPECT_EQ(27u, gray_pixels[0][2]);
57033cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  EXPECT_EQ(128u, gray_pixels[0][3]);
57133cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  EXPECT_EQ(151u, gray_pixels[1][0]);
57233cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  EXPECT_EQ(151u, gray_pixels[1][1]);
57333cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  EXPECT_EQ(151u, gray_pixels[1][2]);
57433cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  EXPECT_EQ(0u, gray_pixels[1][3]);
57533cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  EXPECT_EQ(75u, gray_pixels[2][0]);
57633cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  EXPECT_EQ(75u, gray_pixels[2][1]);
57733cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  EXPECT_EQ(75u, gray_pixels[2][2]);
57833cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  EXPECT_EQ(255u, gray_pixels[2][3]);
57933cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  EXPECT_EQ(96u, gray_pixels[3][0]);
58033cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  EXPECT_EQ(96u, gray_pixels[3][1]);
58133cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  EXPECT_EQ(96u, gray_pixels[3][2]);
58233cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  EXPECT_EQ(224u, gray_pixels[3][3]);
58333cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp
58433cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  for (int i = 0; i < 256; ++i) {
58533cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp    orig_pixels[i][0] = i;
58633cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp    orig_pixels[i][1] = i / 2;
58733cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp    orig_pixels[i][2] = i / 3;
58833cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp    orig_pixels[i][3] = i;
58933cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  }
59033cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp
59133cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  for (int i = 0; i < benchmark_iterations_ * 1280 * 720 / 256; ++i) {
59233cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp    ARGBGrayTo(&orig_pixels[0][0], 0, &gray_pixels[0][0], 0, 256, 1);
59333cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  }
59433cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp}
59533cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp
59633cfdeb7b267ab635413797fffb046b73272f7ecHendrik DahlkampTEST_F(libyuvTest, TestARGBSepia) {
59733cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  SIMD_ALIGNED(uint8 orig_pixels[256][4]);
59833cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp
59933cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  // Test blue
60033cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  orig_pixels[0][0] = 255u;
60133cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  orig_pixels[0][1] = 0u;
60233cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  orig_pixels[0][2] = 0u;
60333cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  orig_pixels[0][3] = 128u;
60433cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  // Test green
60533cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  orig_pixels[1][0] = 0u;
60633cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  orig_pixels[1][1] = 255u;
60733cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  orig_pixels[1][2] = 0u;
60833cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  orig_pixels[1][3] = 0u;
60933cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  // Test red
61033cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  orig_pixels[2][0] = 0u;
61133cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  orig_pixels[2][1] = 0u;
61233cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  orig_pixels[2][2] = 255u;
61333cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  orig_pixels[2][3] = 255u;
61433cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  // Test color
61533cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  orig_pixels[3][0] = 16u;
61633cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  orig_pixels[3][1] = 64u;
61733cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  orig_pixels[3][2] = 192u;
61833cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  orig_pixels[3][3] = 224u;
61933cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  // Do 16 to test asm version.
62033cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  ARGBSepia(&orig_pixels[0][0], 0, 0, 0, 16, 1);
62133cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  EXPECT_EQ(33u, orig_pixels[0][0]);
62233cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  EXPECT_EQ(43u, orig_pixels[0][1]);
62333cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  EXPECT_EQ(47u, orig_pixels[0][2]);
62433cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  EXPECT_EQ(128u, orig_pixels[0][3]);
62533cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  EXPECT_EQ(135u, orig_pixels[1][0]);
62633cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  EXPECT_EQ(175u, orig_pixels[1][1]);
62733cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  EXPECT_EQ(195u, orig_pixels[1][2]);
62833cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  EXPECT_EQ(0u, orig_pixels[1][3]);
62933cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  EXPECT_EQ(69u, orig_pixels[2][0]);
63033cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  EXPECT_EQ(89u, orig_pixels[2][1]);
63133cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  EXPECT_EQ(99u, orig_pixels[2][2]);
63233cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  EXPECT_EQ(255u, orig_pixels[2][3]);
63333cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  EXPECT_EQ(88u, orig_pixels[3][0]);
63433cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  EXPECT_EQ(114u, orig_pixels[3][1]);
63533cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  EXPECT_EQ(127u, orig_pixels[3][2]);
63633cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  EXPECT_EQ(224u, orig_pixels[3][3]);
63733cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp
63833cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  for (int i = 0; i < 256; ++i) {
63933cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp    orig_pixels[i][0] = i;
64033cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp    orig_pixels[i][1] = i / 2;
64133cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp    orig_pixels[i][2] = i / 3;
64233cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp    orig_pixels[i][3] = i;
64333cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  }
64433cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp
64533cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  for (int i = 0; i < benchmark_iterations_ * 1280 * 720 / 256; ++i) {
64633cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp    ARGBSepia(&orig_pixels[0][0], 0, 0, 0, 256, 1);
64733cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  }
64833cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp}
64933cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp
65033cfdeb7b267ab635413797fffb046b73272f7ecHendrik DahlkampTEST_F(libyuvTest, TestARGBColorMatrix) {
65133cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  SIMD_ALIGNED(uint8 orig_pixels[256][4]);
65233cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp
65333cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  // Matrix for Sepia.
65433cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  static const int8 kARGBToSepia[] = {
65533cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp    17, 68, 35, 0,
65633cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp    22, 88, 45, 0,
65733cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp    24, 98, 50, 0,
65833cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  };
65933cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp
66033cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  // Test blue
66133cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  orig_pixels[0][0] = 255u;
66233cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  orig_pixels[0][1] = 0u;
66333cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  orig_pixels[0][2] = 0u;
66433cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  orig_pixels[0][3] = 128u;
66533cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  // Test green
66633cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  orig_pixels[1][0] = 0u;
66733cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  orig_pixels[1][1] = 255u;
66833cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  orig_pixels[1][2] = 0u;
66933cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  orig_pixels[1][3] = 0u;
67033cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  // Test red
67133cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  orig_pixels[2][0] = 0u;
67233cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  orig_pixels[2][1] = 0u;
67333cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  orig_pixels[2][2] = 255u;
67433cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  orig_pixels[2][3] = 255u;
67533cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  // Test color
67633cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  orig_pixels[3][0] = 16u;
67733cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  orig_pixels[3][1] = 64u;
67833cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  orig_pixels[3][2] = 192u;
67933cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  orig_pixels[3][3] = 224u;
68033cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  // Do 16 to test asm version.
68133cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  ARGBColorMatrix(&orig_pixels[0][0], 0, &kARGBToSepia[0], 0, 0, 16, 1);
68233cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  EXPECT_EQ(33u, orig_pixels[0][0]);
68333cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  EXPECT_EQ(43u, orig_pixels[0][1]);
68433cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  EXPECT_EQ(47u, orig_pixels[0][2]);
68533cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  EXPECT_EQ(128u, orig_pixels[0][3]);
68633cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  EXPECT_EQ(135u, orig_pixels[1][0]);
68733cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  EXPECT_EQ(175u, orig_pixels[1][1]);
68833cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  EXPECT_EQ(195u, orig_pixels[1][2]);
68933cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  EXPECT_EQ(0u, orig_pixels[1][3]);
69033cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  EXPECT_EQ(69u, orig_pixels[2][0]);
69133cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  EXPECT_EQ(89u, orig_pixels[2][1]);
69233cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  EXPECT_EQ(99u, orig_pixels[2][2]);
69333cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  EXPECT_EQ(255u, orig_pixels[2][3]);
69433cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  EXPECT_EQ(88u, orig_pixels[3][0]);
69533cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  EXPECT_EQ(114u, orig_pixels[3][1]);
69633cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  EXPECT_EQ(127u, orig_pixels[3][2]);
69733cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  EXPECT_EQ(224u, orig_pixels[3][3]);
69833cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp
69933cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  for (int i = 0; i < 256; ++i) {
70033cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp    orig_pixels[i][0] = i;
70133cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp    orig_pixels[i][1] = i / 2;
70233cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp    orig_pixels[i][2] = i / 3;
70333cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp    orig_pixels[i][3] = i;
70433cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  }
70533cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp
70633cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  for (int i = 0; i < benchmark_iterations_ * 1280 * 720 / 256; ++i) {
70733cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp    ARGBColorMatrix(&orig_pixels[0][0], 0, &kARGBToSepia[0], 0, 0, 256, 1);
70833cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  }
70933cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp}
71033cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp
71133cfdeb7b267ab635413797fffb046b73272f7ecHendrik DahlkampTEST_F(libyuvTest, TestARGBColorTable) {
71233cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  SIMD_ALIGNED(uint8 orig_pixels[256][4]);
71333cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  memset(orig_pixels, 0, sizeof(orig_pixels));
71433cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp
71533cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  // Matrix for Sepia.
71633cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  static const uint8 kARGBTable[256 * 4] = {
71733cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp    1u, 2u, 3u, 4u,
71833cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp    5u, 6u, 7u, 8u,
71933cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp    9u, 10u, 11u, 12u,
72033cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp    13u, 14u, 15u, 16u,
72133cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  };
72233cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp
72333cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  orig_pixels[0][0] = 0u;
72433cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  orig_pixels[0][1] = 0u;
72533cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  orig_pixels[0][2] = 0u;
72633cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  orig_pixels[0][3] = 0u;
72733cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  orig_pixels[1][0] = 1u;
72833cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  orig_pixels[1][1] = 1u;
72933cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  orig_pixels[1][2] = 1u;
73033cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  orig_pixels[1][3] = 1u;
73133cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  orig_pixels[2][0] = 2u;
73233cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  orig_pixels[2][1] = 2u;
73333cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  orig_pixels[2][2] = 2u;
73433cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  orig_pixels[2][3] = 2u;
73533cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  orig_pixels[3][0] = 0u;
73633cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  orig_pixels[3][1] = 1u;
73733cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  orig_pixels[3][2] = 2u;
73833cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  orig_pixels[3][3] = 3u;
73933cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  // Do 16 to test asm version.
74033cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  ARGBColorTable(&orig_pixels[0][0], 0, &kARGBTable[0], 0, 0, 16, 1);
74133cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  EXPECT_EQ(1u, orig_pixels[0][0]);
74233cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  EXPECT_EQ(2u, orig_pixels[0][1]);
74333cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  EXPECT_EQ(3u, orig_pixels[0][2]);
74433cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  EXPECT_EQ(4u, orig_pixels[0][3]);
74533cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  EXPECT_EQ(5u, orig_pixels[1][0]);
74633cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  EXPECT_EQ(6u, orig_pixels[1][1]);
74733cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  EXPECT_EQ(7u, orig_pixels[1][2]);
74833cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  EXPECT_EQ(8u, orig_pixels[1][3]);
74933cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  EXPECT_EQ(9u, orig_pixels[2][0]);
75033cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  EXPECT_EQ(10u, orig_pixels[2][1]);
75133cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  EXPECT_EQ(11u, orig_pixels[2][2]);
75233cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  EXPECT_EQ(12u, orig_pixels[2][3]);
75333cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  EXPECT_EQ(1u, orig_pixels[3][0]);
75433cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  EXPECT_EQ(6u, orig_pixels[3][1]);
75533cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  EXPECT_EQ(11u, orig_pixels[3][2]);
75633cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  EXPECT_EQ(16u, orig_pixels[3][3]);
75733cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp
75833cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  for (int i = 0; i < 256; ++i) {
75933cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp    orig_pixels[i][0] = i;
76033cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp    orig_pixels[i][1] = i / 2;
76133cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp    orig_pixels[i][2] = i / 3;
76233cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp    orig_pixels[i][3] = i;
76333cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  }
76433cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp
76533cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  for (int i = 0; i < benchmark_iterations_ * 1280 * 720 / 256; ++i) {
76633cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp    ARGBColorTable(&orig_pixels[0][0], 0, &kARGBTable[0], 0, 0, 256, 1);
76733cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  }
76833cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp}
76933cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp
77033cfdeb7b267ab635413797fffb046b73272f7ecHendrik DahlkampTEST_F(libyuvTest, TestARGBQuantize) {
77133cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  SIMD_ALIGNED(uint8 orig_pixels[256][4]);
77233cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp
77333cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  for (int i = 0; i < 256; ++i) {
77433cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp    orig_pixels[i][0] = i;
77533cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp    orig_pixels[i][1] = i / 2;
77633cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp    orig_pixels[i][2] = i / 3;
77733cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp    orig_pixels[i][3] = i;
77833cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  }
77933cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  ARGBQuantize(&orig_pixels[0][0], 0,
78033cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp               (65536 + (8 / 2)) / 8, 8, 8 / 2, 0, 0, 256, 1);
78133cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp
78233cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  for (int i = 0; i < 256; ++i) {
78333cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp    EXPECT_EQ(i / 8 * 8 + 8 / 2, orig_pixels[i][0]);
78433cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp    EXPECT_EQ(i / 2 / 8 * 8 + 8 / 2, orig_pixels[i][1]);
78533cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp    EXPECT_EQ(i / 3 / 8 * 8 + 8 / 2, orig_pixels[i][2]);
78633cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp    EXPECT_EQ(i, orig_pixels[i][3]);
78733cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  }
78833cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  for (int i = 0; i < benchmark_iterations_ * 1280 * 720 / 256; ++i) {
78933cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp    ARGBQuantize(&orig_pixels[0][0], 0,
79033cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp                 (65536 + (8 / 2)) / 8, 8, 8 / 2, 0, 0, 256, 1);
79133cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  }
79233cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp}
79333cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp
79433cfdeb7b267ab635413797fffb046b73272f7ecHendrik DahlkampTEST_F(libyuvTest, TestARGBMirror) {
79533cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  SIMD_ALIGNED(uint8 orig_pixels[256][4]);
79633cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  SIMD_ALIGNED(uint8 dst_pixels[256][4]);
79733cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp
79833cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  for (int i = 0; i < 256; ++i) {
79933cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp    orig_pixels[i][0] = i;
80033cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp    orig_pixels[i][1] = i / 2;
80133cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp    orig_pixels[i][2] = i / 3;
80233cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp    orig_pixels[i][3] = i / 4;
80333cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  }
80433cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  ARGBMirror(&orig_pixels[0][0], 0, &dst_pixels[0][0], 0, 256, 1);
80533cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp
80633cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  for (int i = 0; i < 256; ++i) {
80733cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp    EXPECT_EQ(i, dst_pixels[255 - i][0]);
80833cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp    EXPECT_EQ(i / 2, dst_pixels[255 - i][1]);
80933cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp    EXPECT_EQ(i / 3, dst_pixels[255 - i][2]);
81033cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp    EXPECT_EQ(i / 4, dst_pixels[255 - i][3]);
81133cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  }
81233cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  for (int i = 0; i < benchmark_iterations_ * 1280 * 720 / 256; ++i) {
81333cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp    ARGBMirror(&orig_pixels[0][0], 0, &dst_pixels[0][0], 0, 256, 1);
81433cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  }
81533cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp}
81633cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp
81733cfdeb7b267ab635413797fffb046b73272f7ecHendrik DahlkampTEST_F(libyuvTest, TestShade) {
81833cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  SIMD_ALIGNED(uint8 orig_pixels[256][4]);
81933cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  SIMD_ALIGNED(uint8 shade_pixels[256][4]);
82033cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp
82133cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  orig_pixels[0][0] = 10u;
82233cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  orig_pixels[0][1] = 20u;
82333cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  orig_pixels[0][2] = 40u;
82433cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  orig_pixels[0][3] = 80u;
82533cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  orig_pixels[1][0] = 0u;
82633cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  orig_pixels[1][1] = 0u;
82733cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  orig_pixels[1][2] = 0u;
82833cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  orig_pixels[1][3] = 255u;
82933cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  orig_pixels[2][0] = 0u;
83033cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  orig_pixels[2][1] = 0u;
83133cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  orig_pixels[2][2] = 0u;
83233cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  orig_pixels[2][3] = 0u;
83333cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  orig_pixels[3][0] = 0u;
83433cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  orig_pixels[3][1] = 0u;
83533cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  orig_pixels[3][2] = 0u;
83633cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  orig_pixels[3][3] = 0u;
83733cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  ARGBShade(&orig_pixels[0][0], 0, &shade_pixels[0][0], 0, 4, 1, 0x80ffffff);
83833cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  EXPECT_EQ(10u, shade_pixels[0][0]);
83933cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  EXPECT_EQ(20u, shade_pixels[0][1]);
84033cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  EXPECT_EQ(40u, shade_pixels[0][2]);
84133cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  EXPECT_EQ(40u, shade_pixels[0][3]);
84233cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  EXPECT_EQ(0u, shade_pixels[1][0]);
84333cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  EXPECT_EQ(0u, shade_pixels[1][1]);
84433cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  EXPECT_EQ(0u, shade_pixels[1][2]);
84533cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  EXPECT_EQ(128u, shade_pixels[1][3]);
84633cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  EXPECT_EQ(0u, shade_pixels[2][0]);
84733cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  EXPECT_EQ(0u, shade_pixels[2][1]);
84833cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  EXPECT_EQ(0u, shade_pixels[2][2]);
84933cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  EXPECT_EQ(0u, shade_pixels[2][3]);
85033cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  EXPECT_EQ(0u, shade_pixels[3][0]);
85133cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  EXPECT_EQ(0u, shade_pixels[3][1]);
85233cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  EXPECT_EQ(0u, shade_pixels[3][2]);
85333cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  EXPECT_EQ(0u, shade_pixels[3][3]);
85433cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp
85533cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  ARGBShade(&orig_pixels[0][0], 0, &shade_pixels[0][0], 0, 4, 1, 0x80808080);
85633cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  EXPECT_EQ(5u, shade_pixels[0][0]);
85733cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  EXPECT_EQ(10u, shade_pixels[0][1]);
85833cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  EXPECT_EQ(20u, shade_pixels[0][2]);
85933cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  EXPECT_EQ(40u, shade_pixels[0][3]);
86033cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp
86133cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  for (int i = 0; i < benchmark_iterations_ * 1280 * 720 / 256; ++i) {
86233cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp    ARGBShade(&orig_pixels[0][0], 0, &shade_pixels[0][0], 0, 256, 1,
86333cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp              0x80808080);
86433cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  }
86533cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp}
86633cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp
86733cfdeb7b267ab635413797fffb046b73272f7ecHendrik DahlkampTEST_F(libyuvTest, TestInterpolate) {
86833cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  SIMD_ALIGNED(uint8 orig_pixels_0[256][4]);
86933cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  SIMD_ALIGNED(uint8 orig_pixels_1[256][4]);
87033cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  SIMD_ALIGNED(uint8 interpolate_pixels[256][4]);
87133cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp
87233cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  orig_pixels_0[0][0] = 16u;
87333cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  orig_pixels_0[0][1] = 32u;
87433cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  orig_pixels_0[0][2] = 64u;
87533cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  orig_pixels_0[0][3] = 128u;
87633cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  orig_pixels_0[1][0] = 0u;
87733cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  orig_pixels_0[1][1] = 0u;
87833cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  orig_pixels_0[1][2] = 0u;
87933cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  orig_pixels_0[1][3] = 255u;
88033cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  orig_pixels_0[2][0] = 0u;
88133cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  orig_pixels_0[2][1] = 0u;
88233cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  orig_pixels_0[2][2] = 0u;
88333cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  orig_pixels_0[2][3] = 0u;
88433cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  orig_pixels_0[3][0] = 0u;
88533cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  orig_pixels_0[3][1] = 0u;
88633cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  orig_pixels_0[3][2] = 0u;
88733cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  orig_pixels_0[3][3] = 0u;
88833cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp
88933cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  orig_pixels_1[0][0] = 0u;
89033cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  orig_pixels_1[0][1] = 0u;
89133cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  orig_pixels_1[0][2] = 0u;
89233cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  orig_pixels_1[0][3] = 0u;
89333cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  orig_pixels_1[1][0] = 0u;
89433cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  orig_pixels_1[1][1] = 0u;
89533cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  orig_pixels_1[1][2] = 0u;
89633cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  orig_pixels_1[1][3] = 0u;
89733cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  orig_pixels_1[2][0] = 0u;
89833cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  orig_pixels_1[2][1] = 0u;
89933cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  orig_pixels_1[2][2] = 0u;
90033cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  orig_pixels_1[2][3] = 0u;
90133cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  orig_pixels_1[3][0] = 255u;
90233cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  orig_pixels_1[3][1] = 255u;
90333cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  orig_pixels_1[3][2] = 255u;
90433cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  orig_pixels_1[3][3] = 255u;
90533cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp
90633cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  ARGBInterpolate(&orig_pixels_0[0][0], 0, &orig_pixels_1[0][0], 0,
90733cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp                  &interpolate_pixels[0][0], 0, 4, 1, 128);
90833cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  EXPECT_EQ(8u, interpolate_pixels[0][0]);
90933cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  EXPECT_EQ(16u, interpolate_pixels[0][1]);
91033cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  EXPECT_EQ(32u, interpolate_pixels[0][2]);
91133cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  EXPECT_EQ(64u, interpolate_pixels[0][3]);
91233cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  EXPECT_EQ(0u, interpolate_pixels[1][0]);
91333cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  EXPECT_EQ(0u, interpolate_pixels[1][1]);
91433cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  EXPECT_EQ(0u, interpolate_pixels[1][2]);
91533cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  EXPECT_NEAR(128u, interpolate_pixels[1][3], 1);  // C = 127, SSE = 128.
91633cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  EXPECT_EQ(0u, interpolate_pixels[2][0]);
91733cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  EXPECT_EQ(0u, interpolate_pixels[2][1]);
91833cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  EXPECT_EQ(0u, interpolate_pixels[2][2]);
91933cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  EXPECT_EQ(0u, interpolate_pixels[2][3]);
92033cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  EXPECT_NEAR(128u, interpolate_pixels[3][0], 1);
92133cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  EXPECT_NEAR(128u, interpolate_pixels[3][1], 1);
92233cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  EXPECT_NEAR(128u, interpolate_pixels[3][2], 1);
92333cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  EXPECT_NEAR(128u, interpolate_pixels[3][3], 1);
92433cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp
92533cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  ARGBInterpolate(&orig_pixels_0[0][0], 0, &orig_pixels_1[0][0], 0,
92633cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp                  &interpolate_pixels[0][0], 0, 4, 1, 0);
92733cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  EXPECT_EQ(16u, interpolate_pixels[0][0]);
92833cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  EXPECT_EQ(32u, interpolate_pixels[0][1]);
92933cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  EXPECT_EQ(64u, interpolate_pixels[0][2]);
93033cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  EXPECT_EQ(128u, interpolate_pixels[0][3]);
93133cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp
93233cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  ARGBInterpolate(&orig_pixels_0[0][0], 0, &orig_pixels_1[0][0], 0,
93333cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp                  &interpolate_pixels[0][0], 0, 4, 1, 192);
93433cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp
93533cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  EXPECT_EQ(4u, interpolate_pixels[0][0]);
93633cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  EXPECT_EQ(8u, interpolate_pixels[0][1]);
93733cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  EXPECT_EQ(16u, interpolate_pixels[0][2]);
93833cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  EXPECT_EQ(32u, interpolate_pixels[0][3]);
93933cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp
94033cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  for (int i = 0; i < benchmark_iterations_ * (1280 * 720 / 256); ++i) {
94133cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp    ARGBInterpolate(&orig_pixels_0[0][0], 0, &orig_pixels_1[0][0], 0,
94233cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp                    &interpolate_pixels[0][0], 0, 256, 1, 128);
94333cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  }
94433cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp}
94533cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp
94633cfdeb7b267ab635413797fffb046b73272f7ecHendrik DahlkampTEST_F(libyuvTest, TestAffine) {
94733cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  SIMD_ALIGNED(uint8 orig_pixels_0[256][4]);
94833cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  SIMD_ALIGNED(uint8 interpolate_pixels_C[256][4]);
94933cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp#if defined(HAS_ARGBAFFINEROW_SSE2)
95033cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  SIMD_ALIGNED(uint8 interpolate_pixels_Opt[256][4]);
95133cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp#endif
95233cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp
95333cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  for (int i = 0; i < 256; ++i) {
95433cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp    for (int j = 0; j < 4; ++j) {
95533cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp      orig_pixels_0[i][j] = i;
95633cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp    }
95733cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  }
95833cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp
95933cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  float uv_step[4] = { 0.f, 0.f, 0.75f, 0.f };
96033cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp
96133cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  ARGBAffineRow_C(&orig_pixels_0[0][0], 0, &interpolate_pixels_C[0][0],
96233cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp                  uv_step, 256);
96333cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  EXPECT_EQ(0u, interpolate_pixels_C[0][0]);
96433cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  EXPECT_EQ(96u, interpolate_pixels_C[128][0]);
96533cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  EXPECT_EQ(191u, interpolate_pixels_C[255][3]);
96633cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp
96733cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp#if defined(HAS_ARGBAFFINEROW_SSE2)
96833cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  ARGBAffineRow_SSE2(&orig_pixels_0[0][0], 0, &interpolate_pixels_Opt[0][0],
96933cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp                     uv_step, 256);
97033cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  EXPECT_EQ(0, memcmp(interpolate_pixels_Opt, interpolate_pixels_C, 256 * 4));
97133cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp#endif
97233cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp
97333cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp#if defined(HAS_ARGBAFFINEROW_SSE2)
97433cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  int has_sse2 = TestCpuFlag(kCpuHasSSE2);
97533cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  if (has_sse2) {
97633cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp    for (int i = 0; i < benchmark_iterations_ * 1280 * 720 / 256; ++i) {
97733cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp      ARGBAffineRow_SSE2(&orig_pixels_0[0][0], 0, &interpolate_pixels_Opt[0][0],
97833cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp                         uv_step, 256);
97933cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp    }
98033cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  } else {
98133cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp#endif
98233cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp    for (int i = 0; i < benchmark_iterations_ * 1280 * 720 / 256; ++i) {
98333cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp      ARGBAffineRow_C(&orig_pixels_0[0][0], 0, &interpolate_pixels_C[0][0],
98433cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp                      uv_step, 256);
98533cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp    }
98633cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp#if defined(HAS_ARGBAFFINEROW_SSE2)
98733cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  }
98833cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp#endif
98933cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp}
99033cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp
99133cfdeb7b267ab635413797fffb046b73272f7ecHendrik DahlkampTEST_F(libyuvTest, Test565) {
99233cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  SIMD_ALIGNED(uint8 orig_pixels[256][4]);
99333cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  SIMD_ALIGNED(uint8 pixels565[256][2]);
99433cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp
99533cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  for (int i = 0; i < 256; ++i) {
99633cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp    for (int j = 0; j < 4; ++j) {
99733cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp      orig_pixels[i][j] = i;
99833cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp    }
99933cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  }
100033cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  ARGBToRGB565(&orig_pixels[0][0], 0, &pixels565[0][0], 0, 256, 1);
100133cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  uint32 checksum = HashDjb2(&pixels565[0][0], sizeof(pixels565), 5381);
100233cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  EXPECT_EQ(610919429u, checksum);
100333cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp}
100433cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp
100533cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp}  // namespace libyuv
1006