1ed6edcab8bb0ff24e774bc5aba50351b44776ddefrkoenig@google.com/*
2a14b5cdfb3f2238142884bc456f830a7ed69ecd2fbarchard@google.com *  Copyright 2012 The LibYuv Project Authors. All rights reserved.
3ed6edcab8bb0ff24e774bc5aba50351b44776ddefrkoenig@google.com *
4ed6edcab8bb0ff24e774bc5aba50351b44776ddefrkoenig@google.com *  Use of this source code is governed by a BSD-style license
5ed6edcab8bb0ff24e774bc5aba50351b44776ddefrkoenig@google.com *  that can be found in the LICENSE file in the root of the source
6ed6edcab8bb0ff24e774bc5aba50351b44776ddefrkoenig@google.com *  tree. An additional intellectual property rights grant can be found
7cde587092fef0dbed2c35602f30b79e7b892e766fbarchard@google.com *  in the file PATENTS. All contributing project authors may
8ed6edcab8bb0ff24e774bc5aba50351b44776ddefrkoenig@google.com *  be found in the AUTHORS file in the root of the source tree.
9ed6edcab8bb0ff24e774bc5aba50351b44776ddefrkoenig@google.com */
10ed6edcab8bb0ff24e774bc5aba50351b44776ddefrkoenig@google.com
11ed6edcab8bb0ff24e774bc5aba50351b44776ddefrkoenig@google.com#include <stdlib.h>
123de12ae1c6e162f469c1d384430e2bf8dea32f6ffrkoenig@google.com#include <time.h>
13ed6edcab8bb0ff24e774bc5aba50351b44776ddefrkoenig@google.com
14a14b5cdfb3f2238142884bc456f830a7ed69ecd2fbarchard@google.com#include "libyuv/cpu_id.h"
15810cd91079505f04cfec7481b51d04f08250d982fbarchard@google.com#include "libyuv/rotate.h"
16ae9a1388a71a3154ef7d6f753c8e568c97554fc0fbarchard@google.com#include "libyuv/row.h"
177781d943b039f9143ab41cdba01dba1e8929161bfbarchard@google.com#include "../unit_test/unit_test.h"
18c82af4a59ce299da67084916317266a33c2868e1frkoenig@google.com
191b06484b4aeb06ce45759ea9928fe84981680ac9mikhal@webrtc.orgnamespace libyuv {
20ed6edcab8bb0ff24e774bc5aba50351b44776ddefrkoenig@google.com
21a14b5cdfb3f2238142884bc456f830a7ed69ecd2fbarchard@google.comstatic void I420TestRotate(int src_width, int src_height,
22a14b5cdfb3f2238142884bc456f830a7ed69ecd2fbarchard@google.com                           int dst_width, int dst_height,
23a14b5cdfb3f2238142884bc456f830a7ed69ecd2fbarchard@google.com                           libyuv::RotationMode mode,
24a14b5cdfb3f2238142884bc456f830a7ed69ecd2fbarchard@google.com                           int benchmark_iterations) {
25a14b5cdfb3f2238142884bc456f830a7ed69ecd2fbarchard@google.com  if (src_width < 1) {
26a14b5cdfb3f2238142884bc456f830a7ed69ecd2fbarchard@google.com    src_width = 1;
27ed6edcab8bb0ff24e774bc5aba50351b44776ddefrkoenig@google.com  }
28a14b5cdfb3f2238142884bc456f830a7ed69ecd2fbarchard@google.com  if (src_height < 1) {
29a14b5cdfb3f2238142884bc456f830a7ed69ecd2fbarchard@google.com    src_height = 1;
30bd4fcb987773ae47b6b49ef4b657c054ea511bfffbarchard@google.com  }
31a14b5cdfb3f2238142884bc456f830a7ed69ecd2fbarchard@google.com  if (dst_width < 1) {
32a14b5cdfb3f2238142884bc456f830a7ed69ecd2fbarchard@google.com    dst_width = 1;
33e3230e4a93a86b0a1e98a3cf5782c97f13488b70fbarchard@google.com  }
34a14b5cdfb3f2238142884bc456f830a7ed69ecd2fbarchard@google.com  if (dst_height < 1) {
35a14b5cdfb3f2238142884bc456f830a7ed69ecd2fbarchard@google.com    dst_height = 1;
36bd4fcb987773ae47b6b49ef4b657c054ea511bfffbarchard@google.com  }
37a14b5cdfb3f2238142884bc456f830a7ed69ecd2fbarchard@google.com  int src_i420_y_size = src_width * src_height;
38a14b5cdfb3f2238142884bc456f830a7ed69ecd2fbarchard@google.com  int src_i420_uv_size = ((src_width + 1) / 2) * ((src_height + 1) / 2);
39a14b5cdfb3f2238142884bc456f830a7ed69ecd2fbarchard@google.com  int src_i420_size = src_i420_y_size + src_i420_uv_size * 2;
40ae9a1388a71a3154ef7d6f753c8e568c97554fc0fbarchard@google.com  align_buffer_64(src_i420, src_i420_size);
41a14b5cdfb3f2238142884bc456f830a7ed69ecd2fbarchard@google.com  for (int i = 0; i < src_i420_size; ++i) {
42a14b5cdfb3f2238142884bc456f830a7ed69ecd2fbarchard@google.com    src_i420[i] = random() & 0xff;
437781d943b039f9143ab41cdba01dba1e8929161bfbarchard@google.com  }
44ed6edcab8bb0ff24e774bc5aba50351b44776ddefrkoenig@google.com
45a14b5cdfb3f2238142884bc456f830a7ed69ecd2fbarchard@google.com  int dst_i420_y_size = dst_width * dst_height;
46a14b5cdfb3f2238142884bc456f830a7ed69ecd2fbarchard@google.com  int dst_i420_uv_size = ((dst_width + 1) / 2) * ((dst_height + 1) / 2);
47a14b5cdfb3f2238142884bc456f830a7ed69ecd2fbarchard@google.com  int dst_i420_size = dst_i420_y_size + dst_i420_uv_size * 2;
48ae9a1388a71a3154ef7d6f753c8e568c97554fc0fbarchard@google.com  align_buffer_64(dst_i420_c, dst_i420_size);
49ae9a1388a71a3154ef7d6f753c8e568c97554fc0fbarchard@google.com  align_buffer_64(dst_i420_opt, dst_i420_size);
50a14b5cdfb3f2238142884bc456f830a7ed69ecd2fbarchard@google.com  memset(dst_i420_c, 2, dst_i420_size);
51a14b5cdfb3f2238142884bc456f830a7ed69ecd2fbarchard@google.com  memset(dst_i420_opt, 3, dst_i420_size);
52bd4fcb987773ae47b6b49ef4b657c054ea511bfffbarchard@google.com
53a14b5cdfb3f2238142884bc456f830a7ed69ecd2fbarchard@google.com  MaskCpuFlags(0);  // Disable all CPU optimization.
54a14b5cdfb3f2238142884bc456f830a7ed69ecd2fbarchard@google.com  I420Rotate(src_i420, src_width,
55a14b5cdfb3f2238142884bc456f830a7ed69ecd2fbarchard@google.com             src_i420 + src_i420_y_size, (src_width + 1) / 2,
56a14b5cdfb3f2238142884bc456f830a7ed69ecd2fbarchard@google.com             src_i420 + src_i420_y_size + src_i420_uv_size, (src_width + 1) / 2,
57a14b5cdfb3f2238142884bc456f830a7ed69ecd2fbarchard@google.com             dst_i420_c, dst_width,
58a14b5cdfb3f2238142884bc456f830a7ed69ecd2fbarchard@google.com             dst_i420_c + dst_i420_y_size, (dst_width + 1) / 2,
59a14b5cdfb3f2238142884bc456f830a7ed69ecd2fbarchard@google.com             dst_i420_c + dst_i420_y_size + dst_i420_uv_size,
60a14b5cdfb3f2238142884bc456f830a7ed69ecd2fbarchard@google.com               (dst_width + 1) / 2,
61a14b5cdfb3f2238142884bc456f830a7ed69ecd2fbarchard@google.com             src_width, src_height, mode);
62bd4fcb987773ae47b6b49ef4b657c054ea511bfffbarchard@google.com
63a14b5cdfb3f2238142884bc456f830a7ed69ecd2fbarchard@google.com  MaskCpuFlags(-1);  // Enable all CPU optimization.
64a14b5cdfb3f2238142884bc456f830a7ed69ecd2fbarchard@google.com  for (int i = 0; i < benchmark_iterations; ++i) {
65a14b5cdfb3f2238142884bc456f830a7ed69ecd2fbarchard@google.com    I420Rotate(src_i420, src_width,
66a14b5cdfb3f2238142884bc456f830a7ed69ecd2fbarchard@google.com               src_i420 + src_i420_y_size, (src_width + 1) / 2,
67a14b5cdfb3f2238142884bc456f830a7ed69ecd2fbarchard@google.com               src_i420 + src_i420_y_size + src_i420_uv_size,
68a14b5cdfb3f2238142884bc456f830a7ed69ecd2fbarchard@google.com                 (src_width + 1) / 2,
69a14b5cdfb3f2238142884bc456f830a7ed69ecd2fbarchard@google.com               dst_i420_opt, dst_width,
70a14b5cdfb3f2238142884bc456f830a7ed69ecd2fbarchard@google.com               dst_i420_opt + dst_i420_y_size, (dst_width + 1) / 2,
71a14b5cdfb3f2238142884bc456f830a7ed69ecd2fbarchard@google.com               dst_i420_opt + dst_i420_y_size + dst_i420_uv_size,
72a14b5cdfb3f2238142884bc456f830a7ed69ecd2fbarchard@google.com                 (dst_width + 1) / 2,
73a14b5cdfb3f2238142884bc456f830a7ed69ecd2fbarchard@google.com               src_width, src_height, mode);
747781d943b039f9143ab41cdba01dba1e8929161bfbarchard@google.com  }
753de12ae1c6e162f469c1d384430e2bf8dea32f6ffrkoenig@google.com
76a14b5cdfb3f2238142884bc456f830a7ed69ecd2fbarchard@google.com  // Rotation should be exact.
77a14b5cdfb3f2238142884bc456f830a7ed69ecd2fbarchard@google.com  for (int i = 0; i < dst_i420_size; ++i) {
78a14b5cdfb3f2238142884bc456f830a7ed69ecd2fbarchard@google.com    EXPECT_EQ(dst_i420_c[i], dst_i420_opt[i]);
79bd4fcb987773ae47b6b49ef4b657c054ea511bfffbarchard@google.com  }
80bd4fcb987773ae47b6b49ef4b657c054ea511bfffbarchard@google.com
81ae9a1388a71a3154ef7d6f753c8e568c97554fc0fbarchard@google.com  free_aligned_buffer_64(dst_i420_c);
82ae9a1388a71a3154ef7d6f753c8e568c97554fc0fbarchard@google.com  free_aligned_buffer_64(dst_i420_opt);
83ae9a1388a71a3154ef7d6f753c8e568c97554fc0fbarchard@google.com  free_aligned_buffer_64(src_i420);
843de12ae1c6e162f469c1d384430e2bf8dea32f6ffrkoenig@google.com}
853de12ae1c6e162f469c1d384430e2bf8dea32f6ffrkoenig@google.com
86a14b5cdfb3f2238142884bc456f830a7ed69ecd2fbarchard@google.comTEST_F(libyuvTest, I420Rotate0) {
87a14b5cdfb3f2238142884bc456f830a7ed69ecd2fbarchard@google.com  I420TestRotate(benchmark_width_, benchmark_height_,
88a14b5cdfb3f2238142884bc456f830a7ed69ecd2fbarchard@google.com                 benchmark_width_, benchmark_height_,
89a14b5cdfb3f2238142884bc456f830a7ed69ecd2fbarchard@google.com                 kRotate0, benchmark_iterations_);
90ed6edcab8bb0ff24e774bc5aba50351b44776ddefrkoenig@google.com}
91ed6edcab8bb0ff24e774bc5aba50351b44776ddefrkoenig@google.com
92a14b5cdfb3f2238142884bc456f830a7ed69ecd2fbarchard@google.comTEST_F(libyuvTest, I420Rotate90) {
93a14b5cdfb3f2238142884bc456f830a7ed69ecd2fbarchard@google.com  I420TestRotate(benchmark_width_, benchmark_height_,
94a14b5cdfb3f2238142884bc456f830a7ed69ecd2fbarchard@google.com                 benchmark_height_, benchmark_width_,
95a14b5cdfb3f2238142884bc456f830a7ed69ecd2fbarchard@google.com                 kRotate90, benchmark_iterations_);
96ed6edcab8bb0ff24e774bc5aba50351b44776ddefrkoenig@google.com}
97ed6edcab8bb0ff24e774bc5aba50351b44776ddefrkoenig@google.com
98a14b5cdfb3f2238142884bc456f830a7ed69ecd2fbarchard@google.comTEST_F(libyuvTest, I420Rotate180) {
99a14b5cdfb3f2238142884bc456f830a7ed69ecd2fbarchard@google.com  I420TestRotate(benchmark_width_, benchmark_height_,
100a14b5cdfb3f2238142884bc456f830a7ed69ecd2fbarchard@google.com                 benchmark_width_, benchmark_height_,
101a14b5cdfb3f2238142884bc456f830a7ed69ecd2fbarchard@google.com                 kRotate180, benchmark_iterations_);
102ed6edcab8bb0ff24e774bc5aba50351b44776ddefrkoenig@google.com}
103ed6edcab8bb0ff24e774bc5aba50351b44776ddefrkoenig@google.com
104a14b5cdfb3f2238142884bc456f830a7ed69ecd2fbarchard@google.comTEST_F(libyuvTest, I420Rotate270) {
105a14b5cdfb3f2238142884bc456f830a7ed69ecd2fbarchard@google.com  I420TestRotate(benchmark_width_, benchmark_height_,
106a14b5cdfb3f2238142884bc456f830a7ed69ecd2fbarchard@google.com                 benchmark_height_, benchmark_width_,
107a14b5cdfb3f2238142884bc456f830a7ed69ecd2fbarchard@google.com                 kRotate270, benchmark_iterations_);
108ed6edcab8bb0ff24e774bc5aba50351b44776ddefrkoenig@google.com}
109ed6edcab8bb0ff24e774bc5aba50351b44776ddefrkoenig@google.com
110a14b5cdfb3f2238142884bc456f830a7ed69ecd2fbarchard@google.comTEST_F(libyuvTest, I420Rotate0_Odd) {
111a14b5cdfb3f2238142884bc456f830a7ed69ecd2fbarchard@google.com  I420TestRotate(benchmark_width_ - 3, benchmark_height_ - 1,
112a14b5cdfb3f2238142884bc456f830a7ed69ecd2fbarchard@google.com                 benchmark_width_ - 3, benchmark_height_ - 1,
113a14b5cdfb3f2238142884bc456f830a7ed69ecd2fbarchard@google.com                 kRotate0, benchmark_iterations_);
114bd4fcb987773ae47b6b49ef4b657c054ea511bfffbarchard@google.com}
115ed6edcab8bb0ff24e774bc5aba50351b44776ddefrkoenig@google.com
116a14b5cdfb3f2238142884bc456f830a7ed69ecd2fbarchard@google.comTEST_F(libyuvTest, I420Rotate90_Odd) {
117a14b5cdfb3f2238142884bc456f830a7ed69ecd2fbarchard@google.com  I420TestRotate(benchmark_width_ - 3, benchmark_height_ - 1,
118a14b5cdfb3f2238142884bc456f830a7ed69ecd2fbarchard@google.com                 benchmark_height_ - 1, benchmark_width_ - 3,
119a14b5cdfb3f2238142884bc456f830a7ed69ecd2fbarchard@google.com                 kRotate90, benchmark_iterations_);
120ed6edcab8bb0ff24e774bc5aba50351b44776ddefrkoenig@google.com}
121ed6edcab8bb0ff24e774bc5aba50351b44776ddefrkoenig@google.com
122a14b5cdfb3f2238142884bc456f830a7ed69ecd2fbarchard@google.comTEST_F(libyuvTest, I420Rotate180_Odd) {
123a14b5cdfb3f2238142884bc456f830a7ed69ecd2fbarchard@google.com  I420TestRotate(benchmark_width_ - 3, benchmark_height_ - 1,
124a14b5cdfb3f2238142884bc456f830a7ed69ecd2fbarchard@google.com                 benchmark_width_ - 3, benchmark_height_ - 1,
125a14b5cdfb3f2238142884bc456f830a7ed69ecd2fbarchard@google.com                 kRotate180, benchmark_iterations_);
126ed6edcab8bb0ff24e774bc5aba50351b44776ddefrkoenig@google.com}
127ed6edcab8bb0ff24e774bc5aba50351b44776ddefrkoenig@google.com
128a14b5cdfb3f2238142884bc456f830a7ed69ecd2fbarchard@google.comTEST_F(libyuvTest, I420Rotate270_Odd) {
129a14b5cdfb3f2238142884bc456f830a7ed69ecd2fbarchard@google.com  I420TestRotate(benchmark_width_ - 3, benchmark_height_ - 1,
130a14b5cdfb3f2238142884bc456f830a7ed69ecd2fbarchard@google.com                 benchmark_height_ - 1, benchmark_width_ - 3,
131a14b5cdfb3f2238142884bc456f830a7ed69ecd2fbarchard@google.com                 kRotate270, benchmark_iterations_);
132ed6edcab8bb0ff24e774bc5aba50351b44776ddefrkoenig@google.com}
133ed6edcab8bb0ff24e774bc5aba50351b44776ddefrkoenig@google.com
134a14b5cdfb3f2238142884bc456f830a7ed69ecd2fbarchard@google.comstatic void NV12TestRotate(int src_width, int src_height,
135a14b5cdfb3f2238142884bc456f830a7ed69ecd2fbarchard@google.com                           int dst_width, int dst_height,
136a14b5cdfb3f2238142884bc456f830a7ed69ecd2fbarchard@google.com                           libyuv::RotationMode mode,
137a14b5cdfb3f2238142884bc456f830a7ed69ecd2fbarchard@google.com                           int benchmark_iterations) {
138a14b5cdfb3f2238142884bc456f830a7ed69ecd2fbarchard@google.com  if (src_width < 1) {
139a14b5cdfb3f2238142884bc456f830a7ed69ecd2fbarchard@google.com    src_width = 1;
1407781d943b039f9143ab41cdba01dba1e8929161bfbarchard@google.com  }
141a14b5cdfb3f2238142884bc456f830a7ed69ecd2fbarchard@google.com  if (src_height < 1) {
142a14b5cdfb3f2238142884bc456f830a7ed69ecd2fbarchard@google.com    src_height = 1;
143bd4fcb987773ae47b6b49ef4b657c054ea511bfffbarchard@google.com  }
144a14b5cdfb3f2238142884bc456f830a7ed69ecd2fbarchard@google.com  if (dst_width < 1) {
145a14b5cdfb3f2238142884bc456f830a7ed69ecd2fbarchard@google.com    dst_width = 1;
1463de12ae1c6e162f469c1d384430e2bf8dea32f6ffrkoenig@google.com  }
147a14b5cdfb3f2238142884bc456f830a7ed69ecd2fbarchard@google.com  if (dst_height < 1) {
148a14b5cdfb3f2238142884bc456f830a7ed69ecd2fbarchard@google.com    dst_height = 1;
1493de12ae1c6e162f469c1d384430e2bf8dea32f6ffrkoenig@google.com  }
150a14b5cdfb3f2238142884bc456f830a7ed69ecd2fbarchard@google.com  int src_nv12_y_size = src_width * src_height;
151a14b5cdfb3f2238142884bc456f830a7ed69ecd2fbarchard@google.com  int src_nv12_uv_size = ((src_width + 1) / 2) * ((src_height + 1) / 2) * 2;
152a14b5cdfb3f2238142884bc456f830a7ed69ecd2fbarchard@google.com  int src_nv12_size = src_nv12_y_size + src_nv12_uv_size;
153ae9a1388a71a3154ef7d6f753c8e568c97554fc0fbarchard@google.com  align_buffer_64(src_nv12, src_nv12_size);
154a14b5cdfb3f2238142884bc456f830a7ed69ecd2fbarchard@google.com  for (int i = 0; i < src_nv12_size; ++i) {
155a14b5cdfb3f2238142884bc456f830a7ed69ecd2fbarchard@google.com    src_nv12[i] = random() & 0xff;
156e3230e4a93a86b0a1e98a3cf5782c97f13488b70fbarchard@google.com  }
1573de12ae1c6e162f469c1d384430e2bf8dea32f6ffrkoenig@google.com
158a14b5cdfb3f2238142884bc456f830a7ed69ecd2fbarchard@google.com  int dst_i420_y_size = dst_width * dst_height;
159a14b5cdfb3f2238142884bc456f830a7ed69ecd2fbarchard@google.com  int dst_i420_uv_size = ((dst_width + 1) / 2) * ((dst_height + 1) / 2);
160a14b5cdfb3f2238142884bc456f830a7ed69ecd2fbarchard@google.com  int dst_i420_size = dst_i420_y_size + dst_i420_uv_size * 2;
161ae9a1388a71a3154ef7d6f753c8e568c97554fc0fbarchard@google.com  align_buffer_64(dst_i420_c, dst_i420_size);
162ae9a1388a71a3154ef7d6f753c8e568c97554fc0fbarchard@google.com  align_buffer_64(dst_i420_opt, dst_i420_size);
163a14b5cdfb3f2238142884bc456f830a7ed69ecd2fbarchard@google.com  memset(dst_i420_c, 2, dst_i420_size);
164a14b5cdfb3f2238142884bc456f830a7ed69ecd2fbarchard@google.com  memset(dst_i420_opt, 3, dst_i420_size);
1653de12ae1c6e162f469c1d384430e2bf8dea32f6ffrkoenig@google.com
166a14b5cdfb3f2238142884bc456f830a7ed69ecd2fbarchard@google.com  MaskCpuFlags(0);  // Disable all CPU optimization.
167a14b5cdfb3f2238142884bc456f830a7ed69ecd2fbarchard@google.com  NV12ToI420Rotate(src_nv12, src_width,
168a14b5cdfb3f2238142884bc456f830a7ed69ecd2fbarchard@google.com                   src_nv12 + src_nv12_y_size, (src_width + 1) & ~1,
169a14b5cdfb3f2238142884bc456f830a7ed69ecd2fbarchard@google.com                   dst_i420_c, dst_width,
170a14b5cdfb3f2238142884bc456f830a7ed69ecd2fbarchard@google.com                   dst_i420_c + dst_i420_y_size, (dst_width + 1) / 2,
171a14b5cdfb3f2238142884bc456f830a7ed69ecd2fbarchard@google.com                   dst_i420_c + dst_i420_y_size + dst_i420_uv_size,
172a14b5cdfb3f2238142884bc456f830a7ed69ecd2fbarchard@google.com                     (dst_width + 1) / 2,
173a14b5cdfb3f2238142884bc456f830a7ed69ecd2fbarchard@google.com                   src_width, src_height, mode);
1743de12ae1c6e162f469c1d384430e2bf8dea32f6ffrkoenig@google.com
175a14b5cdfb3f2238142884bc456f830a7ed69ecd2fbarchard@google.com  MaskCpuFlags(-1);  // Enable all CPU optimization.
176a14b5cdfb3f2238142884bc456f830a7ed69ecd2fbarchard@google.com  for (int i = 0; i < benchmark_iterations; ++i) {
177a14b5cdfb3f2238142884bc456f830a7ed69ecd2fbarchard@google.com    NV12ToI420Rotate(src_nv12, src_width,
178a14b5cdfb3f2238142884bc456f830a7ed69ecd2fbarchard@google.com                     src_nv12 + src_nv12_y_size, (src_width + 1) & ~1,
179a14b5cdfb3f2238142884bc456f830a7ed69ecd2fbarchard@google.com                     dst_i420_opt, dst_width,
180a14b5cdfb3f2238142884bc456f830a7ed69ecd2fbarchard@google.com                     dst_i420_opt + dst_i420_y_size, (dst_width + 1) / 2,
181a14b5cdfb3f2238142884bc456f830a7ed69ecd2fbarchard@google.com                     dst_i420_opt + dst_i420_y_size + dst_i420_uv_size,
182a14b5cdfb3f2238142884bc456f830a7ed69ecd2fbarchard@google.com                       (dst_width + 1) / 2,
183a14b5cdfb3f2238142884bc456f830a7ed69ecd2fbarchard@google.com                     src_width, src_height, mode);
1843de12ae1c6e162f469c1d384430e2bf8dea32f6ffrkoenig@google.com  }
1853de12ae1c6e162f469c1d384430e2bf8dea32f6ffrkoenig@google.com
186a14b5cdfb3f2238142884bc456f830a7ed69ecd2fbarchard@google.com  // Rotation should be exact.
187a14b5cdfb3f2238142884bc456f830a7ed69ecd2fbarchard@google.com  for (int i = 0; i < dst_i420_size; ++i) {
188a14b5cdfb3f2238142884bc456f830a7ed69ecd2fbarchard@google.com    EXPECT_EQ(dst_i420_c[i], dst_i420_opt[i]);
1893de12ae1c6e162f469c1d384430e2bf8dea32f6ffrkoenig@google.com  }
1903de12ae1c6e162f469c1d384430e2bf8dea32f6ffrkoenig@google.com
191ae9a1388a71a3154ef7d6f753c8e568c97554fc0fbarchard@google.com  free_aligned_buffer_64(dst_i420_c);
192ae9a1388a71a3154ef7d6f753c8e568c97554fc0fbarchard@google.com  free_aligned_buffer_64(dst_i420_opt);
193ae9a1388a71a3154ef7d6f753c8e568c97554fc0fbarchard@google.com  free_aligned_buffer_64(src_nv12);
1943de12ae1c6e162f469c1d384430e2bf8dea32f6ffrkoenig@google.com}
1953de12ae1c6e162f469c1d384430e2bf8dea32f6ffrkoenig@google.com
196a14b5cdfb3f2238142884bc456f830a7ed69ecd2fbarchard@google.comTEST_F(libyuvTest, NV12Rotate0) {
197a14b5cdfb3f2238142884bc456f830a7ed69ecd2fbarchard@google.com  NV12TestRotate(benchmark_width_, benchmark_height_,
198a14b5cdfb3f2238142884bc456f830a7ed69ecd2fbarchard@google.com                 benchmark_width_, benchmark_height_,
199a14b5cdfb3f2238142884bc456f830a7ed69ecd2fbarchard@google.com                 kRotate0, benchmark_iterations_);
2003de12ae1c6e162f469c1d384430e2bf8dea32f6ffrkoenig@google.com}
2013de12ae1c6e162f469c1d384430e2bf8dea32f6ffrkoenig@google.com
202a14b5cdfb3f2238142884bc456f830a7ed69ecd2fbarchard@google.comTEST_F(libyuvTest, NV12Rotate90) {
203a14b5cdfb3f2238142884bc456f830a7ed69ecd2fbarchard@google.com  NV12TestRotate(benchmark_width_, benchmark_height_,
204a14b5cdfb3f2238142884bc456f830a7ed69ecd2fbarchard@google.com                 benchmark_height_, benchmark_width_,
205a14b5cdfb3f2238142884bc456f830a7ed69ecd2fbarchard@google.com                 kRotate90, benchmark_iterations_);
2063de12ae1c6e162f469c1d384430e2bf8dea32f6ffrkoenig@google.com}
2073de12ae1c6e162f469c1d384430e2bf8dea32f6ffrkoenig@google.com
208a14b5cdfb3f2238142884bc456f830a7ed69ecd2fbarchard@google.comTEST_F(libyuvTest, NV12Rotate180) {
209a14b5cdfb3f2238142884bc456f830a7ed69ecd2fbarchard@google.com  NV12TestRotate(benchmark_width_, benchmark_height_,
210a14b5cdfb3f2238142884bc456f830a7ed69ecd2fbarchard@google.com                 benchmark_width_, benchmark_height_,
211a14b5cdfb3f2238142884bc456f830a7ed69ecd2fbarchard@google.com                 kRotate180, benchmark_iterations_);
2123de12ae1c6e162f469c1d384430e2bf8dea32f6ffrkoenig@google.com}
2133de12ae1c6e162f469c1d384430e2bf8dea32f6ffrkoenig@google.com
214a14b5cdfb3f2238142884bc456f830a7ed69ecd2fbarchard@google.comTEST_F(libyuvTest, NV12Rotate270) {
215a14b5cdfb3f2238142884bc456f830a7ed69ecd2fbarchard@google.com  NV12TestRotate(benchmark_width_, benchmark_height_,
216a14b5cdfb3f2238142884bc456f830a7ed69ecd2fbarchard@google.com                 benchmark_height_, benchmark_width_,
217a14b5cdfb3f2238142884bc456f830a7ed69ecd2fbarchard@google.com                 kRotate270, benchmark_iterations_);
2183de12ae1c6e162f469c1d384430e2bf8dea32f6ffrkoenig@google.com}
2193de12ae1c6e162f469c1d384430e2bf8dea32f6ffrkoenig@google.com
220a14b5cdfb3f2238142884bc456f830a7ed69ecd2fbarchard@google.comTEST_F(libyuvTest, NV12Rotate0_Odd) {
221a14b5cdfb3f2238142884bc456f830a7ed69ecd2fbarchard@google.com  NV12TestRotate(benchmark_width_ - 3, benchmark_height_ - 1,
222a14b5cdfb3f2238142884bc456f830a7ed69ecd2fbarchard@google.com                 benchmark_width_ - 3, benchmark_height_ - 1,
223a14b5cdfb3f2238142884bc456f830a7ed69ecd2fbarchard@google.com                 kRotate0, benchmark_iterations_);
2243de12ae1c6e162f469c1d384430e2bf8dea32f6ffrkoenig@google.com}
2253de12ae1c6e162f469c1d384430e2bf8dea32f6ffrkoenig@google.com
226a14b5cdfb3f2238142884bc456f830a7ed69ecd2fbarchard@google.comTEST_F(libyuvTest, NV12Rotate90_Odd) {
227a14b5cdfb3f2238142884bc456f830a7ed69ecd2fbarchard@google.com  NV12TestRotate(benchmark_width_ - 3, benchmark_height_ - 1,
228a14b5cdfb3f2238142884bc456f830a7ed69ecd2fbarchard@google.com                 benchmark_height_ - 1, benchmark_width_ - 3,
229a14b5cdfb3f2238142884bc456f830a7ed69ecd2fbarchard@google.com                 kRotate90, benchmark_iterations_);
2303de12ae1c6e162f469c1d384430e2bf8dea32f6ffrkoenig@google.com}
2311b06484b4aeb06ce45759ea9928fe84981680ac9mikhal@webrtc.org
232a14b5cdfb3f2238142884bc456f830a7ed69ecd2fbarchard@google.comTEST_F(libyuvTest, NV12Rotate180_Odd) {
233a14b5cdfb3f2238142884bc456f830a7ed69ecd2fbarchard@google.com  NV12TestRotate(benchmark_width_ - 3, benchmark_height_ - 1,
234a14b5cdfb3f2238142884bc456f830a7ed69ecd2fbarchard@google.com                 benchmark_width_ - 3, benchmark_height_ - 1,
235a14b5cdfb3f2238142884bc456f830a7ed69ecd2fbarchard@google.com                 kRotate180, benchmark_iterations_);
236a14b5cdfb3f2238142884bc456f830a7ed69ecd2fbarchard@google.com}
237c4163acb7b5aaea4a5be500c41cbc4af28125436fbarchard@google.com
238a14b5cdfb3f2238142884bc456f830a7ed69ecd2fbarchard@google.comTEST_F(libyuvTest, NV12Rotate270_Odd) {
239a14b5cdfb3f2238142884bc456f830a7ed69ecd2fbarchard@google.com  NV12TestRotate(benchmark_width_ - 3, benchmark_height_ - 1,
240a14b5cdfb3f2238142884bc456f830a7ed69ecd2fbarchard@google.com                 benchmark_height_ - 1, benchmark_width_ - 3,
241a14b5cdfb3f2238142884bc456f830a7ed69ecd2fbarchard@google.com                 kRotate270, benchmark_iterations_);
242c4163acb7b5aaea4a5be500c41cbc4af28125436fbarchard@google.com}
243de07146fa46d28bdd7f866791b8e764f3c03b849fbarchard@google.com
244c82af4a59ce299da67084916317266a33c2868e1frkoenig@google.com}  // namespace libyuv
245