patch expander changes, rework show assets/titles/transitions, add projector/camera...
[goodguy/history.git] / cinelerra-5.1 / cinelerra / render.C
index 4363cd9e0ebb5c0713779e6994fc685fadb11bcb..e7b3e12d54b3dafc3ca942a31ab9b19ef8853a14 100644 (file)
@@ -187,35 +187,7 @@ void MainPackageRenderer::set_progress(int64_t value)
 
 // If non interactive, print progress out
        if(!render->progress)
-       {
-               int64_t current_eta = render->progress_timer->get_scaled_difference(1000);
-               if(current_eta - render->last_eta > 1000)
-               {
-                       double eta = 0;
-
-
-                       if(render->total_rendered)
-                       {
-                               eta = current_eta /
-                                       1000 *
-                                       render->progress_max /
-                                       render->total_rendered -
-                                       current_eta /
-                                       1000;
-                       }
-
-                       char string[BCTEXTLEN];
-                       Units::totext(string,
-                               eta,
-                               TIME_HMS2);
-
-                       printf("\r%d%% %s: %s      ",
-                               (int)(100 * (float)render->total_rendered / render->progress_max),
-                               _("ETA"), string);
-                       fflush(stdout);
-                       render->last_eta = current_eta;
-               }
-       }
+               render->show_progress();
 
        render->counter_lock->unlock();
 
@@ -247,6 +219,7 @@ Render::Render(MWindow *mwindow)
        render_window = 0;
        asset = 0;
        result = 0;
+       beep = 0;
 }
 
 Render::~Render()
@@ -342,9 +315,11 @@ BC_Window* Render::new_gui()
 void Render::handle_done_event(int result)
 {
        if(!result) {
+               mwindow->edl->session->render_beep = beep;
                // add to recentlist only on OK
                render_window->render_format->path_recent->
                        add_item(File::formattostr(asset->format), asset->path);
+               setenv("CIN_RENDER", asset->path, 1);
        }
        render_window = 0;
 }
@@ -430,8 +405,6 @@ void Render::stop_operation()
        }
 }
 
-
-
 int Render::check_asset(EDL *edl, Asset &asset)
 {
        if(asset.video_data &&
@@ -471,15 +444,15 @@ int Render::check_asset(EDL *edl, Asset &asset)
        return 0;
 }
 
-int Render::get_strategy(int use_renderfarm, int file_per_label)
+int Render::get_strategy(int use_renderfarm, int use_labels)
 {
        return use_renderfarm ?
-               (file_per_label ? FILE_PER_LABEL_FARM : SINGLE_PASS_FARM) :
-               (file_per_label ? FILE_PER_LABEL      : SINGLE_PASS     ) ;
+               (use_labels ? FILE_PER_LABEL_FARM : SINGLE_PASS_FARM) :
+               (use_labels ? FILE_PER_LABEL      : SINGLE_PASS     ) ;
 }
 int Render::get_strategy()
 {
-       return get_strategy(preferences->use_renderfarm, file_per_label);
+       return get_strategy(preferences->use_renderfarm, use_labels);
 }
 
 void Render::start_progress()
@@ -527,6 +500,19 @@ void Render::stop_progress()
        progress = 0;
 }
 
+void Render::show_progress()
+{
+       int64_t current_eta = progress_timer->get_scaled_difference(1000);
+       if (current_eta - last_eta < 1000 ) return;
+       double eta = !total_rendered ? 0 :
+               current_eta / 1000. * (progress_max / (double)total_rendered - 1.);
+       char string[BCTEXTLEN];  Units::totext(string, eta, TIME_HMS2);
+       printf("\r%d%% %s: %s      ",
+               (int)(100 * (float)total_rendered / progress_max), _("ETA"), string);
+       fflush(stdout);
+       last_eta = current_eta;
+}
+
 
 
 void Render::start_render()
@@ -616,7 +602,7 @@ void Render::get_starting_number(char *path,
 
 int Render::load_defaults(Asset *asset)
 {
-       file_per_label = mwindow->defaults->get("RENDER_FILE_PER_LABEL", 0);
+       use_labels = 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);
 
@@ -636,7 +622,7 @@ int Render::load_profile(int profile_slot, Asset *asset)
 {
        char string_name[100];
        sprintf(string_name, "RENDER_%i_FILE_PER_LABEL", profile_slot);
-       file_per_label = mwindow->defaults->get(string_name, 0);
+       use_labels = 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);
@@ -652,7 +638,7 @@ int Render::load_profile(int profile_slot, Asset *asset)
 
 int Render::save_defaults(Asset *asset)
 {
-       mwindow->defaults->update("RENDER_FILE_PER_LABEL", file_per_label);
+       mwindow->defaults->update("RENDER_FILE_PER_LABEL", use_labels);
        mwindow->defaults->update("RENDER_LOADMODE", load_mode);
        mwindow->defaults->update("RENDER_RANGE_TYPE", range_type);
 
@@ -689,7 +675,6 @@ void RenderThread::render_single(int test_overwrite, Asset *asset, EDL *edl,
        double total_length;
        RenderFarmServer *farm_server = 0;
        FileSystem fs;
-       //int done = 0;
        const int debug = 0;
 
        render->in_progress = 1;
@@ -771,7 +756,6 @@ void RenderThread::render_single(int test_overwrite, Asset *asset, EDL *edl,
                        test_overwrite);
        }
 
-       //done = 0;
        render->total_rendered = 0;
 
        if(!render->result)
@@ -863,15 +847,9 @@ void RenderThread::render_single(int test_overwrite, Asset *asset, EDL *edl,
 // Exit point
                        if(!package)
                        {
-                               //done = 1;
                                break;
                        }
 
-
-
-                       Timer timer;
-                       timer.update();
-
                        if(package_renderer.render_package(package))
                                render->result = 1;
 
@@ -886,8 +864,14 @@ printf("Render::render_single: Session finished.\n");
 
 
 
-               if(strategy == SINGLE_PASS_FARM || strategy == FILE_PER_LABEL_FARM)
-               {
+               if( strategy == SINGLE_PASS_FARM ||
+                   strategy == FILE_PER_LABEL_FARM ) {
+                       if( !render->progress ) {
+                               while( farm_server->active_clients() > 0 ) {
+                                       sleep(1);
+                                       render->show_progress();
+                               }
+                       }
                        farm_server->wait_clients();
                        render->result |= render->packages->packages_are_done();
                }
@@ -1093,6 +1077,9 @@ void RenderThread::run()
                }
        }
        render->completion->unlock();
+
+       if( render->mode == Render::INTERACTIVE && render->beep )
+               mwindow->beep(3000., 1.5, 0.5);
 }
 
 
@@ -1134,7 +1121,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->file_per_label);
+       render_format->update(asset, &render->use_labels);
 }
 
 
@@ -1143,14 +1130,14 @@ void RenderWindow::create_objects()
        int x = 10, y = 10;
        lock_window("RenderWindow::create_objects");
        add_subwindow(new BC_Title(x, y,
-               (char*)(render->file_per_label ?
+               (char*)(render->use_labels ?
                        _("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->file_per_label, 0);
+               1, 1, 1, 1, 0, 1, 0, 0, &render->use_labels, 0);
 
        BC_Title *title;
        add_subwindow(title = new BC_Title(x, y, _("Render range:")));
@@ -1159,23 +1146,33 @@ void RenderWindow::create_objects()
        if( is_image )
                render->range_type = RANGE_1FRAME;
 
-       int x1 = x + title->get_w() + 20;
+       int x1 = x + title->get_w() + 20, y1 = y;
        add_subwindow(rangeproject = new RenderRangeProject(this,
                render->range_type == RANGE_PROJECT, x1, y));
+       int x2 = x1 + rangeproject->get_w();
        y += 20;
        add_subwindow(rangeselection = new RenderRangeSelection(this,
                render->range_type == RANGE_SELECTION, x1, y));
+       int x3 = x1 + rangeselection->get_w();
+       if( x2 < x3 ) x2 = x3;
        y += 20;
        add_subwindow(rangeinout = new RenderRangeInOut(this,
                render->range_type == RANGE_INOUT, x1, y));
+       x3 = x1 + rangeinout->get_w();
+       if( x2 < x3 ) x2 = x3;
        y += 20;
        add_subwindow(range1frame = new RenderRange1Frame(this,
                render->range_type == RANGE_1FRAME, x1, y));
+       x3 = x1 + range1frame->get_w();
+       if( x2 < x3 ) x2 = x3;
        y += 30;
-
        if( is_image )
                enable_render_range(0);
 
+       x1 = x2 + 20;
+       render->beep = mwindow->edl->session->render_beep;
+       add_subwindow(beep_on_done = new RenderBeepOnDone(this, x1, y1));
+
        renderprofile = new RenderProfile(mwindow, this, x, y, 1);
        renderprofile->create_objects();
        y += 70;
@@ -1321,3 +1318,16 @@ void RenderFormat::update_format()
                render_window->enable_render_range(1);
 }
 
+RenderBeepOnDone::RenderBeepOnDone(RenderWindow *rwindow, int x, int y)
+ : BC_CheckBox(x, y, rwindow->render->beep, _("Beep on done"))
+{
+       this->rwindow = rwindow;
+}
+
+int RenderBeepOnDone::handle_event()
+{
+       rwindow->render->beep = get_value();
+       return 1;
+}
+
+