upgrade to ffmpeg 4.2, rework mask for speedup
[goodguy/cinelerra.git] / cinelerra-5.1 / cinelerra / playbackengine.C
index 71126cf82810c6fce05b7c2a1aa9dae7ce4c273b..fcbeeb1d083bc79df2b01ccf077eef8a3fc04ed3 100644 (file)
@@ -33,6 +33,7 @@
 #include "mwindowgui.h"
 #include "patchbay.h"
 #include "tracking.h"
+#include "tracks.h"
 #include "playbackengine.h"
 #include "playtransport.h"
 #include "preferences.h"
@@ -130,7 +131,11 @@ int PlaybackEngine::create_render_engine()
 void PlaybackEngine::delete_render_engine()
 {
        renderengine_lock->lock("PlaybackEngine::delete_render_engine");
-       delete render_engine;  render_engine = 0;
+       if( render_engine ) {
+               render_engine->interrupt_playback();
+               render_engine->wait_done();
+               delete render_engine;  render_engine = 0;
+       }
        renderengine_lock->unlock();
 }
 
@@ -407,7 +412,11 @@ void PlaybackEngine::run()
 // Start tracking after arming so the tracking position doesn't change.
 // The tracking for a single frame command occurs during PAUSE
                        init_tracking();
-                       clear_output();
+                       if( !command->single_frame() ) {
+                               EDL *edl = command->get_edl();
+                               if( edl && edl->tracks->playable_video_tracks() )
+                                       clear_output();
+                       }
 // Dispatch the command
                        start_render_engine();
                        break;
@@ -534,9 +543,9 @@ int PlaybackEngine::transport_command(int command, int change_type, EDL *new_edl
 // Just change the EDL if the change requires it because renderengine
 // structures won't point to the new EDL otherwise and because copying the
 // EDL for every cursor movement is slow.
-               if( change_type & CHANGE_EDL )
+               if( change_type == CHANGE_EDL || change_type == CHANGE_ALL )
                        next_command->get_edl()->copy_all(new_edl);
-               else if( change_type & CHANGE_PARAMS )
+               else if( change_type == CHANGE_PARAMS )
                        next_command->get_edl()->synchronize_params(new_edl);
                next_command->set_playback_range(new_edl, use_inout,
                                preferences->forward_render_displacement);