X-Git-Url: http://git.cinelerra-gg.org/git/?a=blobdiff_plain;f=cinelerra-5.0%2Fplugins%2Finterpolate%2Finterpolate.C;h=0c63ad0d9c9f9c432135bb779ec02ae45b92f459;hb=310cfd249d955850c39757d80e07949ad4fef205;hp=0b1bce1f3d83bd876c1e43cb48d4a8214b327a7e;hpb=94e8dc2b306135e7735b2618a54f0f7de7ac7a0c;p=goodguy%2Fhistory.git diff --git a/cinelerra-5.0/plugins/interpolate/interpolate.C b/cinelerra-5.0/plugins/interpolate/interpolate.C index 0b1bce1f..0c63ad0d 100644 --- a/cinelerra-5.0/plugins/interpolate/interpolate.C +++ b/cinelerra-5.0/plugins/interpolate/interpolate.C @@ -21,7 +21,7 @@ #include "bcdisplayinfo.h" #include "clip.h" -#include "colormodels.h" +#include "bccmodels.h" #include "filexml.h" #include "aggregated.h" #include "language.h" @@ -157,13 +157,13 @@ void InterpolatePixelsConfig::interpolate(InterpolatePixelsConfig &prev, InterpolatePixelsMain::InterpolatePixelsMain(PluginServer *server) : PluginVClient(server) { - + out_temp = out_frame = 0; engine = 0; } InterpolatePixelsMain::~InterpolatePixelsMain() { - + delete out_temp; delete engine; } @@ -229,8 +229,6 @@ void InterpolatePixelsMain::read_data(KeyFrame *keyframe) } } - - int InterpolatePixelsMain::process_buffer(VFrame *frame, int64_t start_position, double frame_rate) @@ -260,20 +258,53 @@ int InterpolatePixelsMain::process_buffer(VFrame *frame, return run_opengl(); } - - if(get_output()->get_color_model() != BC_RGB_FLOAT && - get_output()->get_color_model() != BC_RGBA_FLOAT) - { - printf("InterpolatePixelsMain::process_buffer: only supports float colormodels\n"); - return 1; + int color_model = frame->get_color_model(); + int active_model = BC_CModels::has_alpha(color_model) ? + BC_RGBA_FLOAT : BC_RGB_FLOAT; + new_temp(frame->get_w(), frame->get_h(), active_model); + get_temp()->transfer_from(frame); + + out_frame = get_output(); + color_model = out_frame->get_color_model(); + active_model = BC_CModels::has_alpha(color_model) ? + BC_RGBA_FLOAT : BC_RGB_FLOAT; + if( active_model != color_model ) { + int w = out_frame->get_w(), h = out_frame->get_h(); + if( out_temp && ( out_temp->get_color_model() != active_model || + out_temp->get_w() != w || out_temp->get_w() != h ) ) { + delete out_temp; out_temp = 0; + } + if( !out_temp ) + out_temp = new VFrame(0, -1, w, h, active_model, -1); + out_frame = out_temp; } - new_temp(frame->get_w(), frame->get_h(), frame->get_color_model()); - get_temp()->copy_from(frame); if(!engine) engine = new InterpolatePixelsEngine(this); engine->process_packages(); + if( out_frame != get_output() ) { + if( BC_CModels::has_alpha(out_frame->get_color_model()) ) { + unsigned char **out_rows = out_frame->get_rows(); + int w = out_frame->get_w(), h = out_frame->get_h(); + if( BC_CModels::has_alpha(get_temp()->get_color_model()) ) { + unsigned char **in_rows = get_temp()->get_rows(); + for( int y=0; ytransfer_from(out_frame); + } + return 0; } @@ -362,7 +393,7 @@ void InterpolatePixelsUnit::process_package(LoadPackage *package) int pattern_offset_y = plugin->config.y; int y1 = pkg->y1; int y2 = pkg->y2; - int components = cmodel_components(plugin->get_output()->get_color_model()); + int components = BC_CModels::components(plugin->out_frame->get_color_model()); float color_matrix[9]; memcpy(color_matrix, server->color_matrix, sizeof(color_matrix)); @@ -376,7 +407,7 @@ void InterpolatePixelsUnit::process_package(LoadPackage *package) float *prev_row = (float*)plugin->get_temp()->get_rows()[i - 1]; float *current_row = (float*)plugin->get_temp()->get_rows()[i]; float *next_row = (float*)plugin->get_temp()->get_rows()[i + 1]; - float *out_row = (float*)plugin->get_output()->get_rows()[i]; + float *out_row = (float*)plugin->out_frame->get_rows()[i]; prev_row += components; current_row += components; @@ -475,6 +506,8 @@ InterpolatePixelsEngine::InterpolatePixelsEngine(InterpolatePixelsMain *plugin) void InterpolatePixelsEngine::init_packages() { + for( int i=0; i<9; ++i ) color_matrix[i] = 0; + for( int i=0; i<3; ++i ) color_matrix[i*3 + i] = 1; char string[BCTEXTLEN]; string[0] = 0; plugin->get_output()->get_params()->get("DCRAW_MATRIX", string);