コード例 #1
0
ファイル: batchrender.C プロジェクト: knutj/cinelerra
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;
		}
	}
}
コード例 #2
0
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__);
}