fix awdw solo vicon crash, fix nested clip for binfolders, open edit edl
[goodguy/cinelerra.git] / cinelerra-5.1 / cinelerra / renderengine.C
index faba961583a5ce347196f77099a9d006f9a6960e..0d8b06342fba9f7d1896f53f62aa06c29f7e5763 100644 (file)
@@ -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"
@@ -467,19 +468,17 @@ void RenderEngine::run()
 
        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;
-               if( 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();
@@ -493,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();
+}