4 * Copyright (C) 2008 Adam Williams <broadcast at earthling dot net>
5 * Copyright (C) 2003-2016 Cinelerra CV contributors
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; either version 2 of the License, or
10 * (at your option) any later version.
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
17 * You should have received a copy of the GNU General Public License
18 * along with this program; if not, write to the Free Software
19 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
23 #include "bcsignals.h"
25 #include "edlsession.h"
26 #include "pluginserver.h"
27 #include "pluginvclient.h"
32 PluginVClient::PluginVClient(PluginServer *server)
33 : PluginClient(server)
42 project_frame_rate = server->edl->session->frame_rate;
43 frame_rate = project_frame_rate;
47 project_frame_rate = 1.0;
48 frame_rate = project_frame_rate;
52 PluginVClient::~PluginVClient()
57 int PluginVClient::is_video()
62 VFrame* PluginVClient::new_temp(int w, int h, int color_model)
65 (temp->get_w() != w ||
67 temp->get_color_model() != color_model))
75 temp = new VFrame(w, h, color_model, 0);
81 void PluginVClient::age_temp()
84 temp->get_w() > PLUGIN_MAX_W &&
85 temp->get_h() > PLUGIN_MAX_H)
92 VFrame* PluginVClient::get_temp()
97 // Run before every realtime buffer is to be rendered.
98 int PluginVClient::get_render_ptrs()
100 int i, double_buffer, fragment_position;
102 for(i = 0; i < total_in_buffers; i++)
104 double_buffer = double_buffer_in_render.values[i];
105 fragment_position = offset_in_render.values[i];
106 input_ptr_render[i] = &input_ptr_master.values[i][double_buffer][fragment_position];
109 for(i = 0; i < total_out_buffers; i++)
111 double_buffer = double_buffer_out_render.values[i];
112 fragment_position = offset_out_render.values[i];
113 output_ptr_render[i] = &output_ptr_master.values[i][double_buffer][fragment_position];
118 // Run after the non realtime plugin is run.
119 int PluginVClient::delete_nonrealtime_parameters()
123 for(i = 0; i < total_in_buffers; i++)
125 for(j = 0; j < in_buffer_size; j++)
127 delete video_in[i][j];
131 for(i = 0; i < total_out_buffers; i++)
133 for(j = 0; j < out_buffer_size; j++)
135 delete video_out[i][j];
144 int PluginVClient::init_realtime_parameters()
146 project_frame_rate = server->edl->session->frame_rate;
147 project_color_model = server->edl->session->color_model;
148 aspect_w = server->edl->session->aspect_w;
149 aspect_h = server->edl->session->aspect_h;
153 int PluginVClient::process_realtime(VFrame **input,
159 int PluginVClient::process_realtime(VFrame *input,
165 int PluginVClient::process_buffer(VFrame **frame,
166 int64_t start_position,
170 for(int i = 0; i < PluginClient::total_in_buffers; i++)
171 read_frame(frame[i], i, start_position, frame_rate, 0);
172 if(is_multichannel())
173 process_realtime(frame, frame);
177 int PluginVClient::process_buffer(VFrame *frame,
178 int64_t start_position,
181 read_frame(frame, 0, start_position, frame_rate, 0);
182 process_realtime(frame, frame);
187 int PluginVClient::plugin_start_loop(int64_t start,
192 frame_rate = get_project_framerate();
193 return PluginClient::plugin_start_loop(start,
199 int PluginVClient::plugin_get_parameters()
201 frame_rate = get_project_framerate();
202 return PluginClient::plugin_get_parameters();
205 int64_t PluginVClient::local_to_edl(int64_t position)
207 if(position < 0) return position;
208 return (int64_t)Units::round(position *
209 get_project_framerate() /
214 int64_t PluginVClient::edl_to_local(int64_t position)
216 if(position < 0) return position;
217 return (int64_t)Units::round(position *
219 get_project_framerate());
222 int PluginVClient::plugin_process_loop(VFrame **buffers, int64_t &write_length)
226 if(is_multichannel())
227 result = process_loop(buffers);
229 result = process_loop(buffers[0]);
238 int PluginVClient::run_opengl()
240 server->run_opengl(this);
244 int PluginVClient::handle_opengl()
249 VFrame* PluginVClient::get_input(int channel)
251 return input[channel];
254 VFrame* PluginVClient::get_output(int channel)
256 return output[channel];
259 int PluginVClient::next_effect_is(const char *title)
261 return !strcmp(title, output[0]->get_next_effect());
264 int PluginVClient::prev_effect_is(const char *title)
266 return !strcmp(title, output[0]->get_prev_effect());
271 int PluginVClient::read_frame(VFrame *buffer,
273 int64_t start_position)
275 return server->read_frame(buffer,
280 int PluginVClient::read_frame(VFrame *buffer,
281 int64_t start_position)
283 return server->read_frame(buffer,
288 int PluginVClient::read_frame(VFrame *buffer,
290 int64_t start_position,
294 return server->read_frame(buffer,
302 double PluginVClient::get_project_framerate()
304 return project_frame_rate;
307 double PluginVClient::get_framerate()
312 ArrayList<BC_FontEntry*> *PluginVClient::get_fontlist()
314 return BC_Resources::fontlist;
317 BC_FontEntry *PluginVClient::find_fontentry(const char *displayname, int style,
318 int mask, int preferred_style)
320 return BC_Resources::find_fontentry(displayname, style, mask, preferred_style);
323 int PluginVClient::find_font_by_char(FT_ULong char_code, char *path_new, const FT_Face oldface)
325 return BC_Resources::find_font_by_char(char_code, path_new, oldface);
328 int64_t PluginVClient::get_startproject()
330 int64_t pos = server->get_startproject();
331 return pos >= 0 ? pos : 0;
334 int64_t PluginVClient::get_endproject()
336 int64_t pos = server->get_endproject();
337 return pos >= 0 ? pos : get_edl()->get_video_frames();