X-Git-Url: https://git.cinelerra-gg.org/git/?p=goodguy%2Fcinelerra.git;a=blobdiff_plain;f=cinelerra-5.1%2Fcinelerra%2Fproxy.C;h=94b51270a48150f11566af8c8126e5bd93535010;hp=e368c17c0a860c3d2e56918c0855de2af39bb49c;hb=5ec378f09aeeb646705fdb8035b39a186374fba0;hpb=e23393f4ff9f772ac8f47926cf490dc87a630ed4 diff --git a/cinelerra-5.1/cinelerra/proxy.C b/cinelerra-5.1/cinelerra/proxy.C index e368c17c..94b51270 100644 --- a/cinelerra-5.1/cinelerra/proxy.C +++ b/cinelerra-5.1/cinelerra/proxy.C @@ -47,10 +47,9 @@ #include "transportque.h" #include "vrender.h" -#define WIDTH 400 -#define HEIGHT 330 +#define WIDTH xS(400) +#define HEIGHT yS(330) #define MAX_SCALE 16 -#define PROXY_DEFAULT_VCODEC "h265.mp4" ProxyMenuItem::ProxyMenuItem(MWindow *mwindow) : BC_MenuItem(_("Proxy settings..."), _("Alt-r"), 'r') @@ -83,7 +82,14 @@ ProxyDialog::ProxyDialog(MWindow *mwindow) this->mwindow = mwindow; gui = 0; asset = new Asset; - strcpy(asset->vcodec, PROXY_DEFAULT_VCODEC); + +// quicker than some, not as good as others + asset->format = FILE_FFMPEG; + strcpy(asset->fformat, "mpeg"); + strcpy(asset->vcodec, "mpeg.mpeg"); + asset->ff_video_bitrate = 2000000; + asset->video_data = 1; + bzero(size_text, sizeof(char*) * MAX_SIZES); bzero(size_factors, sizeof(int) * MAX_SIZES); size_text[0] = cstrdup(_("Original size")); @@ -132,9 +138,6 @@ void ProxyDialog::calculate_sizes() } total_sizes = 1; - int orig_w = mwindow->edl->session->output_w * orig_scale; - int orig_h = mwindow->edl->session->output_h * orig_scale; - if( !use_scaler ) { // w,h should stay even for yuv int ow = orig_w, oh = orig_h; @@ -228,10 +231,11 @@ int ProxyRender::from_proxy_path(char *new_path, Indexable *indexable, int scale return 0; } -ProxyRender::ProxyRender(MWindow *mwindow, Asset *format_asset) +ProxyRender::ProxyRender(MWindow *mwindow, Asset *format_asset, int asset_scale) { this->mwindow = mwindow; this->format_asset = format_asset; + this->asset_scale = asset_scale; progress = 0; counter_lock = new Mutex("ProxyDialog::counter_lock"); total_rendered = 0; @@ -335,7 +339,7 @@ int ProxyRender::create_needed_proxies(int new_scale) ProxyFarm engine(mwindow, this, &needed_idxbls, &needed_proxies); engine.process_packages(); -printf("failed=%d canceled=%d\n", failed, progress->is_cancelled()); +printf("proxy: failed=%d canceled=%d\n", failed, progress->is_cancelled()); // stop progress bar canceled = progress->is_cancelled(); @@ -376,9 +380,15 @@ void ProxyWindow::create_objects() dialog->auto_scale = mwindow->edl->session->proxy_auto_scale; dialog->beep = mwindow->edl->session->proxy_beep; dialog->new_scale = dialog->orig_scale; + dialog->orig_w = mwindow->edl->session->output_w; + dialog->orig_h = mwindow->edl->session->output_h; + if( !dialog->use_scaler ) { + dialog->orig_w *= dialog->orig_scale; + dialog->orig_h *= dialog->orig_scale; + } int x = margin; - int y = margin+10; + int y = margin+yS(10); add_subwindow(use_scaler = new ProxyUseScaler(this, x, y)); y += use_scaler->get_h() + margin; @@ -386,7 +396,7 @@ void ProxyWindow::create_objects() add_subwindow(text = new BC_Title(x, y, _("Scale factor:"))); x += text->get_w() + margin; - int popupmenu_w = BC_PopupMenu::calculate_w(get_text_width(MEDIUMFONT, dialog->size_text[0])); + int popupmenu_w = BC_PopupMenu::calculate_w(get_text_width(MEDIUMFONT, dialog->size_text[0])+xS(15)); add_subwindow(scale_factor = new ProxyMenu(mwindow, this, x, y, popupmenu_w, "")); scale_factor->update_sizes(); x += scale_factor->get_w() + margin; @@ -407,7 +417,7 @@ void ProxyWindow::create_objects() add_subwindow(active_scale = new BC_Title(x, y, "")); y += active_scale->get_h() + margin; - x = margin; y += 25; + x = margin; y += yS(25); format_tools = new ProxyFormatTools(mwindow, this, dialog->asset); format_tools->create_objects(x, y, 0, 1, 0, 0, 0, 1, 0, 1, // skip the path 0, 0); @@ -434,6 +444,7 @@ ProxyFormatTools::ProxyFormatTools(MWindow *mwindow, ProxyWindow *pwindow, Asset void ProxyFormatTools::update_format() { + asset->save_defaults(mwindow->defaults, "PROXY_", 1, 1, 0, 0, 0); FormatTools::update_format(); pwindow->use_scaler->update(); } @@ -441,11 +452,9 @@ void ProxyFormatTools::update_format() void ProxyWindow::update() { char string[BCSTRLEN]; - int orig_w = mwindow->edl->session->output_w * dialog->orig_scale; - int orig_h = mwindow->edl->session->output_h * dialog->orig_scale; - int new_w = orig_w / dialog->new_scale; + int new_w = dialog->orig_w / dialog->new_scale; if( new_w & 1 ) ++new_w; - int new_h = orig_h / dialog->new_scale; + int new_h = dialog->orig_h / dialog->new_scale; if( new_h & 1 ) ++new_h; sprintf(string, "%dx%d", new_w, new_h); new_dimensions->update(string); @@ -545,7 +554,6 @@ int ProxyMenu::handle_event() for( int i = 0; i < dialog->total_sizes; i++ ) { if( !strcmp(get_text(), pwindow->dialog->size_text[i]) ) { dialog->new_scale = pwindow->dialog->size_factors[i]; - if( dialog->new_scale == 1 ) dialog->use_scaler = 0; pwindow->update(); break; } @@ -632,6 +640,11 @@ void ProxyClient::process_package(LoadPackage *ptr) int jobs = proxy_render->needed_proxies.size(); int processors = preferences->project_smp / jobs + 1, result = 0; +// each cpu should process at least about 1 MB, or it thrashes + int size = edl->session->output_w * edl->session->output_h * 4; + int cpus = size / 0x100000 + 1; + if( processors > cpus ) processors = cpus; + if( orig->is_asset ) { src_file = new File; src_file->set_processors(processors); @@ -712,7 +725,12 @@ void ProxyClient::process_package(LoadPackage *ptr) proxy_render->update_progress(); } if( !proxy_render->failed && !proxy_render->is_canceled() ) { - Asset *asset = mwindow->edl->assets->update(proxy); + Asset *asset = edl->assets->update(proxy); + asset->proxy_scale = proxy_render->asset_scale; + int scale = asset->proxy_scale; + if( !scale ) scale = 1; + asset->width = asset->actual_width * scale; + asset->height = asset->actual_height * scale; mwindow->mainindexes->add_next_asset(0, asset); mwindow->mainindexes->start_build(); }