dynamic keyframes, textbox rework, andrea ffmpeg.opts, perpetual chkpt undo, lv2...
[goodguy/history.git] / cinelerra-5.1 / plugins / framefield / framefield.C
index 7f0706587dc6490f32913248ff268b178191559d..314ab2b2bb6e8fb02018e133a9e84291d39108a3 100644 (file)
@@ -351,12 +351,8 @@ int FrameField::process_buffer(VFrame *frame,
 
                if(!src_frame)
                {
-                       src_frame = new VFrame(0,
-                               -1,
-                               frame->get_w(),
-                               frame->get_h(),
-                               frame->get_color_model(),
-                               -1);
+                       src_frame = new VFrame(frame->get_w(), frame->get_h(),
+                               frame->get_color_model(), 0);
                }
                ptr = src_frame;
        }
@@ -563,7 +559,7 @@ void FrameField::average_rows(int offset, VFrame *frame)
 
 
 
-const char* FrameField::plugin_title() { return _("Frames to fields"); }
+const char* FrameField::plugin_title() { return N_("Frames to fields"); }
 int FrameField::is_realtime() { return 1; }
 
 NEW_WINDOW_MACRO(FrameField, FrameFieldWindow)
@@ -585,7 +581,7 @@ void FrameField::save_data(KeyFrame *keyframe)
        FileXML output;
 
 // cause data to be stored directly in text
-       output.set_shared_output(keyframe->get_data(), MESSAGESIZE);
+       output.set_shared_output(keyframe->xbuf);
        output.tag.set_title("FRAME_FIELD");
        output.tag.set_property("DOMINANCE", config.field_dominance);
        output.append_tag();
@@ -599,7 +595,7 @@ void FrameField::read_data(KeyFrame *keyframe)
 {
        FileXML input;
 
-       input.set_shared_input(keyframe->get_data(), strlen(keyframe->get_data()));
+       input.set_shared_input(keyframe->xbuf);
 
        while(!input.read_tag())
        {
@@ -722,7 +718,6 @@ int FrameField::handle_opengl()
                get_output()->enable_opengl();
        }
 
-       unsigned int frag = 0;
        float y_offset = 0.0;
        if(field_number == 0)
        {
@@ -742,49 +737,40 @@ int FrameField::handle_opengl()
                get_output()->get_h(),
                get_output()->get_color_model());
 
+       const char *shader_stack[16];
+       memset(shader_stack,0, sizeof(shader_stack));
+       int current_shader = 0;
 
-       const char *shaders[3] = { 0, 0, 0 };
-       shaders[0] = field_frag;
-
+       shader_stack[current_shader++] = field_frag;
 
 // Aggregate with other effect
 //printf("FrameField::handle_opengl %s\n", get_output()->get_next_effect());
-       if(aggregate_rgb601)
-       {
-               if(rgb601_direction == 1)
-               {
-                       if(BC_CModels::is_yuv(get_output()->get_color_model()))
-                               shaders[1] = yuv_to_601_frag;
-                       else
-                               shaders[1] = rgb_to_601_frag;
-               }
-               else
-               if(rgb601_direction == 2)
-               {
-                       if(BC_CModels::is_yuv(get_output()->get_color_model()))
-                               shaders[1] = _601_to_yuv_frag;
-                       else
-                               shaders[1] = _601_to_rgb_frag;
+       if( aggregate_rgb601 ) {
+               switch( rgb601_direction ) {
+               case 1:
+                       shader_stack[current_shader++] =
+                               BC_CModels::is_yuv(get_output()->get_color_model()) ?
+                                        yuv_to_601_frag : rgb_to_601_frag;
+                       break;
+               case 2:
+                       shader_stack[current_shader++] =
+                               BC_CModels::is_yuv(get_output()->get_color_model()) ?
+                                       _601_to_yuv_frag : _601_to_rgb_frag;
+                       break;
                }
        }
 
-
-
-       frag = VFrame::make_shader(0, shaders[0], shaders[1], shaders[2], 0);
-
-
-       if(frag)
-       {
-               glUseProgram(frag);
-               glUniform1i(glGetUniformLocation(frag, "tex"), 0);
-               glUniform1f(glGetUniformLocation(frag, "double_line_h"),
+       shader_stack[current_shader] = 0;
+       unsigned int shader = VFrame::make_shader(shader_stack);
+       if( shader > 0 ) {
+               glUseProgram(shader);
+               glUniform1i(glGetUniformLocation(shader, "tex"), 0);
+               glUniform1f(glGetUniformLocation(shader, "double_line_h"),
                        2.0 / src_texture->get_texture_h());
-               glUniform1f(glGetUniformLocation(frag, "y_offset"),
+               glUniform1f(glGetUniformLocation(shader, "y_offset"),
                        y_offset / src_texture->get_texture_h());
        }
 
-
-
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
        get_output()->draw_texture();