Fix sequencer crash when pasteing strips after creating new file
authorSergey Sharybin <sergey.vfx@gmail.com>
Thu, 28 Feb 2013 14:25:09 +0000 (14:25 +0000)
committerSergey Sharybin <sergey.vfx@gmail.com>
Thu, 28 Feb 2013 14:25:09 +0000 (14:25 +0000)
Issue happened for scene. movie clip and mask strips, which contains
pointers to datablocks which are freeing on loading new file.

Also, scene strip would crash when pasted from clipboard after scene
was unlinked from file.

source/blender/blenkernel/BKE_sequencer.h
source/blender/blenkernel/intern/mask.c
source/blender/blenkernel/intern/movieclip.c
source/blender/blenkernel/intern/scene.c
source/blender/blenkernel/intern/sequencer.c

index eef134a6872468da856e9e35fa7664066d34b8bd..c0ff634671db231f96304643c36e9759eb9edce0 100644 (file)
@@ -36,6 +36,7 @@ struct Editing;
 struct ImBuf;
 struct Main;
 struct Mask;
+struct MovieClip;
 struct Scene;
 struct Sequence;
 struct SequenceModifierData;
@@ -322,6 +323,8 @@ void BKE_sequence_base_dupli_recursive(struct Scene *scene, struct Scene *scene_
 int  BKE_sequence_is_valid_check(struct Sequence *seq);
 
 void BKE_sequencer_clear_scene_in_allseqs(struct Main *bmain, struct Scene *sce);
+void BKE_sequencer_clear_movieclip_in_clipboard(struct MovieClip *clip);
+void BKE_sequencer_clear_mask_in_clipboard(struct Mask *mask);
 
 struct Sequence *BKE_sequence_get_by_name(struct ListBase *seqbase, const char *name, int recursive);
 
index 960432d6b3d7c75f7ccc57b010f5195a1a607aee..87802ab8ee68e7ba9e47796088ecf87b12bd7caa 100644 (file)
@@ -923,6 +923,8 @@ void BKE_mask_free(Main *bmain, Mask *mask)
        SpaceLink *sl;
        Scene *scene;
 
+       BKE_sequencer_clear_mask_in_clipboard(mask);
+
        for (scr = bmain->screen.first; scr; scr = scr->id.next) {
                for (area = scr->areabase.first; area; area = area->next) {
                        for (sl = area->spacedata.first; sl; sl = sl->next) {
index 2702d5b3f0ab4d83293020c503673e038bd86488..b748f8cbdd3fc45fb383e386d4e5a3fb41302105 100644 (file)
@@ -75,6 +75,7 @@
 #include "BKE_node.h"
 #include "BKE_image.h"  /* openanim */
 #include "BKE_tracking.h"
+#include "BKE_sequencer.h"
 
 #include "IMB_colormanagement.h"
 #include "IMB_imbuf_types.h"
@@ -1292,6 +1293,8 @@ void BKE_movieclip_build_proxy_frame(MovieClip *clip, int clip_flag, struct Movi
 
 void BKE_movieclip_free(MovieClip *clip)
 {
+       BKE_sequencer_clear_movieclip_in_clipboard(clip);
+
        free_buffers(clip);
 
        BKE_tracking_free(&clip->tracking);
index c8346971d1c02310a39facb1681aace09e19d8f8..83b2648ee50ed7311e7fbbc0c220cf882ee141bb 100644 (file)
@@ -290,6 +290,9 @@ void BKE_scene_free(Scene *sce)
 {
        Base *base;
 
+       /* check all sequences */
+       BKE_sequencer_clear_scene_in_allseqs(G.main, sce);
+
        base = sce->base.first;
        while (base) {
                base->object->id.us--;
@@ -693,9 +696,6 @@ void BKE_scene_unlink(Main *bmain, Scene *sce, Scene *newsce)
                if (sce1->set == sce)
                        sce1->set = NULL;
        
-       /* check all sequences */
-       BKE_sequencer_clear_scene_in_allseqs(bmain, sce);
-
        /* check render layer nodes in other scenes */
        clear_scene_in_nodes(bmain, sce);
        
index b0a65d23d93cd6cfda9ab16a50a5e19f96639784..613c02c173b0dda1a04e7a1624fac3c0167d2be4 100644 (file)
@@ -815,6 +815,33 @@ void BKE_sequencer_clear_scene_in_allseqs(Main *bmain, Scene *scene)
                        BKE_sequencer_base_recursive_apply(&scene_iter->ed->seqbase, clear_scene_in_allseqs_cb, scene);
                }
        }
+
+       /* also clear clipboard */
+       BKE_sequencer_base_recursive_apply(&seqbase_clipboard, clear_scene_in_allseqs_cb, scene);
+}
+
+static int clear_movieclip_in_clipboard_cb(Sequence *seq, void *arg_pt)
+{
+       if (seq->clip == (MovieClip *)arg_pt)
+               seq->clip = NULL;
+       return 1;
+}
+
+void BKE_sequencer_clear_movieclip_in_clipboard(MovieClip *clip)
+{
+       BKE_sequencer_base_recursive_apply(&seqbase_clipboard, clear_movieclip_in_clipboard_cb, clip);
+}
+
+static int clear_mask_in_clipboard_cb(Sequence *seq, void *arg_pt)
+{
+       if (seq->mask == (Mask *)arg_pt)
+               seq->mask = NULL;
+       return 1;
+}
+
+void BKE_sequencer_clear_mask_in_clipboard(Mask *mask)
+{
+       BKE_sequencer_base_recursive_apply(&seqbase_clipboard, clear_mask_in_clipboard_cb, mask);
 }
 
 typedef struct SeqUniqueInfo {