Sequencer: clear cache and animation buffers for strips outside of cursor when rendering
authorSergey Sharybin <sergey.vfx@gmail.com>
Fri, 14 Sep 2012 14:28:24 +0000 (14:28 +0000)
committerSergey Sharybin <sergey.vfx@gmail.com>
Fri, 14 Sep 2012 14:28:24 +0000 (14:28 +0000)
This avoids having bunch of cached images when doing animation rendering,
keeping all the memory available for rendered itself.

This keeps memory usage low when rendering huge edits with mixed
scenes and movie strips.

This should not affect on sped of video encoding, which was confirmed by
some own tests.

--
svn merge -r50051:50052 ^/branches/soc-2011-tomato

source/blender/blenkernel/BKE_sequencer.h
source/blender/blenkernel/intern/sequencer.c
source/blender/editors/space_sequencer/sequencer_edit.c
source/blender/makesrna/intern/rna_sequencer.c
source/blender/render/intern/source/pipeline.c

index 69e10d1426b8cf24be2f43ca129340010f784560..51a64c97ca609c896da96e0664cf2cef1ba007d1 100644 (file)
@@ -291,7 +291,7 @@ void BKE_sequencer_dupe_animdata(struct Scene *scene, const char *name_src, cons
 int BKE_sequence_base_shuffle(struct ListBase *seqbasep, struct Sequence *test, struct Scene *evil_scene);
 int BKE_sequence_base_shuffle_time(ListBase *seqbasep, struct Scene *evil_scene);
 int BKE_sequence_base_isolated_sel_check(struct ListBase *seqbase);
-void BKE_sequencer_free_imbuf(struct Scene *scene, struct ListBase *seqbasep, int check_mem_usage, int keep_file_handles);
+void BKE_sequencer_free_imbuf(struct Scene *scene, struct ListBase *seqbasep, int for_render);
 struct Sequence *BKE_sequence_dupli_recursive(struct Scene *scene, struct Scene *scene_to, struct Sequence *seq, int dupe_flag);
 int BKE_sequence_swap(struct Sequence *seq_a, struct Sequence *seq_b, const char **error_str);
 
index 07c8da2837e5d5fa07a728e3fe9bb7e808976270..2596bf57f052969e53bd1f995cd5b24132a2854e 100644 (file)
@@ -2993,46 +2993,27 @@ void BKE_sequence_invalidate_cache_for_modifier(Scene *scene, Sequence *seq)
        sequence_invalidate_cache(scene, seq, TRUE, FALSE);
 }
 
-void BKE_sequencer_free_imbuf(Scene *scene, ListBase *seqbase, int check_mem_usage, int keep_file_handles)
+void BKE_sequencer_free_imbuf(Scene *scene, ListBase *seqbase, int for_render)
 {
        Sequence *seq;
 
-       if (check_mem_usage) {
-               /* Let the cache limitor take care of this (schlaile) */
-               /* While render let's keep all memory available for render 
-                * (ton)
-                * At least if free memory is tight...
-                * This can make a big difference in encoding speed
-                * (it is around 4 times(!) faster, if we do not waste time
-                * on freeing _all_ buffers every time on long timelines...)
-                * (schlaile)
-                */
-       
-               uintptr_t mem_in_use;
-               uintptr_t mmap_in_use;
-               uintptr_t max;
-       
-               mem_in_use = MEM_get_memory_in_use();
-               mmap_in_use = MEM_get_mapped_memory_in_use();
-               max = MEM_CacheLimiter_get_maximum();
-       
-               if (max == 0 || mem_in_use + mmap_in_use <= max) {
-                       return;
-               }
-       }
-
        BKE_sequencer_cache_cleanup();
-       
+
        for (seq = seqbase->first; seq; seq = seq->next) {
+               if (for_render && CFRA >= seq->startdisp && CFRA <= seq->enddisp) {
+                       continue;
+               }
+
                if (seq->strip) {
-                       if (seq->type == SEQ_TYPE_MOVIE && !keep_file_handles)
+                       if (seq->type == SEQ_TYPE_MOVIE) {
                                free_anim_seq(seq);
+                       }
                        if (seq->type == SEQ_TYPE_SPEED) {
                                BKE_sequence_effect_speed_rebuild_map(scene, seq, 1);
                        }
                }
                if (seq->type == SEQ_TYPE_META) {
-                       BKE_sequencer_free_imbuf(scene, &seq->seqbase, FALSE, keep_file_handles);
+                       BKE_sequencer_free_imbuf(scene, &seq->seqbase, for_render);
                }
                if (seq->type == SEQ_TYPE_SCENE) {
                        /* FIXME: recurs downwards, 
index 828376654bed87cad5318a00fb5d7b27b65dd590..f47eb3398784360559cb7d4abf3fcf9e90c6f5f4 100644 (file)
@@ -170,7 +170,7 @@ static void proxy_endjob(void *pjv)
                BKE_sequencer_proxy_rebuild_finish(link->data, pj->stop);
        }
 
-       BKE_sequencer_free_imbuf(pj->scene, &ed->seqbase, FALSE, FALSE);
+       BKE_sequencer_free_imbuf(pj->scene, &ed->seqbase, FALSE);
 
        WM_main_add_notifier(NC_SCENE | ND_SEQUENCER, pj->scene);
 }
@@ -1348,7 +1348,7 @@ static int sequencer_refresh_all_exec(bContext *C, wmOperator *UNUSED(op))
        Scene *scene = CTX_data_scene(C);
        Editing *ed = BKE_sequencer_editing_get(scene, FALSE);
 
-       BKE_sequencer_free_imbuf(scene, &ed->seqbase, FALSE, FALSE);
+       BKE_sequencer_free_imbuf(scene, &ed->seqbase, FALSE);
 
        WM_event_add_notifier(C, NC_SCENE | ND_SEQUENCER, scene);
 
@@ -2911,7 +2911,7 @@ static int sequencer_change_effect_input_exec(bContext *C, wmOperator *op)
        BKE_sequencer_update_changed_seq_and_deps(scene, seq, 0, 1);
 
        /* important else we don't get the imbuf cache flushed */
-       BKE_sequencer_free_imbuf(scene, &ed->seqbase, FALSE, FALSE);
+       BKE_sequencer_free_imbuf(scene, &ed->seqbase, FALSE);
 
        WM_event_add_notifier(C, NC_SCENE | ND_SEQUENCER, scene);
 
@@ -2971,7 +2971,7 @@ static int sequencer_change_effect_type_exec(bContext *C, wmOperator *op)
        BKE_sequencer_update_changed_seq_and_deps(scene, seq, 0, 1);
 
        /* important else we don't get the imbuf cache flushed */
-       BKE_sequencer_free_imbuf(scene, &ed->seqbase, FALSE, FALSE);
+       BKE_sequencer_free_imbuf(scene, &ed->seqbase, FALSE);
 
        WM_event_add_notifier(C, NC_SCENE | ND_SEQUENCER, scene);
 
@@ -3044,7 +3044,7 @@ static int sequencer_change_path_exec(bContext *C, wmOperator *op)
                BKE_sequence_calc(scene, seq);
 
                /* important else we don't get the imbuf cache flushed */
-               BKE_sequencer_free_imbuf(scene, &ed->seqbase, FALSE, FALSE);
+               BKE_sequencer_free_imbuf(scene, &ed->seqbase, FALSE);
        }
        else {
                /* lame, set rna filepath */
index 593d931374d085817b4310c5eb222743e0d74113..e3e467a9abbd3ca610058b2e99c0695c3d3ed5b7 100644 (file)
@@ -617,7 +617,7 @@ static void rna_Sequence_update_reopen_files(Main *UNUSED(bmain), Scene *UNUSED(
        Scene *scene = (Scene *) ptr->id.data;
        Editing *ed = BKE_sequencer_editing_get(scene, FALSE);
 
-       BKE_sequencer_free_imbuf(scene, &ed->seqbase, FALSE, FALSE);
+       BKE_sequencer_free_imbuf(scene, &ed->seqbase, FALSE);
 
        if (RNA_struct_is_a(ptr->type, &RNA_SoundSequence))
                BKE_sequencer_update_sound_bounds(scene, ptr->data);
index 44bd2c6d50f584fae54969922aaf769a3a25e7f6..5f110410978c89bfb96b4e52872125b1de2bb7f4 100644 (file)
@@ -1689,7 +1689,7 @@ static void do_render_seq(Render *re)
                if (recurs_depth == 0) { /* with nested scenes, only free on toplevel... */
                        Editing *ed = re->scene->ed;
                        if (ed)
-                               BKE_sequencer_free_imbuf(re->scene, &ed->seqbase, TRUE, TRUE);
+                               BKE_sequencer_free_imbuf(re->scene, &ed->seqbase, TRUE);
                }
                IMB_freeImBuf(ibuf);
        }