00001 #include "packagingengine.h"
00002 #include "preferences.h"
00003 #include "edlsession.h"
00004 #include "asset.h"
00005 #include "render.h"
00006 #include "clip.h"
00007
00008
00009
00010
00011 PackagingEngineDefault::PackagingEngineDefault()
00012 {
00013 packages = 0;
00014 }
00015
00016 PackagingEngineDefault::~PackagingEngineDefault()
00017 {
00018 if(packages)
00019 {
00020 for(int i = 0; i < total_packages; i++)
00021 delete packages[i];
00022 delete [] packages;
00023 }
00024 }
00025
00026
00027 int PackagingEngineDefault::create_packages_single_farm(
00028 EDL *edl,
00029 Preferences *preferences,
00030 Asset *default_asset,
00031 double total_start,
00032 double total_end)
00033 {
00034 this->total_start = total_start;
00035 this->total_end = total_end;
00036
00037 this->preferences = preferences;
00038 this->default_asset = default_asset;
00039 audio_position = Units::to_int64(total_start * default_asset->sample_rate);
00040 video_position = Units::to_int64(total_start * default_asset->frame_rate);
00041 audio_end = Units::to_int64(total_end * default_asset->sample_rate);
00042 video_end = Units::to_int64(total_end * default_asset->frame_rate);
00043 current_package = 0;
00044
00045 double total_len = total_end - total_start;
00046 total_packages = preferences->renderfarm_job_count;
00047 total_allocated = total_packages + preferences->get_enabled_nodes();
00048 packages = new RenderPackage*[total_allocated];
00049 package_len = total_len / total_packages;
00050 min_package_len = 2.0 / edl->session->frame_rate;
00051
00052
00053
00054 int current_number;
00055 int number_start;
00056 int total_digits;
00057
00058 Render::get_starting_number(default_asset->path,
00059 current_number,
00060 number_start,
00061 total_digits,
00062 3);
00063
00064 for(int i = 0; i < total_allocated; i++)
00065 {
00066 RenderPackage *package = packages[i] = new RenderPackage;
00067
00068
00069 Render::create_filename(package->path,
00070 default_asset->path,
00071 current_number,
00072 total_digits,
00073 number_start);
00074 current_number++;
00075 }
00076
00077 }
00078
00079 RenderPackage* PackagingEngineDefault::get_package_single_farm(double frames_per_second,
00080 int client_number,
00081 int use_local_rate)
00082 {
00083
00084
00085
00086 RenderPackage *result = 0;
00087 float avg_frames_per_second = preferences->get_avg_rate(use_local_rate);
00088
00089 if(audio_position < audio_end ||
00090 video_position < video_end)
00091 {
00092
00093 double scaled_len;
00094 result = packages[current_package];
00095 result->audio_start = audio_position;
00096 result->video_start = video_position;
00097 result->video_do = default_asset->video_data;
00098 result->audio_do = default_asset->audio_data;
00099
00100 if(current_package >= total_allocated - 1)
00101 {
00102 result->audio_end = audio_end;
00103 result->video_end = video_end;
00104 audio_position = result->audio_end;
00105 video_position = result->video_end;
00106 }
00107 else
00108
00109 if(frames_per_second > 0x7fffff || frames_per_second < 0 ||
00110 EQUIV(frames_per_second, 0) ||
00111 EQUIV(avg_frames_per_second, 0))
00112 {
00113 scaled_len = MAX(package_len, min_package_len);
00114
00115 result->audio_end = audio_position +
00116 Units::round(scaled_len * default_asset->sample_rate);
00117 result->video_end = video_position +
00118 Units::round(scaled_len * default_asset->frame_rate);
00119
00120
00121 if(current_package >= total_packages - 1)
00122 {
00123 result->audio_end = audio_end;
00124 result->video_end = video_end;
00125 }
00126 else
00127 {
00128 result->audio_end = MIN(audio_end, result->audio_end);
00129 result->video_end = MIN(video_end, result->video_end);
00130 }
00131
00132 audio_position = result->audio_end;
00133 video_position = result->video_end;
00134 }
00135 else
00136
00137
00138 {
00139 scaled_len = package_len *
00140 frames_per_second /
00141 avg_frames_per_second;
00142 scaled_len = MAX(scaled_len, min_package_len);
00143
00144 result->audio_end = result->audio_start +
00145 Units::to_int64(scaled_len * default_asset->sample_rate);
00146 result->video_end = result->video_start +
00147 Units::to_int64(scaled_len * default_asset->frame_rate);
00148
00149 result->audio_end = MIN(audio_end, result->audio_end);
00150 result->video_end = MIN(video_end, result->video_end);
00151
00152 audio_position = result->audio_end;
00153 video_position = result->video_end;
00154
00155
00156 if(current_package < total_packages - 1)
00157 {
00158 package_len = (double)(audio_end - audio_position) /
00159 (double)default_asset->sample_rate /
00160 (double)(total_packages - current_package);
00161 }
00162
00163 }
00164
00165 current_package++;
00166
00167
00168
00169
00170
00171 }
00172 return result;
00173
00174 }
00175
00176 void PackagingEngineDefault::get_package_paths(ArrayList<char*> *path_list)
00177 {
00178 for(int i = 0; i < total_allocated; i++)
00179 {
00180 path_list->append(strdup(packages[i]->path));
00181 }
00182 path_list->set_free();
00183 }
00184
00185 int64_t PackagingEngineDefault::get_progress_max()
00186 {
00187 return Units::to_int64(default_asset->sample_rate *
00188 (total_end - total_start)) +
00189 Units::to_int64(preferences->render_preroll *
00190 2 *
00191 default_asset->sample_rate);
00192 }
00193
00194 int PackagingEngineDefault::packages_are_done()
00195 {
00196 return 0;
00197 }
00198
00199
00200
00201