OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2011 The LibYuv Project Authors. All rights reserved. | 2 * Copyright 2011 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 #include <time.h> | 12 #include <time.h> |
13 | 13 |
14 #include "libyuv/convert_argb.h" | 14 #include "libyuv/convert_argb.h" |
15 #include "libyuv/cpu_id.h" | 15 #include "libyuv/cpu_id.h" |
16 #include "libyuv/row.h" // For align_buffer_64 | |
17 #include "libyuv/scale_argb.h" | 16 #include "libyuv/scale_argb.h" |
18 #include "libyuv/video_common.h" | 17 #include "libyuv/video_common.h" |
19 #include "../unit_test/unit_test.h" | 18 #include "../unit_test/unit_test.h" |
20 | 19 |
21 namespace libyuv { | 20 namespace libyuv { |
22 | 21 |
23 #define STRINGIZE(line) #line | 22 #define STRINGIZE(line) #line |
24 #define FILELINESTR(file, line) file ":" STRINGIZE(line) | 23 #define FILELINESTR(file, line) file ":" STRINGIZE(line) |
25 | 24 |
26 // Test scaling with C vs Opt and return maximum pixel difference. 0 = exact. | 25 // Test scaling with C vs Opt and return maximum pixel difference. 0 = exact. |
(...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
149 FilterMode f, int benchmark_iterations) { | 148 FilterMode f, int benchmark_iterations) { |
150 if (!SizeValid(src_width, src_height, dst_width, dst_height)) { | 149 if (!SizeValid(src_width, src_height, dst_width, dst_height)) { |
151 return 0; | 150 return 0; |
152 } | 151 } |
153 | 152 |
154 const int b = 128; | 153 const int b = 128; |
155 int64 src_argb_plane_size = (Abs(src_width) + b * 2) * | 154 int64 src_argb_plane_size = (Abs(src_width) + b * 2) * |
156 (Abs(src_height) + b * 2) * 4; | 155 (Abs(src_height) + b * 2) * 4; |
157 int src_stride_argb = (b * 2 + Abs(src_width)) * 4; | 156 int src_stride_argb = (b * 2 + Abs(src_width)) * 4; |
158 | 157 |
159 align_buffer_64(src_argb, src_argb_plane_size); | 158 align_buffer_page_end(src_argb, src_argb_plane_size); |
160 if (!src_argb) { | 159 if (!src_argb) { |
161 printf("Skipped. Alloc failed " FILELINESTR(__FILE__, __LINE__) "\n"); | 160 printf("Skipped. Alloc failed " FILELINESTR(__FILE__, __LINE__) "\n"); |
162 return 0; | 161 return 0; |
163 } | 162 } |
164 memset(src_argb, 1, src_argb_plane_size); | 163 memset(src_argb, 1, src_argb_plane_size); |
165 | 164 |
166 int64 dst_argb_plane_size = (dst_width + b * 2) * (dst_height + b * 2) * 4; | 165 int64 dst_argb_plane_size = (dst_width + b * 2) * (dst_height + b * 2) * 4; |
167 int dst_stride_argb = (b * 2 + dst_width) * 4; | 166 int dst_stride_argb = (b * 2 + dst_width) * 4; |
168 | 167 |
169 int i, j; | 168 int i, j; |
170 for (i = b; i < (Abs(src_height) + b); ++i) { | 169 for (i = b; i < (Abs(src_height) + b); ++i) { |
171 for (j = b; j < (Abs(src_width) + b) * 4; ++j) { | 170 for (j = b; j < (Abs(src_width) + b) * 4; ++j) { |
172 src_argb[(i * src_stride_argb) + j] = (fastrand() & 0xff); | 171 src_argb[(i * src_stride_argb) + j] = (fastrand() & 0xff); |
173 } | 172 } |
174 } | 173 } |
175 | 174 |
176 align_buffer_64(dst_argb_c, dst_argb_plane_size); | 175 align_buffer_page_end(dst_argb_c, dst_argb_plane_size); |
177 align_buffer_64(dst_argb_opt, dst_argb_plane_size); | 176 align_buffer_page_end(dst_argb_opt, dst_argb_plane_size); |
178 if (!dst_argb_c || !dst_argb_opt) { | 177 if (!dst_argb_c || !dst_argb_opt) { |
179 printf("Skipped. Alloc failed " FILELINESTR(__FILE__, __LINE__) "\n"); | 178 printf("Skipped. Alloc failed " FILELINESTR(__FILE__, __LINE__) "\n"); |
180 return 0; | 179 return 0; |
181 } | 180 } |
182 memset(dst_argb_c, 2, dst_argb_plane_size); | 181 memset(dst_argb_c, 2, dst_argb_plane_size); |
183 memset(dst_argb_opt, 3, dst_argb_plane_size); | 182 memset(dst_argb_opt, 3, dst_argb_plane_size); |
184 | 183 |
185 // Do full image, no clipping. | 184 // Do full image, no clipping. |
186 double c_time = get_time(); | 185 double c_time = get_time(); |
187 ARGBScale(src_argb + (src_stride_argb * b) + b * 4, src_stride_argb, | 186 ARGBScale(src_argb + (src_stride_argb * b) + b * 4, src_stride_argb, |
(...skipping 21 matching lines...) Expand all Loading... |
209 for (i = b; i < (dst_height + b); ++i) { | 208 for (i = b; i < (dst_height + b); ++i) { |
210 for (j = b * 4; j < (dst_width + b) * 4; ++j) { | 209 for (j = b * 4; j < (dst_width + b) * 4; ++j) { |
211 int abs_diff = Abs(dst_argb_c[(i * dst_stride_argb) + j] - | 210 int abs_diff = Abs(dst_argb_c[(i * dst_stride_argb) + j] - |
212 dst_argb_opt[(i * dst_stride_argb) + j]); | 211 dst_argb_opt[(i * dst_stride_argb) + j]); |
213 if (abs_diff > max_diff) { | 212 if (abs_diff > max_diff) { |
214 max_diff = abs_diff; | 213 max_diff = abs_diff; |
215 } | 214 } |
216 } | 215 } |
217 } | 216 } |
218 | 217 |
219 free_aligned_buffer_64(dst_argb_c); | 218 free_aligned_buffer_page_end(dst_argb_c); |
220 free_aligned_buffer_64(dst_argb_opt); | 219 free_aligned_buffer_page_end(dst_argb_opt); |
221 free_aligned_buffer_64(src_argb); | 220 free_aligned_buffer_page_end(src_argb); |
222 return max_diff; | 221 return max_diff; |
223 } | 222 } |
224 | 223 |
225 // The following adjustments in dimensions ensure the scale factor will be | 224 // The following adjustments in dimensions ensure the scale factor will be |
226 // exactly achieved. | 225 // exactly achieved. |
227 #define DX(x, nom, denom) static_cast<int>((Abs(x) / nom) * nom) | 226 #define DX(x, nom, denom) static_cast<int>((Abs(x) / nom) * nom) |
228 #define SX(x, nom, denom) static_cast<int>((x / nom) * denom) | 227 #define SX(x, nom, denom) static_cast<int>((x / nom) * denom) |
229 | 228 |
230 #define TEST_FACTOR1(name, filter, nom, denom, max_diff) \ | 229 #define TEST_FACTOR1(name, filter, nom, denom, max_diff) \ |
231 TEST_F(LibYUVScaleTest, ARGBScaleDownBy##name##_##filter) { \ | 230 TEST_F(LibYUVScaleTest, ARGBScaleDownBy##name##_##filter) { \ |
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
315 const uint8* src_u, int src_stride_u, | 314 const uint8* src_u, int src_stride_u, |
316 const uint8* src_v, int src_stride_v, | 315 const uint8* src_v, int src_stride_v, |
317 uint32 src_fourcc, | 316 uint32 src_fourcc, |
318 int src_width, int src_height, | 317 int src_width, int src_height, |
319 uint8* dst_argb, int dst_stride_argb, | 318 uint8* dst_argb, int dst_stride_argb, |
320 uint32 dst_fourcc, | 319 uint32 dst_fourcc, |
321 int dst_width, int dst_height, | 320 int dst_width, int dst_height, |
322 int clip_x, int clip_y, | 321 int clip_x, int clip_y, |
323 int clip_width, int clip_height, | 322 int clip_width, int clip_height, |
324 enum FilterMode filtering) { | 323 enum FilterMode filtering) { |
325 | 324 uint8* argb_buffer = static_cast<uint8*>(malloc(src_width * src_height * 4)); |
326 uint8* argb_buffer = (uint8*)malloc(src_width * src_height * 4); | |
327 int r; | 325 int r; |
328 I420ToARGB(src_y, src_stride_y, | 326 I420ToARGB(src_y, src_stride_y, |
329 src_u, src_stride_u, | 327 src_u, src_stride_u, |
330 src_v, src_stride_v, | 328 src_v, src_stride_v, |
331 argb_buffer, src_width * 4, | 329 argb_buffer, src_width * 4, |
332 src_width, src_height); | 330 src_width, src_height); |
333 | 331 |
334 r = ARGBScaleClip(argb_buffer, src_width * 4, | 332 r = ARGBScaleClip(argb_buffer, src_width * 4, |
335 src_width, src_height, | 333 src_width, src_height, |
336 dst_argb, dst_stride_argb, | 334 dst_argb, dst_stride_argb, |
(...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
455 benchmark_height_ * 3 / 2, | 453 benchmark_height_ * 3 / 2, |
456 benchmark_width_, benchmark_height_, | 454 benchmark_width_, benchmark_height_, |
457 libyuv::kFilterBilinear, | 455 libyuv::kFilterBilinear, |
458 benchmark_iterations_, | 456 benchmark_iterations_, |
459 disable_cpu_flags_, benchmark_cpu_info_); | 457 disable_cpu_flags_, benchmark_cpu_info_); |
460 EXPECT_LE(diff, 10); | 458 EXPECT_LE(diff, 10); |
461 } | 459 } |
462 | 460 |
463 | 461 |
464 } // namespace libyuv | 462 } // namespace libyuv |
OLD | NEW |