X-Git-Url: https://git.sesse.net/?p=movit;a=blobdiff_plain;f=resample_effect.cpp;h=600b939ace7107b3db9fc7295ef4b13655b5a41e;hp=a176074ad9ced7344a368e9257a8c3b2ccb088a1;hb=29072985d0a00a53e5b578a1444cee61a0c9e1f2;hpb=1a06994ccdeedba95a1bdd2c3c12bb54a7a897f9 diff --git a/resample_effect.cpp b/resample_effect.cpp index a176074..600b939 100644 --- a/resample_effect.cpp +++ b/resample_effect.cpp @@ -3,11 +3,11 @@ #include #include +#include #include "resample_effect.h" #include "effect_chain.h" #include "util.h" -#include "opengl.h" namespace { @@ -54,6 +54,7 @@ unsigned combine_samples(float *src, float *dst, unsigned num_src_samples, unsig // Last sample; cannot combine. continue; } + assert(num_samples_saved <= max_samples_saved); if (num_samples_saved == max_samples_saved) { // We could maybe save more here, but other rows can't, so don't bother. continue; @@ -70,8 +71,17 @@ unsigned combine_samples(float *src, float *dst, unsigned num_src_samples, unsig float pos2 = src[(i + 1) * 2 + 1]; assert(pos2 > pos1); - float offset, total_weight; - combine_two_samples(w1, w2, &offset, &total_weight); + float offset, total_weight, sum_sq_error; + combine_two_samples(w1, w2, &offset, &total_weight, &sum_sq_error); + + // If the interpolation error is larger than that of about sqrt(2) of + // a level at 8-bit precision, don't combine. (You'd think 1.0 was enough, + // but since the artifacts are not really random, they can get quite + // visible. On the other hand, going to 0.25f, I can see no change at + // all with 8-bit output, so it would not seem to be worth it.) + if (sum_sq_error > 0.5f / (256.0f * 256.0f)) { + continue; + } // OK, we can combine this and the next sample. if (dst != NULL) { @@ -96,9 +106,9 @@ ResampleEffect::ResampleEffect() // The first blur pass will forward resolution information to us. hpass = new SingleResamplePassEffect(this); - hpass->set_int("direction", SingleResamplePassEffect::HORIZONTAL); + CHECK(hpass->set_int("direction", SingleResamplePassEffect::HORIZONTAL)); vpass = new SingleResamplePassEffect(NULL); - vpass->set_int("direction", SingleResamplePassEffect::VERTICAL); + CHECK(vpass->set_int("direction", SingleResamplePassEffect::VERTICAL)); update_size(); } @@ -327,7 +337,7 @@ void SingleResamplePassEffect::update_texture(GLuint glsl_program_num, const std check_error(); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); check_error(); - glTexImage2D(GL_TEXTURE_2D, 0, GL_RG32F, src_bilinear_samples, dst_samples, 0, GL_RG, GL_FLOAT, bilinear_weights); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RG16F, src_bilinear_samples, dst_samples, 0, GL_RG, GL_FLOAT, bilinear_weights); check_error(); delete[] weights;