Revision: 19896
          
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=19896
Author:   schlaile
Date:     2009-04-23 09:40:01 +0200 (Thu, 23 Apr 2009)

Log Message:
-----------
== Sequencer ==

Fixes:
[#18489] Adding (add filter) nested strips 
causes Blender VSE to segfault on frame render.
[#18209] 3 VSE crash bugs with .blends 
(all left click and move mouse over Metastrip/Blend Mode related)

... and a new segfault I introduced with my last commit.

Also: memcache limiter refcounts are tested now in critical
      places, printing an error message,
      since doing refcounting right is, well, hard.

Modified Paths:
--------------
    trunk/blender/source/blender/src/sequence.c

Modified: trunk/blender/source/blender/src/sequence.c
===================================================================
--- trunk/blender/source/blender/src/sequence.c 2009-04-23 07:37:54 UTC (rev 
19895)
+++ trunk/blender/source/blender/src/sequence.c 2009-04-23 07:40:01 UTC (rev 
19896)
@@ -1672,6 +1672,41 @@
        
 }
 
+static void check_limiter_refcount(const char * func, TStripElem *se)
+{
+       if (se && se->ibuf) {
+               int refcount = IMB_cache_limiter_get_refcount(se->ibuf);
+               if (refcount != 1) {
+                       /* can happen on complex pipelines */
+                       if (refcount > 1 && (G.f & G_DEBUG) == 0) {
+                               return;
+                       }
+
+                       fprintf(stderr, 
+                               "sequencer: (ibuf) %s: "
+                               "suspicious memcache "
+                               "limiter refcount: %d\n", func, refcount);
+               }
+       }
+}
+
+static void check_limiter_refcount_comp(const char * func, TStripElem *se)
+{
+       if (se && se->ibuf_comp) {
+               int refcount = IMB_cache_limiter_get_refcount(se->ibuf_comp);
+               if (refcount != 1) {
+                       /* can happen on complex pipelines */
+                       if (refcount > 1 && (G.f & G_DEBUG) == 0) {
+                               return;
+                       }
+                       fprintf(stderr, 
+                               "sequencer: (ibuf comp) %s: "
+                               "suspicious memcache "
+                               "limiter refcount: %d\n", func, refcount);
+               }
+       }
+}
+
 static TStripElem* do_build_seq_array_recursively(
        ListBase *seqbasep, int cfra, int chanshown);
 
@@ -1686,18 +1721,23 @@
 
        if(seq->type == SEQ_META) {
                TStripElem * meta_se = 0;
+               int use_preprocess = FALSE;
                use_limiter = FALSE;
 
                if (!build_proxy_run && se->ibuf == 0) {
                        se->ibuf = seq_proxy_fetch(seq, cfra);
                        if (se->ibuf) {
                                use_limiter = TRUE;
+                               use_preprocess = TRUE;
                        }
                }
 
                if(!se->ibuf && seq->seqbase.first) {
                        meta_se = do_build_seq_array_recursively(
                                &seq->seqbase, seq->start + se->nr, 0);
+
+                       check_limiter_refcount("do_build_seq_ibuf: for META",
+                                              meta_se);
                }
 
                se->ok = STRIPELEM_OK;
@@ -1719,14 +1759,17 @@
                                se->ibuf = i;
 
                                use_limiter = TRUE;
+                               use_preprocess = TRUE;
                        }
+               } else if (se->ibuf) {
+                       use_limiter = TRUE;
                }
                if (meta_se) {
                        free_metastrip_imbufs(
                                &seq->seqbase, seq->start + se->nr, 0);
                }
 
-               if (use_limiter) {
+               if (use_preprocess) {
                        input_preprocess(seq, se, cfra);
                }
        } else if(seq->type & SEQ_EFFECT) {
@@ -1762,7 +1805,8 @@
                                se->ibuf= IMB_loadiffname(
                                        name, IB_rect);
                                /* we don't need both (speed reasons)! */
-                               if (se->ibuf->rect_float && se->ibuf->rect) {
+                               if (se->ibuf &&
+                                   se->ibuf->rect_float && se->ibuf->rect) {
                                        imb_freerectImBuf(se->ibuf);
                                }
 
@@ -1797,7 +1841,8 @@
                                        IMB_anim_set_preseek(seq->anim, 
seq->anim_preseek);
                                        se->ibuf = IMB_anim_absolute(seq->anim, 
se->nr + seq->anim_startofs);
                                        /* we don't need both (speed reasons)! 
*/
-                                       if (se->ibuf->rect_float 
+                                       if (se->ibuf 
+                                           && se->ibuf->rect_float 
                                            && se->ibuf->rect) {
                                                imb_freerectImBuf(se->ibuf);
                                        }
@@ -1972,6 +2017,7 @@
        if (se->se3 && se->se3->ibuf) {
                IMB_cache_limiter_unref(se->se3->ibuf);
        }
+       check_limiter_refcount("do_effect_seq_recursively", se);
 }
 
 static TStripElem* do_build_seq_recursively_impl(Sequence * seq, int cfra)
@@ -1987,6 +2033,7 @@
                        do_build_seq_ibuf(seq, se, cfra, FALSE);
                }
        }
+       check_limiter_refcount("do_build_seq_recursively_impl", se);
        return se;
 }
 
@@ -2098,6 +2145,8 @@
        if (se2 && se2->ibuf)
                IMB_cache_limiter_unref(se2->ibuf);
 
+       check_limiter_refcount("do_handle_speed_effect", se);
+
        return se;
 }
 
@@ -2115,20 +2164,17 @@
 
 static TStripElem* do_build_seq_recursively(Sequence * seq, int cfra)
 {
+       TStripElem* se;
        if (seq->type == SEQ_SPEED) {
-               return do_handle_speed_effect(seq, cfra);
+               se = do_handle_speed_effect(seq, cfra);
        } else {
-               return do_build_seq_recursively_impl(seq, cfra);
+               se = do_build_seq_recursively_impl(seq, cfra);
        }
-}
 
-/* Bug: 18209
- * when dragging the mouse over a metastrip, on mouse-up for some unknown
- * reason in some cases the metastrips TStripElem->ibuf->rect is NULL,
- * This should be fixed but I had a look and couldnt work out why its
- * happening so for now workaround with a NULL check - campbell */
+       check_limiter_refcount("do_build_seq_recursively", se);
 
-#define SEQ_SPECIAL_SEQ_UPDATE_WORKAROUND
+       return se;
+}
 
 static TStripElem* do_build_seq_array_recursively(
        ListBase *seqbasep, int cfra, int chanshown)
@@ -2191,6 +2237,9 @@
                                se->ibuf_comp = IMB_allocImBuf(
                                        (short)seqrectx, (short)seqrecty, 
                                        32, IB_rect, 0);
+                               IMB_cache_limiter_insert(se->ibuf_comp);
+                               IMB_cache_limiter_ref(se->ibuf_comp);
+                               IMB_cache_limiter_touch(se->ibuf_comp);
                        }
                        break;
                }
@@ -2221,6 +2270,9 @@
                                se->ibuf_comp = IMB_allocImBuf(
                                        (short)seqrectx, (short)seqrecty, 
                                        32, IB_rect, 0);
+                               IMB_cache_limiter_insert(se->ibuf_comp);
+                               IMB_cache_limiter_ref(se->ibuf_comp);
+                               IMB_cache_limiter_touch(se->ibuf_comp);
                        }
                        break;
                case 1:
@@ -2239,6 +2291,9 @@
                                se->ibuf = IMB_allocImBuf(
                                        (short)seqrectx, (short)seqrecty, 
                                        32, IB_rect, 0);
+                               IMB_cache_limiter_insert(se->ibuf);
+                               IMB_cache_limiter_ref(se->ibuf);
+                               IMB_cache_limiter_touch(se->ibuf);
                        }
                        if (i == 0) {
                                se->ibuf_comp = se->ibuf;
@@ -2297,13 +2352,6 @@
                                IMB_rect_from_float(se2->ibuf);
                        }
                        
-#ifdef SEQ_SPECIAL_SEQ_UPDATE_WORKAROUND
-                       if (se2->ibuf->rect==NULL && 
se2->ibuf->rect_float==NULL) {
-                               printf("ERROR: sequencer se2->ibuf missing 
buffer\n");
-                       } else if (se1->ibuf && se1->ibuf->rect==NULL && 
se1->ibuf->rect_float==NULL) {
-                               printf("ERROR: sequencer se1->ibuf missing 
buffer\n");
-                       } else {
-#endif
                        /* bad hack, to fix crazy input ordering of 
                           those two effects */
 
@@ -2325,10 +2373,6 @@
                                           se2->ibuf_comp);
                        }
                        
-#ifdef SEQ_SPECIAL_SEQ_UPDATE_WORKAROUND
-                       }
-#endif
-                       
                        IMB_cache_limiter_insert(se2->ibuf_comp);
                        IMB_cache_limiter_ref(se2->ibuf_comp);
                        IMB_cache_limiter_touch(se2->ibuf_comp);
@@ -2383,6 +2427,8 @@
                return 0;
        }
 
+       check_limiter_refcount_comp("give_ibuf_seq_impl", se);
+
        return se->ibuf_comp;
 }
 
@@ -2400,6 +2446,8 @@
                return 0;
        }
 
+       check_limiter_refcount("give_ibuf_seq_direct", se);
+
        if (se->ibuf) {
                IMB_cache_limiter_unref(se->ibuf);
        }


_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to