00001 #include "edl.h"
00002 #include "edlsession.h"
00003 #include "pluginserver.h"
00004 #include "pluginvclient.h"
00005 #include "vframe.h"
00006
00007 #include <string.h>
00008
00009 PluginVClient::PluginVClient(PluginServer *server)
00010 : PluginClient(server)
00011 {
00012 video_in = 0;
00013 video_out = 0;
00014 temp = 0;
00015 if(server &&
00016 server->edl &&
00017 server->edl->session)
00018 {
00019 project_frame_rate = server->edl->session->frame_rate;
00020 frame_rate = project_frame_rate;
00021 }
00022 else
00023 {
00024 project_frame_rate = 1.0;
00025 frame_rate = project_frame_rate;
00026 }
00027 }
00028
00029 PluginVClient::~PluginVClient()
00030 {
00031 if(temp) delete temp;
00032 }
00033
00034 int PluginVClient::is_video()
00035 {
00036 return 1;
00037 }
00038
00039 VFrame* PluginVClient::new_temp(int w, int h, int color_model)
00040 {
00041 if(temp &&
00042 (temp->get_w() != w ||
00043 temp->get_h() != h ||
00044 temp->get_color_model() != color_model))
00045 {
00046 delete temp;
00047 temp = 0;
00048 }
00049
00050 if(!temp)
00051 {
00052 temp = new VFrame(0, w, h, color_model);
00053 }
00054
00055 return temp;
00056 }
00057
00058 void PluginVClient::age_temp()
00059 {
00060 if(temp &&
00061 temp->get_w() > PLUGIN_MAX_W &&
00062 temp->get_h() > PLUGIN_MAX_H)
00063 {
00064 delete temp;
00065 temp = 0;
00066 }
00067 }
00068
00069 VFrame* PluginVClient::get_temp()
00070 {
00071 return temp;
00072 }
00073
00074
00075 int PluginVClient::get_render_ptrs()
00076 {
00077 int i, j, double_buffer, fragment_position;
00078
00079 for(i = 0; i < total_in_buffers; i++)
00080 {
00081 double_buffer = double_buffer_in_render.values[i];
00082 fragment_position = offset_in_render.values[i];
00083 input_ptr_render[i] = &input_ptr_master.values[i][double_buffer][fragment_position];
00084 }
00085
00086 for(i = 0; i < total_out_buffers; i++)
00087 {
00088 double_buffer = double_buffer_out_render.values[i];
00089 fragment_position = offset_out_render.values[i];
00090 output_ptr_render[i] = &output_ptr_master.values[i][double_buffer][fragment_position];
00091 }
00092 return 0;
00093 }
00094
00095
00096 int PluginVClient::delete_nonrealtime_parameters()
00097 {
00098 int i, j;
00099
00100 for(i = 0; i < total_in_buffers; i++)
00101 {
00102 for(j = 0; j < in_buffer_size; j++)
00103 {
00104 delete video_in[i][j];
00105 }
00106 }
00107
00108 for(i = 0; i < total_out_buffers; i++)
00109 {
00110 for(j = 0; j < out_buffer_size; j++)
00111 {
00112 delete video_out[i][j];
00113 }
00114 }
00115 video_in = 0;
00116 video_out = 0;
00117
00118 return 0;
00119 }
00120
00121 int PluginVClient::init_realtime_parameters()
00122 {
00123 project_frame_rate = server->edl->session->frame_rate;
00124 project_color_model = server->edl->session->color_model;
00125 aspect_w = server->edl->session->aspect_w;
00126 aspect_h = server->edl->session->aspect_h;
00127 return 0;
00128 }
00129
00130 int PluginVClient::process_realtime(VFrame **input,
00131 VFrame **output)
00132 {
00133 return 0;
00134 }
00135
00136 int PluginVClient::process_realtime(VFrame *input,
00137 VFrame *output)
00138 {
00139 return 0;
00140 }
00141
00142 int PluginVClient::process_buffer(VFrame **frame,
00143 int64_t start_position,
00144 double frame_rate)
00145 {
00146 for(int i = 0; i < PluginClient::total_in_buffers; i++)
00147 read_frame(frame[i], i, start_position, frame_rate);
00148 if(is_multichannel())
00149 process_realtime(frame, frame);
00150 return 0;
00151 }
00152
00153 int PluginVClient::process_buffer(VFrame *frame,
00154 int64_t start_position,
00155 double frame_rate)
00156 {
00157 read_frame(frame, 0, start_position, frame_rate);
00158 process_realtime(frame, frame);
00159 return 0;
00160 }
00161
00162
00163
00164
00165
00166
00167
00168
00169
00170
00171
00172
00173
00174
00175
00176
00177
00178 void PluginVClient::plugin_render_gui(void *data)
00179 {
00180 render_gui(data);
00181 }
00182
00183 void PluginVClient::send_render_gui(void *data)
00184 {
00185 server->send_render_gui(data);
00186 }
00187
00188 int PluginVClient::plugin_start_loop(int64_t start,
00189 int64_t end,
00190 int64_t buffer_size,
00191 int total_buffers)
00192 {
00193 frame_rate = get_project_framerate();
00194 return PluginClient::plugin_start_loop(start,
00195 end,
00196 buffer_size,
00197 total_buffers);
00198 }
00199
00200 int PluginVClient::plugin_get_parameters()
00201 {
00202 frame_rate = get_project_framerate();
00203 return PluginClient::plugin_get_parameters();
00204 }
00205
00206 int64_t PluginVClient::local_to_edl(int64_t position)
00207 {
00208 if(position < 0) return position;
00209 return (int64_t)Units::round(position *
00210 get_project_framerate() /
00211 frame_rate);
00212 return 0;
00213 }
00214
00215 int64_t PluginVClient::edl_to_local(int64_t position)
00216 {
00217 if(position < 0) return position;
00218 return (int64_t)Units::round(position *
00219 frame_rate /
00220 get_project_framerate());
00221 }
00222
00223 int PluginVClient::plugin_process_loop(VFrame **buffers, int64_t &write_length)
00224 {
00225 int result = 0;
00226
00227 if(is_multichannel())
00228 result = process_loop(buffers);
00229 else
00230 result = process_loop(buffers[0]);
00231
00232
00233 write_length = 1;
00234
00235 return result;
00236 }
00237
00238
00239 int PluginVClient::run_opengl()
00240 {
00241 server->run_opengl(this);
00242 return 0;
00243 }
00244
00245 int PluginVClient::handle_opengl()
00246 {
00247 return 0;
00248 }
00249
00250 VFrame* PluginVClient::get_input(int channel)
00251 {
00252 return input[channel];
00253 }
00254
00255 VFrame* PluginVClient::get_output(int channel)
00256 {
00257 return output[channel];
00258 }
00259
00260 int PluginVClient::next_effect_is(char *title)
00261 {
00262 return !strcmp(title, output[0]->get_next_effect());
00263 }
00264
00265 int PluginVClient::prev_effect_is(char *title)
00266 {
00267 return !strcmp(title, output[0]->get_prev_effect());
00268 }
00269
00270
00271
00272 int PluginVClient::read_frame(VFrame *buffer,
00273 int channel,
00274 int64_t start_position)
00275 {
00276 return server->read_frame(buffer,
00277 channel,
00278 start_position);
00279 }
00280
00281 int PluginVClient::read_frame(VFrame *buffer,
00282 int64_t start_position)
00283 {
00284 return server->read_frame(buffer,
00285 0,
00286 start_position);
00287 }
00288
00289 int PluginVClient::read_frame(VFrame *buffer,
00290 int channel,
00291 int64_t start_position,
00292 double frame_rate,
00293 int use_opengl)
00294 {
00295 return server->read_frame(buffer,
00296 channel,
00297 start_position,
00298 frame_rate,
00299 use_opengl);
00300 }
00301
00302
00303 double PluginVClient::get_project_framerate()
00304 {
00305 return project_frame_rate;
00306 }
00307
00308 double PluginVClient::get_framerate()
00309 {
00310 return frame_rate;
00311 }
00312