Fixed issues updating texture buffer used for clip editor frame display
authorSergey Sharybin <sergey.vfx@gmail.com>
Mon, 9 Jul 2012 10:26:01 +0000 (10:26 +0000)
committerSergey Sharybin <sergey.vfx@gmail.com>
Mon, 9 Jul 2012 10:26:01 +0000 (10:26 +0000)
when specific circumstances are met.

Mainly issue was caused by checking ImBuf pointers, which used to fail
when some post-processing flags are changed. This was caused by the
fact that freeing old ImBuf and allocating new one could lead to new
ImBuf have the same pointer as previous one, which confuses cache.

source/blender/blenkernel/intern/movieclip.c

index 54e93f583074ea602f23a93362ebfa0cb6085f3b..2d83a748767e7e6ccbd1f0ea9158bb2a6f3fcca5 100644 (file)
@@ -322,6 +322,8 @@ typedef struct MovieClipCache {
 
        /* cache for stable shot */
        struct {
+               ImBuf *reference_ibuf;
+
                ImBuf *ibuf;
                int framenr;
                int postprocess_flag;
@@ -655,9 +657,6 @@ static ImBuf *put_postprocessed_frame_to_cache(MovieClip *clip, MovieClipUser *u
        MovieTrackingCamera *camera = &clip->tracking.camera;
        ImBuf *postproc_ibuf = NULL;
 
-       if (cache->postprocessed.ibuf)
-               IMB_freeImBuf(cache->postprocessed.ibuf);
-
        cache->postprocessed.framenr = user->framenr;
        cache->postprocessed.flag = postprocess_flag;
 
@@ -695,13 +694,10 @@ static ImBuf *put_postprocessed_frame_to_cache(MovieClip *clip, MovieClipUser *u
 
        IMB_refImBuf(postproc_ibuf);
 
-       cache->postprocessed.ibuf = postproc_ibuf;
+       if (cache->postprocessed.ibuf)
+               IMB_freeImBuf(cache->postprocessed.ibuf);
 
-       if (cache->stabilized.ibuf) {
-               /* force stable buffer be re-calculated */
-               IMB_freeImBuf(cache->stabilized.ibuf);
-               cache->stabilized.ibuf = NULL;
-       }
+       cache->postprocessed.ibuf = postproc_ibuf;
 
        return postproc_ibuf;
 }
@@ -777,7 +773,8 @@ ImBuf *BKE_movieclip_get_postprocessed_ibuf(MovieClip *clip, MovieClipUser *user
        return movieclip_get_postprocessed_ibuf(clip, user, clip->flag, postprocess_flag, 0);
 }
 
-static ImBuf *get_stable_cached_frame(MovieClip *clip, MovieClipUser *user, int framenr, int postprocess_flag)
+static ImBuf *get_stable_cached_frame(MovieClip *clip, MovieClipUser *user, ImBuf *reference_ibuf,
+                                      int framenr, int postprocess_flag)
 {
        MovieClipCache *cache = clip->cache;
        MovieTracking *tracking = &clip->tracking;
@@ -796,6 +793,9 @@ static ImBuf *get_stable_cached_frame(MovieClip *clip, MovieClipUser *user, int
        if (!cache->stabilized.ibuf || cache->stabilized.framenr != framenr)
                return NULL;
 
+       if (cache->stabilized.reference_ibuf != reference_ibuf)
+               return NULL;
+
        /* cached ibuf used different proxy settings */
        if (cache->stabilized.render_flag != render_flag || cache->stabilized.proxy != proxy)
                return NULL;
@@ -836,13 +836,8 @@ static ImBuf *put_stabilized_frame_to_cache(MovieClip *clip, MovieClipUser *user
        float tloc[2], tscale, tangle;
        int clip_framenr = BKE_movieclip_remap_scene_to_clip_frame(clip, framenr);
 
-       if (cache->stabilized.ibuf)
-               IMB_freeImBuf(cache->stabilized.ibuf);
-
        stableibuf = BKE_tracking_stabilize_frame(&clip->tracking, clip_framenr, ibuf, tloc, &tscale, &tangle);
 
-       cache->stabilized.ibuf = stableibuf;
-
        copy_v2_v2(cache->stabilized.loc, tloc);
 
        cache->stabilized.scale = tscale;
@@ -862,6 +857,11 @@ static ImBuf *put_stabilized_frame_to_cache(MovieClip *clip, MovieClipUser *user
 
        cache->stabilized.postprocess_flag = postprocess_flag;
 
+       if (cache->stabilized.ibuf)
+               IMB_freeImBuf(cache->stabilized.ibuf);
+
+       cache->stabilized.ibuf = stableibuf;
+
        IMB_refImBuf(stableibuf);
 
        return stableibuf;
@@ -881,7 +881,7 @@ ImBuf *BKE_movieclip_get_stable_ibuf(MovieClip *clip, MovieClipUser *user, float
        if (clip->tracking.stabilization.flag & TRACKING_2D_STABILIZATION) {
                MovieClipCache *cache = clip->cache;
 
-               stableibuf = get_stable_cached_frame(clip, user, framenr, postprocess_flag);
+               stableibuf = get_stable_cached_frame(clip, user, ibuf, framenr, postprocess_flag);
 
                if (!stableibuf)
                        stableibuf = put_stabilized_frame_to_cache(clip, user, ibuf, framenr, postprocess_flag);