edl plugin names eng, fix segv for opengl brender, renderfarm rework strategy, perf...
[goodguy/history.git] / cinelerra-5.1 / cinelerra / render.C
index 6667cbbba30d1e6241fe2a6000d330285618c7e3..4363cd9e0ebb5c0713779e6994fc685fadb11bcb 100644 (file)
@@ -219,8 +219,8 @@ void MainPackageRenderer::set_progress(int64_t value)
 
        render->counter_lock->unlock();
 
-// This locks the preferences
-       if(mwindow) mwindow->preferences->copy_rates_from(preferences);
+       if( mwindow )
+               mwindow->preferences->copy_rates_from(preferences);
 }
 
 int MainPackageRenderer::progress_cancelled()
@@ -236,13 +236,13 @@ Render::Render(MWindow *mwindow)
        this->mwindow = mwindow;
        in_progress = 0;
        progress = 0;
-       preferences = 0;
        elapsed_time = 0.0;
        package_lock = new Mutex("Render::package_lock");
        counter_lock = new Mutex("Render::counter_lock");
        completion = new Condition(0, "Render::completion");
        progress_timer = new Timer;
        range_type = RANGE_BACKCOMPAT;
+       preferences = new Preferences();
        thread = new RenderThread(mwindow, this);
        render_window = 0;
        asset = 0;
@@ -255,9 +255,7 @@ Render::~Render()
        delete package_lock;
        delete counter_lock;
        delete completion;
-// May be owned by someone else.  This is owned by mwindow, so we don't care
-// about deletion.
-//     delete preferences;
+       delete preferences;
        delete progress_timer;
        if( asset ) asset->Garbage::remove_user();
        delete thread;
@@ -271,7 +269,7 @@ void Render::start_interactive()
        }
        else if( in_progress ) {
                int cx, cy;
-               mwindow->gui->get_abs_cursor_xy(cx, cy, 1);
+               mwindow->gui->get_abs_cursor(cx, cy, 1);
                ErrorBox error_box(_(PROGRAM_NAME ": Error"), cx, cy);
                error_box.create_objects(_("Already rendering"));
                error_box.raise_window();
@@ -295,7 +293,7 @@ void Render::start_batches(ArrayList<BatchRenderJob*> *jobs)
        }
        else if( in_progress ) {
                int cx, cy;
-               mwindow->gui->get_abs_cursor_xy(cx, cy, 1);
+               mwindow->gui->get_abs_cursor(cx, cy, 1);
                ErrorBox error_box(_(PROGRAM_NAME ": Error"), cx, cy);
                error_box.create_objects("Already rendering");
                error_box.raise_window();
@@ -308,19 +306,15 @@ void Render::start_batches(ArrayList<BatchRenderJob*> *jobs)
 }
 
 void Render::start_batches(ArrayList<BatchRenderJob*> *jobs,
-       BC_Hash *boot_defaults,
-       Preferences *preferences)
+       BC_Hash *boot_defaults, Preferences *batch_prefs)
 {
        mode = Render::BATCH;
        batch_cancelled = 0;
+       preferences->copy_from(batch_prefs);
        this->jobs = jobs;
-       this->preferences = preferences;
 
        completion->reset();
-PRINT_TRACE
        thread->run();
-PRINT_TRACE
-       this->preferences = 0;
 }
 
 
@@ -394,7 +388,7 @@ void Render::handle_close_event(int result)
        }
        if( err_msg ) {
                int cx, cy;
-               mwindow->gui->get_abs_cursor_xy(cx, cy, 1);
+               mwindow->gui->get_abs_cursor(cx, cy, 1);
                ErrorBox error_box(_(PROGRAM_NAME ": Error"),cx, cy);
                error_box.create_objects(err_msg);
                error_box.raise_window();
@@ -477,25 +471,15 @@ int Render::check_asset(EDL *edl, Asset &asset)
        return 0;
 }
 
-int Render::fix_strategy(int strategy, int use_renderfarm)
+int Render::get_strategy(int use_renderfarm, int file_per_label)
 {
-       if(use_renderfarm)
-       {
-               if(strategy == FILE_PER_LABEL)
-                       strategy = FILE_PER_LABEL_FARM;
-               else
-               if(strategy == SINGLE_PASS)
-                       strategy = SINGLE_PASS_FARM;
-       }
-       else
-       {
-               if(strategy == FILE_PER_LABEL_FARM)
-                       strategy = FILE_PER_LABEL;
-               else
-               if(strategy == SINGLE_PASS_FARM)
-                       strategy = SINGLE_PASS;
-       }
-       return strategy;
+       return use_renderfarm ?
+               (file_per_label ? FILE_PER_LABEL_FARM : SINGLE_PASS_FARM) :
+               (file_per_label ? FILE_PER_LABEL      : SINGLE_PASS     ) ;
+}
+int Render::get_strategy()
+{
+       return get_strategy(preferences->use_renderfarm, file_per_label);
 }
 
 void Render::start_progress()
@@ -632,7 +616,7 @@ void Render::get_starting_number(char *path,
 
 int Render::load_defaults(Asset *asset)
 {
-       strategy = mwindow->defaults->get("RENDER_STRATEGY", SINGLE_PASS);
+       file_per_label = mwindow->defaults->get("RENDER_FILE_PER_LABEL", 0);
        load_mode = mwindow->defaults->get("RENDER_LOADMODE", LOADMODE_NEW_TRACKS);
        range_type = mwindow->defaults->get("RENDER_RANGE_TYPE", RANGE_PROJECT);
 
@@ -651,8 +635,8 @@ int Render::load_defaults(Asset *asset)
 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);
+       sprintf(string_name, "RENDER_%i_FILE_PER_LABEL", profile_slot);
+       file_per_label = mwindow->defaults->get(string_name, 0);
 // Load mode is not part of the profile
 //     printf(string_name, "RENDER_%i_LOADMODE", profile_slot);
 //     load_mode = mwindow->defaults->get(string_name, LOADMODE_NEW_TRACKS);
@@ -668,7 +652,7 @@ int Render::load_profile(int profile_slot, Asset *asset)
 
 int Render::save_defaults(Asset *asset)
 {
-       mwindow->defaults->update("RENDER_STRATEGY", strategy);
+       mwindow->defaults->update("RENDER_FILE_PER_LABEL", file_per_label);
        mwindow->defaults->update("RENDER_LOADMODE", load_mode);
        mwindow->defaults->update("RENDER_RANGE_TYPE", range_type);
 
@@ -715,15 +699,6 @@ void RenderThread::render_single(int test_overwrite, Asset *asset, EDL *edl,
        render->progress = 0;
        render->result = 0;
 
-       if(mwindow)
-       {
-               if(!render->preferences)
-                       render->preferences = new Preferences;
-
-               render->preferences->copy_from(mwindow->preferences);
-       }
-
-
 // Create rendering command
        TransportCommand *command = new TransportCommand;
        command->command = NORMAL_FWD;
@@ -785,7 +760,6 @@ void RenderThread::render_single(int test_overwrite, Asset *asset, EDL *edl,
                if(mwindow) mwindow->stop_brender();
 
                fs.complete_path(render->default_asset->path);
-               strategy = Render::fix_strategy(strategy, render->preferences->use_renderfarm);
 
                render->result = render->packages->create_packages(mwindow,
                        command->get_edl(),
@@ -930,7 +904,7 @@ if(debug) printf("Render::render %d\n", __LINE__);
                        {
 if(debug) printf("Render::render %d\n", __LINE__);
                                int cx, cy;
-                               mwindow->gui->get_abs_cursor_xy(cx, cy, 1);
+                               mwindow->gui->get_abs_cursor(cx, cy, 1);
                                ErrorBox error_box(_(PROGRAM_NAME ": Error"), cx, cy);
                                error_box.create_objects(_("Error rendering data."));
                                error_box.raise_window();
@@ -1036,10 +1010,13 @@ if(debug) printf("Render::render %d\n", __LINE__);
 
 void RenderThread::run()
 {
+       if( mwindow )
+               render->preferences->copy_from(mwindow->preferences);
+
        if(render->mode == Render::INTERACTIVE)
        {
                render_single(1, render->asset, mwindow->edl,
-                       render->strategy, render->range_type);
+                       render->get_strategy(), render->range_type);
        }
        else
        if(render->mode == Render::BATCH)
@@ -1077,9 +1054,8 @@ void RenderThread::run()
                                edl->create_objects();
                                file->read_from_file(job->edl_path);
                                edl->load_xml(file, LOAD_ALL);
-
 //PRINT_TRACE
-                               render_single(0, job->asset, edl, job->strategy, RANGE_BACKCOMPAT);
+                               render_single(0, job->asset, edl, job->get_strategy(), RANGE_BACKCOMPAT);
 
 //PRINT_TRACE
                                edl->Garbage::remove_user();
@@ -1121,7 +1097,7 @@ void RenderThread::run()
 
 
 #define WIDTH 480
-#define HEIGHT 455
+#define HEIGHT 480
 
 
 RenderWindow::RenderWindow(MWindow *mwindow,
@@ -1135,6 +1111,9 @@ RenderWindow::RenderWindow(MWindow *mwindow,
        this->mwindow = mwindow;
        this->render = render;
        this->asset = asset;
+       render_format = 0;
+       loadmode = 0;
+       renderprofile = 0;
        rangeproject = 0;
        rangeselection = 0;
        rangeinout = 0;
@@ -1143,15 +1122,11 @@ RenderWindow::RenderWindow(MWindow *mwindow,
 
 RenderWindow::~RenderWindow()
 {
-SET_TRACE
        lock_window("RenderWindow::~RenderWindow");
-SET_TRACE
        delete render_format;
-SET_TRACE
        delete loadmode;
-SET_TRACE
+       delete renderprofile;
        unlock_window();
-SET_TRACE
 }
 
 
@@ -1159,7 +1134,7 @@ void RenderWindow::load_profile(int profile_slot)
 {
        render->load_profile(profile_slot, asset);
        update_range_type(render->range_type);
-       render_format->update(asset, &render->strategy);
+       render_format->update(asset, &render->file_per_label);
 }
 
 
@@ -1168,15 +1143,14 @@ void RenderWindow::create_objects()
        int x = 10, y = 10;
        lock_window("RenderWindow::create_objects");
        add_subwindow(new BC_Title(x, y,
-               (char*)((render->strategy == FILE_PER_LABEL ||
-                               render->strategy == FILE_PER_LABEL_FARM) ?
+               (char*)(render->file_per_label ?
                        _("Select the first file to render to:") :
                        _("Select a file to render to:"))));
        y += 25;
 
        render_format = new RenderFormat(mwindow, this, asset);
        render_format->create_objects(x, y,
-               1, 1, 1, 1, 0, 1, 0, 0, &render->strategy, 0);
+               1, 1, 1, 1, 0, 1, 0, 0, &render->file_per_label, 0);
 
        BC_Title *title;
        add_subwindow(title = new BC_Title(x, y, _("Render range:")));
@@ -1185,16 +1159,18 @@ void RenderWindow::create_objects()
        if( is_image )
                render->range_type = RANGE_1FRAME;
 
-       int x1 = x + title->get_w() + 20, x2 = x1 + 140;
+       int x1 = x + title->get_w() + 20;
        add_subwindow(rangeproject = new RenderRangeProject(this,
                render->range_type == RANGE_PROJECT, x1, y));
-       add_subwindow(range1frame = new RenderRange1Frame(this,
-               render->range_type == RANGE_1FRAME, x2, y));
        y += 20;
        add_subwindow(rangeselection = new RenderRangeSelection(this,
                render->range_type == RANGE_SELECTION, x1, y));
+       y += 20;
        add_subwindow(rangeinout = new RenderRangeInOut(this,
-               render->range_type == RANGE_INOUT, x2, y));
+               render->range_type == RANGE_INOUT, x1, y));
+       y += 20;
+       add_subwindow(range1frame = new RenderRange1Frame(this,
+               render->range_type == RANGE_1FRAME, x1, y));
        y += 30;
 
        if( is_image )