- asset->save_defaults(mwindow->defaults, "PROXY_", 1, 1, 0, 0, 0);
-
- if( !result )
- to_proxy();
-}
-
-void ProxyThread::to_proxy()
-{
-// test for new files
- ArrayList<char *> confirm_paths;
- confirm_paths.set_array_delete();
-// all proxy assets
- ArrayList<Indexable*> proxy_assets;
-// assets which must be created
- ArrayList<Asset*> needed_assets;
-// original assets
- ArrayList<Indexable*> orig_assets;
-// original assets which match the needed_assets
- ArrayList<Asset*> needed_orig_assets;
- Asset *proxy_asset = 0;
- Asset *orig_asset = 0;
-
- mwindow->edl->Garbage::add_user();
- mwindow->save_backup();
- mwindow->undo->update_undo_before(_("proxy"), this);
-
- EDL *&edl = mwindow->edl;
- EDLSession *&session = edl->session;
- Assets *&assets = edl->assets;
-
-// revert project to original size from current size
-// remove all session proxy assets at the at the current proxy_scale
- if( session->proxy_scale > 1 ) {
- orig_asset = assets->first;
- for( ; orig_asset; orig_asset=orig_asset->next ) {
- char new_path[BCTEXTLEN];
- to_proxy_path(new_path, orig_asset, session->proxy_scale);
- proxy_asset = assets->get_asset(new_path);
- if( !proxy_asset ) continue;
-// test if proxy asset was already added to proxy_assets
- int got_it = 0;
- for( int i = 0; !got_it && i<proxy_assets.size(); ++i )
- got_it = !strcmp(proxy_assets[i]->path, new_path);
- if( got_it ) continue;
-// add pointer to existing EDL asset if it exists
-// EDL won't delete it unless it's the same pointer.
- proxy_assets.append(proxy_asset);
- proxy_asset->Garbage::add_user();
- orig_assets.append(orig_asset);
- orig_asset->Garbage::add_user();
- }
-
-// convert from the proxy assets to the original assets
- mwindow->set_proxy(0, 1, &proxy_assets, &orig_assets);
-
-// remove the proxy assets
- mwindow->remove_assets_from_project(0, 0, &proxy_assets, NULL);
- for( int i=0; i<proxy_assets.size(); ++i )
- proxy_assets.get(i)->Garbage::remove_user();
- proxy_assets.remove_all();
- for( int i = 0; i < orig_assets.size(); i++ )
- orig_assets.get(i)->Garbage::remove_user();
- orig_assets.remove_all();
- }
-
-// convert to new size if not original size
- if( new_scale != 1 ) {
- orig_asset = assets->first;
- for( ; orig_asset; orig_asset=orig_asset->next ) {
- if( !orig_asset->video_data ) continue;
- char new_path[BCTEXTLEN];
- to_proxy_path(new_path, orig_asset, new_scale);
-// add to proxy_assets & orig_assets if it isn't already there.
- int got_it = 0;
- for( int i = 0; !got_it && i<proxy_assets.size(); ++i )
- got_it = !strcmp(proxy_assets[i]->path, new_path);
- if( !got_it ) {
- proxy_asset = new Asset;
-// new compression parameters
- proxy_asset->copy_format(asset, 0);
- proxy_asset->update_path(new_path);
- proxy_asset->audio_data = 0;
- proxy_asset->video_data = 1;
- proxy_asset->layers = 1;
- proxy_asset->width = orig_asset->width / new_scale;
- proxy_asset->actual_width = proxy_asset->width;
- proxy_asset->height = orig_asset->height / new_scale;
- proxy_asset->actual_height = proxy_asset->height;
- proxy_asset->frame_rate = orig_asset->frame_rate;
- proxy_asset->video_length = orig_asset->video_length;
- proxy_assets.append(proxy_asset);
- orig_asset->add_user();
- orig_assets.append(orig_asset);
- }
-
-// test if proxy file exists.
- int exists = 0;
- FILE *fd = fopen(new_path, "r");
- if( fd ) {
- exists = 1;
- fclose(fd);
- FileSystem fs;
-// got it if proxy file is newer than original.
- got_it = fs.get_date(new_path) > fs.get_date(asset->path);
- }
- else
- got_it = 0;
-
- if( !got_it ) {
- if( exists ) // prompt user to overwrite
- confirm_paths.append(cstrdup(new_path));
-
- needed_assets.append(proxy_asset);
- proxy_asset->add_user();
- needed_orig_assets.append(orig_asset);
- orig_asset->add_user();
-//printf("ProxyThread::handle_close_event %d %s\n", __LINE__, new_path);
- }
- }
-
-// test for existing files
- int result = 0;
- if( confirm_paths.size() ) {
- result = ConfirmSave::test_files(mwindow, &confirm_paths);
- confirm_paths.remove_all_objects();
- }
-
- if( !result ) {
- int canceled = 0;
- failed = 0;
-
-// create proxy assets which don't already exist
- if( needed_orig_assets.size() > 0 ) {
- int64_t total_len = 0;
- for( int i = 0; i < needed_orig_assets.size(); i++ )
- total_len += needed_orig_assets.get(i)->video_length;
-// start progress bar. MWindow is locked inside this
- progress = mwindow->mainprogress->
- start_progress(_("Creating proxy files..."), total_len);
- total_rendered = 0;
-
- ProxyFarm engine(mwindow, this,
- &needed_assets, &needed_orig_assets);
- engine.process_packages();
-printf("failed=%d canceled=%d\n", failed, progress->is_cancelled());
-
-// stop progress bar
- canceled = progress->is_cancelled();
- progress->stop_progress();
- delete progress; progress = 0;
-
- if( failed && !canceled ) {
- int cx, cy;
- mwindow->gui->get_abs_cursor_xy(cx, cy, 1);
- ErrorBox error_box(PROGRAM_NAME ": Error", cx, cy);
- error_box.create_objects(_("Error making proxy."));
- error_box.raise_window();
- error_box.run_window();
- }
- }
-
-// resize project
- if( !failed && !canceled ) {
- mwindow->set_proxy(use_scaler, new_scale, &orig_assets, &proxy_assets);
- }
- }
-
- for( int i = 0; i < proxy_assets.size(); i++ )
- proxy_assets.get(i)->Garbage::remove_user();
- for( int i = 0; i < orig_assets.size(); i++ )
- orig_assets.get(i)->Garbage::remove_user();
- for( int i = 0; i < needed_assets.size(); i++ )
- needed_assets.get(i)->Garbage::remove_user();
- for( int i = 0; i < needed_orig_assets.size(); i++ )
- needed_orig_assets.get(i)->Garbage::remove_user();