OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2012 The LibYuv Project Authors. All rights reserved. | 2 * Copyright 2012 The LibYuv Project Authors. All rights reserved. |
3 * | 3 * |
4 * Use of this source code is governed by a BSD-style license | 4 * Use of this source code is governed by a BSD-style license |
5 * that can be found in the LICENSE file in the root of the source | 5 * that can be found in the LICENSE file in the root of the source |
6 * tree. An additional intellectual property rights grant can be found | 6 * tree. An additional intellectual property rights grant can be found |
7 * in the file PATENTS. All contributing project authors may | 7 * in the file PATENTS. All contributing project authors may |
8 * be found in the AUTHORS file in the root of the source tree. | 8 * be found in the AUTHORS file in the root of the source tree. |
9 */ | 9 */ |
10 | 10 |
11 #include <stdlib.h> | 11 #include <stdlib.h> |
12 | 12 |
13 #include "libyuv/cpu_id.h" | 13 #include "libyuv/cpu_id.h" |
14 #include "libyuv/rotate.h" | 14 #include "libyuv/rotate.h" |
15 #include "libyuv/row.h" | |
16 #include "../unit_test/unit_test.h" | 15 #include "../unit_test/unit_test.h" |
17 | 16 |
18 namespace libyuv { | 17 namespace libyuv { |
19 | 18 |
20 static void I420TestRotate(int src_width, int src_height, | 19 static void I420TestRotate(int src_width, int src_height, |
21 int dst_width, int dst_height, | 20 int dst_width, int dst_height, |
22 libyuv::RotationMode mode, | 21 libyuv::RotationMode mode, |
23 int benchmark_iterations, | 22 int benchmark_iterations, |
24 int disable_cpu_flags, int benchmark_cpu_info) { | 23 int disable_cpu_flags, int benchmark_cpu_info) { |
25 if (src_width < 1) { | 24 if (src_width < 1) { |
26 src_width = 1; | 25 src_width = 1; |
27 } | 26 } |
28 if (src_height == 0) { | 27 if (src_height == 0) { |
29 src_height = 1; | 28 src_height = 1; |
30 } | 29 } |
31 if (dst_width < 1) { | 30 if (dst_width < 1) { |
32 dst_width = 1; | 31 dst_width = 1; |
33 } | 32 } |
34 if (dst_height < 1) { | 33 if (dst_height < 1) { |
35 dst_height = 1; | 34 dst_height = 1; |
36 } | 35 } |
37 int src_i420_y_size = src_width * Abs(src_height); | 36 int src_i420_y_size = src_width * Abs(src_height); |
38 int src_i420_uv_size = ((src_width + 1) / 2) * ((Abs(src_height) + 1) / 2); | 37 int src_i420_uv_size = ((src_width + 1) / 2) * ((Abs(src_height) + 1) / 2); |
39 int src_i420_size = src_i420_y_size + src_i420_uv_size * 2; | 38 int src_i420_size = src_i420_y_size + src_i420_uv_size * 2; |
40 align_buffer_64(src_i420, src_i420_size); | 39 align_buffer_page_end(src_i420, src_i420_size); |
41 for (int i = 0; i < src_i420_size; ++i) { | 40 for (int i = 0; i < src_i420_size; ++i) { |
42 src_i420[i] = fastrand() & 0xff; | 41 src_i420[i] = fastrand() & 0xff; |
43 } | 42 } |
44 | 43 |
45 int dst_i420_y_size = dst_width * dst_height; | 44 int dst_i420_y_size = dst_width * dst_height; |
46 int dst_i420_uv_size = ((dst_width + 1) / 2) * ((dst_height + 1) / 2); | 45 int dst_i420_uv_size = ((dst_width + 1) / 2) * ((dst_height + 1) / 2); |
47 int dst_i420_size = dst_i420_y_size + dst_i420_uv_size * 2; | 46 int dst_i420_size = dst_i420_y_size + dst_i420_uv_size * 2; |
48 align_buffer_64(dst_i420_c, dst_i420_size); | 47 align_buffer_page_end(dst_i420_c, dst_i420_size); |
49 align_buffer_64(dst_i420_opt, dst_i420_size); | 48 align_buffer_page_end(dst_i420_opt, dst_i420_size); |
50 memset(dst_i420_c, 2, dst_i420_size); | 49 memset(dst_i420_c, 2, dst_i420_size); |
51 memset(dst_i420_opt, 3, dst_i420_size); | 50 memset(dst_i420_opt, 3, dst_i420_size); |
52 | 51 |
53 MaskCpuFlags(disable_cpu_flags); // Disable all CPU optimization. | 52 MaskCpuFlags(disable_cpu_flags); // Disable all CPU optimization. |
54 I420Rotate(src_i420, src_width, | 53 I420Rotate(src_i420, src_width, |
55 src_i420 + src_i420_y_size, (src_width + 1) / 2, | 54 src_i420 + src_i420_y_size, (src_width + 1) / 2, |
56 src_i420 + src_i420_y_size + src_i420_uv_size, (src_width + 1) / 2, | 55 src_i420 + src_i420_y_size + src_i420_uv_size, (src_width + 1) / 2, |
57 dst_i420_c, dst_width, | 56 dst_i420_c, dst_width, |
58 dst_i420_c + dst_i420_y_size, (dst_width + 1) / 2, | 57 dst_i420_c + dst_i420_y_size, (dst_width + 1) / 2, |
59 dst_i420_c + dst_i420_y_size + dst_i420_uv_size, | 58 dst_i420_c + dst_i420_y_size + dst_i420_uv_size, |
(...skipping 11 matching lines...) Expand all Loading... |
71 dst_i420_opt + dst_i420_y_size + dst_i420_uv_size, | 70 dst_i420_opt + dst_i420_y_size + dst_i420_uv_size, |
72 (dst_width + 1) / 2, | 71 (dst_width + 1) / 2, |
73 src_width, src_height, mode); | 72 src_width, src_height, mode); |
74 } | 73 } |
75 | 74 |
76 // Rotation should be exact. | 75 // Rotation should be exact. |
77 for (int i = 0; i < dst_i420_size; ++i) { | 76 for (int i = 0; i < dst_i420_size; ++i) { |
78 EXPECT_EQ(dst_i420_c[i], dst_i420_opt[i]); | 77 EXPECT_EQ(dst_i420_c[i], dst_i420_opt[i]); |
79 } | 78 } |
80 | 79 |
81 free_aligned_buffer_64(dst_i420_c); | 80 free_aligned_buffer_page_end(dst_i420_c); |
82 free_aligned_buffer_64(dst_i420_opt); | 81 free_aligned_buffer_page_end(dst_i420_opt); |
83 free_aligned_buffer_64(src_i420); | 82 free_aligned_buffer_page_end(src_i420); |
84 } | 83 } |
85 | 84 |
86 TEST_F(LibYUVRotateTest, I420Rotate0_Opt) { | 85 TEST_F(LibYUVRotateTest, I420Rotate0_Opt) { |
87 I420TestRotate(benchmark_width_, benchmark_height_, | 86 I420TestRotate(benchmark_width_, benchmark_height_, |
88 benchmark_width_, benchmark_height_, | 87 benchmark_width_, benchmark_height_, |
89 kRotate0, benchmark_iterations_, | 88 kRotate0, benchmark_iterations_, |
90 disable_cpu_flags_, benchmark_cpu_info_); | 89 disable_cpu_flags_, benchmark_cpu_info_); |
91 } | 90 } |
92 | 91 |
93 TEST_F(LibYUVRotateTest, I420Rotate90_Opt) { | 92 TEST_F(LibYUVRotateTest, I420Rotate90_Opt) { |
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
156 if (dst_width < 1) { | 155 if (dst_width < 1) { |
157 dst_width = 1; | 156 dst_width = 1; |
158 } | 157 } |
159 if (dst_height < 1) { | 158 if (dst_height < 1) { |
160 dst_height = 1; | 159 dst_height = 1; |
161 } | 160 } |
162 int src_nv12_y_size = src_width * Abs(src_height); | 161 int src_nv12_y_size = src_width * Abs(src_height); |
163 int src_nv12_uv_size = | 162 int src_nv12_uv_size = |
164 ((src_width + 1) / 2) * ((Abs(src_height) + 1) / 2) * 2; | 163 ((src_width + 1) / 2) * ((Abs(src_height) + 1) / 2) * 2; |
165 int src_nv12_size = src_nv12_y_size + src_nv12_uv_size; | 164 int src_nv12_size = src_nv12_y_size + src_nv12_uv_size; |
166 align_buffer_64(src_nv12, src_nv12_size); | 165 align_buffer_page_end(src_nv12, src_nv12_size); |
167 for (int i = 0; i < src_nv12_size; ++i) { | 166 for (int i = 0; i < src_nv12_size; ++i) { |
168 src_nv12[i] = fastrand() & 0xff; | 167 src_nv12[i] = fastrand() & 0xff; |
169 } | 168 } |
170 | 169 |
171 int dst_i420_y_size = dst_width * dst_height; | 170 int dst_i420_y_size = dst_width * dst_height; |
172 int dst_i420_uv_size = ((dst_width + 1) / 2) * ((dst_height + 1) / 2); | 171 int dst_i420_uv_size = ((dst_width + 1) / 2) * ((dst_height + 1) / 2); |
173 int dst_i420_size = dst_i420_y_size + dst_i420_uv_size * 2; | 172 int dst_i420_size = dst_i420_y_size + dst_i420_uv_size * 2; |
174 align_buffer_64(dst_i420_c, dst_i420_size); | 173 align_buffer_page_end(dst_i420_c, dst_i420_size); |
175 align_buffer_64(dst_i420_opt, dst_i420_size); | 174 align_buffer_page_end(dst_i420_opt, dst_i420_size); |
176 memset(dst_i420_c, 2, dst_i420_size); | 175 memset(dst_i420_c, 2, dst_i420_size); |
177 memset(dst_i420_opt, 3, dst_i420_size); | 176 memset(dst_i420_opt, 3, dst_i420_size); |
178 | 177 |
179 MaskCpuFlags(disable_cpu_flags); // Disable all CPU optimization. | 178 MaskCpuFlags(disable_cpu_flags); // Disable all CPU optimization. |
180 NV12ToI420Rotate(src_nv12, src_width, | 179 NV12ToI420Rotate(src_nv12, src_width, |
181 src_nv12 + src_nv12_y_size, (src_width + 1) & ~1, | 180 src_nv12 + src_nv12_y_size, (src_width + 1) & ~1, |
182 dst_i420_c, dst_width, | 181 dst_i420_c, dst_width, |
183 dst_i420_c + dst_i420_y_size, (dst_width + 1) / 2, | 182 dst_i420_c + dst_i420_y_size, (dst_width + 1) / 2, |
184 dst_i420_c + dst_i420_y_size + dst_i420_uv_size, | 183 dst_i420_c + dst_i420_y_size + dst_i420_uv_size, |
185 (dst_width + 1) / 2, | 184 (dst_width + 1) / 2, |
186 src_width, src_height, mode); | 185 src_width, src_height, mode); |
187 | 186 |
188 MaskCpuFlags(benchmark_cpu_info); // Enable all CPU optimization. | 187 MaskCpuFlags(benchmark_cpu_info); // Enable all CPU optimization. |
189 for (int i = 0; i < benchmark_iterations; ++i) { | 188 for (int i = 0; i < benchmark_iterations; ++i) { |
190 NV12ToI420Rotate(src_nv12, src_width, | 189 NV12ToI420Rotate(src_nv12, src_width, |
191 src_nv12 + src_nv12_y_size, (src_width + 1) & ~1, | 190 src_nv12 + src_nv12_y_size, (src_width + 1) & ~1, |
192 dst_i420_opt, dst_width, | 191 dst_i420_opt, dst_width, |
193 dst_i420_opt + dst_i420_y_size, (dst_width + 1) / 2, | 192 dst_i420_opt + dst_i420_y_size, (dst_width + 1) / 2, |
194 dst_i420_opt + dst_i420_y_size + dst_i420_uv_size, | 193 dst_i420_opt + dst_i420_y_size + dst_i420_uv_size, |
195 (dst_width + 1) / 2, | 194 (dst_width + 1) / 2, |
196 src_width, src_height, mode); | 195 src_width, src_height, mode); |
197 } | 196 } |
198 | 197 |
199 // Rotation should be exact. | 198 // Rotation should be exact. |
200 for (int i = 0; i < dst_i420_size; ++i) { | 199 for (int i = 0; i < dst_i420_size; ++i) { |
201 EXPECT_EQ(dst_i420_c[i], dst_i420_opt[i]); | 200 EXPECT_EQ(dst_i420_c[i], dst_i420_opt[i]); |
202 } | 201 } |
203 | 202 |
204 free_aligned_buffer_64(dst_i420_c); | 203 free_aligned_buffer_page_end(dst_i420_c); |
205 free_aligned_buffer_64(dst_i420_opt); | 204 free_aligned_buffer_page_end(dst_i420_opt); |
206 free_aligned_buffer_64(src_nv12); | 205 free_aligned_buffer_page_end(src_nv12); |
207 } | 206 } |
208 | 207 |
209 TEST_F(LibYUVRotateTest, NV12Rotate0_Opt) { | 208 TEST_F(LibYUVRotateTest, NV12Rotate0_Opt) { |
210 NV12TestRotate(benchmark_width_, benchmark_height_, | 209 NV12TestRotate(benchmark_width_, benchmark_height_, |
211 benchmark_width_, benchmark_height_, | 210 benchmark_width_, benchmark_height_, |
212 kRotate0, benchmark_iterations_, | 211 kRotate0, benchmark_iterations_, |
213 disable_cpu_flags_, benchmark_cpu_info_); | 212 disable_cpu_flags_, benchmark_cpu_info_); |
214 } | 213 } |
215 | 214 |
216 TEST_F(LibYUVRotateTest, NV12Rotate90_Opt) { | 215 TEST_F(LibYUVRotateTest, NV12Rotate90_Opt) { |
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
288 benchmark_height_, benchmark_width_, | 287 benchmark_height_, benchmark_width_, |
289 kRotate270, benchmark_iterations_, | 288 kRotate270, benchmark_iterations_, |
290 disable_cpu_flags_, benchmark_cpu_info_); | 289 disable_cpu_flags_, benchmark_cpu_info_); |
291 } | 290 } |
292 | 291 |
293 | 292 |
294 | 293 |
295 | 294 |
296 | 295 |
297 } // namespace libyuv | 296 } // namespace libyuv |
OLD | NEW |