Commit: 5589016e2446ee80028628cdde034eaeafcd7add
Author: Alex Babahin
Date:   Tue Feb 4 15:16:21 2014 +0600
https://developer.blender.org/rB5589016e2446ee80028628cdde034eaeafcd7add

Fix T38440: Segmentation fault in Movie Clip Editor

Issue was caused by NULL-pointer de-reference when post-processing
the frame without putting the frame to movie cache.

Differential Revision: https://developer.blender.org/D276

===================================================================

M       source/blender/blenkernel/intern/movieclip.c

===================================================================

diff --git a/source/blender/blenkernel/intern/movieclip.c 
b/source/blender/blenkernel/intern/movieclip.c
index 4ea9865..39c3b96 100644
--- a/source/blender/blenkernel/intern/movieclip.c
+++ b/source/blender/blenkernel/intern/movieclip.c
@@ -780,12 +780,35 @@ static ImBuf *get_postprocessed_cached_frame(MovieClip 
*clip, MovieClipUser *use
        return cache->postprocessed.ibuf;
 }
 
-static ImBuf *put_postprocessed_frame_to_cache(MovieClip *clip, MovieClipUser 
*user, ImBuf *ibuf,
+static ImBuf *postprocess_frame(MovieClip *clip, MovieClipUser *user, ImBuf 
*ibuf, int postprocess_flag)
+{
+       ImBuf *postproc_ibuf = NULL;
+
+       if (need_undistortion_postprocess(user)) {
+               postproc_ibuf = get_undistorted_ibuf(clip, NULL, ibuf);
+       }
+       else {
+               postproc_ibuf = IMB_dupImBuf(ibuf);
+       }
+
+       if (postprocess_flag) {
+               bool disable_red   = (postprocess_flag & MOVIECLIP_DISABLE_RED) 
!= 0,
+                        disable_green = (postprocess_flag & 
MOVIECLIP_DISABLE_GREEN) != 0,
+                        disable_blue  = (postprocess_flag & 
MOVIECLIP_DISABLE_BLUE) != 0,
+                        grayscale     = (postprocess_flag & 
MOVIECLIP_PREVIEW_GRAYSCALE) != 0;
+
+               if (disable_red || disable_green || disable_blue || grayscale)
+                       BKE_tracking_disable_channels(postproc_ibuf, 
disable_red, disable_green, disable_blue, 1);
+       }
+
+       return postproc_ibuf;
+}
+
+static void put_postprocessed_frame_to_cache(MovieClip *clip, MovieClipUser 
*user, ImBuf *ibuf,
                                                int flag, int postprocess_flag)
 {
        MovieClipCache *cache = clip->cache;
        MovieTrackingCamera *camera = &clip->tracking.camera;
-       ImBuf *postproc_ibuf = NULL;
 
        cache->postprocessed.framenr = user->framenr;
        cache->postprocessed.flag = postprocess_flag;
@@ -803,31 +826,17 @@ static ImBuf *put_postprocessed_frame_to_cache(MovieClip 
*clip, MovieClipUser *u
                copy_v2_v2(cache->postprocessed.principal, camera->principal);
                copy_v3_v3(&cache->postprocessed.k1, &camera->k1);
                cache->postprocessed.undistortion_used = TRUE;
-               postproc_ibuf = get_undistorted_ibuf(clip, NULL, ibuf);
        }
        else {
                cache->postprocessed.undistortion_used = FALSE;
-               postproc_ibuf = IMB_dupImBuf(ibuf);
        }
 
-       if (postprocess_flag) {
-               int disable_red   = postprocess_flag & MOVIECLIP_DISABLE_RED,
-                   disable_green = postprocess_flag & MOVIECLIP_DISABLE_GREEN,
-                   disable_blue  = postprocess_flag & MOVIECLIP_DISABLE_BLUE,
-                   grayscale     = postprocess_flag & 
MOVIECLIP_PREVIEW_GRAYSCALE;
-
-               if (disable_red || disable_green || disable_blue || grayscale)
-                       BKE_tracking_disable_channels(postproc_ibuf, 
disable_red, disable_green, disable_blue, 1);
-       }
-
-       IMB_refImBuf(postproc_ibuf);
+       IMB_refImBuf(ibuf);
 
        if (cache->postprocessed.ibuf)
                IMB_freeImBuf(cache->postprocessed.ibuf);
 
-       cache->postprocessed.ibuf = postproc_ibuf;
-
-       return postproc_ibuf;
+       cache->postprocessed.ibuf = ibuf;
 }
 
 static ImBuf *movieclip_get_postprocessed_ibuf(MovieClip *clip, MovieClipUser 
*user, int flag,
@@ -873,11 +882,14 @@ static ImBuf *movieclip_get_postprocessed_ibuf(MovieClip 
*clip, MovieClipUser *u
                clip->lastframe = framenr;
                real_ibuf_size(clip, user, ibuf, &clip->lastsize[0], 
&clip->lastsize[1]);
 
-               /* postprocess frame and put to cache */
+               /* postprocess frame and put to cache if needed*/
                if (need_postprocess) {
                        ImBuf *tmpibuf = ibuf;
-                       ibuf = put_postprocessed_frame_to_cache(clip, user, 
tmpibuf, flag, postprocess_flag);
+                       ibuf = postprocess_frame(clip, user, tmpibuf, 
postprocess_flag);
                        IMB_freeImBuf(tmpibuf);
+                       if (ibuf && (cache_flag & MOVIECLIP_CACHE_SKIP) == 0) {
+                               put_postprocessed_frame_to_cache(clip, user, 
ibuf, flag, postprocess_flag);
+                       }
                }
        }

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

Reply via email to