X-Git-Url: http://git.cinelerra-gg.org/git/?p=goodguy%2Fhistory.git;a=blobdiff_plain;f=cinelerra-5.1%2Fcinelerra%2Fbatchrender.C;h=bbd66d47fa955d1756cdd70a35f147bc587812a3;hp=20e27d596ef230d06e19ccf83b1cd90da942444b;hb=7c199a42936462d662ee405fe0b4df5ac74850dc;hpb=6616b3b82fdbc586f5da00bf772e45d8ada3b464 diff --git a/cinelerra-5.1/cinelerra/batchrender.C b/cinelerra-5.1/cinelerra/batchrender.C index 20e27d59..bbd66d47 100644 --- a/cinelerra-5.1/cinelerra/batchrender.C +++ b/cinelerra-5.1/cinelerra/batchrender.C @@ -31,6 +31,7 @@ #include "edl.h" #include "edlsession.h" #include "errorbox.h" +#include "file.h" #include "filesystem.h" #include "filexml.h" #include "keyframe.h" @@ -139,12 +140,7 @@ void BatchRenderJob::load(FileXML *file) BC_Hash defaults; defaults.load_string(file->read_text()); asset->load_defaults(&defaults, - "", - 0, - 1, - 0, - 0, - 0); + "", 0, 1, 0, 0, 0); } } } @@ -205,8 +201,10 @@ BatchRenderThread::BatchRenderThread(MWindow *mwindow) default_job = 0; boot_defaults = 0; preferences = 0; + warn = 1; render = 0; file_entries = 0; + batch_path[0] = 0; } BatchRenderThread::BatchRenderThread() @@ -219,8 +217,10 @@ BatchRenderThread::BatchRenderThread() default_job = 0; boot_defaults = 0; preferences = 0; + warn = 1; render = 0; file_entries = 0; + batch_path[0] = 0; } BatchRenderThread::~BatchRenderThread() @@ -235,8 +235,12 @@ BatchRenderThread::~BatchRenderThread() } } -void BatchRenderThread::reset() +void BatchRenderThread::reset(const char *path) { + if( path ) { + strcpy(batch_path, path); + warn = 1; + } current_job = 0; rendering_job = -1; delete default_job; default_job = 0; @@ -250,9 +254,7 @@ void BatchRenderThread::reset() void BatchRenderThread::handle_close_event(int result) { // Save settings - char path[BCTEXTLEN]; - path[0] = 0; - save_jobs(path); + save_jobs(batch_path); save_defaults(mwindow->defaults); reset(); } @@ -279,9 +281,7 @@ BC_Window* BatchRenderThread::new_gui() } } - char path[BCTEXTLEN]; - path[0] = 0; - load_jobs(path, mwindow->preferences); + load_jobs(batch_path, mwindow->preferences); load_defaults(mwindow->defaults); this->gui = new BatchRenderGUI(mwindow, this, @@ -300,16 +300,19 @@ void BatchRenderThread::load_jobs(char *path, Preferences *preferences) int result = 0; jobs.remove_all_objects(); - if(path[0]) - file.read_from_file(path); - else - file.read_from_file(create_path(path)); + if( !path ) path = batch_path; + if( !path[0] ) create_path(path); + file.read_from_file(path); while(!result) { if(!(result = file.read_tag())) { - if(file.tag.title_is("JOB")) + if(file.tag.title_is("JOBS")) + { + warn = file.tag.get_property("WARN", 1); + } + else if(file.tag.title_is("JOB")) { BatchRenderJob *job; jobs.append(job = new BatchRenderJob(preferences)); @@ -322,17 +325,23 @@ void BatchRenderThread::load_jobs(char *path, Preferences *preferences) void BatchRenderThread::save_jobs(char *path) { FileXML file; + file.tag.set_title("JOBS"); + file.tag.set_property("WARN", warn); + file.append_tag(); + file.append_newline(); for(int i = 0; i < jobs.total; i++) { file.tag.set_title("JOB"); jobs.values[i]->save(&file); } + file.tag.set_title("/JOBS"); + file.append_tag(); + file.append_newline(); - if(path[0]) - file.write_to_file(path); - else - file.write_to_file(create_path(path)); + if( !path ) path = batch_path; + if( !path[0] ) create_path(path); + file.write_to_file(path); } void BatchRenderThread::load_defaults(BC_Hash *defaults) @@ -340,12 +349,7 @@ void BatchRenderThread::load_defaults(BC_Hash *defaults) if(default_job) { default_job->asset->load_defaults(defaults, - "BATCHRENDER_", - 1, - 1, - 1, - 1, - 1); + "BATCHRENDER_", 1, 1, 1, 1, 1); default_job->fix_strategy(); } @@ -362,12 +366,7 @@ void BatchRenderThread::save_defaults(BC_Hash *defaults) if(default_job) { default_job->asset->save_defaults(defaults, - "BATCHRENDER_", - 1, - 1, - 1, - 1, - 1); + "BATCHRENDER_", 1, 1, 1, 1, 1); defaults->update("BATCHRENDER_STRATEGY", default_job->strategy); } for(int i = 0; i < BATCHRENDER_COLUMNS; i++) @@ -386,7 +385,7 @@ void BatchRenderThread::save_defaults(BC_Hash *defaults) char* BatchRenderThread::create_path(char *string) { FileSystem fs; - sprintf(string, "%s", BCASTDIR); + sprintf(string, "%s/", File::get_config_path()); fs.complete_path(string); strcat(string, BATCH_PATH); return string; @@ -468,43 +467,71 @@ char* BatchRenderThread::get_current_edl() // Test EDL files for existence int BatchRenderThread::test_edl_files() { - for(int i = 0; i < jobs.total; i++) - { - if(jobs.values[i]->enabled) - { - const char *path = jobs.values[i]->edl_path; - if( *path == '@' ) ++path; - FILE *fd = fopen(path, "r"); - if(!fd) - { - char string[BCTEXTLEN]; - sprintf(string, _("EDL %s not found.\n"), jobs.values[i]->edl_path); - if(mwindow) - { - ErrorBox error_box(_(PROGRAM_NAME ": Error"), - mwindow->gui->get_abs_cursor_x(1), - mwindow->gui->get_abs_cursor_y(1)); - error_box.create_objects(string); - error_box.run_window(); - gui->button_enable(); + int not_equiv = 0, ret = 0; + const char *path = 0; + + for( int i=0; !ret && ienabled ) continue; + const char *path = jobs.values[i]->edl_path; + int is_script = *path == '@' ? 1 : 0; + if( is_script ) ++path; + FILE *fp = fopen(path, "r"); + if( fp ) { + if( warn && mwindow && !is_script ) { + fseek(fp, 0, SEEK_END); + int64_t sz = ftell(fp); + fseek(fp, 0, SEEK_SET); + char *bfr = new char[sz+1]; + int64_t len = fread(bfr, 1, sz+1, fp); + if( len == sz ) { + FileXML file; file.set_shared_input(bfr, len); + EDL *edl = new EDL; edl->create_objects(); + edl->load_xml(&file, LOAD_ALL); + double pos = edl->equivalent_output(mwindow->edl); + if( pos >= 0 ) ++not_equiv; + edl->remove_user(); } else - { - fprintf(stderr, - "%s", - string); - } - - is_rendering = 0; - return 1; - } - else - { - fclose(fd); + ret = 1; + delete [] bfr; } + fclose(fp); } + else + ret = 1; } - return 0; + + if( ret ) { + char string[BCTEXTLEN]; + sprintf(string, _("EDL %s not found.\n"), path); + if( mwindow ) { + ErrorBox error_box(_(PROGRAM_NAME ": Error"), + mwindow->gui->get_abs_cursor_x(1), + mwindow->gui->get_abs_cursor_y(1)); + error_box.create_objects(string); + error_box.run_window(); + gui->button_enable(); + } + else { + fprintf(stderr, "%s", string); + } + is_rendering = 0; + } + else if( warn && mwindow && not_equiv > 0 ) { + fprintf(stderr, _("%d job EDLs do not match session edl\n"), not_equiv); + char string[BCTEXTLEN], *sp = string; + sp += sprintf(sp, _("%d job EDLs do not match session edl\n"),not_equiv); + sp += sprintf(sp, _("press cancel to abandon batch render")); + mwindow->show_warning(&warn, string); + if( mwindow->wait_warning() ) { + gui->button_enable(); + is_rendering = 0; + ret = 1; + } + gui->warning->update(warn); + } + + return ret; } void BatchRenderThread::calculate_dest_paths(ArrayList *paths, @@ -562,11 +589,21 @@ void BatchRenderThread::start_rendering(char *config_path, // XXX the above stuff is leaked, //PRINT_TRACE // Initialize stuff which MWindow does. - signals->initialize(); + signals->initialize("/tmp/cinelerra_batch%d.dmp"); MWindow::init_defaults(boot_defaults, config_path); load_defaults(boot_defaults); preferences = new Preferences; preferences->load_defaults(boot_defaults); + BC_Signals::set_trap_hook(trap_hook, this); + BC_Signals::set_catch_segv(preferences->trap_sigsegv); + BC_Signals::set_catch_intr(0); + if( preferences->trap_sigsegv ) { + BC_Trace::enable_locks(); + } + else { + BC_Trace::disable_locks(); + } + MWindow::init_plugins(0, preferences); char font_path[BCTEXTLEN]; strcpy(font_path, preferences->plugin_dir); @@ -575,6 +612,7 @@ void BatchRenderThread::start_rendering(char *config_path, BC_WindowBase::get_resources()->vframe_shm = 1; //PRINT_TRACE + strcpy(this->batch_path, batch_path); load_jobs(batch_path, preferences); save_jobs(batch_path); save_defaults(boot_defaults); @@ -608,11 +646,9 @@ void BatchRenderThread::start_rendering(char *config_path, void BatchRenderThread::start_rendering() { if(is_rendering) return; - is_rendering = 1; - char path[BCTEXTLEN]; - path[0] = 0; - save_jobs(path); + + save_jobs(batch_path); save_defaults(mwindow->defaults); gui->button_disable(); @@ -698,28 +734,25 @@ void BatchRenderThread::move_batch(int src, int dst) } } - +void BatchRenderThread::trap_hook(FILE *fp, void *vp) +{ + MWindow *mwindow = ((BatchRenderThread *)vp)->mwindow; + fprintf(fp, "\nEDL:\n"); + mwindow->dump_edl(fp); + fprintf(fp, "\nUNDO:\n"); + mwindow->dump_undo(fp); + fprintf(fp, "\nEXE:\n"); + mwindow->dump_exe(fp); +} BatchRenderGUI::BatchRenderGUI(MWindow *mwindow, - BatchRenderThread *thread, - int x, - int y, - int w, - int h) + BatchRenderThread *thread, int x, int y, int w, int h) : BC_Window(_(PROGRAM_NAME ": Batch Render"), - x, - y, - w, - h, - 50, - 50, - 1, - 0, - 1) + x, y, w, h, 730, 400, 1, 0, 1) { this->mwindow = mwindow; this->thread = thread; @@ -751,18 +784,18 @@ void BatchRenderGUI::create_objects() format_tools = new BatchFormat(mwindow, this, thread->get_current_asset()); format_tools->set_w(get_w() / 2); format_tools->create_objects(x1, y1, 1, 1, 1, 1, 0, 1, 0, 0, - &thread->get_current_job()->strategy, 0); + &thread->get_current_job()->strategy, 0); // input EDL add_subwindow(edl_path_title = new BC_Title(x2, y2, _("EDL Path:"))); y2 += edl_path_title->get_h() + mwindow->theme->widget_border; - + x = x2; y = y2; add_subwindow(edl_path_text = new BatchRenderEDLPath( thread, - x, y, get_w()-x - 40, thread->get_current_edl())); + x, y, get_w()-x - 40, thread->get_current_edl())); x = x2 + edl_path_text->get_w(); add_subwindow(edl_path_browse = new BrowseButton( - mwindow, this, edl_path_text, x, y, thread->get_current_edl(), + mwindow->theme, this, edl_path_text, x, y, thread->get_current_edl(), _("Input EDL"), _("Select an EDL to load:"), 0)); y2 = y + edl_path_browse->get_h() + mwindow->theme->widget_border; @@ -776,14 +809,19 @@ void BatchRenderGUI::create_objects() x += new_batch->get_w() + mwindow->theme->widget_border; add_subwindow(delete_batch = new BatchRenderDelete(thread, x, y)); x = x2; y += delete_batch->get_h() + mwindow->theme->widget_border; + y += mwindow->theme->widget_border; add_subwindow(savelist_batch = new BatchRenderSaveList(thread, x, y)); x += savelist_batch->get_w() + mwindow->theme->widget_border; add_subwindow(loadlist_batch = new BatchRenderLoadList(thread, x, y)); - y2 = y + loadlist_batch->get_h() + mwindow->theme->widget_border; + y += loadlist_batch->get_h() + mwindow->theme->widget_border; + add_subwindow(warning = new BatchRenderWarning(thread, x2, y)); + y2 = y + warning->get_h() + mwindow->theme->widget_border; if( y2 > y1 ) y1 = y2; x = mwindow->theme->batchrender_x1, y = y1; add_subwindow(list_title = new BC_Title(x, y, _("Batches to render:"))); + x1 = x + list_title->get_w() + mwindow->theme->widget_border;; + add_subwindow(batch_path = new BC_Title(x1, y, thread->batch_path, MEDIUMFONT)); y += list_title->get_h() + mwindow->theme->widget_border; y1 = get_h(); y1 -= 15 + BC_GenericButton::calculate_h() + mwindow->theme->widget_border; @@ -857,6 +895,7 @@ int BatchRenderGUI::resize_event(int w, int h) x += savelist_batch->get_w() + mwindow->theme->widget_border; loadlist_batch->reposition_window(x, y); y += loadlist_batch->get_h() + mwindow->theme->widget_border; + warning->reposition_window(x, y); y1 = 15 + BC_GenericButton::calculate_h() + mwindow->theme->widget_border; y2 = get_h() - y1 - batch_list->get_h(); @@ -1058,7 +1097,7 @@ int BatchRenderDelete::handle_event() BatchRenderSaveList::BatchRenderSaveList(BatchRenderThread *thread, int x, int y) - : BC_GenericButton(x, y, _("Save List")) + : BC_GenericButton(x, y, _("Save Jobs")) { this->thread = thread; set_tooltip(_("Save a Batch Render List")); @@ -1103,27 +1142,21 @@ void BatchRenderSaveList::run() { char default_path[BCTEXTLEN]; sprintf(default_path, "~"); - BC_FileBox filewindow(100, - 100, - this->thread->mwindow->defaults->get("DEFAULT_BATCHLOADPATH", default_path), - _("Save Batch Render List"), - _("Enter a Batch Render filename to save as:"), - 0, - 0, - 0, - 0); - + thread->mwindow->defaults->get("DEFAULT_BATCHLOADPATH", default_path); + BC_FileBox filewindow(100, 100, default_path, _("Save Batch Render List"), + _("Enter a Batch Render filename to save as:"), + 0, 0, 0, 0); gui = &filewindow; startup_lock->unlock(); filewindow.create_objects(); int result2 = filewindow.run_window(); - - if(!result2) - { - this->thread->save_jobs(filewindow.get_submitted_path()); - this->thread->mwindow->defaults->update("DEFAULT_BATCHLOADPATH", filewindow.get_submitted_path()); + if(!result2) { + strcpy(thread->batch_path, filewindow.get_submitted_path()); + thread->gui->batch_path->update(thread->batch_path); + thread->mwindow->defaults->update("DEFAULT_BATCHLOADPATH", thread->batch_path); + thread->save_jobs(thread->batch_path); } this->thread->gui->flush(); @@ -1144,7 +1177,7 @@ int BatchRenderSaveList::keypress_event() { BatchRenderLoadList::BatchRenderLoadList(BatchRenderThread *thread, int x, int y) - : BC_GenericButton(x, y, _("Load List")), + : BC_GenericButton(x, y, _("Load Jobs")), Thread() { this->thread = thread; @@ -1156,8 +1189,7 @@ BatchRenderLoadList::BatchRenderLoadList(BatchRenderThread *thread, BatchRenderLoadList::~BatchRenderLoadList() { startup_lock->lock("BatchRenderLoadList::~BrowseButton"); - if(gui) - { + if(gui) { gui->lock_window(); gui->set_done(1); gui->unlock_window(); @@ -1169,10 +1201,8 @@ BatchRenderLoadList::~BatchRenderLoadList() int BatchRenderLoadList::handle_event() { - if(Thread::running()) - { - if(gui) - { + if(Thread::running()) { + if(gui) { gui->lock_window(); gui->raise_window(); gui->unlock_window(); @@ -1190,31 +1220,25 @@ void BatchRenderLoadList::run() { char default_path[BCTEXTLEN]; sprintf(default_path, "~"); - BC_FileBox filewindow(100, - 100, - this->thread->mwindow->defaults->get("DEFAULT_BATCHLOADPATH", default_path), - _("Load Batch Render List"), - _("Enter a Batch Render filename to load from:"), - 0, - 0, - 0, - 0); - + thread->mwindow->defaults->get("DEFAULT_BATCHLOADPATH", default_path); + BC_FileBox filewindow(100, 100, default_path, _("Load Batch Render List"), + _("Enter a Batch Render filename to load from:"), + 0, 0, 0, 0); gui = &filewindow; startup_lock->unlock(); filewindow.create_objects(); int result2 = filewindow.run_window(); - - if(!result2) - { - this->thread->load_jobs(filewindow.get_submitted_path(),this->thread->mwindow->preferences); - this->thread->gui->create_list(1); - this->thread->mwindow->defaults->update("DEFAULT_BATCHLOADPATH", filewindow.get_submitted_path()); + if(!result2) { + strcpy(thread->batch_path, filewindow.get_submitted_path()); + thread->gui->batch_path->update(thread->batch_path); + thread->mwindow->defaults->update("DEFAULT_BATCHLOADPATH", thread->batch_path); + thread->load_jobs(thread->batch_path, thread->mwindow->preferences); + thread->gui->create_list(1); } - this->thread->gui->flush(); + thread->gui->flush(); startup_lock->lock("BatchRenderLoadList::run"); gui = 0; startup_lock->unlock(); @@ -1391,6 +1415,19 @@ int BatchRenderStop::handle_event() } +BatchRenderWarning::BatchRenderWarning(BatchRenderThread *thread, int x, int y) + : BC_CheckBox(x, y, thread->warn, _("warn if jobs/session mismatched")) +{ + this->thread = thread; +} + +int BatchRenderWarning::handle_event() +{ + thread->warn = get_value(); + return 1; +} + + BatchRenderCancel::BatchRenderCancel(BatchRenderThread *thread, int x, int y)