r854: Merge 2.1:
[cinelerra_cv/ct.git] / cinelerra / pluginvclient.C
bloba6cdf28b90496506eecbb7bb0adb3288eaec2652
1 #include "edl.h"
2 #include "edlsession.h"
3 #include "pluginserver.h"
4 #include "pluginvclient.h"
5 #include "vframe.h"
7 #include <string.h>
9 PluginVClient::PluginVClient(PluginServer *server)
10  : PluginClient(server)
12         video_in = 0;
13         video_out = 0;
14         temp = 0;
15         if(server &&
16                 server->edl &&
17                 server->edl->session)
18         {
19                 project_frame_rate = server->edl->session->frame_rate;
20                 frame_rate = project_frame_rate;
21         }
22         else
23         {
24                 project_frame_rate = 1.0;
25                 frame_rate = project_frame_rate;
26         }
29 PluginVClient::~PluginVClient()
31         if(temp) delete temp;
34 int PluginVClient::is_video()
36         return 1;
39 VFrame* PluginVClient::new_temp(int w, int h, int color_model)
41         if(temp && 
42                 (temp->get_w() != w ||
43                 temp->get_h() != h ||
44                 temp->get_color_model() != color_model))
45         {
46                 delete temp;
47                 temp = 0;
48         }
50         if(!temp)
51         {
52                 temp = new VFrame(0, w, h, color_model);
53         }
55         return temp;
58 void PluginVClient::age_temp()
60         if(temp &&
61                 temp->get_w() > PLUGIN_MAX_W &&
62                 temp->get_h() > PLUGIN_MAX_H)
63         {
64                 delete temp;
65                 temp = 0;
66         }
69 // Run before every realtime buffer is to be rendered.
70 int PluginVClient::get_render_ptrs()
72         int i, j, double_buffer, fragment_position;
74         for(i = 0; i < total_in_buffers; i++)
75         {
76                 double_buffer = double_buffer_in_render.values[i];
77                 fragment_position = offset_in_render.values[i];
78                 input_ptr_render[i] = &input_ptr_master.values[i][double_buffer][fragment_position];
79         }
81         for(i = 0; i < total_out_buffers; i++)
82         {
83                 double_buffer = double_buffer_out_render.values[i];
84                 fragment_position = offset_out_render.values[i];
85                 output_ptr_render[i] = &output_ptr_master.values[i][double_buffer][fragment_position];
86         }
87         return 0;
90 // Run after the non realtime plugin is run.
91 int PluginVClient::delete_nonrealtime_parameters()
93         int i, j;
95         for(i = 0; i < total_in_buffers; i++)
96         {
97                 for(j = 0; j < in_buffer_size; j++)
98                 {
99                         delete video_in[i][j];
100                 }
101         }
103         for(i = 0; i < total_out_buffers; i++)
104         {
105                 for(j = 0; j < out_buffer_size; j++)
106                 {
107                         delete video_out[i][j];
108                 }
109         }
110         video_in = 0;
111         video_out = 0;
113         return 0;
116 int PluginVClient::init_realtime_parameters()
118         project_frame_rate = server->edl->session->frame_rate;
119         project_color_model = server->edl->session->color_model;
120         aspect_w = server->edl->session->aspect_w;
121         aspect_h = server->edl->session->aspect_h;
122         return 0;
125 int PluginVClient::process_realtime(VFrame **input, 
126         VFrame **output)
128         return 0; 
131 int PluginVClient::process_realtime(VFrame *input, 
132         VFrame *output) 
134         return 0; 
137 int PluginVClient::process_buffer(VFrame **frame,
138         int64_t start_position,
139         double frame_rate)
141         for(int i = 0; i < PluginClient::total_in_buffers; i++)
142                 read_frame(frame[i], i, start_position, frame_rate);
143         if(is_multichannel())
144                 process_realtime(frame, frame);
145         return 0;
148 int PluginVClient::process_buffer(VFrame *frame,
149         int64_t start_position,
150         double frame_rate)
152         read_frame(frame, 0, start_position, frame_rate);
153         process_realtime(frame, frame);
154         return 0;
158 // Replaced by pull method
159 // void PluginVClient::plugin_process_realtime(VFrame **input, 
160 //              VFrame **output, 
161 //              int64_t current_position,
162 //              int64_t total_len)
163 // {
164 //      this->source_position = current_position;
165 //      this->total_len = total_len;
166 // 
167 //      if(is_multichannel())
168 //              process_realtime(input, output);
169 //      else
170 //              process_realtime(input[0], output[0]);
171 // }
173 void PluginVClient::plugin_render_gui(void *data)
175         render_gui(data);
178 void PluginVClient::send_render_gui(void *data)
180         server->send_render_gui(data);
183 int PluginVClient::plugin_start_loop(int64_t start, 
184         int64_t end, 
185         int64_t buffer_size, 
186         int total_buffers)
188         frame_rate = get_project_framerate();
189         return PluginClient::plugin_start_loop(start, 
190                 end, 
191                 buffer_size, 
192                 total_buffers);
195 int PluginVClient::plugin_get_parameters()
197         frame_rate = get_project_framerate();
198         return PluginClient::plugin_get_parameters();
201 int64_t PluginVClient::local_to_edl(int64_t position)
203         if(position < 0) return position;
204         return (int64_t)Units::round(position * 
205                 get_project_framerate() /
206                 frame_rate);
207         return 0;
210 int64_t PluginVClient::edl_to_local(int64_t position)
212         if(position < 0) return position;
213         return (int64_t)Units::round(position * 
214                 frame_rate /
215                 get_project_framerate());
218 int PluginVClient::plugin_process_loop(VFrame **buffers, int64_t &write_length)
220         int result = 0;
222         if(is_multichannel())
223                 result = process_loop(buffers);
224         else
225                 result = process_loop(buffers[0]);
228         write_length = 1;
230         return result;
233 int PluginVClient::handle_opengl()
235         return 0;
244 int PluginVClient::read_frame(VFrame *buffer, 
245         int channel, 
246         int64_t start_position)
248         return server->read_frame(buffer, 
249                 channel, 
250                 start_position);
253 int PluginVClient::read_frame(VFrame *buffer, 
254         int64_t start_position)
256         return server->read_frame(buffer, 
257                 0, 
258                 start_position);
261 int PluginVClient::read_frame(VFrame *buffer, 
262                 int channel, 
263                 int64_t start_position,
264                 double frame_rate,
265                 int use_opengl)
267         return server->read_frame(buffer,
268                 channel,
269                 start_position,
270                 frame_rate,
271                 use_opengl);
275 double PluginVClient::get_project_framerate()
277         return project_frame_rate;
280 double PluginVClient::get_framerate()
282         return frame_rate;