133cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp/*
233cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp *  Copyright 2011 The LibYuv Project Authors. All rights reserved.
333cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp *
433cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp *  Use of this source code is governed by a BSD-style license
533cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp *  that can be found in the LICENSE file in the root of the source
633cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp *  tree. An additional intellectual property rights grant can be found
733cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp *  in the file PATENTS.  All contributing project authors may
833cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp *  be found in the AUTHORS file in the root of the source tree.
933cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp */
1033cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp
1133cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp#include <stdlib.h>
1233cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp#include <time.h>
1333cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp
1433cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp#include "libyuv/cpu_id.h"
1533cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp#include "libyuv/scale_argb.h"
1633cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp#include "../unit_test/unit_test.h"
1733cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp
1833cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkampnamespace libyuv {
1933cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp
2033cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkampstatic int ARGBTestFilter(int src_width, int src_height,
2133cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp                          int dst_width, int dst_height,
2233cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp                          FilterMode f, int benchmark_iterations) {
2333cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  const int b = 128;
2433cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  int src_argb_plane_size = (src_width + b * 2) * (src_height + b * 2) * 4;
2533cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  int src_stride_argb = (b * 2 + src_width) * 4;
2633cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp
2733cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  align_buffer_16(src_argb, src_argb_plane_size)
2833cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  memset(src_argb, 1, src_argb_plane_size);
2933cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp
3033cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  int dst_argb_plane_size = (dst_width + b * 2) * (dst_height + b * 2) * 4;
3133cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  int dst_stride_argb = (b * 2 + dst_width) * 4;
3233cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp
3333cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  srandom(time(NULL));
3433cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp
3533cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  int i, j;
3633cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  for (i = b; i < (src_height + b); ++i) {
3733cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp    for (j = b; j < (src_width + b) * 4; ++j) {
3833cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp      src_argb[(i * src_stride_argb) + j] = (random() & 0xff);
3933cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp    }
4033cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  }
4133cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp
4233cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  align_buffer_16(dst_argb_c, dst_argb_plane_size)
4333cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  align_buffer_16(dst_argb_opt, dst_argb_plane_size)
4433cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  memset(dst_argb_c, 2, dst_argb_plane_size);
4533cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  memset(dst_argb_opt, 3, dst_argb_plane_size);
4633cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp
4733cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  // Warm up both versions for consistent benchmarks.
4833cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  MaskCpuFlags(0);  // Disable all CPU optimization.
4933cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  ARGBScale(src_argb + (src_stride_argb * b) + b * 4, src_stride_argb,
5033cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp            src_width, src_height,
5133cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp            dst_argb_c + (dst_stride_argb * b) + b * 4, dst_stride_argb,
5233cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp            dst_width, dst_height, f);
5333cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  MaskCpuFlags(-1);  // Enable all CPU optimization.
5433cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  ARGBScale(src_argb + (src_stride_argb * b) + b * 4, src_stride_argb,
5533cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp            src_width, src_height,
5633cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp            dst_argb_opt + (dst_stride_argb * b) + b * 4, dst_stride_argb,
5733cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp            dst_width, dst_height, f);
5833cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp
5933cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  MaskCpuFlags(0);  // Disable all CPU optimization.
6033cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  double c_time = get_time();
6133cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  for (i = 0; i < benchmark_iterations; ++i) {
6233cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp    ARGBScale(src_argb + (src_stride_argb * b) + b * 4, src_stride_argb,
6333cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp              src_width, src_height,
6433cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp              dst_argb_c + (dst_stride_argb * b) + b * 4, dst_stride_argb,
6533cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp              dst_width, dst_height, f);
6633cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  }
6733cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  c_time = (get_time() - c_time) / benchmark_iterations;
6833cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp
6933cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  MaskCpuFlags(-1);  // Enable all CPU optimization.
7033cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  double opt_time = get_time();
7133cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  for (i = 0; i < benchmark_iterations; ++i) {
7233cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp    ARGBScale(src_argb + (src_stride_argb * b) + b * 4, src_stride_argb,
7333cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp              src_width, src_height,
7433cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp              dst_argb_opt + (dst_stride_argb * b) + b * 4, dst_stride_argb,
7533cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp              dst_width, dst_height, f);
7633cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  }
7733cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  opt_time = (get_time() - opt_time) / benchmark_iterations;
7833cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp
7933cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  // Report performance of C vs OPT
8033cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  printf("filter %d - %8d us C - %8d us OPT\n",
8133cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp         f, static_cast<int>(c_time*1e6), static_cast<int>(opt_time*1e6));
8233cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp
8333cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  // C version may be a little off from the optimized. Order of
8433cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  //  operations may introduce rounding somewhere. So do a difference
8533cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  //  of the buffers and look to see that the max difference isn't
8633cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  //  over 2.
8733cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  int max_diff = 0;
8833cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  for (i = b; i < (dst_height + b); ++i) {
8933cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp    for (j = b * 4; j < (dst_width + b) * 4; ++j) {
9033cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp      int abs_diff = abs(dst_argb_c[(i * dst_stride_argb) + j] -
9133cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp                         dst_argb_opt[(i * dst_stride_argb) + j]);
9233cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp      if (abs_diff > max_diff) {
9333cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp        max_diff = abs_diff;
9433cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp      }
9533cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp    }
9633cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  }
9733cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp
9833cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  free_aligned_buffer_16(dst_argb_c)
9933cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  free_aligned_buffer_16(dst_argb_opt)
10033cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  free_aligned_buffer_16(src_argb)
10133cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  return max_diff;
10233cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp}
10333cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp
10433cfdeb7b267ab635413797fffb046b73272f7ecHendrik DahlkampTEST_F(libyuvTest, ARGBScaleDownBy2) {
10533cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  const int src_width = 1280;
10633cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  const int src_height = 720;
10733cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  const int dst_width = src_width / 2;
10833cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  const int dst_height = src_height / 2;
10933cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp
11033cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  for (int f = 0; f < 2; ++f) {
11133cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp    int max_diff = ARGBTestFilter(src_width, src_height,
11233cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp                                  dst_width, dst_height,
11333cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp                                  static_cast<FilterMode>(f),
11433cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp                                  benchmark_iterations_);
11533cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp    EXPECT_LE(max_diff, 1);
11633cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  }
11733cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp}
11833cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp
11933cfdeb7b267ab635413797fffb046b73272f7ecHendrik DahlkampTEST_F(libyuvTest, ARGBScaleDownBy4) {
12033cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  const int src_width = 1280;
12133cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  const int src_height = 720;
12233cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  const int dst_width = src_width / 4;
12333cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  const int dst_height = src_height / 4;
12433cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp
12533cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  for (int f = 0; f < 2; ++f) {
12633cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp    int max_diff = ARGBTestFilter(src_width, src_height,
12733cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp                                  dst_width, dst_height,
12833cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp                                  static_cast<FilterMode>(f),
12933cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp                                  benchmark_iterations_);
13033cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp    EXPECT_LE(max_diff, 1);
13133cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  }
13233cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp}
13333cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp
13433cfdeb7b267ab635413797fffb046b73272f7ecHendrik DahlkampTEST_F(libyuvTest, ARGBScaleDownBy5) {
13533cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  const int src_width = 1280;
13633cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  const int src_height = 720;
13733cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  const int dst_width = src_width / 5;
13833cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  const int dst_height = src_height / 5;
13933cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp
14033cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  for (int f = 0; f < 2; ++f) {
14133cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp    int max_diff = ARGBTestFilter(src_width, src_height,
14233cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp                                  dst_width, dst_height,
14333cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp                                  static_cast<FilterMode>(f),
14433cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp                                  benchmark_iterations_);
14533cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp    EXPECT_LE(max_diff, 1);
14633cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  }
14733cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp}
14833cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp
14933cfdeb7b267ab635413797fffb046b73272f7ecHendrik DahlkampTEST_F(libyuvTest, ARGBScaleDownBy8) {
15033cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  const int src_width = 1280;
15133cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  const int src_height = 720;
15233cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  const int dst_width = src_width / 8;
15333cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  const int dst_height = src_height / 8;
15433cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp
15533cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  for (int f = 0; f < 2; ++f) {
15633cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp    int max_diff = ARGBTestFilter(src_width, src_height,
15733cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp                                  dst_width, dst_height,
15833cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp                                  static_cast<FilterMode>(f),
15933cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp                                  benchmark_iterations_);
16033cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp    EXPECT_LE(max_diff, 1);
16133cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  }
16233cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp}
16333cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp
16433cfdeb7b267ab635413797fffb046b73272f7ecHendrik DahlkampTEST_F(libyuvTest, ARGBScaleDownBy16) {
16533cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  const int src_width = 1280;
16633cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  const int src_height = 720;
16733cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  const int dst_width = src_width / 16;
16833cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  const int dst_height = src_height / 16;
16933cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp
17033cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  for (int f = 0; f < 2; ++f) {
17133cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp    int max_diff = ARGBTestFilter(src_width, src_height,
17233cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp                                  dst_width, dst_height,
17333cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp                                  static_cast<FilterMode>(f),
17433cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp                                  benchmark_iterations_);
17533cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp    EXPECT_LE(max_diff, 1);
17633cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  }
17733cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp}
17833cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp
17933cfdeb7b267ab635413797fffb046b73272f7ecHendrik DahlkampTEST_F(libyuvTest, ARGBScaleDownBy34) {
18033cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  const int src_width = 1280;
18133cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  const int src_height = 720;
18233cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  const int dst_width = src_width * 3 / 4;
18333cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  const int dst_height = src_height * 3 / 4;
18433cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp
18533cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  for (int f = 0; f < 2; ++f) {
18633cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp    int max_diff = ARGBTestFilter(src_width, src_height,
18733cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp                                  dst_width, dst_height,
18833cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp                                  static_cast<FilterMode>(f),
18933cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp                                  benchmark_iterations_);
19033cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp    EXPECT_LE(max_diff, 1);
19133cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  }
19233cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp}
19333cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp
19433cfdeb7b267ab635413797fffb046b73272f7ecHendrik DahlkampTEST_F(libyuvTest, ARGBScaleDownBy38) {
19533cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  int src_width = 1280;
19633cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  int src_height = 720;
19733cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  int dst_width = src_width * 3 / 8;
19833cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  int dst_height = src_height * 3 / 8;
19933cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp
20033cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  for (int f = 0; f < 2; ++f) {
20133cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp    int max_diff = ARGBTestFilter(src_width, src_height,
20233cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp                                  dst_width, dst_height,
20333cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp                                  static_cast<FilterMode>(f),
20433cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp                                  benchmark_iterations_);
20533cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp    EXPECT_LE(max_diff, 1);
20633cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  }
20733cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp}
20833cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp
20933cfdeb7b267ab635413797fffb046b73272f7ecHendrik DahlkampTEST_F(libyuvTest, ARGBScaleTo1366) {
21033cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  int src_width = 1280;
21133cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  int src_height = 720;
21233cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  int dst_width = 1366;
21333cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  int dst_height = 768;
21433cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp
21533cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  for (int f = 0; f < 2; ++f) {
21633cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp    int max_diff = ARGBTestFilter(src_width, src_height,
21733cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp                                  dst_width, dst_height,
21833cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp                                  static_cast<FilterMode>(f),
21933cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp                                  benchmark_iterations_);
22033cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp    EXPECT_LE(max_diff, 1);
22133cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  }
22233cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp}
22333cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp
22433cfdeb7b267ab635413797fffb046b73272f7ecHendrik DahlkampTEST_F(libyuvTest, ARGBScaleTo4074) {
22533cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  int src_width = 2880 * 2;
22633cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  int src_height = 1800;
22733cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  int dst_width = 4074;
22833cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  int dst_height = 1272;
22933cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp
23033cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  for (int f = 0; f < 2; ++f) {
23133cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp    int max_diff = ARGBTestFilter(src_width, src_height,
23233cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp                                  dst_width, dst_height,
23333cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp                                  static_cast<FilterMode>(f),
23433cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp                                  benchmark_iterations_);
23533cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp    EXPECT_LE(max_diff, 1);
23633cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  }
23733cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp}
23833cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp
23933cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp
24033cfdeb7b267ab635413797fffb046b73272f7ecHendrik DahlkampTEST_F(libyuvTest, ARGBScaleTo853) {
24133cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  int src_width = 1280;
24233cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  int src_height = 720;
24333cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  int dst_width = 853;
24433cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  int dst_height = 480;
24533cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp
24633cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  for (int f = 0; f < 2; ++f) {
24733cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp    int max_diff = ARGBTestFilter(src_width, src_height,
24833cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp                                  dst_width, dst_height,
24933cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp                                  static_cast<FilterMode>(f),
25033cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp                                  benchmark_iterations_);
25133cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp    EXPECT_LE(max_diff, 1);
25233cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  }
25333cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp}
25433cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp
25533cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp}  // namespace libyuv
256