#ifndef DIFFKEY_H
#define DIFFKEY_H
+#include "bccolors.h"
#include "bcdisplayinfo.h"
#include "clip.h"
#include "bchash.h"
#include "guicast.h"
#include "language.h"
#include "loadbalance.h"
-#include "cicolors.h"
+#include "bccolors.h"
#include "pluginvclient.h"
-
+#include "playback3d.h"
#include <string.h>
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; }
" 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"
" 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)
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;
}
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) \