int ColorBalanceMain::handle_opengl() { #ifdef HAVE_GL get_output()->to_texture(); get_output()->enable_opengl(); unsigned int shader = 0; const char *shader_stack[] = { 0, 0, 0, 0, 0, 0, 0, 0 }; int current_shader = 0; int aggregate_interpolate = 0; int aggregate_gamma = 0; get_aggregation(&aggregate_interpolate, &aggregate_gamma); //printf("ColorBalanceMain::handle_opengl %d %d\n", aggregate_interpolate, aggregate_gamma); if(aggregate_interpolate) INTERPOLATE_COMPILE(shader_stack, current_shader) if(aggregate_gamma) GAMMA_COMPILE(shader_stack, current_shader, aggregate_interpolate) COLORBALANCE_COMPILE(shader_stack, current_shader, aggregate_gamma || aggregate_interpolate) shader = VFrame::make_shader(0, shader_stack[0], shader_stack[1], shader_stack[2], shader_stack[3], shader_stack[4], shader_stack[5], shader_stack[6], shader_stack[7], 0); if(shader > 0) { glUseProgram(shader); glUniform1i(glGetUniformLocation(shader, "tex"), 0); if(aggregate_interpolate) INTERPOLATE_UNIFORMS(shader); if(aggregate_gamma) GAMMA_UNIFORMS(shader); COLORBALANCE_UNIFORMS(shader); } get_output()->init_screen(); get_output()->bind_texture(0); get_output()->draw_texture(); glUseProgram(0); get_output()->set_opengl_state(VFrame::SCREEN); #endif return 0; }
int Color3WayMain::process_buffer(VFrame *frame, int64_t start_position, double frame_rate) { need_reconfigure |= load_configuration(); if(!engine) engine = new Color3WayEngine(this, // 1); PluginClient::smp + 1); //printf("Color3WayMain::process_realtime 1 %d\n", need_reconfigure); if(need_reconfigure) { reconfigure(); need_reconfigure = 0; } read_frame(frame, 0, get_source_position(), get_framerate(), get_use_opengl()); int aggregate_interpolate = 0; int aggregate_gamma = 0; get_aggregation(&aggregate_interpolate, &aggregate_gamma); engine->process_packages(); return 0; }
int ColorBalanceMain::process_buffer(VFrame *frame, int64_t start_position, double frame_rate) { need_reconfigure |= load_configuration(); //printf("ColorBalanceMain::process_realtime 1 %d\n", need_reconfigure); if(need_reconfigure) { if(!engine) { total_engines = PluginClient::smp + 1; engine = new ColorBalanceEngine*[total_engines]; for(int i = 0; i < total_engines; i++) { engine[i] = new ColorBalanceEngine(this); engine[i]->start(); } } reconfigure(); need_reconfigure = 0; } frame->get_params()->update("COLORBALANCE_PRESERVE", config.preserve); frame->get_params()->update("COLORBALANCE_CYAN", calculate_transfer(config.cyan)); frame->get_params()->update("COLORBALANCE_MAGENTA", calculate_transfer(config.magenta)); frame->get_params()->update("COLORBALANCE_YELLOW", calculate_transfer(config.yellow)); read_frame(frame, 0, get_source_position(), get_framerate(), get_use_opengl()); int aggregate_interpolate = 0; int aggregate_gamma = 0; get_aggregation(&aggregate_interpolate, &aggregate_gamma); if(!EQUIV(config.cyan, 0) || !EQUIV(config.magenta, 0) || !EQUIV(config.yellow, 0) || (get_use_opengl() && (aggregate_interpolate || aggregate_gamma))) { if(get_use_opengl()) { //get_output()->dump_stacks(); // Aggregate if(next_effect_is("Histogram")) return 0; return run_opengl(); } for(int i = 0; i < total_engines; i++) { engine[i]->start_process_frame(frame, frame, frame->get_h() * i / total_engines, frame->get_h() * (i + 1) / total_engines); } for(int i = 0; i < total_engines; i++) { engine[i]->wait_process_frame(); } } return 0; }