Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'source/blender/blenkernel/intern/movieclip.c')
-rw-r--r--source/blender/blenkernel/intern/movieclip.c32
1 files changed, 16 insertions, 16 deletions
diff --git a/source/blender/blenkernel/intern/movieclip.c b/source/blender/blenkernel/intern/movieclip.c
index 54e93f58307..2d83a748767 100644
--- a/source/blender/blenkernel/intern/movieclip.c
+++ b/source/blender/blenkernel/intern/movieclip.c
@@ -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);