X-Git-Url: https://git.cinelerra-gg.org/git/?p=goodguy%2Fcinelerra.git;a=blobdiff_plain;f=cinelerra-5.1%2Fcinelerra%2Frenderengine.C;h=0d8b06342fba9f7d1896f53f62aa06c29f7e5763;hp=9b640d20e2ada9e5467960654c4fd1f9f267015b;hb=9ffdfbe8e6fa7daaad4dcfdd46b6ac7b6e7a47e8;hpb=45dd712aa4b2894f6b2390b4797262831dcdb47a diff --git a/cinelerra-5.1/cinelerra/renderengine.C b/cinelerra-5.1/cinelerra/renderengine.C index 9b640d20..0d8b0634 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" @@ -398,8 +399,10 @@ void RenderEngine::update_framerate(float framerate) void RenderEngine::wait_render_threads() { + 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() @@ -460,27 +463,22 @@ void RenderEngine::run() { render_active->lock("RenderEngine::run"); - interrupt_lock->unlock(); start_render_threads(); wait_render_threads(); - interrupt_lock->lock("RenderEngine::wait_render_threads"); close_output(); - if( playback_engine && playback_engine->is_playing_back ) { - double position = interrupted ? - playback_engine->get_tracking_position() : - command->get_direction() == PLAY_FORWARD ? - command->end_position : - command->start_position; - playback_engine->command->command = STOP; - if( playback_engine->is_playing_back && command->displacement ) { - position -= 1./command->get_edl()->session->frame_rate; - if( position < 0 ) position = 0; - } + 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->tracking_position = position; - playback_engine->stop_tracking(); + playback_engine->stop_tracking(position); } render_active->unlock(); @@ -494,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(); +}