Merging r48740 through r48749 from trunk into soc-2011-tomato
[blender-staging.git] / source / blender / blenkernel / intern / movieclip.c
index 488b590107101cbc7fa6134c7392629f64e5b947..de367b6b4d0267efa3011ae6dbad9bd849649d28 100644 (file)
@@ -322,6 +322,8 @@ typedef struct MovieClipCache {
 
        /* cache for stable shot */
        struct {
+               ImBuf *reference_ibuf;
+
                ImBuf *ibuf;
                int framenr;
                int postprocess_flag;
@@ -695,9 +697,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;
 
@@ -735,13 +734,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;
 }
@@ -817,7 +813,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;
@@ -836,6 +833,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;
@@ -876,13 +876,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;
@@ -902,6 +897,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;
@@ -921,7 +921,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);