X-Git-Url: http://git.cinelerra-gg.org/git/?a=blobdiff_plain;f=cinelerra-5.1%2Fplugins%2Fdeinterlace%2Fdeinterlace.C;fp=cinelerra-5.1%2Fplugins%2Fdeinterlace%2Fdeinterlace.C;h=028d90db865d7e202d1c9ffa90ddf8a46a4a97a3;hb=af44bff549c39ac8bb6e42a791e7a211e1013526;hp=850959e3183130dbceebe77105f84f99d4dfe8f5;hpb=88d056e4f1b0a9fd692bbfb34262dd05359c4d9c;p=goodguy%2Fhistory.git diff --git a/cinelerra-5.1/plugins/deinterlace/deinterlace.C b/cinelerra-5.1/plugins/deinterlace/deinterlace.C index 850959e3..028d90db 100644 --- a/cinelerra-5.1/plugins/deinterlace/deinterlace.C +++ b/cinelerra-5.1/plugins/deinterlace/deinterlace.C @@ -28,23 +28,12 @@ #include "language.h" #include "vframe.h" - - - - - - - - #include #include REGISTER_PLUGIN(DeInterlaceMain) - - - DeInterlaceConfig::DeInterlaceConfig() { mode = DEINTERLACE_EVEN; @@ -456,63 +445,62 @@ int DeInterlaceMain::handle_opengl() get_output()->enable_opengl(); get_output()->init_screen(); - const char *shader_stack[] = { 0, 0, 0 }; - shader_stack[0] = head_frag; + if( config.mode != DEINTERLACE_NONE ) { + const char *shader_stack[16]; + memset(shader_stack,0, sizeof(shader_stack)); + int current_shader = 0; - float double_line_h = 2.0 / get_output()->get_texture_h(); - float line_h = 1.0 / get_output()->get_texture_h(); - float y_offset = 0.0; - switch(config.mode) - { + shader_stack[current_shader++] = head_frag; + + float double_line_h = 2.0 / get_output()->get_texture_h(); + float line_h = 1.0 / get_output()->get_texture_h(); + float y_offset = 0.0; + const char *shader_frag = 0; + + switch(config.mode) { case DEINTERLACE_EVEN: - shader_stack[1] = line_double_frag; + shader_frag = line_double_frag; break; case DEINTERLACE_ODD: - shader_stack[1] = line_double_frag; + shader_frag = line_double_frag; y_offset += 1.0; break; case DEINTERLACE_AVG: - shader_stack[1] = line_avg_frag; + shader_frag = line_avg_frag; break; case DEINTERLACE_AVG_EVEN: - shader_stack[1] = field_avg_frag; + shader_frag = field_avg_frag; break; case DEINTERLACE_AVG_ODD: - shader_stack[1] = field_avg_frag; + shader_frag = field_avg_frag; y_offset += 1.0; break; case DEINTERLACE_SWAP_EVEN: - shader_stack[1] = line_swap_frag; + shader_frag = line_swap_frag; break; case DEINTERLACE_SWAP_ODD: - shader_stack[1] = line_swap_frag; + shader_frag = line_swap_frag; y_offset += 1.0; break; - } - - y_offset /= get_output()->get_texture_h(); - - shader_stack[2] = tail_frag; - - if(config.mode != DEINTERLACE_NONE) - { - unsigned int frag = VFrame::make_shader(0, - shader_stack[0], - shader_stack[1], - shader_stack[2], - 0); - if(frag) - { - glUseProgram(frag); - glUniform1i(glGetUniformLocation(frag, "tex"), 0); - glUniform1f(glGetUniformLocation(frag, "line_h"), line_h); - glUniform1f(glGetUniformLocation(frag, "double_line_h"), double_line_h); - glUniform1f(glGetUniformLocation(frag, "y_offset"), y_offset); + } + if( shader_frag ) + shader_stack[current_shader++] = shader_frag; + + shader_stack[current_shader++] = tail_frag; + shader_stack[current_shader] = 0; + unsigned int shader = VFrame::make_shader(shader_stack); + if( shader > 0 ) { + y_offset /= get_output()->get_texture_h(); + glUseProgram(shader); + glUniform1i(glGetUniformLocation(shader, "tex"), 0); + glUniform1f(glGetUniformLocation(shader, "line_h"), line_h); + glUniform1f(glGetUniformLocation(shader, "double_line_h"), double_line_h); + glUniform1f(glGetUniformLocation(shader, "y_offset"), y_offset); } }