void PluginClient::save_defaults_xml() { char path[BCTEXTLEN]; server->get_defaults_path(path); FileSystem fs; fs.complete_path(path); using_defaults = 1; KeyFrame temp_keyframe; save_data(&temp_keyframe); FILE *fd = fopen(path, "w"); if(fd) { fprintf(fd, "%d\n%d\n", window_x, window_y); if(!fwrite(temp_keyframe.get_data(), strlen(temp_keyframe.get_data()), 1, fd)) { fprintf(stderr, "PluginClient::save_defaults_xml %d \"%s\" %d bytes: %s\n", __LINE__, path, (int)strlen(temp_keyframe.get_data()), strerror(errno)); } fclose(fd); } using_defaults = 0; }
char* BatchRenderThread::create_path(char *string) { FileSystem fs; sprintf(string, "%s", BCASTDIR); fs.complete_path(string); strcat(string, BATCH_PATH); return string; }
char* ChannelDB::prefix_to_path(char *path, const char *prefix) { FileSystem fs; char directory[BCTEXTLEN]; sprintf(directory, BCASTDIR); fs.complete_path(directory); fs.join_names(path, directory, prefix); return path; }
void PluginClient::load_defaults_xml() { char path[BCTEXTLEN]; server->get_defaults_path(path); FileSystem fs; fs.complete_path(path); using_defaults = 1; //printf("PluginClient::load_defaults_xml %d %s\n", __LINE__, path); KeyFrame temp_keyframe; FILE *fd = fopen(path, "r"); if(fd) { fseek(fd, 0, SEEK_END); int data_size = ftell(fd); fseek(fd, 0, SEEK_SET); if(data_size < MESSAGESIZE) { int temp = fread(temp_keyframe.get_data(), data_size, 1, fd); // Get window extents char *data = temp_keyframe.get_data(); int state = 0; for(int i = 0; i < data_size - 8; i++) { if(data[i] == '<') break; if(isdigit(data[i])) { if(state == 0) { window_x = atoi(data + i); state++; } else { window_y = atoi(data + i); break; } while(i < data_size && isdigit(data[i])) i++; } } } fclose(fd); read_data(&temp_keyframe); } using_defaults = 0; //printf("PluginClient::load_defaults_xml %d %s\n", __LINE__, path); }
void DeleteAllIndexes::run() { char string[BCTEXTLEN], string1[BCTEXTLEN], string2[BCTEXTLEN]; // prepare directory strcpy(string1, pwindow->thread->preferences->index_directory); FileSystem dir; dir.update(pwindow->thread->preferences->index_directory); dir.complete_path(string1); // prepare filter const char *filter1 = ".idx"; const char *filter2 = ".toc"; // pwindow->disable_window(); sprintf(string, _("Delete all indexes in %s?"), string1); // QuestionWindow confirm(mwindow); // confirm.create_objects(string, 0); // int result = confirm.run_window(); int result = 0; if(!result) { static int i, j, k; for(i = 0; i < dir.dir_list.total; i++) { result = 1; sprintf(string2, "%s%s", string1, dir.dir_list.values[i]->name); // test filter if(test_filter(string2, filter1) || test_filter(string2, filter2)) { remove(string2); printf("DeleteAllIndexes::run %s\n", string2); } } } pwindow->thread->redraw_indexes = 1; // pwindow->enable_window(); }
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__); }
int Render::render(int test_overwrite, Asset *asset, EDL *edl, int strategy, int range_type) { 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. // Pointer from file // (VFrame*)(VFrame array [])(Channel []) VFrame ***video_output; // Pointer to output buffers VFrame *video_output_ptr[MAX_CHANNELS]; double *audio_output_ptr[MAX_CHANNELS]; int done = 0; in_progress = 1; this->default_asset = asset; progress = 0; result = 0; if(mwindow) { if(!preferences) preferences = new Preferences; preferences->copy_from(mwindow->preferences); } // Create rendering command command = new TransportCommand; command->command = NORMAL_FWD; command->get_edl()->copy_all(edl); command->change_type = CHANGE_ALL; if (range_type == RANGE_BACKCOMPAT) { // Get highlighted playback range command->set_playback_range(); // Adjust playback range with in/out points command->playback_range_adjust_inout(); } else if (range_type == RANGE_PROJECT) { command->playback_range_project(); } else if (range_type == RANGE_SELECTION) { command->set_playback_range(); } else if (range_type == RANGE_INOUT) { command->playback_range_inout(); } packages = new PackageDispatcher; // Configure preview monitor VideoOutConfig vconfig; PlaybackConfig *playback_config = new PlaybackConfig; // Create caches audio_cache = new CICache(preferences, plugindb); video_cache = new CICache(preferences, plugindb); default_asset->frame_rate = command->get_edl()->session->frame_rate; default_asset->sample_rate = command->get_edl()->session->sample_rate; // Conform asset to EDL. Find out if any tracks are playable. result = check_asset(command->get_edl(), *default_asset); if(!result) { // Get total range to render total_start = command->start_position; total_end = command->end_position; total_length = total_end - total_start; // Nothing to render if(EQUIV(total_length, 0)) { result = 1; } } // Generate packages if(!result) { // Stop background rendering if(mwindow) mwindow->stop_brender(); fs.complete_path(default_asset->path); strategy = Render::fix_strategy(strategy, preferences->use_renderfarm); result = packages->create_packages(mwindow, command->get_edl(), preferences, strategy, default_asset, total_start, total_end, test_overwrite); } done = 0; total_rendered = 0; frames_per_second = 0; if(!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(plugindb, packages, preferences, 1, &result, &total_rendered, counter_lock, default_asset, command->get_edl(), 0); result = farm_server->start_clients(); if(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(!result) { start_progress(); MainPackageRenderer package_renderer(this); result = package_renderer.initialize(mwindow, command->get_edl(), // Copy of master EDL preferences, default_asset, plugindb); while(!result) { // Get unfinished job RenderPackage *package; if(strategy == SINGLE_PASS_FARM) { package = packages->get_package(frames_per_second, -1, 1); } else { package = packages->get_package(0, -1, 1); } // Exit point if(!package) { done = 1; break; } Timer timer; timer.update(); if(package_renderer.render_package(package)) result = 1; // Result is also set directly by the RenderFarm. frames_per_second = (double)(package->video_end - package->video_start) / (double)(timer.get_difference() / 1000); } // file_number printf("Render::run: Session finished.\n"); if(strategy == SINGLE_PASS_FARM || strategy == FILE_PER_LABEL_FARM) { farm_server->wait_clients(); result |= packages->packages_are_done(); } printf("Render::render 90\n"); // Notify of error if(result && (!progress || !progress->is_cancelled()) && !batch_cancelled) { 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(_("Error rendering data.")); error_box.raise_window(); error_box.run_window(); } else { printf("Render::render: Error rendering data\n"); } } // Delete the progress box stop_progress(); //printf("Render::render 100\n"); } // Paste all packages into timeline if desired if(!result && load_mode != LOAD_NOTHING && mwindow && mode != Render::BATCH) { mwindow->gui->lock_window("Render::render 3"); ArrayList<Asset*> *assets = packages->get_asset_list(); if(load_mode == LOAD_PASTE) mwindow->clear(0); mwindow->load_assets(assets, -1, load_mode, 0, 0, mwindow->edl->session->labels_follow_edits, mwindow->edl->session->plugins_follow_edits, 0); // overwrite delete assets; mwindow->save_backup(); mwindow->undo->update_undo(_("render"), LOAD_ALL); mwindow->update_plugin_guis(); mwindow->gui->update(1, 2, 1, 1, 1, 1, 0); mwindow->sync_parameters(CHANGE_ALL); mwindow->gui->unlock_window(); } // 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 packages; in_progress = 0; completion->unlock(); //printf("Render::render 120\n"); return result; }