Merge CV, ver=5.1; ops/methods from HV, and interface from CV where possible
[goodguy/history.git] / cinelerra-5.1 / cinelerra / pluginvclient.C
diff --git a/cinelerra-5.1/cinelerra/pluginvclient.C b/cinelerra-5.1/cinelerra/pluginvclient.C
new file mode 100644 (file)
index 0000000..02de139
--- /dev/null
@@ -0,0 +1,325 @@
+
+/*
+ * CINELERRA
+ * Copyright (C) 2008 Adam Williams <broadcast at earthling dot net>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ */
+
+#include "bcsignals.h"
+#include "edl.h"
+#include "edlsession.h"
+#include "pluginserver.h"
+#include "pluginvclient.h"
+#include "vframe.h"
+
+#include <string.h>
+
+PluginVClient::PluginVClient(PluginServer *server)
+ : PluginClient(server)
+{
+       video_in = 0;
+       video_out = 0;
+       temp = 0;
+       if(server &&
+               server->edl &&
+               server->edl->session)
+       {
+               project_frame_rate = server->edl->session->frame_rate;
+               frame_rate = project_frame_rate;
+       }
+       else
+       {
+               project_frame_rate = 1.0;
+               frame_rate = project_frame_rate;
+       }
+}
+
+PluginVClient::~PluginVClient()
+{
+       if(temp) delete temp;
+}
+
+int PluginVClient::is_video()
+{
+       return 1;
+}
+
+VFrame* PluginVClient::new_temp(int w, int h, int color_model)
+{
+       if(temp &&
+               (temp->get_w() != w ||
+               temp->get_h() != h ||
+               temp->get_color_model() != color_model))
+       {
+               delete temp;
+               temp = 0;
+       }
+
+       if(!temp)
+       {
+               temp = new VFrame(0, -1, w, h, color_model, -1);
+       }
+
+       return temp;
+}
+
+void PluginVClient::age_temp()
+{
+       if(temp &&
+               temp->get_w() > PLUGIN_MAX_W &&
+               temp->get_h() > PLUGIN_MAX_H)
+       {
+               delete temp;
+               temp = 0;
+       }
+}
+
+VFrame* PluginVClient::get_temp()
+{
+       return temp;
+}
+
+// Run before every realtime buffer is to be rendered.
+int PluginVClient::get_render_ptrs()
+{
+       int i, double_buffer, fragment_position;
+
+       for(i = 0; i < total_in_buffers; i++)
+       {
+               double_buffer = double_buffer_in_render.values[i];
+               fragment_position = offset_in_render.values[i];
+               input_ptr_render[i] = &input_ptr_master.values[i][double_buffer][fragment_position];
+       }
+
+       for(i = 0; i < total_out_buffers; i++)
+       {
+               double_buffer = double_buffer_out_render.values[i];
+               fragment_position = offset_out_render.values[i];
+               output_ptr_render[i] = &output_ptr_master.values[i][double_buffer][fragment_position];
+       }
+       return 0;
+}
+
+// Run after the non realtime plugin is run.
+int PluginVClient::delete_nonrealtime_parameters()
+{
+       int i, j;
+
+       for(i = 0; i < total_in_buffers; i++)
+       {
+               for(j = 0; j < in_buffer_size; j++)
+               {
+                       delete video_in[i][j];
+               }
+       }
+
+       for(i = 0; i < total_out_buffers; i++)
+       {
+               for(j = 0; j < out_buffer_size; j++)
+               {
+                       delete video_out[i][j];
+               }
+       }
+       video_in = 0;
+       video_out = 0;
+
+       return 0;
+}
+
+int PluginVClient::init_realtime_parameters()
+{
+       project_frame_rate = server->edl->session->frame_rate;
+       project_color_model = server->edl->session->color_model;
+       aspect_w = server->edl->session->aspect_w;
+       aspect_h = server->edl->session->aspect_h;
+       return 0;
+}
+
+int PluginVClient::process_realtime(VFrame **input,
+       VFrame **output)
+{
+       return 0;
+}
+
+int PluginVClient::process_realtime(VFrame *input,
+       VFrame *output)
+{
+       return 0;
+}
+
+int PluginVClient::process_buffer(VFrame **frame,
+       int64_t start_position,
+       double frame_rate)
+{
+//PRINT_TRACE
+       for(int i = 0; i < PluginClient::total_in_buffers; i++)
+               read_frame(frame[i], i, start_position, frame_rate, 0);
+       if(is_multichannel())
+               process_realtime(frame, frame);
+       return 0;
+}
+
+int PluginVClient::process_buffer(VFrame *frame,
+       int64_t start_position,
+       double frame_rate)
+{
+       read_frame(frame, 0, start_position, frame_rate, 0);
+       process_realtime(frame, frame);
+       return 0;
+}
+
+
+int PluginVClient::plugin_start_loop(int64_t start,
+       int64_t end,
+       int64_t buffer_size,
+       int total_buffers)
+{
+       frame_rate = get_project_framerate();
+       return PluginClient::plugin_start_loop(start,
+               end,
+               buffer_size,
+               total_buffers);
+}
+
+int PluginVClient::plugin_get_parameters()
+{
+       frame_rate = get_project_framerate();
+       return PluginClient::plugin_get_parameters();
+}
+
+int64_t PluginVClient::local_to_edl(int64_t position)
+{
+       if(position < 0) return position;
+       return (int64_t)Units::round(position *
+               get_project_framerate() /
+               frame_rate);
+       return 0;
+}
+
+int64_t PluginVClient::edl_to_local(int64_t position)
+{
+       if(position < 0) return position;
+       return (int64_t)Units::round(position *
+               frame_rate /
+               get_project_framerate());
+}
+
+int PluginVClient::plugin_process_loop(VFrame **buffers, int64_t &write_length)
+{
+       int result = 0;
+
+       if(is_multichannel())
+               result = process_loop(buffers);
+       else
+               result = process_loop(buffers[0]);
+
+
+       write_length = 1;
+
+       return result;
+}
+
+
+int PluginVClient::run_opengl()
+{
+       server->run_opengl(this);
+       return 0;
+}
+
+int PluginVClient::handle_opengl()
+{
+       return 0;
+}
+
+VFrame* PluginVClient::get_input(int channel)
+{
+       return input[channel];
+}
+
+VFrame* PluginVClient::get_output(int channel)
+{
+       return output[channel];
+}
+
+int PluginVClient::next_effect_is(const char *title)
+{
+       return !strcmp(title, output[0]->get_next_effect());
+}
+
+int PluginVClient::prev_effect_is(const char *title)
+{
+       return !strcmp(title, output[0]->get_prev_effect());
+}
+
+
+
+int PluginVClient::read_frame(VFrame *buffer,
+       int channel,
+       int64_t start_position)
+{
+       return server->read_frame(buffer,
+               channel,
+               start_position);
+}
+
+int PluginVClient::read_frame(VFrame *buffer,
+       int64_t start_position)
+{
+       return server->read_frame(buffer,
+               0,
+               start_position);
+}
+
+int PluginVClient::read_frame(VFrame *buffer,
+               int channel,
+               int64_t start_position,
+               double frame_rate,
+               int use_opengl)
+{
+       return server->read_frame(buffer,
+               channel,
+               start_position,
+               frame_rate,
+               use_opengl);
+}
+
+
+double PluginVClient::get_project_framerate()
+{
+       return project_frame_rate;
+}
+
+double PluginVClient::get_framerate()
+{
+       return frame_rate;
+}
+
+ArrayList<BC_FontEntry*> *PluginVClient::get_fontlist()
+{
+       return BC_Resources::fontlist;
+}
+
+BC_FontEntry *PluginVClient::find_fontentry(const char *displayname, int style,
+       int mask, int preferred_style)
+{
+       return BC_Resources::find_fontentry(displayname, style, mask, preferred_style);
+}
+
+int PluginVClient::find_font_by_char(FT_ULong char_code, char *path_new, const FT_Face oldface)
+{
+       return BC_Resources::find_font_by_char(char_code, path_new, oldface);
+}