From: Steinar H. Gunderson Date: Thu, 17 Sep 2015 18:05:43 +0000 (+0200) Subject: In ResampleEffect, be more aggressive about giving up on saving bilinear samples. X-Git-Tag: 1.2.0~5 X-Git-Url: https://git.sesse.net/?p=movit;a=commitdiff_plain;h=8bb071c7d0f0b03ffd15b3919f4e6afded57d1ea In ResampleEffect, be more aggressive about giving up on saving bilinear samples. It turns out that for some kinds of loads, we can't use bilinearity at all to our benefit, so we spend almost all of our time trying to go through each line to see how much we can save. Simply send in the minimum number so far when doing this evaluation to begin with, which means we'll effectively short-circuit the entire thing pretty fast once we find a line that can save nothing. --- diff --git a/resample_effect.cpp b/resample_effect.cpp index 79d5f21..1b74a96 100644 --- a/resample_effect.cpp +++ b/resample_effect.cpp @@ -161,14 +161,15 @@ unsigned combine_many_samples(const Tap *weights, unsigned src_size, unsi { float num_subtexels = src_size / movit_texel_subpixel_precision; float inv_num_subtexels = movit_texel_subpixel_precision / src_size; - int src_bilinear_samples = 0; - for (unsigned y = 0; y < dst_samples; ++y) { - unsigned num_samples_saved = combine_samples(weights + y * src_samples, NULL, num_subtexels, inv_num_subtexels, src_samples, UINT_MAX); - src_bilinear_samples = max(src_bilinear_samples, src_samples - num_samples_saved); + unsigned max_samples_saved = UINT_MAX; + for (unsigned y = 0; y < dst_samples && max_samples_saved > 0; ++y) { + unsigned num_samples_saved = combine_samples(weights + y * src_samples, NULL, num_subtexels, inv_num_subtexels, src_samples, max_samples_saved); + max_samples_saved = min(max_samples_saved, num_samples_saved); } // Now that we know the right width, actually combine the samples. + unsigned src_bilinear_samples = src_samples - max_samples_saved; *bilinear_weights = new Tap[dst_samples * src_bilinear_samples]; for (unsigned y = 0; y < dst_samples; ++y) { Tap *bilinear_weights_ptr = *bilinear_weights + y * src_bilinear_samples; @@ -178,8 +179,8 @@ unsigned combine_many_samples(const Tap *weights, unsigned src_size, unsi num_subtexels, inv_num_subtexels, src_samples, - src_samples - src_bilinear_samples); - assert(int(src_samples) - int(num_samples_saved) == src_bilinear_samples); + max_samples_saved); + assert(num_samples_saved == max_samples_saved); normalize_sum(bilinear_weights_ptr, src_bilinear_samples); } return src_bilinear_samples;