X-Git-Url: https://git.cinelerra-gg.org/git/?a=blobdiff_plain;f=cinelerra-5.1%2Fplugins%2Fframefield%2Fframefield.C;h=b29d3f03818c77772dcd4c97161e98c0a90d1e4d;hb=a0f90514d89589e1136ce90eda493c9545b8f10b;hp=7f0706587dc6490f32913248ff268b178191559d;hpb=21c2e6b36d6a96c2f662a89459d607b5a387f4eb;p=goodguy%2Fhistory.git diff --git a/cinelerra-5.1/plugins/framefield/framefield.C b/cinelerra-5.1/plugins/framefield/framefield.C index 7f070658..b29d3f03 100644 --- a/cinelerra-5.1/plugins/framefield/framefield.C +++ b/cinelerra-5.1/plugins/framefield/framefield.C @@ -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) @@ -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();