From 70e6e89110200ba8300e182f3472589afc6846bb Mon Sep 17 00:00:00 2001 From: Andraz Tori Date: Fri, 9 Feb 2007 19:21:54 +0000 Subject: [PATCH] r989: Add render profiles to render dialog Not the smoothest implementation ever, but should do... --- cinelerra/Makefile.am | 2 + cinelerra/batchrender.C | 2 +- cinelerra/render.C | 140 +++++++++++++++++++- cinelerra/render.h | 44 ++++++- cinelerra/render.inc | 6 +- cinelerra/renderprofiles.C | 298 +++++++++++++++++++++++++++++++++++++++++++ cinelerra/renderprofiles.h | 88 +++++++++++++ cinelerra/renderprofiles.inc | 8 ++ cinelerra/transportque.C | 31 +++-- cinelerra/transportque.h | 6 +- 10 files changed, 601 insertions(+), 24 deletions(-) create mode 100644 cinelerra/renderprofiles.C create mode 100644 cinelerra/renderprofiles.h create mode 100644 cinelerra/renderprofiles.inc diff --git a/cinelerra/Makefile.am b/cinelerra/Makefile.am index 35e8dc30..8fd392dc 100644 --- a/cinelerra/Makefile.am +++ b/cinelerra/Makefile.am @@ -269,6 +269,7 @@ cinelerra_SOURCES = aattachmentpoint.C \ renderengine.C \ renderfarm.C \ renderfarmclient.C \ + renderprofiles.C \ resample.C \ resizetrackthread.C \ resourcepixmap.C \ @@ -590,6 +591,7 @@ noinst_HEADERS = aattachmentpoint.h \ renderfarm.h \ render.h \ resample.h \ + renderprofiles.h \ resizetrackthread.h \ resourcepixmap.h \ resourcethread.h \ diff --git a/cinelerra/batchrender.C b/cinelerra/batchrender.C index fd943b44..2355ff17 100644 --- a/cinelerra/batchrender.C +++ b/cinelerra/batchrender.C @@ -447,7 +447,7 @@ void BatchRenderThread::calculate_dest_paths(ArrayList *paths, LOAD_ALL); command->change_type = CHANGE_ALL; command->set_playback_range(); - command->adjust_playback_range(); + command->playback_range_adjust_inout(); // Create test packages packages->create_packages(mwindow, diff --git a/cinelerra/render.C b/cinelerra/render.C index 95c58824..543484fd 100644 --- a/cinelerra/render.C +++ b/cinelerra/render.C @@ -49,6 +49,7 @@ #include "vframe.h" #include "videoconfig.h" #include "vrender.h" +#include "renderprofiles.h" #include #include @@ -219,6 +220,7 @@ Render::Render(MWindow *mwindow) counter_lock = new Mutex("Render::counter_lock"); completion = new Condition(0, "Render::completion"); progress_timer = new Timer; + range_type = RANGE_BACKCOMPAT; } Render::~Render() @@ -363,7 +365,7 @@ printf("Render::run 9\n"); mwindow->save_defaults(); printf("Render::run 10\n"); - if(!result) render(1, asset, mwindow->edl, strategy); + if(!result) render(1, asset, mwindow->edl, strategy, range_type); printf("Render::run 11\n"); Garbage::delete_object(asset); @@ -396,7 +398,7 @@ printf("Render::run 12\n"); edl->load_xml(plugindb, file, LOAD_ALL); check_asset(edl, *job->asset); - render(0, job->asset, edl, job->strategy); + render(0, job->asset, edl, job->strategy, RANGE_BACKCOMPAT); delete edl; delete file; @@ -562,7 +564,8 @@ void Render::stop_progress() int Render::render(int test_overwrite, Asset *asset, EDL *edl, - int strategy) + int strategy, + int range_type) { char string[BCTEXTLEN]; // Total length in seconds @@ -601,10 +604,25 @@ int Render::render(int test_overwrite, command->command = NORMAL_FWD; command->get_edl()->copy_all(edl); command->change_type = CHANGE_ALL; + if (range_type == RANGE_BACKCOMPAT) + { // Get highlighted playback range - command->set_playback_range(); + command->set_playback_range(); // Adjust playback range with in/out points - command->adjust_playback_range(); + command->playback_range_adjust_inout(); + } else + if (range_type == RANGE_PROJECT) + { + command->playback_range_project(); + } else + if (range_type == RANGE_SELECTION) + { + command->set_playback_range(); + } else + if (range_type == RANGE_INOUT) + { + command->playback_range_inout(); + } packages = new PackageDispatcher; @@ -985,6 +1003,7 @@ int Render::load_defaults(Asset *asset) { strategy = mwindow->defaults->get("RENDER_STRATEGY", SINGLE_PASS); load_mode = mwindow->defaults->get("RENDER_LOADMODE", LOAD_NEW_TRACKS); + range_type = mwindow->defaults->get("RENDER_RANGE_TYPE", RANGE_PROJECT); asset->load_defaults(mwindow->defaults, @@ -999,10 +1018,38 @@ int Render::load_defaults(Asset *asset) return 0; } +int Render::load_profile(int profile_slot, Asset *asset) +{ + char string_name[100]; + sprintf(string_name, "RENDER_%i_STRATEGY", profile_slot); + strategy = mwindow->defaults->get(string_name, SINGLE_PASS); +// Load mode is not part of the profile +// printf(string_name, "RENDER_%i_LOADMODE", profile_slot); +// load_mode = mwindow->defaults->get(string_name, LOAD_NEW_TRACKS); + sprintf(string_name, "RENDER_%i_RANGE_TYPE", profile_slot); + range_type = mwindow->defaults->get(string_name, RANGE_PROJECT); + + + sprintf(string_name, "RENDER_%i_", profile_slot); + asset->load_defaults(mwindow->defaults, + string_name, + 1, + 1, + 1, + 1, + 1); + + + return 0; +} + + + int Render::save_defaults(Asset *asset) { mwindow->defaults->update("RENDER_STRATEGY", strategy); mwindow->defaults->update("RENDER_LOADMODE", load_mode); + mwindow->defaults->update("RENDER_RANGE_TYPE", range_type); @@ -1022,7 +1069,7 @@ int Render::save_defaults(Asset *asset) #define WIDTH 410 -#define HEIGHT 360 +#define HEIGHT 455 RenderWindow::RenderWindow(MWindow *mwindow, Render *render, Asset *asset) @@ -1049,6 +1096,14 @@ RenderWindow::~RenderWindow() } +int RenderWindow::load_profile(int profile_slot) +{ + render->load_profile(profile_slot, asset); + update_range_type(render->range_type); + format_tools->update(asset, &render->strategy); +} + + int RenderWindow::create_objects() { @@ -1076,12 +1131,83 @@ int RenderWindow::create_objects() 0, &render->strategy, 0); - + add_subwindow(new BC_Title(x, + y, + _("Render range:"))); + + x += 110; + add_subwindow(rangeproject = new RenderRangeProject(this, + render->range_type == RANGE_PROJECT, + x, + y)); + y += 20; + add_subwindow(rangeselection = new RenderRangeSelection(this, + render->range_type == RANGE_SELECTION, + x, + y)); + y += 20; + add_subwindow(rangeinout = new RenderRangeInOut(this, + render->range_type == RANGE_INOUT, + x, + y)); + y += 30; + x = 5; + + renderprofile = new RenderProfile(mwindow, this, x, y, 1); + renderprofile->create_objects(); + y += 70; loadmode = new LoadMode(mwindow, this, x, y, &render->load_mode, 1); loadmode->create_objects(); + + add_subwindow(new BC_OKButton(this)); add_subwindow(new BC_CancelButton(this)); show_window(); return 0; } + +void RenderWindow::update_range_type(int range_type) +{ + render->range_type = range_type; + rangeproject->update(range_type == RANGE_PROJECT); + rangeselection->update(range_type == RANGE_SELECTION); + rangeinout->update(range_type == RANGE_INOUT); +} + + +RenderRangeProject::RenderRangeProject(RenderWindow *rwindow, int value, int x, int y) + : BC_Radial(x, y, value, _("Project")) +{ + this->rwindow = rwindow; +} +int RenderRangeProject::handle_event() +{ + rwindow->update_range_type(RANGE_PROJECT); + return 1; +} + +RenderRangeSelection::RenderRangeSelection(RenderWindow *rwindow, int value, int x, int y) + : BC_Radial(x, y, value, _("Selection")) +{ + this->rwindow = rwindow; +} +int RenderRangeSelection::handle_event() +{ + rwindow->update_range_type(RANGE_SELECTION); + return 1; +} + + +RenderRangeInOut::RenderRangeInOut(RenderWindow *rwindow, int value, int x, int y) + : BC_Radial(x, y, value, _("In/Out Points")) +{ + this->rwindow = rwindow; +} +int RenderRangeInOut::handle_event() +{ + rwindow->update_range_type(RANGE_INOUT); + return 1; +} + + diff --git a/cinelerra/render.h b/cinelerra/render.h index 585d9032..4d0e4f5a 100644 --- a/cinelerra/render.h +++ b/cinelerra/render.h @@ -30,6 +30,8 @@ #include "track.inc" #include "transportque.inc" #include "vframe.inc" +#include "renderprofiles.inc" + class RenderItem : public BC_MenuItem { @@ -100,10 +102,12 @@ public: int render(int test_overwrite, Asset *asset, EDL *edl, - int strategy); + int strategy, + int range_type); int load_defaults(Asset *asset); int save_defaults(Asset *asset); + int load_profile(int profile_slot, Asset *asset); // force asset parameters regardless of window // This should be integrated into the Asset Class. static int check_asset(EDL *edl, Asset &asset); @@ -160,6 +164,7 @@ public: // For use in non interactive mode ArrayList *plugindb; int strategy; + int range_type; // Total selection to render in seconds double total_start, total_end; // External Render farm checks this every frame. @@ -192,6 +197,34 @@ public: class RenderToTracks; + +class RenderRangeProject : public BC_Radial +{ +public: + RenderRangeProject(RenderWindow *rwindow, int value, int x, int y); + int handle_event(); + RenderWindow *rwindow; +}; + +class RenderRangeSelection : public BC_Radial +{ +public: + RenderRangeSelection(RenderWindow *rwindow, int value, int x, int y); + int handle_event(); + RenderWindow *rwindow; +}; + + +class RenderRangeInOut : public BC_Radial +{ +public: + RenderRangeInOut(RenderWindow *rwindow, int value, int x, int y); + int handle_event(); + RenderWindow *rwindow; +}; + + + class RenderWindow : public BC_Window { public: @@ -199,8 +232,15 @@ public: ~RenderWindow(); int create_objects(); + void update_range_type(int range_type); + int load_profile(int profile_slot); + + RenderRangeProject *rangeproject; + RenderRangeSelection *rangeselection; + RenderRangeInOut *rangeinout; - + RenderProfile *renderprofile; + LoadMode *loadmode; FormatTools *format_tools; diff --git a/cinelerra/render.inc b/cinelerra/render.inc index 14610101..193689fd 100644 --- a/cinelerra/render.inc +++ b/cinelerra/render.inc @@ -5,7 +5,7 @@ class PackageRenderer; class Render; class RenderItem; class RenderJob; - +class RenderWindow; // Internal rendering strategies @@ -16,5 +16,9 @@ class RenderJob; #define BRENDER_FARM 4 +#define RANGE_BACKCOMPAT 0 +#define RANGE_PROJECT 1 +#define RANGE_SELECTION 2 +#define RANGE_INOUT 3 #endif diff --git a/cinelerra/renderprofiles.C b/cinelerra/renderprofiles.C new file mode 100644 index 00000000..6330bdaf --- /dev/null +++ b/cinelerra/renderprofiles.C @@ -0,0 +1,298 @@ +#include "clip.h" +#include "renderprofiles.h" +#include "mwindow.h" +#include "theme.h" +#include "bchash.h" +#include "string.h" +#include "render.h" +#include "asset.h" +#include "errorbox.h" +#include "mwindowgui.h" + +#include +#define _(String) gettext(String) +#define gettext_noop(String) String +#define N_(String) gettext_noop (String) + +#define LISTWIDTH 200 + +RenderProfileItem::RenderProfileItem(char *text, int value) + : BC_ListBoxItem(text) +{ + this->value = value; +} + + +RenderProfile::RenderProfile(MWindow *mwindow, + RenderWindow *rwindow, + int x, + int y, + int use_nothing) +{ + this->mwindow = mwindow; + this->rwindow = rwindow; + this->x = x; + this->y = y; + this->use_nothing = use_nothing; + for (int i = 1; i < MAX_PROFILES; i++) + { + char string_name[100]; + char name[100] = ""; + sprintf(string_name, "RENDER_%i_PROFILE_NAME", i); + mwindow->defaults->get(string_name, name); + if (strlen(name) != 0) + profiles.append(new RenderProfileItem(name, i)); + + } +} + +RenderProfile::~RenderProfile() +{ +// delete title; +// delete textbox; +// delete listbox; + for(int i = 0; i < profiles.total; i++) + delete profiles.values[i]; +} + + + +int RenderProfile::calculate_h(BC_WindowBase *gui) +{ + return BC_TextBox::calculate_h(gui, MEDIUMFONT, 1, 1); +} + +int RenderProfile::create_objects() +{ + int x = this->x, y = this->y; + char *default_text = ""; + rwindow->add_subwindow(new BC_Title(x, + y, + _("RenderProfile:"))); + + + int old_y = y; + rwindow->add_subwindow(title = new BC_Title(x, y, _("Render profile:"))); + y += 25; + rwindow->add_subwindow(textbox = new BC_TextBox(x, + y, + LISTWIDTH, + 1, + default_text)); + x += textbox->get_w(); + rwindow->add_subwindow(listbox = new RenderProfileListBox(rwindow, this, x, y)); + + y = old_y; + x += listbox->get_w() + 10; + rwindow->add_subwindow(saveprofile = new SaveRenderProfileButton(this, + x, + y)); + y += 25; + rwindow->add_subwindow(deleteprofile = new DeleteRenderProfileButton(this, + x, + y)); + + + + return 0; +} + +int RenderProfile::get_h() +{ + int result = 0; + result = MAX(result, title->get_h()); + result = MAX(result, textbox->get_h()); + return result; +} + +int RenderProfile::get_x() +{ + return x; +} + +int RenderProfile::get_y() +{ + return y; +} + +int RenderProfile::reposition_window(int x, int y) +{ + this->x = x; + this->y = y; + title->reposition_window(x, y); + y += 20; + textbox->reposition_window(x, y); + x += textbox->get_w(); + listbox->reposition_window(x, + y, + LISTWIDTH); + return 0; +} + + +RenderProfileListBox::RenderProfileListBox(BC_WindowBase *window, + RenderProfile *renderprofile, + int x, + int y) + : BC_ListBox(x, + y, + LISTWIDTH, + 150, + LISTBOX_TEXT, + (ArrayList*)&renderprofile->profiles, + 0, + 0, + 1, + 0, + 1) +{ + this->window = window; + this->renderprofile = renderprofile; +} + +RenderProfileListBox::~RenderProfileListBox() +{ +} + +int RenderProfileListBox::handle_event() +{ + if(get_selection(0, 0) >= 0) + { + renderprofile->textbox->update(get_selection(0, 0)->get_text()); + renderprofile->rwindow->load_profile(((RenderProfileItem*)get_selection(0, 0))->value); + } + return 1; +} + +int RenderProfile::get_profile_slot_by_name(char * profile_name) +{ + for (int i = 1; i < MAX_PROFILES; i++) + { + char string_name[100]; + char name[100] = ""; + sprintf(string_name, "RENDER_%i_PROFILE_NAME", i); + + mwindow->defaults->get(string_name, name); + if (strcmp(name, profile_name) == 0) + return i; + } +// No free profile slots! + return -1; +} + +int RenderProfile::get_new_profile_slot() +{ + for (int i = 1; i < MAX_PROFILES; i++) + { + char string_name[100]; + char name[100] = ""; + sprintf(string_name, "RENDER_%i_PROFILE_NAME", i); + mwindow->defaults->get(string_name, name); + if (strlen(name) == 0) + return i; + } + return -1; +} + + +int RenderProfile::save_to_slot(int profile_slot, char *profile_name) +{ + char string_name[100]; + sprintf(string_name, "RENDER_%i_PROFILE_NAME", profile_slot); + mwindow->defaults->update(string_name, profile_name); + + sprintf(string_name, "RENDER_%i_STRATEGY", profile_slot); + mwindow->defaults->update(string_name, rwindow->render->strategy); + sprintf(string_name, "RENDER_%i_LOADMODE", profile_slot); + mwindow->defaults->update(string_name, rwindow->render->load_mode); + sprintf(string_name, "RENDER_%i_RANGE_TYPE", profile_slot); + mwindow->defaults->update(string_name, rwindow->render->range_type); + + sprintf(string_name, "RENDER_%i_", profile_slot); + rwindow->asset->save_defaults(mwindow->defaults, + string_name, + 1, + 1, + 1, + 1, + 1); + + mwindow->save_defaults(); + return 0; +} + + + +SaveRenderProfileButton::SaveRenderProfileButton(RenderProfile *profile, int x, int y) + : BC_GenericButton(x, y, _("Save profile")) +{ + this->profile = profile; +} +int SaveRenderProfileButton::handle_event() +{ + + char *profile_name = profile->textbox->get_text(); + if (strlen(profile_name) == 0) // Don't save when name not defined + return 1; + int slot = profile->get_profile_slot_by_name(profile_name); + if (slot < 0) + { + slot = profile->get_new_profile_slot(); + if (slot < 0) + { + ErrorBox error_box(PROGRAM_NAME ": Error", + profile->mwindow->gui->get_abs_cursor_x(1), + profile->mwindow->gui->get_abs_cursor_y(1)); + error_box.create_objects("Maximum number of render profiles reached"); + error_box.raise_window(); + error_box.run_window(); + return 1; + } + + profile->profiles.append(new RenderProfileItem(profile_name, slot)); + profile->listbox->update((ArrayList*)&(profile->profiles), 0, 0, 1); + + } + + if (slot >= 0) + { + profile->save_to_slot(slot, profile_name); + } + return 1; +} + + +DeleteRenderProfileButton::DeleteRenderProfileButton(RenderProfile *profile, int x, int y) + : BC_GenericButton(x, y, _("Delete profile")) +{ + this->profile = profile; +} +int DeleteRenderProfileButton::handle_event() +{ + char *profile_name = profile->textbox->get_text(); + int slot = profile->get_profile_slot_by_name(profile_name); + if (slot >= 0) + { + for(int i = 0; i < profile->profiles.total; i++) + { + if(profile->profiles.values[i]->value == slot) + { + profile->profiles.remove_object_number(i); + profile->save_to_slot(slot, ""); + + break; + } + } + profile->listbox->update((ArrayList*)&(profile->profiles), 0, 0, 1); + profile->textbox->update(""); + + } + + + return 1; +} + + + + + diff --git a/cinelerra/renderprofiles.h b/cinelerra/renderprofiles.h new file mode 100644 index 00000000..c1fa1e59 --- /dev/null +++ b/cinelerra/renderprofiles.h @@ -0,0 +1,88 @@ +#ifndef RENDERPROFILE_H +#define RENDERPROFILE_H + +#include "guicast.h" +#include "render.inc" +#include "mwindow.inc" +#include "renderprofiles.inc" + +class RenderProfileListBox; + +class RenderProfileItem : public BC_ListBoxItem +{ +public: + RenderProfileItem(char *text, int value); + int value; +}; + +class SaveRenderProfileButton : public BC_GenericButton +{ +public: + SaveRenderProfileButton(RenderProfile *profile, int x, int y); + int handle_event(); + RenderProfile *profile; +}; + +class DeleteRenderProfileButton : public BC_GenericButton +{ +public: + DeleteRenderProfileButton(RenderProfile *profile, int x, int y); + int handle_event(); + RenderProfile *profile; +}; + + + +class RenderProfile +{ +public: + RenderProfile(MWindow *mwindow, + RenderWindow *rwindow, + int x, + int y, + int use_nothing); + ~RenderProfile(); + + int create_objects(); + int reposition_window(int x, int y); + static int calculate_h(BC_WindowBase *gui); + int get_h(); + int get_x(); + int get_y(); + + int get_profile_slot_by_name(char *profile_name); + int get_new_profile_slot(); + int save_to_slot(int profile_slot, char *profile_name); + + BC_Title *title; + BC_TextBox *textbox; + RenderProfileListBox *listbox; + SaveRenderProfileButton *saveprofile; + DeleteRenderProfileButton *deleteprofile; + + + + MWindow *mwindow; + + RenderWindow *rwindow; + + int x; + int y; + int *output; + int use_nothing; + ArrayList profiles; +}; + +class RenderProfileListBox : public BC_ListBox +{ +public: + RenderProfileListBox(BC_WindowBase *window, RenderProfile *renderprofile, int x, int y); + ~RenderProfileListBox(); + + int handle_event(); + + BC_WindowBase *window; + RenderProfile *renderprofile; +}; + +#endif diff --git a/cinelerra/renderprofiles.inc b/cinelerra/renderprofiles.inc new file mode 100644 index 00000000..8cf577ff --- /dev/null +++ b/cinelerra/renderprofiles.inc @@ -0,0 +1,8 @@ +#ifndef RENDERPROFILES_INC +#define RENDERPROFILES_INC + +class RenderProfile; + +#define MAX_PROFILES 16 + +#endif diff --git a/cinelerra/transportque.C b/cinelerra/transportque.C index 0fe94f9c..0ffbc4f5 100644 --- a/cinelerra/transportque.C +++ b/cinelerra/transportque.C @@ -208,26 +208,33 @@ void TransportCommand::set_playback_range(EDL *edl, int use_inout) } -void TransportCommand::adjust_playback_range() +void TransportCommand::playback_range_adjust_inout() { - - if(edl->local_session->inpoint_valid() || edl->local_session->outpoint_valid()) { - if(edl->local_session->inpoint_valid()) - start_position = edl->local_session->get_inpoint(); - else - start_position = 0; - - if(edl->local_session->outpoint_valid()) - end_position = edl->local_session->get_outpoint(); - else - end_position = edl->tracks->total_playable_length(); + playback_range_inout(); } } +void TransportCommand::playback_range_inout() +{ + if(edl->local_session->inpoint_valid()) + start_position = edl->local_session->get_inpoint(); + else + start_position = 0; + + if(edl->local_session->outpoint_valid()) + end_position = edl->local_session->get_outpoint(); + else + end_position = edl->tracks->total_playable_length(); +} +void TransportCommand::playback_range_project() +{ + start_position = 0; + end_position = edl->tracks->total_playable_length(); +} diff --git a/cinelerra/transportque.h b/cinelerra/transportque.h index 3308e4de..ce573c72 100644 --- a/cinelerra/transportque.h +++ b/cinelerra/transportque.h @@ -23,7 +23,11 @@ public: void set_playback_range(EDL *edl = 0, int use_inout = 0); // Adjust playback range with in/out points for rendering - void adjust_playback_range(); + void playback_range_adjust_inout(); +// Set playback range to in/out points for rendering + void playback_range_inout(); +// Set playback range to whole project for rendering + void playback_range_project(); int single_frame(); EDL* get_edl(); -- 2.11.4.GIT