193d003f87426197b3e4891348960decf07c8742cfrkoenig@google.com/*
2b0c97975894a5eebebf9d93147cdd941a3accb63fbarchard@google.com *  Copyright 2011 The LibYuv Project Authors. All rights reserved.
393d003f87426197b3e4891348960decf07c8742cfrkoenig@google.com *
493d003f87426197b3e4891348960decf07c8742cfrkoenig@google.com *  Use of this source code is governed by a BSD-style license
593d003f87426197b3e4891348960decf07c8742cfrkoenig@google.com *  that can be found in the LICENSE file in the root of the source
693d003f87426197b3e4891348960decf07c8742cfrkoenig@google.com *  tree. An additional intellectual property rights grant can be found
7cde587092fef0dbed2c35602f30b79e7b892e766fbarchard@google.com *  in the file PATENTS. All contributing project authors may
893d003f87426197b3e4891348960decf07c8742cfrkoenig@google.com *  be found in the AUTHORS file in the root of the source tree.
993d003f87426197b3e4891348960decf07c8742cfrkoenig@google.com */
1093d003f87426197b3e4891348960decf07c8742cfrkoenig@google.com
1193d003f87426197b3e4891348960decf07c8742cfrkoenig@google.com#include <stdlib.h>
1293d003f87426197b3e4891348960decf07c8742cfrkoenig@google.com#include <time.h>
1393d003f87426197b3e4891348960decf07c8742cfrkoenig@google.com
14c7277d08e8d33d470b0f4a5e9c3c58f5f250f114fbarchard@google.com#include "libyuv/compare.h"
15c7277d08e8d33d470b0f4a5e9c3c58f5f250f114fbarchard@google.com#include "libyuv/convert.h"
16b1f5fae6376079b08addc46957e8510b6df3af92fbarchard@google.com#include "libyuv/convert_argb.h"
172bc55fa3209a5cae3e0eb8ab514c64f94da32572fbarchard@google.com#include "libyuv/convert_from.h"
18c7277d08e8d33d470b0f4a5e9c3c58f5f250f114fbarchard@google.com#include "libyuv/convert_from_argb.h"
1993d003f87426197b3e4891348960decf07c8742cfrkoenig@google.com#include "libyuv/cpu_id.h"
20b1f5fae6376079b08addc46957e8510b6df3af92fbarchard@google.com#include "libyuv/format_conversion.h"
212bc55fa3209a5cae3e0eb8ab514c64f94da32572fbarchard@google.com#include "libyuv/planar_functions.h"
222bc55fa3209a5cae3e0eb8ab514c64f94da32572fbarchard@google.com#include "libyuv/rotate.h"
23e1247eec9498c870a3d24cf9f70472a2fbb9825efbarchard@google.com#include "libyuv/row.h"  // For Sobel
247781d943b039f9143ab41cdba01dba1e8929161bfbarchard@google.com#include "../unit_test/unit_test.h"
2593d003f87426197b3e4891348960decf07c8742cfrkoenig@google.com
268ed54222e723037322579f15c36d4faddb924e91fbarchard@google.com#if defined(_MSC_VER)
278ed54222e723037322579f15c36d4faddb924e91fbarchard@google.com#define SIMD_ALIGNED(var) __declspec(align(16)) var
288ed54222e723037322579f15c36d4faddb924e91fbarchard@google.com#else  // __GNUC__
298ed54222e723037322579f15c36d4faddb924e91fbarchard@google.com#define SIMD_ALIGNED(var) var __attribute__((aligned(16)))
308ed54222e723037322579f15c36d4faddb924e91fbarchard@google.com#endif
318ed54222e723037322579f15c36d4faddb924e91fbarchard@google.com
3293d003f87426197b3e4891348960decf07c8742cfrkoenig@google.comnamespace libyuv {
3393d003f87426197b3e4891348960decf07c8742cfrkoenig@google.com
34810cd91079505f04cfec7481b51d04f08250d982fbarchard@google.comTEST_F(libyuvTest, TestAttenuate) {
35f6bd6c0ac5f4c053b32ec5518164d8e9c28e2518fbarchard@google.com  const int kSize = 1280 * 4;
36f6bd6c0ac5f4c053b32ec5518164d8e9c28e2518fbarchard@google.com  align_buffer_64(orig_pixels, kSize);
37f6bd6c0ac5f4c053b32ec5518164d8e9c28e2518fbarchard@google.com  align_buffer_64(atten_pixels, kSize);
38f6bd6c0ac5f4c053b32ec5518164d8e9c28e2518fbarchard@google.com  align_buffer_64(unatten_pixels, kSize);
39f6bd6c0ac5f4c053b32ec5518164d8e9c28e2518fbarchard@google.com  align_buffer_64(atten2_pixels, kSize);
40810cd91079505f04cfec7481b51d04f08250d982fbarchard@google.com
41810cd91079505f04cfec7481b51d04f08250d982fbarchard@google.com  // Test unattenuation clamps
42f6bd6c0ac5f4c053b32ec5518164d8e9c28e2518fbarchard@google.com  orig_pixels[0 * 4 + 0] = 200u;
43f6bd6c0ac5f4c053b32ec5518164d8e9c28e2518fbarchard@google.com  orig_pixels[0 * 4 + 1] = 129u;
44f6bd6c0ac5f4c053b32ec5518164d8e9c28e2518fbarchard@google.com  orig_pixels[0 * 4 + 2] = 127u;
45f6bd6c0ac5f4c053b32ec5518164d8e9c28e2518fbarchard@google.com  orig_pixels[0 * 4 + 3] = 128u;
46810cd91079505f04cfec7481b51d04f08250d982fbarchard@google.com  // Test unattenuation transparent and opaque are unaffected
47f6bd6c0ac5f4c053b32ec5518164d8e9c28e2518fbarchard@google.com  orig_pixels[1 * 4 + 0] = 16u;
48f6bd6c0ac5f4c053b32ec5518164d8e9c28e2518fbarchard@google.com  orig_pixels[1 * 4 + 1] = 64u;
49f6bd6c0ac5f4c053b32ec5518164d8e9c28e2518fbarchard@google.com  orig_pixels[1 * 4 + 2] = 192u;
50f6bd6c0ac5f4c053b32ec5518164d8e9c28e2518fbarchard@google.com  orig_pixels[1 * 4 + 3] = 0u;
51f6bd6c0ac5f4c053b32ec5518164d8e9c28e2518fbarchard@google.com  orig_pixels[2 * 4 + 0] = 16u;
52f6bd6c0ac5f4c053b32ec5518164d8e9c28e2518fbarchard@google.com  orig_pixels[2 * 4 + 1] = 64u;
53f6bd6c0ac5f4c053b32ec5518164d8e9c28e2518fbarchard@google.com  orig_pixels[2 * 4 + 2] = 192u;
54f6bd6c0ac5f4c053b32ec5518164d8e9c28e2518fbarchard@google.com  orig_pixels[2 * 4 + 3] = 255u;
55f6bd6c0ac5f4c053b32ec5518164d8e9c28e2518fbarchard@google.com  orig_pixels[3 * 4 + 0] = 16u;
56f6bd6c0ac5f4c053b32ec5518164d8e9c28e2518fbarchard@google.com  orig_pixels[3 * 4 + 1] = 64u;
57f6bd6c0ac5f4c053b32ec5518164d8e9c28e2518fbarchard@google.com  orig_pixels[3 * 4 + 2] = 192u;
58f6bd6c0ac5f4c053b32ec5518164d8e9c28e2518fbarchard@google.com  orig_pixels[3 * 4 + 3] = 128u;
59f6bd6c0ac5f4c053b32ec5518164d8e9c28e2518fbarchard@google.com  ARGBUnattenuate(orig_pixels, 0, unatten_pixels, 0, 4, 1);
60f6bd6c0ac5f4c053b32ec5518164d8e9c28e2518fbarchard@google.com  EXPECT_EQ(255u, unatten_pixels[0 * 4 + 0]);
61f6bd6c0ac5f4c053b32ec5518164d8e9c28e2518fbarchard@google.com  EXPECT_EQ(255u, unatten_pixels[0 * 4 + 1]);
62f6bd6c0ac5f4c053b32ec5518164d8e9c28e2518fbarchard@google.com  EXPECT_EQ(254u, unatten_pixels[0 * 4 + 2]);
63f6bd6c0ac5f4c053b32ec5518164d8e9c28e2518fbarchard@google.com  EXPECT_EQ(128u, unatten_pixels[0 * 4 + 3]);
64f6bd6c0ac5f4c053b32ec5518164d8e9c28e2518fbarchard@google.com  EXPECT_EQ(0u, unatten_pixels[1 * 4 + 0]);
65f6bd6c0ac5f4c053b32ec5518164d8e9c28e2518fbarchard@google.com  EXPECT_EQ(0u, unatten_pixels[1 * 4 + 1]);
66f6bd6c0ac5f4c053b32ec5518164d8e9c28e2518fbarchard@google.com  EXPECT_EQ(0u, unatten_pixels[1 * 4 + 2]);
67f6bd6c0ac5f4c053b32ec5518164d8e9c28e2518fbarchard@google.com  EXPECT_EQ(0u, unatten_pixels[1 * 4 + 3]);
68f6bd6c0ac5f4c053b32ec5518164d8e9c28e2518fbarchard@google.com  EXPECT_EQ(16u, unatten_pixels[2 * 4 + 0]);
69f6bd6c0ac5f4c053b32ec5518164d8e9c28e2518fbarchard@google.com  EXPECT_EQ(64u, unatten_pixels[2 * 4 + 1]);
70f6bd6c0ac5f4c053b32ec5518164d8e9c28e2518fbarchard@google.com  EXPECT_EQ(192u, unatten_pixels[2 * 4 + 2]);
71f6bd6c0ac5f4c053b32ec5518164d8e9c28e2518fbarchard@google.com  EXPECT_EQ(255u, unatten_pixels[2 * 4 + 3]);
72f6bd6c0ac5f4c053b32ec5518164d8e9c28e2518fbarchard@google.com  EXPECT_EQ(32u, unatten_pixels[3 * 4 + 0]);
73f6bd6c0ac5f4c053b32ec5518164d8e9c28e2518fbarchard@google.com  EXPECT_EQ(128u, unatten_pixels[3 * 4 + 1]);
74f6bd6c0ac5f4c053b32ec5518164d8e9c28e2518fbarchard@google.com  EXPECT_EQ(255u, unatten_pixels[3 * 4 + 2]);
75f6bd6c0ac5f4c053b32ec5518164d8e9c28e2518fbarchard@google.com  EXPECT_EQ(128u, unatten_pixels[3 * 4 + 3]);
76810cd91079505f04cfec7481b51d04f08250d982fbarchard@google.com
774b4b50fb445a166ce08e24d016157776b5df65cbfbarchard@google.com  for (int i = 0; i < 1280; ++i) {
78f6bd6c0ac5f4c053b32ec5518164d8e9c28e2518fbarchard@google.com    orig_pixels[i * 4 + 0] = i;
79f6bd6c0ac5f4c053b32ec5518164d8e9c28e2518fbarchard@google.com    orig_pixels[i * 4 + 1] = i / 2;
80f6bd6c0ac5f4c053b32ec5518164d8e9c28e2518fbarchard@google.com    orig_pixels[i * 4 + 2] = i / 3;
81f6bd6c0ac5f4c053b32ec5518164d8e9c28e2518fbarchard@google.com    orig_pixels[i * 4 + 3] = i;
82f86ba32b9d0ff0cfc669af2730ab0e61f6f3c67dfbarchard@google.com  }
83f6bd6c0ac5f4c053b32ec5518164d8e9c28e2518fbarchard@google.com  ARGBAttenuate(orig_pixels, 0, atten_pixels, 0, 1280, 1);
84f6bd6c0ac5f4c053b32ec5518164d8e9c28e2518fbarchard@google.com  ARGBUnattenuate(atten_pixels, 0, unatten_pixels, 0, 1280, 1);
854b4b50fb445a166ce08e24d016157776b5df65cbfbarchard@google.com  for (int i = 0; i < benchmark_pixels_div1280_; ++i) {
86f6bd6c0ac5f4c053b32ec5518164d8e9c28e2518fbarchard@google.com    ARGBAttenuate(unatten_pixels, 0, atten2_pixels, 0, 1280, 1);
878ed54222e723037322579f15c36d4faddb924e91fbarchard@google.com  }
884b4b50fb445a166ce08e24d016157776b5df65cbfbarchard@google.com  for (int i = 0; i < 1280; ++i) {
89f6bd6c0ac5f4c053b32ec5518164d8e9c28e2518fbarchard@google.com    EXPECT_NEAR(atten_pixels[i * 4 + 0], atten2_pixels[i * 4 + 0], 2);
90f6bd6c0ac5f4c053b32ec5518164d8e9c28e2518fbarchard@google.com    EXPECT_NEAR(atten_pixels[i * 4 + 1], atten2_pixels[i * 4 + 1], 2);
91f6bd6c0ac5f4c053b32ec5518164d8e9c28e2518fbarchard@google.com    EXPECT_NEAR(atten_pixels[i * 4 + 2], atten2_pixels[i * 4 + 2], 2);
92f6bd6c0ac5f4c053b32ec5518164d8e9c28e2518fbarchard@google.com    EXPECT_NEAR(atten_pixels[i * 4 + 3], atten2_pixels[i * 4 + 3], 2);
93f86ba32b9d0ff0cfc669af2730ab0e61f6f3c67dfbarchard@google.com  }
94f86ba32b9d0ff0cfc669af2730ab0e61f6f3c67dfbarchard@google.com  // Make sure transparent, 50% and opaque are fully accurate.
95f6bd6c0ac5f4c053b32ec5518164d8e9c28e2518fbarchard@google.com  EXPECT_EQ(0, atten_pixels[0 * 4 + 0]);
96f6bd6c0ac5f4c053b32ec5518164d8e9c28e2518fbarchard@google.com  EXPECT_EQ(0, atten_pixels[0 * 4 + 1]);
97f6bd6c0ac5f4c053b32ec5518164d8e9c28e2518fbarchard@google.com  EXPECT_EQ(0, atten_pixels[0 * 4 + 2]);
98f6bd6c0ac5f4c053b32ec5518164d8e9c28e2518fbarchard@google.com  EXPECT_EQ(0, atten_pixels[0 * 4 + 3]);
99f6bd6c0ac5f4c053b32ec5518164d8e9c28e2518fbarchard@google.com  EXPECT_EQ(64, atten_pixels[128 * 4 + 0]);
100f6bd6c0ac5f4c053b32ec5518164d8e9c28e2518fbarchard@google.com  EXPECT_EQ(32, atten_pixels[128 * 4 + 1]);
101f6bd6c0ac5f4c053b32ec5518164d8e9c28e2518fbarchard@google.com  EXPECT_EQ(21,  atten_pixels[128 * 4 + 2]);
102f6bd6c0ac5f4c053b32ec5518164d8e9c28e2518fbarchard@google.com  EXPECT_EQ(128, atten_pixels[128 * 4 + 3]);
103f6bd6c0ac5f4c053b32ec5518164d8e9c28e2518fbarchard@google.com  EXPECT_NEAR(255, atten_pixels[255 * 4 + 0], 1);
104f6bd6c0ac5f4c053b32ec5518164d8e9c28e2518fbarchard@google.com  EXPECT_NEAR(127, atten_pixels[255 * 4 + 1], 1);
105f6bd6c0ac5f4c053b32ec5518164d8e9c28e2518fbarchard@google.com  EXPECT_NEAR(85,  atten_pixels[255 * 4 + 2], 1);
106f6bd6c0ac5f4c053b32ec5518164d8e9c28e2518fbarchard@google.com  EXPECT_EQ(255, atten_pixels[255 * 4 + 3]);
107f6bd6c0ac5f4c053b32ec5518164d8e9c28e2518fbarchard@google.com
108ae9a1388a71a3154ef7d6f753c8e568c97554fc0fbarchard@google.com  free_aligned_buffer_64(atten2_pixels);
109ae9a1388a71a3154ef7d6f753c8e568c97554fc0fbarchard@google.com  free_aligned_buffer_64(unatten_pixels);
110ae9a1388a71a3154ef7d6f753c8e568c97554fc0fbarchard@google.com  free_aligned_buffer_64(atten_pixels);
111ae9a1388a71a3154ef7d6f753c8e568c97554fc0fbarchard@google.com  free_aligned_buffer_64(orig_pixels);
112f86ba32b9d0ff0cfc669af2730ab0e61f6f3c67dfbarchard@google.com}
11355663028660fc08ae9b0a461e044c4da56464f05fbarchard@google.com
1141d160cb99f2b05df80c4555bd769825ad1175dc9fbarchard@google.comstatic int TestAttenuateI(int width, int height, int benchmark_iterations,
1151d160cb99f2b05df80c4555bd769825ad1175dc9fbarchard@google.com                          int invert, int off) {
1164e0d7cc2c60e8aa85954c48927c6be08ee2b9db4fbarchard@google.com  if (width < 1) {
1174e0d7cc2c60e8aa85954c48927c6be08ee2b9db4fbarchard@google.com    width = 1;
1184e0d7cc2c60e8aa85954c48927c6be08ee2b9db4fbarchard@google.com  }
1191d160cb99f2b05df80c4555bd769825ad1175dc9fbarchard@google.com  const int kBpp = 4;
1201d160cb99f2b05df80c4555bd769825ad1175dc9fbarchard@google.com  const int kStride = (width * kBpp + 15) & ~15;
1211d160cb99f2b05df80c4555bd769825ad1175dc9fbarchard@google.com  align_buffer_64(src_argb, kStride * height + off);
1221d160cb99f2b05df80c4555bd769825ad1175dc9fbarchard@google.com  align_buffer_64(dst_argb_c, kStride * height);
1231d160cb99f2b05df80c4555bd769825ad1175dc9fbarchard@google.com  align_buffer_64(dst_argb_opt, kStride * height);
1241d160cb99f2b05df80c4555bd769825ad1175dc9fbarchard@google.com  srandom(time(NULL));
1251d160cb99f2b05df80c4555bd769825ad1175dc9fbarchard@google.com  for (int i = 0; i < kStride * height; ++i) {
1261d160cb99f2b05df80c4555bd769825ad1175dc9fbarchard@google.com    src_argb[i + off] = (random() & 0xff);
1271d160cb99f2b05df80c4555bd769825ad1175dc9fbarchard@google.com  }
1281d160cb99f2b05df80c4555bd769825ad1175dc9fbarchard@google.com  memset(dst_argb_c, 0, kStride * height);
1291d160cb99f2b05df80c4555bd769825ad1175dc9fbarchard@google.com  memset(dst_argb_opt, 0, kStride * height);
1301d160cb99f2b05df80c4555bd769825ad1175dc9fbarchard@google.com
1311d160cb99f2b05df80c4555bd769825ad1175dc9fbarchard@google.com  MaskCpuFlags(0);
1321d160cb99f2b05df80c4555bd769825ad1175dc9fbarchard@google.com  ARGBAttenuate(src_argb + off, kStride,
1331d160cb99f2b05df80c4555bd769825ad1175dc9fbarchard@google.com                dst_argb_c, kStride,
1341d160cb99f2b05df80c4555bd769825ad1175dc9fbarchard@google.com                width, invert * height);
1351d160cb99f2b05df80c4555bd769825ad1175dc9fbarchard@google.com  MaskCpuFlags(-1);
1361d160cb99f2b05df80c4555bd769825ad1175dc9fbarchard@google.com  for (int i = 0; i < benchmark_iterations; ++i) {
1371d160cb99f2b05df80c4555bd769825ad1175dc9fbarchard@google.com    ARGBAttenuate(src_argb + off, kStride,
1381d160cb99f2b05df80c4555bd769825ad1175dc9fbarchard@google.com                  dst_argb_opt, kStride,
1391d160cb99f2b05df80c4555bd769825ad1175dc9fbarchard@google.com                  width, invert * height);
1401d160cb99f2b05df80c4555bd769825ad1175dc9fbarchard@google.com  }
1411d160cb99f2b05df80c4555bd769825ad1175dc9fbarchard@google.com  int max_diff = 0;
1421d160cb99f2b05df80c4555bd769825ad1175dc9fbarchard@google.com  for (int i = 0; i < kStride * height; ++i) {
1431d160cb99f2b05df80c4555bd769825ad1175dc9fbarchard@google.com    int abs_diff =
1441d160cb99f2b05df80c4555bd769825ad1175dc9fbarchard@google.com        abs(static_cast<int>(dst_argb_c[i]) -
1451d160cb99f2b05df80c4555bd769825ad1175dc9fbarchard@google.com            static_cast<int>(dst_argb_opt[i]));
1461d160cb99f2b05df80c4555bd769825ad1175dc9fbarchard@google.com    if (abs_diff > max_diff) {
1471d160cb99f2b05df80c4555bd769825ad1175dc9fbarchard@google.com      max_diff = abs_diff;
1481d160cb99f2b05df80c4555bd769825ad1175dc9fbarchard@google.com    }
1491d160cb99f2b05df80c4555bd769825ad1175dc9fbarchard@google.com  }
150ae9a1388a71a3154ef7d6f753c8e568c97554fc0fbarchard@google.com  free_aligned_buffer_64(src_argb);
151ae9a1388a71a3154ef7d6f753c8e568c97554fc0fbarchard@google.com  free_aligned_buffer_64(dst_argb_c);
152ae9a1388a71a3154ef7d6f753c8e568c97554fc0fbarchard@google.com  free_aligned_buffer_64(dst_argb_opt);
1531d160cb99f2b05df80c4555bd769825ad1175dc9fbarchard@google.com  return max_diff;
1541d160cb99f2b05df80c4555bd769825ad1175dc9fbarchard@google.com}
1551d160cb99f2b05df80c4555bd769825ad1175dc9fbarchard@google.com
1561d160cb99f2b05df80c4555bd769825ad1175dc9fbarchard@google.comTEST_F(libyuvTest, ARGBAttenuate_Any) {
1571d160cb99f2b05df80c4555bd769825ad1175dc9fbarchard@google.com  int max_diff = TestAttenuateI(benchmark_width_ - 1, benchmark_height_,
1581d160cb99f2b05df80c4555bd769825ad1175dc9fbarchard@google.com                                benchmark_iterations_, +1, 0);
1591d160cb99f2b05df80c4555bd769825ad1175dc9fbarchard@google.com  EXPECT_LE(max_diff, 2);
1601d160cb99f2b05df80c4555bd769825ad1175dc9fbarchard@google.com}
1611d160cb99f2b05df80c4555bd769825ad1175dc9fbarchard@google.com
1621d160cb99f2b05df80c4555bd769825ad1175dc9fbarchard@google.comTEST_F(libyuvTest, ARGBAttenuate_Unaligned) {
1631d160cb99f2b05df80c4555bd769825ad1175dc9fbarchard@google.com  int max_diff = TestAttenuateI(benchmark_width_, benchmark_height_,
1641d160cb99f2b05df80c4555bd769825ad1175dc9fbarchard@google.com                                benchmark_iterations_, +1, 1);
1651d160cb99f2b05df80c4555bd769825ad1175dc9fbarchard@google.com  EXPECT_LE(max_diff, 2);
1661d160cb99f2b05df80c4555bd769825ad1175dc9fbarchard@google.com}
1671d160cb99f2b05df80c4555bd769825ad1175dc9fbarchard@google.com
1681d160cb99f2b05df80c4555bd769825ad1175dc9fbarchard@google.comTEST_F(libyuvTest, ARGBAttenuate_Invert) {
1691d160cb99f2b05df80c4555bd769825ad1175dc9fbarchard@google.com  int max_diff = TestAttenuateI(benchmark_width_, benchmark_height_,
1701d160cb99f2b05df80c4555bd769825ad1175dc9fbarchard@google.com                                benchmark_iterations_, -1, 0);
1711d160cb99f2b05df80c4555bd769825ad1175dc9fbarchard@google.com  EXPECT_LE(max_diff, 2);
1721d160cb99f2b05df80c4555bd769825ad1175dc9fbarchard@google.com}
1731d160cb99f2b05df80c4555bd769825ad1175dc9fbarchard@google.com
1741d160cb99f2b05df80c4555bd769825ad1175dc9fbarchard@google.comTEST_F(libyuvTest, ARGBAttenuate_Opt) {
1751d160cb99f2b05df80c4555bd769825ad1175dc9fbarchard@google.com  int max_diff = TestAttenuateI(benchmark_width_, benchmark_height_,
1761d160cb99f2b05df80c4555bd769825ad1175dc9fbarchard@google.com                                benchmark_iterations_, +1, 0);
1773c7bb050bd54264f360ced29c1cd2777483bd6f0fbarchard@google.com  EXPECT_LE(max_diff, 2);
1783c7bb050bd54264f360ced29c1cd2777483bd6f0fbarchard@google.com}
1793c7bb050bd54264f360ced29c1cd2777483bd6f0fbarchard@google.com
1803c7bb050bd54264f360ced29c1cd2777483bd6f0fbarchard@google.comstatic int TestUnattenuateI(int width, int height, int benchmark_iterations,
1813c7bb050bd54264f360ced29c1cd2777483bd6f0fbarchard@google.com                            int invert, int off) {
1824e0d7cc2c60e8aa85954c48927c6be08ee2b9db4fbarchard@google.com  if (width < 1) {
1834e0d7cc2c60e8aa85954c48927c6be08ee2b9db4fbarchard@google.com    width = 1;
1844e0d7cc2c60e8aa85954c48927c6be08ee2b9db4fbarchard@google.com  }
1853c7bb050bd54264f360ced29c1cd2777483bd6f0fbarchard@google.com  const int kBpp = 4;
1863c7bb050bd54264f360ced29c1cd2777483bd6f0fbarchard@google.com  const int kStride = (width * kBpp + 15) & ~15;
1873c7bb050bd54264f360ced29c1cd2777483bd6f0fbarchard@google.com  align_buffer_64(src_argb, kStride * height + off);
1883c7bb050bd54264f360ced29c1cd2777483bd6f0fbarchard@google.com  align_buffer_64(dst_argb_c, kStride * height);
1893c7bb050bd54264f360ced29c1cd2777483bd6f0fbarchard@google.com  align_buffer_64(dst_argb_opt, kStride * height);
1903c7bb050bd54264f360ced29c1cd2777483bd6f0fbarchard@google.com  srandom(time(NULL));
1913c7bb050bd54264f360ced29c1cd2777483bd6f0fbarchard@google.com  for (int i = 0; i < kStride * height; ++i) {
1923c7bb050bd54264f360ced29c1cd2777483bd6f0fbarchard@google.com    src_argb[i + off] = (random() & 0xff);
1933c7bb050bd54264f360ced29c1cd2777483bd6f0fbarchard@google.com  }
1943c7bb050bd54264f360ced29c1cd2777483bd6f0fbarchard@google.com  ARGBAttenuate(src_argb + off, kStride,
1953c7bb050bd54264f360ced29c1cd2777483bd6f0fbarchard@google.com                src_argb + off, kStride,
1963c7bb050bd54264f360ced29c1cd2777483bd6f0fbarchard@google.com                width, height);
1973c7bb050bd54264f360ced29c1cd2777483bd6f0fbarchard@google.com  memset(dst_argb_c, 0, kStride * height);
1983c7bb050bd54264f360ced29c1cd2777483bd6f0fbarchard@google.com  memset(dst_argb_opt, 0, kStride * height);
1993c7bb050bd54264f360ced29c1cd2777483bd6f0fbarchard@google.com
2003c7bb050bd54264f360ced29c1cd2777483bd6f0fbarchard@google.com  MaskCpuFlags(0);
2013c7bb050bd54264f360ced29c1cd2777483bd6f0fbarchard@google.com  ARGBUnattenuate(src_argb + off, kStride,
2023c7bb050bd54264f360ced29c1cd2777483bd6f0fbarchard@google.com                  dst_argb_c, kStride,
2033c7bb050bd54264f360ced29c1cd2777483bd6f0fbarchard@google.com                  width, invert * height);
2043c7bb050bd54264f360ced29c1cd2777483bd6f0fbarchard@google.com  MaskCpuFlags(-1);
2053c7bb050bd54264f360ced29c1cd2777483bd6f0fbarchard@google.com  for (int i = 0; i < benchmark_iterations; ++i) {
2063c7bb050bd54264f360ced29c1cd2777483bd6f0fbarchard@google.com    ARGBUnattenuate(src_argb + off, kStride,
2073c7bb050bd54264f360ced29c1cd2777483bd6f0fbarchard@google.com                    dst_argb_opt, kStride,
2083c7bb050bd54264f360ced29c1cd2777483bd6f0fbarchard@google.com                    width, invert * height);
2093c7bb050bd54264f360ced29c1cd2777483bd6f0fbarchard@google.com  }
2103c7bb050bd54264f360ced29c1cd2777483bd6f0fbarchard@google.com  int max_diff = 0;
2113c7bb050bd54264f360ced29c1cd2777483bd6f0fbarchard@google.com  for (int i = 0; i < kStride * height; ++i) {
2123c7bb050bd54264f360ced29c1cd2777483bd6f0fbarchard@google.com    int abs_diff =
2133c7bb050bd54264f360ced29c1cd2777483bd6f0fbarchard@google.com        abs(static_cast<int>(dst_argb_c[i]) -
2143c7bb050bd54264f360ced29c1cd2777483bd6f0fbarchard@google.com            static_cast<int>(dst_argb_opt[i]));
2153c7bb050bd54264f360ced29c1cd2777483bd6f0fbarchard@google.com    if (abs_diff > max_diff) {
2163c7bb050bd54264f360ced29c1cd2777483bd6f0fbarchard@google.com      max_diff = abs_diff;
2173c7bb050bd54264f360ced29c1cd2777483bd6f0fbarchard@google.com    }
2183c7bb050bd54264f360ced29c1cd2777483bd6f0fbarchard@google.com  }
219ae9a1388a71a3154ef7d6f753c8e568c97554fc0fbarchard@google.com  free_aligned_buffer_64(src_argb);
220ae9a1388a71a3154ef7d6f753c8e568c97554fc0fbarchard@google.com  free_aligned_buffer_64(dst_argb_c);
221ae9a1388a71a3154ef7d6f753c8e568c97554fc0fbarchard@google.com  free_aligned_buffer_64(dst_argb_opt);
2223c7bb050bd54264f360ced29c1cd2777483bd6f0fbarchard@google.com  return max_diff;
2233c7bb050bd54264f360ced29c1cd2777483bd6f0fbarchard@google.com}
2243c7bb050bd54264f360ced29c1cd2777483bd6f0fbarchard@google.com
2253c7bb050bd54264f360ced29c1cd2777483bd6f0fbarchard@google.comTEST_F(libyuvTest, ARGBUnattenuate_Any) {
2263c7bb050bd54264f360ced29c1cd2777483bd6f0fbarchard@google.com  int max_diff = TestUnattenuateI(benchmark_width_ - 1, benchmark_height_,
2273c7bb050bd54264f360ced29c1cd2777483bd6f0fbarchard@google.com                                  benchmark_iterations_, +1, 0);
2283c7bb050bd54264f360ced29c1cd2777483bd6f0fbarchard@google.com  EXPECT_LE(max_diff, 2);
2293c7bb050bd54264f360ced29c1cd2777483bd6f0fbarchard@google.com}
2303c7bb050bd54264f360ced29c1cd2777483bd6f0fbarchard@google.com
2313c7bb050bd54264f360ced29c1cd2777483bd6f0fbarchard@google.comTEST_F(libyuvTest, ARGBUnattenuate_Unaligned) {
2323c7bb050bd54264f360ced29c1cd2777483bd6f0fbarchard@google.com  int max_diff = TestUnattenuateI(benchmark_width_, benchmark_height_,
2333c7bb050bd54264f360ced29c1cd2777483bd6f0fbarchard@google.com                                  benchmark_iterations_, +1, 1);
2343c7bb050bd54264f360ced29c1cd2777483bd6f0fbarchard@google.com  EXPECT_LE(max_diff, 2);
2353c7bb050bd54264f360ced29c1cd2777483bd6f0fbarchard@google.com}
2363c7bb050bd54264f360ced29c1cd2777483bd6f0fbarchard@google.com
2373c7bb050bd54264f360ced29c1cd2777483bd6f0fbarchard@google.comTEST_F(libyuvTest, ARGBUnattenuate_Invert) {
2383c7bb050bd54264f360ced29c1cd2777483bd6f0fbarchard@google.com  int max_diff = TestUnattenuateI(benchmark_width_, benchmark_height_,
2393c7bb050bd54264f360ced29c1cd2777483bd6f0fbarchard@google.com                                  benchmark_iterations_, -1, 0);
2403c7bb050bd54264f360ced29c1cd2777483bd6f0fbarchard@google.com  EXPECT_LE(max_diff, 2);
2413c7bb050bd54264f360ced29c1cd2777483bd6f0fbarchard@google.com}
2423c7bb050bd54264f360ced29c1cd2777483bd6f0fbarchard@google.com
2433c7bb050bd54264f360ced29c1cd2777483bd6f0fbarchard@google.comTEST_F(libyuvTest, ARGBUnattenuate_Opt) {
2443c7bb050bd54264f360ced29c1cd2777483bd6f0fbarchard@google.com  int max_diff = TestUnattenuateI(benchmark_width_, benchmark_height_,
2453c7bb050bd54264f360ced29c1cd2777483bd6f0fbarchard@google.com                                  benchmark_iterations_, +1, 0);
2461d160cb99f2b05df80c4555bd769825ad1175dc9fbarchard@google.com  EXPECT_LE(max_diff, 2);
2471d160cb99f2b05df80c4555bd769825ad1175dc9fbarchard@google.com}
2481d160cb99f2b05df80c4555bd769825ad1175dc9fbarchard@google.com
249f51e87912eebc959ac6b9d1ab44978e0e056ca74fbarchard@google.comTEST_F(libyuvTest, TestARGBComputeCumulativeSum) {
250f51e87912eebc959ac6b9d1ab44978e0e056ca74fbarchard@google.com  SIMD_ALIGNED(uint8 orig_pixels[16][16][4]);
251f51e87912eebc959ac6b9d1ab44978e0e056ca74fbarchard@google.com  SIMD_ALIGNED(int32 added_pixels[16][16][4]);
25255663028660fc08ae9b0a461e044c4da56464f05fbarchard@google.com
253f51e87912eebc959ac6b9d1ab44978e0e056ca74fbarchard@google.com  for (int y = 0; y < 16; ++y) {
254f51e87912eebc959ac6b9d1ab44978e0e056ca74fbarchard@google.com    for (int x = 0; x < 16; ++x) {
255f51e87912eebc959ac6b9d1ab44978e0e056ca74fbarchard@google.com      orig_pixels[y][x][0] = 1u;
256f51e87912eebc959ac6b9d1ab44978e0e056ca74fbarchard@google.com      orig_pixels[y][x][1] = 2u;
257f51e87912eebc959ac6b9d1ab44978e0e056ca74fbarchard@google.com      orig_pixels[y][x][2] = 3u;
258f51e87912eebc959ac6b9d1ab44978e0e056ca74fbarchard@google.com      orig_pixels[y][x][3] = 255u;
259f51e87912eebc959ac6b9d1ab44978e0e056ca74fbarchard@google.com    }
26055663028660fc08ae9b0a461e044c4da56464f05fbarchard@google.com  }
26155663028660fc08ae9b0a461e044c4da56464f05fbarchard@google.com
262f51e87912eebc959ac6b9d1ab44978e0e056ca74fbarchard@google.com  ARGBComputeCumulativeSum(&orig_pixels[0][0][0], 16 * 4,
263f51e87912eebc959ac6b9d1ab44978e0e056ca74fbarchard@google.com                           &added_pixels[0][0][0], 16 * 4,
264f51e87912eebc959ac6b9d1ab44978e0e056ca74fbarchard@google.com                           16, 16);
26555663028660fc08ae9b0a461e044c4da56464f05fbarchard@google.com
266f51e87912eebc959ac6b9d1ab44978e0e056ca74fbarchard@google.com  for (int y = 0; y < 16; ++y) {
267f51e87912eebc959ac6b9d1ab44978e0e056ca74fbarchard@google.com    for (int x = 0; x < 16; ++x) {
268f51e87912eebc959ac6b9d1ab44978e0e056ca74fbarchard@google.com      EXPECT_EQ((x + 1) * (y + 1), added_pixels[y][x][0]);
269f51e87912eebc959ac6b9d1ab44978e0e056ca74fbarchard@google.com      EXPECT_EQ((x + 1) * (y + 1) * 2, added_pixels[y][x][1]);
270f51e87912eebc959ac6b9d1ab44978e0e056ca74fbarchard@google.com      EXPECT_EQ((x + 1) * (y + 1) * 3, added_pixels[y][x][2]);
271f51e87912eebc959ac6b9d1ab44978e0e056ca74fbarchard@google.com      EXPECT_EQ((x + 1) * (y + 1) * 255, added_pixels[y][x][3]);
272f51e87912eebc959ac6b9d1ab44978e0e056ca74fbarchard@google.com    }
27355663028660fc08ae9b0a461e044c4da56464f05fbarchard@google.com  }
27455663028660fc08ae9b0a461e044c4da56464f05fbarchard@google.com}
275ffaea7eee38e593a3e63553ffa90e554ba81fe30fbarchard@google.com
276ffaea7eee38e593a3e63553ffa90e554ba81fe30fbarchard@google.comTEST_F(libyuvTest, TestARGBGray) {
2774b4b50fb445a166ce08e24d016157776b5df65cbfbarchard@google.com  SIMD_ALIGNED(uint8 orig_pixels[1280][4]);
27807c3fe2f6116b66556160957dadfb57423ee9166fbarchard@google.com  memset(orig_pixels, 0, sizeof(orig_pixels));
27907c3fe2f6116b66556160957dadfb57423ee9166fbarchard@google.com
280ffaea7eee38e593a3e63553ffa90e554ba81fe30fbarchard@google.com  // Test blue
281ffaea7eee38e593a3e63553ffa90e554ba81fe30fbarchard@google.com  orig_pixels[0][0] = 255u;
282ffaea7eee38e593a3e63553ffa90e554ba81fe30fbarchard@google.com  orig_pixels[0][1] = 0u;
283ffaea7eee38e593a3e63553ffa90e554ba81fe30fbarchard@google.com  orig_pixels[0][2] = 0u;
284ffaea7eee38e593a3e63553ffa90e554ba81fe30fbarchard@google.com  orig_pixels[0][3] = 128u;
285ffaea7eee38e593a3e63553ffa90e554ba81fe30fbarchard@google.com  // Test green
286ffaea7eee38e593a3e63553ffa90e554ba81fe30fbarchard@google.com  orig_pixels[1][0] = 0u;
287ffaea7eee38e593a3e63553ffa90e554ba81fe30fbarchard@google.com  orig_pixels[1][1] = 255u;
288ffaea7eee38e593a3e63553ffa90e554ba81fe30fbarchard@google.com  orig_pixels[1][2] = 0u;
289ffaea7eee38e593a3e63553ffa90e554ba81fe30fbarchard@google.com  orig_pixels[1][3] = 0u;
290ffaea7eee38e593a3e63553ffa90e554ba81fe30fbarchard@google.com  // Test red
291ffaea7eee38e593a3e63553ffa90e554ba81fe30fbarchard@google.com  orig_pixels[2][0] = 0u;
292ffaea7eee38e593a3e63553ffa90e554ba81fe30fbarchard@google.com  orig_pixels[2][1] = 0u;
293ffaea7eee38e593a3e63553ffa90e554ba81fe30fbarchard@google.com  orig_pixels[2][2] = 255u;
294ffaea7eee38e593a3e63553ffa90e554ba81fe30fbarchard@google.com  orig_pixels[2][3] = 255u;
295050b39a5cbf6c0f529531aafba36f2c846a139b1fbarchard@google.com  // Test black
296050b39a5cbf6c0f529531aafba36f2c846a139b1fbarchard@google.com  orig_pixels[3][0] = 0u;
297050b39a5cbf6c0f529531aafba36f2c846a139b1fbarchard@google.com  orig_pixels[3][1] = 0u;
298050b39a5cbf6c0f529531aafba36f2c846a139b1fbarchard@google.com  orig_pixels[3][2] = 0u;
299050b39a5cbf6c0f529531aafba36f2c846a139b1fbarchard@google.com  orig_pixels[3][3] = 255u;
300050b39a5cbf6c0f529531aafba36f2c846a139b1fbarchard@google.com  // Test white
301050b39a5cbf6c0f529531aafba36f2c846a139b1fbarchard@google.com  orig_pixels[4][0] = 255u;
302050b39a5cbf6c0f529531aafba36f2c846a139b1fbarchard@google.com  orig_pixels[4][1] = 255u;
303050b39a5cbf6c0f529531aafba36f2c846a139b1fbarchard@google.com  orig_pixels[4][2] = 255u;
304050b39a5cbf6c0f529531aafba36f2c846a139b1fbarchard@google.com  orig_pixels[4][3] = 255u;
305ffaea7eee38e593a3e63553ffa90e554ba81fe30fbarchard@google.com  // Test color
306050b39a5cbf6c0f529531aafba36f2c846a139b1fbarchard@google.com  orig_pixels[5][0] = 16u;
307050b39a5cbf6c0f529531aafba36f2c846a139b1fbarchard@google.com  orig_pixels[5][1] = 64u;
308050b39a5cbf6c0f529531aafba36f2c846a139b1fbarchard@google.com  orig_pixels[5][2] = 192u;
309050b39a5cbf6c0f529531aafba36f2c846a139b1fbarchard@google.com  orig_pixels[5][3] = 224u;
310221e602f8a726f7457a0d521b5bcca05d89215bbfbarchard@google.com  // Do 16 to test asm version.
311221e602f8a726f7457a0d521b5bcca05d89215bbfbarchard@google.com  ARGBGray(&orig_pixels[0][0], 0, 0, 0, 16, 1);
312050b39a5cbf6c0f529531aafba36f2c846a139b1fbarchard@google.com  EXPECT_EQ(30u, orig_pixels[0][0]);
313050b39a5cbf6c0f529531aafba36f2c846a139b1fbarchard@google.com  EXPECT_EQ(30u, orig_pixels[0][1]);
314050b39a5cbf6c0f529531aafba36f2c846a139b1fbarchard@google.com  EXPECT_EQ(30u, orig_pixels[0][2]);
315ffaea7eee38e593a3e63553ffa90e554ba81fe30fbarchard@google.com  EXPECT_EQ(128u, orig_pixels[0][3]);
316050b39a5cbf6c0f529531aafba36f2c846a139b1fbarchard@google.com  EXPECT_EQ(149u, orig_pixels[1][0]);
317050b39a5cbf6c0f529531aafba36f2c846a139b1fbarchard@google.com  EXPECT_EQ(149u, orig_pixels[1][1]);
318050b39a5cbf6c0f529531aafba36f2c846a139b1fbarchard@google.com  EXPECT_EQ(149u, orig_pixels[1][2]);
319ffaea7eee38e593a3e63553ffa90e554ba81fe30fbarchard@google.com  EXPECT_EQ(0u, orig_pixels[1][3]);
320050b39a5cbf6c0f529531aafba36f2c846a139b1fbarchard@google.com  EXPECT_EQ(76u, orig_pixels[2][0]);
321050b39a5cbf6c0f529531aafba36f2c846a139b1fbarchard@google.com  EXPECT_EQ(76u, orig_pixels[2][1]);
322050b39a5cbf6c0f529531aafba36f2c846a139b1fbarchard@google.com  EXPECT_EQ(76u, orig_pixels[2][2]);
323ffaea7eee38e593a3e63553ffa90e554ba81fe30fbarchard@google.com  EXPECT_EQ(255u, orig_pixels[2][3]);
324050b39a5cbf6c0f529531aafba36f2c846a139b1fbarchard@google.com  EXPECT_EQ(0u, orig_pixels[3][0]);
325050b39a5cbf6c0f529531aafba36f2c846a139b1fbarchard@google.com  EXPECT_EQ(0u, orig_pixels[3][1]);
326050b39a5cbf6c0f529531aafba36f2c846a139b1fbarchard@google.com  EXPECT_EQ(0u, orig_pixels[3][2]);
327050b39a5cbf6c0f529531aafba36f2c846a139b1fbarchard@google.com  EXPECT_EQ(255u, orig_pixels[3][3]);
328050b39a5cbf6c0f529531aafba36f2c846a139b1fbarchard@google.com  EXPECT_EQ(255u, orig_pixels[4][0]);
329050b39a5cbf6c0f529531aafba36f2c846a139b1fbarchard@google.com  EXPECT_EQ(255u, orig_pixels[4][1]);
330050b39a5cbf6c0f529531aafba36f2c846a139b1fbarchard@google.com  EXPECT_EQ(255u, orig_pixels[4][2]);
331050b39a5cbf6c0f529531aafba36f2c846a139b1fbarchard@google.com  EXPECT_EQ(255u, orig_pixels[4][3]);
332050b39a5cbf6c0f529531aafba36f2c846a139b1fbarchard@google.com  EXPECT_EQ(96u, orig_pixels[5][0]);
333050b39a5cbf6c0f529531aafba36f2c846a139b1fbarchard@google.com  EXPECT_EQ(96u, orig_pixels[5][1]);
334050b39a5cbf6c0f529531aafba36f2c846a139b1fbarchard@google.com  EXPECT_EQ(96u, orig_pixels[5][2]);
335050b39a5cbf6c0f529531aafba36f2c846a139b1fbarchard@google.com  EXPECT_EQ(224u, orig_pixels[5][3]);
3364b4b50fb445a166ce08e24d016157776b5df65cbfbarchard@google.com  for (int i = 0; i < 1280; ++i) {
337ffaea7eee38e593a3e63553ffa90e554ba81fe30fbarchard@google.com    orig_pixels[i][0] = i;
338ffaea7eee38e593a3e63553ffa90e554ba81fe30fbarchard@google.com    orig_pixels[i][1] = i / 2;
339ffaea7eee38e593a3e63553ffa90e554ba81fe30fbarchard@google.com    orig_pixels[i][2] = i / 3;
340ffaea7eee38e593a3e63553ffa90e554ba81fe30fbarchard@google.com    orig_pixels[i][3] = i;
341ffaea7eee38e593a3e63553ffa90e554ba81fe30fbarchard@google.com  }
3424b4b50fb445a166ce08e24d016157776b5df65cbfbarchard@google.com  for (int i = 0; i < benchmark_pixels_div1280_; ++i) {
3434b4b50fb445a166ce08e24d016157776b5df65cbfbarchard@google.com    ARGBGray(&orig_pixels[0][0], 0, 0, 0, 1280, 1);
344ffaea7eee38e593a3e63553ffa90e554ba81fe30fbarchard@google.com  }
34593d003f87426197b3e4891348960decf07c8742cfrkoenig@google.com}
346221e602f8a726f7457a0d521b5bcca05d89215bbfbarchard@google.com
347eeac2903ef22110d475c50ef9bfd7826d3183a5efbarchard@google.comTEST_F(libyuvTest, TestARGBGrayTo) {
3484b4b50fb445a166ce08e24d016157776b5df65cbfbarchard@google.com  SIMD_ALIGNED(uint8 orig_pixels[1280][4]);
3494b4b50fb445a166ce08e24d016157776b5df65cbfbarchard@google.com  SIMD_ALIGNED(uint8 gray_pixels[1280][4]);
35007c3fe2f6116b66556160957dadfb57423ee9166fbarchard@google.com  memset(orig_pixels, 0, sizeof(orig_pixels));
35107c3fe2f6116b66556160957dadfb57423ee9166fbarchard@google.com
352eeac2903ef22110d475c50ef9bfd7826d3183a5efbarchard@google.com  // Test blue
353eeac2903ef22110d475c50ef9bfd7826d3183a5efbarchard@google.com  orig_pixels[0][0] = 255u;
354eeac2903ef22110d475c50ef9bfd7826d3183a5efbarchard@google.com  orig_pixels[0][1] = 0u;
355eeac2903ef22110d475c50ef9bfd7826d3183a5efbarchard@google.com  orig_pixels[0][2] = 0u;
356eeac2903ef22110d475c50ef9bfd7826d3183a5efbarchard@google.com  orig_pixels[0][3] = 128u;
357eeac2903ef22110d475c50ef9bfd7826d3183a5efbarchard@google.com  // Test green
358eeac2903ef22110d475c50ef9bfd7826d3183a5efbarchard@google.com  orig_pixels[1][0] = 0u;
359eeac2903ef22110d475c50ef9bfd7826d3183a5efbarchard@google.com  orig_pixels[1][1] = 255u;
360eeac2903ef22110d475c50ef9bfd7826d3183a5efbarchard@google.com  orig_pixels[1][2] = 0u;
361eeac2903ef22110d475c50ef9bfd7826d3183a5efbarchard@google.com  orig_pixels[1][3] = 0u;
362eeac2903ef22110d475c50ef9bfd7826d3183a5efbarchard@google.com  // Test red
363eeac2903ef22110d475c50ef9bfd7826d3183a5efbarchard@google.com  orig_pixels[2][0] = 0u;
364eeac2903ef22110d475c50ef9bfd7826d3183a5efbarchard@google.com  orig_pixels[2][1] = 0u;
365eeac2903ef22110d475c50ef9bfd7826d3183a5efbarchard@google.com  orig_pixels[2][2] = 255u;
366eeac2903ef22110d475c50ef9bfd7826d3183a5efbarchard@google.com  orig_pixels[2][3] = 255u;
367050b39a5cbf6c0f529531aafba36f2c846a139b1fbarchard@google.com  // Test black
368050b39a5cbf6c0f529531aafba36f2c846a139b1fbarchard@google.com  orig_pixels[3][0] = 0u;
369050b39a5cbf6c0f529531aafba36f2c846a139b1fbarchard@google.com  orig_pixels[3][1] = 0u;
370050b39a5cbf6c0f529531aafba36f2c846a139b1fbarchard@google.com  orig_pixels[3][2] = 0u;
371050b39a5cbf6c0f529531aafba36f2c846a139b1fbarchard@google.com  orig_pixels[3][3] = 255u;
372050b39a5cbf6c0f529531aafba36f2c846a139b1fbarchard@google.com  // Test white
373050b39a5cbf6c0f529531aafba36f2c846a139b1fbarchard@google.com  orig_pixels[4][0] = 255u;
374050b39a5cbf6c0f529531aafba36f2c846a139b1fbarchard@google.com  orig_pixels[4][1] = 255u;
375050b39a5cbf6c0f529531aafba36f2c846a139b1fbarchard@google.com  orig_pixels[4][2] = 255u;
376050b39a5cbf6c0f529531aafba36f2c846a139b1fbarchard@google.com  orig_pixels[4][3] = 255u;
377eeac2903ef22110d475c50ef9bfd7826d3183a5efbarchard@google.com  // Test color
378050b39a5cbf6c0f529531aafba36f2c846a139b1fbarchard@google.com  orig_pixels[5][0] = 16u;
379050b39a5cbf6c0f529531aafba36f2c846a139b1fbarchard@google.com  orig_pixels[5][1] = 64u;
380050b39a5cbf6c0f529531aafba36f2c846a139b1fbarchard@google.com  orig_pixels[5][2] = 192u;
381050b39a5cbf6c0f529531aafba36f2c846a139b1fbarchard@google.com  orig_pixels[5][3] = 224u;
382eeac2903ef22110d475c50ef9bfd7826d3183a5efbarchard@google.com  // Do 16 to test asm version.
383eeac2903ef22110d475c50ef9bfd7826d3183a5efbarchard@google.com  ARGBGrayTo(&orig_pixels[0][0], 0, &gray_pixels[0][0], 0, 16, 1);
384050b39a5cbf6c0f529531aafba36f2c846a139b1fbarchard@google.com  EXPECT_EQ(30u, gray_pixels[0][0]);
385050b39a5cbf6c0f529531aafba36f2c846a139b1fbarchard@google.com  EXPECT_EQ(30u, gray_pixels[0][1]);
386050b39a5cbf6c0f529531aafba36f2c846a139b1fbarchard@google.com  EXPECT_EQ(30u, gray_pixels[0][2]);
387eeac2903ef22110d475c50ef9bfd7826d3183a5efbarchard@google.com  EXPECT_EQ(128u, gray_pixels[0][3]);
388050b39a5cbf6c0f529531aafba36f2c846a139b1fbarchard@google.com  EXPECT_EQ(149u, gray_pixels[1][0]);
389050b39a5cbf6c0f529531aafba36f2c846a139b1fbarchard@google.com  EXPECT_EQ(149u, gray_pixels[1][1]);
390050b39a5cbf6c0f529531aafba36f2c846a139b1fbarchard@google.com  EXPECT_EQ(149u, gray_pixels[1][2]);
391eeac2903ef22110d475c50ef9bfd7826d3183a5efbarchard@google.com  EXPECT_EQ(0u, gray_pixels[1][3]);
392050b39a5cbf6c0f529531aafba36f2c846a139b1fbarchard@google.com  EXPECT_EQ(76u, gray_pixels[2][0]);
393050b39a5cbf6c0f529531aafba36f2c846a139b1fbarchard@google.com  EXPECT_EQ(76u, gray_pixels[2][1]);
394050b39a5cbf6c0f529531aafba36f2c846a139b1fbarchard@google.com  EXPECT_EQ(76u, gray_pixels[2][2]);
395eeac2903ef22110d475c50ef9bfd7826d3183a5efbarchard@google.com  EXPECT_EQ(255u, gray_pixels[2][3]);
396050b39a5cbf6c0f529531aafba36f2c846a139b1fbarchard@google.com  EXPECT_EQ(0u, gray_pixels[3][0]);
397050b39a5cbf6c0f529531aafba36f2c846a139b1fbarchard@google.com  EXPECT_EQ(0u, gray_pixels[3][1]);
398050b39a5cbf6c0f529531aafba36f2c846a139b1fbarchard@google.com  EXPECT_EQ(0u, gray_pixels[3][2]);
399050b39a5cbf6c0f529531aafba36f2c846a139b1fbarchard@google.com  EXPECT_EQ(255u, gray_pixels[3][3]);
400050b39a5cbf6c0f529531aafba36f2c846a139b1fbarchard@google.com  EXPECT_EQ(255u, gray_pixels[4][0]);
401050b39a5cbf6c0f529531aafba36f2c846a139b1fbarchard@google.com  EXPECT_EQ(255u, gray_pixels[4][1]);
402050b39a5cbf6c0f529531aafba36f2c846a139b1fbarchard@google.com  EXPECT_EQ(255u, gray_pixels[4][2]);
403050b39a5cbf6c0f529531aafba36f2c846a139b1fbarchard@google.com  EXPECT_EQ(255u, gray_pixels[4][3]);
404050b39a5cbf6c0f529531aafba36f2c846a139b1fbarchard@google.com  EXPECT_EQ(96u, gray_pixels[5][0]);
405050b39a5cbf6c0f529531aafba36f2c846a139b1fbarchard@google.com  EXPECT_EQ(96u, gray_pixels[5][1]);
406050b39a5cbf6c0f529531aafba36f2c846a139b1fbarchard@google.com  EXPECT_EQ(96u, gray_pixels[5][2]);
407050b39a5cbf6c0f529531aafba36f2c846a139b1fbarchard@google.com  EXPECT_EQ(224u, gray_pixels[5][3]);
4084b4b50fb445a166ce08e24d016157776b5df65cbfbarchard@google.com  for (int i = 0; i < 1280; ++i) {
409eeac2903ef22110d475c50ef9bfd7826d3183a5efbarchard@google.com    orig_pixels[i][0] = i;
410eeac2903ef22110d475c50ef9bfd7826d3183a5efbarchard@google.com    orig_pixels[i][1] = i / 2;
411eeac2903ef22110d475c50ef9bfd7826d3183a5efbarchard@google.com    orig_pixels[i][2] = i / 3;
412eeac2903ef22110d475c50ef9bfd7826d3183a5efbarchard@google.com    orig_pixels[i][3] = i;
413eeac2903ef22110d475c50ef9bfd7826d3183a5efbarchard@google.com  }
4144b4b50fb445a166ce08e24d016157776b5df65cbfbarchard@google.com  for (int i = 0; i < benchmark_pixels_div1280_; ++i) {
4154b4b50fb445a166ce08e24d016157776b5df65cbfbarchard@google.com    ARGBGrayTo(&orig_pixels[0][0], 0, &gray_pixels[0][0], 0, 1280, 1);
416eeac2903ef22110d475c50ef9bfd7826d3183a5efbarchard@google.com  }
417eeac2903ef22110d475c50ef9bfd7826d3183a5efbarchard@google.com}
418eeac2903ef22110d475c50ef9bfd7826d3183a5efbarchard@google.com
419221e602f8a726f7457a0d521b5bcca05d89215bbfbarchard@google.comTEST_F(libyuvTest, TestARGBSepia) {
4204b4b50fb445a166ce08e24d016157776b5df65cbfbarchard@google.com  SIMD_ALIGNED(uint8 orig_pixels[1280][4]);
42107c3fe2f6116b66556160957dadfb57423ee9166fbarchard@google.com  memset(orig_pixels, 0, sizeof(orig_pixels));
422221e602f8a726f7457a0d521b5bcca05d89215bbfbarchard@google.com
423221e602f8a726f7457a0d521b5bcca05d89215bbfbarchard@google.com  // Test blue
424221e602f8a726f7457a0d521b5bcca05d89215bbfbarchard@google.com  orig_pixels[0][0] = 255u;
425221e602f8a726f7457a0d521b5bcca05d89215bbfbarchard@google.com  orig_pixels[0][1] = 0u;
426221e602f8a726f7457a0d521b5bcca05d89215bbfbarchard@google.com  orig_pixels[0][2] = 0u;
427221e602f8a726f7457a0d521b5bcca05d89215bbfbarchard@google.com  orig_pixels[0][3] = 128u;
428221e602f8a726f7457a0d521b5bcca05d89215bbfbarchard@google.com  // Test green
429221e602f8a726f7457a0d521b5bcca05d89215bbfbarchard@google.com  orig_pixels[1][0] = 0u;
430221e602f8a726f7457a0d521b5bcca05d89215bbfbarchard@google.com  orig_pixels[1][1] = 255u;
431221e602f8a726f7457a0d521b5bcca05d89215bbfbarchard@google.com  orig_pixels[1][2] = 0u;
432221e602f8a726f7457a0d521b5bcca05d89215bbfbarchard@google.com  orig_pixels[1][3] = 0u;
433221e602f8a726f7457a0d521b5bcca05d89215bbfbarchard@google.com  // Test red
434221e602f8a726f7457a0d521b5bcca05d89215bbfbarchard@google.com  orig_pixels[2][0] = 0u;
435221e602f8a726f7457a0d521b5bcca05d89215bbfbarchard@google.com  orig_pixels[2][1] = 0u;
436221e602f8a726f7457a0d521b5bcca05d89215bbfbarchard@google.com  orig_pixels[2][2] = 255u;
437221e602f8a726f7457a0d521b5bcca05d89215bbfbarchard@google.com  orig_pixels[2][3] = 255u;
43887adfaa61ea7704874ad3494a3bce3e7364b146afbarchard@google.com  // Test black
43987adfaa61ea7704874ad3494a3bce3e7364b146afbarchard@google.com  orig_pixels[3][0] = 0u;
44087adfaa61ea7704874ad3494a3bce3e7364b146afbarchard@google.com  orig_pixels[3][1] = 0u;
44187adfaa61ea7704874ad3494a3bce3e7364b146afbarchard@google.com  orig_pixels[3][2] = 0u;
44287adfaa61ea7704874ad3494a3bce3e7364b146afbarchard@google.com  orig_pixels[3][3] = 255u;
44387adfaa61ea7704874ad3494a3bce3e7364b146afbarchard@google.com  // Test white
44487adfaa61ea7704874ad3494a3bce3e7364b146afbarchard@google.com  orig_pixels[4][0] = 255u;
44587adfaa61ea7704874ad3494a3bce3e7364b146afbarchard@google.com  orig_pixels[4][1] = 255u;
44687adfaa61ea7704874ad3494a3bce3e7364b146afbarchard@google.com  orig_pixels[4][2] = 255u;
44787adfaa61ea7704874ad3494a3bce3e7364b146afbarchard@google.com  orig_pixels[4][3] = 255u;
448221e602f8a726f7457a0d521b5bcca05d89215bbfbarchard@google.com  // Test color
44987adfaa61ea7704874ad3494a3bce3e7364b146afbarchard@google.com  orig_pixels[5][0] = 16u;
45087adfaa61ea7704874ad3494a3bce3e7364b146afbarchard@google.com  orig_pixels[5][1] = 64u;
45187adfaa61ea7704874ad3494a3bce3e7364b146afbarchard@google.com  orig_pixels[5][2] = 192u;
45287adfaa61ea7704874ad3494a3bce3e7364b146afbarchard@google.com  orig_pixels[5][3] = 224u;
453221e602f8a726f7457a0d521b5bcca05d89215bbfbarchard@google.com  // Do 16 to test asm version.
454221e602f8a726f7457a0d521b5bcca05d89215bbfbarchard@google.com  ARGBSepia(&orig_pixels[0][0], 0, 0, 0, 16, 1);
455221e602f8a726f7457a0d521b5bcca05d89215bbfbarchard@google.com  EXPECT_EQ(33u, orig_pixels[0][0]);
456221e602f8a726f7457a0d521b5bcca05d89215bbfbarchard@google.com  EXPECT_EQ(43u, orig_pixels[0][1]);
457221e602f8a726f7457a0d521b5bcca05d89215bbfbarchard@google.com  EXPECT_EQ(47u, orig_pixels[0][2]);
458221e602f8a726f7457a0d521b5bcca05d89215bbfbarchard@google.com  EXPECT_EQ(128u, orig_pixels[0][3]);
459221e602f8a726f7457a0d521b5bcca05d89215bbfbarchard@google.com  EXPECT_EQ(135u, orig_pixels[1][0]);
460221e602f8a726f7457a0d521b5bcca05d89215bbfbarchard@google.com  EXPECT_EQ(175u, orig_pixels[1][1]);
461221e602f8a726f7457a0d521b5bcca05d89215bbfbarchard@google.com  EXPECT_EQ(195u, orig_pixels[1][2]);
462221e602f8a726f7457a0d521b5bcca05d89215bbfbarchard@google.com  EXPECT_EQ(0u, orig_pixels[1][3]);
463221e602f8a726f7457a0d521b5bcca05d89215bbfbarchard@google.com  EXPECT_EQ(69u, orig_pixels[2][0]);
464221e602f8a726f7457a0d521b5bcca05d89215bbfbarchard@google.com  EXPECT_EQ(89u, orig_pixels[2][1]);
465221e602f8a726f7457a0d521b5bcca05d89215bbfbarchard@google.com  EXPECT_EQ(99u, orig_pixels[2][2]);
466221e602f8a726f7457a0d521b5bcca05d89215bbfbarchard@google.com  EXPECT_EQ(255u, orig_pixels[2][3]);
46787adfaa61ea7704874ad3494a3bce3e7364b146afbarchard@google.com  EXPECT_EQ(0u, orig_pixels[3][0]);
46887adfaa61ea7704874ad3494a3bce3e7364b146afbarchard@google.com  EXPECT_EQ(0u, orig_pixels[3][1]);
46987adfaa61ea7704874ad3494a3bce3e7364b146afbarchard@google.com  EXPECT_EQ(0u, orig_pixels[3][2]);
47087adfaa61ea7704874ad3494a3bce3e7364b146afbarchard@google.com  EXPECT_EQ(255u, orig_pixels[3][3]);
47187adfaa61ea7704874ad3494a3bce3e7364b146afbarchard@google.com  EXPECT_EQ(239u, orig_pixels[4][0]);
47287adfaa61ea7704874ad3494a3bce3e7364b146afbarchard@google.com  EXPECT_EQ(255u, orig_pixels[4][1]);
47387adfaa61ea7704874ad3494a3bce3e7364b146afbarchard@google.com  EXPECT_EQ(255u, orig_pixels[4][2]);
47487adfaa61ea7704874ad3494a3bce3e7364b146afbarchard@google.com  EXPECT_EQ(255u, orig_pixels[4][3]);
47587adfaa61ea7704874ad3494a3bce3e7364b146afbarchard@google.com  EXPECT_EQ(88u, orig_pixels[5][0]);
47687adfaa61ea7704874ad3494a3bce3e7364b146afbarchard@google.com  EXPECT_EQ(114u, orig_pixels[5][1]);
47787adfaa61ea7704874ad3494a3bce3e7364b146afbarchard@google.com  EXPECT_EQ(127u, orig_pixels[5][2]);
47887adfaa61ea7704874ad3494a3bce3e7364b146afbarchard@google.com  EXPECT_EQ(224u, orig_pixels[5][3]);
479221e602f8a726f7457a0d521b5bcca05d89215bbfbarchard@google.com
4804b4b50fb445a166ce08e24d016157776b5df65cbfbarchard@google.com  for (int i = 0; i < 1280; ++i) {
481221e602f8a726f7457a0d521b5bcca05d89215bbfbarchard@google.com    orig_pixels[i][0] = i;
482221e602f8a726f7457a0d521b5bcca05d89215bbfbarchard@google.com    orig_pixels[i][1] = i / 2;
483221e602f8a726f7457a0d521b5bcca05d89215bbfbarchard@google.com    orig_pixels[i][2] = i / 3;
484221e602f8a726f7457a0d521b5bcca05d89215bbfbarchard@google.com    orig_pixels[i][3] = i;
485221e602f8a726f7457a0d521b5bcca05d89215bbfbarchard@google.com  }
4864b4b50fb445a166ce08e24d016157776b5df65cbfbarchard@google.com  for (int i = 0; i < benchmark_pixels_div1280_; ++i) {
4874b4b50fb445a166ce08e24d016157776b5df65cbfbarchard@google.com    ARGBSepia(&orig_pixels[0][0], 0, 0, 0, 1280, 1);
488221e602f8a726f7457a0d521b5bcca05d89215bbfbarchard@google.com  }
489221e602f8a726f7457a0d521b5bcca05d89215bbfbarchard@google.com}
490e442dc4c2a896e85419628e3b7d97c4dfbe71c9dfbarchard@google.com
491e442dc4c2a896e85419628e3b7d97c4dfbe71c9dfbarchard@google.comTEST_F(libyuvTest, TestARGBColorMatrix) {
4924b4b50fb445a166ce08e24d016157776b5df65cbfbarchard@google.com  SIMD_ALIGNED(uint8 orig_pixels[1280][4]);
493c99db063e24d6180740d4adc29e84159096eef2dfbarchard@google.com  SIMD_ALIGNED(uint8 dst_pixels_opt[1280][4]);
494c99db063e24d6180740d4adc29e84159096eef2dfbarchard@google.com  SIMD_ALIGNED(uint8 dst_pixels_c[1280][4]);
495e442dc4c2a896e85419628e3b7d97c4dfbe71c9dfbarchard@google.com
496e442dc4c2a896e85419628e3b7d97c4dfbe71c9dfbarchard@google.com  // Matrix for Sepia.
497c99db063e24d6180740d4adc29e84159096eef2dfbarchard@google.com  SIMD_ALIGNED(static const int8 kRGBToSepia[]) = {
498c99db063e24d6180740d4adc29e84159096eef2dfbarchard@google.com    17 / 2, 68 / 2, 35 / 2, 0,
499c99db063e24d6180740d4adc29e84159096eef2dfbarchard@google.com    22 / 2, 88 / 2, 45 / 2, 0,
500c99db063e24d6180740d4adc29e84159096eef2dfbarchard@google.com    24 / 2, 98 / 2, 50 / 2, 0,
501c99db063e24d6180740d4adc29e84159096eef2dfbarchard@google.com    0, 0, 0, 64,  // Copy alpha.
502c99db063e24d6180740d4adc29e84159096eef2dfbarchard@google.com  };
503c99db063e24d6180740d4adc29e84159096eef2dfbarchard@google.com  memset(orig_pixels, 0, sizeof(orig_pixels));
504c99db063e24d6180740d4adc29e84159096eef2dfbarchard@google.com
505c99db063e24d6180740d4adc29e84159096eef2dfbarchard@google.com  // Test blue
506c99db063e24d6180740d4adc29e84159096eef2dfbarchard@google.com  orig_pixels[0][0] = 255u;
507c99db063e24d6180740d4adc29e84159096eef2dfbarchard@google.com  orig_pixels[0][1] = 0u;
508c99db063e24d6180740d4adc29e84159096eef2dfbarchard@google.com  orig_pixels[0][2] = 0u;
509c99db063e24d6180740d4adc29e84159096eef2dfbarchard@google.com  orig_pixels[0][3] = 128u;
510c99db063e24d6180740d4adc29e84159096eef2dfbarchard@google.com  // Test green
511c99db063e24d6180740d4adc29e84159096eef2dfbarchard@google.com  orig_pixels[1][0] = 0u;
512c99db063e24d6180740d4adc29e84159096eef2dfbarchard@google.com  orig_pixels[1][1] = 255u;
513c99db063e24d6180740d4adc29e84159096eef2dfbarchard@google.com  orig_pixels[1][2] = 0u;
514c99db063e24d6180740d4adc29e84159096eef2dfbarchard@google.com  orig_pixels[1][3] = 0u;
515c99db063e24d6180740d4adc29e84159096eef2dfbarchard@google.com  // Test red
516c99db063e24d6180740d4adc29e84159096eef2dfbarchard@google.com  orig_pixels[2][0] = 0u;
517c99db063e24d6180740d4adc29e84159096eef2dfbarchard@google.com  orig_pixels[2][1] = 0u;
518c99db063e24d6180740d4adc29e84159096eef2dfbarchard@google.com  orig_pixels[2][2] = 255u;
519c99db063e24d6180740d4adc29e84159096eef2dfbarchard@google.com  orig_pixels[2][3] = 255u;
520c99db063e24d6180740d4adc29e84159096eef2dfbarchard@google.com  // Test color
521c99db063e24d6180740d4adc29e84159096eef2dfbarchard@google.com  orig_pixels[3][0] = 16u;
522c99db063e24d6180740d4adc29e84159096eef2dfbarchard@google.com  orig_pixels[3][1] = 64u;
523c99db063e24d6180740d4adc29e84159096eef2dfbarchard@google.com  orig_pixels[3][2] = 192u;
524c99db063e24d6180740d4adc29e84159096eef2dfbarchard@google.com  orig_pixels[3][3] = 224u;
525c99db063e24d6180740d4adc29e84159096eef2dfbarchard@google.com  // Do 16 to test asm version.
526c99db063e24d6180740d4adc29e84159096eef2dfbarchard@google.com  ARGBColorMatrix(&orig_pixels[0][0], 0, &dst_pixels_opt[0][0], 0,
527c99db063e24d6180740d4adc29e84159096eef2dfbarchard@google.com                  &kRGBToSepia[0], 16, 1);
528c99db063e24d6180740d4adc29e84159096eef2dfbarchard@google.com  EXPECT_EQ(31u, dst_pixels_opt[0][0]);
529c99db063e24d6180740d4adc29e84159096eef2dfbarchard@google.com  EXPECT_EQ(43u, dst_pixels_opt[0][1]);
530c99db063e24d6180740d4adc29e84159096eef2dfbarchard@google.com  EXPECT_EQ(47u, dst_pixels_opt[0][2]);
531c99db063e24d6180740d4adc29e84159096eef2dfbarchard@google.com  EXPECT_EQ(128u, dst_pixels_opt[0][3]);
532c99db063e24d6180740d4adc29e84159096eef2dfbarchard@google.com  EXPECT_EQ(135u, dst_pixels_opt[1][0]);
533c99db063e24d6180740d4adc29e84159096eef2dfbarchard@google.com  EXPECT_EQ(175u, dst_pixels_opt[1][1]);
534c99db063e24d6180740d4adc29e84159096eef2dfbarchard@google.com  EXPECT_EQ(195u, dst_pixels_opt[1][2]);
535c99db063e24d6180740d4adc29e84159096eef2dfbarchard@google.com  EXPECT_EQ(0u, dst_pixels_opt[1][3]);
536c99db063e24d6180740d4adc29e84159096eef2dfbarchard@google.com  EXPECT_EQ(67u, dst_pixels_opt[2][0]);
537c99db063e24d6180740d4adc29e84159096eef2dfbarchard@google.com  EXPECT_EQ(87u, dst_pixels_opt[2][1]);
538c99db063e24d6180740d4adc29e84159096eef2dfbarchard@google.com  EXPECT_EQ(99u, dst_pixels_opt[2][2]);
539c99db063e24d6180740d4adc29e84159096eef2dfbarchard@google.com  EXPECT_EQ(255u, dst_pixels_opt[2][3]);
540c99db063e24d6180740d4adc29e84159096eef2dfbarchard@google.com  EXPECT_EQ(87u, dst_pixels_opt[3][0]);
541c99db063e24d6180740d4adc29e84159096eef2dfbarchard@google.com  EXPECT_EQ(112u, dst_pixels_opt[3][1]);
542c99db063e24d6180740d4adc29e84159096eef2dfbarchard@google.com  EXPECT_EQ(127u, dst_pixels_opt[3][2]);
543c99db063e24d6180740d4adc29e84159096eef2dfbarchard@google.com  EXPECT_EQ(224u, dst_pixels_opt[3][3]);
544c99db063e24d6180740d4adc29e84159096eef2dfbarchard@google.com
545c99db063e24d6180740d4adc29e84159096eef2dfbarchard@google.com  for (int i = 0; i < 1280; ++i) {
546c99db063e24d6180740d4adc29e84159096eef2dfbarchard@google.com    orig_pixels[i][0] = i;
547c99db063e24d6180740d4adc29e84159096eef2dfbarchard@google.com    orig_pixels[i][1] = i / 2;
548c99db063e24d6180740d4adc29e84159096eef2dfbarchard@google.com    orig_pixels[i][2] = i / 3;
549c99db063e24d6180740d4adc29e84159096eef2dfbarchard@google.com    orig_pixels[i][3] = i;
550c99db063e24d6180740d4adc29e84159096eef2dfbarchard@google.com  }
551c99db063e24d6180740d4adc29e84159096eef2dfbarchard@google.com  MaskCpuFlags(0);
552c99db063e24d6180740d4adc29e84159096eef2dfbarchard@google.com  ARGBColorMatrix(&orig_pixels[0][0], 0, &dst_pixels_c[0][0], 0,
553c99db063e24d6180740d4adc29e84159096eef2dfbarchard@google.com                  &kRGBToSepia[0], 1280, 1);
554c99db063e24d6180740d4adc29e84159096eef2dfbarchard@google.com  MaskCpuFlags(-1);
555c99db063e24d6180740d4adc29e84159096eef2dfbarchard@google.com
556c99db063e24d6180740d4adc29e84159096eef2dfbarchard@google.com  for (int i = 0; i < benchmark_pixels_div1280_; ++i) {
557c99db063e24d6180740d4adc29e84159096eef2dfbarchard@google.com    ARGBColorMatrix(&orig_pixels[0][0], 0, &dst_pixels_opt[0][0], 0,
558c99db063e24d6180740d4adc29e84159096eef2dfbarchard@google.com                    &kRGBToSepia[0], 1280, 1);
559c99db063e24d6180740d4adc29e84159096eef2dfbarchard@google.com  }
560c99db063e24d6180740d4adc29e84159096eef2dfbarchard@google.com
561c99db063e24d6180740d4adc29e84159096eef2dfbarchard@google.com  for (int i = 0; i < 1280; ++i) {
562c99db063e24d6180740d4adc29e84159096eef2dfbarchard@google.com    EXPECT_EQ(dst_pixels_c[i][0], dst_pixels_opt[i][0]);
563c99db063e24d6180740d4adc29e84159096eef2dfbarchard@google.com    EXPECT_EQ(dst_pixels_c[i][1], dst_pixels_opt[i][1]);
564c99db063e24d6180740d4adc29e84159096eef2dfbarchard@google.com    EXPECT_EQ(dst_pixels_c[i][2], dst_pixels_opt[i][2]);
565c99db063e24d6180740d4adc29e84159096eef2dfbarchard@google.com    EXPECT_EQ(dst_pixels_c[i][3], dst_pixels_opt[i][3]);
566c99db063e24d6180740d4adc29e84159096eef2dfbarchard@google.com  }
567c99db063e24d6180740d4adc29e84159096eef2dfbarchard@google.com}
568c99db063e24d6180740d4adc29e84159096eef2dfbarchard@google.com
569c99db063e24d6180740d4adc29e84159096eef2dfbarchard@google.comTEST_F(libyuvTest, TestRGBColorMatrix) {
570c99db063e24d6180740d4adc29e84159096eef2dfbarchard@google.com  SIMD_ALIGNED(uint8 orig_pixels[1280][4]);
571c99db063e24d6180740d4adc29e84159096eef2dfbarchard@google.com
572c99db063e24d6180740d4adc29e84159096eef2dfbarchard@google.com  // Matrix for Sepia.
573c99db063e24d6180740d4adc29e84159096eef2dfbarchard@google.com  SIMD_ALIGNED(static const int8 kRGBToSepia[]) = {
574e442dc4c2a896e85419628e3b7d97c4dfbe71c9dfbarchard@google.com    17, 68, 35, 0,
575e442dc4c2a896e85419628e3b7d97c4dfbe71c9dfbarchard@google.com    22, 88, 45, 0,
576e442dc4c2a896e85419628e3b7d97c4dfbe71c9dfbarchard@google.com    24, 98, 50, 0,
57762154e53a2820136f6a8cab8cc029622e3b100c1fbarchard@google.com    0, 0, 0, 0,  // Unused but makes matrix 16 bytes.
578e442dc4c2a896e85419628e3b7d97c4dfbe71c9dfbarchard@google.com  };
57907c3fe2f6116b66556160957dadfb57423ee9166fbarchard@google.com  memset(orig_pixels, 0, sizeof(orig_pixels));
580e442dc4c2a896e85419628e3b7d97c4dfbe71c9dfbarchard@google.com
581e442dc4c2a896e85419628e3b7d97c4dfbe71c9dfbarchard@google.com  // Test blue
582e442dc4c2a896e85419628e3b7d97c4dfbe71c9dfbarchard@google.com  orig_pixels[0][0] = 255u;
583e442dc4c2a896e85419628e3b7d97c4dfbe71c9dfbarchard@google.com  orig_pixels[0][1] = 0u;
584e442dc4c2a896e85419628e3b7d97c4dfbe71c9dfbarchard@google.com  orig_pixels[0][2] = 0u;
585e442dc4c2a896e85419628e3b7d97c4dfbe71c9dfbarchard@google.com  orig_pixels[0][3] = 128u;
586e442dc4c2a896e85419628e3b7d97c4dfbe71c9dfbarchard@google.com  // Test green
587e442dc4c2a896e85419628e3b7d97c4dfbe71c9dfbarchard@google.com  orig_pixels[1][0] = 0u;
588e442dc4c2a896e85419628e3b7d97c4dfbe71c9dfbarchard@google.com  orig_pixels[1][1] = 255u;
589e442dc4c2a896e85419628e3b7d97c4dfbe71c9dfbarchard@google.com  orig_pixels[1][2] = 0u;
590e442dc4c2a896e85419628e3b7d97c4dfbe71c9dfbarchard@google.com  orig_pixels[1][3] = 0u;
591e442dc4c2a896e85419628e3b7d97c4dfbe71c9dfbarchard@google.com  // Test red
592e442dc4c2a896e85419628e3b7d97c4dfbe71c9dfbarchard@google.com  orig_pixels[2][0] = 0u;
593e442dc4c2a896e85419628e3b7d97c4dfbe71c9dfbarchard@google.com  orig_pixels[2][1] = 0u;
594e442dc4c2a896e85419628e3b7d97c4dfbe71c9dfbarchard@google.com  orig_pixels[2][2] = 255u;
595e442dc4c2a896e85419628e3b7d97c4dfbe71c9dfbarchard@google.com  orig_pixels[2][3] = 255u;
596e442dc4c2a896e85419628e3b7d97c4dfbe71c9dfbarchard@google.com  // Test color
597e442dc4c2a896e85419628e3b7d97c4dfbe71c9dfbarchard@google.com  orig_pixels[3][0] = 16u;
598e442dc4c2a896e85419628e3b7d97c4dfbe71c9dfbarchard@google.com  orig_pixels[3][1] = 64u;
599e442dc4c2a896e85419628e3b7d97c4dfbe71c9dfbarchard@google.com  orig_pixels[3][2] = 192u;
600e442dc4c2a896e85419628e3b7d97c4dfbe71c9dfbarchard@google.com  orig_pixels[3][3] = 224u;
601e442dc4c2a896e85419628e3b7d97c4dfbe71c9dfbarchard@google.com  // Do 16 to test asm version.
602c99db063e24d6180740d4adc29e84159096eef2dfbarchard@google.com  RGBColorMatrix(&orig_pixels[0][0], 0, &kRGBToSepia[0], 0, 0, 16, 1);
603c99db063e24d6180740d4adc29e84159096eef2dfbarchard@google.com  EXPECT_EQ(31u, orig_pixels[0][0]);
604e442dc4c2a896e85419628e3b7d97c4dfbe71c9dfbarchard@google.com  EXPECT_EQ(43u, orig_pixels[0][1]);
605e442dc4c2a896e85419628e3b7d97c4dfbe71c9dfbarchard@google.com  EXPECT_EQ(47u, orig_pixels[0][2]);
606e442dc4c2a896e85419628e3b7d97c4dfbe71c9dfbarchard@google.com  EXPECT_EQ(128u, orig_pixels[0][3]);
607e442dc4c2a896e85419628e3b7d97c4dfbe71c9dfbarchard@google.com  EXPECT_EQ(135u, orig_pixels[1][0]);
608e442dc4c2a896e85419628e3b7d97c4dfbe71c9dfbarchard@google.com  EXPECT_EQ(175u, orig_pixels[1][1]);
609e442dc4c2a896e85419628e3b7d97c4dfbe71c9dfbarchard@google.com  EXPECT_EQ(195u, orig_pixels[1][2]);
610e442dc4c2a896e85419628e3b7d97c4dfbe71c9dfbarchard@google.com  EXPECT_EQ(0u, orig_pixels[1][3]);
611c99db063e24d6180740d4adc29e84159096eef2dfbarchard@google.com  EXPECT_EQ(67u, orig_pixels[2][0]);
612c99db063e24d6180740d4adc29e84159096eef2dfbarchard@google.com  EXPECT_EQ(87u, orig_pixels[2][1]);
613e442dc4c2a896e85419628e3b7d97c4dfbe71c9dfbarchard@google.com  EXPECT_EQ(99u, orig_pixels[2][2]);
614e442dc4c2a896e85419628e3b7d97c4dfbe71c9dfbarchard@google.com  EXPECT_EQ(255u, orig_pixels[2][3]);
615c99db063e24d6180740d4adc29e84159096eef2dfbarchard@google.com  EXPECT_EQ(87u, orig_pixels[3][0]);
616c99db063e24d6180740d4adc29e84159096eef2dfbarchard@google.com  EXPECT_EQ(112u, orig_pixels[3][1]);
617e442dc4c2a896e85419628e3b7d97c4dfbe71c9dfbarchard@google.com  EXPECT_EQ(127u, orig_pixels[3][2]);
618e442dc4c2a896e85419628e3b7d97c4dfbe71c9dfbarchard@google.com  EXPECT_EQ(224u, orig_pixels[3][3]);
619e442dc4c2a896e85419628e3b7d97c4dfbe71c9dfbarchard@google.com
6204b4b50fb445a166ce08e24d016157776b5df65cbfbarchard@google.com  for (int i = 0; i < 1280; ++i) {
621e442dc4c2a896e85419628e3b7d97c4dfbe71c9dfbarchard@google.com    orig_pixels[i][0] = i;
622e442dc4c2a896e85419628e3b7d97c4dfbe71c9dfbarchard@google.com    orig_pixels[i][1] = i / 2;
623e442dc4c2a896e85419628e3b7d97c4dfbe71c9dfbarchard@google.com    orig_pixels[i][2] = i / 3;
624e442dc4c2a896e85419628e3b7d97c4dfbe71c9dfbarchard@google.com    orig_pixels[i][3] = i;
625e442dc4c2a896e85419628e3b7d97c4dfbe71c9dfbarchard@google.com  }
6264b4b50fb445a166ce08e24d016157776b5df65cbfbarchard@google.com  for (int i = 0; i < benchmark_pixels_div1280_; ++i) {
627c99db063e24d6180740d4adc29e84159096eef2dfbarchard@google.com    RGBColorMatrix(&orig_pixels[0][0], 0, &kRGBToSepia[0], 0, 0, 1280, 1);
628e442dc4c2a896e85419628e3b7d97c4dfbe71c9dfbarchard@google.com  }
629e442dc4c2a896e85419628e3b7d97c4dfbe71c9dfbarchard@google.com}
630e442dc4c2a896e85419628e3b7d97c4dfbe71c9dfbarchard@google.com
631c0d6dee4f3790a96a20f6da80ff427e617fc97ddfbarchard@google.comTEST_F(libyuvTest, TestARGBColorTable) {
6324b4b50fb445a166ce08e24d016157776b5df65cbfbarchard@google.com  SIMD_ALIGNED(uint8 orig_pixels[1280][4]);
6337c4656317c789d2ce3600cd75bca2a8b718cc00efbarchard@google.com  memset(orig_pixels, 0, sizeof(orig_pixels));
634c0d6dee4f3790a96a20f6da80ff427e617fc97ddfbarchard@google.com
635c0d6dee4f3790a96a20f6da80ff427e617fc97ddfbarchard@google.com  // Matrix for Sepia.
636a1ab194545697f18b16778781451e8f301acbbf9fbarchard@google.com  static const uint8 kARGBTable[256 * 4] = {
637c0d6dee4f3790a96a20f6da80ff427e617fc97ddfbarchard@google.com    1u, 2u, 3u, 4u,
638c0d6dee4f3790a96a20f6da80ff427e617fc97ddfbarchard@google.com    5u, 6u, 7u, 8u,
639c0d6dee4f3790a96a20f6da80ff427e617fc97ddfbarchard@google.com    9u, 10u, 11u, 12u,
640c0d6dee4f3790a96a20f6da80ff427e617fc97ddfbarchard@google.com    13u, 14u, 15u, 16u,
641c0d6dee4f3790a96a20f6da80ff427e617fc97ddfbarchard@google.com  };
642c0d6dee4f3790a96a20f6da80ff427e617fc97ddfbarchard@google.com
643c0d6dee4f3790a96a20f6da80ff427e617fc97ddfbarchard@google.com  orig_pixels[0][0] = 0u;
644c0d6dee4f3790a96a20f6da80ff427e617fc97ddfbarchard@google.com  orig_pixels[0][1] = 0u;
645c0d6dee4f3790a96a20f6da80ff427e617fc97ddfbarchard@google.com  orig_pixels[0][2] = 0u;
646c0d6dee4f3790a96a20f6da80ff427e617fc97ddfbarchard@google.com  orig_pixels[0][3] = 0u;
647c0d6dee4f3790a96a20f6da80ff427e617fc97ddfbarchard@google.com  orig_pixels[1][0] = 1u;
648c0d6dee4f3790a96a20f6da80ff427e617fc97ddfbarchard@google.com  orig_pixels[1][1] = 1u;
649c0d6dee4f3790a96a20f6da80ff427e617fc97ddfbarchard@google.com  orig_pixels[1][2] = 1u;
650c0d6dee4f3790a96a20f6da80ff427e617fc97ddfbarchard@google.com  orig_pixels[1][3] = 1u;
651c0d6dee4f3790a96a20f6da80ff427e617fc97ddfbarchard@google.com  orig_pixels[2][0] = 2u;
652c0d6dee4f3790a96a20f6da80ff427e617fc97ddfbarchard@google.com  orig_pixels[2][1] = 2u;
653c0d6dee4f3790a96a20f6da80ff427e617fc97ddfbarchard@google.com  orig_pixels[2][2] = 2u;
654c0d6dee4f3790a96a20f6da80ff427e617fc97ddfbarchard@google.com  orig_pixels[2][3] = 2u;
655c0d6dee4f3790a96a20f6da80ff427e617fc97ddfbarchard@google.com  orig_pixels[3][0] = 0u;
656c0d6dee4f3790a96a20f6da80ff427e617fc97ddfbarchard@google.com  orig_pixels[3][1] = 1u;
657c0d6dee4f3790a96a20f6da80ff427e617fc97ddfbarchard@google.com  orig_pixels[3][2] = 2u;
658c0d6dee4f3790a96a20f6da80ff427e617fc97ddfbarchard@google.com  orig_pixels[3][3] = 3u;
659c0d6dee4f3790a96a20f6da80ff427e617fc97ddfbarchard@google.com  // Do 16 to test asm version.
660c0d6dee4f3790a96a20f6da80ff427e617fc97ddfbarchard@google.com  ARGBColorTable(&orig_pixels[0][0], 0, &kARGBTable[0], 0, 0, 16, 1);
661c0d6dee4f3790a96a20f6da80ff427e617fc97ddfbarchard@google.com  EXPECT_EQ(1u, orig_pixels[0][0]);
662c0d6dee4f3790a96a20f6da80ff427e617fc97ddfbarchard@google.com  EXPECT_EQ(2u, orig_pixels[0][1]);
663c0d6dee4f3790a96a20f6da80ff427e617fc97ddfbarchard@google.com  EXPECT_EQ(3u, orig_pixels[0][2]);
664c0d6dee4f3790a96a20f6da80ff427e617fc97ddfbarchard@google.com  EXPECT_EQ(4u, orig_pixels[0][3]);
665c0d6dee4f3790a96a20f6da80ff427e617fc97ddfbarchard@google.com  EXPECT_EQ(5u, orig_pixels[1][0]);
666c0d6dee4f3790a96a20f6da80ff427e617fc97ddfbarchard@google.com  EXPECT_EQ(6u, orig_pixels[1][1]);
667c0d6dee4f3790a96a20f6da80ff427e617fc97ddfbarchard@google.com  EXPECT_EQ(7u, orig_pixels[1][2]);
668c0d6dee4f3790a96a20f6da80ff427e617fc97ddfbarchard@google.com  EXPECT_EQ(8u, orig_pixels[1][3]);
669c0d6dee4f3790a96a20f6da80ff427e617fc97ddfbarchard@google.com  EXPECT_EQ(9u, orig_pixels[2][0]);
670c0d6dee4f3790a96a20f6da80ff427e617fc97ddfbarchard@google.com  EXPECT_EQ(10u, orig_pixels[2][1]);
671c0d6dee4f3790a96a20f6da80ff427e617fc97ddfbarchard@google.com  EXPECT_EQ(11u, orig_pixels[2][2]);
672c0d6dee4f3790a96a20f6da80ff427e617fc97ddfbarchard@google.com  EXPECT_EQ(12u, orig_pixels[2][3]);
673c0d6dee4f3790a96a20f6da80ff427e617fc97ddfbarchard@google.com  EXPECT_EQ(1u, orig_pixels[3][0]);
674c0d6dee4f3790a96a20f6da80ff427e617fc97ddfbarchard@google.com  EXPECT_EQ(6u, orig_pixels[3][1]);
675c0d6dee4f3790a96a20f6da80ff427e617fc97ddfbarchard@google.com  EXPECT_EQ(11u, orig_pixels[3][2]);
676c0d6dee4f3790a96a20f6da80ff427e617fc97ddfbarchard@google.com  EXPECT_EQ(16u, orig_pixels[3][3]);
677c0d6dee4f3790a96a20f6da80ff427e617fc97ddfbarchard@google.com
6784b4b50fb445a166ce08e24d016157776b5df65cbfbarchard@google.com  for (int i = 0; i < 1280; ++i) {
679c0d6dee4f3790a96a20f6da80ff427e617fc97ddfbarchard@google.com    orig_pixels[i][0] = i;
680c0d6dee4f3790a96a20f6da80ff427e617fc97ddfbarchard@google.com    orig_pixels[i][1] = i / 2;
681c0d6dee4f3790a96a20f6da80ff427e617fc97ddfbarchard@google.com    orig_pixels[i][2] = i / 3;
682c0d6dee4f3790a96a20f6da80ff427e617fc97ddfbarchard@google.com    orig_pixels[i][3] = i;
683c0d6dee4f3790a96a20f6da80ff427e617fc97ddfbarchard@google.com  }
6844b4b50fb445a166ce08e24d016157776b5df65cbfbarchard@google.com  for (int i = 0; i < benchmark_pixels_div1280_; ++i) {
6854b4b50fb445a166ce08e24d016157776b5df65cbfbarchard@google.com    ARGBColorTable(&orig_pixels[0][0], 0, &kARGBTable[0], 0, 0, 1280, 1);
686c0d6dee4f3790a96a20f6da80ff427e617fc97ddfbarchard@google.com  }
687c0d6dee4f3790a96a20f6da80ff427e617fc97ddfbarchard@google.com}
688c0d6dee4f3790a96a20f6da80ff427e617fc97ddfbarchard@google.com
6895520710ef7ce306357ab35c501f776b1fb0266e8fbarchard@google.com// Same as TestARGBColorTable except alpha does not change.
6905520710ef7ce306357ab35c501f776b1fb0266e8fbarchard@google.comTEST_F(libyuvTest, TestRGBColorTable) {
6914b4b50fb445a166ce08e24d016157776b5df65cbfbarchard@google.com  SIMD_ALIGNED(uint8 orig_pixels[1280][4]);
6925520710ef7ce306357ab35c501f776b1fb0266e8fbarchard@google.com  memset(orig_pixels, 0, sizeof(orig_pixels));
6935520710ef7ce306357ab35c501f776b1fb0266e8fbarchard@google.com
6945520710ef7ce306357ab35c501f776b1fb0266e8fbarchard@google.com  // Matrix for Sepia.
695a1ab194545697f18b16778781451e8f301acbbf9fbarchard@google.com  static const uint8 kARGBTable[256 * 4] = {
6965520710ef7ce306357ab35c501f776b1fb0266e8fbarchard@google.com    1u, 2u, 3u, 4u,
6975520710ef7ce306357ab35c501f776b1fb0266e8fbarchard@google.com    5u, 6u, 7u, 8u,
6985520710ef7ce306357ab35c501f776b1fb0266e8fbarchard@google.com    9u, 10u, 11u, 12u,
6995520710ef7ce306357ab35c501f776b1fb0266e8fbarchard@google.com    13u, 14u, 15u, 16u,
7005520710ef7ce306357ab35c501f776b1fb0266e8fbarchard@google.com  };
7015520710ef7ce306357ab35c501f776b1fb0266e8fbarchard@google.com
7025520710ef7ce306357ab35c501f776b1fb0266e8fbarchard@google.com  orig_pixels[0][0] = 0u;
7035520710ef7ce306357ab35c501f776b1fb0266e8fbarchard@google.com  orig_pixels[0][1] = 0u;
7045520710ef7ce306357ab35c501f776b1fb0266e8fbarchard@google.com  orig_pixels[0][2] = 0u;
7055520710ef7ce306357ab35c501f776b1fb0266e8fbarchard@google.com  orig_pixels[0][3] = 0u;
7065520710ef7ce306357ab35c501f776b1fb0266e8fbarchard@google.com  orig_pixels[1][0] = 1u;
7075520710ef7ce306357ab35c501f776b1fb0266e8fbarchard@google.com  orig_pixels[1][1] = 1u;
7085520710ef7ce306357ab35c501f776b1fb0266e8fbarchard@google.com  orig_pixels[1][2] = 1u;
7095520710ef7ce306357ab35c501f776b1fb0266e8fbarchard@google.com  orig_pixels[1][3] = 1u;
7105520710ef7ce306357ab35c501f776b1fb0266e8fbarchard@google.com  orig_pixels[2][0] = 2u;
7115520710ef7ce306357ab35c501f776b1fb0266e8fbarchard@google.com  orig_pixels[2][1] = 2u;
7125520710ef7ce306357ab35c501f776b1fb0266e8fbarchard@google.com  orig_pixels[2][2] = 2u;
7135520710ef7ce306357ab35c501f776b1fb0266e8fbarchard@google.com  orig_pixels[2][3] = 2u;
7145520710ef7ce306357ab35c501f776b1fb0266e8fbarchard@google.com  orig_pixels[3][0] = 0u;
7155520710ef7ce306357ab35c501f776b1fb0266e8fbarchard@google.com  orig_pixels[3][1] = 1u;
7165520710ef7ce306357ab35c501f776b1fb0266e8fbarchard@google.com  orig_pixels[3][2] = 2u;
7175520710ef7ce306357ab35c501f776b1fb0266e8fbarchard@google.com  orig_pixels[3][3] = 3u;
7185520710ef7ce306357ab35c501f776b1fb0266e8fbarchard@google.com  // Do 16 to test asm version.
7195520710ef7ce306357ab35c501f776b1fb0266e8fbarchard@google.com  RGBColorTable(&orig_pixels[0][0], 0, &kARGBTable[0], 0, 0, 16, 1);
7205520710ef7ce306357ab35c501f776b1fb0266e8fbarchard@google.com  EXPECT_EQ(1u, orig_pixels[0][0]);
7215520710ef7ce306357ab35c501f776b1fb0266e8fbarchard@google.com  EXPECT_EQ(2u, orig_pixels[0][1]);
7225520710ef7ce306357ab35c501f776b1fb0266e8fbarchard@google.com  EXPECT_EQ(3u, orig_pixels[0][2]);
7235520710ef7ce306357ab35c501f776b1fb0266e8fbarchard@google.com  EXPECT_EQ(0u, orig_pixels[0][3]);  // Alpha unchanged.
7245520710ef7ce306357ab35c501f776b1fb0266e8fbarchard@google.com  EXPECT_EQ(5u, orig_pixels[1][0]);
7255520710ef7ce306357ab35c501f776b1fb0266e8fbarchard@google.com  EXPECT_EQ(6u, orig_pixels[1][1]);
7265520710ef7ce306357ab35c501f776b1fb0266e8fbarchard@google.com  EXPECT_EQ(7u, orig_pixels[1][2]);
7275520710ef7ce306357ab35c501f776b1fb0266e8fbarchard@google.com  EXPECT_EQ(1u, orig_pixels[1][3]);  // Alpha unchanged.
7285520710ef7ce306357ab35c501f776b1fb0266e8fbarchard@google.com  EXPECT_EQ(9u, orig_pixels[2][0]);
7295520710ef7ce306357ab35c501f776b1fb0266e8fbarchard@google.com  EXPECT_EQ(10u, orig_pixels[2][1]);
7305520710ef7ce306357ab35c501f776b1fb0266e8fbarchard@google.com  EXPECT_EQ(11u, orig_pixels[2][2]);
7315520710ef7ce306357ab35c501f776b1fb0266e8fbarchard@google.com  EXPECT_EQ(2u, orig_pixels[2][3]);  // Alpha unchanged.
7325520710ef7ce306357ab35c501f776b1fb0266e8fbarchard@google.com  EXPECT_EQ(1u, orig_pixels[3][0]);
7335520710ef7ce306357ab35c501f776b1fb0266e8fbarchard@google.com  EXPECT_EQ(6u, orig_pixels[3][1]);
7345520710ef7ce306357ab35c501f776b1fb0266e8fbarchard@google.com  EXPECT_EQ(11u, orig_pixels[3][2]);
7355520710ef7ce306357ab35c501f776b1fb0266e8fbarchard@google.com  EXPECT_EQ(3u, orig_pixels[3][3]);  // Alpha unchanged.
7365520710ef7ce306357ab35c501f776b1fb0266e8fbarchard@google.com
7374b4b50fb445a166ce08e24d016157776b5df65cbfbarchard@google.com  for (int i = 0; i < 1280; ++i) {
7385520710ef7ce306357ab35c501f776b1fb0266e8fbarchard@google.com    orig_pixels[i][0] = i;
7395520710ef7ce306357ab35c501f776b1fb0266e8fbarchard@google.com    orig_pixels[i][1] = i / 2;
7405520710ef7ce306357ab35c501f776b1fb0266e8fbarchard@google.com    orig_pixels[i][2] = i / 3;
7415520710ef7ce306357ab35c501f776b1fb0266e8fbarchard@google.com    orig_pixels[i][3] = i;
7425520710ef7ce306357ab35c501f776b1fb0266e8fbarchard@google.com  }
7434b4b50fb445a166ce08e24d016157776b5df65cbfbarchard@google.com  for (int i = 0; i < benchmark_pixels_div1280_; ++i) {
7444b4b50fb445a166ce08e24d016157776b5df65cbfbarchard@google.com    RGBColorTable(&orig_pixels[0][0], 0, &kARGBTable[0], 0, 0, 1280, 1);
7455520710ef7ce306357ab35c501f776b1fb0266e8fbarchard@google.com  }
7465520710ef7ce306357ab35c501f776b1fb0266e8fbarchard@google.com}
7475520710ef7ce306357ab35c501f776b1fb0266e8fbarchard@google.com
74881b804e35c0346ee2fc5f8d11945eab9a88fdb10fbarchard@google.comTEST_F(libyuvTest, TestARGBQuantize) {
7494b4b50fb445a166ce08e24d016157776b5df65cbfbarchard@google.com  SIMD_ALIGNED(uint8 orig_pixels[1280][4]);
75081b804e35c0346ee2fc5f8d11945eab9a88fdb10fbarchard@google.com
7514b4b50fb445a166ce08e24d016157776b5df65cbfbarchard@google.com  for (int i = 0; i < 1280; ++i) {
75281b804e35c0346ee2fc5f8d11945eab9a88fdb10fbarchard@google.com    orig_pixels[i][0] = i;
75381b804e35c0346ee2fc5f8d11945eab9a88fdb10fbarchard@google.com    orig_pixels[i][1] = i / 2;
75481b804e35c0346ee2fc5f8d11945eab9a88fdb10fbarchard@google.com    orig_pixels[i][2] = i / 3;
75581b804e35c0346ee2fc5f8d11945eab9a88fdb10fbarchard@google.com    orig_pixels[i][3] = i;
75681b804e35c0346ee2fc5f8d11945eab9a88fdb10fbarchard@google.com  }
75781b804e35c0346ee2fc5f8d11945eab9a88fdb10fbarchard@google.com  ARGBQuantize(&orig_pixels[0][0], 0,
7584b4b50fb445a166ce08e24d016157776b5df65cbfbarchard@google.com               (65536 + (8 / 2)) / 8, 8, 8 / 2, 0, 0, 1280, 1);
75981b804e35c0346ee2fc5f8d11945eab9a88fdb10fbarchard@google.com
7604b4b50fb445a166ce08e24d016157776b5df65cbfbarchard@google.com  for (int i = 0; i < 1280; ++i) {
7614b4b50fb445a166ce08e24d016157776b5df65cbfbarchard@google.com    EXPECT_EQ((i / 8 * 8 + 8 / 2) & 255, orig_pixels[i][0]);
7624b4b50fb445a166ce08e24d016157776b5df65cbfbarchard@google.com    EXPECT_EQ((i / 2 / 8 * 8 + 8 / 2) & 255, orig_pixels[i][1]);
7634b4b50fb445a166ce08e24d016157776b5df65cbfbarchard@google.com    EXPECT_EQ((i / 3 / 8 * 8 + 8 / 2) & 255, orig_pixels[i][2]);
7644b4b50fb445a166ce08e24d016157776b5df65cbfbarchard@google.com    EXPECT_EQ(i & 255, orig_pixels[i][3]);
76581b804e35c0346ee2fc5f8d11945eab9a88fdb10fbarchard@google.com  }
7664b4b50fb445a166ce08e24d016157776b5df65cbfbarchard@google.com  for (int i = 0; i < benchmark_pixels_div1280_; ++i) {
76781b804e35c0346ee2fc5f8d11945eab9a88fdb10fbarchard@google.com    ARGBQuantize(&orig_pixels[0][0], 0,
7684b4b50fb445a166ce08e24d016157776b5df65cbfbarchard@google.com                 (65536 + (8 / 2)) / 8, 8, 8 / 2, 0, 0, 1280, 1);
76981b804e35c0346ee2fc5f8d11945eab9a88fdb10fbarchard@google.com  }
77081b804e35c0346ee2fc5f8d11945eab9a88fdb10fbarchard@google.com}
77181b804e35c0346ee2fc5f8d11945eab9a88fdb10fbarchard@google.com
77227d42c7ff6452c53643bc57ee8b7b17afbe8dfd0fbarchard@google.comTEST_F(libyuvTest, TestARGBMirror) {
7734b4b50fb445a166ce08e24d016157776b5df65cbfbarchard@google.com  SIMD_ALIGNED(uint8 orig_pixels[1280][4]);
7744b4b50fb445a166ce08e24d016157776b5df65cbfbarchard@google.com  SIMD_ALIGNED(uint8 dst_pixels[1280][4]);
77527d42c7ff6452c53643bc57ee8b7b17afbe8dfd0fbarchard@google.com
7764b4b50fb445a166ce08e24d016157776b5df65cbfbarchard@google.com  for (int i = 0; i < 1280; ++i) {
77727d42c7ff6452c53643bc57ee8b7b17afbe8dfd0fbarchard@google.com    orig_pixels[i][0] = i;
77827d42c7ff6452c53643bc57ee8b7b17afbe8dfd0fbarchard@google.com    orig_pixels[i][1] = i / 2;
77927d42c7ff6452c53643bc57ee8b7b17afbe8dfd0fbarchard@google.com    orig_pixels[i][2] = i / 3;
78027d42c7ff6452c53643bc57ee8b7b17afbe8dfd0fbarchard@google.com    orig_pixels[i][3] = i / 4;
78127d42c7ff6452c53643bc57ee8b7b17afbe8dfd0fbarchard@google.com  }
7824b4b50fb445a166ce08e24d016157776b5df65cbfbarchard@google.com  ARGBMirror(&orig_pixels[0][0], 0, &dst_pixels[0][0], 0, 1280, 1);
78327d42c7ff6452c53643bc57ee8b7b17afbe8dfd0fbarchard@google.com
7844b4b50fb445a166ce08e24d016157776b5df65cbfbarchard@google.com  for (int i = 0; i < 1280; ++i) {
7854b4b50fb445a166ce08e24d016157776b5df65cbfbarchard@google.com    EXPECT_EQ(i & 255, dst_pixels[1280 - 1 - i][0]);
7864b4b50fb445a166ce08e24d016157776b5df65cbfbarchard@google.com    EXPECT_EQ((i / 2) & 255, dst_pixels[1280 - 1 - i][1]);
7874b4b50fb445a166ce08e24d016157776b5df65cbfbarchard@google.com    EXPECT_EQ((i / 3) & 255, dst_pixels[1280 - 1 - i][2]);
7884b4b50fb445a166ce08e24d016157776b5df65cbfbarchard@google.com    EXPECT_EQ((i / 4) & 255, dst_pixels[1280 - 1 - i][3]);
78927d42c7ff6452c53643bc57ee8b7b17afbe8dfd0fbarchard@google.com  }
7904b4b50fb445a166ce08e24d016157776b5df65cbfbarchard@google.com  for (int i = 0; i < benchmark_pixels_div1280_; ++i) {
7914b4b50fb445a166ce08e24d016157776b5df65cbfbarchard@google.com    ARGBMirror(&orig_pixels[0][0], 0, &dst_pixels[0][0], 0, 1280, 1);
79227d42c7ff6452c53643bc57ee8b7b17afbe8dfd0fbarchard@google.com  }
79327d42c7ff6452c53643bc57ee8b7b17afbe8dfd0fbarchard@google.com}
79427d42c7ff6452c53643bc57ee8b7b17afbe8dfd0fbarchard@google.com
795c4c578e327a9dbc9dafe113634612e9a349a8c1ffbarchard@google.comTEST_F(libyuvTest, TestShade) {
7964b4b50fb445a166ce08e24d016157776b5df65cbfbarchard@google.com  SIMD_ALIGNED(uint8 orig_pixels[1280][4]);
7974b4b50fb445a166ce08e24d016157776b5df65cbfbarchard@google.com  SIMD_ALIGNED(uint8 shade_pixels[1280][4]);
79807c3fe2f6116b66556160957dadfb57423ee9166fbarchard@google.com  memset(orig_pixels, 0, sizeof(orig_pixels));
799c4c578e327a9dbc9dafe113634612e9a349a8c1ffbarchard@google.com
800c4c578e327a9dbc9dafe113634612e9a349a8c1ffbarchard@google.com  orig_pixels[0][0] = 10u;
801c4c578e327a9dbc9dafe113634612e9a349a8c1ffbarchard@google.com  orig_pixels[0][1] = 20u;
802c4c578e327a9dbc9dafe113634612e9a349a8c1ffbarchard@google.com  orig_pixels[0][2] = 40u;
803c4c578e327a9dbc9dafe113634612e9a349a8c1ffbarchard@google.com  orig_pixels[0][3] = 80u;
804c4c578e327a9dbc9dafe113634612e9a349a8c1ffbarchard@google.com  orig_pixels[1][0] = 0u;
805c4c578e327a9dbc9dafe113634612e9a349a8c1ffbarchard@google.com  orig_pixels[1][1] = 0u;
806c4c578e327a9dbc9dafe113634612e9a349a8c1ffbarchard@google.com  orig_pixels[1][2] = 0u;
807c4c578e327a9dbc9dafe113634612e9a349a8c1ffbarchard@google.com  orig_pixels[1][3] = 255u;
808c4c578e327a9dbc9dafe113634612e9a349a8c1ffbarchard@google.com  orig_pixels[2][0] = 0u;
809c4c578e327a9dbc9dafe113634612e9a349a8c1ffbarchard@google.com  orig_pixels[2][1] = 0u;
810c4c578e327a9dbc9dafe113634612e9a349a8c1ffbarchard@google.com  orig_pixels[2][2] = 0u;
811c4c578e327a9dbc9dafe113634612e9a349a8c1ffbarchard@google.com  orig_pixels[2][3] = 0u;
812c4c578e327a9dbc9dafe113634612e9a349a8c1ffbarchard@google.com  orig_pixels[3][0] = 0u;
813c4c578e327a9dbc9dafe113634612e9a349a8c1ffbarchard@google.com  orig_pixels[3][1] = 0u;
814c4c578e327a9dbc9dafe113634612e9a349a8c1ffbarchard@google.com  orig_pixels[3][2] = 0u;
815c4c578e327a9dbc9dafe113634612e9a349a8c1ffbarchard@google.com  orig_pixels[3][3] = 0u;
816b94b139e86635d40ed0d054bb66e30e6086ae7a3fbarchard@google.com  // Do 8 pixels to allow opt version to be used.
817b94b139e86635d40ed0d054bb66e30e6086ae7a3fbarchard@google.com  ARGBShade(&orig_pixels[0][0], 0, &shade_pixels[0][0], 0, 8, 1, 0x80ffffff);
818c4c578e327a9dbc9dafe113634612e9a349a8c1ffbarchard@google.com  EXPECT_EQ(10u, shade_pixels[0][0]);
819c4c578e327a9dbc9dafe113634612e9a349a8c1ffbarchard@google.com  EXPECT_EQ(20u, shade_pixels[0][1]);
820c4c578e327a9dbc9dafe113634612e9a349a8c1ffbarchard@google.com  EXPECT_EQ(40u, shade_pixels[0][2]);
821c4c578e327a9dbc9dafe113634612e9a349a8c1ffbarchard@google.com  EXPECT_EQ(40u, shade_pixels[0][3]);
822c4c578e327a9dbc9dafe113634612e9a349a8c1ffbarchard@google.com  EXPECT_EQ(0u, shade_pixels[1][0]);
823c4c578e327a9dbc9dafe113634612e9a349a8c1ffbarchard@google.com  EXPECT_EQ(0u, shade_pixels[1][1]);
824c4c578e327a9dbc9dafe113634612e9a349a8c1ffbarchard@google.com  EXPECT_EQ(0u, shade_pixels[1][2]);
825c4c578e327a9dbc9dafe113634612e9a349a8c1ffbarchard@google.com  EXPECT_EQ(128u, shade_pixels[1][3]);
826c4c578e327a9dbc9dafe113634612e9a349a8c1ffbarchard@google.com  EXPECT_EQ(0u, shade_pixels[2][0]);
827c4c578e327a9dbc9dafe113634612e9a349a8c1ffbarchard@google.com  EXPECT_EQ(0u, shade_pixels[2][1]);
828c4c578e327a9dbc9dafe113634612e9a349a8c1ffbarchard@google.com  EXPECT_EQ(0u, shade_pixels[2][2]);
829c4c578e327a9dbc9dafe113634612e9a349a8c1ffbarchard@google.com  EXPECT_EQ(0u, shade_pixels[2][3]);
830c4c578e327a9dbc9dafe113634612e9a349a8c1ffbarchard@google.com  EXPECT_EQ(0u, shade_pixels[3][0]);
831c4c578e327a9dbc9dafe113634612e9a349a8c1ffbarchard@google.com  EXPECT_EQ(0u, shade_pixels[3][1]);
832c4c578e327a9dbc9dafe113634612e9a349a8c1ffbarchard@google.com  EXPECT_EQ(0u, shade_pixels[3][2]);
833c4c578e327a9dbc9dafe113634612e9a349a8c1ffbarchard@google.com  EXPECT_EQ(0u, shade_pixels[3][3]);
834c4c578e327a9dbc9dafe113634612e9a349a8c1ffbarchard@google.com
835b94b139e86635d40ed0d054bb66e30e6086ae7a3fbarchard@google.com  ARGBShade(&orig_pixels[0][0], 0, &shade_pixels[0][0], 0, 8, 1, 0x80808080);
836c4c578e327a9dbc9dafe113634612e9a349a8c1ffbarchard@google.com  EXPECT_EQ(5u, shade_pixels[0][0]);
837c4c578e327a9dbc9dafe113634612e9a349a8c1ffbarchard@google.com  EXPECT_EQ(10u, shade_pixels[0][1]);
838c4c578e327a9dbc9dafe113634612e9a349a8c1ffbarchard@google.com  EXPECT_EQ(20u, shade_pixels[0][2]);
839c4c578e327a9dbc9dafe113634612e9a349a8c1ffbarchard@google.com  EXPECT_EQ(40u, shade_pixels[0][3]);
840c4c578e327a9dbc9dafe113634612e9a349a8c1ffbarchard@google.com
841b94b139e86635d40ed0d054bb66e30e6086ae7a3fbarchard@google.com  ARGBShade(&orig_pixels[0][0], 0, &shade_pixels[0][0], 0, 8, 1, 0x10204080);
842b94b139e86635d40ed0d054bb66e30e6086ae7a3fbarchard@google.com  EXPECT_EQ(5u, shade_pixels[0][0]);
843b94b139e86635d40ed0d054bb66e30e6086ae7a3fbarchard@google.com  EXPECT_EQ(5u, shade_pixels[0][1]);
844b94b139e86635d40ed0d054bb66e30e6086ae7a3fbarchard@google.com  EXPECT_EQ(5u, shade_pixels[0][2]);
845b94b139e86635d40ed0d054bb66e30e6086ae7a3fbarchard@google.com  EXPECT_EQ(5u, shade_pixels[0][3]);
846b94b139e86635d40ed0d054bb66e30e6086ae7a3fbarchard@google.com
8474b4b50fb445a166ce08e24d016157776b5df65cbfbarchard@google.com  for (int i = 0; i < benchmark_pixels_div1280_; ++i) {
8484b4b50fb445a166ce08e24d016157776b5df65cbfbarchard@google.com    ARGBShade(&orig_pixels[0][0], 0, &shade_pixels[0][0], 0, 1280, 1,
849c4c578e327a9dbc9dafe113634612e9a349a8c1ffbarchard@google.com              0x80808080);
850c4c578e327a9dbc9dafe113634612e9a349a8c1ffbarchard@google.com  }
851c4c578e327a9dbc9dafe113634612e9a349a8c1ffbarchard@google.com}
852c4c578e327a9dbc9dafe113634612e9a349a8c1ffbarchard@google.com
853cded3e566baf6046a738b90cf71f956d473aa297fbarchard@google.comTEST_F(libyuvTest, TestInterpolate) {
8544b4b50fb445a166ce08e24d016157776b5df65cbfbarchard@google.com  SIMD_ALIGNED(uint8 orig_pixels_0[1280][4]);
8554b4b50fb445a166ce08e24d016157776b5df65cbfbarchard@google.com  SIMD_ALIGNED(uint8 orig_pixels_1[1280][4]);
8564b4b50fb445a166ce08e24d016157776b5df65cbfbarchard@google.com  SIMD_ALIGNED(uint8 interpolate_pixels[1280][4]);
85707c3fe2f6116b66556160957dadfb57423ee9166fbarchard@google.com  memset(orig_pixels_0, 0, sizeof(orig_pixels_0));
85807c3fe2f6116b66556160957dadfb57423ee9166fbarchard@google.com  memset(orig_pixels_1, 0, sizeof(orig_pixels_1));
8590d95d4775792c26117d803adbab0bef1cee18052fbarchard@google.com
8604f10e97ff23457bc32b169fec7ad21072e6d9c89fbarchard@google.com  orig_pixels_0[0][0] = 16u;
8614f10e97ff23457bc32b169fec7ad21072e6d9c89fbarchard@google.com  orig_pixels_0[0][1] = 32u;
8624f10e97ff23457bc32b169fec7ad21072e6d9c89fbarchard@google.com  orig_pixels_0[0][2] = 64u;
8634f10e97ff23457bc32b169fec7ad21072e6d9c89fbarchard@google.com  orig_pixels_0[0][3] = 128u;
8640d95d4775792c26117d803adbab0bef1cee18052fbarchard@google.com  orig_pixels_0[1][0] = 0u;
8650d95d4775792c26117d803adbab0bef1cee18052fbarchard@google.com  orig_pixels_0[1][1] = 0u;
8660d95d4775792c26117d803adbab0bef1cee18052fbarchard@google.com  orig_pixels_0[1][2] = 0u;
8670d95d4775792c26117d803adbab0bef1cee18052fbarchard@google.com  orig_pixels_0[1][3] = 255u;
8680d95d4775792c26117d803adbab0bef1cee18052fbarchard@google.com  orig_pixels_0[2][0] = 0u;
8690d95d4775792c26117d803adbab0bef1cee18052fbarchard@google.com  orig_pixels_0[2][1] = 0u;
8700d95d4775792c26117d803adbab0bef1cee18052fbarchard@google.com  orig_pixels_0[2][2] = 0u;
8710d95d4775792c26117d803adbab0bef1cee18052fbarchard@google.com  orig_pixels_0[2][3] = 0u;
8720d95d4775792c26117d803adbab0bef1cee18052fbarchard@google.com  orig_pixels_0[3][0] = 0u;
8730d95d4775792c26117d803adbab0bef1cee18052fbarchard@google.com  orig_pixels_0[3][1] = 0u;
8740d95d4775792c26117d803adbab0bef1cee18052fbarchard@google.com  orig_pixels_0[3][2] = 0u;
8750d95d4775792c26117d803adbab0bef1cee18052fbarchard@google.com  orig_pixels_0[3][3] = 0u;
8760d95d4775792c26117d803adbab0bef1cee18052fbarchard@google.com
8770d95d4775792c26117d803adbab0bef1cee18052fbarchard@google.com  orig_pixels_1[0][0] = 0u;
8780d95d4775792c26117d803adbab0bef1cee18052fbarchard@google.com  orig_pixels_1[0][1] = 0u;
8790d95d4775792c26117d803adbab0bef1cee18052fbarchard@google.com  orig_pixels_1[0][2] = 0u;
8800d95d4775792c26117d803adbab0bef1cee18052fbarchard@google.com  orig_pixels_1[0][3] = 0u;
8810d95d4775792c26117d803adbab0bef1cee18052fbarchard@google.com  orig_pixels_1[1][0] = 0u;
8820d95d4775792c26117d803adbab0bef1cee18052fbarchard@google.com  orig_pixels_1[1][1] = 0u;
8830d95d4775792c26117d803adbab0bef1cee18052fbarchard@google.com  orig_pixels_1[1][2] = 0u;
8840d95d4775792c26117d803adbab0bef1cee18052fbarchard@google.com  orig_pixels_1[1][3] = 0u;
8850d95d4775792c26117d803adbab0bef1cee18052fbarchard@google.com  orig_pixels_1[2][0] = 0u;
8860d95d4775792c26117d803adbab0bef1cee18052fbarchard@google.com  orig_pixels_1[2][1] = 0u;
8870d95d4775792c26117d803adbab0bef1cee18052fbarchard@google.com  orig_pixels_1[2][2] = 0u;
8880d95d4775792c26117d803adbab0bef1cee18052fbarchard@google.com  orig_pixels_1[2][3] = 0u;
8890d95d4775792c26117d803adbab0bef1cee18052fbarchard@google.com  orig_pixels_1[3][0] = 255u;
8900d95d4775792c26117d803adbab0bef1cee18052fbarchard@google.com  orig_pixels_1[3][1] = 255u;
8910d95d4775792c26117d803adbab0bef1cee18052fbarchard@google.com  orig_pixels_1[3][2] = 255u;
8920d95d4775792c26117d803adbab0bef1cee18052fbarchard@google.com  orig_pixels_1[3][3] = 255u;
8930d95d4775792c26117d803adbab0bef1cee18052fbarchard@google.com
8940d95d4775792c26117d803adbab0bef1cee18052fbarchard@google.com  ARGBInterpolate(&orig_pixels_0[0][0], 0, &orig_pixels_1[0][0], 0,
8950d95d4775792c26117d803adbab0bef1cee18052fbarchard@google.com                  &interpolate_pixels[0][0], 0, 4, 1, 128);
8964f10e97ff23457bc32b169fec7ad21072e6d9c89fbarchard@google.com  EXPECT_EQ(8u, interpolate_pixels[0][0]);
8974f10e97ff23457bc32b169fec7ad21072e6d9c89fbarchard@google.com  EXPECT_EQ(16u, interpolate_pixels[0][1]);
8984f10e97ff23457bc32b169fec7ad21072e6d9c89fbarchard@google.com  EXPECT_EQ(32u, interpolate_pixels[0][2]);
8994f10e97ff23457bc32b169fec7ad21072e6d9c89fbarchard@google.com  EXPECT_EQ(64u, interpolate_pixels[0][3]);
9000d95d4775792c26117d803adbab0bef1cee18052fbarchard@google.com  EXPECT_EQ(0u, interpolate_pixels[1][0]);
9010d95d4775792c26117d803adbab0bef1cee18052fbarchard@google.com  EXPECT_EQ(0u, interpolate_pixels[1][1]);
9020d95d4775792c26117d803adbab0bef1cee18052fbarchard@google.com  EXPECT_EQ(0u, interpolate_pixels[1][2]);
9030d95d4775792c26117d803adbab0bef1cee18052fbarchard@google.com  EXPECT_NEAR(128u, interpolate_pixels[1][3], 1);  // C = 127, SSE = 128.
9040d95d4775792c26117d803adbab0bef1cee18052fbarchard@google.com  EXPECT_EQ(0u, interpolate_pixels[2][0]);
9050d95d4775792c26117d803adbab0bef1cee18052fbarchard@google.com  EXPECT_EQ(0u, interpolate_pixels[2][1]);
9060d95d4775792c26117d803adbab0bef1cee18052fbarchard@google.com  EXPECT_EQ(0u, interpolate_pixels[2][2]);
9070d95d4775792c26117d803adbab0bef1cee18052fbarchard@google.com  EXPECT_EQ(0u, interpolate_pixels[2][3]);
9080d95d4775792c26117d803adbab0bef1cee18052fbarchard@google.com  EXPECT_NEAR(128u, interpolate_pixels[3][0], 1);
9090d95d4775792c26117d803adbab0bef1cee18052fbarchard@google.com  EXPECT_NEAR(128u, interpolate_pixels[3][1], 1);
9100d95d4775792c26117d803adbab0bef1cee18052fbarchard@google.com  EXPECT_NEAR(128u, interpolate_pixels[3][2], 1);
9110d95d4775792c26117d803adbab0bef1cee18052fbarchard@google.com  EXPECT_NEAR(128u, interpolate_pixels[3][3], 1);
9120d95d4775792c26117d803adbab0bef1cee18052fbarchard@google.com
9130d95d4775792c26117d803adbab0bef1cee18052fbarchard@google.com  ARGBInterpolate(&orig_pixels_0[0][0], 0, &orig_pixels_1[0][0], 0,
9140d95d4775792c26117d803adbab0bef1cee18052fbarchard@google.com                  &interpolate_pixels[0][0], 0, 4, 1, 0);
9154f10e97ff23457bc32b169fec7ad21072e6d9c89fbarchard@google.com  EXPECT_EQ(16u, interpolate_pixels[0][0]);
9164f10e97ff23457bc32b169fec7ad21072e6d9c89fbarchard@google.com  EXPECT_EQ(32u, interpolate_pixels[0][1]);
9174f10e97ff23457bc32b169fec7ad21072e6d9c89fbarchard@google.com  EXPECT_EQ(64u, interpolate_pixels[0][2]);
9184f10e97ff23457bc32b169fec7ad21072e6d9c89fbarchard@google.com  EXPECT_EQ(128u, interpolate_pixels[0][3]);
9190d95d4775792c26117d803adbab0bef1cee18052fbarchard@google.com
9204f10e97ff23457bc32b169fec7ad21072e6d9c89fbarchard@google.com  ARGBInterpolate(&orig_pixels_0[0][0], 0, &orig_pixels_1[0][0], 0,
9214f10e97ff23457bc32b169fec7ad21072e6d9c89fbarchard@google.com                  &interpolate_pixels[0][0], 0, 4, 1, 192);
9224f10e97ff23457bc32b169fec7ad21072e6d9c89fbarchard@google.com
9234f10e97ff23457bc32b169fec7ad21072e6d9c89fbarchard@google.com  EXPECT_EQ(4u, interpolate_pixels[0][0]);
9244f10e97ff23457bc32b169fec7ad21072e6d9c89fbarchard@google.com  EXPECT_EQ(8u, interpolate_pixels[0][1]);
9254f10e97ff23457bc32b169fec7ad21072e6d9c89fbarchard@google.com  EXPECT_EQ(16u, interpolate_pixels[0][2]);
9264f10e97ff23457bc32b169fec7ad21072e6d9c89fbarchard@google.com  EXPECT_EQ(32u, interpolate_pixels[0][3]);
9270d95d4775792c26117d803adbab0bef1cee18052fbarchard@google.com
9284b4b50fb445a166ce08e24d016157776b5df65cbfbarchard@google.com  for (int i = 0; i < benchmark_pixels_div1280_; ++i) {
9290d95d4775792c26117d803adbab0bef1cee18052fbarchard@google.com    ARGBInterpolate(&orig_pixels_0[0][0], 0, &orig_pixels_1[0][0], 0,
9304b4b50fb445a166ce08e24d016157776b5df65cbfbarchard@google.com                    &interpolate_pixels[0][0], 0, 1280, 1, 128);
9310d95d4775792c26117d803adbab0bef1cee18052fbarchard@google.com  }
9320d95d4775792c26117d803adbab0bef1cee18052fbarchard@google.com}
9330d95d4775792c26117d803adbab0bef1cee18052fbarchard@google.com
934b5491759b45de37df781d4408a0c46abf6d4ae08fbarchard@google.com#define TESTTERP(FMT_A, BPP_A, STRIDE_A,                                       \
935b5491759b45de37df781d4408a0c46abf6d4ae08fbarchard@google.com                 FMT_B, BPP_B, STRIDE_B,                                       \
936b5491759b45de37df781d4408a0c46abf6d4ae08fbarchard@google.com                 W1280, TERP, DIFF, N, NEG, OFF)                               \
937b5491759b45de37df781d4408a0c46abf6d4ae08fbarchard@google.comTEST_F(libyuvTest, ARGBInterpolate##TERP##N) {                                 \
9384127a2637dbbd31be41aff2bb7ce03aef545615bfbarchard@google.com  const int kWidth = ((W1280) > 0) ? (W1280) : 1;                              \
939b5491759b45de37df781d4408a0c46abf6d4ae08fbarchard@google.com  const int kHeight = benchmark_height_;                                       \
940b5491759b45de37df781d4408a0c46abf6d4ae08fbarchard@google.com  const int kStrideA = (kWidth * BPP_A + STRIDE_A - 1) / STRIDE_A * STRIDE_A;  \
941b5491759b45de37df781d4408a0c46abf6d4ae08fbarchard@google.com  const int kStrideB = (kWidth * BPP_B + STRIDE_B - 1) / STRIDE_B * STRIDE_B;  \
942b5491759b45de37df781d4408a0c46abf6d4ae08fbarchard@google.com  align_buffer_64(src_argb_a, kStrideA * kHeight + OFF);                       \
943b5491759b45de37df781d4408a0c46abf6d4ae08fbarchard@google.com  align_buffer_64(src_argb_b, kStrideA * kHeight + OFF);                       \
944b5491759b45de37df781d4408a0c46abf6d4ae08fbarchard@google.com  align_buffer_64(dst_argb_c, kStrideB * kHeight);                             \
945b5491759b45de37df781d4408a0c46abf6d4ae08fbarchard@google.com  align_buffer_64(dst_argb_opt, kStrideB * kHeight);                           \
946b5491759b45de37df781d4408a0c46abf6d4ae08fbarchard@google.com  srandom(time(NULL));                                                         \
947b5491759b45de37df781d4408a0c46abf6d4ae08fbarchard@google.com  for (int i = 0; i < kStrideA * kHeight; ++i) {                               \
948b5491759b45de37df781d4408a0c46abf6d4ae08fbarchard@google.com    src_argb_a[i + OFF] = (random() & 0xff);                                   \
949b5491759b45de37df781d4408a0c46abf6d4ae08fbarchard@google.com    src_argb_b[i + OFF] = (random() & 0xff);                                   \
950b5491759b45de37df781d4408a0c46abf6d4ae08fbarchard@google.com  }                                                                            \
951b5491759b45de37df781d4408a0c46abf6d4ae08fbarchard@google.com  MaskCpuFlags(0);                                                             \
952b5491759b45de37df781d4408a0c46abf6d4ae08fbarchard@google.com  ARGBInterpolate(src_argb_a + OFF, kStrideA,                                  \
953b5491759b45de37df781d4408a0c46abf6d4ae08fbarchard@google.com                  src_argb_b + OFF, kStrideA,                                  \
954b5491759b45de37df781d4408a0c46abf6d4ae08fbarchard@google.com                  dst_argb_c, kStrideB,                                        \
955b5491759b45de37df781d4408a0c46abf6d4ae08fbarchard@google.com                  kWidth, NEG kHeight, TERP);                                  \
956b5491759b45de37df781d4408a0c46abf6d4ae08fbarchard@google.com  MaskCpuFlags(-1);                                                            \
957b5491759b45de37df781d4408a0c46abf6d4ae08fbarchard@google.com  for (int i = 0; i < benchmark_iterations_; ++i) {                            \
958b5491759b45de37df781d4408a0c46abf6d4ae08fbarchard@google.com    ARGBInterpolate(src_argb_a + OFF, kStrideA,                                \
959b5491759b45de37df781d4408a0c46abf6d4ae08fbarchard@google.com                    src_argb_b + OFF, kStrideA,                                \
960b5491759b45de37df781d4408a0c46abf6d4ae08fbarchard@google.com                    dst_argb_opt, kStrideB,                                    \
961b5491759b45de37df781d4408a0c46abf6d4ae08fbarchard@google.com                    kWidth, NEG kHeight, TERP);                                \
962b5491759b45de37df781d4408a0c46abf6d4ae08fbarchard@google.com  }                                                                            \
963b5491759b45de37df781d4408a0c46abf6d4ae08fbarchard@google.com  int max_diff = 0;                                                            \
964b5491759b45de37df781d4408a0c46abf6d4ae08fbarchard@google.com  for (int i = 0; i < kStrideB * kHeight; ++i) {                               \
965b5491759b45de37df781d4408a0c46abf6d4ae08fbarchard@google.com    int abs_diff =                                                             \
966b5491759b45de37df781d4408a0c46abf6d4ae08fbarchard@google.com        abs(static_cast<int>(dst_argb_c[i]) -                                  \
967b5491759b45de37df781d4408a0c46abf6d4ae08fbarchard@google.com            static_cast<int>(dst_argb_opt[i]));                                \
968b5491759b45de37df781d4408a0c46abf6d4ae08fbarchard@google.com    if (abs_diff > max_diff) {                                                 \
969b5491759b45de37df781d4408a0c46abf6d4ae08fbarchard@google.com      max_diff = abs_diff;                                                     \
970b5491759b45de37df781d4408a0c46abf6d4ae08fbarchard@google.com    }                                                                          \
971b5491759b45de37df781d4408a0c46abf6d4ae08fbarchard@google.com  }                                                                            \
972b5491759b45de37df781d4408a0c46abf6d4ae08fbarchard@google.com  EXPECT_LE(max_diff, DIFF);                                                   \
973ae9a1388a71a3154ef7d6f753c8e568c97554fc0fbarchard@google.com  free_aligned_buffer_64(src_argb_a);                                          \
974ae9a1388a71a3154ef7d6f753c8e568c97554fc0fbarchard@google.com  free_aligned_buffer_64(src_argb_b);                                          \
975ae9a1388a71a3154ef7d6f753c8e568c97554fc0fbarchard@google.com  free_aligned_buffer_64(dst_argb_c);                                          \
976ae9a1388a71a3154ef7d6f753c8e568c97554fc0fbarchard@google.com  free_aligned_buffer_64(dst_argb_opt);                                        \
977b5491759b45de37df781d4408a0c46abf6d4ae08fbarchard@google.com}
978b5491759b45de37df781d4408a0c46abf6d4ae08fbarchard@google.com
979b5491759b45de37df781d4408a0c46abf6d4ae08fbarchard@google.com#define TESTINTERPOLATE(TERP)                                                  \
980b5491759b45de37df781d4408a0c46abf6d4ae08fbarchard@google.com    TESTTERP(ARGB, 4, 1, ARGB, 4, 1,                                           \
9811d160cb99f2b05df80c4555bd769825ad1175dc9fbarchard@google.com             benchmark_width_ - 1, TERP, 1, _Any, +, 0)                        \
982b5491759b45de37df781d4408a0c46abf6d4ae08fbarchard@google.com    TESTTERP(ARGB, 4, 1, ARGB, 4, 1,                                           \
983b5491759b45de37df781d4408a0c46abf6d4ae08fbarchard@google.com             benchmark_width_, TERP, 1, _Unaligned, +, 1)                      \
984b5491759b45de37df781d4408a0c46abf6d4ae08fbarchard@google.com    TESTTERP(ARGB, 4, 1, ARGB, 4, 1,                                           \
985b5491759b45de37df781d4408a0c46abf6d4ae08fbarchard@google.com             benchmark_width_, TERP, 1, _Invert, -, 0)                         \
986b5491759b45de37df781d4408a0c46abf6d4ae08fbarchard@google.com    TESTTERP(ARGB, 4, 1, ARGB, 4, 1,                                           \
987cd6056c01cec8de0431390933537c9b8458bd472fbarchard@google.com             benchmark_width_, TERP, 1, _Opt, +, 0)                            \
988cd6056c01cec8de0431390933537c9b8458bd472fbarchard@google.com    TESTTERP(ARGB, 4, 1, ARGB, 4, 1,                                           \
989cd6056c01cec8de0431390933537c9b8458bd472fbarchard@google.com             benchmark_width_ - 1, TERP, 1, _Any_Invert, -, 0)
990b5491759b45de37df781d4408a0c46abf6d4ae08fbarchard@google.com
991b5491759b45de37df781d4408a0c46abf6d4ae08fbarchard@google.comTESTINTERPOLATE(0)
992b5491759b45de37df781d4408a0c46abf6d4ae08fbarchard@google.comTESTINTERPOLATE(64)
993b5491759b45de37df781d4408a0c46abf6d4ae08fbarchard@google.comTESTINTERPOLATE(128)
994b5491759b45de37df781d4408a0c46abf6d4ae08fbarchard@google.comTESTINTERPOLATE(192)
995b5491759b45de37df781d4408a0c46abf6d4ae08fbarchard@google.comTESTINTERPOLATE(255)
996b5491759b45de37df781d4408a0c46abf6d4ae08fbarchard@google.com
997dd3b137f5d9d87e92cb44f754f60b90ba50e31bcfbarchard@google.comstatic int TestBlend(int width, int height, int benchmark_iterations,
998dd3b137f5d9d87e92cb44f754f60b90ba50e31bcfbarchard@google.com                     int invert, int off) {
9994e0d7cc2c60e8aa85954c48927c6be08ee2b9db4fbarchard@google.com  if (width < 1) {
10004e0d7cc2c60e8aa85954c48927c6be08ee2b9db4fbarchard@google.com    width = 1;
10014e0d7cc2c60e8aa85954c48927c6be08ee2b9db4fbarchard@google.com  }
10021d160cb99f2b05df80c4555bd769825ad1175dc9fbarchard@google.com  const int kBpp = 4;
10031d160cb99f2b05df80c4555bd769825ad1175dc9fbarchard@google.com  const int kStride = width * kBpp;
10041d160cb99f2b05df80c4555bd769825ad1175dc9fbarchard@google.com  align_buffer_64(src_argb_a, kStride * height + off);
10051d160cb99f2b05df80c4555bd769825ad1175dc9fbarchard@google.com  align_buffer_64(src_argb_b, kStride * height + off);
10061d160cb99f2b05df80c4555bd769825ad1175dc9fbarchard@google.com  align_buffer_64(dst_argb_c, kStride * height);
10071d160cb99f2b05df80c4555bd769825ad1175dc9fbarchard@google.com  align_buffer_64(dst_argb_opt, kStride * height);
1008b5491759b45de37df781d4408a0c46abf6d4ae08fbarchard@google.com  srandom(time(NULL));
10091d160cb99f2b05df80c4555bd769825ad1175dc9fbarchard@google.com  for (int i = 0; i < kStride * height; ++i) {
1010dd3b137f5d9d87e92cb44f754f60b90ba50e31bcfbarchard@google.com    src_argb_a[i + off] = (random() & 0xff);
1011dd3b137f5d9d87e92cb44f754f60b90ba50e31bcfbarchard@google.com    src_argb_b[i + off] = (random() & 0xff);
1012b5491759b45de37df781d4408a0c46abf6d4ae08fbarchard@google.com  }
10131d160cb99f2b05df80c4555bd769825ad1175dc9fbarchard@google.com  ARGBAttenuate(src_argb_a + off, kStride, src_argb_a + off, kStride, width,
1014dd3b137f5d9d87e92cb44f754f60b90ba50e31bcfbarchard@google.com                height);
10151d160cb99f2b05df80c4555bd769825ad1175dc9fbarchard@google.com  ARGBAttenuate(src_argb_b + off, kStride, src_argb_b + off, kStride, width,
1016dd3b137f5d9d87e92cb44f754f60b90ba50e31bcfbarchard@google.com                height);
10171d160cb99f2b05df80c4555bd769825ad1175dc9fbarchard@google.com  memset(dst_argb_c, 255, kStride * height);
10181d160cb99f2b05df80c4555bd769825ad1175dc9fbarchard@google.com  memset(dst_argb_opt, 255, kStride * height);
1019b5491759b45de37df781d4408a0c46abf6d4ae08fbarchard@google.com
1020b5491759b45de37df781d4408a0c46abf6d4ae08fbarchard@google.com  MaskCpuFlags(0);
10211d160cb99f2b05df80c4555bd769825ad1175dc9fbarchard@google.com  ARGBBlend(src_argb_a + off, kStride,
10221d160cb99f2b05df80c4555bd769825ad1175dc9fbarchard@google.com            src_argb_b + off, kStride,
10231d160cb99f2b05df80c4555bd769825ad1175dc9fbarchard@google.com            dst_argb_c, kStride,
1024dd3b137f5d9d87e92cb44f754f60b90ba50e31bcfbarchard@google.com            width, invert * height);
1025b5491759b45de37df781d4408a0c46abf6d4ae08fbarchard@google.com  MaskCpuFlags(-1);
1026b5491759b45de37df781d4408a0c46abf6d4ae08fbarchard@google.com  for (int i = 0; i < benchmark_iterations; ++i) {
10271d160cb99f2b05df80c4555bd769825ad1175dc9fbarchard@google.com    ARGBBlend(src_argb_a + off, kStride,
10281d160cb99f2b05df80c4555bd769825ad1175dc9fbarchard@google.com              src_argb_b + off, kStride,
10291d160cb99f2b05df80c4555bd769825ad1175dc9fbarchard@google.com              dst_argb_opt, kStride,
1030dd3b137f5d9d87e92cb44f754f60b90ba50e31bcfbarchard@google.com              width, invert * height);
1031b5491759b45de37df781d4408a0c46abf6d4ae08fbarchard@google.com  }
1032b5491759b45de37df781d4408a0c46abf6d4ae08fbarchard@google.com  int max_diff = 0;
10331d160cb99f2b05df80c4555bd769825ad1175dc9fbarchard@google.com  for (int i = 0; i < kStride * height; ++i) {
1034b5491759b45de37df781d4408a0c46abf6d4ae08fbarchard@google.com    int abs_diff =
1035b5491759b45de37df781d4408a0c46abf6d4ae08fbarchard@google.com        abs(static_cast<int>(dst_argb_c[i]) -
1036b5491759b45de37df781d4408a0c46abf6d4ae08fbarchard@google.com            static_cast<int>(dst_argb_opt[i]));
1037b5491759b45de37df781d4408a0c46abf6d4ae08fbarchard@google.com    if (abs_diff > max_diff) {
1038b5491759b45de37df781d4408a0c46abf6d4ae08fbarchard@google.com      max_diff = abs_diff;
1039b5491759b45de37df781d4408a0c46abf6d4ae08fbarchard@google.com    }
1040b5491759b45de37df781d4408a0c46abf6d4ae08fbarchard@google.com  }
1041ae9a1388a71a3154ef7d6f753c8e568c97554fc0fbarchard@google.com  free_aligned_buffer_64(src_argb_a);
1042ae9a1388a71a3154ef7d6f753c8e568c97554fc0fbarchard@google.com  free_aligned_buffer_64(src_argb_b);
1043ae9a1388a71a3154ef7d6f753c8e568c97554fc0fbarchard@google.com  free_aligned_buffer_64(dst_argb_c);
1044ae9a1388a71a3154ef7d6f753c8e568c97554fc0fbarchard@google.com  free_aligned_buffer_64(dst_argb_opt);
1045b5491759b45de37df781d4408a0c46abf6d4ae08fbarchard@google.com  return max_diff;
1046b5491759b45de37df781d4408a0c46abf6d4ae08fbarchard@google.com}
1047b5491759b45de37df781d4408a0c46abf6d4ae08fbarchard@google.com
1048b5491759b45de37df781d4408a0c46abf6d4ae08fbarchard@google.comTEST_F(libyuvTest, ARGBBlend_Any) {
1049b5491759b45de37df781d4408a0c46abf6d4ae08fbarchard@google.com  int max_diff = TestBlend(benchmark_width_ - 4, benchmark_height_,
1050b5491759b45de37df781d4408a0c46abf6d4ae08fbarchard@google.com                           benchmark_iterations_, +1, 0);
1051b5491759b45de37df781d4408a0c46abf6d4ae08fbarchard@google.com  EXPECT_LE(max_diff, 1);
1052b5491759b45de37df781d4408a0c46abf6d4ae08fbarchard@google.com}
1053b5491759b45de37df781d4408a0c46abf6d4ae08fbarchard@google.com
1054dd3b137f5d9d87e92cb44f754f60b90ba50e31bcfbarchard@google.comTEST_F(libyuvTest, ARGBBlend_Unaligned) {
1055dd3b137f5d9d87e92cb44f754f60b90ba50e31bcfbarchard@google.com  int max_diff = TestBlend(benchmark_width_, benchmark_height_,
1056dd3b137f5d9d87e92cb44f754f60b90ba50e31bcfbarchard@google.com                           benchmark_iterations_, +1, 1);
1057dd3b137f5d9d87e92cb44f754f60b90ba50e31bcfbarchard@google.com  EXPECT_LE(max_diff, 1);
1058dd3b137f5d9d87e92cb44f754f60b90ba50e31bcfbarchard@google.com}
1059b5491759b45de37df781d4408a0c46abf6d4ae08fbarchard@google.com
1060b5491759b45de37df781d4408a0c46abf6d4ae08fbarchard@google.comTEST_F(libyuvTest, ARGBBlend_Invert) {
1061b5491759b45de37df781d4408a0c46abf6d4ae08fbarchard@google.com  int max_diff = TestBlend(benchmark_width_, benchmark_height_,
1062b5491759b45de37df781d4408a0c46abf6d4ae08fbarchard@google.com                           benchmark_iterations_, -1, 0);
1063b5491759b45de37df781d4408a0c46abf6d4ae08fbarchard@google.com  EXPECT_LE(max_diff, 1);
1064b5491759b45de37df781d4408a0c46abf6d4ae08fbarchard@google.com}
1065b5491759b45de37df781d4408a0c46abf6d4ae08fbarchard@google.com
1066b5491759b45de37df781d4408a0c46abf6d4ae08fbarchard@google.comTEST_F(libyuvTest, ARGBBlend_Opt) {
1067b5491759b45de37df781d4408a0c46abf6d4ae08fbarchard@google.com  int max_diff = TestBlend(benchmark_width_, benchmark_height_,
1068b5491759b45de37df781d4408a0c46abf6d4ae08fbarchard@google.com                           benchmark_iterations_, +1, 0);
1069b5491759b45de37df781d4408a0c46abf6d4ae08fbarchard@google.com  EXPECT_LE(max_diff, 1);
1070b5491759b45de37df781d4408a0c46abf6d4ae08fbarchard@google.com}
1071b5491759b45de37df781d4408a0c46abf6d4ae08fbarchard@google.com
107292e51c7a69078f3b6b9a080eb99e0f8155d9d7d1fbarchard@google.comTEST_F(libyuvTest, TestAffine) {
10734b4b50fb445a166ce08e24d016157776b5df65cbfbarchard@google.com  SIMD_ALIGNED(uint8 orig_pixels_0[1280][4]);
10744b4b50fb445a166ce08e24d016157776b5df65cbfbarchard@google.com  SIMD_ALIGNED(uint8 interpolate_pixels_C[1280][4]);
107592e51c7a69078f3b6b9a080eb99e0f8155d9d7d1fbarchard@google.com
10764b4b50fb445a166ce08e24d016157776b5df65cbfbarchard@google.com  for (int i = 0; i < 1280; ++i) {
107792e51c7a69078f3b6b9a080eb99e0f8155d9d7d1fbarchard@google.com    for (int j = 0; j < 4; ++j) {
107892e51c7a69078f3b6b9a080eb99e0f8155d9d7d1fbarchard@google.com      orig_pixels_0[i][j] = i;
107992e51c7a69078f3b6b9a080eb99e0f8155d9d7d1fbarchard@google.com    }
108092e51c7a69078f3b6b9a080eb99e0f8155d9d7d1fbarchard@google.com  }
108192e51c7a69078f3b6b9a080eb99e0f8155d9d7d1fbarchard@google.com
108292e51c7a69078f3b6b9a080eb99e0f8155d9d7d1fbarchard@google.com  float uv_step[4] = { 0.f, 0.f, 0.75f, 0.f };
108392e51c7a69078f3b6b9a080eb99e0f8155d9d7d1fbarchard@google.com
108492e51c7a69078f3b6b9a080eb99e0f8155d9d7d1fbarchard@google.com  ARGBAffineRow_C(&orig_pixels_0[0][0], 0, &interpolate_pixels_C[0][0],
10854b4b50fb445a166ce08e24d016157776b5df65cbfbarchard@google.com                  uv_step, 1280);
108692e51c7a69078f3b6b9a080eb99e0f8155d9d7d1fbarchard@google.com  EXPECT_EQ(0u, interpolate_pixels_C[0][0]);
108792e51c7a69078f3b6b9a080eb99e0f8155d9d7d1fbarchard@google.com  EXPECT_EQ(96u, interpolate_pixels_C[128][0]);
108892e51c7a69078f3b6b9a080eb99e0f8155d9d7d1fbarchard@google.com  EXPECT_EQ(191u, interpolate_pixels_C[255][3]);
108992e51c7a69078f3b6b9a080eb99e0f8155d9d7d1fbarchard@google.com
10902a9546579587a4835752001ce141c93dc02fb02ffbarchard@google.com#if defined(HAS_ARGBAFFINEROW_SSE2)
10914b4b50fb445a166ce08e24d016157776b5df65cbfbarchard@google.com  SIMD_ALIGNED(uint8 interpolate_pixels_Opt[1280][4]);
109292e51c7a69078f3b6b9a080eb99e0f8155d9d7d1fbarchard@google.com  ARGBAffineRow_SSE2(&orig_pixels_0[0][0], 0, &interpolate_pixels_Opt[0][0],
10934b4b50fb445a166ce08e24d016157776b5df65cbfbarchard@google.com                     uv_step, 1280);
10944b4b50fb445a166ce08e24d016157776b5df65cbfbarchard@google.com  EXPECT_EQ(0, memcmp(interpolate_pixels_Opt, interpolate_pixels_C, 1280 * 4));
109592e51c7a69078f3b6b9a080eb99e0f8155d9d7d1fbarchard@google.com
109692e51c7a69078f3b6b9a080eb99e0f8155d9d7d1fbarchard@google.com  int has_sse2 = TestCpuFlag(kCpuHasSSE2);
109792e51c7a69078f3b6b9a080eb99e0f8155d9d7d1fbarchard@google.com  if (has_sse2) {
10984b4b50fb445a166ce08e24d016157776b5df65cbfbarchard@google.com    for (int i = 0; i < benchmark_pixels_div1280_; ++i) {
109992e51c7a69078f3b6b9a080eb99e0f8155d9d7d1fbarchard@google.com      ARGBAffineRow_SSE2(&orig_pixels_0[0][0], 0, &interpolate_pixels_Opt[0][0],
11004b4b50fb445a166ce08e24d016157776b5df65cbfbarchard@google.com                         uv_step, 1280);
110192e51c7a69078f3b6b9a080eb99e0f8155d9d7d1fbarchard@google.com    }
110292e51c7a69078f3b6b9a080eb99e0f8155d9d7d1fbarchard@google.com  }
11032a9546579587a4835752001ce141c93dc02fb02ffbarchard@google.com#endif
110492e51c7a69078f3b6b9a080eb99e0f8155d9d7d1fbarchard@google.com}
110592e51c7a69078f3b6b9a080eb99e0f8155d9d7d1fbarchard@google.com
1106e1247eec9498c870a3d24cf9f70472a2fbb9825efbarchard@google.comTEST_F(libyuvTest, TestSobelX) {
11074b4b50fb445a166ce08e24d016157776b5df65cbfbarchard@google.com  SIMD_ALIGNED(uint8 orig_pixels_0[1280 + 2]);
11084b4b50fb445a166ce08e24d016157776b5df65cbfbarchard@google.com  SIMD_ALIGNED(uint8 orig_pixels_1[1280 + 2]);
11094b4b50fb445a166ce08e24d016157776b5df65cbfbarchard@google.com  SIMD_ALIGNED(uint8 orig_pixels_2[1280 + 2]);
11104b4b50fb445a166ce08e24d016157776b5df65cbfbarchard@google.com  SIMD_ALIGNED(uint8 sobel_pixels_c[1280]);
11114b4b50fb445a166ce08e24d016157776b5df65cbfbarchard@google.com  SIMD_ALIGNED(uint8 sobel_pixels_opt[1280]);
1112e1247eec9498c870a3d24cf9f70472a2fbb9825efbarchard@google.com
11134b4b50fb445a166ce08e24d016157776b5df65cbfbarchard@google.com  for (int i = 0; i < 1280 + 2; ++i) {
1114e1247eec9498c870a3d24cf9f70472a2fbb9825efbarchard@google.com    orig_pixels_0[i] = i;
1115e1247eec9498c870a3d24cf9f70472a2fbb9825efbarchard@google.com    orig_pixels_1[i] = i * 2;
1116e1247eec9498c870a3d24cf9f70472a2fbb9825efbarchard@google.com    orig_pixels_2[i] = i * 3;
1117e1247eec9498c870a3d24cf9f70472a2fbb9825efbarchard@google.com  }
1118e1247eec9498c870a3d24cf9f70472a2fbb9825efbarchard@google.com
1119e1247eec9498c870a3d24cf9f70472a2fbb9825efbarchard@google.com  SobelXRow_C(orig_pixels_0, orig_pixels_1, orig_pixels_2,
11204b4b50fb445a166ce08e24d016157776b5df65cbfbarchard@google.com              sobel_pixels_c, 1280);
1121e1247eec9498c870a3d24cf9f70472a2fbb9825efbarchard@google.com
1122e1247eec9498c870a3d24cf9f70472a2fbb9825efbarchard@google.com  EXPECT_EQ(16u, sobel_pixels_c[0]);
1123e1247eec9498c870a3d24cf9f70472a2fbb9825efbarchard@google.com  EXPECT_EQ(16u, sobel_pixels_c[100]);
1124e1247eec9498c870a3d24cf9f70472a2fbb9825efbarchard@google.com  EXPECT_EQ(255u, sobel_pixels_c[255]);
11259d48df9ac434cf036bd8ec648fc040756a382c60fbarchard@google.com
11269d48df9ac434cf036bd8ec648fc040756a382c60fbarchard@google.com  void (*SobelXRow)(const uint8* src_y0, const uint8* src_y1,
11279d48df9ac434cf036bd8ec648fc040756a382c60fbarchard@google.com                    const uint8* src_y2, uint8* dst_sobely, int width) =
11289d48df9ac434cf036bd8ec648fc040756a382c60fbarchard@google.com      SobelXRow_C;
1129092099507e44e9f429ec52956a20b28db634b910fbarchard@google.com#if defined(HAS_SOBELXROW_SSE2)
1130092099507e44e9f429ec52956a20b28db634b910fbarchard@google.com  if (TestCpuFlag(kCpuHasSSE2)) {
1131092099507e44e9f429ec52956a20b28db634b910fbarchard@google.com    SobelXRow = SobelXRow_SSE2;
11329d48df9ac434cf036bd8ec648fc040756a382c60fbarchard@google.com  }
11339d48df9ac434cf036bd8ec648fc040756a382c60fbarchard@google.com#endif
1134c56a55fc7206a257eecc21969f94ab066dd80f2ffbarchard@google.com#if defined(HAS_SOBELXROW_NEON)
1135c56a55fc7206a257eecc21969f94ab066dd80f2ffbarchard@google.com  if (TestCpuFlag(kCpuHasNEON)) {
1136c56a55fc7206a257eecc21969f94ab066dd80f2ffbarchard@google.com    SobelXRow = SobelXRow_NEON;
1137c56a55fc7206a257eecc21969f94ab066dd80f2ffbarchard@google.com  }
1138c56a55fc7206a257eecc21969f94ab066dd80f2ffbarchard@google.com#endif
11394b4b50fb445a166ce08e24d016157776b5df65cbfbarchard@google.com  for (int i = 0; i < benchmark_pixels_div1280_; ++i) {
11409d48df9ac434cf036bd8ec648fc040756a382c60fbarchard@google.com    SobelXRow(orig_pixels_0, orig_pixels_1, orig_pixels_2,
11414b4b50fb445a166ce08e24d016157776b5df65cbfbarchard@google.com              sobel_pixels_opt, 1280);
1142e1247eec9498c870a3d24cf9f70472a2fbb9825efbarchard@google.com  }
11434b4b50fb445a166ce08e24d016157776b5df65cbfbarchard@google.com  for (int i = 0; i < 1280; ++i) {
11448be4b289c799356d84c68c4eb4b5403285096693fbarchard@google.com    EXPECT_EQ(sobel_pixels_c[i], sobel_pixels_opt[i]);
1145e1247eec9498c870a3d24cf9f70472a2fbb9825efbarchard@google.com  }
1146e1247eec9498c870a3d24cf9f70472a2fbb9825efbarchard@google.com}
1147e1247eec9498c870a3d24cf9f70472a2fbb9825efbarchard@google.com
1148e1247eec9498c870a3d24cf9f70472a2fbb9825efbarchard@google.comTEST_F(libyuvTest, TestSobelY) {
11494b4b50fb445a166ce08e24d016157776b5df65cbfbarchard@google.com  SIMD_ALIGNED(uint8 orig_pixels_0[1280 + 2]);
11504b4b50fb445a166ce08e24d016157776b5df65cbfbarchard@google.com  SIMD_ALIGNED(uint8 orig_pixels_1[1280 + 2]);
11514b4b50fb445a166ce08e24d016157776b5df65cbfbarchard@google.com  SIMD_ALIGNED(uint8 sobel_pixels_c[1280]);
11524b4b50fb445a166ce08e24d016157776b5df65cbfbarchard@google.com  SIMD_ALIGNED(uint8 sobel_pixels_opt[1280]);
1153e1247eec9498c870a3d24cf9f70472a2fbb9825efbarchard@google.com
11544b4b50fb445a166ce08e24d016157776b5df65cbfbarchard@google.com  for (int i = 0; i < 1280 + 2; ++i) {
1155e1247eec9498c870a3d24cf9f70472a2fbb9825efbarchard@google.com    orig_pixels_0[i] = i;
1156e1247eec9498c870a3d24cf9f70472a2fbb9825efbarchard@google.com    orig_pixels_1[i] = i * 2;
1157e1247eec9498c870a3d24cf9f70472a2fbb9825efbarchard@google.com  }
1158e1247eec9498c870a3d24cf9f70472a2fbb9825efbarchard@google.com
11594b4b50fb445a166ce08e24d016157776b5df65cbfbarchard@google.com  SobelYRow_C(orig_pixels_0, orig_pixels_1, sobel_pixels_c, 1280);
1160e1247eec9498c870a3d24cf9f70472a2fbb9825efbarchard@google.com
1161e1247eec9498c870a3d24cf9f70472a2fbb9825efbarchard@google.com  EXPECT_EQ(4u, sobel_pixels_c[0]);
1162e1247eec9498c870a3d24cf9f70472a2fbb9825efbarchard@google.com  EXPECT_EQ(255u, sobel_pixels_c[100]);
1163e1247eec9498c870a3d24cf9f70472a2fbb9825efbarchard@google.com  EXPECT_EQ(0u, sobel_pixels_c[255]);
11649d48df9ac434cf036bd8ec648fc040756a382c60fbarchard@google.com  void (*SobelYRow)(const uint8* src_y0, const uint8* src_y1,
11659d48df9ac434cf036bd8ec648fc040756a382c60fbarchard@google.com                    uint8* dst_sobely, int width) = SobelYRow_C;
1166092099507e44e9f429ec52956a20b28db634b910fbarchard@google.com#if defined(HAS_SOBELYROW_SSE2)
1167092099507e44e9f429ec52956a20b28db634b910fbarchard@google.com  if (TestCpuFlag(kCpuHasSSE2)) {
1168092099507e44e9f429ec52956a20b28db634b910fbarchard@google.com    SobelYRow = SobelYRow_SSE2;
11699d48df9ac434cf036bd8ec648fc040756a382c60fbarchard@google.com  }
11709d48df9ac434cf036bd8ec648fc040756a382c60fbarchard@google.com#endif
1171c56a55fc7206a257eecc21969f94ab066dd80f2ffbarchard@google.com#if defined(HAS_SOBELYROW_NEON)
1172c56a55fc7206a257eecc21969f94ab066dd80f2ffbarchard@google.com  if (TestCpuFlag(kCpuHasNEON)) {
1173c56a55fc7206a257eecc21969f94ab066dd80f2ffbarchard@google.com    SobelYRow = SobelYRow_NEON;
1174c56a55fc7206a257eecc21969f94ab066dd80f2ffbarchard@google.com  }
1175c56a55fc7206a257eecc21969f94ab066dd80f2ffbarchard@google.com#endif
11764b4b50fb445a166ce08e24d016157776b5df65cbfbarchard@google.com  for (int i = 0; i < benchmark_pixels_div1280_; ++i) {
11774b4b50fb445a166ce08e24d016157776b5df65cbfbarchard@google.com    SobelYRow(orig_pixels_0, orig_pixels_1, sobel_pixels_opt, 1280);
1178e1247eec9498c870a3d24cf9f70472a2fbb9825efbarchard@google.com  }
11794b4b50fb445a166ce08e24d016157776b5df65cbfbarchard@google.com  for (int i = 0; i < 1280; ++i) {
11808be4b289c799356d84c68c4eb4b5403285096693fbarchard@google.com    EXPECT_EQ(sobel_pixels_c[i], sobel_pixels_opt[i]);
1181e1247eec9498c870a3d24cf9f70472a2fbb9825efbarchard@google.com  }
1182e1247eec9498c870a3d24cf9f70472a2fbb9825efbarchard@google.com}
1183e1247eec9498c870a3d24cf9f70472a2fbb9825efbarchard@google.com
1184c93a137671e2e281dfb8d32561fed95caacf608bfbarchard@google.comTEST_F(libyuvTest, TestSobel) {
11854b4b50fb445a166ce08e24d016157776b5df65cbfbarchard@google.com  SIMD_ALIGNED(uint8 orig_sobelx[1280]);
11864b4b50fb445a166ce08e24d016157776b5df65cbfbarchard@google.com  SIMD_ALIGNED(uint8 orig_sobely[1280]);
11874b4b50fb445a166ce08e24d016157776b5df65cbfbarchard@google.com  SIMD_ALIGNED(uint8 sobel_pixels_c[1280 * 4]);
11884b4b50fb445a166ce08e24d016157776b5df65cbfbarchard@google.com  SIMD_ALIGNED(uint8 sobel_pixels_opt[1280 * 4]);
1189c93a137671e2e281dfb8d32561fed95caacf608bfbarchard@google.com
11904b4b50fb445a166ce08e24d016157776b5df65cbfbarchard@google.com  for (int i = 0; i < 1280; ++i) {
1191c93a137671e2e281dfb8d32561fed95caacf608bfbarchard@google.com    orig_sobelx[i] = i;
1192c93a137671e2e281dfb8d32561fed95caacf608bfbarchard@google.com    orig_sobely[i] = i * 2;
1193c93a137671e2e281dfb8d32561fed95caacf608bfbarchard@google.com  }
1194c93a137671e2e281dfb8d32561fed95caacf608bfbarchard@google.com
11954b4b50fb445a166ce08e24d016157776b5df65cbfbarchard@google.com  SobelRow_C(orig_sobelx, orig_sobely, sobel_pixels_c, 1280);
1196c93a137671e2e281dfb8d32561fed95caacf608bfbarchard@google.com
1197c93a137671e2e281dfb8d32561fed95caacf608bfbarchard@google.com  EXPECT_EQ(0u, sobel_pixels_c[0]);
1198c93a137671e2e281dfb8d32561fed95caacf608bfbarchard@google.com  EXPECT_EQ(3u, sobel_pixels_c[4]);
1199c93a137671e2e281dfb8d32561fed95caacf608bfbarchard@google.com  EXPECT_EQ(3u, sobel_pixels_c[5]);
1200c93a137671e2e281dfb8d32561fed95caacf608bfbarchard@google.com  EXPECT_EQ(3u, sobel_pixels_c[6]);
1201c93a137671e2e281dfb8d32561fed95caacf608bfbarchard@google.com  EXPECT_EQ(255u, sobel_pixels_c[7]);
1202c93a137671e2e281dfb8d32561fed95caacf608bfbarchard@google.com  EXPECT_EQ(6u, sobel_pixels_c[8]);
1203c93a137671e2e281dfb8d32561fed95caacf608bfbarchard@google.com  EXPECT_EQ(6u, sobel_pixels_c[9]);
1204c93a137671e2e281dfb8d32561fed95caacf608bfbarchard@google.com  EXPECT_EQ(6u, sobel_pixels_c[10]);
1205c93a137671e2e281dfb8d32561fed95caacf608bfbarchard@google.com  EXPECT_EQ(255u, sobel_pixels_c[7]);
1206c93a137671e2e281dfb8d32561fed95caacf608bfbarchard@google.com  EXPECT_EQ(255u, sobel_pixels_c[100 * 4 + 1]);
1207c93a137671e2e281dfb8d32561fed95caacf608bfbarchard@google.com  EXPECT_EQ(255u, sobel_pixels_c[255 * 4 + 1]);
12089d48df9ac434cf036bd8ec648fc040756a382c60fbarchard@google.com  void (*SobelRow)(const uint8* src_sobelx, const uint8* src_sobely,
12099d48df9ac434cf036bd8ec648fc040756a382c60fbarchard@google.com                   uint8* dst_argb, int width) = SobelRow_C;
1210c93a137671e2e281dfb8d32561fed95caacf608bfbarchard@google.com#if defined(HAS_SOBELROW_SSE2)
12119d48df9ac434cf036bd8ec648fc040756a382c60fbarchard@google.com  if (TestCpuFlag(kCpuHasSSE2)) {
12129d48df9ac434cf036bd8ec648fc040756a382c60fbarchard@google.com    SobelRow = SobelRow_SSE2;
12139d48df9ac434cf036bd8ec648fc040756a382c60fbarchard@google.com  }
12149d48df9ac434cf036bd8ec648fc040756a382c60fbarchard@google.com#endif
1215c56a55fc7206a257eecc21969f94ab066dd80f2ffbarchard@google.com#if defined(HAS_SOBELROW_NEON)
1216c56a55fc7206a257eecc21969f94ab066dd80f2ffbarchard@google.com  if (TestCpuFlag(kCpuHasNEON)) {
1217c56a55fc7206a257eecc21969f94ab066dd80f2ffbarchard@google.com    SobelRow = SobelRow_NEON;
1218c56a55fc7206a257eecc21969f94ab066dd80f2ffbarchard@google.com  }
1219c56a55fc7206a257eecc21969f94ab066dd80f2ffbarchard@google.com#endif
12204b4b50fb445a166ce08e24d016157776b5df65cbfbarchard@google.com  for (int i = 0; i < benchmark_pixels_div1280_; ++i) {
12214b4b50fb445a166ce08e24d016157776b5df65cbfbarchard@google.com    SobelRow(orig_sobelx, orig_sobely, sobel_pixels_opt, 1280);
1222c93a137671e2e281dfb8d32561fed95caacf608bfbarchard@google.com  }
12238be4b289c799356d84c68c4eb4b5403285096693fbarchard@google.com  for (int i = 0; i < 1280 * 4; ++i) {
12248be4b289c799356d84c68c4eb4b5403285096693fbarchard@google.com    EXPECT_EQ(sobel_pixels_c[i], sobel_pixels_opt[i]);
12258be4b289c799356d84c68c4eb4b5403285096693fbarchard@google.com  }
12268be4b289c799356d84c68c4eb4b5403285096693fbarchard@google.com}
12278be4b289c799356d84c68c4eb4b5403285096693fbarchard@google.com
12288be4b289c799356d84c68c4eb4b5403285096693fbarchard@google.comTEST_F(libyuvTest, TestSobelToPlane) {
12298be4b289c799356d84c68c4eb4b5403285096693fbarchard@google.com  SIMD_ALIGNED(uint8 orig_sobelx[1280]);
12308be4b289c799356d84c68c4eb4b5403285096693fbarchard@google.com  SIMD_ALIGNED(uint8 orig_sobely[1280]);
12318be4b289c799356d84c68c4eb4b5403285096693fbarchard@google.com  SIMD_ALIGNED(uint8 sobel_pixels_c[1280]);
12328be4b289c799356d84c68c4eb4b5403285096693fbarchard@google.com  SIMD_ALIGNED(uint8 sobel_pixels_opt[1280]);
12338be4b289c799356d84c68c4eb4b5403285096693fbarchard@google.com
12348be4b289c799356d84c68c4eb4b5403285096693fbarchard@google.com  for (int i = 0; i < 1280; ++i) {
12358be4b289c799356d84c68c4eb4b5403285096693fbarchard@google.com    orig_sobelx[i] = i;
12368be4b289c799356d84c68c4eb4b5403285096693fbarchard@google.com    orig_sobely[i] = i * 2;
12378be4b289c799356d84c68c4eb4b5403285096693fbarchard@google.com  }
12388be4b289c799356d84c68c4eb4b5403285096693fbarchard@google.com
12398be4b289c799356d84c68c4eb4b5403285096693fbarchard@google.com  SobelToPlaneRow_C(orig_sobelx, orig_sobely, sobel_pixels_c, 1280);
12408be4b289c799356d84c68c4eb4b5403285096693fbarchard@google.com
12418be4b289c799356d84c68c4eb4b5403285096693fbarchard@google.com  EXPECT_EQ(0u, sobel_pixels_c[0]);
12428be4b289c799356d84c68c4eb4b5403285096693fbarchard@google.com  EXPECT_EQ(3u, sobel_pixels_c[1]);
12438be4b289c799356d84c68c4eb4b5403285096693fbarchard@google.com  EXPECT_EQ(6u, sobel_pixels_c[2]);
12448be4b289c799356d84c68c4eb4b5403285096693fbarchard@google.com  EXPECT_EQ(99u, sobel_pixels_c[33]);
12458be4b289c799356d84c68c4eb4b5403285096693fbarchard@google.com  EXPECT_EQ(255u, sobel_pixels_c[100]);
12468be4b289c799356d84c68c4eb4b5403285096693fbarchard@google.com  void (*SobelToPlaneRow)(const uint8* src_sobelx, const uint8* src_sobely,
12478be4b289c799356d84c68c4eb4b5403285096693fbarchard@google.com                          uint8* dst_y, int width) = SobelToPlaneRow_C;
12488be4b289c799356d84c68c4eb4b5403285096693fbarchard@google.com#if defined(HAS_SOBELTOPLANEROW_SSE2)
12498be4b289c799356d84c68c4eb4b5403285096693fbarchard@google.com  if (TestCpuFlag(kCpuHasSSE2)) {
12508be4b289c799356d84c68c4eb4b5403285096693fbarchard@google.com    SobelToPlaneRow = SobelToPlaneRow_SSE2;
12518be4b289c799356d84c68c4eb4b5403285096693fbarchard@google.com  }
12528be4b289c799356d84c68c4eb4b5403285096693fbarchard@google.com#endif
12538be4b289c799356d84c68c4eb4b5403285096693fbarchard@google.com#if defined(HAS_SOBELTOPLANEROW_NEON)
12548be4b289c799356d84c68c4eb4b5403285096693fbarchard@google.com  if (TestCpuFlag(kCpuHasNEON)) {
12558be4b289c799356d84c68c4eb4b5403285096693fbarchard@google.com    SobelToPlaneRow = SobelToPlaneRow_NEON;
12568be4b289c799356d84c68c4eb4b5403285096693fbarchard@google.com  }
12578be4b289c799356d84c68c4eb4b5403285096693fbarchard@google.com#endif
12588be4b289c799356d84c68c4eb4b5403285096693fbarchard@google.com  for (int i = 0; i < benchmark_pixels_div1280_; ++i) {
12598be4b289c799356d84c68c4eb4b5403285096693fbarchard@google.com    SobelToPlaneRow(orig_sobelx, orig_sobely, sobel_pixels_opt, 1280);
12608be4b289c799356d84c68c4eb4b5403285096693fbarchard@google.com  }
12618be4b289c799356d84c68c4eb4b5403285096693fbarchard@google.com  for (int i = 0; i < 1280; ++i) {
12628be4b289c799356d84c68c4eb4b5403285096693fbarchard@google.com    EXPECT_EQ(sobel_pixels_c[i], sobel_pixels_opt[i]);
1263c93a137671e2e281dfb8d32561fed95caacf608bfbarchard@google.com  }
1264c93a137671e2e281dfb8d32561fed95caacf608bfbarchard@google.com}
1265c93a137671e2e281dfb8d32561fed95caacf608bfbarchard@google.com
1266610e012d56b1cce420369b82335bd178f7e39397fbarchard@google.comTEST_F(libyuvTest, TestSobelXY) {
12674b4b50fb445a166ce08e24d016157776b5df65cbfbarchard@google.com  SIMD_ALIGNED(uint8 orig_sobelx[1280]);
12684b4b50fb445a166ce08e24d016157776b5df65cbfbarchard@google.com  SIMD_ALIGNED(uint8 orig_sobely[1280]);
12694b4b50fb445a166ce08e24d016157776b5df65cbfbarchard@google.com  SIMD_ALIGNED(uint8 sobel_pixels_c[1280 * 4]);
12704b4b50fb445a166ce08e24d016157776b5df65cbfbarchard@google.com  SIMD_ALIGNED(uint8 sobel_pixels_opt[1280 * 4]);
1271610e012d56b1cce420369b82335bd178f7e39397fbarchard@google.com
12724b4b50fb445a166ce08e24d016157776b5df65cbfbarchard@google.com  for (int i = 0; i < 1280; ++i) {
1273610e012d56b1cce420369b82335bd178f7e39397fbarchard@google.com    orig_sobelx[i] = i;
1274610e012d56b1cce420369b82335bd178f7e39397fbarchard@google.com    orig_sobely[i] = i * 2;
1275610e012d56b1cce420369b82335bd178f7e39397fbarchard@google.com  }
1276610e012d56b1cce420369b82335bd178f7e39397fbarchard@google.com
12774b4b50fb445a166ce08e24d016157776b5df65cbfbarchard@google.com  SobelXYRow_C(orig_sobelx, orig_sobely, sobel_pixels_c, 1280);
1278610e012d56b1cce420369b82335bd178f7e39397fbarchard@google.com
1279610e012d56b1cce420369b82335bd178f7e39397fbarchard@google.com  EXPECT_EQ(0u, sobel_pixels_c[0]);
1280610e012d56b1cce420369b82335bd178f7e39397fbarchard@google.com  EXPECT_EQ(2u, sobel_pixels_c[4]);
1281610e012d56b1cce420369b82335bd178f7e39397fbarchard@google.com  EXPECT_EQ(3u, sobel_pixels_c[5]);
1282610e012d56b1cce420369b82335bd178f7e39397fbarchard@google.com  EXPECT_EQ(1u, sobel_pixels_c[6]);
1283610e012d56b1cce420369b82335bd178f7e39397fbarchard@google.com  EXPECT_EQ(255u, sobel_pixels_c[7]);
1284610e012d56b1cce420369b82335bd178f7e39397fbarchard@google.com  EXPECT_EQ(255u, sobel_pixels_c[100 * 4 + 1]);
1285610e012d56b1cce420369b82335bd178f7e39397fbarchard@google.com  EXPECT_EQ(255u, sobel_pixels_c[255 * 4 + 1]);
12869d48df9ac434cf036bd8ec648fc040756a382c60fbarchard@google.com  void (*SobelXYRow)(const uint8* src_sobelx, const uint8* src_sobely,
12879d48df9ac434cf036bd8ec648fc040756a382c60fbarchard@google.com                       uint8* dst_argb, int width) = SobelXYRow_C;
1288610e012d56b1cce420369b82335bd178f7e39397fbarchard@google.com#if defined(HAS_SOBELXYROW_SSE2)
12899d48df9ac434cf036bd8ec648fc040756a382c60fbarchard@google.com  if (TestCpuFlag(kCpuHasSSE2)) {
12909d48df9ac434cf036bd8ec648fc040756a382c60fbarchard@google.com    SobelXYRow = SobelXYRow_SSE2;
12919d48df9ac434cf036bd8ec648fc040756a382c60fbarchard@google.com  }
12929d48df9ac434cf036bd8ec648fc040756a382c60fbarchard@google.com#endif
1293c56a55fc7206a257eecc21969f94ab066dd80f2ffbarchard@google.com#if defined(HAS_SOBELXYROW_NEON)
1294c56a55fc7206a257eecc21969f94ab066dd80f2ffbarchard@google.com  if (TestCpuFlag(kCpuHasNEON)) {
1295c56a55fc7206a257eecc21969f94ab066dd80f2ffbarchard@google.com    SobelXYRow = SobelXYRow_NEON;
1296c56a55fc7206a257eecc21969f94ab066dd80f2ffbarchard@google.com  }
1297c56a55fc7206a257eecc21969f94ab066dd80f2ffbarchard@google.com#endif
12984b4b50fb445a166ce08e24d016157776b5df65cbfbarchard@google.com  for (int i = 0; i < benchmark_pixels_div1280_; ++i) {
12994b4b50fb445a166ce08e24d016157776b5df65cbfbarchard@google.com    SobelXYRow(orig_sobelx, orig_sobely, sobel_pixels_opt, 1280);
1300610e012d56b1cce420369b82335bd178f7e39397fbarchard@google.com  }
13018be4b289c799356d84c68c4eb4b5403285096693fbarchard@google.com  for (int i = 0; i < 1280 * 4; ++i) {
13028be4b289c799356d84c68c4eb4b5403285096693fbarchard@google.com    EXPECT_EQ(sobel_pixels_c[i], sobel_pixels_opt[i]);
1303610e012d56b1cce420369b82335bd178f7e39397fbarchard@google.com  }
1304610e012d56b1cce420369b82335bd178f7e39397fbarchard@google.com}
1305610e012d56b1cce420369b82335bd178f7e39397fbarchard@google.com
13066c1b2d38c685e769cf7db2806e27c8ec4c028fe3fbarchard@google.comTEST_F(libyuvTest, TestCopyPlane) {
13076c1b2d38c685e769cf7db2806e27c8ec4c028fe3fbarchard@google.com  int err = 0;
13086c1b2d38c685e769cf7db2806e27c8ec4c028fe3fbarchard@google.com  int yw = benchmark_width_;
13096c1b2d38c685e769cf7db2806e27c8ec4c028fe3fbarchard@google.com  int yh = benchmark_height_;
13106c1b2d38c685e769cf7db2806e27c8ec4c028fe3fbarchard@google.com  int b = 12;
13116c1b2d38c685e769cf7db2806e27c8ec4c028fe3fbarchard@google.com  int i, j;
13126c1b2d38c685e769cf7db2806e27c8ec4c028fe3fbarchard@google.com
13136c1b2d38c685e769cf7db2806e27c8ec4c028fe3fbarchard@google.com  int y_plane_size = (yw + b * 2) * (yh + b * 2);
13146c1b2d38c685e769cf7db2806e27c8ec4c028fe3fbarchard@google.com  srandom(time(NULL));
1315ae9a1388a71a3154ef7d6f753c8e568c97554fc0fbarchard@google.com  align_buffer_64(orig_y, y_plane_size);
1316ae9a1388a71a3154ef7d6f753c8e568c97554fc0fbarchard@google.com  align_buffer_64(dst_c, y_plane_size);
13173e46444727a0524d2f1d81117e0b1404148ac910fbarchard@google.com  align_buffer_64(dst_opt, y_plane_size);
13186c1b2d38c685e769cf7db2806e27c8ec4c028fe3fbarchard@google.com
13196c1b2d38c685e769cf7db2806e27c8ec4c028fe3fbarchard@google.com  memset(orig_y, 0, y_plane_size);
13206c1b2d38c685e769cf7db2806e27c8ec4c028fe3fbarchard@google.com  memset(dst_c, 0, y_plane_size);
13216c1b2d38c685e769cf7db2806e27c8ec4c028fe3fbarchard@google.com  memset(dst_opt, 0, y_plane_size);
13226c1b2d38c685e769cf7db2806e27c8ec4c028fe3fbarchard@google.com
13236c1b2d38c685e769cf7db2806e27c8ec4c028fe3fbarchard@google.com  // Fill image buffers with random data.
13246c1b2d38c685e769cf7db2806e27c8ec4c028fe3fbarchard@google.com  for (i = b; i < (yh + b); ++i) {
13256c1b2d38c685e769cf7db2806e27c8ec4c028fe3fbarchard@google.com    for (j = b; j < (yw + b); ++j) {
13266c1b2d38c685e769cf7db2806e27c8ec4c028fe3fbarchard@google.com      orig_y[i * (yw + b * 2) + j] = random() & 0xff;
13276c1b2d38c685e769cf7db2806e27c8ec4c028fe3fbarchard@google.com    }
13286c1b2d38c685e769cf7db2806e27c8ec4c028fe3fbarchard@google.com  }
13296c1b2d38c685e769cf7db2806e27c8ec4c028fe3fbarchard@google.com
13306c1b2d38c685e769cf7db2806e27c8ec4c028fe3fbarchard@google.com  // Fill destination buffers with random data.
13316c1b2d38c685e769cf7db2806e27c8ec4c028fe3fbarchard@google.com  for (i = 0; i < y_plane_size; ++i) {
13326c1b2d38c685e769cf7db2806e27c8ec4c028fe3fbarchard@google.com    uint8 random_number = random() & 0x7f;
13336c1b2d38c685e769cf7db2806e27c8ec4c028fe3fbarchard@google.com    dst_c[i] = random_number;
13346c1b2d38c685e769cf7db2806e27c8ec4c028fe3fbarchard@google.com    dst_opt[i] = dst_c[i];
13356c1b2d38c685e769cf7db2806e27c8ec4c028fe3fbarchard@google.com  }
13366c1b2d38c685e769cf7db2806e27c8ec4c028fe3fbarchard@google.com
13376c1b2d38c685e769cf7db2806e27c8ec4c028fe3fbarchard@google.com  int y_off = b * (yw + b * 2) + b;
13386c1b2d38c685e769cf7db2806e27c8ec4c028fe3fbarchard@google.com
13396c1b2d38c685e769cf7db2806e27c8ec4c028fe3fbarchard@google.com  int y_st = yw + b * 2;
13406c1b2d38c685e769cf7db2806e27c8ec4c028fe3fbarchard@google.com  int stride = 8;
13416c1b2d38c685e769cf7db2806e27c8ec4c028fe3fbarchard@google.com
13426c1b2d38c685e769cf7db2806e27c8ec4c028fe3fbarchard@google.com  // Disable all optimizations.
13436c1b2d38c685e769cf7db2806e27c8ec4c028fe3fbarchard@google.com  MaskCpuFlags(0);
13446c1b2d38c685e769cf7db2806e27c8ec4c028fe3fbarchard@google.com  double c_time = get_time();
13456c1b2d38c685e769cf7db2806e27c8ec4c028fe3fbarchard@google.com  for (j = 0; j < benchmark_iterations_; j++) {
13466c1b2d38c685e769cf7db2806e27c8ec4c028fe3fbarchard@google.com    CopyPlane(orig_y + y_off, y_st, dst_c + y_off, stride, yw, yh);
13476c1b2d38c685e769cf7db2806e27c8ec4c028fe3fbarchard@google.com  }
13486c1b2d38c685e769cf7db2806e27c8ec4c028fe3fbarchard@google.com  c_time = (get_time() - c_time) / benchmark_iterations_;
13496c1b2d38c685e769cf7db2806e27c8ec4c028fe3fbarchard@google.com
13506c1b2d38c685e769cf7db2806e27c8ec4c028fe3fbarchard@google.com  // Enable optimizations.
13516c1b2d38c685e769cf7db2806e27c8ec4c028fe3fbarchard@google.com  MaskCpuFlags(-1);
13526c1b2d38c685e769cf7db2806e27c8ec4c028fe3fbarchard@google.com  double opt_time = get_time();
13536c1b2d38c685e769cf7db2806e27c8ec4c028fe3fbarchard@google.com  for (j = 0; j < benchmark_iterations_; j++) {
13546c1b2d38c685e769cf7db2806e27c8ec4c028fe3fbarchard@google.com    CopyPlane(orig_y + y_off, y_st, dst_opt + y_off, stride, yw, yh);
13556c1b2d38c685e769cf7db2806e27c8ec4c028fe3fbarchard@google.com  }
13566c1b2d38c685e769cf7db2806e27c8ec4c028fe3fbarchard@google.com  opt_time = (get_time() - opt_time) / benchmark_iterations_;
13576c1b2d38c685e769cf7db2806e27c8ec4c028fe3fbarchard@google.com
13586c1b2d38c685e769cf7db2806e27c8ec4c028fe3fbarchard@google.com  for (i = 0; i < y_plane_size; ++i) {
13596c1b2d38c685e769cf7db2806e27c8ec4c028fe3fbarchard@google.com    if (dst_c[i] != dst_opt[i])
13606c1b2d38c685e769cf7db2806e27c8ec4c028fe3fbarchard@google.com      ++err;
13616c1b2d38c685e769cf7db2806e27c8ec4c028fe3fbarchard@google.com  }
13626c1b2d38c685e769cf7db2806e27c8ec4c028fe3fbarchard@google.com
1363ae9a1388a71a3154ef7d6f753c8e568c97554fc0fbarchard@google.com  free_aligned_buffer_64(orig_y);
1364ae9a1388a71a3154ef7d6f753c8e568c97554fc0fbarchard@google.com  free_aligned_buffer_64(dst_c);
1365ae9a1388a71a3154ef7d6f753c8e568c97554fc0fbarchard@google.com  free_aligned_buffer_64(dst_opt);
13666c1b2d38c685e769cf7db2806e27c8ec4c028fe3fbarchard@google.com
13676c1b2d38c685e769cf7db2806e27c8ec4c028fe3fbarchard@google.com  EXPECT_EQ(0, err);
13686c1b2d38c685e769cf7db2806e27c8ec4c028fe3fbarchard@google.com}
13696c1b2d38c685e769cf7db2806e27c8ec4c028fe3fbarchard@google.com
13708ec6033478a736f1b84203792a0b254a19391100fbarchard@google.comstatic int TestMultiply(int width, int height, int benchmark_iterations,
13718ec6033478a736f1b84203792a0b254a19391100fbarchard@google.com                        int invert, int off) {
13724e0d7cc2c60e8aa85954c48927c6be08ee2b9db4fbarchard@google.com  if (width < 1) {
13734e0d7cc2c60e8aa85954c48927c6be08ee2b9db4fbarchard@google.com    width = 1;
13744e0d7cc2c60e8aa85954c48927c6be08ee2b9db4fbarchard@google.com  }
13758ec6033478a736f1b84203792a0b254a19391100fbarchard@google.com  const int kBpp = 4;
13768ec6033478a736f1b84203792a0b254a19391100fbarchard@google.com  const int kStride = (width * kBpp + 15) & ~15;
13778ec6033478a736f1b84203792a0b254a19391100fbarchard@google.com  align_buffer_64(src_argb_a, kStride * height + off);
13788ec6033478a736f1b84203792a0b254a19391100fbarchard@google.com  align_buffer_64(src_argb_b, kStride * height + off);
13798ec6033478a736f1b84203792a0b254a19391100fbarchard@google.com  align_buffer_64(dst_argb_c, kStride * height);
13808ec6033478a736f1b84203792a0b254a19391100fbarchard@google.com  align_buffer_64(dst_argb_opt, kStride * height);
13818ec6033478a736f1b84203792a0b254a19391100fbarchard@google.com  srandom(time(NULL));
13828ec6033478a736f1b84203792a0b254a19391100fbarchard@google.com  for (int i = 0; i < kStride * height; ++i) {
13838ec6033478a736f1b84203792a0b254a19391100fbarchard@google.com    src_argb_a[i + off] = (random() & 0xff);
13848ec6033478a736f1b84203792a0b254a19391100fbarchard@google.com    src_argb_b[i + off] = (random() & 0xff);
13858ec6033478a736f1b84203792a0b254a19391100fbarchard@google.com  }
13868fa76349948802d728dd244a7b54051d751d8696fbarchard@google.com  memset(dst_argb_c, 0, kStride * height);
13878fa76349948802d728dd244a7b54051d751d8696fbarchard@google.com  memset(dst_argb_opt, 0, kStride * height);
13888ec6033478a736f1b84203792a0b254a19391100fbarchard@google.com
13898ec6033478a736f1b84203792a0b254a19391100fbarchard@google.com  MaskCpuFlags(0);
13908ec6033478a736f1b84203792a0b254a19391100fbarchard@google.com  ARGBMultiply(src_argb_a + off, kStride,
13918fa76349948802d728dd244a7b54051d751d8696fbarchard@google.com               src_argb_b + off, kStride,
13928ec6033478a736f1b84203792a0b254a19391100fbarchard@google.com               dst_argb_c, kStride,
13938ec6033478a736f1b84203792a0b254a19391100fbarchard@google.com               width, invert * height);
13948ec6033478a736f1b84203792a0b254a19391100fbarchard@google.com  MaskCpuFlags(-1);
13958fa76349948802d728dd244a7b54051d751d8696fbarchard@google.com  for (int i = 0; i < benchmark_iterations; ++i) {
13968fa76349948802d728dd244a7b54051d751d8696fbarchard@google.com    ARGBMultiply(src_argb_a + off, kStride,
13978fa76349948802d728dd244a7b54051d751d8696fbarchard@google.com                 src_argb_b + off, kStride,
13988fa76349948802d728dd244a7b54051d751d8696fbarchard@google.com                 dst_argb_opt, kStride,
13998fa76349948802d728dd244a7b54051d751d8696fbarchard@google.com                 width, invert * height);
14008fa76349948802d728dd244a7b54051d751d8696fbarchard@google.com  }
14018ec6033478a736f1b84203792a0b254a19391100fbarchard@google.com  int max_diff = 0;
14028ec6033478a736f1b84203792a0b254a19391100fbarchard@google.com  for (int i = 0; i < kStride * height; ++i) {
14038ec6033478a736f1b84203792a0b254a19391100fbarchard@google.com    int abs_diff =
14048ec6033478a736f1b84203792a0b254a19391100fbarchard@google.com        abs(static_cast<int>(dst_argb_c[i]) -
14058ec6033478a736f1b84203792a0b254a19391100fbarchard@google.com            static_cast<int>(dst_argb_opt[i]));
14068ec6033478a736f1b84203792a0b254a19391100fbarchard@google.com    if (abs_diff > max_diff) {
14078ec6033478a736f1b84203792a0b254a19391100fbarchard@google.com      max_diff = abs_diff;
14088ec6033478a736f1b84203792a0b254a19391100fbarchard@google.com    }
14098ec6033478a736f1b84203792a0b254a19391100fbarchard@google.com  }
1410ae9a1388a71a3154ef7d6f753c8e568c97554fc0fbarchard@google.com  free_aligned_buffer_64(src_argb_a);
1411ae9a1388a71a3154ef7d6f753c8e568c97554fc0fbarchard@google.com  free_aligned_buffer_64(src_argb_b);
1412ae9a1388a71a3154ef7d6f753c8e568c97554fc0fbarchard@google.com  free_aligned_buffer_64(dst_argb_c);
1413ae9a1388a71a3154ef7d6f753c8e568c97554fc0fbarchard@google.com  free_aligned_buffer_64(dst_argb_opt);
14148ec6033478a736f1b84203792a0b254a19391100fbarchard@google.com  return max_diff;
14158ec6033478a736f1b84203792a0b254a19391100fbarchard@google.com}
14168ec6033478a736f1b84203792a0b254a19391100fbarchard@google.com
14178ec6033478a736f1b84203792a0b254a19391100fbarchard@google.comTEST_F(libyuvTest, ARGBMultiply_Any) {
14188ec6033478a736f1b84203792a0b254a19391100fbarchard@google.com  int max_diff = TestMultiply(benchmark_width_ - 1, benchmark_height_,
14198ec6033478a736f1b84203792a0b254a19391100fbarchard@google.com                              benchmark_iterations_, +1, 0);
14208ec6033478a736f1b84203792a0b254a19391100fbarchard@google.com  EXPECT_LE(max_diff, 1);
14218ec6033478a736f1b84203792a0b254a19391100fbarchard@google.com}
14228ec6033478a736f1b84203792a0b254a19391100fbarchard@google.com
14238ec6033478a736f1b84203792a0b254a19391100fbarchard@google.comTEST_F(libyuvTest, ARGBMultiply_Unaligned) {
14248ec6033478a736f1b84203792a0b254a19391100fbarchard@google.com  int max_diff = TestMultiply(benchmark_width_, benchmark_height_,
14258ec6033478a736f1b84203792a0b254a19391100fbarchard@google.com                              benchmark_iterations_, +1, 1);
14268ec6033478a736f1b84203792a0b254a19391100fbarchard@google.com  EXPECT_LE(max_diff, 1);
14278ec6033478a736f1b84203792a0b254a19391100fbarchard@google.com}
14288ec6033478a736f1b84203792a0b254a19391100fbarchard@google.com
14298ec6033478a736f1b84203792a0b254a19391100fbarchard@google.comTEST_F(libyuvTest, ARGBMultiply_Invert) {
14308ec6033478a736f1b84203792a0b254a19391100fbarchard@google.com  int max_diff = TestMultiply(benchmark_width_, benchmark_height_,
14318ec6033478a736f1b84203792a0b254a19391100fbarchard@google.com                              benchmark_iterations_, -1, 0);
14328ec6033478a736f1b84203792a0b254a19391100fbarchard@google.com  EXPECT_LE(max_diff, 1);
14338ec6033478a736f1b84203792a0b254a19391100fbarchard@google.com}
14348ec6033478a736f1b84203792a0b254a19391100fbarchard@google.com
14358ec6033478a736f1b84203792a0b254a19391100fbarchard@google.comTEST_F(libyuvTest, ARGBMultiply_Opt) {
14368ec6033478a736f1b84203792a0b254a19391100fbarchard@google.com  int max_diff = TestMultiply(benchmark_width_, benchmark_height_,
14378ec6033478a736f1b84203792a0b254a19391100fbarchard@google.com                              benchmark_iterations_, +1, 0);
14388ec6033478a736f1b84203792a0b254a19391100fbarchard@google.com  EXPECT_LE(max_diff, 1);
14398ec6033478a736f1b84203792a0b254a19391100fbarchard@google.com}
14408ec6033478a736f1b84203792a0b254a19391100fbarchard@google.com
144183e1b17cc0b1840c7b5e361fa19e7263fca2b32bfbarchard@google.comstatic int TestAdd(int width, int height, int benchmark_iterations,
144283e1b17cc0b1840c7b5e361fa19e7263fca2b32bfbarchard@google.com                   int invert, int off) {
14434e0d7cc2c60e8aa85954c48927c6be08ee2b9db4fbarchard@google.com  if (width < 1) {
14444e0d7cc2c60e8aa85954c48927c6be08ee2b9db4fbarchard@google.com    width = 1;
14454e0d7cc2c60e8aa85954c48927c6be08ee2b9db4fbarchard@google.com  }
144683e1b17cc0b1840c7b5e361fa19e7263fca2b32bfbarchard@google.com  const int kBpp = 4;
144783e1b17cc0b1840c7b5e361fa19e7263fca2b32bfbarchard@google.com  const int kStride = (width * kBpp + 15) & ~15;
144883e1b17cc0b1840c7b5e361fa19e7263fca2b32bfbarchard@google.com  align_buffer_64(src_argb_a, kStride * height + off);
144983e1b17cc0b1840c7b5e361fa19e7263fca2b32bfbarchard@google.com  align_buffer_64(src_argb_b, kStride * height + off);
145083e1b17cc0b1840c7b5e361fa19e7263fca2b32bfbarchard@google.com  align_buffer_64(dst_argb_c, kStride * height);
145183e1b17cc0b1840c7b5e361fa19e7263fca2b32bfbarchard@google.com  align_buffer_64(dst_argb_opt, kStride * height);
145283e1b17cc0b1840c7b5e361fa19e7263fca2b32bfbarchard@google.com  srandom(time(NULL));
145383e1b17cc0b1840c7b5e361fa19e7263fca2b32bfbarchard@google.com  for (int i = 0; i < kStride * height; ++i) {
145483e1b17cc0b1840c7b5e361fa19e7263fca2b32bfbarchard@google.com    src_argb_a[i + off] = (random() & 0xff);
145583e1b17cc0b1840c7b5e361fa19e7263fca2b32bfbarchard@google.com    src_argb_b[i + off] = (random() & 0xff);
145683e1b17cc0b1840c7b5e361fa19e7263fca2b32bfbarchard@google.com  }
145783e1b17cc0b1840c7b5e361fa19e7263fca2b32bfbarchard@google.com  memset(dst_argb_c, 0, kStride * height);
145883e1b17cc0b1840c7b5e361fa19e7263fca2b32bfbarchard@google.com  memset(dst_argb_opt, 0, kStride * height);
145983e1b17cc0b1840c7b5e361fa19e7263fca2b32bfbarchard@google.com
146083e1b17cc0b1840c7b5e361fa19e7263fca2b32bfbarchard@google.com  MaskCpuFlags(0);
146183e1b17cc0b1840c7b5e361fa19e7263fca2b32bfbarchard@google.com  ARGBAdd(src_argb_a + off, kStride,
146283e1b17cc0b1840c7b5e361fa19e7263fca2b32bfbarchard@google.com          src_argb_b + off, kStride,
146383e1b17cc0b1840c7b5e361fa19e7263fca2b32bfbarchard@google.com          dst_argb_c, kStride,
146483e1b17cc0b1840c7b5e361fa19e7263fca2b32bfbarchard@google.com          width, invert * height);
146583e1b17cc0b1840c7b5e361fa19e7263fca2b32bfbarchard@google.com  MaskCpuFlags(-1);
146683e1b17cc0b1840c7b5e361fa19e7263fca2b32bfbarchard@google.com  for (int i = 0; i < benchmark_iterations; ++i) {
146783e1b17cc0b1840c7b5e361fa19e7263fca2b32bfbarchard@google.com    ARGBAdd(src_argb_a + off, kStride,
146883e1b17cc0b1840c7b5e361fa19e7263fca2b32bfbarchard@google.com            src_argb_b + off, kStride,
146983e1b17cc0b1840c7b5e361fa19e7263fca2b32bfbarchard@google.com            dst_argb_opt, kStride,
147083e1b17cc0b1840c7b5e361fa19e7263fca2b32bfbarchard@google.com            width, invert * height);
147183e1b17cc0b1840c7b5e361fa19e7263fca2b32bfbarchard@google.com  }
147283e1b17cc0b1840c7b5e361fa19e7263fca2b32bfbarchard@google.com  int max_diff = 0;
147383e1b17cc0b1840c7b5e361fa19e7263fca2b32bfbarchard@google.com  for (int i = 0; i < kStride * height; ++i) {
147483e1b17cc0b1840c7b5e361fa19e7263fca2b32bfbarchard@google.com    int abs_diff =
147583e1b17cc0b1840c7b5e361fa19e7263fca2b32bfbarchard@google.com        abs(static_cast<int>(dst_argb_c[i]) -
147683e1b17cc0b1840c7b5e361fa19e7263fca2b32bfbarchard@google.com            static_cast<int>(dst_argb_opt[i]));
147783e1b17cc0b1840c7b5e361fa19e7263fca2b32bfbarchard@google.com    if (abs_diff > max_diff) {
147883e1b17cc0b1840c7b5e361fa19e7263fca2b32bfbarchard@google.com      max_diff = abs_diff;
147983e1b17cc0b1840c7b5e361fa19e7263fca2b32bfbarchard@google.com    }
148083e1b17cc0b1840c7b5e361fa19e7263fca2b32bfbarchard@google.com  }
1481ae9a1388a71a3154ef7d6f753c8e568c97554fc0fbarchard@google.com  free_aligned_buffer_64(src_argb_a);
1482ae9a1388a71a3154ef7d6f753c8e568c97554fc0fbarchard@google.com  free_aligned_buffer_64(src_argb_b);
1483ae9a1388a71a3154ef7d6f753c8e568c97554fc0fbarchard@google.com  free_aligned_buffer_64(dst_argb_c);
1484ae9a1388a71a3154ef7d6f753c8e568c97554fc0fbarchard@google.com  free_aligned_buffer_64(dst_argb_opt);
148583e1b17cc0b1840c7b5e361fa19e7263fca2b32bfbarchard@google.com  return max_diff;
148683e1b17cc0b1840c7b5e361fa19e7263fca2b32bfbarchard@google.com}
148783e1b17cc0b1840c7b5e361fa19e7263fca2b32bfbarchard@google.com
148883e1b17cc0b1840c7b5e361fa19e7263fca2b32bfbarchard@google.comTEST_F(libyuvTest, ARGBAdd_Any) {
148983e1b17cc0b1840c7b5e361fa19e7263fca2b32bfbarchard@google.com  int max_diff = TestAdd(benchmark_width_ - 1, benchmark_height_,
149083e1b17cc0b1840c7b5e361fa19e7263fca2b32bfbarchard@google.com                         benchmark_iterations_, +1, 0);
149183e1b17cc0b1840c7b5e361fa19e7263fca2b32bfbarchard@google.com  EXPECT_LE(max_diff, 1);
149283e1b17cc0b1840c7b5e361fa19e7263fca2b32bfbarchard@google.com}
149383e1b17cc0b1840c7b5e361fa19e7263fca2b32bfbarchard@google.com
149483e1b17cc0b1840c7b5e361fa19e7263fca2b32bfbarchard@google.comTEST_F(libyuvTest, ARGBAdd_Unaligned) {
149583e1b17cc0b1840c7b5e361fa19e7263fca2b32bfbarchard@google.com  int max_diff = TestAdd(benchmark_width_, benchmark_height_,
149683e1b17cc0b1840c7b5e361fa19e7263fca2b32bfbarchard@google.com                         benchmark_iterations_, +1, 1);
149783e1b17cc0b1840c7b5e361fa19e7263fca2b32bfbarchard@google.com  EXPECT_LE(max_diff, 1);
149883e1b17cc0b1840c7b5e361fa19e7263fca2b32bfbarchard@google.com}
149983e1b17cc0b1840c7b5e361fa19e7263fca2b32bfbarchard@google.com
150083e1b17cc0b1840c7b5e361fa19e7263fca2b32bfbarchard@google.comTEST_F(libyuvTest, ARGBAdd_Invert) {
150183e1b17cc0b1840c7b5e361fa19e7263fca2b32bfbarchard@google.com  int max_diff = TestAdd(benchmark_width_, benchmark_height_,
150283e1b17cc0b1840c7b5e361fa19e7263fca2b32bfbarchard@google.com                         benchmark_iterations_, -1, 0);
150383e1b17cc0b1840c7b5e361fa19e7263fca2b32bfbarchard@google.com  EXPECT_LE(max_diff, 1);
150483e1b17cc0b1840c7b5e361fa19e7263fca2b32bfbarchard@google.com}
150583e1b17cc0b1840c7b5e361fa19e7263fca2b32bfbarchard@google.com
150683e1b17cc0b1840c7b5e361fa19e7263fca2b32bfbarchard@google.comTEST_F(libyuvTest, ARGBAdd_Opt) {
150783e1b17cc0b1840c7b5e361fa19e7263fca2b32bfbarchard@google.com  int max_diff = TestAdd(benchmark_width_, benchmark_height_,
150883e1b17cc0b1840c7b5e361fa19e7263fca2b32bfbarchard@google.com                         benchmark_iterations_, +1, 0);
150983e1b17cc0b1840c7b5e361fa19e7263fca2b32bfbarchard@google.com  EXPECT_LE(max_diff, 1);
151083e1b17cc0b1840c7b5e361fa19e7263fca2b32bfbarchard@google.com}
151183e1b17cc0b1840c7b5e361fa19e7263fca2b32bfbarchard@google.com
1512573a883dd65c94a10422e6e9e0d453e2a5d45227fbarchard@google.comstatic int TestSubtract(int width, int height, int benchmark_iterations,
1513573a883dd65c94a10422e6e9e0d453e2a5d45227fbarchard@google.com                        int invert, int off) {
15144e0d7cc2c60e8aa85954c48927c6be08ee2b9db4fbarchard@google.com  if (width < 1) {
15154e0d7cc2c60e8aa85954c48927c6be08ee2b9db4fbarchard@google.com    width = 1;
15164e0d7cc2c60e8aa85954c48927c6be08ee2b9db4fbarchard@google.com  }
1517573a883dd65c94a10422e6e9e0d453e2a5d45227fbarchard@google.com  const int kBpp = 4;
1518573a883dd65c94a10422e6e9e0d453e2a5d45227fbarchard@google.com  const int kStride = (width * kBpp + 15) & ~15;
1519573a883dd65c94a10422e6e9e0d453e2a5d45227fbarchard@google.com  align_buffer_64(src_argb_a, kStride * height + off);
1520573a883dd65c94a10422e6e9e0d453e2a5d45227fbarchard@google.com  align_buffer_64(src_argb_b, kStride * height + off);
1521573a883dd65c94a10422e6e9e0d453e2a5d45227fbarchard@google.com  align_buffer_64(dst_argb_c, kStride * height);
1522573a883dd65c94a10422e6e9e0d453e2a5d45227fbarchard@google.com  align_buffer_64(dst_argb_opt, kStride * height);
1523573a883dd65c94a10422e6e9e0d453e2a5d45227fbarchard@google.com  srandom(time(NULL));
1524573a883dd65c94a10422e6e9e0d453e2a5d45227fbarchard@google.com  for (int i = 0; i < kStride * height; ++i) {
1525573a883dd65c94a10422e6e9e0d453e2a5d45227fbarchard@google.com    src_argb_a[i + off] = (random() & 0xff);
1526573a883dd65c94a10422e6e9e0d453e2a5d45227fbarchard@google.com    src_argb_b[i + off] = (random() & 0xff);
1527573a883dd65c94a10422e6e9e0d453e2a5d45227fbarchard@google.com  }
1528573a883dd65c94a10422e6e9e0d453e2a5d45227fbarchard@google.com  memset(dst_argb_c, 0, kStride * height);
1529573a883dd65c94a10422e6e9e0d453e2a5d45227fbarchard@google.com  memset(dst_argb_opt, 0, kStride * height);
1530573a883dd65c94a10422e6e9e0d453e2a5d45227fbarchard@google.com
1531573a883dd65c94a10422e6e9e0d453e2a5d45227fbarchard@google.com  MaskCpuFlags(0);
1532573a883dd65c94a10422e6e9e0d453e2a5d45227fbarchard@google.com  ARGBSubtract(src_argb_a + off, kStride,
1533573a883dd65c94a10422e6e9e0d453e2a5d45227fbarchard@google.com               src_argb_b + off, kStride,
1534573a883dd65c94a10422e6e9e0d453e2a5d45227fbarchard@google.com               dst_argb_c, kStride,
1535573a883dd65c94a10422e6e9e0d453e2a5d45227fbarchard@google.com               width, invert * height);
1536573a883dd65c94a10422e6e9e0d453e2a5d45227fbarchard@google.com  MaskCpuFlags(-1);
1537573a883dd65c94a10422e6e9e0d453e2a5d45227fbarchard@google.com  for (int i = 0; i < benchmark_iterations; ++i) {
1538573a883dd65c94a10422e6e9e0d453e2a5d45227fbarchard@google.com    ARGBSubtract(src_argb_a + off, kStride,
1539573a883dd65c94a10422e6e9e0d453e2a5d45227fbarchard@google.com                 src_argb_b + off, kStride,
1540573a883dd65c94a10422e6e9e0d453e2a5d45227fbarchard@google.com                 dst_argb_opt, kStride,
1541573a883dd65c94a10422e6e9e0d453e2a5d45227fbarchard@google.com                 width, invert * height);
1542573a883dd65c94a10422e6e9e0d453e2a5d45227fbarchard@google.com  }
1543573a883dd65c94a10422e6e9e0d453e2a5d45227fbarchard@google.com  int max_diff = 0;
1544573a883dd65c94a10422e6e9e0d453e2a5d45227fbarchard@google.com  for (int i = 0; i < kStride * height; ++i) {
1545573a883dd65c94a10422e6e9e0d453e2a5d45227fbarchard@google.com    int abs_diff =
1546573a883dd65c94a10422e6e9e0d453e2a5d45227fbarchard@google.com        abs(static_cast<int>(dst_argb_c[i]) -
1547573a883dd65c94a10422e6e9e0d453e2a5d45227fbarchard@google.com            static_cast<int>(dst_argb_opt[i]));
1548573a883dd65c94a10422e6e9e0d453e2a5d45227fbarchard@google.com    if (abs_diff > max_diff) {
1549573a883dd65c94a10422e6e9e0d453e2a5d45227fbarchard@google.com      max_diff = abs_diff;
1550573a883dd65c94a10422e6e9e0d453e2a5d45227fbarchard@google.com    }
1551573a883dd65c94a10422e6e9e0d453e2a5d45227fbarchard@google.com  }
1552ae9a1388a71a3154ef7d6f753c8e568c97554fc0fbarchard@google.com  free_aligned_buffer_64(src_argb_a);
1553ae9a1388a71a3154ef7d6f753c8e568c97554fc0fbarchard@google.com  free_aligned_buffer_64(src_argb_b);
1554ae9a1388a71a3154ef7d6f753c8e568c97554fc0fbarchard@google.com  free_aligned_buffer_64(dst_argb_c);
1555ae9a1388a71a3154ef7d6f753c8e568c97554fc0fbarchard@google.com  free_aligned_buffer_64(dst_argb_opt);
1556573a883dd65c94a10422e6e9e0d453e2a5d45227fbarchard@google.com  return max_diff;
1557573a883dd65c94a10422e6e9e0d453e2a5d45227fbarchard@google.com}
1558573a883dd65c94a10422e6e9e0d453e2a5d45227fbarchard@google.com
1559573a883dd65c94a10422e6e9e0d453e2a5d45227fbarchard@google.comTEST_F(libyuvTest, ARGBSubtract_Any) {
1560573a883dd65c94a10422e6e9e0d453e2a5d45227fbarchard@google.com  int max_diff = TestSubtract(benchmark_width_ - 1, benchmark_height_,
1561573a883dd65c94a10422e6e9e0d453e2a5d45227fbarchard@google.com                              benchmark_iterations_, +1, 0);
1562573a883dd65c94a10422e6e9e0d453e2a5d45227fbarchard@google.com  EXPECT_LE(max_diff, 1);
1563573a883dd65c94a10422e6e9e0d453e2a5d45227fbarchard@google.com}
1564573a883dd65c94a10422e6e9e0d453e2a5d45227fbarchard@google.com
1565573a883dd65c94a10422e6e9e0d453e2a5d45227fbarchard@google.comTEST_F(libyuvTest, ARGBSubtract_Unaligned) {
1566573a883dd65c94a10422e6e9e0d453e2a5d45227fbarchard@google.com  int max_diff = TestSubtract(benchmark_width_, benchmark_height_,
1567573a883dd65c94a10422e6e9e0d453e2a5d45227fbarchard@google.com                              benchmark_iterations_, +1, 1);
1568573a883dd65c94a10422e6e9e0d453e2a5d45227fbarchard@google.com  EXPECT_LE(max_diff, 1);
1569573a883dd65c94a10422e6e9e0d453e2a5d45227fbarchard@google.com}
1570573a883dd65c94a10422e6e9e0d453e2a5d45227fbarchard@google.com
1571573a883dd65c94a10422e6e9e0d453e2a5d45227fbarchard@google.comTEST_F(libyuvTest, ARGBSubtract_Invert) {
1572573a883dd65c94a10422e6e9e0d453e2a5d45227fbarchard@google.com  int max_diff = TestSubtract(benchmark_width_, benchmark_height_,
1573573a883dd65c94a10422e6e9e0d453e2a5d45227fbarchard@google.com                              benchmark_iterations_, -1, 0);
1574573a883dd65c94a10422e6e9e0d453e2a5d45227fbarchard@google.com  EXPECT_LE(max_diff, 1);
1575573a883dd65c94a10422e6e9e0d453e2a5d45227fbarchard@google.com}
1576573a883dd65c94a10422e6e9e0d453e2a5d45227fbarchard@google.com
1577573a883dd65c94a10422e6e9e0d453e2a5d45227fbarchard@google.comTEST_F(libyuvTest, ARGBSubtract_Opt) {
1578573a883dd65c94a10422e6e9e0d453e2a5d45227fbarchard@google.com  int max_diff = TestSubtract(benchmark_width_, benchmark_height_,
1579573a883dd65c94a10422e6e9e0d453e2a5d45227fbarchard@google.com                              benchmark_iterations_, +1, 0);
1580573a883dd65c94a10422e6e9e0d453e2a5d45227fbarchard@google.com  EXPECT_LE(max_diff, 1);
1581573a883dd65c94a10422e6e9e0d453e2a5d45227fbarchard@google.com}
1582573a883dd65c94a10422e6e9e0d453e2a5d45227fbarchard@google.com
15831e985bbc1607d52c6295c167de29cb2b736e9244fbarchard@google.comstatic int TestSobel(int width, int height, int benchmark_iterations,
15841e985bbc1607d52c6295c167de29cb2b736e9244fbarchard@google.com                     int invert, int off) {
15854e0d7cc2c60e8aa85954c48927c6be08ee2b9db4fbarchard@google.com  if (width < 1) {
15864e0d7cc2c60e8aa85954c48927c6be08ee2b9db4fbarchard@google.com    width = 1;
15874e0d7cc2c60e8aa85954c48927c6be08ee2b9db4fbarchard@google.com  }
15881e985bbc1607d52c6295c167de29cb2b736e9244fbarchard@google.com  const int kBpp = 4;
15891e985bbc1607d52c6295c167de29cb2b736e9244fbarchard@google.com  const int kStride = (width * kBpp + 15) & ~15;
15901e985bbc1607d52c6295c167de29cb2b736e9244fbarchard@google.com  align_buffer_64(src_argb_a, kStride * height + off);
15911e985bbc1607d52c6295c167de29cb2b736e9244fbarchard@google.com  align_buffer_64(dst_argb_c, kStride * height);
15921e985bbc1607d52c6295c167de29cb2b736e9244fbarchard@google.com  align_buffer_64(dst_argb_opt, kStride * height);
159307c3fe2f6116b66556160957dadfb57423ee9166fbarchard@google.com  memset(src_argb_a, 0, kStride * height + off);
15941e985bbc1607d52c6295c167de29cb2b736e9244fbarchard@google.com  srandom(time(NULL));
15951e985bbc1607d52c6295c167de29cb2b736e9244fbarchard@google.com  for (int i = 0; i < kStride * height; ++i) {
15961e985bbc1607d52c6295c167de29cb2b736e9244fbarchard@google.com    src_argb_a[i + off] = (random() & 0xff);
15971e985bbc1607d52c6295c167de29cb2b736e9244fbarchard@google.com  }
15981e985bbc1607d52c6295c167de29cb2b736e9244fbarchard@google.com  memset(dst_argb_c, 0, kStride * height);
15991e985bbc1607d52c6295c167de29cb2b736e9244fbarchard@google.com  memset(dst_argb_opt, 0, kStride * height);
16001e985bbc1607d52c6295c167de29cb2b736e9244fbarchard@google.com
16011e985bbc1607d52c6295c167de29cb2b736e9244fbarchard@google.com  MaskCpuFlags(0);
16021e985bbc1607d52c6295c167de29cb2b736e9244fbarchard@google.com  ARGBSobel(src_argb_a + off, kStride,
16031e985bbc1607d52c6295c167de29cb2b736e9244fbarchard@google.com            dst_argb_c, kStride,
16041e985bbc1607d52c6295c167de29cb2b736e9244fbarchard@google.com            width, invert * height);
16051e985bbc1607d52c6295c167de29cb2b736e9244fbarchard@google.com  MaskCpuFlags(-1);
16061e985bbc1607d52c6295c167de29cb2b736e9244fbarchard@google.com  for (int i = 0; i < benchmark_iterations; ++i) {
16071e985bbc1607d52c6295c167de29cb2b736e9244fbarchard@google.com    ARGBSobel(src_argb_a + off, kStride,
16081e985bbc1607d52c6295c167de29cb2b736e9244fbarchard@google.com              dst_argb_opt, kStride,
16091e985bbc1607d52c6295c167de29cb2b736e9244fbarchard@google.com              width, invert * height);
16101e985bbc1607d52c6295c167de29cb2b736e9244fbarchard@google.com  }
16111e985bbc1607d52c6295c167de29cb2b736e9244fbarchard@google.com  int max_diff = 0;
16121e985bbc1607d52c6295c167de29cb2b736e9244fbarchard@google.com  for (int i = 0; i < kStride * height; ++i) {
16131e985bbc1607d52c6295c167de29cb2b736e9244fbarchard@google.com    int abs_diff =
16141e985bbc1607d52c6295c167de29cb2b736e9244fbarchard@google.com        abs(static_cast<int>(dst_argb_c[i]) -
16151e985bbc1607d52c6295c167de29cb2b736e9244fbarchard@google.com            static_cast<int>(dst_argb_opt[i]));
16161e985bbc1607d52c6295c167de29cb2b736e9244fbarchard@google.com    if (abs_diff > max_diff) {
16171e985bbc1607d52c6295c167de29cb2b736e9244fbarchard@google.com      max_diff = abs_diff;
16181e985bbc1607d52c6295c167de29cb2b736e9244fbarchard@google.com    }
16191e985bbc1607d52c6295c167de29cb2b736e9244fbarchard@google.com  }
1620ae9a1388a71a3154ef7d6f753c8e568c97554fc0fbarchard@google.com  free_aligned_buffer_64(src_argb_a);
1621ae9a1388a71a3154ef7d6f753c8e568c97554fc0fbarchard@google.com  free_aligned_buffer_64(dst_argb_c);
1622ae9a1388a71a3154ef7d6f753c8e568c97554fc0fbarchard@google.com  free_aligned_buffer_64(dst_argb_opt);
16231e985bbc1607d52c6295c167de29cb2b736e9244fbarchard@google.com  return max_diff;
16241e985bbc1607d52c6295c167de29cb2b736e9244fbarchard@google.com}
16251e985bbc1607d52c6295c167de29cb2b736e9244fbarchard@google.com
1626a927c6fb877cb8a96384db7daf523ce4b69cbc31fbarchard@google.comTEST_F(libyuvTest, ARGBSobel_Any) {
16271e985bbc1607d52c6295c167de29cb2b736e9244fbarchard@google.com  int max_diff = TestSobel(benchmark_width_ - 1, benchmark_height_,
16281e985bbc1607d52c6295c167de29cb2b736e9244fbarchard@google.com                           benchmark_iterations_, +1, 0);
1629e8df16bd7c44e58ea925c51ea82a34144ada3956fbarchard@google.com  EXPECT_EQ(0, max_diff);
16301e985bbc1607d52c6295c167de29cb2b736e9244fbarchard@google.com}
16311e985bbc1607d52c6295c167de29cb2b736e9244fbarchard@google.com
16321e985bbc1607d52c6295c167de29cb2b736e9244fbarchard@google.comTEST_F(libyuvTest, ARGBSobel_Unaligned) {
16331e985bbc1607d52c6295c167de29cb2b736e9244fbarchard@google.com  int max_diff = TestSobel(benchmark_width_, benchmark_height_,
16341e985bbc1607d52c6295c167de29cb2b736e9244fbarchard@google.com                           benchmark_iterations_, +1, 1);
1635e8df16bd7c44e58ea925c51ea82a34144ada3956fbarchard@google.com  EXPECT_EQ(0, max_diff);
16361e985bbc1607d52c6295c167de29cb2b736e9244fbarchard@google.com}
16371e985bbc1607d52c6295c167de29cb2b736e9244fbarchard@google.com
1638a927c6fb877cb8a96384db7daf523ce4b69cbc31fbarchard@google.comTEST_F(libyuvTest, ARGBSobel_Invert) {
16391e985bbc1607d52c6295c167de29cb2b736e9244fbarchard@google.com  int max_diff = TestSobel(benchmark_width_, benchmark_height_,
16401e985bbc1607d52c6295c167de29cb2b736e9244fbarchard@google.com                           benchmark_iterations_, -1, 0);
1641e8df16bd7c44e58ea925c51ea82a34144ada3956fbarchard@google.com  EXPECT_EQ(0, max_diff);
16421e985bbc1607d52c6295c167de29cb2b736e9244fbarchard@google.com}
16431e985bbc1607d52c6295c167de29cb2b736e9244fbarchard@google.com
1644a927c6fb877cb8a96384db7daf523ce4b69cbc31fbarchard@google.comTEST_F(libyuvTest, ARGBSobel_Opt) {
16451e985bbc1607d52c6295c167de29cb2b736e9244fbarchard@google.com  int max_diff = TestSobel(benchmark_width_, benchmark_height_,
16461e985bbc1607d52c6295c167de29cb2b736e9244fbarchard@google.com                           benchmark_iterations_, +1, 0);
1647e8df16bd7c44e58ea925c51ea82a34144ada3956fbarchard@google.com  EXPECT_EQ(0, max_diff);
16481e985bbc1607d52c6295c167de29cb2b736e9244fbarchard@google.com}
16491e985bbc1607d52c6295c167de29cb2b736e9244fbarchard@google.com
16508be4b289c799356d84c68c4eb4b5403285096693fbarchard@google.comstatic int TestSobelToPlane(int width, int height, int benchmark_iterations,
16518be4b289c799356d84c68c4eb4b5403285096693fbarchard@google.com                            int invert, int off) {
16528be4b289c799356d84c68c4eb4b5403285096693fbarchard@google.com  if (width < 1) {
16538be4b289c799356d84c68c4eb4b5403285096693fbarchard@google.com    width = 1;
16548be4b289c799356d84c68c4eb4b5403285096693fbarchard@google.com  }
16558be4b289c799356d84c68c4eb4b5403285096693fbarchard@google.com  const int kSrcBpp = 4;
16568be4b289c799356d84c68c4eb4b5403285096693fbarchard@google.com  const int kDstBpp = 1;
16578be4b289c799356d84c68c4eb4b5403285096693fbarchard@google.com  const int kSrcStride = (width * kSrcBpp + 15) & ~15;
16588be4b289c799356d84c68c4eb4b5403285096693fbarchard@google.com  const int kDstStride = (width * kDstBpp + 15) & ~15;
16598be4b289c799356d84c68c4eb4b5403285096693fbarchard@google.com  align_buffer_64(src_argb_a, kSrcStride * height + off);
16608be4b289c799356d84c68c4eb4b5403285096693fbarchard@google.com  align_buffer_64(dst_argb_c, kDstStride * height);
16618be4b289c799356d84c68c4eb4b5403285096693fbarchard@google.com  align_buffer_64(dst_argb_opt, kDstStride * height);
16628be4b289c799356d84c68c4eb4b5403285096693fbarchard@google.com  memset(src_argb_a, 0, kSrcStride * height + off);
16638be4b289c799356d84c68c4eb4b5403285096693fbarchard@google.com  srandom(time(NULL));
16648be4b289c799356d84c68c4eb4b5403285096693fbarchard@google.com  for (int i = 0; i < kSrcStride * height; ++i) {
16658be4b289c799356d84c68c4eb4b5403285096693fbarchard@google.com    src_argb_a[i + off] = (random() & 0xff);
16668be4b289c799356d84c68c4eb4b5403285096693fbarchard@google.com  }
16678be4b289c799356d84c68c4eb4b5403285096693fbarchard@google.com  memset(dst_argb_c, 0, kDstStride * height);
16688be4b289c799356d84c68c4eb4b5403285096693fbarchard@google.com  memset(dst_argb_opt, 0, kDstStride * height);
16698be4b289c799356d84c68c4eb4b5403285096693fbarchard@google.com
16708be4b289c799356d84c68c4eb4b5403285096693fbarchard@google.com  MaskCpuFlags(0);
16718be4b289c799356d84c68c4eb4b5403285096693fbarchard@google.com  ARGBSobelToPlane(src_argb_a + off, kSrcStride,
16728be4b289c799356d84c68c4eb4b5403285096693fbarchard@google.com                   dst_argb_c, kDstStride,
16738be4b289c799356d84c68c4eb4b5403285096693fbarchard@google.com                   width, invert * height);
16748be4b289c799356d84c68c4eb4b5403285096693fbarchard@google.com  MaskCpuFlags(-1);
16758be4b289c799356d84c68c4eb4b5403285096693fbarchard@google.com  for (int i = 0; i < benchmark_iterations; ++i) {
16768be4b289c799356d84c68c4eb4b5403285096693fbarchard@google.com    ARGBSobelToPlane(src_argb_a + off, kSrcStride,
16778be4b289c799356d84c68c4eb4b5403285096693fbarchard@google.com                     dst_argb_opt, kDstStride,
16788be4b289c799356d84c68c4eb4b5403285096693fbarchard@google.com                     width, invert * height);
16798be4b289c799356d84c68c4eb4b5403285096693fbarchard@google.com  }
16808be4b289c799356d84c68c4eb4b5403285096693fbarchard@google.com  int max_diff = 0;
16818be4b289c799356d84c68c4eb4b5403285096693fbarchard@google.com  for (int i = 0; i < kDstStride * height; ++i) {
16828be4b289c799356d84c68c4eb4b5403285096693fbarchard@google.com    int abs_diff =
16838be4b289c799356d84c68c4eb4b5403285096693fbarchard@google.com        abs(static_cast<int>(dst_argb_c[i]) -
16848be4b289c799356d84c68c4eb4b5403285096693fbarchard@google.com            static_cast<int>(dst_argb_opt[i]));
16858be4b289c799356d84c68c4eb4b5403285096693fbarchard@google.com    if (abs_diff > max_diff) {
16868be4b289c799356d84c68c4eb4b5403285096693fbarchard@google.com      max_diff = abs_diff;
16878be4b289c799356d84c68c4eb4b5403285096693fbarchard@google.com    }
16888be4b289c799356d84c68c4eb4b5403285096693fbarchard@google.com  }
1689ae9a1388a71a3154ef7d6f753c8e568c97554fc0fbarchard@google.com  free_aligned_buffer_64(src_argb_a);
1690ae9a1388a71a3154ef7d6f753c8e568c97554fc0fbarchard@google.com  free_aligned_buffer_64(dst_argb_c);
1691ae9a1388a71a3154ef7d6f753c8e568c97554fc0fbarchard@google.com  free_aligned_buffer_64(dst_argb_opt);
16928be4b289c799356d84c68c4eb4b5403285096693fbarchard@google.com  return max_diff;
16938be4b289c799356d84c68c4eb4b5403285096693fbarchard@google.com}
16948be4b289c799356d84c68c4eb4b5403285096693fbarchard@google.com
16958be4b289c799356d84c68c4eb4b5403285096693fbarchard@google.comTEST_F(libyuvTest, ARGBSobelToPlane_Any) {
16968be4b289c799356d84c68c4eb4b5403285096693fbarchard@google.com  int max_diff = TestSobelToPlane(benchmark_width_ - 1, benchmark_height_,
16978be4b289c799356d84c68c4eb4b5403285096693fbarchard@google.com                                  benchmark_iterations_, +1, 0);
16988be4b289c799356d84c68c4eb4b5403285096693fbarchard@google.com  EXPECT_EQ(0, max_diff);
16998be4b289c799356d84c68c4eb4b5403285096693fbarchard@google.com}
17008be4b289c799356d84c68c4eb4b5403285096693fbarchard@google.com
17018be4b289c799356d84c68c4eb4b5403285096693fbarchard@google.comTEST_F(libyuvTest, ARGBSobelToPlane_Unaligned) {
17028be4b289c799356d84c68c4eb4b5403285096693fbarchard@google.com  int max_diff = TestSobelToPlane(benchmark_width_, benchmark_height_,
17038be4b289c799356d84c68c4eb4b5403285096693fbarchard@google.com                                  benchmark_iterations_, +1, 1);
17048be4b289c799356d84c68c4eb4b5403285096693fbarchard@google.com  EXPECT_EQ(0, max_diff);
17058be4b289c799356d84c68c4eb4b5403285096693fbarchard@google.com}
17068be4b289c799356d84c68c4eb4b5403285096693fbarchard@google.com
17078be4b289c799356d84c68c4eb4b5403285096693fbarchard@google.comTEST_F(libyuvTest, ARGBSobelToPlane_Invert) {
17088be4b289c799356d84c68c4eb4b5403285096693fbarchard@google.com  int max_diff = TestSobelToPlane(benchmark_width_, benchmark_height_,
17098be4b289c799356d84c68c4eb4b5403285096693fbarchard@google.com                                  benchmark_iterations_, -1, 0);
17108be4b289c799356d84c68c4eb4b5403285096693fbarchard@google.com  EXPECT_EQ(0, max_diff);
17118be4b289c799356d84c68c4eb4b5403285096693fbarchard@google.com}
17128be4b289c799356d84c68c4eb4b5403285096693fbarchard@google.com
17138be4b289c799356d84c68c4eb4b5403285096693fbarchard@google.comTEST_F(libyuvTest, ARGBSobelToPlane_Opt) {
17148be4b289c799356d84c68c4eb4b5403285096693fbarchard@google.com  int max_diff = TestSobelToPlane(benchmark_width_, benchmark_height_,
17158be4b289c799356d84c68c4eb4b5403285096693fbarchard@google.com                                  benchmark_iterations_, +1, 0);
17168be4b289c799356d84c68c4eb4b5403285096693fbarchard@google.com  EXPECT_EQ(0, max_diff);
17178be4b289c799356d84c68c4eb4b5403285096693fbarchard@google.com}
17188be4b289c799356d84c68c4eb4b5403285096693fbarchard@google.com
1719610e012d56b1cce420369b82335bd178f7e39397fbarchard@google.comstatic int TestSobelXY(int width, int height, int benchmark_iterations,
1720610e012d56b1cce420369b82335bd178f7e39397fbarchard@google.com                     int invert, int off) {
17214e0d7cc2c60e8aa85954c48927c6be08ee2b9db4fbarchard@google.com  if (width < 1) {
17224e0d7cc2c60e8aa85954c48927c6be08ee2b9db4fbarchard@google.com    width = 1;
17234e0d7cc2c60e8aa85954c48927c6be08ee2b9db4fbarchard@google.com  }
1724610e012d56b1cce420369b82335bd178f7e39397fbarchard@google.com  const int kBpp = 4;
1725610e012d56b1cce420369b82335bd178f7e39397fbarchard@google.com  const int kStride = (width * kBpp + 15) & ~15;
1726610e012d56b1cce420369b82335bd178f7e39397fbarchard@google.com  align_buffer_64(src_argb_a, kStride * height + off);
1727610e012d56b1cce420369b82335bd178f7e39397fbarchard@google.com  align_buffer_64(dst_argb_c, kStride * height);
1728610e012d56b1cce420369b82335bd178f7e39397fbarchard@google.com  align_buffer_64(dst_argb_opt, kStride * height);
172907c3fe2f6116b66556160957dadfb57423ee9166fbarchard@google.com  memset(src_argb_a, 0, kStride * height + off);
1730610e012d56b1cce420369b82335bd178f7e39397fbarchard@google.com  srandom(time(NULL));
1731610e012d56b1cce420369b82335bd178f7e39397fbarchard@google.com  for (int i = 0; i < kStride * height; ++i) {
1732610e012d56b1cce420369b82335bd178f7e39397fbarchard@google.com    src_argb_a[i + off] = (random() & 0xff);
1733610e012d56b1cce420369b82335bd178f7e39397fbarchard@google.com  }
1734610e012d56b1cce420369b82335bd178f7e39397fbarchard@google.com  memset(dst_argb_c, 0, kStride * height);
1735610e012d56b1cce420369b82335bd178f7e39397fbarchard@google.com  memset(dst_argb_opt, 0, kStride * height);
1736610e012d56b1cce420369b82335bd178f7e39397fbarchard@google.com
1737610e012d56b1cce420369b82335bd178f7e39397fbarchard@google.com  MaskCpuFlags(0);
1738610e012d56b1cce420369b82335bd178f7e39397fbarchard@google.com  ARGBSobelXY(src_argb_a + off, kStride,
1739610e012d56b1cce420369b82335bd178f7e39397fbarchard@google.com            dst_argb_c, kStride,
1740610e012d56b1cce420369b82335bd178f7e39397fbarchard@google.com            width, invert * height);
1741610e012d56b1cce420369b82335bd178f7e39397fbarchard@google.com  MaskCpuFlags(-1);
1742610e012d56b1cce420369b82335bd178f7e39397fbarchard@google.com  for (int i = 0; i < benchmark_iterations; ++i) {
1743610e012d56b1cce420369b82335bd178f7e39397fbarchard@google.com    ARGBSobelXY(src_argb_a + off, kStride,
1744610e012d56b1cce420369b82335bd178f7e39397fbarchard@google.com              dst_argb_opt, kStride,
1745610e012d56b1cce420369b82335bd178f7e39397fbarchard@google.com              width, invert * height);
1746610e012d56b1cce420369b82335bd178f7e39397fbarchard@google.com  }
1747610e012d56b1cce420369b82335bd178f7e39397fbarchard@google.com  int max_diff = 0;
1748610e012d56b1cce420369b82335bd178f7e39397fbarchard@google.com  for (int i = 0; i < kStride * height; ++i) {
1749610e012d56b1cce420369b82335bd178f7e39397fbarchard@google.com    int abs_diff =
1750610e012d56b1cce420369b82335bd178f7e39397fbarchard@google.com        abs(static_cast<int>(dst_argb_c[i]) -
1751610e012d56b1cce420369b82335bd178f7e39397fbarchard@google.com            static_cast<int>(dst_argb_opt[i]));
1752610e012d56b1cce420369b82335bd178f7e39397fbarchard@google.com    if (abs_diff > max_diff) {
1753610e012d56b1cce420369b82335bd178f7e39397fbarchard@google.com      max_diff = abs_diff;
1754610e012d56b1cce420369b82335bd178f7e39397fbarchard@google.com    }
1755610e012d56b1cce420369b82335bd178f7e39397fbarchard@google.com  }
1756ae9a1388a71a3154ef7d6f753c8e568c97554fc0fbarchard@google.com  free_aligned_buffer_64(src_argb_a);
1757ae9a1388a71a3154ef7d6f753c8e568c97554fc0fbarchard@google.com  free_aligned_buffer_64(dst_argb_c);
1758ae9a1388a71a3154ef7d6f753c8e568c97554fc0fbarchard@google.com  free_aligned_buffer_64(dst_argb_opt);
1759610e012d56b1cce420369b82335bd178f7e39397fbarchard@google.com  return max_diff;
1760610e012d56b1cce420369b82335bd178f7e39397fbarchard@google.com}
1761610e012d56b1cce420369b82335bd178f7e39397fbarchard@google.com
1762a927c6fb877cb8a96384db7daf523ce4b69cbc31fbarchard@google.comTEST_F(libyuvTest, ARGBSobelXY_Any) {
1763610e012d56b1cce420369b82335bd178f7e39397fbarchard@google.com  int max_diff = TestSobelXY(benchmark_width_ - 1, benchmark_height_,
1764610e012d56b1cce420369b82335bd178f7e39397fbarchard@google.com                             benchmark_iterations_, +1, 0);
1765e8df16bd7c44e58ea925c51ea82a34144ada3956fbarchard@google.com  EXPECT_EQ(0, max_diff);
1766610e012d56b1cce420369b82335bd178f7e39397fbarchard@google.com}
1767610e012d56b1cce420369b82335bd178f7e39397fbarchard@google.com
1768610e012d56b1cce420369b82335bd178f7e39397fbarchard@google.comTEST_F(libyuvTest, ARGBSobelXY_Unaligned) {
1769610e012d56b1cce420369b82335bd178f7e39397fbarchard@google.com  int max_diff = TestSobelXY(benchmark_width_, benchmark_height_,
1770610e012d56b1cce420369b82335bd178f7e39397fbarchard@google.com                             benchmark_iterations_, +1, 1);
1771e8df16bd7c44e58ea925c51ea82a34144ada3956fbarchard@google.com  EXPECT_EQ(0, max_diff);
1772610e012d56b1cce420369b82335bd178f7e39397fbarchard@google.com}
1773610e012d56b1cce420369b82335bd178f7e39397fbarchard@google.com
1774a927c6fb877cb8a96384db7daf523ce4b69cbc31fbarchard@google.comTEST_F(libyuvTest, ARGBSobelXY_Invert) {
1775610e012d56b1cce420369b82335bd178f7e39397fbarchard@google.com  int max_diff = TestSobelXY(benchmark_width_, benchmark_height_,
1776610e012d56b1cce420369b82335bd178f7e39397fbarchard@google.com                             benchmark_iterations_, -1, 0);
1777e8df16bd7c44e58ea925c51ea82a34144ada3956fbarchard@google.com  EXPECT_EQ(0, max_diff);
1778610e012d56b1cce420369b82335bd178f7e39397fbarchard@google.com}
1779610e012d56b1cce420369b82335bd178f7e39397fbarchard@google.com
1780a927c6fb877cb8a96384db7daf523ce4b69cbc31fbarchard@google.comTEST_F(libyuvTest, ARGBSobelXY_Opt) {
1781610e012d56b1cce420369b82335bd178f7e39397fbarchard@google.com  int max_diff = TestSobelXY(benchmark_width_, benchmark_height_,
1782610e012d56b1cce420369b82335bd178f7e39397fbarchard@google.com                             benchmark_iterations_, +1, 0);
1783e8df16bd7c44e58ea925c51ea82a34144ada3956fbarchard@google.com  EXPECT_EQ(0, max_diff);
1784610e012d56b1cce420369b82335bd178f7e39397fbarchard@google.com}
1785610e012d56b1cce420369b82335bd178f7e39397fbarchard@google.com
1786c4a70492c0f2f5b8da259046b951ae0a141bc60efbarchard@google.comstatic int TestBlur(int width, int height, int benchmark_iterations,
1787c4a70492c0f2f5b8da259046b951ae0a141bc60efbarchard@google.com                    int invert, int off, int radius) {
1788c4a70492c0f2f5b8da259046b951ae0a141bc60efbarchard@google.com  if (width < 1) {
1789c4a70492c0f2f5b8da259046b951ae0a141bc60efbarchard@google.com    width = 1;
1790c4a70492c0f2f5b8da259046b951ae0a141bc60efbarchard@google.com  }
1791c4a70492c0f2f5b8da259046b951ae0a141bc60efbarchard@google.com  const int kBpp = 4;
1792c4a70492c0f2f5b8da259046b951ae0a141bc60efbarchard@google.com  const int kStride = (width * kBpp + 15) & ~15;
1793c4a70492c0f2f5b8da259046b951ae0a141bc60efbarchard@google.com  align_buffer_64(src_argb_a, kStride * height + off);
1794c4a70492c0f2f5b8da259046b951ae0a141bc60efbarchard@google.com  align_buffer_64(dst_cumsum, width * height * 16);
1795c4a70492c0f2f5b8da259046b951ae0a141bc60efbarchard@google.com  align_buffer_64(dst_argb_c, kStride * height);
1796c4a70492c0f2f5b8da259046b951ae0a141bc60efbarchard@google.com  align_buffer_64(dst_argb_opt, kStride * height);
1797c4a70492c0f2f5b8da259046b951ae0a141bc60efbarchard@google.com  srandom(time(NULL));
1798c4a70492c0f2f5b8da259046b951ae0a141bc60efbarchard@google.com  for (int i = 0; i < kStride * height; ++i) {
1799c4a70492c0f2f5b8da259046b951ae0a141bc60efbarchard@google.com    src_argb_a[i + off] = (random() & 0xff);
1800c4a70492c0f2f5b8da259046b951ae0a141bc60efbarchard@google.com  }
1801c4a70492c0f2f5b8da259046b951ae0a141bc60efbarchard@google.com  memset(dst_cumsum, 0, width * height * 16);
1802c4a70492c0f2f5b8da259046b951ae0a141bc60efbarchard@google.com  memset(dst_argb_c, 0, kStride * height);
1803c4a70492c0f2f5b8da259046b951ae0a141bc60efbarchard@google.com  memset(dst_argb_opt, 0, kStride * height);
1804c4a70492c0f2f5b8da259046b951ae0a141bc60efbarchard@google.com
1805c4a70492c0f2f5b8da259046b951ae0a141bc60efbarchard@google.com  MaskCpuFlags(0);
1806c4a70492c0f2f5b8da259046b951ae0a141bc60efbarchard@google.com  ARGBBlur(src_argb_a + off, kStride,
1807c4a70492c0f2f5b8da259046b951ae0a141bc60efbarchard@google.com           dst_argb_c, kStride,
1808c4a70492c0f2f5b8da259046b951ae0a141bc60efbarchard@google.com           reinterpret_cast<int32*>(dst_cumsum), width * 4,
1809c4a70492c0f2f5b8da259046b951ae0a141bc60efbarchard@google.com           width, invert * height, radius);
1810c4a70492c0f2f5b8da259046b951ae0a141bc60efbarchard@google.com  MaskCpuFlags(-1);
1811c4a70492c0f2f5b8da259046b951ae0a141bc60efbarchard@google.com  for (int i = 0; i < benchmark_iterations; ++i) {
1812c4a70492c0f2f5b8da259046b951ae0a141bc60efbarchard@google.com    ARGBBlur(src_argb_a + off, kStride,
1813c4a70492c0f2f5b8da259046b951ae0a141bc60efbarchard@google.com             dst_argb_opt, kStride,
1814c4a70492c0f2f5b8da259046b951ae0a141bc60efbarchard@google.com             reinterpret_cast<int32*>(dst_cumsum), width * 4,
1815c4a70492c0f2f5b8da259046b951ae0a141bc60efbarchard@google.com             width, invert * height, radius);
1816c4a70492c0f2f5b8da259046b951ae0a141bc60efbarchard@google.com  }
1817c4a70492c0f2f5b8da259046b951ae0a141bc60efbarchard@google.com  int max_diff = 0;
1818c4a70492c0f2f5b8da259046b951ae0a141bc60efbarchard@google.com  for (int i = 0; i < kStride * height; ++i) {
1819c4a70492c0f2f5b8da259046b951ae0a141bc60efbarchard@google.com    int abs_diff =
1820c4a70492c0f2f5b8da259046b951ae0a141bc60efbarchard@google.com        abs(static_cast<int>(dst_argb_c[i]) -
1821c4a70492c0f2f5b8da259046b951ae0a141bc60efbarchard@google.com            static_cast<int>(dst_argb_opt[i]));
1822c4a70492c0f2f5b8da259046b951ae0a141bc60efbarchard@google.com    if (abs_diff > max_diff) {
1823c4a70492c0f2f5b8da259046b951ae0a141bc60efbarchard@google.com      max_diff = abs_diff;
1824c4a70492c0f2f5b8da259046b951ae0a141bc60efbarchard@google.com    }
1825c4a70492c0f2f5b8da259046b951ae0a141bc60efbarchard@google.com  }
1826ae9a1388a71a3154ef7d6f753c8e568c97554fc0fbarchard@google.com  free_aligned_buffer_64(src_argb_a);
1827ae9a1388a71a3154ef7d6f753c8e568c97554fc0fbarchard@google.com  free_aligned_buffer_64(dst_cumsum);
1828ae9a1388a71a3154ef7d6f753c8e568c97554fc0fbarchard@google.com  free_aligned_buffer_64(dst_argb_c);
1829ae9a1388a71a3154ef7d6f753c8e568c97554fc0fbarchard@google.com  free_aligned_buffer_64(dst_argb_opt);
1830c4a70492c0f2f5b8da259046b951ae0a141bc60efbarchard@google.com  return max_diff;
1831c4a70492c0f2f5b8da259046b951ae0a141bc60efbarchard@google.com}
1832c4a70492c0f2f5b8da259046b951ae0a141bc60efbarchard@google.com
1833ff74e023e12e4d5b63e5c3559046e84f15862104fbarchard@google.comstatic const int kBlurSize = 55;
1834c4a70492c0f2f5b8da259046b951ae0a141bc60efbarchard@google.comTEST_F(libyuvTest, ARGBBlur_Any) {
1835c4a70492c0f2f5b8da259046b951ae0a141bc60efbarchard@google.com  int max_diff = TestBlur(benchmark_width_ - 1, benchmark_height_,
1836c4a70492c0f2f5b8da259046b951ae0a141bc60efbarchard@google.com                          benchmark_iterations_, +1, 0, kBlurSize);
1837c4a70492c0f2f5b8da259046b951ae0a141bc60efbarchard@google.com  EXPECT_LE(max_diff, 1);
1838c4a70492c0f2f5b8da259046b951ae0a141bc60efbarchard@google.com}
1839c4a70492c0f2f5b8da259046b951ae0a141bc60efbarchard@google.com
1840c4a70492c0f2f5b8da259046b951ae0a141bc60efbarchard@google.comTEST_F(libyuvTest, ARGBBlur_Unaligned) {
1841c4a70492c0f2f5b8da259046b951ae0a141bc60efbarchard@google.com  int max_diff = TestBlur(benchmark_width_, benchmark_height_,
1842c4a70492c0f2f5b8da259046b951ae0a141bc60efbarchard@google.com                          benchmark_iterations_, +1, 1, kBlurSize);
1843c4a70492c0f2f5b8da259046b951ae0a141bc60efbarchard@google.com  EXPECT_LE(max_diff, 1);
1844c4a70492c0f2f5b8da259046b951ae0a141bc60efbarchard@google.com}
1845c4a70492c0f2f5b8da259046b951ae0a141bc60efbarchard@google.com
1846c4a70492c0f2f5b8da259046b951ae0a141bc60efbarchard@google.comTEST_F(libyuvTest, ARGBBlur_Invert) {
1847c4a70492c0f2f5b8da259046b951ae0a141bc60efbarchard@google.com  int max_diff = TestBlur(benchmark_width_, benchmark_height_,
1848c4a70492c0f2f5b8da259046b951ae0a141bc60efbarchard@google.com                          benchmark_iterations_, -1, 0, kBlurSize);
1849c4a70492c0f2f5b8da259046b951ae0a141bc60efbarchard@google.com  EXPECT_LE(max_diff, 1);
1850c4a70492c0f2f5b8da259046b951ae0a141bc60efbarchard@google.com}
1851c4a70492c0f2f5b8da259046b951ae0a141bc60efbarchard@google.com
1852c4a70492c0f2f5b8da259046b951ae0a141bc60efbarchard@google.comTEST_F(libyuvTest, ARGBBlur_Opt) {
1853c4a70492c0f2f5b8da259046b951ae0a141bc60efbarchard@google.com  int max_diff = TestBlur(benchmark_width_, benchmark_height_,
1854c4a70492c0f2f5b8da259046b951ae0a141bc60efbarchard@google.com                          benchmark_iterations_, +1, 0, kBlurSize);
1855c4a70492c0f2f5b8da259046b951ae0a141bc60efbarchard@google.com  EXPECT_LE(max_diff, 1);
1856c4a70492c0f2f5b8da259046b951ae0a141bc60efbarchard@google.com}
1857c4a70492c0f2f5b8da259046b951ae0a141bc60efbarchard@google.com
18585daa25f9ba876200b614de72981d93735d41f2c0fbarchard@google.comstatic const int kBlurSmallSize = 5;
18595daa25f9ba876200b614de72981d93735d41f2c0fbarchard@google.comTEST_F(libyuvTest, ARGBBlurSmall_Any) {
18605daa25f9ba876200b614de72981d93735d41f2c0fbarchard@google.com  int max_diff = TestBlur(benchmark_width_ - 1, benchmark_height_,
18615daa25f9ba876200b614de72981d93735d41f2c0fbarchard@google.com                          benchmark_iterations_, +1, 0, kBlurSmallSize);
18625daa25f9ba876200b614de72981d93735d41f2c0fbarchard@google.com  EXPECT_LE(max_diff, 1);
18635daa25f9ba876200b614de72981d93735d41f2c0fbarchard@google.com}
18645daa25f9ba876200b614de72981d93735d41f2c0fbarchard@google.com
18655daa25f9ba876200b614de72981d93735d41f2c0fbarchard@google.comTEST_F(libyuvTest, ARGBBlurSmall_Unaligned) {
18665daa25f9ba876200b614de72981d93735d41f2c0fbarchard@google.com  int max_diff = TestBlur(benchmark_width_, benchmark_height_,
18675daa25f9ba876200b614de72981d93735d41f2c0fbarchard@google.com                          benchmark_iterations_, +1, 1, kBlurSmallSize);
18685daa25f9ba876200b614de72981d93735d41f2c0fbarchard@google.com  EXPECT_LE(max_diff, 1);
18695daa25f9ba876200b614de72981d93735d41f2c0fbarchard@google.com}
18705daa25f9ba876200b614de72981d93735d41f2c0fbarchard@google.com
18715daa25f9ba876200b614de72981d93735d41f2c0fbarchard@google.comTEST_F(libyuvTest, ARGBBlurSmall_Invert) {
18725daa25f9ba876200b614de72981d93735d41f2c0fbarchard@google.com  int max_diff = TestBlur(benchmark_width_, benchmark_height_,
18735daa25f9ba876200b614de72981d93735d41f2c0fbarchard@google.com                          benchmark_iterations_, -1, 0, kBlurSmallSize);
18745daa25f9ba876200b614de72981d93735d41f2c0fbarchard@google.com  EXPECT_LE(max_diff, 1);
18755daa25f9ba876200b614de72981d93735d41f2c0fbarchard@google.com}
18765daa25f9ba876200b614de72981d93735d41f2c0fbarchard@google.com
18775daa25f9ba876200b614de72981d93735d41f2c0fbarchard@google.comTEST_F(libyuvTest, ARGBBlurSmall_Opt) {
18785daa25f9ba876200b614de72981d93735d41f2c0fbarchard@google.com  int max_diff = TestBlur(benchmark_width_, benchmark_height_,
18795daa25f9ba876200b614de72981d93735d41f2c0fbarchard@google.com                          benchmark_iterations_, +1, 0, kBlurSmallSize);
18805daa25f9ba876200b614de72981d93735d41f2c0fbarchard@google.com  EXPECT_LE(max_diff, 1);
18815daa25f9ba876200b614de72981d93735d41f2c0fbarchard@google.com}
18825daa25f9ba876200b614de72981d93735d41f2c0fbarchard@google.com
1883ae0091e3a74603b23c91f417c8ea023cd43e7e9cfbarchard@google.comTEST_F(libyuvTest, TestARGBPolynomial) {
1884ae0091e3a74603b23c91f417c8ea023cd43e7e9cfbarchard@google.com  SIMD_ALIGNED(uint8 orig_pixels[1280][4]);
1885afd1d6b4ec467aef31f4605bc7c6be2b130036fcfbarchard@google.com  SIMD_ALIGNED(uint8 dst_pixels_opt[1280][4]);
1886afd1d6b4ec467aef31f4605bc7c6be2b130036fcfbarchard@google.com  SIMD_ALIGNED(uint8 dst_pixels_c[1280][4]);
18871390aaf69a3c51f6d3756c4e912ed209b9618028fbarchard@google.com  memset(orig_pixels, 0, sizeof(orig_pixels));
1888ae0091e3a74603b23c91f417c8ea023cd43e7e9cfbarchard@google.com
1889c3c06ec328b5ea6c57012d3ca3ca442f22aad681fbarchard@google.com  SIMD_ALIGNED(static const float kWarmifyPolynomial[16]) = {
1890ae0091e3a74603b23c91f417c8ea023cd43e7e9cfbarchard@google.com    0.94230f,  -3.03300f,    -2.92500f,  0.f,  // C0
1891ae0091e3a74603b23c91f417c8ea023cd43e7e9cfbarchard@google.com    0.584500f,  1.112000f,    1.535000f, 1.f,  // C1 x
1892ae0091e3a74603b23c91f417c8ea023cd43e7e9cfbarchard@google.com    0.001313f, -0.002503f,   -0.004496f, 0.f,  // C2 x * x
1893ae0091e3a74603b23c91f417c8ea023cd43e7e9cfbarchard@google.com    0.0f,       0.000006965f, 0.000008781f, 0.f,  // C3 x * x * x
18946da76f3b34e80da2ffebff92d57fd08a93964942fbarchard@google.com  };
1895ae0091e3a74603b23c91f417c8ea023cd43e7e9cfbarchard@google.com
1896ae0091e3a74603b23c91f417c8ea023cd43e7e9cfbarchard@google.com  // Test blue
1897ae0091e3a74603b23c91f417c8ea023cd43e7e9cfbarchard@google.com  orig_pixels[0][0] = 255u;
1898ae0091e3a74603b23c91f417c8ea023cd43e7e9cfbarchard@google.com  orig_pixels[0][1] = 0u;
1899ae0091e3a74603b23c91f417c8ea023cd43e7e9cfbarchard@google.com  orig_pixels[0][2] = 0u;
1900ae0091e3a74603b23c91f417c8ea023cd43e7e9cfbarchard@google.com  orig_pixels[0][3] = 128u;
1901ae0091e3a74603b23c91f417c8ea023cd43e7e9cfbarchard@google.com  // Test green
1902ae0091e3a74603b23c91f417c8ea023cd43e7e9cfbarchard@google.com  orig_pixels[1][0] = 0u;
1903ae0091e3a74603b23c91f417c8ea023cd43e7e9cfbarchard@google.com  orig_pixels[1][1] = 255u;
1904ae0091e3a74603b23c91f417c8ea023cd43e7e9cfbarchard@google.com  orig_pixels[1][2] = 0u;
1905ae0091e3a74603b23c91f417c8ea023cd43e7e9cfbarchard@google.com  orig_pixels[1][3] = 0u;
1906ae0091e3a74603b23c91f417c8ea023cd43e7e9cfbarchard@google.com  // Test red
1907ae0091e3a74603b23c91f417c8ea023cd43e7e9cfbarchard@google.com  orig_pixels[2][0] = 0u;
1908ae0091e3a74603b23c91f417c8ea023cd43e7e9cfbarchard@google.com  orig_pixels[2][1] = 0u;
1909ae0091e3a74603b23c91f417c8ea023cd43e7e9cfbarchard@google.com  orig_pixels[2][2] = 255u;
1910ae0091e3a74603b23c91f417c8ea023cd43e7e9cfbarchard@google.com  orig_pixels[2][3] = 255u;
1911afd1d6b4ec467aef31f4605bc7c6be2b130036fcfbarchard@google.com  // Test white
1912afd1d6b4ec467aef31f4605bc7c6be2b130036fcfbarchard@google.com  orig_pixels[3][0] = 255u;
1913afd1d6b4ec467aef31f4605bc7c6be2b130036fcfbarchard@google.com  orig_pixels[3][1] = 255u;
1914afd1d6b4ec467aef31f4605bc7c6be2b130036fcfbarchard@google.com  orig_pixels[3][2] = 255u;
1915afd1d6b4ec467aef31f4605bc7c6be2b130036fcfbarchard@google.com  orig_pixels[3][3] = 255u;
1916ae0091e3a74603b23c91f417c8ea023cd43e7e9cfbarchard@google.com  // Test color
1917afd1d6b4ec467aef31f4605bc7c6be2b130036fcfbarchard@google.com  orig_pixels[4][0] = 16u;
1918afd1d6b4ec467aef31f4605bc7c6be2b130036fcfbarchard@google.com  orig_pixels[4][1] = 64u;
1919afd1d6b4ec467aef31f4605bc7c6be2b130036fcfbarchard@google.com  orig_pixels[4][2] = 192u;
1920afd1d6b4ec467aef31f4605bc7c6be2b130036fcfbarchard@google.com  orig_pixels[4][3] = 224u;
1921ae0091e3a74603b23c91f417c8ea023cd43e7e9cfbarchard@google.com  // Do 16 to test asm version.
1922afd1d6b4ec467aef31f4605bc7c6be2b130036fcfbarchard@google.com  ARGBPolynomial(&orig_pixels[0][0], 0, &dst_pixels_opt[0][0], 0,
1923ae0091e3a74603b23c91f417c8ea023cd43e7e9cfbarchard@google.com                 &kWarmifyPolynomial[0], 16, 1);
1924afd1d6b4ec467aef31f4605bc7c6be2b130036fcfbarchard@google.com  EXPECT_EQ(235u, dst_pixels_opt[0][0]);
1925afd1d6b4ec467aef31f4605bc7c6be2b130036fcfbarchard@google.com  EXPECT_EQ(0u, dst_pixels_opt[0][1]);
1926afd1d6b4ec467aef31f4605bc7c6be2b130036fcfbarchard@google.com  EXPECT_EQ(0u, dst_pixels_opt[0][2]);
1927afd1d6b4ec467aef31f4605bc7c6be2b130036fcfbarchard@google.com  EXPECT_EQ(128u, dst_pixels_opt[0][3]);
1928afd1d6b4ec467aef31f4605bc7c6be2b130036fcfbarchard@google.com  EXPECT_EQ(0u, dst_pixels_opt[1][0]);
1929afd1d6b4ec467aef31f4605bc7c6be2b130036fcfbarchard@google.com  EXPECT_EQ(233u, dst_pixels_opt[1][1]);
1930afd1d6b4ec467aef31f4605bc7c6be2b130036fcfbarchard@google.com  EXPECT_EQ(0u, dst_pixels_opt[1][2]);
1931afd1d6b4ec467aef31f4605bc7c6be2b130036fcfbarchard@google.com  EXPECT_EQ(0u, dst_pixels_opt[1][3]);
1932afd1d6b4ec467aef31f4605bc7c6be2b130036fcfbarchard@google.com  EXPECT_EQ(0u, dst_pixels_opt[2][0]);
1933afd1d6b4ec467aef31f4605bc7c6be2b130036fcfbarchard@google.com  EXPECT_EQ(0u, dst_pixels_opt[2][1]);
1934afd1d6b4ec467aef31f4605bc7c6be2b130036fcfbarchard@google.com  EXPECT_EQ(241u, dst_pixels_opt[2][2]);
1935afd1d6b4ec467aef31f4605bc7c6be2b130036fcfbarchard@google.com  EXPECT_EQ(255u, dst_pixels_opt[2][3]);
1936afd1d6b4ec467aef31f4605bc7c6be2b130036fcfbarchard@google.com  EXPECT_EQ(235u, dst_pixels_opt[3][0]);
1937afd1d6b4ec467aef31f4605bc7c6be2b130036fcfbarchard@google.com  EXPECT_EQ(233u, dst_pixels_opt[3][1]);
1938afd1d6b4ec467aef31f4605bc7c6be2b130036fcfbarchard@google.com  EXPECT_EQ(241u, dst_pixels_opt[3][2]);
1939afd1d6b4ec467aef31f4605bc7c6be2b130036fcfbarchard@google.com  EXPECT_EQ(255u, dst_pixels_opt[3][3]);
1940afd1d6b4ec467aef31f4605bc7c6be2b130036fcfbarchard@google.com  EXPECT_EQ(10u, dst_pixels_opt[4][0]);
1941afd1d6b4ec467aef31f4605bc7c6be2b130036fcfbarchard@google.com  EXPECT_EQ(59u, dst_pixels_opt[4][1]);
1942afd1d6b4ec467aef31f4605bc7c6be2b130036fcfbarchard@google.com  EXPECT_EQ(188u, dst_pixels_opt[4][2]);
1943afd1d6b4ec467aef31f4605bc7c6be2b130036fcfbarchard@google.com  EXPECT_EQ(224u, dst_pixels_opt[4][3]);
1944ae0091e3a74603b23c91f417c8ea023cd43e7e9cfbarchard@google.com
1945ae0091e3a74603b23c91f417c8ea023cd43e7e9cfbarchard@google.com  for (int i = 0; i < 1280; ++i) {
1946ae0091e3a74603b23c91f417c8ea023cd43e7e9cfbarchard@google.com    orig_pixels[i][0] = i;
1947ae0091e3a74603b23c91f417c8ea023cd43e7e9cfbarchard@google.com    orig_pixels[i][1] = i / 2;
1948ae0091e3a74603b23c91f417c8ea023cd43e7e9cfbarchard@google.com    orig_pixels[i][2] = i / 3;
1949ae0091e3a74603b23c91f417c8ea023cd43e7e9cfbarchard@google.com    orig_pixels[i][3] = i;
1950ae0091e3a74603b23c91f417c8ea023cd43e7e9cfbarchard@google.com  }
1951afd1d6b4ec467aef31f4605bc7c6be2b130036fcfbarchard@google.com
1952afd1d6b4ec467aef31f4605bc7c6be2b130036fcfbarchard@google.com  MaskCpuFlags(0);
1953afd1d6b4ec467aef31f4605bc7c6be2b130036fcfbarchard@google.com  ARGBPolynomial(&orig_pixels[0][0], 0, &dst_pixels_c[0][0], 0,
1954afd1d6b4ec467aef31f4605bc7c6be2b130036fcfbarchard@google.com                 &kWarmifyPolynomial[0], 1280, 1);
1955afd1d6b4ec467aef31f4605bc7c6be2b130036fcfbarchard@google.com  MaskCpuFlags(-1);
1956afd1d6b4ec467aef31f4605bc7c6be2b130036fcfbarchard@google.com
1957ae0091e3a74603b23c91f417c8ea023cd43e7e9cfbarchard@google.com  for (int i = 0; i < benchmark_pixels_div1280_; ++i) {
1958afd1d6b4ec467aef31f4605bc7c6be2b130036fcfbarchard@google.com    ARGBPolynomial(&orig_pixels[0][0], 0, &dst_pixels_opt[0][0], 0,
1959ae0091e3a74603b23c91f417c8ea023cd43e7e9cfbarchard@google.com                   &kWarmifyPolynomial[0], 1280, 1);
1960ae0091e3a74603b23c91f417c8ea023cd43e7e9cfbarchard@google.com  }
1961afd1d6b4ec467aef31f4605bc7c6be2b130036fcfbarchard@google.com
1962afd1d6b4ec467aef31f4605bc7c6be2b130036fcfbarchard@google.com  for (int i = 0; i < 1280; ++i) {
1963afd1d6b4ec467aef31f4605bc7c6be2b130036fcfbarchard@google.com    EXPECT_EQ(dst_pixels_c[i][0], dst_pixels_opt[i][0]);
1964afd1d6b4ec467aef31f4605bc7c6be2b130036fcfbarchard@google.com    EXPECT_EQ(dst_pixels_c[i][1], dst_pixels_opt[i][1]);
1965afd1d6b4ec467aef31f4605bc7c6be2b130036fcfbarchard@google.com    EXPECT_EQ(dst_pixels_c[i][2], dst_pixels_opt[i][2]);
1966afd1d6b4ec467aef31f4605bc7c6be2b130036fcfbarchard@google.com    EXPECT_EQ(dst_pixels_c[i][3], dst_pixels_opt[i][3]);
1967afd1d6b4ec467aef31f4605bc7c6be2b130036fcfbarchard@google.com  }
1968ae0091e3a74603b23c91f417c8ea023cd43e7e9cfbarchard@google.com}
1969ae0091e3a74603b23c91f417c8ea023cd43e7e9cfbarchard@google.com
1970b38b73d88cb63f41d943062aa579fc8c27544689fbarchard@google.comTEST_F(libyuvTest, TestARGBLumaColorTable) {
1971b38b73d88cb63f41d943062aa579fc8c27544689fbarchard@google.com  SIMD_ALIGNED(uint8 orig_pixels[1280][4]);
1972afd1d6b4ec467aef31f4605bc7c6be2b130036fcfbarchard@google.com  SIMD_ALIGNED(uint8 dst_pixels_opt[1280][4]);
1973afd1d6b4ec467aef31f4605bc7c6be2b130036fcfbarchard@google.com  SIMD_ALIGNED(uint8 dst_pixels_c[1280][4]);
19741390aaf69a3c51f6d3756c4e912ed209b9618028fbarchard@google.com  memset(orig_pixels, 0, sizeof(orig_pixels));
1975b38b73d88cb63f41d943062aa579fc8c27544689fbarchard@google.com
1976f6bd6c0ac5f4c053b32ec5518164d8e9c28e2518fbarchard@google.com  align_buffer_64(lumacolortable, 32768);
1977b38b73d88cb63f41d943062aa579fc8c27544689fbarchard@google.com  int v = 0;
1978b38b73d88cb63f41d943062aa579fc8c27544689fbarchard@google.com  for (int i = 0; i < 32768; ++i) {
1979f6bd6c0ac5f4c053b32ec5518164d8e9c28e2518fbarchard@google.com    lumacolortable[i] = v;
1980b38b73d88cb63f41d943062aa579fc8c27544689fbarchard@google.com    v += 3;
1981b38b73d88cb63f41d943062aa579fc8c27544689fbarchard@google.com  }
1982b38b73d88cb63f41d943062aa579fc8c27544689fbarchard@google.com  // Test blue
1983b38b73d88cb63f41d943062aa579fc8c27544689fbarchard@google.com  orig_pixels[0][0] = 255u;
1984b38b73d88cb63f41d943062aa579fc8c27544689fbarchard@google.com  orig_pixels[0][1] = 0u;
1985b38b73d88cb63f41d943062aa579fc8c27544689fbarchard@google.com  orig_pixels[0][2] = 0u;
1986b38b73d88cb63f41d943062aa579fc8c27544689fbarchard@google.com  orig_pixels[0][3] = 128u;
1987b38b73d88cb63f41d943062aa579fc8c27544689fbarchard@google.com  // Test green
1988b38b73d88cb63f41d943062aa579fc8c27544689fbarchard@google.com  orig_pixels[1][0] = 0u;
1989b38b73d88cb63f41d943062aa579fc8c27544689fbarchard@google.com  orig_pixels[1][1] = 255u;
1990b38b73d88cb63f41d943062aa579fc8c27544689fbarchard@google.com  orig_pixels[1][2] = 0u;
1991b38b73d88cb63f41d943062aa579fc8c27544689fbarchard@google.com  orig_pixels[1][3] = 0u;
1992b38b73d88cb63f41d943062aa579fc8c27544689fbarchard@google.com  // Test red
1993b38b73d88cb63f41d943062aa579fc8c27544689fbarchard@google.com  orig_pixels[2][0] = 0u;
1994b38b73d88cb63f41d943062aa579fc8c27544689fbarchard@google.com  orig_pixels[2][1] = 0u;
1995b38b73d88cb63f41d943062aa579fc8c27544689fbarchard@google.com  orig_pixels[2][2] = 255u;
1996b38b73d88cb63f41d943062aa579fc8c27544689fbarchard@google.com  orig_pixels[2][3] = 255u;
1997b38b73d88cb63f41d943062aa579fc8c27544689fbarchard@google.com  // Test color
1998b38b73d88cb63f41d943062aa579fc8c27544689fbarchard@google.com  orig_pixels[3][0] = 16u;
1999b38b73d88cb63f41d943062aa579fc8c27544689fbarchard@google.com  orig_pixels[3][1] = 64u;
2000b38b73d88cb63f41d943062aa579fc8c27544689fbarchard@google.com  orig_pixels[3][2] = 192u;
2001b38b73d88cb63f41d943062aa579fc8c27544689fbarchard@google.com  orig_pixels[3][3] = 224u;
2002b38b73d88cb63f41d943062aa579fc8c27544689fbarchard@google.com  // Do 16 to test asm version.
2003afd1d6b4ec467aef31f4605bc7c6be2b130036fcfbarchard@google.com  ARGBLumaColorTable(&orig_pixels[0][0], 0, &dst_pixels_opt[0][0], 0,
2004f6bd6c0ac5f4c053b32ec5518164d8e9c28e2518fbarchard@google.com                     &lumacolortable[0], 16, 1);
2005afd1d6b4ec467aef31f4605bc7c6be2b130036fcfbarchard@google.com  EXPECT_EQ(253u, dst_pixels_opt[0][0]);
2006afd1d6b4ec467aef31f4605bc7c6be2b130036fcfbarchard@google.com  EXPECT_EQ(0u, dst_pixels_opt[0][1]);
2007afd1d6b4ec467aef31f4605bc7c6be2b130036fcfbarchard@google.com  EXPECT_EQ(0u, dst_pixels_opt[0][2]);
2008afd1d6b4ec467aef31f4605bc7c6be2b130036fcfbarchard@google.com  EXPECT_EQ(128u, dst_pixels_opt[0][3]);
2009afd1d6b4ec467aef31f4605bc7c6be2b130036fcfbarchard@google.com  EXPECT_EQ(0u, dst_pixels_opt[1][0]);
2010afd1d6b4ec467aef31f4605bc7c6be2b130036fcfbarchard@google.com  EXPECT_EQ(253u, dst_pixels_opt[1][1]);
2011afd1d6b4ec467aef31f4605bc7c6be2b130036fcfbarchard@google.com  EXPECT_EQ(0u, dst_pixels_opt[1][2]);
2012afd1d6b4ec467aef31f4605bc7c6be2b130036fcfbarchard@google.com  EXPECT_EQ(0u, dst_pixels_opt[1][3]);
2013afd1d6b4ec467aef31f4605bc7c6be2b130036fcfbarchard@google.com  EXPECT_EQ(0u, dst_pixels_opt[2][0]);
2014afd1d6b4ec467aef31f4605bc7c6be2b130036fcfbarchard@google.com  EXPECT_EQ(0u, dst_pixels_opt[2][1]);
2015afd1d6b4ec467aef31f4605bc7c6be2b130036fcfbarchard@google.com  EXPECT_EQ(253u, dst_pixels_opt[2][2]);
2016afd1d6b4ec467aef31f4605bc7c6be2b130036fcfbarchard@google.com  EXPECT_EQ(255u, dst_pixels_opt[2][3]);
2017afd1d6b4ec467aef31f4605bc7c6be2b130036fcfbarchard@google.com  EXPECT_EQ(48u, dst_pixels_opt[3][0]);
2018afd1d6b4ec467aef31f4605bc7c6be2b130036fcfbarchard@google.com  EXPECT_EQ(192u, dst_pixels_opt[3][1]);
2019afd1d6b4ec467aef31f4605bc7c6be2b130036fcfbarchard@google.com  EXPECT_EQ(64u, dst_pixels_opt[3][2]);
2020afd1d6b4ec467aef31f4605bc7c6be2b130036fcfbarchard@google.com  EXPECT_EQ(224u, dst_pixels_opt[3][3]);
2021b38b73d88cb63f41d943062aa579fc8c27544689fbarchard@google.com
2022b38b73d88cb63f41d943062aa579fc8c27544689fbarchard@google.com  for (int i = 0; i < 1280; ++i) {
2023b38b73d88cb63f41d943062aa579fc8c27544689fbarchard@google.com    orig_pixels[i][0] = i;
2024b38b73d88cb63f41d943062aa579fc8c27544689fbarchard@google.com    orig_pixels[i][1] = i / 2;
2025b38b73d88cb63f41d943062aa579fc8c27544689fbarchard@google.com    orig_pixels[i][2] = i / 3;
2026b38b73d88cb63f41d943062aa579fc8c27544689fbarchard@google.com    orig_pixels[i][3] = i;
2027b38b73d88cb63f41d943062aa579fc8c27544689fbarchard@google.com  }
2028afd1d6b4ec467aef31f4605bc7c6be2b130036fcfbarchard@google.com
2029afd1d6b4ec467aef31f4605bc7c6be2b130036fcfbarchard@google.com  MaskCpuFlags(0);
2030afd1d6b4ec467aef31f4605bc7c6be2b130036fcfbarchard@google.com  ARGBLumaColorTable(&orig_pixels[0][0], 0, &dst_pixels_c[0][0], 0,
2031f6bd6c0ac5f4c053b32ec5518164d8e9c28e2518fbarchard@google.com                     lumacolortable, 1280, 1);
2032afd1d6b4ec467aef31f4605bc7c6be2b130036fcfbarchard@google.com  MaskCpuFlags(-1);
2033afd1d6b4ec467aef31f4605bc7c6be2b130036fcfbarchard@google.com
2034b38b73d88cb63f41d943062aa579fc8c27544689fbarchard@google.com  for (int i = 0; i < benchmark_pixels_div1280_; ++i) {
2035afd1d6b4ec467aef31f4605bc7c6be2b130036fcfbarchard@google.com    ARGBLumaColorTable(&orig_pixels[0][0], 0, &dst_pixels_opt[0][0], 0,
2036f6bd6c0ac5f4c053b32ec5518164d8e9c28e2518fbarchard@google.com                       lumacolortable, 1280, 1);
2037b38b73d88cb63f41d943062aa579fc8c27544689fbarchard@google.com  }
2038afd1d6b4ec467aef31f4605bc7c6be2b130036fcfbarchard@google.com  for (int i = 0; i < 1280; ++i) {
2039afd1d6b4ec467aef31f4605bc7c6be2b130036fcfbarchard@google.com    EXPECT_EQ(dst_pixels_c[i][0], dst_pixels_opt[i][0]);
2040afd1d6b4ec467aef31f4605bc7c6be2b130036fcfbarchard@google.com    EXPECT_EQ(dst_pixels_c[i][1], dst_pixels_opt[i][1]);
2041afd1d6b4ec467aef31f4605bc7c6be2b130036fcfbarchard@google.com    EXPECT_EQ(dst_pixels_c[i][2], dst_pixels_opt[i][2]);
2042afd1d6b4ec467aef31f4605bc7c6be2b130036fcfbarchard@google.com    EXPECT_EQ(dst_pixels_c[i][3], dst_pixels_opt[i][3]);
2043afd1d6b4ec467aef31f4605bc7c6be2b130036fcfbarchard@google.com  }
2044f6bd6c0ac5f4c053b32ec5518164d8e9c28e2518fbarchard@google.com
2045f6bd6c0ac5f4c053b32ec5518164d8e9c28e2518fbarchard@google.com  free_aligned_buffer_64(lumacolortable);
2046b38b73d88cb63f41d943062aa579fc8c27544689fbarchard@google.com}
2047b38b73d88cb63f41d943062aa579fc8c27544689fbarchard@google.com
20487f67961ec53f0ad12f827905fc4a4cc880f00931fbarchard@google.comTEST_F(libyuvTest, TestARGBCopyAlpha) {
20497f67961ec53f0ad12f827905fc4a4cc880f00931fbarchard@google.com  const int kSize = benchmark_width_ * benchmark_height_ * 4;
20507f67961ec53f0ad12f827905fc4a4cc880f00931fbarchard@google.com  align_buffer_64(orig_pixels, kSize);
20517f67961ec53f0ad12f827905fc4a4cc880f00931fbarchard@google.com  align_buffer_64(dst_pixels_opt, kSize);
20527f67961ec53f0ad12f827905fc4a4cc880f00931fbarchard@google.com  align_buffer_64(dst_pixels_c, kSize);
20537f67961ec53f0ad12f827905fc4a4cc880f00931fbarchard@google.com
20547f67961ec53f0ad12f827905fc4a4cc880f00931fbarchard@google.com  MemRandomize(orig_pixels, kSize);
20557f67961ec53f0ad12f827905fc4a4cc880f00931fbarchard@google.com  MemRandomize(dst_pixels_opt, kSize);
20567f67961ec53f0ad12f827905fc4a4cc880f00931fbarchard@google.com  memcpy(dst_pixels_c, dst_pixels_opt, kSize);
20577f67961ec53f0ad12f827905fc4a4cc880f00931fbarchard@google.com
20587f67961ec53f0ad12f827905fc4a4cc880f00931fbarchard@google.com  MaskCpuFlags(0);
20597f67961ec53f0ad12f827905fc4a4cc880f00931fbarchard@google.com  ARGBCopyAlpha(orig_pixels, benchmark_width_ * 4,
20607f67961ec53f0ad12f827905fc4a4cc880f00931fbarchard@google.com                dst_pixels_c, benchmark_width_ * 4,
20617f67961ec53f0ad12f827905fc4a4cc880f00931fbarchard@google.com                benchmark_width_, benchmark_height_);
20627f67961ec53f0ad12f827905fc4a4cc880f00931fbarchard@google.com  MaskCpuFlags(-1);
20637f67961ec53f0ad12f827905fc4a4cc880f00931fbarchard@google.com
20647f67961ec53f0ad12f827905fc4a4cc880f00931fbarchard@google.com  for (int i = 0; i < benchmark_iterations_; ++i) {
20657f67961ec53f0ad12f827905fc4a4cc880f00931fbarchard@google.com    ARGBCopyAlpha(orig_pixels, benchmark_width_ * 4,
20667f67961ec53f0ad12f827905fc4a4cc880f00931fbarchard@google.com                  dst_pixels_opt, benchmark_width_ * 4,
20677f67961ec53f0ad12f827905fc4a4cc880f00931fbarchard@google.com                  benchmark_width_, benchmark_height_);
20687f67961ec53f0ad12f827905fc4a4cc880f00931fbarchard@google.com  }
20697f67961ec53f0ad12f827905fc4a4cc880f00931fbarchard@google.com  for (int i = 0; i < kSize; ++i) {
20707f67961ec53f0ad12f827905fc4a4cc880f00931fbarchard@google.com    EXPECT_EQ(dst_pixels_c[i], dst_pixels_opt[i]);
20717f67961ec53f0ad12f827905fc4a4cc880f00931fbarchard@google.com  }
20727f67961ec53f0ad12f827905fc4a4cc880f00931fbarchard@google.com
2073ae9a1388a71a3154ef7d6f753c8e568c97554fc0fbarchard@google.com  free_aligned_buffer_64(dst_pixels_c);
2074ae9a1388a71a3154ef7d6f753c8e568c97554fc0fbarchard@google.com  free_aligned_buffer_64(dst_pixels_opt);
2075ae9a1388a71a3154ef7d6f753c8e568c97554fc0fbarchard@google.com  free_aligned_buffer_64(orig_pixels);
20767f67961ec53f0ad12f827905fc4a4cc880f00931fbarchard@google.com}
2077ae0091e3a74603b23c91f417c8ea023cd43e7e9cfbarchard@google.com
2078adef267edfb3539cd773692d6fa4050ffd092f55fbarchard@google.comTEST_F(libyuvTest, TestARGBCopyYToAlpha) {
2079adef267edfb3539cd773692d6fa4050ffd092f55fbarchard@google.com  const int kPixels = benchmark_width_ * benchmark_height_;
2080adef267edfb3539cd773692d6fa4050ffd092f55fbarchard@google.com  align_buffer_64(orig_pixels, kPixels);
2081adef267edfb3539cd773692d6fa4050ffd092f55fbarchard@google.com  align_buffer_64(dst_pixels_opt, kPixels * 4);
2082adef267edfb3539cd773692d6fa4050ffd092f55fbarchard@google.com  align_buffer_64(dst_pixels_c, kPixels * 4);
2083adef267edfb3539cd773692d6fa4050ffd092f55fbarchard@google.com
2084adef267edfb3539cd773692d6fa4050ffd092f55fbarchard@google.com  MemRandomize(orig_pixels, kPixels);
2085adef267edfb3539cd773692d6fa4050ffd092f55fbarchard@google.com  MemRandomize(dst_pixels_opt, kPixels * 4);
2086adef267edfb3539cd773692d6fa4050ffd092f55fbarchard@google.com  memcpy(dst_pixels_c, dst_pixels_opt, kPixels * 4);
2087adef267edfb3539cd773692d6fa4050ffd092f55fbarchard@google.com
2088adef267edfb3539cd773692d6fa4050ffd092f55fbarchard@google.com  MaskCpuFlags(0);
2089adef267edfb3539cd773692d6fa4050ffd092f55fbarchard@google.com  ARGBCopyYToAlpha(orig_pixels, benchmark_width_,
2090adef267edfb3539cd773692d6fa4050ffd092f55fbarchard@google.com                   dst_pixels_c, benchmark_width_ * 4,
2091adef267edfb3539cd773692d6fa4050ffd092f55fbarchard@google.com                   benchmark_width_, benchmark_height_);
2092adef267edfb3539cd773692d6fa4050ffd092f55fbarchard@google.com  MaskCpuFlags(-1);
2093adef267edfb3539cd773692d6fa4050ffd092f55fbarchard@google.com
2094adef267edfb3539cd773692d6fa4050ffd092f55fbarchard@google.com  for (int i = 0; i < benchmark_iterations_; ++i) {
2095adef267edfb3539cd773692d6fa4050ffd092f55fbarchard@google.com    ARGBCopyYToAlpha(orig_pixels, benchmark_width_,
2096adef267edfb3539cd773692d6fa4050ffd092f55fbarchard@google.com                     dst_pixels_opt, benchmark_width_ * 4,
2097adef267edfb3539cd773692d6fa4050ffd092f55fbarchard@google.com                     benchmark_width_, benchmark_height_);
2098adef267edfb3539cd773692d6fa4050ffd092f55fbarchard@google.com  }
2099adef267edfb3539cd773692d6fa4050ffd092f55fbarchard@google.com  for (int i = 0; i < kPixels * 4; ++i) {
2100adef267edfb3539cd773692d6fa4050ffd092f55fbarchard@google.com    EXPECT_EQ(dst_pixels_c[i], dst_pixels_opt[i]);
2101adef267edfb3539cd773692d6fa4050ffd092f55fbarchard@google.com  }
2102adef267edfb3539cd773692d6fa4050ffd092f55fbarchard@google.com
2103ae9a1388a71a3154ef7d6f753c8e568c97554fc0fbarchard@google.com  free_aligned_buffer_64(dst_pixels_c);
2104ae9a1388a71a3154ef7d6f753c8e568c97554fc0fbarchard@google.com  free_aligned_buffer_64(dst_pixels_opt);
2105ae9a1388a71a3154ef7d6f753c8e568c97554fc0fbarchard@google.com  free_aligned_buffer_64(orig_pixels);
2106adef267edfb3539cd773692d6fa4050ffd092f55fbarchard@google.com}
2107adef267edfb3539cd773692d6fa4050ffd092f55fbarchard@google.com
2108ffaea7eee38e593a3e63553ffa90e554ba81fe30fbarchard@google.com}  // namespace libyuv
2109