From 9c0060572928d75faf999f148fc49570bee765e7 Mon Sep 17 00:00:00 2001 From: Richard Antalik Date: Thu, 6 Jun 2019 14:44:12 -0700 Subject: VSE: Cache invalidation Add invalidation to strip add functions Add invalidation for scene and movieclip strips Skip invalidation for sound strips Reviewed By: brecht Differential Revision: https://developer.blender.org/D4989 --- source/blender/blenkernel/BKE_sequencer.h | 2 + source/blender/blenkernel/intern/sequencer.c | 54 ++++++++++++++++++++++ .../editors/space_sequencer/sequencer_add.c | 5 ++ .../editors/space_sequencer/sequencer_edit.c | 6 +-- source/blender/makesrna/intern/rna_camera.c | 3 +- source/blender/makesrna/intern/rna_color.c | 4 +- source/blender/makesrna/intern/rna_movieclip.c | 14 +++++- source/blender/makesrna/intern/rna_scene.c | 2 +- source/blender/makesrna/intern/rna_sequencer_api.c | 6 ++- source/blender/makesrna/intern/rna_space.c | 18 +++++--- 10 files changed, 97 insertions(+), 17 deletions(-) (limited to 'source/blender') diff --git a/source/blender/blenkernel/BKE_sequencer.h b/source/blender/blenkernel/BKE_sequencer.h index c62744842ce..7eb08e6f770 100644 --- a/source/blender/blenkernel/BKE_sequencer.h +++ b/source/blender/blenkernel/BKE_sequencer.h @@ -398,6 +398,8 @@ void BKE_sequence_invalidate_cache_raw(struct Scene *scene, struct Sequence *seq void BKE_sequence_invalidate_cache_preprocessed(struct Scene *scene, struct Sequence *seq); void BKE_sequence_invalidate_cache_composite(struct Scene *scene, struct Sequence *seq); void BKE_sequence_invalidate_dependent(struct Scene *scene, struct Sequence *seq); +void BKE_sequence_invalidate_scene_strips(struct Main *bmain, struct Scene *scene_target); +void BKE_sequence_invalidate_movieclip_strips(struct Main *bmain, struct MovieClip *clip_target); void BKE_sequencer_update_sound_bounds_all(struct Scene *scene); void BKE_sequencer_update_sound_bounds(struct Scene *scene, struct Sequence *seq); diff --git a/source/blender/blenkernel/intern/sequencer.c b/source/blender/blenkernel/intern/sequencer.c index 24342ab34ba..095e7e88193 100644 --- a/source/blender/blenkernel/intern/sequencer.c +++ b/source/blender/blenkernel/intern/sequencer.c @@ -4349,16 +4349,68 @@ void BKE_sequence_invalidate_cache_preprocessed(Scene *scene, Sequence *seq) void BKE_sequence_invalidate_cache_composite(Scene *scene, Sequence *seq) { + if (ELEM(seq->type, SEQ_TYPE_SOUND_RAM, SEQ_TYPE_SOUND_HD)) { + return; + } + sequence_invalidate_cache( scene, seq, true, SEQ_CACHE_STORE_COMPOSITE | SEQ_CACHE_STORE_FINAL_OUT); } void BKE_sequence_invalidate_dependent(Scene *scene, Sequence *seq) { + if (ELEM(seq->type, SEQ_TYPE_SOUND_RAM, SEQ_TYPE_SOUND_HD)) { + return; + } + sequence_invalidate_cache( scene, seq, false, SEQ_CACHE_STORE_COMPOSITE | SEQ_CACHE_STORE_FINAL_OUT); } +static void invalidate_scene_strips(Scene *scene, Scene *scene_target, ListBase *seqbase) +{ + for (Sequence *seq = seqbase->first; seq != NULL; seq = seq->next) { + if (seq->scene == scene_target) { + BKE_sequence_invalidate_cache_raw(scene, seq); + } + + if (seq->seqbase.first != NULL) { + invalidate_scene_strips(scene, scene_target, &seq->seqbase); + } + } +} + +void BKE_sequence_invalidate_scene_strips(Main *bmain, Scene *scene_target) +{ + for (Scene *scene = bmain->scenes.first; scene != NULL; scene = scene->id.next) { + if (scene->ed != NULL) { + invalidate_scene_strips(scene, scene_target, &scene->ed->seqbase); + } + } +} + +static void invalidate_movieclip_strips(Scene *scene, MovieClip *clip_target, ListBase *seqbase) +{ + for (Sequence *seq = seqbase->first; seq != NULL; seq = seq->next) { + if (seq->clip == clip_target) { + BKE_sequence_invalidate_cache_raw(scene, seq); + } + + if (seq->seqbase.first != NULL) { + invalidate_movieclip_strips(scene, clip_target, &seq->seqbase); + } + } +} + +void BKE_sequence_invalidate_movieclip_strips(Main *bmain, MovieClip *clip_target) +{ + for (Scene *scene = bmain->scenes.first; scene != NULL; scene = scene->id.next) { + if (scene->ed != NULL) { + invalidate_movieclip_strips(scene, clip_target, &scene->ed->seqbase); + } + } +} + void BKE_sequencer_free_imbuf(Scene *scene, ListBase *seqbase, bool for_render) { Sequence *seq; @@ -5486,6 +5538,7 @@ Sequence *BKE_sequencer_add_image_strip(bContext *C, ListBase *seqbasep, SeqLoad seq->flag |= seq_load->flag & SEQ_USE_VIEWS; seq_load_apply(CTX_data_main(C), scene, seq, seq_load); + BKE_sequence_invalidate_cache_composite(scene, seq); return seq; } @@ -5688,6 +5741,7 @@ Sequence *BKE_sequencer_add_movie_strip(bContext *C, ListBase *seqbasep, SeqLoad /* can be NULL */ seq_load_apply(CTX_data_main(C), scene, seq, seq_load); + BKE_sequence_invalidate_cache_composite(scene, seq); MEM_freeN(anim_arr); return seq; diff --git a/source/blender/editors/space_sequencer/sequencer_add.c b/source/blender/editors/space_sequencer/sequencer_add.c index 190c2edf30c..61471477695 100644 --- a/source/blender/editors/space_sequencer/sequencer_add.c +++ b/source/blender/editors/space_sequencer/sequencer_add.c @@ -352,6 +352,7 @@ static int sequencer_add_scene_strip_exec(bContext *C, wmOperator *op) sequencer_add_apply_replace_sel(C, op, seq); sequencer_add_apply_overlap(C, op, seq); + BKE_sequence_invalidate_cache_composite(scene, seq); DEG_id_tag_update(&scene->id, ID_RECALC_SEQUENCER_STRIPS); WM_event_add_notifier(C, NC_SCENE | ND_SEQUENCER, scene); @@ -435,6 +436,7 @@ static int sequencer_add_movieclip_strip_exec(bContext *C, wmOperator *op) sequencer_add_apply_replace_sel(C, op, seq); sequencer_add_apply_overlap(C, op, seq); + BKE_sequence_invalidate_cache_composite(scene, seq); DEG_id_tag_update(&scene->id, ID_RECALC_SEQUENCER_STRIPS); WM_event_add_notifier(C, NC_SCENE | ND_SEQUENCER, scene); @@ -518,6 +520,7 @@ static int sequencer_add_mask_strip_exec(bContext *C, wmOperator *op) sequencer_add_apply_replace_sel(C, op, seq); sequencer_add_apply_overlap(C, op, seq); + BKE_sequence_invalidate_cache_composite(scene, seq); DEG_id_tag_update(&scene->id, ID_RECALC_SEQUENCER_STRIPS); WM_event_add_notifier(C, NC_SCENE | ND_SEQUENCER, scene); @@ -960,6 +963,7 @@ static int sequencer_add_image_strip_exec(bContext *C, wmOperator *op) if (op->customdata) { MEM_freeN(op->customdata); } + BKE_sequence_invalidate_cache_composite(scene, seq); DEG_id_tag_update(&scene->id, ID_RECALC_SEQUENCER_STRIPS); WM_event_add_notifier(C, NC_SCENE | ND_SEQUENCER, scene); @@ -1110,6 +1114,7 @@ static int sequencer_add_effect_strip_exec(bContext *C, wmOperator *op) /* not sure if this is needed with update_changed_seq_and_deps. * it was NOT called in blender 2.4x, but wont hurt */ BKE_sequencer_sort(scene); + BKE_sequence_invalidate_cache_composite(scene, seq); DEG_id_tag_update(&scene->id, ID_RECALC_SEQUENCER_STRIPS); WM_event_add_notifier(C, NC_SCENE | ND_SEQUENCER, scene); diff --git a/source/blender/editors/space_sequencer/sequencer_edit.c b/source/blender/editors/space_sequencer/sequencer_edit.c index 038ab0cc7cd..d7a07a3e868 100644 --- a/source/blender/editors/space_sequencer/sequencer_edit.c +++ b/source/blender/editors/space_sequencer/sequencer_edit.c @@ -2673,7 +2673,7 @@ static int sequencer_meta_make_exec(bContext *C, wmOperator *op) while (seq) { next = seq->next; if (seq != seqm && (seq->flag & SELECT)) { - BKE_sequence_invalidate_dependent(scene, seq); + BKE_sequence_invalidate_cache_composite(scene, seq); channel_max = max_ii(seq->machine, channel_max); BLI_remlink(ed->seqbasep, seq); BLI_addtail(&seqm->seqbase, seq); @@ -2692,7 +2692,7 @@ static int sequencer_meta_make_exec(bContext *C, wmOperator *op) DEG_id_tag_update(&scene->id, ID_RECALC_SEQUENCER_STRIPS); BKE_sequence_base_unique_name_recursive(&scene->ed->seqbase, seqm); - + BKE_sequence_invalidate_cache_composite(scene, seq); WM_event_add_notifier(C, NC_SCENE | ND_SEQUENCER, scene); return OPERATOR_FINISHED; @@ -2745,7 +2745,7 @@ static int sequencer_meta_separate_exec(bContext *C, wmOperator *UNUSED(op)) } for (seq = last_seq->seqbase.first; seq != NULL; seq = seq->next) { - BKE_sequence_invalidate_dependent(scene, seq); + BKE_sequence_invalidate_cache_composite(scene, seq); } BLI_movelisttolist(ed->seqbasep, &last_seq->seqbase); diff --git a/source/blender/makesrna/intern/rna_camera.c b/source/blender/makesrna/intern/rna_camera.c index eda89ebfb50..7cb1610fd31 100644 --- a/source/blender/makesrna/intern/rna_camera.c +++ b/source/blender/makesrna/intern/rna_camera.c @@ -126,8 +126,7 @@ static void rna_Camera_background_images_clear(Camera *cam) static void rna_Camera_dof_update(Main *bmain, Scene *scene, PointerRNA *UNUSED(ptr)) { - /* TODO(sergey): Can be more selective here. */ - BKE_sequencer_cache_cleanup_all(bmain); + BKE_sequence_invalidate_scene_strips(bmain, scene); WM_main_add_notifier(NC_SCENE | ND_SEQUENCER, scene); } diff --git a/source/blender/makesrna/intern/rna_color.c b/source/blender/makesrna/intern/rna_color.c index 5f3fcaa48d7..43df1d8e1aa 100644 --- a/source/blender/makesrna/intern/rna_color.c +++ b/source/blender/makesrna/intern/rna_color.c @@ -598,12 +598,14 @@ static void rna_ColorManagedColorspaceSettings_reload_update(Main *bmain, MovieClip *clip = (MovieClip *)id; BKE_movieclip_reload(bmain, clip); + BKE_sequence_invalidate_movieclip_strips(bmain, clip); WM_main_add_notifier(NC_MOVIECLIP | ND_DISPLAY, &clip->id); WM_main_add_notifier(NC_MOVIECLIP | NA_EDITED, &clip->id); } else if (GS(id->name) == ID_SCE) { Scene *scene = (Scene *)id; + BKE_sequence_invalidate_scene_strips(bmain, scene); if (scene->ed) { ColorManagedColorspaceSettings *colorspace_settings = (ColorManagedColorspaceSettings *) @@ -641,8 +643,6 @@ static void rna_ColorManagedColorspaceSettings_reload_update(Main *bmain, WM_main_add_notifier(NC_SCENE | ND_SEQUENCER, NULL); } } - - BKE_sequencer_cache_cleanup_all(bmain); } static char *rna_ColorManagedSequencerColorspaceSettings_path(PointerRNA *UNUSED(ptr)) diff --git a/source/blender/makesrna/intern/rna_movieclip.c b/source/blender/makesrna/intern/rna_movieclip.c index d09b6f6af9b..247c4c69019 100644 --- a/source/blender/makesrna/intern/rna_movieclip.c +++ b/source/blender/makesrna/intern/rna_movieclip.c @@ -46,6 +46,8 @@ # include "ED_clip.h" +# include "BKE_sequencer.h" + # include "DNA_screen_types.h" # include "DNA_space_types.h" @@ -71,7 +73,14 @@ static float rna_MovieClip_fps_get(PointerRNA *ptr) return BKE_movieclip_get_fps(clip); } -static void rna_MovieClipUser_proxy_render_settings_update(Main *UNUSED(bmain), +static void rna_MovieClip_use_proxy_update(Main *bmain, Scene *UNUSED(scene), PointerRNA *ptr) +{ + MovieClip *clip = (MovieClip *)ptr->id.data; + BKE_movieclip_clear_cache(clip); + BKE_sequence_invalidate_movieclip_strips(bmain, clip); +} + +static void rna_MovieClipUser_proxy_render_settings_update(Main *bmain, Scene *UNUSED(scene), PointerRNA *ptr) { @@ -97,6 +106,7 @@ static void rna_MovieClipUser_proxy_render_settings_update(Main *UNUSED(bmain), if (clip && (clip->flag & MCLIP_USE_PROXY)) { BKE_movieclip_clear_cache(clip); + BKE_sequence_invalidate_movieclip_strips(bmain, clip); } break; @@ -336,7 +346,7 @@ static void rna_def_movieclip(BlenderRNA *brna) RNA_def_property_clear_flag(prop, PROP_ANIMATABLE); RNA_def_property_ui_text( prop, "Use Proxy / Timecode", "Use a preview proxy and/or timecode index for this clip"); - RNA_def_property_update(prop, NC_MOVIECLIP | ND_DISPLAY, NULL); + RNA_def_property_update(prop, NC_MOVIECLIP | ND_DISPLAY, "rna_MovieClip_use_proxy_update"); prop = RNA_def_int_vector(srna, "size", diff --git a/source/blender/makesrna/intern/rna_scene.c b/source/blender/makesrna/intern/rna_scene.c index 702900e222f..54f9a52477a 100644 --- a/source/blender/makesrna/intern/rna_scene.c +++ b/source/blender/makesrna/intern/rna_scene.c @@ -2052,7 +2052,7 @@ static void rna_SceneCamera_update(Main *bmain, Scene *UNUSED(scene), PointerRNA Scene *scene = (Scene *)ptr->id.data; Object *camera = scene->camera; - BKE_sequencer_cache_cleanup_all(bmain); + BKE_sequence_invalidate_scene_strips(bmain, scene); if (camera && (camera->type == OB_CAMERA)) { DEG_id_tag_update(&camera->id, ID_RECALC_GEOMETRY); diff --git a/source/blender/makesrna/intern/rna_sequencer_api.c b/source/blender/makesrna/intern/rna_sequencer_api.c index a50f01afd78..37ebb76daa5 100644 --- a/source/blender/makesrna/intern/rna_sequencer_api.c +++ b/source/blender/makesrna/intern/rna_sequencer_api.c @@ -133,6 +133,7 @@ static Sequence *rna_Sequences_new_mask( id_us_plus((ID *)mask); BKE_sequence_calc_disp(scene, seq); + BKE_sequence_invalidate_cache_composite(scene, seq); WM_main_add_notifier(NC_SCENE | ND_SEQUENCER, scene); @@ -153,6 +154,7 @@ static Sequence *rna_Sequences_new_scene( id_us_plus((ID *)sce_seq); BKE_sequence_calc_disp(scene, seq); + BKE_sequence_invalidate_cache_composite(scene, seq); WM_main_add_notifier(NC_SCENE | ND_SEQUENCER, scene); @@ -181,6 +183,7 @@ static Sequence *rna_Sequences_new_image(ID *id, } BKE_sequence_calc_disp(scene, seq); + BKE_sequence_invalidate_cache_composite(scene, seq); WM_main_add_notifier(NC_SCENE | ND_SEQUENCER, scene); @@ -216,6 +219,7 @@ static Sequence *rna_Sequences_new_movie(ID *id, seq->len = IMB_anim_get_duration(an, IMB_TC_RECORD_RUN); BKE_sequence_calc_disp(scene, seq); + BKE_sequence_invalidate_cache_composite(scene, seq); WM_main_add_notifier(NC_SCENE | ND_SEQUENCER, scene); @@ -340,6 +344,7 @@ static Sequence *rna_Sequences_new_effect(ID *id, BKE_sequence_calc(scene, seq); BKE_sequence_calc_disp(scene, seq); + BKE_sequence_invalidate_cache_composite(scene, seq); WM_main_add_notifier(NC_SCENE | ND_SEQUENCER, scene); @@ -375,7 +380,6 @@ static StripElem *rna_SequenceElements_append(ID *id, Sequence *seq, const char seq->len++; BKE_sequence_calc_disp(scene, seq); - WM_main_add_notifier(NC_SCENE | ND_SEQUENCER, scene); return se; diff --git a/source/blender/makesrna/intern/rna_space.c b/source/blender/makesrna/intern/rna_space.c index 12f5535dcc3..4b08f75eb06 100644 --- a/source/blender/makesrna/intern/rna_space.c +++ b/source/blender/makesrna/intern/rna_space.c @@ -30,6 +30,7 @@ #include "BKE_movieclip.h" #include "BKE_node.h" #include "BKE_studiolight.h" +#include "BKE_sequencer.h" #include "BLI_math.h" @@ -1974,9 +1975,14 @@ static void rna_SpaceConsole_rect_update(Main *UNUSED(bmain), WM_main_add_notifier(NC_SPACE | ND_SPACE_CONSOLE | NA_EDITED, sc); } -static void rna_Sequencer_view_type_update(Main *UNUSED(bmain), - Scene *UNUSED(scene), - PointerRNA *ptr) +static void rna_SequenceEditor_update_cache(Main *UNUSED(bmain), + Scene *scene, + PointerRNA *UNUSED(ptr)) +{ + BKE_sequencer_cache_cleanup(scene); +} + +static void rna_Sequencer_view_type_update(Main *UNUSED(bmain), Scene *scene, PointerRNA *ptr) { ScrArea *sa = rna_area_from_space(ptr); ED_area_tag_refresh(sa); @@ -4498,13 +4504,13 @@ static void rna_def_space_sequencer(BlenderRNA *brna) "Display Channel", "The channel number shown in the image preview. 0 is the result of all strips combined"); RNA_def_property_range(prop, -5, MAXSEQ); - RNA_def_property_update(prop, NC_SPACE | ND_SPACE_SEQUENCER, NULL); + RNA_def_property_update(prop, NC_SPACE | ND_SPACE_SEQUENCER, "rna_SequenceEditor_update_cache"); prop = RNA_def_property(srna, "preview_channels", PROP_ENUM, PROP_NONE); RNA_def_property_enum_bitflag_sdna(prop, NULL, "flag"); RNA_def_property_enum_items(prop, preview_channels_items); RNA_def_property_ui_text(prop, "Display Channels", "Channels of the preview to draw"); - RNA_def_property_update(prop, NC_SPACE | ND_SPACE_SEQUENCER, NULL); + RNA_def_property_update(prop, NC_SPACE | ND_SPACE_SEQUENCER, "rna_SequenceEditor_update_cache"); prop = RNA_def_property(srna, "waveform_display_type", PROP_ENUM, PROP_NONE); RNA_def_property_enum_bitflag_sdna(prop, NULL, "flag"); @@ -4524,7 +4530,7 @@ static void rna_def_space_sequencer(BlenderRNA *brna) RNA_def_property_ui_text(prop, "Proxy Render Size", "Display preview using full resolution or different proxy resolutions"); - RNA_def_property_update(prop, NC_SPACE | ND_SPACE_SEQUENCER, NULL); + RNA_def_property_update(prop, NC_SPACE | ND_SPACE_SEQUENCER, "rna_SequenceEditor_update_cache"); /* grease pencil */ prop = RNA_def_property(srna, "grease_pencil", PROP_POINTER, PROP_NONE); -- cgit v1.2.3