r125: This commit was manufactured by cvs2svn to create tag 'r1_1_7-last'.
[cinelerra_cv/mob.git] / hvirtual / plugins / fieldframe / fieldframe.C
blobe55c338221d7914eb41ac2a1437a9c611b512346
1 #include "bcdisplayinfo.h"
2 #include "defaults.h"
3 #include "filexml.h"
4 #include "guicast.h"
5 #include "keyframe.h"
6 #include "mainprogress.h"
7 #include "picon_png.h"
8 #include "pluginvclient.h"
9 #include "vframe.h"
11 #include <string.h>
13 #include <libintl.h>
14 #define _(String) gettext(String)
15 #define gettext_noop(String) String
16 #define N_(String) gettext_noop (String)
18 #define TOP_FIELD_FIRST 0
19 #define BOTTOM_FIELD_FIRST 1
21 class FieldFrame;
22 class FieldFrameWindow;
25 class FieldFrameConfig
27 public:
28         FieldFrameConfig();
29         int field_dominance;
35 class FieldFrameTop : public BC_Radial
37 public:
38         FieldFrameTop(FieldFrame *plugin, FieldFrameWindow *gui, int x, int y);
39         int handle_event();
40         FieldFrame *plugin;
41         FieldFrameWindow *gui;
45 class FieldFrameBottom : public BC_Radial
47 public:
48         FieldFrameBottom(FieldFrame *plugin, FieldFrameWindow *gui, int x, int y);
49         int handle_event();
50         FieldFrame *plugin;
51         FieldFrameWindow *gui;
54 class FieldFrameAvg : public BC_CheckBox
56 public:
57         FieldFrameAvg(FieldFrame *plugin, FieldFrameWindow *gui, int x, int y);
58         int handle_event();
59         FieldFrame *plugin;
60         FieldFrameWindow *gui;
63 class FieldFrameWindow : public BC_Window
65 public:
66         FieldFrameWindow(FieldFrame *plugin, int x, int y);
67         void create_objects();
68         int close_event();
69         FieldFrame *plugin;
70         FieldFrameTop *top;
71         FieldFrameBottom *bottom;
77 class FieldFrame : public PluginVClient
79 public:
80         FieldFrame(PluginServer *server);
81         ~FieldFrame();
83         char* plugin_title();
84         VFrame* new_picon();
85         int get_parameters();
86         int load_defaults();
87         int save_defaults();
88         int start_loop();
89         int stop_loop();
90         int process_loop(VFrame *output);
91         double get_framerate();
93         int current_field;
94         long input_position;
95         VFrame *prev_frame, *next_frame;
96         FieldFrameConfig config;
97         Defaults *defaults;
98         MainProgressBar *progress;
112 FieldFrameConfig::FieldFrameConfig()
114         field_dominance = TOP_FIELD_FIRST;
125 FieldFrameWindow::FieldFrameWindow(FieldFrame *plugin, int x, int y)
126  : BC_Window(plugin->gui_string, 
127         x, 
128         y, 
129         230, 
130         160, 
131         230, 
132         160, 
133         0, 
134         0,
135         1)
137         this->plugin = plugin;
140 void FieldFrameWindow::create_objects()
142         int x = 10, y = 10;
143         add_subwindow(top = new FieldFrameTop(plugin, this, x, y));
144         y += 30;
145         add_subwindow(bottom = new FieldFrameBottom(plugin, this, x, y));
147         add_subwindow(new BC_OKButton(this));
148         add_subwindow(new BC_CancelButton(this));
150         show_window();
151         flush();
154 int FieldFrameWindow::close_event()
156         set_done(1);
157         return 1;
171 FieldFrameTop::FieldFrameTop(FieldFrame *plugin, 
172         FieldFrameWindow *gui, 
173         int x, 
174         int y)
175  : BC_Radial(x, 
176         y, 
177         plugin->config.field_dominance == TOP_FIELD_FIRST,
178         _("Top field first"))
180         this->plugin = plugin;
181         this->gui = gui;
184 int FieldFrameTop::handle_event()
186         plugin->config.field_dominance = TOP_FIELD_FIRST;
187         gui->bottom->update(0);
188         return 1;
195 FieldFrameBottom::FieldFrameBottom(FieldFrame *plugin, 
196         FieldFrameWindow *gui, 
197         int x, 
198         int y)
199  : BC_Radial(x, 
200         y, 
201         plugin->config.field_dominance == BOTTOM_FIELD_FIRST,
202         _("Bottom field first"))
204         this->plugin = plugin;
205         this->gui = gui;
208 int FieldFrameBottom::handle_event()
210         plugin->config.field_dominance = BOTTOM_FIELD_FIRST;
211         gui->top->update(0);
212         return 1;
234 REGISTER_PLUGIN(FieldFrame)
237 FieldFrame::FieldFrame(PluginServer *server)
238  : PluginVClient(server)
240         prev_frame = 0;
241         next_frame = 0;
242         current_field = 0;
243         load_defaults();
247 FieldFrame::~FieldFrame()
249         save_defaults();
250         delete defaults;
252         if(prev_frame) delete prev_frame;
253         if(next_frame) delete next_frame;
256 char* FieldFrame::plugin_title()
258         return _("Fields to frames");
261 NEW_PICON_MACRO(FieldFrame)
263 double FieldFrame::get_framerate()
265         return project_frame_rate / 2;
268 int FieldFrame::load_defaults()
270         char directory[BCTEXTLEN];
271 // set the default directory
272         sprintf(directory, "%sfieldframe.rc", BCASTDIR);
274 // load the defaults
275         defaults = new Defaults(directory);
276         defaults->load();
278         config.field_dominance = defaults->get("DOMINANCE", config.field_dominance);
279         return 0;
282 int FieldFrame::save_defaults()
284         defaults->update("DOMINANCE", config.field_dominance);
285         defaults->save();
286         return 0;
289 int FieldFrame::get_parameters()
291         BC_DisplayInfo info;
292         FieldFrameWindow window(this, info.get_abs_cursor_x(), info.get_abs_cursor_y());
293         window.create_objects();
294         int result = window.run_window();
295         
296         return result;
299 int FieldFrame::start_loop()
301         if(PluginClient::interactive)
302         {
303                 char string[BCTEXTLEN];
304                 sprintf(string, "%s...", plugin_title());
305                 progress = start_progress(string, 
306                         PluginClient::end - PluginClient::start);
307         }
309         input_position = PluginClient::start;
310         return 0;
313 int FieldFrame::stop_loop()
315         if(PluginClient::interactive)
316         {
317                 progress->stop_progress();
318                 delete progress;
319         }
320         return 0;
323 int FieldFrame::process_loop(VFrame *output)
325         int result = 0;
327         if(!prev_frame)
328         {
329                 prev_frame = new VFrame(0, output->get_w(), output->get_h(), output->get_color_model());
330         }
331         if(!next_frame)
332         {
333                 next_frame = new VFrame(0, output->get_w(), output->get_h(), output->get_color_model());
334         }
336         read_frame(prev_frame, input_position);
337         input_position++;
338         read_frame(next_frame, input_position);
339         input_position++;
341         unsigned char **input_rows1;
342         unsigned char **input_rows2;
343         if(config.field_dominance == TOP_FIELD_FIRST)
344         {
345                 input_rows1 = prev_frame->get_rows();
346                 input_rows2 = next_frame->get_rows();
347         }
348         else
349         {
350                 input_rows1 = next_frame->get_rows();
351                 input_rows2 = prev_frame->get_rows();
352         }
354         unsigned char **output_rows = output->get_rows();
355         int row_size = VFrame::calculate_bytes_per_pixel(output->get_color_model()) * output->get_w();
356         for(int i = 0; i < output->get_h() - 1; i += 2)
357         {
358                 memcpy(output_rows[i], input_rows1[i], row_size);
359                 memcpy(output_rows[i + 1], input_rows2[i + 1], row_size);
360         }
363         if(PluginClient::interactive) 
364                 result = progress->update(input_position - PluginClient::start);
366         if(input_position >= PluginClient::end) result = 1;
368         return result;