[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [51970] trunk/blender/source/blender: Fixed crashes when motion tracks are zero-sized

Sergey Sharybin sergey.vfx at gmail.com
Wed Nov 7 12:18:51 CET 2012


Revision: 51970
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=51970
Author:   nazgul
Date:     2012-11-07 11:18:42 +0000 (Wed, 07 Nov 2012)
Log Message:
-----------
Fixed crashes when motion tracks are zero-sized

This is probably versioning issue happened when both trunk and tomato
were mixed to work on the same file.

Anyway, there're few files here locally and it's probably other users
do have the same files, so lets keep things safe here :)

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/intern/movieclip.c
    trunk/blender/source/blender/blenkernel/intern/tracking.c
    trunk/blender/source/blender/compositor/operations/COM_KeyingScreenOperation.cpp
    trunk/blender/source/blender/editors/interface/interface_draw.c
    trunk/blender/source/blender/nodes/composite/nodes/node_composite_keyingscreen.c

Modified: trunk/blender/source/blender/blenkernel/intern/movieclip.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/movieclip.c	2012-11-07 10:52:07 UTC (rev 51969)
+++ trunk/blender/source/blender/blenkernel/intern/movieclip.c	2012-11-07 11:18:42 UTC (rev 51970)
@@ -1176,13 +1176,16 @@
 
 					search_ibuf = BKE_tracking_get_search_imbuf(ibuf, track, &undist_marker, TRUE, TRUE);
 
-					if (!search_ibuf->rect_float) {
-						/* sampling happens in float buffer */
-						IMB_float_from_rect(search_ibuf);
+					if (search_ibuf) {
+						if (!search_ibuf->rect_float) {
+							/* sampling happens in float buffer */
+							IMB_float_from_rect(search_ibuf);
+						}
+
+						scopes->track_search = search_ibuf;
 					}
 
 					scopes->undist_marker = undist_marker;
-					scopes->track_search = search_ibuf;
 
 					scopes->frame_width = ibuf->x;
 					scopes->frame_height = ibuf->y;

Modified: trunk/blender/source/blender/blenkernel/intern/tracking.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/tracking.c	2012-11-07 10:52:07 UTC (rev 51969)
+++ trunk/blender/source/blender/blenkernel/intern/tracking.c	2012-11-07 11:18:42 UTC (rev 51970)
@@ -1624,6 +1624,9 @@
 	double warped_position_x, warped_position_y;
 	float *mask = NULL;
 
+	if (num_samples_x <= 0 || num_samples_y <= 0)
+		return NULL;
+
 	pattern_ibuf = IMB_allocImBuf(num_samples_x, num_samples_y, 32, IB_rectfloat);
 
 	if (!search_ibuf->rect_float) {
@@ -1690,10 +1693,15 @@
 
 	search_ibuf = BKE_tracking_get_search_imbuf(ibuf, track, marker, anchored, disable_channels);
 
-	pattern_ibuf = BKE_tracking_sample_pattern(ibuf->x, ibuf->y, search_ibuf, track, marker,
-	                                           FALSE, num_samples_x, num_samples_y, NULL);
+	if (search_ibuf) {
+		pattern_ibuf = BKE_tracking_sample_pattern(ibuf->x, ibuf->y, search_ibuf, track, marker,
+		                                           FALSE, num_samples_x, num_samples_y, NULL);
 
-	IMB_freeImBuf(search_ibuf);
+		IMB_freeImBuf(search_ibuf);
+	}
+	else {
+		pattern_ibuf = NULL;
+	}
 
 	return pattern_ibuf;
 }
@@ -1718,6 +1726,9 @@
 	w = (marker->search_max[0] - marker->search_min[0]) * ibuf->x;
 	h = (marker->search_max[1] - marker->search_min[1]) * ibuf->y;
 
+	if (w <= 0 || h <= 0)
+		return NULL;
+
 	searchibuf = IMB_allocImBuf(w, h, 32, ibuf->rect_float ? IB_rectfloat : IB_rect);
 
 	IMB_rectcpy(searchibuf, ibuf, 0, 0, x, y, w, h);
@@ -2187,6 +2198,12 @@
 
 	searchibuf = BKE_tracking_get_search_imbuf(ibuf, track, marker, FALSE, TRUE);
 
+	if (!searchibuf) {
+		*width_r = 0;
+		*height_r = 0;
+		return NULL;
+	}
+
 	width = searchibuf->x;
 	height = searchibuf->y;
 
@@ -2506,6 +2523,9 @@
 				get_marker_coords_for_tracking(frame_width, frame_height, &track_context->marker, src_pixel_x, src_pixel_y);
 				get_marker_coords_for_tracking(frame_width, frame_height, marker, dst_pixel_x, dst_pixel_y);
 
+				if (!patch_new || !track_context->search_area)
+					continue;
+
 				/* run the tracker! */
 				tracked = libmv_trackRegion(&options,
 				                            track_context->search_area,

Modified: trunk/blender/source/blender/compositor/operations/COM_KeyingScreenOperation.cpp
===================================================================
--- trunk/blender/source/blender/compositor/operations/COM_KeyingScreenOperation.cpp	2012-11-07 10:52:07 UTC (rev 51969)
+++ trunk/blender/source/blender/compositor/operations/COM_KeyingScreenOperation.cpp	2012-11-07 11:18:42 UTC (rev 51970)
@@ -151,22 +151,25 @@
 		pattern_ibuf = BKE_tracking_get_pattern_imbuf(ibuf, track, marker, TRUE, FALSE);
 
 		zero_v3(site->color);
-		for (j = 0; j < pattern_ibuf->x * pattern_ibuf->y; j++) {
-			if (pattern_ibuf->rect_float) {
-				add_v3_v3(site->color, &pattern_ibuf->rect_float[4 * j]);
+
+		if (pattern_ibuf) {
+			for (j = 0; j < pattern_ibuf->x * pattern_ibuf->y; j++) {
+				if (pattern_ibuf->rect_float) {
+					add_v3_v3(site->color, &pattern_ibuf->rect_float[4 * j]);
+				}
+				else {
+					unsigned char *rrgb = (unsigned char *)pattern_ibuf->rect;
+
+					site->color[0] += srgb_to_linearrgb((float)rrgb[4 * j + 0] / 255.0f);
+					site->color[1] += srgb_to_linearrgb((float)rrgb[4 * j + 1] / 255.0f);
+					site->color[2] += srgb_to_linearrgb((float)rrgb[4 * j + 2] / 255.0f);
+				}
 			}
-			else {
-				unsigned char *rrgb = (unsigned char *)pattern_ibuf->rect;
 
-				site->color[0] += srgb_to_linearrgb((float)rrgb[4 * j + 0] / 255.0f);
-				site->color[1] += srgb_to_linearrgb((float)rrgb[4 * j + 1] / 255.0f);
-				site->color[2] += srgb_to_linearrgb((float)rrgb[4 * j + 2] / 255.0f);
-			}
+			mul_v3_fl(site->color, 1.0f / (pattern_ibuf->x * pattern_ibuf->y));
+			IMB_freeImBuf(pattern_ibuf);
 		}
 
-		mul_v3_fl(site->color, 1.0f / (pattern_ibuf->x * pattern_ibuf->y));
-		IMB_freeImBuf(pattern_ibuf);
-
 		site->co[0] = pos[0] * width;
 		site->co[1] = pos[1] * height;
 

Modified: trunk/blender/source/blender/editors/interface/interface_draw.c
===================================================================
--- trunk/blender/source/blender/editors/interface/interface_draw.c	2012-11-07 10:52:07 UTC (rev 51969)
+++ trunk/blender/source/blender/editors/interface/interface_draw.c	2012-11-07 11:18:42 UTC (rev 51970)
@@ -1597,17 +1597,15 @@
 		                                            &scopes->undist_marker, scopes->use_track_mask,
 		                                            width, height, scopes->track_pos);
 
-		if (tmpibuf->rect_float)
-			IMB_rect_from_float(tmpibuf);
+		if (tmpibuf) {
+			if (tmpibuf->rect_float)
+				IMB_rect_from_float(tmpibuf);
 
-		/* XXX: for debug only
-		 * tmpibuf->ftype = PNG;
-		 * IMB_saveiff(tmpibuf, "sample.png", IB_rect); */
-
-		if (tmpibuf->rect)
-			scopes->track_preview = tmpibuf;
-		else
-			IMB_freeImBuf(tmpibuf);
+			if (tmpibuf->rect)
+				scopes->track_preview = tmpibuf;
+			else
+				IMB_freeImBuf(tmpibuf);
+		}
 	}
 
 	if (!ok && scopes->track_preview) {

Modified: trunk/blender/source/blender/nodes/composite/nodes/node_composite_keyingscreen.c
===================================================================
--- trunk/blender/source/blender/nodes/composite/nodes/node_composite_keyingscreen.c	2012-11-07 10:52:07 UTC (rev 51969)
+++ trunk/blender/source/blender/nodes/composite/nodes/node_composite_keyingscreen.c	2012-11-07 11:18:42 UTC (rev 51970)
@@ -96,22 +96,25 @@
 		int j;
 
 		zero_v3(site->color);
-		for (j = 0; j < pattern_ibuf->x * pattern_ibuf->y; j++) {
-			if (pattern_ibuf->rect_float) {
-				add_v3_v3(site->color, &pattern_ibuf->rect_float[4 * j]);
+
+		if (pattern_ibuf) {
+			for (j = 0; j < pattern_ibuf->x * pattern_ibuf->y; j++) {
+				if (pattern_ibuf->rect_float) {
+					add_v3_v3(site->color, &pattern_ibuf->rect_float[4 * j]);
+				}
+				else {
+					unsigned char *rrgb = (unsigned char *)pattern_ibuf->rect;
+
+					site->color[0] += srgb_to_linearrgb((float)rrgb[4 * j + 0] / 255.0f);
+					site->color[1] += srgb_to_linearrgb((float)rrgb[4 * j + 1] / 255.0f);
+					site->color[2] += srgb_to_linearrgb((float)rrgb[4 * j + 2] / 255.0f);
+				}
 			}
-			else {
-				unsigned char *rrgb = (unsigned char *)pattern_ibuf->rect;
 
-				site->color[0] += srgb_to_linearrgb((float)rrgb[4 * j + 0] / 255.0f);
-				site->color[1] += srgb_to_linearrgb((float)rrgb[4 * j + 1] / 255.0f);
-				site->color[2] += srgb_to_linearrgb((float)rrgb[4 * j + 2] / 255.0f);
-			}
+			mul_v3_fl(site->color, 1.0f / (pattern_ibuf->x * pattern_ibuf->y));
+			IMB_freeImBuf(pattern_ibuf);
 		}
 
-		mul_v3_fl(site->color, 1.0f / (pattern_ibuf->x * pattern_ibuf->y));
-		IMB_freeImBuf(pattern_ibuf);
-
 		site->co[0] = marker->pos[0] * screenbuf->x;
 		site->co[1] = marker->pos[1] * screenbuf->y;
 




More information about the Bf-blender-cvs mailing list