From 73eb8f8d040d50f33db883d12adaaf33a2d1520c Mon Sep 17 00:00:00 2001 From: Good Guy Date: Mon, 17 Jun 2024 14:29:06 -0600 Subject: [PATCH] Credit Andrew - fix bug in render farm usage when using in/out pointers or selection --- cinelerra-5.1/cinelerra/packagingengine.C | 133 +++++++++++++--------- 1 file changed, 78 insertions(+), 55 deletions(-) diff --git a/cinelerra-5.1/cinelerra/packagingengine.C b/cinelerra-5.1/cinelerra/packagingengine.C index 222f8d30..7b3336da 100644 --- a/cinelerra-5.1/cinelerra/packagingengine.C +++ b/cinelerra-5.1/cinelerra/packagingengine.C @@ -89,71 +89,94 @@ int PackagingEngineDefault::create_packages_single_farm(EDL *edl, RenderPackage* PackagingEngineDefault::get_package_single_farm(double frames_per_second, int client_number, int use_local_rate) { - RenderPackage *result = 0; - float avg_frames_per_second = preferences->get_avg_rate(use_local_rate); - double length = package_len; - int scaled_length = 0; - - if( (default_asset->audio_data && - (audio_position < audio_end && !EQUIV(audio_position, audio_end))) || - (default_asset->video_data && - (video_position < video_end && !EQUIV(video_position, video_end))) ) { + +//printf("PackageDispatcher::get_package %ld %ld %ld %ld\n", audio_position, video_position, audio_end, video_end); + + RenderPackage *result = 0; + float avg_frames_per_second = preferences->get_avg_rate(use_local_rate); + + if(audio_position < audio_end || + video_position < video_end) + { // Last package - result = packages[current_package]; - result->audio_start = audio_position; - result->video_start = video_position; - result->video_do = default_asset->video_data; - result->audio_do = default_asset->audio_data; - - if( current_package >= total_allocated-1 ) { - result->audio_end = audio_end; - result->video_end = video_end; - audio_position = result->audio_end; - video_position = result->video_end; - } - else { - if( frames_per_second > 0 && - !EQUIV(frames_per_second, 0) && !EQUIV(avg_frames_per_second, 0) ) { -// package size to fit the requestor. - length *= frames_per_second / avg_frames_per_second; - scaled_length = 1; + double scaled_len; + result = packages[current_package]; + result->audio_start = audio_position; + result->video_start = video_position; + result->video_do = default_asset->video_data; + result->audio_do = default_asset->audio_data; + + if(current_package >= total_allocated - 1) + { + result->audio_end = audio_end; + result->video_end = video_end; + audio_position = result->audio_end; + video_position = result->video_end; } - if( length < min_package_len ) - length = min_package_len; - double end_position = current_position + length; - - if( result->video_do ) { - int64_t video_end = end_position * default_asset->frame_rate; - result->video_end = MIN(this->video_end, video_end); - end_position = video_end / default_asset->frame_rate; - } - if( result->audio_do ) { - int64_t audio_end = end_position * default_asset->sample_rate; - result->audio_end = MIN(this->audio_end, audio_end); + else +// No useful speed data. May get infinity for real fast jobs. + if(frames_per_second > 0x7fffff || frames_per_second < 0 || + EQUIV(frames_per_second, 0) || + EQUIV(avg_frames_per_second, 0)) + { + scaled_len = MAX(package_len, min_package_len); + + result->audio_end = audio_position + + Units::round(scaled_len * default_asset->sample_rate); + result->video_end = video_position + + Units::round(scaled_len * default_asset->frame_rate); + +// If we get here without any useful speed data render the whole thing. + if(current_package >= total_packages - 1) + { + result->audio_end = audio_end; + result->video_end = video_end; + } + else + { + result->audio_end = MIN(audio_end, result->audio_end); + result->video_end = MIN(video_end, result->video_end); + } + + audio_position = result->audio_end; + video_position = result->video_end; } - audio_position = result->audio_end; - video_position = result->video_end; - current_position = end_position; + else +// Useful speed data and future packages exist. Scale the +// package size to fit the requestor. + { + scaled_len = package_len * + frames_per_second / + avg_frames_per_second; + scaled_len = MAX(scaled_len, min_package_len); + + result->audio_end = result->audio_start + + Units::to_int64(scaled_len * default_asset->sample_rate); + result->video_end = result->video_start + + Units::to_int64(scaled_len * default_asset->frame_rate); + + result->audio_end = MIN(audio_end, result->audio_end); + result->video_end = MIN(video_end, result->video_end); + + audio_position = result->audio_end; + video_position = result->video_end; // Package size is no longer touched between total_packages and total_allocated - if( scaled_length && current_package < total_packages-1 ) { - double remaining = - result->audio_do ? (double)(audio_end - audio_position) / - default_asset->sample_rate : - result->video_do ? (double)(video_end - video_position) / - default_asset->frame_rate : 0; - if( remaining > 0 ) { - int jobs = total_packages - current_package; - package_len = remaining / jobs; + if(current_package < total_packages - 1) + { + package_len = (double)(audio_end - audio_position) / + (double)default_asset->sample_rate / + (double)(total_packages - current_package); } + } - } - current_package++; + current_package++; //printf("Dispatcher::get_package 50 %lld %lld %lld %lld\n", // result->audio_start, result->video_start, result->audio_end, result->video_end); - } - return result; + } + return result; + } void PackagingEngineDefault::get_package_paths(ArrayList *path_list) -- 2.26.2