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
22 #include "bcsignals.h"
25 #include "edlsession.h"
26 #include "formattools.h"
29 #include "performanceprefs.h"
30 #include "preferences.h"
34 #define MASTER_NODE_FRAMERATE_TEXT "Master node framerate: %0.3f"
36 N_(MASTER_NODE_FRAMERATE_TEXT)
39 PerformancePrefs::PerformancePrefs(MWindow *mwindow, PreferencesWindow *pwindow)
40 : PreferencesDialog(mwindow, pwindow)
45 PerformancePrefs::~PerformancePrefs()
48 nodes[0].remove_all_objects();
49 nodes[1].remove_all_objects();
50 nodes[2].remove_all_objects();
51 nodes[3].remove_all_objects();
54 void PerformancePrefs::create_objects()
61 char string[BCTEXTLEN];
62 BC_Resources *resources = BC_WindowBase::get_resources();
67 xmargin1 = x = mwindow->theme->preferencesoptions_x;
68 y = mwindow->theme->preferencesoptions_y;
70 // add_subwindow(new BC_Title(x,
74 // resources->text_default));
76 // y += get_text_height(LARGEFONT) + 5;
78 add_subwindow(new BC_Title(x, y + 5, _("Cache size (MB):"), MEDIUMFONT, resources->text_default));
79 cache_size = new CICacheSize(x + 230,
83 cache_size->create_objects();
85 add_subwindow(new BC_Title(x, y + 5, _("Seconds to preroll renders:")));
86 PrefsRenderPreroll *preroll = new PrefsRenderPreroll(pwindow,
90 preroll->create_objects();
92 PrefsForceUniprocessor *force_1cpu = new PrefsForceUniprocessor(pwindow, x, y);
93 add_subwindow(force_1cpu);
95 int x1 = force_1cpu->get_x() + force_1cpu->get_w() + 50;
96 int y1 = force_1cpu->get_y();
98 PrefsTrapSigSEGV *trap_segv = new PrefsTrapSigSEGV(this, x1, y1);
99 add_subwindow(trap_segv);
100 int x2 = x1 + trap_segv->get_w() + 10;
101 add_subwindow(new BC_Title(x2, y1, _("(must be root)"), MEDIUMFONT, RED));
103 PrefsTrapSigINTR *trap_intr = new PrefsTrapSigINTR(this, x1, y1);
104 add_subwindow(trap_intr);
105 add_subwindow(new BC_Title(x2, y1, _("(must be root)"), MEDIUMFONT, RED));
108 file_forking = new PrefsFileForking(this, x, y);
109 add_subwindow(file_forking);
110 file_forking->check_enable();
113 ffmpeg_early_probe = new PrefsFFMPEGEarlyProbe(this, x, y);
114 add_subwindow(ffmpeg_early_probe);
115 x1 = x + ffmpeg_early_probe->get_w() + 24;
116 ffmpeg_marker_indecies = new PrefsFFMPEGMarkerIndecies(this, x1, y);
117 add_subwindow(ffmpeg_marker_indecies);
123 // Background rendering
124 add_subwindow(new BC_Bar(5, y, get_w() - 10));
128 add_subwindow(new BC_Title(x, y, _("Background Rendering (Video only)"), LARGEFONT, resources->text_default));
131 add_subwindow(new PrefsUseBRender(pwindow,
136 add_subwindow(new BC_Title(x, y + 40, _("Frames per background rendering job:")));
137 PrefsBRenderFragment *brender_fragment = new PrefsBRenderFragment(pwindow,
141 brender_fragment->create_objects();
142 add_subwindow(new BC_Title(x, y + 95, _("Frames to preroll background:")));
143 PrefsBRenderPreroll *bpreroll = new PrefsBRenderPreroll(pwindow,
147 bpreroll->create_objects();
151 add_subwindow(new BC_Title(x, y, _("Output for background rendering:")));
154 new FormatTools(mwindow,
156 pwindow->thread->preferences->brender_asset);
157 brender_tools->create_objects(x,
159 0, // Include tools for audio
160 1, // Include tools for video
161 0, // Include checkbox for audio
162 0, // Include checkbox for video
165 0, // Select compressors to be offered
166 0, // Prompt for recording options
167 0, // If nonzero, prompt for insertion strategy
168 1); // Supply file formats for background rendering
173 add_subwindow(new BC_Bar(5, y, get_w() - 10));
175 add_subwindow(new BC_Title(x, y, _("Render Farm"), LARGEFONT, resources->text_default));
177 BC_Title *node_title = new BC_Title(x1, y, _("Nodes:"));
178 add_subwindow(node_title);
179 x1 += node_title->get_w() + 25;
180 sprintf(string, _(MASTER_NODE_FRAMERATE_TEXT),
181 pwindow->thread->preferences->local_rate);
182 add_subwindow(master_rate = new BC_Title(x1, y, string));
184 add_subwindow(node_list = new PrefsRenderFarmNodes(pwindow,
189 add_subwindow(new PrefsRenderFarm(pwindow, x, y));
191 add_subwindow(new BC_Title(x, y, _("Hostname:")));
192 add_subwindow(new BC_Title(x + xmargin3, y, _("Port:")));
195 add_subwindow(edit_node = new PrefsRenderFarmEditNode(pwindow,
199 edit_port = new PrefsRenderFarmPort(pwindow,
203 edit_port->create_objects();
208 add_subwindow(new PrefsRenderFarmReplaceNode(pwindow,
212 add_subwindow(new PrefsRenderFarmNewNode(pwindow,
217 add_subwindow(new PrefsRenderFarmDelNode(pwindow,
221 add_subwindow(new PrefsRenderFarmSortNodes(pwindow,
226 add_subwindow(new PrefsRenderFarmReset(pwindow,
231 add_subwindow(new BC_Title(x,
233 _("Total jobs to create:")));
234 add_subwindow(new BC_Title(x,
236 _("(overridden if new file at each label is checked)")));
237 PrefsRenderFarmJobs *jobs = new PrefsRenderFarmJobs(pwindow,
241 jobs->create_objects();
243 // add_subwindow(new PrefsRenderFarmVFS(pwindow,
247 // add_subwindow(new BC_Title(x,
249 // _("Filesystem prefix on remote nodes:")));
250 // add_subwindow(new PrefsRenderFarmMountpoint(pwindow,
257 void PerformancePrefs::generate_node_list()
259 int selected_row = node_list ? node_list->get_selection_number(0, 0) : -1;
261 for(int i = 0; i < TOTAL_COLUMNS; i++)
262 nodes[i].remove_all_objects();
265 i < pwindow->thread->preferences->renderfarm_nodes.size();
268 BC_ListBoxItem *item;
269 nodes[ENABLED_COLUMN].append(item = new BC_ListBoxItem(
270 (char*)(pwindow->thread->preferences->renderfarm_enabled.get(i) ? "X" : " ")));
271 if(i == selected_row) item->set_selected(1);
273 nodes[HOSTNAME_COLUMN].append(item = new BC_ListBoxItem(
274 pwindow->thread->preferences->renderfarm_nodes.get(i)));
275 if(i == selected_row) item->set_selected(1);
277 char string[BCTEXTLEN];
278 sprintf(string, "%d", pwindow->thread->preferences->renderfarm_ports.get(i));
279 nodes[PORT_COLUMN].append(item = new BC_ListBoxItem(string));
280 if(i == selected_row) item->set_selected(1);
282 sprintf(string, "%0.3f", pwindow->thread->preferences->renderfarm_rate.get(i));
283 nodes[RATE_COLUMN].append(item = new BC_ListBoxItem(string));
284 if(i == selected_row) item->set_selected(1);
288 static const char *titles[] =
296 static int widths[] =
305 void PerformancePrefs::update_node_list()
307 node_list->update(nodes,
311 node_list->get_xposition(),
312 node_list->get_yposition(),
313 node_list->get_selection_number(0, 0));
317 void PerformancePrefs::update_rates()
319 //printf("PerformancePrefs::update_rates %d\n", __LINE__);
320 char string[BCTEXTLEN];
322 i < mwindow->preferences->renderfarm_rate.size();
325 if(i < nodes[RATE_COLUMN].size())
327 sprintf(string, "%0.3f", mwindow->preferences->renderfarm_rate.get(i));
328 nodes[RATE_COLUMN].get(i)->set_text(string);
332 sprintf(string, _(MASTER_NODE_FRAMERATE_TEXT),
333 mwindow->preferences->local_rate);
334 master_rate->update(string);
340 PrefsUseBRender::PrefsUseBRender(PreferencesWindow *pwindow,
345 pwindow->thread->preferences->use_brender,
346 _("Use background rendering"))
348 this->pwindow = pwindow;
351 int PrefsUseBRender::handle_event()
353 pwindow->thread->redraw_overlays = 1;
354 pwindow->thread->redraw_times = 1;
355 pwindow->thread->preferences->use_brender = get_value();
364 PrefsBRenderFragment::PrefsBRenderFragment(PreferencesWindow *pwindow,
365 PerformancePrefs *subwindow,
368 : BC_TumbleTextBox(subwindow,
369 (int64_t)pwindow->thread->preferences->brender_fragment,
376 this->pwindow = pwindow;
378 int PrefsBRenderFragment::handle_event()
380 pwindow->thread->preferences->brender_fragment = atol(get_text());
394 CICacheSize::CICacheSize(int x,
396 PreferencesWindow *pwindow,
397 PerformancePrefs *subwindow)
398 : BC_TumbleTextBox(subwindow,
399 (int64_t)pwindow->thread->preferences->cache_size / 0x100000,
400 (int64_t)MIN_CACHE_SIZE / 0x100000,
401 (int64_t)MAX_CACHE_SIZE / 0x100000,
406 this->pwindow = pwindow;
410 int CICacheSize::handle_event()
413 result = (int64_t)atol(get_text()) * 0x100000;
414 CLAMP(result, MIN_CACHE_SIZE, MAX_CACHE_SIZE);
415 pwindow->thread->preferences->cache_size = result;
420 PrefsRenderPreroll::PrefsRenderPreroll(PreferencesWindow *pwindow,
421 PerformancePrefs *subwindow,
424 : BC_TumbleTextBox(subwindow,
425 (float)pwindow->thread->preferences->render_preroll,
432 this->pwindow = pwindow;
435 PrefsRenderPreroll::~PrefsRenderPreroll()
438 int PrefsRenderPreroll::handle_event()
440 pwindow->thread->preferences->render_preroll = atof(get_text());
445 PrefsBRenderPreroll::PrefsBRenderPreroll(PreferencesWindow *pwindow,
446 PerformancePrefs *subwindow,
449 : BC_TumbleTextBox(subwindow,
450 (int64_t)pwindow->thread->preferences->brender_preroll,
457 this->pwindow = pwindow;
459 int PrefsBRenderPreroll::handle_event()
461 pwindow->thread->preferences->brender_preroll = atol(get_text());
475 PrefsRenderFarm::PrefsRenderFarm(PreferencesWindow *pwindow, int x, int y)
478 pwindow->thread->preferences->use_renderfarm,
479 _("Use render farm"))
481 this->pwindow = pwindow;
483 PrefsRenderFarm::~PrefsRenderFarm()
486 int PrefsRenderFarm::handle_event()
488 pwindow->thread->preferences->use_renderfarm = get_value();
495 PrefsForceUniprocessor::PrefsForceUniprocessor(PreferencesWindow *pwindow, int x, int y)
498 pwindow->thread->preferences->force_uniprocessor,
499 _("Force single processor use"))
501 this->pwindow = pwindow;
503 PrefsForceUniprocessor::~PrefsForceUniprocessor()
506 int PrefsForceUniprocessor::handle_event()
508 pwindow->thread->preferences->force_uniprocessor = get_value();
512 PrefsTrapSigSEGV::PrefsTrapSigSEGV(PerformancePrefs *perf_prefs, int x, int y)
514 perf_prefs->pwindow->thread->preferences->trap_sigsegv,
517 this->perf_prefs = perf_prefs;
519 PrefsTrapSigSEGV::~PrefsTrapSigSEGV()
522 int PrefsTrapSigSEGV::handle_event()
524 perf_prefs->pwindow->thread->preferences->trap_sigsegv = get_value();
525 perf_prefs->file_forking->check_enable();
529 PrefsTrapSigINTR::PrefsTrapSigINTR(PerformancePrefs *perf_prefs, int x, int y)
531 perf_prefs->pwindow->thread->preferences->trap_sigintr,
534 this->perf_prefs = perf_prefs;
536 PrefsTrapSigINTR::~PrefsTrapSigINTR()
539 int PrefsTrapSigINTR::handle_event()
541 perf_prefs->pwindow->thread->preferences->trap_sigintr = get_value();
542 perf_prefs->file_forking->check_enable();
547 PrefsFileForking::PrefsFileForking(PerformancePrefs *perf_prefs, int x, int y)
549 perf_prefs->pwindow->thread->preferences->file_forking,
550 _("enable/disable file fork"))
552 this->perf_prefs = perf_prefs;
554 PrefsFileForking::~PrefsFileForking()
557 int PrefsFileForking::handle_event()
559 perf_prefs->pwindow->thread->preferences->file_forking = get_value();
563 void PrefsFileForking::check_enable()
565 Preferences *preferences = perf_prefs->pwindow->thread->preferences;
566 if( preferences->trap_sigsegv || preferences->trap_sigintr ) {
567 preferences->file_forking = 0;
571 else if( !preferences->trap_sigsegv && !preferences->trap_sigintr ) {
577 PrefsFFMPEGEarlyProbe::PrefsFFMPEGEarlyProbe(PerformancePrefs *perf_prefs, int x, int y)
579 perf_prefs->pwindow->thread->preferences->ffmpeg_early_probe,
580 _("On file open, ffmpeg probes early"))
582 this->perf_prefs = perf_prefs;
584 PrefsFFMPEGEarlyProbe::~PrefsFFMPEGEarlyProbe()
588 int PrefsFFMPEGEarlyProbe::handle_event()
590 perf_prefs->pwindow->thread->preferences->ffmpeg_early_probe = get_value();
595 PrefsFFMPEGMarkerIndecies::PrefsFFMPEGMarkerIndecies(PerformancePrefs *perf_prefs, int x, int y)
597 perf_prefs->pwindow->thread->preferences->ffmpeg_marker_indecies,
598 _("build ffmpeg marker indecies"))
600 this->perf_prefs = perf_prefs;
602 PrefsFFMPEGMarkerIndecies::~PrefsFFMPEGMarkerIndecies()
606 int PrefsFFMPEGMarkerIndecies::handle_event()
608 perf_prefs->pwindow->thread->preferences->ffmpeg_marker_indecies = get_value();
617 PrefsRenderFarmConsolidate::PrefsRenderFarmConsolidate(PreferencesWindow *pwindow, int x, int y)
620 pwindow->thread->preferences->renderfarm_consolidate,
621 _("Consolidate output files on completion"))
623 this->pwindow = pwindow;
625 PrefsRenderFarmConsolidate::~PrefsRenderFarmConsolidate()
628 int PrefsRenderFarmConsolidate::handle_event()
630 pwindow->thread->preferences->renderfarm_consolidate = get_value();
638 PrefsRenderFarmPort::PrefsRenderFarmPort(PreferencesWindow *pwindow,
639 PerformancePrefs *subwindow,
642 : BC_TumbleTextBox(subwindow,
643 (int64_t)pwindow->thread->preferences->renderfarm_port,
650 this->pwindow = pwindow;
653 PrefsRenderFarmPort::~PrefsRenderFarmPort()
657 int PrefsRenderFarmPort::handle_event()
659 pwindow->thread->preferences->renderfarm_port = atol(get_text());
665 PrefsRenderFarmNodes::PrefsRenderFarmNodes(PreferencesWindow *pwindow,
666 PerformancePrefs *subwindow,
673 LISTBOX_TEXT, // Display text list or icons
679 this->subwindow = subwindow;
680 this->pwindow = pwindow;
682 PrefsRenderFarmNodes::~PrefsRenderFarmNodes()
686 int PrefsRenderFarmNodes::column_resize_event()
688 for(int i = 0; i < 3; i++)
689 widths[i] = get_column_width(i);
693 int PrefsRenderFarmNodes::handle_event()
696 if(get_selection_number(0, 0) >= 0)
698 subwindow->hot_node = get_selection_number(1, 0);
699 subwindow->edit_node->update(get_selection(1, 0)->get_text());
700 subwindow->edit_port->update(get_selection(2, 0)->get_text());
701 if(get_cursor_x() < widths[0])
703 pwindow->thread->preferences->renderfarm_enabled.values[subwindow->hot_node] =
704 !pwindow->thread->preferences->renderfarm_enabled.values[subwindow->hot_node];
705 subwindow->generate_node_list();
706 subwindow->update_node_list();
711 subwindow->hot_node = -1;
712 subwindow->edit_node->update("");
717 int PrefsRenderFarmNodes::selection_changed()
729 PrefsRenderFarmEditNode::PrefsRenderFarmEditNode(PreferencesWindow *pwindow, PerformancePrefs *subwindow, int x, int y)
730 : BC_TextBox(x, y, 240, 1, "")
732 this->pwindow = pwindow;
733 this->subwindow = subwindow;
736 PrefsRenderFarmEditNode::~PrefsRenderFarmEditNode()
740 int PrefsRenderFarmEditNode::handle_event()
750 PrefsRenderFarmNewNode::PrefsRenderFarmNewNode(PreferencesWindow *pwindow, PerformancePrefs *subwindow, int x, int y)
751 : BC_GenericButton(x, y, _("Add Node"))
753 this->pwindow = pwindow;
754 this->subwindow = subwindow;
756 PrefsRenderFarmNewNode::~PrefsRenderFarmNewNode()
759 int PrefsRenderFarmNewNode::handle_event()
761 pwindow->thread->preferences->add_node(subwindow->edit_node->get_text(),
762 pwindow->thread->preferences->renderfarm_port,
765 pwindow->thread->preferences->reset_rates();
766 subwindow->generate_node_list();
767 subwindow->update_node_list();
768 subwindow->hot_node = -1;
778 PrefsRenderFarmReplaceNode::PrefsRenderFarmReplaceNode(PreferencesWindow *pwindow, PerformancePrefs *subwindow, int x, int y)
779 : BC_GenericButton(x, y, _("Apply Changes"))
781 this->pwindow = pwindow;
782 this->subwindow = subwindow;
784 PrefsRenderFarmReplaceNode::~PrefsRenderFarmReplaceNode()
787 int PrefsRenderFarmReplaceNode::handle_event()
789 if(subwindow->hot_node >= 0)
791 pwindow->thread->preferences->edit_node(subwindow->hot_node,
792 subwindow->edit_node->get_text(),
793 pwindow->thread->preferences->renderfarm_port,
794 pwindow->thread->preferences->renderfarm_enabled.values[subwindow->hot_node]);
795 subwindow->generate_node_list();
796 subwindow->update_node_list();
805 PrefsRenderFarmDelNode::PrefsRenderFarmDelNode(PreferencesWindow *pwindow, PerformancePrefs *subwindow, int x, int y)
806 : BC_GenericButton(x, y, _("Delete Node"))
808 this->pwindow = pwindow;
809 this->subwindow = subwindow;
811 PrefsRenderFarmDelNode::~PrefsRenderFarmDelNode()
814 int PrefsRenderFarmDelNode::handle_event()
816 if(strlen(subwindow->edit_node->get_text()) &&
817 subwindow->hot_node >= 0)
820 pwindow->thread->preferences->delete_node(subwindow->hot_node);
822 subwindow->generate_node_list();
823 subwindow->update_node_list();
824 subwindow->hot_node = -1;
833 PrefsRenderFarmSortNodes::PrefsRenderFarmSortNodes(PreferencesWindow *pwindow,
834 PerformancePrefs *subwindow,
837 : BC_GenericButton(x, y, _("Sort nodes"))
839 this->pwindow = pwindow;
840 this->subwindow = subwindow;
843 PrefsRenderFarmSortNodes::~PrefsRenderFarmSortNodes()
847 int PrefsRenderFarmSortNodes::handle_event()
849 pwindow->thread->preferences->sort_nodes();
850 subwindow->generate_node_list();
851 subwindow->update_node_list();
852 subwindow->hot_node = -1;
860 PrefsRenderFarmReset::PrefsRenderFarmReset(PreferencesWindow *pwindow,
861 PerformancePrefs *subwindow,
864 : BC_GenericButton(x, y, _("Reset rates"))
866 this->pwindow = pwindow;
867 this->subwindow = subwindow;
870 int PrefsRenderFarmReset::handle_event()
872 pwindow->thread->preferences->reset_rates();
873 subwindow->generate_node_list();
874 subwindow->update_node_list();
876 char string[BCTEXTLEN];
878 MASTER_NODE_FRAMERATE_TEXT,
879 pwindow->thread->preferences->local_rate);
880 subwindow->master_rate->update(string);
881 subwindow->hot_node = -1;
891 PrefsRenderFarmJobs::PrefsRenderFarmJobs(PreferencesWindow *pwindow,
892 PerformancePrefs *subwindow,
895 : BC_TumbleTextBox(subwindow,
896 (int64_t)pwindow->thread->preferences->renderfarm_job_count,
903 this->pwindow = pwindow;
905 PrefsRenderFarmJobs::~PrefsRenderFarmJobs()
908 int PrefsRenderFarmJobs::handle_event()
910 pwindow->thread->preferences->renderfarm_job_count = atol(get_text());
916 PrefsRenderFarmMountpoint::PrefsRenderFarmMountpoint(PreferencesWindow *pwindow,
917 PerformancePrefs *subwindow,
924 pwindow->thread->preferences->renderfarm_mountpoint)
926 this->pwindow = pwindow;
927 this->subwindow = subwindow;
929 PrefsRenderFarmMountpoint::~PrefsRenderFarmMountpoint()
932 int PrefsRenderFarmMountpoint::handle_event()
934 strcpy(pwindow->thread->preferences->renderfarm_mountpoint, get_text());
941 PrefsRenderFarmVFS::PrefsRenderFarmVFS(PreferencesWindow *pwindow,
942 PerformancePrefs *subwindow,
945 : BC_CheckBox(x, y, pwindow->thread->preferences->renderfarm_vfs, _("Use virtual filesystem"))
947 this->pwindow = pwindow;
948 this->subwindow = subwindow;
951 int PrefsRenderFarmVFS::handle_event()
953 pwindow->thread->preferences->renderfarm_vfs = get_value();