add Autosave continuous backups by Andras Reuss and Andrew-R
[goodguy/cinelerra.git] / cinelerra-5.1 / cinelerra / vrender.C
index 770dfb8877e168e7f92be2e7123ce4f653801e06..be3d0c3beee90073fffcfb9bc4d4e5cf0bcad2d0 100644 (file)
@@ -22,6 +22,7 @@
 #include "asset.h"
 #include "bcsignals.h"
 #include "cache.h"
+#include "canvas.h"
 #include "clip.h"
 #include "condition.h"
 #include "datatype.h"
@@ -74,9 +75,10 @@ VRender::VRender(RenderEngine *renderengine)
 
 VRender::~VRender()
 {
-       if(input_temp) delete input_temp;
-       if(transition_temp) delete transition_temp;
-       if(overlayer) delete overlayer;
+       renderengine->wait_done();
+       delete overlayer;
+       delete input_temp;
+       delete transition_temp;
 }
 
 
@@ -97,10 +99,9 @@ Module* VRender::new_module(Track *track)
 
 int VRender::flash_output()
 {
-       if(video_out)
-               return renderengine->video->write_buffer(video_out, renderengine->get_edl());
-       else
-               return 0;
+       if( !video_out ) return 0;
+       renderengine->update_scope(video_out);
+       return renderengine->video->write_buffer(video_out, renderengine->get_edl());
 }
 
 int VRender::process_buffer(VFrame *video_out,
@@ -132,7 +133,8 @@ int VRender::process_buffer(int64_t input_position,
        int use_vconsole = 1;
        int use_brender = 0;
        int result = 0;
-       int use_cache = renderengine->command->single_frame();
+       int use_cache = renderengine->command->single_frame() ? 1 :
+               renderengine->command->get_direction() == PLAY_REVERSE ? -1 : 0;
 //     int use_asynchronous = 
 //             renderengine->command->realtime && 
 //             renderengine->get_edl()->session->video_every_frame &&
@@ -287,7 +289,7 @@ int VRender::get_colormodel(VEdit *playable_edit, int use_vconsole, int use_bren
 
 void VRender::run()
 {
-       int reconfigure;
+       int reconfigure = 1;
        const int debug = 0;
 
 // Want to know how many samples rendering each frame takes.
@@ -321,13 +323,13 @@ void VRender::run()
 // Want the condition before, since only 1 frame is rendered
 // and the number of frames skipped after this frame varies.
                current_input_length = 1;
-
-               reconfigure = vconsole->test_reconfigure(current_position,
-                       current_input_length);
-
-
+               if( !reconfigure ) reconfigure =
+                       vconsole->test_reconfigure(current_position, current_input_length);
                if(debug) printf("VRender::run %d\n", __LINE__);
-               if(reconfigure) restart_playback();
+               if( reconfigure ) {
+                       restart_playback();
+                       reconfigure = 0;
+               }
 
                if(debug) printf("VRender::run %d\n", __LINE__);
                process_buffer(current_position, use_opengl);
@@ -481,8 +483,9 @@ void VRender::run()
                        framerate_timer.update();
                }
                if(debug) printf("VRender::run %d done=%d\n", __LINE__, done);
-               if( !interrupt )
-                       interrupt = renderengine->video->interrupt;
+               if( !interrupt ) interrupt = renderengine->interrupted;
+               if( !interrupt ) interrupt = renderengine->video->interrupt;
+               if( !interrupt ) interrupt = vconsole->interrupt;
        }