edl plugin names eng, fix segv for opengl brender, renderfarm rework strategy, perf...
[goodguy/history.git] / cinelerra-5.1 / plugins / chromakey / chromakey.C
index 8618d03b605c2922c2539835bb7a042f216cd3ef..ef546b294c83bc3217ae812267e520432525a494 100644 (file)
@@ -19,6 +19,7 @@
  *
  */
 
+#include "bccolors.h"
 #include "bcdisplayinfo.h"
 #include "bcsignals.h"
 #include "chromakey.h"
@@ -30,7 +31,7 @@
 #include "language.h"
 #include "loadbalance.h"
 #include "playback3d.h"
-#include "cicolors.h"
+#include "bccolors.h"
 #include "pluginvclient.h"
 #include "vframe.h"
 
 
 
 
+ChromaKeyConfig::ChromaKeyConfig()
+{
+       reset();
+}
 
+void ChromaKeyConfig::reset()
 
-ChromaKeyConfig::ChromaKeyConfig()
 {
        red = 0.0;
        green = 0.0;
@@ -147,6 +152,9 @@ void ChromaKeyWindow::create_objects()
        y += 30;
        add_subwindow(use_colorpicker = new ChromaKeyUseColorPicker(plugin, this, x1, y));
 
+       y += use_colorpicker->get_h() + 10;
+       add_subwindow(new ChromaKeyReset(plugin, this, x, y));
+
        color_thread = new ChromaKeyColorThread(plugin, this);
 
        update_sample();
@@ -169,6 +177,11 @@ void ChromaKeyWindow::update_sample()
        sample->flash();
 }
 
+void ChromaKeyWindow::done_event(int result)
+{
+       color_thread->close_window();
+}
+
 
 
 
@@ -241,7 +254,6 @@ int ChromaKeySlope::handle_event()
        return 1;
 }
 
-
 ChromaKeyUseValue::ChromaKeyUseValue(ChromaKey *plugin, int x, int y)
  : BC_CheckBox(x, y, plugin->config.use_value, _("Use value"))
 {
@@ -254,6 +266,20 @@ int ChromaKeyUseValue::handle_event()
        return 1;
 }
 
+ChromaKeyReset::ChromaKeyReset(ChromaKey *plugin, ChromaKeyWindow *gui, int x, int y)
+ : BC_GenericButton(x, y, _("Reset"))
+{
+       this->plugin = plugin;
+       this->gui = gui;
+}
+
+int ChromaKeyReset::handle_event()
+{
+       plugin->config.reset();
+       gui->update_gui();
+       plugin->send_configure_change();
+       return 1;
+}
 
 ChromaKeyUseColorPicker::ChromaKeyUseColorPicker(ChromaKey *plugin,
        ChromaKeyWindow *gui,
@@ -279,7 +305,7 @@ int ChromaKeyUseColorPicker::handle_event()
 
 
 ChromaKeyColorThread::ChromaKeyColorThread(ChromaKey *plugin, ChromaKeyWindow *gui)
- : ColorThread(1, _("Inner color"))
+ : ColorPicker(1, _("Inner color"))
 {
        this->plugin = plugin;
        this->gui = gui;
@@ -359,12 +385,9 @@ void ChromaKeyUnit::process_package(LoadPackage *package)
        //float max_hue = h + plugin->config.threshold * 360 / 100;
 
 
-#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 OUTER_VARIABLES(plugin) \
-       YUV yuv; \
        float value = RGB_TO_VALUE(plugin->config.red, \
                plugin->config.green, \
                plugin->config.blue); \
@@ -375,7 +398,9 @@ void ChromaKeyUnit::process_package(LoadPackage *package)
        float g_key = plugin->config.green; \
        float b_key = plugin->config.blue; \
        int y_key, u_key, v_key; \
-       yuv.rgb_to_yuv_8((int)(r_key * 0xff), (int)(g_key * 0xff), (int)(b_key * 0xff), y_key, u_key, v_key); \
+       YUV::yuv.rgb_to_yuv_8( \
+               (int)(r_key * 0xff), (int)(g_key * 0xff), (int)(b_key * 0xff), \
+               y_key, u_key, v_key); \
        float run = plugin->config.slope / 100; \
        float threshold_run = threshold + run;
 
@@ -571,7 +596,7 @@ SET_TRACE
        return 1;
 }
 
-const char* ChromaKey::plugin_title() { return _("Chroma key"); }
+const char* ChromaKey::plugin_title() { return N_("Chroma key"); }
 int ChromaKey::is_realtime() { return 1; }
 
 NEW_WINDOW_MACRO(ChromaKey, ChromaKeyWindow)
@@ -625,15 +650,20 @@ void ChromaKey::update_gui()
        {
                load_configuration();
                thread->window->lock_window();
-               ((ChromaKeyWindow*)thread->window)->threshold->update(config.threshold);
-               ((ChromaKeyWindow*)thread->window)->slope->update(config.slope);
-               ((ChromaKeyWindow*)thread->window)->use_value->update(config.use_value);
-               ((ChromaKeyWindow*)thread->window)->update_sample();
-
+               ((ChromaKeyWindow *)(thread->window))->update_gui();
                thread->window->unlock_window();
        }
 }
 
+void ChromaKeyWindow::update_gui()
+{
+       ChromaKeyConfig &config = plugin->config;
+       threshold->update(config.threshold);
+       slope->update(config.slope);
+       use_value->update(config.use_value);
+       update_sample();
+}
+
 int ChromaKey::handle_opengl()
 {
 #ifdef HAVE_GL
@@ -657,9 +687,11 @@ int ChromaKey::handle_opengl()
                "}\n";
 
        static const char *get_rgbvalue_frag =
+               "uniform vec3 rgb_to_y_vector;\n"
+               "uniform float yminf;\n"
                "float get_value(vec4 color)\n"
                "{\n"
-               "       return dot(color.rgb, vec3(0.29900, 0.58700, 0.11400));\n"
+               "       return dot(color.rgb, rgb_to_y_vector) + yminf;\n"
                "}\n";
 
        static const char *value_frag =
@@ -703,64 +735,56 @@ int ChromaKey::handle_opengl()
        get_output()->to_texture();
        get_output()->enable_opengl();
        get_output()->init_screen();
-       const char *shader_stack[] = { 0, 0, 0, 0, 0 };
-       int current_shader = 0;
 
+        const char *shader_stack[16];
+        memset(shader_stack,0, sizeof(shader_stack));
+        int current_shader = 0;
        shader_stack[current_shader++] = uniform_frag;
-       switch(get_output()->get_color_model())
-       {
-               case BC_YUV888:
-               case BC_YUVA8888:
-                       if(config.use_value)
-                       {
-                               shader_stack[current_shader++] = get_yuvvalue_frag;
-                               shader_stack[current_shader++] = value_frag;
-                       }
-                       else
-                       {
-                               shader_stack[current_shader++] = cube_frag;
-                       }
-                       break;
 
-               default:
-                       if(config.use_value)
-                       {
-                               shader_stack[current_shader++] = get_rgbvalue_frag;
-                               shader_stack[current_shader++] = value_frag;
-                       }
-                       else
-                       {
-                               shader_stack[current_shader++] = cube_frag;
-                       }
-                       break;
+       switch(get_output()->get_color_model()) {
+       case BC_YUV888:
+       case BC_YUVA8888:
+               if( config.use_value ) {
+                       shader_stack[current_shader++] = get_yuvvalue_frag;
+                       shader_stack[current_shader++] = value_frag;
+               }
+               else {
+                       shader_stack[current_shader++] = cube_frag;
+               }
+               break;
+
+       default:
+               if(config.use_value) {
+                       shader_stack[current_shader++] = get_rgbvalue_frag;
+                       shader_stack[current_shader++] = value_frag;
+               }
+               else {
+                       shader_stack[current_shader++] = cube_frag;
+               }
+               break;
        }
 SET_TRACE
 
-       unsigned int frag = VFrame::make_shader(0,
-               shader_stack[0],
-               shader_stack[1],
-               shader_stack[2],
-               shader_stack[3],
-               0);
-       get_output()->bind_texture(0);
-
-       if(frag)
-       {
-               glUseProgram(frag);
-               glUniform1i(glGetUniformLocation(frag, "tex"), 0);
-               glUniform1f(glGetUniformLocation(frag, "min_v"), min_v);
-               glUniform1f(glGetUniformLocation(frag, "max_v"), max_v);
-               glUniform1f(glGetUniformLocation(frag, "run"), run);
-               glUniform1f(glGetUniformLocation(frag, "threshold"), threshold);
-               glUniform1f(glGetUniformLocation(frag, "threshold_run"), threshold_run);
+       shader_stack[current_shader] = 0;
+       unsigned int shader = VFrame::make_shader(shader_stack);
+       if( shader > 0 ) {
+               get_output()->bind_texture(0);
+               glUseProgram(shader);
+               glUniform1i(glGetUniformLocation(shader, "tex"), 0);
+               glUniform1f(glGetUniformLocation(shader, "min_v"), min_v);
+               glUniform1f(glGetUniformLocation(shader, "max_v"), max_v);
+               glUniform1f(glGetUniformLocation(shader, "run"), run);
+               glUniform1f(glGetUniformLocation(shader, "threshold"), threshold);
+               glUniform1f(glGetUniformLocation(shader, "threshold_run"), threshold_run);
                if(get_output()->get_color_model() != BC_YUV888 &&
                        get_output()->get_color_model() != BC_YUVA8888)
-                       glUniform3f(glGetUniformLocation(frag, "key"),
+                       glUniform3f(glGetUniformLocation(shader, "key"),
                                r_key, g_key, b_key);
                else
-                       glUniform3f(glGetUniformLocation(frag, "key"),
+                       glUniform3f(glGetUniformLocation(shader, "key"),
                                (float)y_key / 0xff, (float)u_key / 0xff, (float)v_key / 0xff);
-
+               if(config.use_value)
+                       BC_GL_RGB_TO_Y(shader);
        }
 SET_TRACE