void BatchRenderThread::calculate_dest_paths(ArrayList<char*> *paths, Preferences *preferences) { for(int i = 0; i < jobs.total; i++) { BatchRenderJob *job = jobs.values[i]; if(job->enabled && *job->edl_path != '@') { PackageDispatcher *packages = new PackageDispatcher; // Load EDL TransportCommand *command = new TransportCommand; FileXML *file = new FileXML; file->read_from_file(job->edl_path); // Use command to calculate range. command->command = NORMAL_FWD; command->get_edl()->load_xml(file, LOAD_ALL); command->change_type = CHANGE_ALL; command->set_playback_range(); command->adjust_playback_range(); // Create test packages packages->create_packages(mwindow, command->get_edl(), preferences, job->strategy, job->asset, command->start_position, command->end_position, 0); // Append output paths allocated to total for(int j = 0; j < packages->get_total_packages(); j++) { RenderPackage *package = packages->get_package(j); paths->append(cstrdup(package->path)); } // Delete package harness delete packages; delete command; delete file; } } }
void RenderThread::render_single(int test_overwrite, Asset *asset, EDL *edl, int strategy) { char string[BCTEXTLEN]; // Total length in seconds double total_length; int last_audio_buffer; RenderFarmServer *farm_server = 0; FileSystem fs; int total_digits; // Total number of digits including padding the user specified. int number_start; // Character in the filename path at which the number begins int current_number; // The number the being injected into the filename. int done = 0; const int debug = 0; render->in_progress = 1; render->default_asset = asset; 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; command->get_edl()->copy_all(edl); command->change_type = CHANGE_ALL; // Get highlighted playback range command->set_playback_range(); // Adjust playback range with in/out points command->adjust_playback_range(); render->packages = new PackageDispatcher; // Configure preview monitor VideoOutConfig vconfig; PlaybackConfig *playback_config = new PlaybackConfig; // Create caches CICache *audio_cache = new CICache(render->preferences); CICache *video_cache = new CICache(render->preferences); render->default_asset->frame_rate = command->get_edl()->session->frame_rate; render->default_asset->sample_rate = command->get_edl()->session->sample_rate; // Conform asset to EDL. Find out if any tracks are playable. render->result = render->check_asset(command->get_edl(), *render->default_asset); if(!render->result) { // Get total range to render render->total_start = command->start_position; render->total_end = command->end_position; total_length = render->total_end - render->total_start; // Nothing to render if(EQUIV(total_length, 0)) { render->result = 1; } } // Generate packages if(!render->result) { // Stop background rendering 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(), render->preferences, strategy, render->default_asset, render->total_start, render->total_end, test_overwrite); } done = 0; render->total_rendered = 0; if(!render->result) { // Start dispatching external jobs if(mwindow) { mwindow->gui->lock_window("Render::render 1"); mwindow->gui->show_message(_("Starting render farm")); mwindow->gui->start_hourglass(); mwindow->gui->unlock_window(); } else { 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"); } } } } // Perform local rendering if(!render->result) { render->start_progress(); MainPackageRenderer package_renderer(render); render->result = package_renderer.initialize(mwindow, command->get_edl(), // Copy of master EDL render->preferences, render->default_asset); while(!render->result) { // Get unfinished job RenderPackage *package; if(strategy == SINGLE_PASS_FARM) { package = render->packages->get_package( package_renderer.frames_per_second, -1, 1); } else { package = render->packages->get_package(0, -1, 1); } // Exit point if(!package) { done = 1; break; } Timer timer; timer.update(); if(package_renderer.render_package(package)) render->result = 1; } // file_number printf("Render::render_single: Session finished.\n"); if(strategy == SINGLE_PASS_FARM || strategy == FILE_PER_LABEL_FARM) { farm_server->wait_clients(); } if(debug) printf("Render::render %d\n", __LINE__); // Notify of error if(render->result && (!render->progress || !render->progress->is_cancelled()) && !render->batch_cancelled) { if(debug) printf("Render::render %d\n", __LINE__); if(mwindow) { if(debug) printf("Render::render %d\n", __LINE__); ErrorBox error_box(PROGRAM_NAME ": Error", mwindow->gui->get_abs_cursor_x(1), mwindow->gui->get_abs_cursor_y(1)); error_box.create_objects(_("Error rendering data.")); error_box.raise_window(); error_box.run_window(); if(debug) printf("Render::render %d\n", __LINE__); } else { printf("Render::render: Error rendering data\n"); } } if(debug) printf("Render::render %d\n", __LINE__); // Delete the progress box render->stop_progress(); if(debug) printf("Render::render %d\n", __LINE__); } // Paste all packages into timeline if desired if(!render->result && render->load_mode != LOADMODE_NOTHING && mwindow && render->mode != Render::BATCH) { if(debug) printf("Render::render %d\n", __LINE__); mwindow->gui->lock_window("Render::render 3"); if(debug) printf("Render::render %d\n", __LINE__); mwindow->undo->update_undo_before(); if(debug) printf("Render::render %d\n", __LINE__); ArrayList<Indexable*> *assets = render->packages->get_asset_list(); if(debug) printf("Render::render %d\n", __LINE__); if(render->load_mode == LOADMODE_PASTE) mwindow->clear(0); if(debug) printf("Render::render %d\n", __LINE__); mwindow->load_assets(assets, -1, render->load_mode, 0, 0, mwindow->edl->session->labels_follow_edits, mwindow->edl->session->plugins_follow_edits, mwindow->edl->session->autos_follow_edits); if(debug) printf("Render::render %d\n", __LINE__); for(int i = 0; i < assets->size(); i++) assets->get(i)->Garbage::remove_user(); delete assets; if(debug) printf("Render::render %d\n", __LINE__); mwindow->save_backup(); if(debug) printf("Render::render %d\n", __LINE__); mwindow->undo->update_undo_after(_("render"), LOAD_ALL); if(debug) printf("Render::render %d\n", __LINE__); mwindow->update_plugin_guis(); if(debug) printf("Render::render %d\n", __LINE__); mwindow->gui->update(1, 2, 1, 1, 1, 1, 0); if(debug) printf("Render::render %d\n", __LINE__); mwindow->sync_parameters(CHANGE_ALL); if(debug) printf("Render::render %d\n", __LINE__); mwindow->gui->unlock_window(); mwindow->awindow->gui->lock_window("Render::render"); mwindow->awindow->gui->update_assets(); mwindow->awindow->gui->flush(); mwindow->awindow->gui->unlock_window(); if(debug) printf("Render::render %d\n", __LINE__); } if(debug) printf("Render::render %d\n", __LINE__); // Disable hourglass if(mwindow) { mwindow->gui->lock_window("Render::render 3"); mwindow->gui->stop_hourglass(); mwindow->gui->unlock_window(); } //printf("Render::render 110\n"); // Need to restart because brender always stops before render. if(mwindow) mwindow->restart_brender(); if(farm_server) delete farm_server; delete command; delete playback_config; delete audio_cache; delete video_cache; // Must delete packages after server delete render->packages; render->packages = 0; render->in_progress = 0; render->completion->unlock(); if(debug) printf("Render::render %d\n", __LINE__); }