X-Git-Url: https://git.cinelerra-gg.org/git/?p=goodguy%2Fcinelerra.git;a=blobdiff_plain;f=cinelerra-5.1%2Fcinelerra%2Frender.C;h=a43449e4b94a43eb99e8541fa148ab1fb232dd42;hp=7a7d5407e9785482cca0ae46f55993bb47f98c8f;hb=refs%2Fheads%2Fmaster;hpb=d034ec092c8aaf21c755bc612796df69ffdee4ac diff --git a/cinelerra-5.1/cinelerra/render.C b/cinelerra-5.1/cinelerra/render.C index 7a7d5407..a43449e4 100644 --- a/cinelerra-5.1/cinelerra/render.C +++ b/cinelerra-5.1/cinelerra/render.C @@ -1,6 +1,7 @@ /* * CINELERRA * Copyright (C) 1997-2011 Adam Williams + * Copyright (C) 2003-2016 Cinelerra CV contributors * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -49,6 +50,7 @@ #include "language.h" #include "loadmode.h" #include "localsession.h" +#include "mainerror.h" #include "mainprogress.h" #include "mainsession.h" #include "mainundo.h" @@ -221,6 +223,7 @@ Render::Render(MWindow *mwindow) Render::~Render() { + stop_operation(); close_window(); delete package_lock; delete counter_lock; @@ -330,15 +333,24 @@ void Render::handle_close_event(int result) err_msg = _("zero render range"); result = 1; } + if( !result && !asset->audio_data && !asset->video_data ) { + err_msg = _("no audio or video in render asset format\n"); + result = 1; + } + EDL *edl = mwindow->edl; + if( !result && use_labels && !edl->labels->first ) { + eprintf(_("Create new file at labels checked, but no labels\n")); + result = 1; + } if( !result && asset->video_data ) { - double frame_rate = mwindow->edl->session->frame_rate; + double frame_rate = edl->session->frame_rate; if( frame_rate > 0 && render_range+1e-3 < 1./frame_rate ) { err_msg = _("Video data and range less than 1 frame"); result = 1; } } if( !result && asset->audio_data ) { - double sample_rate = mwindow->edl->session->sample_rate; + double sample_rate = edl->session->sample_rate; if( sample_rate > 0 && render_range+1e-6 < 1./sample_rate ) { err_msg = _("Audio data and range less than 1 sample"); result = 1; @@ -346,7 +358,7 @@ void Render::handle_close_event(int result) } if( !result && File::is_image_render(asset->format) ) { if( asset->video_data ) { - double frames = render_range * mwindow->edl->session->frame_rate; + double frames = render_range * edl->session->frame_rate; if( !EQUIV(frames, 1.) ) { err_msg = _("Image format and not 1 frame"); result = 1; @@ -357,6 +369,7 @@ void Render::handle_close_event(int result) result = 1; } } + if( err_msg ) { int cx, cy; mwindow->gui->get_abs_cursor(cx, cy, 1); @@ -434,15 +447,16 @@ int Render::check_asset(EDL *edl, Asset &asset) return 0; } -int Render::get_strategy(int use_renderfarm, int use_labels) +int Render::get_strategy(int use_renderfarm, int use_labels, int range_type) { - return use_renderfarm ? - (use_labels ? FILE_PER_LABEL_FARM : SINGLE_PASS_FARM) : - (use_labels ? FILE_PER_LABEL : SINGLE_PASS ) ; + return range_type == RANGE_1FRAME ? SINGLE_PASS : + use_renderfarm ? + (use_labels ? FILE_PER_LABEL_FARM : SINGLE_PASS_FARM) : + (use_labels ? FILE_PER_LABEL : SINGLE_PASS ) ; } int Render::get_strategy() { - return get_strategy(preferences->use_renderfarm, use_labels); + return get_strategy(preferences->use_renderfarm, use_labels, range_type); } void Render::start_progress() @@ -671,7 +685,7 @@ void RenderThread::render_single(int test_overwrite, Asset *asset, EDL *edl, render->result = 0; // Create rendering command - TransportCommand *command = new TransportCommand; + TransportCommand *command = new TransportCommand(render->preferences); command->command = NORMAL_FWD; command->get_edl()->copy_all(edl); command->change_type = CHANGE_ALL; @@ -713,6 +727,11 @@ void RenderThread::render_single(int test_overwrite, Asset *asset, EDL *edl, if( !render->result ) { // Get total range to render render->total_start = command->start_position; +#if 0 + render->default_asset->timecode = command->start_position; + printf("tc: %f \n", render->default_asset->timecode); + render->default_asset->timecode += edl->session->timecode_offset; +#endif render->total_end = command->end_position; total_length = render->total_end - render->total_start; @@ -721,7 +740,8 @@ void RenderThread::render_single(int test_overwrite, Asset *asset, EDL *edl, render->result = 1; } } - render_frames = render->default_asset->frame_rate * total_length; +// prevent single frame truncation to zero frames + render_frames = render->default_asset->frame_rate * total_length + 1e-4; // Generate packages if( !render->result ) { @@ -869,8 +889,8 @@ printf("Render::render_single: Session finished.\n"); mwindow->restart_brender(); if( farm_server ) delete farm_server; delete command; - delete audio_cache; - delete video_cache; + audio_cache->remove_user(); + video_cache->remove_user(); // Must delete packages after server delete render->packages; @@ -942,8 +962,9 @@ void RenderThread::run() render_frames, render_time, render_rate); } - if( render->mode == Render::INTERACTIVE && render->beep ) - mwindow->beep(3000., 1.5, 0.5); + float gain = render->beep; + if( render->mode == Render::INTERACTIVE && gain > 0 ) + mwindow->beep(3000., 1.5, gain); if( script ) { if( !render->result ) @@ -953,8 +974,8 @@ void RenderThread::run() } -#define WIDTH 480 -#define HEIGHT 480 +#define WIDTH xS(480) +#define HEIGHT yS(480) RenderWindow::RenderWindow(MWindow *mwindow, @@ -975,6 +996,8 @@ RenderWindow::RenderWindow(MWindow *mwindow, rangeselection = 0; rangeinout = 0; range1frame = 0; +// *** CONTEXT_HELP *** + context_help_set_keyword("Single File Rendering"); } RenderWindow::~RenderWindow() @@ -997,13 +1020,15 @@ void RenderWindow::load_profile(int profile_slot) void RenderWindow::create_objects() { - int x = 10, y = 10; + int xs10 = xS(10), xs20 = xS(20); + int ys10 = yS(10), ys20 = yS(20), ys25 = yS(25), ys30 = yS(30); + int x = xs10, y = ys10; lock_window("RenderWindow::create_objects"); - add_subwindow(new BC_Title(x, y, - (char*)(render->use_labels ? + add_subwindow(file_format = new BC_Title(x, y, + (render->use_labels ? _("Select the first file to render to:") : _("Select a file to render to:")))); - y += 25; + y += ys25; render_format = new RenderFormat(mwindow, this, asset); render_format->create_objects(x, y, @@ -1016,38 +1041,40 @@ void RenderWindow::create_objects() if( is_image ) render->range_type = RANGE_1FRAME; - int x1 = x + title->get_w() + 20, y1 = y; + int x1 = x + title->get_w() + xs20, y1 = y; add_subwindow(rangeproject = new RenderRangeProject(this, render->range_type == RANGE_PROJECT, x1, y)); int x2 = x1 + rangeproject->get_w(); - y += 20; + y += ys20; add_subwindow(rangeselection = new RenderRangeSelection(this, render->range_type == RANGE_SELECTION, x1, y)); int x3 = x1 + rangeselection->get_w(); if( x2 < x3 ) x2 = x3; - y += 20; + y += ys20; add_subwindow(rangeinout = new RenderRangeInOut(this, render->range_type == RANGE_INOUT, x1, y)); x3 = x1 + rangeinout->get_w(); if( x2 < x3 ) x2 = x3; - y += 20; + y += ys20; add_subwindow(range1frame = new RenderRange1Frame(this, render->range_type == RANGE_1FRAME, x1, y)); x3 = x1 + range1frame->get_w(); if( x2 < x3 ) x2 = x3; - y += 30; + y += ys30; if( is_image ) enable_render_range(0); - x1 = x2 + 20; + x1 = x2 + xs20; render->beep = mwindow->edl->session->render_beep; add_subwindow(beep_on_done = new RenderBeepOnDone(this, x1, y1)); + y1 += beep_on_done->get_h(); + add_subwindow(new BC_Title(x1, y1, _("Beep on done volume"))); renderprofile = new RenderProfile(mwindow, this, x, y, 1); renderprofile->create_objects(); - y += 70; + y += yS(70); - loadmode = new LoadMode(mwindow, this, x, y, &render->load_mode, 1); + loadmode = new LoadMode(mwindow, this, x, y, &render->load_mode); loadmode->create_objects(); add_subwindow(new BC_OKButton(this)); @@ -1178,7 +1205,6 @@ void RenderFormat::update_format() FormatTools::update_format(); RenderWindow *render_window = (RenderWindow *)window; if( render_window->is_hidden() ) return; - int is_image = File::is_image_render(asset->format); if( is_image ) { render_window->update_range_type(RANGE_1FRAME); @@ -1187,16 +1213,25 @@ void RenderFormat::update_format() else render_window->enable_render_range(1); } +int RenderFormat::handle_event() +{ + RenderWindow *render_window = (RenderWindow *)window; + render_window->file_format->update( + (render_window->render->use_labels ? + _("Select the first file to render to:") : + _("Select a file to render to:"))); + return 1; +} RenderBeepOnDone::RenderBeepOnDone(RenderWindow *rwindow, int x, int y) - : BC_CheckBox(x, y, rwindow->render->beep, _("Beep on done")) + : BC_FPot(x, y, rwindow->render->beep*100.f, 0.f, 100.f) { this->rwindow = rwindow; } int RenderBeepOnDone::handle_event() { - rwindow->render->beep = get_value(); + rwindow->render->beep = get_value()/100.f; return 1; }