X-Git-Url: http://git.cinelerra-gg.org/git/?a=blobdiff_plain;f=cinelerra-5.1%2Fplugins%2Fdiffkey%2Fdiffkey.C;h=ff8502f0cb8d3a4ad9c5caa386e8dd7d53e96988;hb=c5feedfabe3ee87dfae9a254c9b67c566ec15d2e;hp=118b7f38e8d31585a39c3594a48890061dc43235;hpb=9d832a1fff11b11aaa1108c460690ed05e2bdc05;p=goodguy%2Fhistory.git diff --git a/cinelerra-5.1/plugins/diffkey/diffkey.C b/cinelerra-5.1/plugins/diffkey/diffkey.C index 118b7f38..ff8502f0 100644 --- a/cinelerra-5.1/plugins/diffkey/diffkey.C +++ b/cinelerra-5.1/plugins/diffkey/diffkey.C @@ -22,6 +22,7 @@ #ifndef DIFFKEY_H #define DIFFKEY_H +#include "bccolors.h" #include "bcdisplayinfo.h" #include "clip.h" #include "bchash.h" @@ -31,7 +32,7 @@ #include "loadbalance.h" #include "bccolors.h" #include "pluginvclient.h" - +#include "playback3d.h" #include @@ -326,7 +327,7 @@ DiffKey::~DiffKey() NEW_WINDOW_MACRO(DiffKey, DiffKeyGUI) LOAD_CONFIGURATION_MACRO(DiffKey, DiffKeyConfig) -const char* DiffKey::plugin_title() { return _("Difference key"); } +const char* DiffKey::plugin_title() { return N_("Difference key"); } int DiffKey::is_realtime() { return 1; } int DiffKey::is_multichannel() { return 1; } @@ -450,8 +451,9 @@ int DiffKey::handle_opengl() " float difference = abs(foreground.r - background.r);\n"; static const char *rgb_value = - " float difference = abs(dot(foreground.rgb, vec3(0.29900, 0.58700, 0.11400)) - \n" - " dot(background.rgb, vec3(0.29900, 0.58700, 0.11400)));\n"; + " float difference = abs(" + " dot(foreground.rgb, rgb_to_y_vector) - " + " dot(background.rgb, rgb_to_y_vector));\n"; static const char *diffkey_tail = " vec4 result;\n" @@ -466,59 +468,42 @@ int DiffKey::handle_opengl() " gl_FragColor = result;\n" "}\n"; - - - - - top_frame->enable_opengl(); - top_frame->init_screen(); - top_frame->to_texture(); bottom_frame->to_texture(); top_frame->enable_opengl(); top_frame->init_screen(); - unsigned int shader_id = 0; - if(config.do_value) - { - if(BC_CModels::is_yuv(top_frame->get_color_model())) - shader_id = VFrame::make_shader(0, - diffkey_head, - yuv_value, - diffkey_tail, - 0); - else - shader_id = VFrame::make_shader(0, - diffkey_head, - rgb_value, - diffkey_tail, - 0); - } - else - { - shader_id = VFrame::make_shader(0, - diffkey_head, - colorcube, - diffkey_tail, - 0); - } - - - + const char *shader_stack[16]; + memset(shader_stack,0, sizeof(shader_stack)); + int current_shader = 0; + + int need_rgb_to_y = 0; + const char *shader_frag = !config.do_value ? colorcube : + BC_CModels::is_yuv(top_frame->get_color_model()) ? + yuv_value : (need_rgb_to_y = 1, rgb_value); + if( need_rgb_to_y ) + shader_stack[current_shader++] = bc_gl_rgb_to_y; + shader_stack[current_shader++] = diffkey_head; + shader_stack[current_shader++] = shader_frag; + shader_stack[current_shader++] = diffkey_tail; + + shader_stack[current_shader] = 0; + unsigned int shader = VFrame::make_shader(shader_stack); DIFFKEY_VARS(this) bottom_frame->bind_texture(1); top_frame->bind_texture(0); - if(shader_id > 0) - { - glUseProgram(shader_id); - glUniform1i(glGetUniformLocation(shader_id, "tex_fg"), 0); - glUniform1i(glGetUniformLocation(shader_id, "tex_bg"), 1); - glUniform1f(glGetUniformLocation(shader_id, "threshold"), threshold); - glUniform1f(glGetUniformLocation(shader_id, "pad"), pad); - glUniform1f(glGetUniformLocation(shader_id, "threshold_pad"), threshold_pad); + if( shader > 0 ) { + glUseProgram(shader); + glUniform1i(glGetUniformLocation(shader, "tex_fg"), 0); + glUniform1i(glGetUniformLocation(shader, "tex_bg"), 1); + glUniform1f(glGetUniformLocation(shader, "threshold"), threshold); + glUniform1f(glGetUniformLocation(shader, "pad"), pad); + glUniform1f(glGetUniformLocation(shader, "threshold_pad"), threshold_pad); + if( need_rgb_to_y ) + BC_GL_MATRIX(shader, rgb_to_y_vector); } if(BC_CModels::components(get_output()->get_color_model()) == 3) @@ -531,11 +516,12 @@ int DiffKey::handle_opengl() top_frame->draw_texture(); glUseProgram(0); top_frame->set_opengl_state(VFrame::SCREEN); -// Fastest way to discard output - bottom_frame->set_opengl_state(VFrame::TEXTURE); glDisable(GL_BLEND); +// Fastest way to discard output + bottom_frame->set_opengl_state(VFrame::UNKNOWN); - +// kludge ahead + top_frame->screen_to_ram(); #endif return 0; } @@ -598,8 +584,7 @@ void DiffKeyClient::process_package(LoadPackage *ptr) DiffKey *plugin = engine->plugin; int w = plugin->top_frame->get_w(); -#define RGB_TO_VALUE(r, g, b) \ -((r) * R_TO_Y + (g) * G_TO_Y + (b) * B_TO_Y) +#define RGB_TO_VALUE(r, g, b) YUV::yuv.rgb_to_y_f((r),(g),(b)) #define DIFFKEY_MACRO(type, components, max, chroma_offset) \