/* * Copyright 2011 The LibYuv Project Authors. All rights reserved. * * Use of this source code is governed by a BSD-style license * that can be found in the LICENSE file in the root of the source * tree. An additional intellectual property rights grant can be found * in the file PATENTS. All contributing project authors may * be found in the AUTHORS file in the root of the source tree.
*/
#if !defined(DISABLE_SLOW_TESTS) || defined(__x86_64__) || defined(__i386__) // SLOW TESTS are those that are unoptimized C code. // FULL TESTS are optimized but test many variations of the same code. #define ENABLE_FULL_TESTS #endif
namespace libyuv {
// Test scaling with C vs Opt and return maximum pixel difference. 0 = exact. staticint I420TestFilter(int src_width, int src_height, int dst_width, int dst_height,
FilterMode f, int benchmark_iterations, int disable_cpu_flags, int benchmark_cpu_info) { if (!SizeValid(src_width, src_height, dst_width, dst_height)) { return 0;
}
int i, j; int src_width_uv = (Abs(src_width) + 1) >> 1; int src_height_uv = (Abs(src_height) + 1) >> 1;
MaskCpuFlags(benchmark_cpu_info); // Enable all CPU optimization. double opt_time = get_time(); for (i = 0; i < benchmark_iterations; ++i) {
I420Scale(src_y, src_stride_y, src_u, src_stride_uv, src_v, src_stride_uv,
src_width, src_height, dst_y_opt, dst_stride_y, dst_u_opt,
dst_stride_uv, dst_v_opt, dst_stride_uv, dst_width, dst_height,
f);
}
opt_time = (get_time() - opt_time) / benchmark_iterations; // Report performance of C vs OPT.
printf("filter %d - %8d us C - %8d us OPT\n", f, static_cast<int>(c_time * 1e6), static_cast<int>(opt_time * 1e6));
// C version may be a little off from the optimized. Order of // operations may introduce rounding somewhere. So do a difference // of the buffers and look to see that the max difference is not // over 3. int max_diff = 0; for (i = 0; i < (dst_height); ++i) { for (j = 0; j < (dst_width); ++j) { int abs_diff = Abs(dst_y_c[(i * dst_stride_y) + j] -
dst_y_opt[(i * dst_stride_y) + j]); if (abs_diff > max_diff) {
max_diff = abs_diff;
}
}
}
for (i = 0; i < (dst_height_uv); ++i) { for (j = 0; j < (dst_width_uv); ++j) { int abs_diff = Abs(dst_u_c[(i * dst_stride_uv) + j] -
dst_u_opt[(i * dst_stride_uv) + j]); if (abs_diff > max_diff) {
max_diff = abs_diff;
}
abs_diff = Abs(dst_v_c[(i * dst_stride_uv) + j] -
dst_v_opt[(i * dst_stride_uv) + j]); if (abs_diff > max_diff) {
max_diff = abs_diff;
}
}
}
// Test scaling with 8 bit C vs 12 bit C and return maximum pixel difference. // 0 = exact. staticint I420TestFilter_12(int src_width, int src_height, int dst_width, int dst_height,
FilterMode f, int benchmark_iterations, int disable_cpu_flags, int benchmark_cpu_info) { if (!SizeValid(src_width, src_height, dst_width, dst_height)) { return 0;
}
int i; int src_width_uv = (Abs(src_width) + 1) >> 1; int src_height_uv = (Abs(src_height) + 1) >> 1;
for (i = 0; i < src_y_plane_size; ++i) {
p_src_y_12[i] = src_y[i];
} for (i = 0; i < src_uv_plane_size; ++i) {
p_src_u_12[i] = src_u[i];
p_src_v_12[i] = src_v[i];
}
int dst_width_uv = (dst_width + 1) >> 1; int dst_height_uv = (dst_height + 1) >> 1;
int dst_y_plane_size = (dst_width) * (dst_height); int dst_uv_plane_size = (dst_width_uv) * (dst_height_uv);
int dst_stride_y = dst_width; int dst_stride_uv = dst_width_uv;
// Test scaling with 8 bit C vs 16 bit C and return maximum pixel difference. // 0 = exact. staticint I420TestFilter_16(int src_width, int src_height, int dst_width, int dst_height,
FilterMode f, int benchmark_iterations, int disable_cpu_flags, int benchmark_cpu_info) { if (!SizeValid(src_width, src_height, dst_width, dst_height)) { return 0;
}
int i; int src_width_uv = (Abs(src_width) + 1) >> 1; int src_height_uv = (Abs(src_height) + 1) >> 1;
for (i = 0; i < src_y_plane_size; ++i) {
p_src_y_16[i] = src_y[i];
} for (i = 0; i < src_uv_plane_size; ++i) {
p_src_u_16[i] = src_u[i];
p_src_v_16[i] = src_v[i];
}
int dst_width_uv = (dst_width + 1) >> 1; int dst_height_uv = (dst_height + 1) >> 1;
int dst_y_plane_size = (dst_width) * (dst_height); int dst_uv_plane_size = (dst_width_uv) * (dst_height_uv);
int dst_stride_y = dst_width; int dst_stride_uv = dst_width_uv;
// Test scaling with C vs Opt and return maximum pixel difference. 0 = exact. staticint I444TestFilter(int src_width, int src_height, int dst_width, int dst_height,
FilterMode f, int benchmark_iterations, int disable_cpu_flags, int benchmark_cpu_info) { if (!SizeValid(src_width, src_height, dst_width, dst_height)) { return 0;
}
int i, j; int src_width_uv = Abs(src_width); int src_height_uv = Abs(src_height);
MaskCpuFlags(benchmark_cpu_info); // Enable all CPU optimization. double opt_time = get_time(); for (i = 0; i < benchmark_iterations; ++i) {
I444Scale(src_y, src_stride_y, src_u, src_stride_uv, src_v, src_stride_uv,
src_width, src_height, dst_y_opt, dst_stride_y, dst_u_opt,
dst_stride_uv, dst_v_opt, dst_stride_uv, dst_width, dst_height,
f);
}
opt_time = (get_time() - opt_time) / benchmark_iterations; // Report performance of C vs OPT.
printf("filter %d - %8d us C - %8d us OPT\n", f, static_cast<int>(c_time * 1e6), static_cast<int>(opt_time * 1e6));
// C version may be a little off from the optimized. Order of // operations may introduce rounding somewhere. So do a difference // of the buffers and look to see that the max difference is not // over 3. int max_diff = 0; for (i = 0; i < (dst_height); ++i) { for (j = 0; j < (dst_width); ++j) { int abs_diff = Abs(dst_y_c[(i * dst_stride_y) + j] -
dst_y_opt[(i * dst_stride_y) + j]); if (abs_diff > max_diff) {
max_diff = abs_diff;
}
}
}
for (i = 0; i < (dst_height_uv); ++i) { for (j = 0; j < (dst_width_uv); ++j) { int abs_diff = Abs(dst_u_c[(i * dst_stride_uv) + j] -
dst_u_opt[(i * dst_stride_uv) + j]); if (abs_diff > max_diff) {
max_diff = abs_diff;
}
abs_diff = Abs(dst_v_c[(i * dst_stride_uv) + j] -
dst_v_opt[(i * dst_stride_uv) + j]); if (abs_diff > max_diff) {
max_diff = abs_diff;
}
}
}
// Test scaling with 8 bit C vs 12 bit C and return maximum pixel difference. // 0 = exact. staticint I444TestFilter_12(int src_width, int src_height, int dst_width, int dst_height,
FilterMode f, int benchmark_iterations, int disable_cpu_flags, int benchmark_cpu_info) { if (!SizeValid(src_width, src_height, dst_width, dst_height)) { return 0;
}
int i; int src_width_uv = Abs(src_width); int src_height_uv = Abs(src_height);
for (i = 0; i < src_y_plane_size; ++i) {
p_src_y_12[i] = src_y[i];
} for (i = 0; i < src_uv_plane_size; ++i) {
p_src_u_12[i] = src_u[i];
p_src_v_12[i] = src_v[i];
}
int dst_width_uv = dst_width; int dst_height_uv = dst_height;
int dst_y_plane_size = (dst_width) * (dst_height); int dst_uv_plane_size = (dst_width_uv) * (dst_height_uv);
int dst_stride_y = dst_width; int dst_stride_uv = dst_width_uv;
// Test scaling with 8 bit C vs 16 bit C and return maximum pixel difference. // 0 = exact. staticint I444TestFilter_16(int src_width, int src_height, int dst_width, int dst_height,
FilterMode f, int benchmark_iterations, int disable_cpu_flags, int benchmark_cpu_info) { if (!SizeValid(src_width, src_height, dst_width, dst_height)) { return 0;
}
int i; int src_width_uv = Abs(src_width); int src_height_uv = Abs(src_height);
for (i = 0; i < src_y_plane_size; ++i) {
p_src_y_16[i] = src_y[i];
} for (i = 0; i < src_uv_plane_size; ++i) {
p_src_u_16[i] = src_u[i];
p_src_v_16[i] = src_v[i];
}
int dst_width_uv = dst_width; int dst_height_uv = dst_height;
int dst_y_plane_size = (dst_width) * (dst_height); int dst_uv_plane_size = (dst_width_uv) * (dst_height_uv);
int dst_stride_y = dst_width; int dst_stride_uv = dst_width_uv;
// Test scaling with C vs Opt and return maximum pixel difference. 0 = exact. staticint NV12TestFilter(int src_width, int src_height, int dst_width, int dst_height,
FilterMode f, int benchmark_iterations, int disable_cpu_flags, int benchmark_cpu_info) { if (!SizeValid(src_width, src_height, dst_width, dst_height)) { return 0;
}
int i, j; int src_width_uv = (Abs(src_width) + 1) >> 1; int src_height_uv = (Abs(src_height) + 1) >> 1;
MaskCpuFlags(benchmark_cpu_info); // Enable all CPU optimization. double opt_time = get_time(); for (i = 0; i < benchmark_iterations; ++i) {
NV12Scale(src_y, src_stride_y, src_uv, src_stride_uv, src_width, src_height,
dst_y_opt, dst_stride_y, dst_uv_opt, dst_stride_uv, dst_width,
dst_height, f);
}
opt_time = (get_time() - opt_time) / benchmark_iterations; // Report performance of C vs OPT.
printf("filter %d - %8d us C - %8d us OPT\n", f, static_cast<int>(c_time * 1e6), static_cast<int>(opt_time * 1e6));
// C version may be a little off from the optimized. Order of // operations may introduce rounding somewhere. So do a difference // of the buffers and look to see that the max difference is not // over 3. int max_diff = 0; for (i = 0; i < (dst_height); ++i) { for (j = 0; j < (dst_width); ++j) { int abs_diff = Abs(dst_y_c[(i * dst_stride_y) + j] -
dst_y_opt[(i * dst_stride_y) + j]); if (abs_diff > max_diff) {
max_diff = abs_diff;
}
}
}
for (i = 0; i < (dst_height_uv); ++i) { for (j = 0; j < (dst_width_uv * 2); ++j) { int abs_diff = Abs(dst_uv_c[(i * dst_stride_uv) + j] -
dst_uv_opt[(i * dst_stride_uv) + j]); if (abs_diff > max_diff) {
max_diff = abs_diff;
}
}
}
// The following adjustments in dimensions ensure the scale factor will be // exactly achieved. // 2 is chroma subsample. #define DX(x, nom, denom) static_cast<int>(((Abs(x) / nom + 1) / 2) * nom * 2) #define SX(x, nom, denom) static_cast<int>(((x / nom + 1) / 2) * denom * 2)
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.