X-Git-Url: https://git.cinelerra-gg.org/git/?a=blobdiff_plain;f=cinelerra-5.1%2Fcinelerra%2Frenderengine.C;h=7e7a52d75163c108adfe90165b8845b0b07eaa70;hb=83b70dd60863377cb281e6be5206304e10373e30;hp=721e3be85c9e77759604a12742bc37828004d906;hpb=7fd85fb66168f6b518c5f2d73e04036e87faa0e1;p=goodguy%2Fcinelerra.git diff --git a/cinelerra-5.1/cinelerra/renderengine.C b/cinelerra-5.1/cinelerra/renderengine.C index 721e3be8..7e7a52d7 100644 --- a/cinelerra-5.1/cinelerra/renderengine.C +++ b/cinelerra-5.1/cinelerra/renderengine.C @@ -24,6 +24,7 @@ #include "asset.h" #include "audiodevice.h" #include "bcsignals.h" +#include "canvas.h" #include "condition.h" #include "edl.h" #include "edlsession.h" @@ -61,7 +62,7 @@ RenderEngine::RenderEngine(PlaybackEngine *playback_engine, do_video = 0; interrupted = 0; this->preferences = new Preferences; - this->command = new TransportCommand; + this->command = new TransportCommand(preferences); this->preferences->copy_from(preferences); edl = 0; @@ -195,7 +196,7 @@ void RenderEngine::get_duty() get_edl()->session->audio_channels ) { do_audio = !command->single_frame() ? 1 : 0; - if( command->audio_toggle ) do_audio = !do_audio; + if( command->toggle_audio ) do_audio = !do_audio; } //printf("RenderEngine::get_duty %d\n", __LINE__); @@ -349,13 +350,9 @@ int64_t RenderEngine::sync_position() // Use audio device // No danger of race conditions because the output devices are closed after all // threads join. - if(do_audio) - { + if( do_audio ) return audio->current_position(); - } - - if(do_video) - { + if( do_video ) { int64_t result = timer.get_scaled_difference( get_edl()->session->sample_rate); return result; @@ -366,8 +363,7 @@ int64_t RenderEngine::sync_position() int RenderEngine::start_command() { - if(command->realtime && !is_nested) - { + if( command->realtime && !is_nested ) { interrupt_lock->lock("RenderEngine::start_command"); start_lock->lock("RenderEngine::start_command 1"); Thread::start(); @@ -379,15 +375,8 @@ int RenderEngine::start_command() void RenderEngine::arm_render_threads() { - if(do_audio) - { - arender->arm_command(); - } - - if(do_video) - { - vrender->arm_command(); - } + if( do_audio ) arender->arm_command(); + if( do_video ) vrender->arm_command(); } @@ -396,15 +385,10 @@ void RenderEngine::start_render_threads() // Synchronization timer. Gets reset once again after the first video frame. timer.update(); - if(do_audio) - { - arender->start_command(); - } + if( do_audio ) arender->start_command(); + if( do_video ) vrender->start_command(); - if(do_video) - { - vrender->start_command(); - } + start_lock->unlock(); } void RenderEngine::update_framerate(float framerate) @@ -415,29 +399,20 @@ void RenderEngine::update_framerate(float framerate) void RenderEngine::wait_render_threads() { - if(do_audio) - { - arender->Thread::join(); - } - - if(do_video) - { - vrender->Thread::join(); - } + interrupt_lock->unlock(); + if( do_audio ) arender->Thread::join(); + if( do_video ) vrender->Thread::join(); + interrupt_lock->lock("RenderEngine::wait_render_threads"); } void RenderEngine::interrupt_playback() { + if( interrupted ) return; interrupt_lock->lock("RenderEngine::interrupt_playback"); - interrupted = 1; - if(do_audio && arender) - { - arender->interrupt_playback(); - } - - if(do_video && vrender) - { - vrender->interrupt_playback(); + if( !interrupted ) { + interrupted = 1; + if( do_audio && arender ) arender->interrupt_playback(); + if( do_video && vrender ) vrender->interrupt_playback(); } interrupt_lock->unlock(); } @@ -445,25 +420,15 @@ void RenderEngine::interrupt_playback() int RenderEngine::close_output() { // Nested engines share devices - if(!is_nested) - { - if(audio) - { - audio->close_all(); - delete audio; - audio = 0; - } - - - - if(video) - { - video->close_all(); - delete video; - video = 0; - } + if( is_nested ) return 0; + if( audio ) { + audio->close_all(); + delete audio; audio = 0; + } + if( video ) { + video->close_all(); + delete video; video = 0; } - return 0; } @@ -497,57 +462,28 @@ void RenderEngine::get_module_levels(ArrayList *module_levels, int64_t p void RenderEngine::run() { render_active->lock("RenderEngine::run"); - start_render_threads(); - start_lock->unlock(); - interrupt_lock->unlock(); + start_render_threads(); wait_render_threads(); - interrupt_lock->lock("RenderEngine::run"); - - - if(interrupted) - { - playback_engine->tracking_position = playback_engine->get_tracking_position(); - } - close_output(); -// Fix the tracking position - if(playback_engine) - { - if(command->command == CURRENT_FRAME || command->command == LAST_FRAME) - { -//printf("RenderEngine::run 4.1 %d\n", playback_engine->tracking_position); - playback_engine->tracking_position = command->playbackstart; - } - else - { -// Make sure transport doesn't issue a pause command next -//printf("RenderEngine::run 4.1 %d\n", playback_engine->tracking_position); - if(!interrupted) - { - playback_engine->tracking_position = - command->get_direction() == PLAY_FORWARD ? - command->end_position : command->start_position; - } - - if( playback_engine->is_playing_back && command->displacement ) { - double position = playback_engine->tracking_position - - 1./command->get_edl()->session->frame_rate; - playback_engine->tracking_position = position >= 0 ? position : 0; - } - - if(!interrupted) playback_engine->command->command = STOP; - playback_engine->stop_tracking(); - - } + if( playback_engine ) { + double position = command->command == CURRENT_FRAME || + command->command == LAST_FRAME ? command->playbackstart : + playback_engine->is_playing_back && !interrupted ? + ( command->get_direction() == PLAY_FORWARD ? + command->end_position : command->start_position ) : + playback_engine->get_tracking_position() ; + position -= command->displacement; + if( position < 0 ) position = 0; playback_engine->is_playing_back = 0; + playback_engine->stop_tracking(position); } - input_lock->unlock(); - interrupt_lock->unlock(); render_active->unlock(); + interrupt_lock->unlock(); + input_lock->unlock(); } void RenderEngine::wait_done() @@ -556,4 +492,11 @@ void RenderEngine::wait_done() render_active->unlock(); } +void RenderEngine::update_scope(VFrame *frame) +{ + if( !video || !output || !output->scope_on() ) return; + output->lock_canvas("RenderEngine::update_scope"); + output->process_scope(video, frame); + output->unlock_canvas(); +}