4 * Copyright (C) 2008 Adam Williams <broadcast at earthling dot net>
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write to the Free Software
18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
23 #include "edlsession.h"
24 #include "pluginserver.h"
25 #include "pluginvclient.h"
30 PluginVClient::PluginVClient(PluginServer *server)
31 : PluginClient(server)
40 project_frame_rate = server->edl->session->frame_rate;
41 frame_rate = project_frame_rate;
45 project_frame_rate = 1.0;
46 frame_rate = project_frame_rate;
50 PluginVClient::~PluginVClient()
55 int PluginVClient::is_video()
60 VFrame* PluginVClient::new_temp(int w, int h, int color_model)
63 (temp->get_w() != w ||
65 temp->get_color_model() != color_model))
73 temp = new VFrame(0, -1, w, h, color_model, -1);
79 void PluginVClient::age_temp()
82 temp->get_w() > PLUGIN_MAX_W &&
83 temp->get_h() > PLUGIN_MAX_H)
90 VFrame* PluginVClient::get_temp()
95 // Run before every realtime buffer is to be rendered.
96 int PluginVClient::get_render_ptrs()
98 int i, double_buffer, fragment_position;
100 for(i = 0; i < total_in_buffers; i++)
102 double_buffer = double_buffer_in_render.values[i];
103 fragment_position = offset_in_render.values[i];
104 input_ptr_render[i] = &input_ptr_master.values[i][double_buffer][fragment_position];
107 for(i = 0; i < total_out_buffers; i++)
109 double_buffer = double_buffer_out_render.values[i];
110 fragment_position = offset_out_render.values[i];
111 output_ptr_render[i] = &output_ptr_master.values[i][double_buffer][fragment_position];
116 // Run after the non realtime plugin is run.
117 int PluginVClient::delete_nonrealtime_parameters()
121 for(i = 0; i < total_in_buffers; i++)
123 for(j = 0; j < in_buffer_size; j++)
125 delete video_in[i][j];
129 for(i = 0; i < total_out_buffers; i++)
131 for(j = 0; j < out_buffer_size; j++)
133 delete video_out[i][j];
142 int PluginVClient::init_realtime_parameters()
144 project_frame_rate = server->edl->session->frame_rate;
145 project_color_model = server->edl->session->color_model;
146 aspect_w = server->edl->session->aspect_w;
147 aspect_h = server->edl->session->aspect_h;
151 int PluginVClient::process_realtime(VFrame **input,
157 int PluginVClient::process_realtime(VFrame *input,
163 int PluginVClient::process_buffer(VFrame **frame,
164 int64_t start_position,
167 for(int i = 0; i < PluginClient::total_in_buffers; i++)
168 read_frame(frame[i], i, start_position, frame_rate);
169 if(is_multichannel())
170 process_realtime(frame, frame);
174 int PluginVClient::process_buffer(VFrame *frame,
175 int64_t start_position,
178 read_frame(frame, 0, start_position, frame_rate);
179 process_realtime(frame, frame);
184 // Replaced by pull method
185 // void PluginVClient::plugin_process_realtime(VFrame **input,
187 // int64_t current_position,
188 // int64_t total_len)
190 // this->source_position = current_position;
191 // this->total_len = total_len;
193 // if(is_multichannel())
194 // process_realtime(input, output);
196 // process_realtime(input[0], output[0]);
199 int PluginVClient::plugin_start_loop(int64_t start,
204 frame_rate = get_project_framerate();
205 return PluginClient::plugin_start_loop(start,
211 int PluginVClient::plugin_get_parameters()
213 frame_rate = get_project_framerate();
214 return PluginClient::plugin_get_parameters();
217 int64_t PluginVClient::local_to_edl(int64_t position)
219 if(position < 0) return position;
220 return (int64_t)Units::round(position *
221 get_project_framerate() /
226 int64_t PluginVClient::edl_to_local(int64_t position)
228 if(position < 0) return position;
229 return (int64_t)Units::round(position *
231 get_project_framerate());
234 int PluginVClient::plugin_process_loop(VFrame **buffers, int64_t &write_length)
238 if(is_multichannel())
239 result = process_loop(buffers);
241 result = process_loop(buffers[0]);
250 int PluginVClient::run_opengl()
252 server->run_opengl(this);
256 int PluginVClient::handle_opengl()
261 VFrame* PluginVClient::get_input(int channel)
263 return input[channel];
266 VFrame* PluginVClient::get_output(int channel)
268 return output[channel];
271 int PluginVClient::next_effect_is(const char *title)
273 return !strcmp(title, output[0]->get_next_effect());
276 int PluginVClient::prev_effect_is(const char *title)
278 return !strcmp(title, output[0]->get_prev_effect());
283 int PluginVClient::read_frame(VFrame *buffer,
285 int64_t start_position)
287 return server->read_frame(buffer,
292 int PluginVClient::read_frame(VFrame *buffer,
293 int64_t start_position)
295 return server->read_frame(buffer,
300 int PluginVClient::read_frame(VFrame *buffer,
302 int64_t start_position,
306 return server->read_frame(buffer,
314 double PluginVClient::get_project_framerate()
316 return project_frame_rate;
319 double PluginVClient::get_framerate()