confirm prefs update, fix bg_pixmap sz, plugin layout tweaks
[goodguy/cinelerra.git] / cinelerra-5.1 / cinelerra / render.C
index ff21962f6063776b5524dc0b9518c2a9de23c812..57e724aeda3b5ae5f691feb6836c924542ade1ec 100644 (file)
@@ -49,6 +49,7 @@
 #include "language.h"
 #include "loadmode.h"
 #include "localsession.h"
 #include "language.h"
 #include "loadmode.h"
 #include "localsession.h"
+#include "mainerror.h"
 #include "mainprogress.h"
 #include "mainsession.h"
 #include "mainundo.h"
 #include "mainprogress.h"
 #include "mainsession.h"
 #include "mainundo.h"
@@ -221,6 +222,7 @@ Render::Render(MWindow *mwindow)
 
 Render::~Render()
 {
 
 Render::~Render()
 {
+       stop_operation();
        close_window();
        delete package_lock;
        delete counter_lock;
        close_window();
        delete package_lock;
        delete counter_lock;
@@ -330,15 +332,24 @@ void Render::handle_close_event(int result)
                err_msg = _("zero render range");
                result = 1;
        }
                err_msg = _("zero render range");
                result = 1;
        }
+       if( !result && !asset->audio_data && !asset->video_data ) {
+               err_msg = _("no audio or video in render asset format\n");
+               result = 1;
+       }
+       EDL *edl = mwindow->edl;
+       if( !result && use_labels && !edl->labels->first ) {
+               eprintf(_("render file per label and no labels\n"));
+               result = 1;
+       }
        if( !result && asset->video_data ) {
        if( !result && asset->video_data ) {
-               double frame_rate = mwindow->edl->session->frame_rate;
+               double frame_rate = edl->session->frame_rate;
                if( frame_rate > 0 && render_range+1e-3 < 1./frame_rate ) {
                        err_msg = _("Video data and range less than 1 frame");
                        result = 1;
                }
        }
        if( !result && asset->audio_data ) {
                if( frame_rate > 0 && render_range+1e-3 < 1./frame_rate ) {
                        err_msg = _("Video data and range less than 1 frame");
                        result = 1;
                }
        }
        if( !result && asset->audio_data ) {
-               double sample_rate = mwindow->edl->session->sample_rate;
+               double sample_rate = edl->session->sample_rate;
                if( sample_rate > 0 && render_range+1e-6 < 1./sample_rate ) {
                        err_msg = _("Audio data and range less than 1 sample");
                        result = 1;
                if( sample_rate > 0 && render_range+1e-6 < 1./sample_rate ) {
                        err_msg = _("Audio data and range less than 1 sample");
                        result = 1;
@@ -346,7 +357,7 @@ void Render::handle_close_event(int result)
        }
        if( !result && File::is_image_render(asset->format) ) {
                if( asset->video_data ) {
        }
        if( !result && File::is_image_render(asset->format) ) {
                if( asset->video_data ) {
-                       double frames = render_range * mwindow->edl->session->frame_rate;
+                       double frames = render_range * edl->session->frame_rate;
                        if( !EQUIV(frames, 1.) ) {
                                err_msg = _("Image format and not 1 frame");
                                result = 1;
                        if( !EQUIV(frames, 1.) ) {
                                err_msg = _("Image format and not 1 frame");
                                result = 1;
@@ -357,6 +368,7 @@ void Render::handle_close_event(int result)
                        result = 1;
                }
        }
                        result = 1;
                }
        }
+
        if( err_msg ) {
                int cx, cy;
                mwindow->gui->get_abs_cursor(cx, cy, 1);
        if( err_msg ) {
                int cx, cy;
                mwindow->gui->get_abs_cursor(cx, cy, 1);
@@ -460,8 +472,10 @@ void Render::start_progress()
                sprintf(string, _("Rendering %s..."), filename);
 
 // Don't bother with the filename since renderfarm defeats the meaning
                sprintf(string, _("Rendering %s..."), filename);
 
 // Don't bother with the filename since renderfarm defeats the meaning
+               mwindow->gui->lock_window("Render::start_progress");
                progress = mwindow->mainprogress->start_progress(_("Rendering..."),
                        progress_max);
                progress = mwindow->mainprogress->start_progress(_("Rendering..."),
                        progress_max);
+               mwindow->gui->unlock_window();
                render_progress = new RenderProgress(mwindow, this);
                render_progress->start();
        }
                render_progress = new RenderProgress(mwindow, this);
                render_progress->start();
        }
@@ -478,7 +492,7 @@ void Render::stop_progress()
                delete progress;
 
                sprintf(string2, _("Rendering took %s"), string);
                delete progress;
 
                sprintf(string2, _("Rendering took %s"), string);
-               mwindow->gui->lock_window("");
+               mwindow->gui->lock_window("Render::stop_progress");
                mwindow->gui->show_message(string2);
                mwindow->gui->update_default_message();
                mwindow->gui->stop_hourglass();
                mwindow->gui->show_message(string2);
                mwindow->gui->update_default_message();
                mwindow->gui->stop_hourglass();
@@ -719,6 +733,7 @@ void RenderThread::render_single(int test_overwrite, Asset *asset, EDL *edl,
                        render->result = 1;
                }
        }
                        render->result = 1;
                }
        }
+
        render_frames = render->default_asset->frame_rate * total_length;
 
 // Generate packages
        render_frames = render->default_asset->frame_rate * total_length;
 
 // Generate packages
@@ -736,7 +751,8 @@ void RenderThread::render_single(int test_overwrite, Asset *asset, EDL *edl,
 
        render->total_rendered = 0;
 
 
        render->total_rendered = 0;
 
-       if( !render->result ) {
+       if( !render->result &&
+           ( strategy == SINGLE_PASS_FARM || strategy == FILE_PER_LABEL_FARM ) ) {
 // Start dispatching external jobs
                if( mwindow ) {
                        mwindow->gui->lock_window("Render::render 1");
 // Start dispatching external jobs
                if( mwindow ) {
                        mwindow->gui->lock_window("Render::render 1");
@@ -748,24 +764,22 @@ void RenderThread::render_single(int test_overwrite, Asset *asset, EDL *edl,
                        printf("Render::render: starting render farm\n");
                }
 
                        printf("Render::render: starting render farm\n");
                }
 
-               if( strategy == SINGLE_PASS_FARM || strategy == FILE_PER_LABEL_FARM ) {
-                       farm_server = new RenderFarmServer(mwindow, render->packages,
-                               render->preferences, 1, &render->result,
-                               &render->total_rendered, render->counter_lock,
-                               render->default_asset, command->get_edl(), 0);
-                       render->result = farm_server->start_clients();
-
-                       if( render->result ) {
-                               if( mwindow ) {
-                                       mwindow->gui->lock_window("Render::render 2");
-                                       mwindow->gui->show_message(_("Failed to start render farm"),
-                                               mwindow->theme->message_error);
-                                       mwindow->gui->stop_hourglass();
-                                       mwindow->gui->unlock_window();
-                               }
-                               else {
-                                       printf("Render::render: Failed to start render farm\n");
-                               }
+               farm_server = new RenderFarmServer(mwindow, render->packages,
+                       render->preferences, 1, &render->result,
+                       &render->total_rendered, render->counter_lock,
+                       render->default_asset, command->get_edl(), 0);
+               render->result = farm_server->start_clients();
+
+               if( render->result ) {
+                       if( mwindow ) {
+                               mwindow->gui->lock_window("Render::render 2");
+                               mwindow->gui->show_message(_("Failed to start render farm"),
+                                       mwindow->theme->message_error);
+                               mwindow->gui->stop_hourglass();
+                               mwindow->gui->unlock_window();
+                       }
+                       else {
+                               printf("Render::render: Failed to start render farm\n");
                        }
                }
        }
                        }
                }
        }
@@ -952,8 +966,8 @@ void RenderThread::run()
 }
 
 
 }
 
 
-#define WIDTH 480
-#define HEIGHT 480
+#define WIDTH xS(480)
+#define HEIGHT yS(480)
 
 
 RenderWindow::RenderWindow(MWindow *mwindow,
 
 
 RenderWindow::RenderWindow(MWindow *mwindow,
@@ -996,13 +1010,15 @@ void RenderWindow::load_profile(int profile_slot)
 
 void RenderWindow::create_objects()
 {
 
 void RenderWindow::create_objects()
 {
-       int x = 10, y = 10;
+       int xs10 = xS(10), xs20 = xS(20);
+       int ys10 = yS(10), ys20 = yS(20), ys25 = yS(25), ys30 = yS(30);
+       int x = xs10, y = ys10;
        lock_window("RenderWindow::create_objects");
        lock_window("RenderWindow::create_objects");
-       add_subwindow(new BC_Title(x, y,
-               (char*)(render->use_labels ?
+       add_subwindow(file_format = new BC_Title(x, y,
+               (render->use_labels ?
                        _("Select the first file to render to:") :
                        _("Select a file to render to:"))));
                        _("Select the first file to render to:") :
                        _("Select a file to render to:"))));
-       y += 25;
+       y += ys25;
 
        render_format = new RenderFormat(mwindow, this, asset);
        render_format->create_objects(x, y,
 
        render_format = new RenderFormat(mwindow, this, asset);
        render_format->create_objects(x, y,
@@ -1015,38 +1031,38 @@ void RenderWindow::create_objects()
        if( is_image )
                render->range_type = RANGE_1FRAME;
 
        if( is_image )
                render->range_type = RANGE_1FRAME;
 
-       int x1 = x + title->get_w() + 20, y1 = y;
+       int x1 = x + title->get_w() + xs20, y1 = y;
        add_subwindow(rangeproject = new RenderRangeProject(this,
                render->range_type == RANGE_PROJECT, x1, y));
        int x2 = x1 + rangeproject->get_w();
        add_subwindow(rangeproject = new RenderRangeProject(this,
                render->range_type == RANGE_PROJECT, x1, y));
        int x2 = x1 + rangeproject->get_w();
-       y += 20;
+       y += ys20;
        add_subwindow(rangeselection = new RenderRangeSelection(this,
                render->range_type == RANGE_SELECTION, x1, y));
        int x3 = x1 + rangeselection->get_w();
        if( x2 < x3 ) x2 = x3;
        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;
+       y += ys20;
        add_subwindow(rangeinout = new RenderRangeInOut(this,
                render->range_type == RANGE_INOUT, x1, y));
        x3 = x1 + rangeinout->get_w();
        if( x2 < x3 ) x2 = x3;
        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;
+       y += ys20;
        add_subwindow(range1frame = new RenderRange1Frame(this,
                render->range_type == RANGE_1FRAME, x1, y));
        x3 = x1 + range1frame->get_w();
        if( x2 < x3 ) x2 = x3;
        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;
+       y += ys30;
        if( is_image )
                enable_render_range(0);
 
        if( is_image )
                enable_render_range(0);
 
-       x1 = x2 + 20;
+       x1 = x2 + xs20;
        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();
        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;
+       y += yS(70);
 
 
-       loadmode = new LoadMode(mwindow, this, x, y, &render->load_mode, 1);
+       loadmode = new LoadMode(mwindow, this, x, y, &render->load_mode);
        loadmode->create_objects();
 
        add_subwindow(new BC_OKButton(this));
        loadmode->create_objects();
 
        add_subwindow(new BC_OKButton(this));
@@ -1177,7 +1193,6 @@ void RenderFormat::update_format()
        FormatTools::update_format();
        RenderWindow *render_window = (RenderWindow *)window;
        if( render_window->is_hidden() ) return;
        FormatTools::update_format();
        RenderWindow *render_window = (RenderWindow *)window;
        if( render_window->is_hidden() ) return;
-
        int is_image = File::is_image_render(asset->format);
        if( is_image ) {
                render_window->update_range_type(RANGE_1FRAME);
        int is_image = File::is_image_render(asset->format);
        if( is_image ) {
                render_window->update_range_type(RANGE_1FRAME);
@@ -1186,6 +1201,15 @@ void RenderFormat::update_format()
        else
                render_window->enable_render_range(1);
 }
        else
                render_window->enable_render_range(1);
 }
+int RenderFormat::handle_event()
+{
+       RenderWindow *render_window = (RenderWindow *)window;
+       render_window->file_format->update(
+               (render_window->render->use_labels ?
+                       _("Select the first file to render to:") :
+                       _("Select a file to render to:")));
+       return 1;
+}
 
 RenderBeepOnDone::RenderBeepOnDone(RenderWindow *rwindow, int x, int y)
  : BC_CheckBox(x, y, rwindow->render->beep, _("Beep on done"))
 
 RenderBeepOnDone::RenderBeepOnDone(RenderWindow *rwindow, int x, int y)
  : BC_CheckBox(x, y, rwindow->render->beep, _("Beep on done"))