[Bf-blender-cvs] [df63e8f] master: Speedup track preview widget for byte images

Sergey Sharybin noreply at git.blender.org
Thu Apr 10 17:18:03 CEST 2014


Commit: df63e8fd9331594eaef0a7897b9322533188da79
Author: Sergey Sharybin
Date:   Thu Apr 10 21:14:36 2014 +0600
https://developer.blender.org/rBdf63e8fd9331594eaef0a7897b9322533188da79

Speedup track preview widget for byte images

This gives a huge speedup gain for cases when you've got
rather huge markers on a byte images.

Done by skipping IMB_float_from_rect()/IMB_rect_from_float()
for such cases. We can sample the buffers without color space
conversion.

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

M	extern/libmv/libmv-capi.cc
M	extern/libmv/libmv-capi.h
M	extern/libmv/libmv-capi_stub.cc
M	source/blender/blenkernel/intern/movieclip.c
M	source/blender/blenkernel/intern/tracking.c
M	source/blender/editors/interface/interface_draw.c

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

diff --git a/extern/libmv/libmv-capi.cc b/extern/libmv/libmv-capi.cc
index 74e9e52..2d3afcd 100644
--- a/extern/libmv/libmv-capi.cc
+++ b/extern/libmv/libmv-capi.cc
@@ -158,6 +158,19 @@ static void imageToFloatBuf(const libmv::FloatImage *image, int channels, float
 	}
 }
 
+static void imageToByteBuf(const libmv::FloatImage *image, int channels, unsigned char *buf)
+{
+	int x, y, k, a = 0;
+
+	for (y = 0; y < image->Height(); y++) {
+		for (x = 0; x < image->Width(); x++) {
+			for (k = 0; k < channels; k++) {
+				buf[a++] = (*image)(y, x, k) * 255.0f;
+			}
+		}
+	}
+}
+
 #if defined(DUMP_FAILURE) || defined (DUMP_ALWAYS)
 static void savePNGImage(png_bytep *row_pointers, int width, int height, int depth, int color_type,
                          const char *file_name)
@@ -385,10 +398,12 @@ int libmv_trackRegion(const libmv_TrackRegionOptions *options,
 	return tracking_result;
 }
 
-void libmv_samplePlanarPatch(const float *image, int width, int height,
-                             int channels, const double *xs, const double *ys,
+void libmv_samplePlanarPatch(const float *image,
+                             int width, int height, int channels,
+                             const double *xs, const double *ys,
                              int num_samples_x, int num_samples_y,
-                             const float *mask, float *patch,
+                             const float *mask,
+                             float *patch,
                              double *warped_position_x, double *warped_position_y)
 {
 	libmv::FloatImage libmv_image, libmv_patch, libmv_mask;
@@ -402,13 +417,45 @@ void libmv_samplePlanarPatch(const float *image, int width, int height,
 		libmv_mask_for_sample = &libmv_mask;
 	}
 
-	libmv::SamplePlanarPatch(libmv_image, xs, ys, num_samples_x, num_samples_y,
-	                         libmv_mask_for_sample, &libmv_patch,
-	                         warped_position_x, warped_position_y);
+	libmv::SamplePlanarPatch(libmv_image, xs, ys,
+	                         num_samples_x, num_samples_y,
+	                         libmv_mask_for_sample,
+	                         &libmv_patch,
+	                         warped_position_x,
+	                         warped_position_y);
 
 	imageToFloatBuf(&libmv_patch, channels, patch);
 }
 
+ void libmv_samplePlanarPatchByte(const unsigned char *image,
+                                  int width, int height, int channels,
+                                  const double *xs, const double *ys,
+                                  int num_samples_x, int num_samples_y,
+                                  const float *mask,
+                                  unsigned char *patch,
+                                  double *warped_position_x, double *warped_position_y)
+{
+	libmv::FloatImage libmv_image, libmv_patch, libmv_mask;
+	libmv::FloatImage *libmv_mask_for_sample = NULL;
+
+	byteBufToImage(image, width, height, channels, &libmv_image);
+
+	if (mask) {
+		floatBufToImage(mask, width, height, 1, &libmv_mask);
+
+		libmv_mask_for_sample = &libmv_mask;
+	}
+
+	libmv::SamplePlanarPatch(libmv_image, xs, ys,
+	                         num_samples_x, num_samples_y,
+	                         libmv_mask_for_sample,
+	                         &libmv_patch,
+	                         warped_position_x,
+	                         warped_position_y);
+
+	imageToByteBuf(&libmv_patch, channels, patch);
+}
+
 /* ************ Tracks ************ */
 
 struct libmv_Tracks *libmv_tracksNew(void)
diff --git a/extern/libmv/libmv-capi.h b/extern/libmv/libmv-capi.h
index d183bc4..53bf400 100644
--- a/extern/libmv/libmv-capi.h
+++ b/extern/libmv/libmv-capi.h
@@ -64,11 +64,22 @@ int libmv_trackRegion(const libmv_TrackRegionOptions *options,
                       const double *x1, const double *y1,
                       libmv_TrackRegionResult *result,
                       double *x2, double *y2);
-void libmv_samplePlanarPatch(const float *image, int width, int height,
-                             int channels, const double *xs, const double *ys,
+void libmv_samplePlanarPatch(const float *image,
+                             int width, int height,
+                             int channels,
+                             const double *xs, const double *ys,
                              int num_samples_x, int num_samples_y,
-                             const float *mask, float *patch,
+                             const float *mask,
+                             float *patch,
                              double *warped_position_x, double *warped_position_y);
+void libmv_samplePlanarPatchByte(const unsigned char *image,
+                                 int width, int height,
+                                 int channels,
+                                 const double *xs, const double *ys,
+                                 int num_samples_x, int num_samples_y,
+                                 const float *mask,
+                                 unsigned char *patch,
+                                 double *warped_position_x, double *warped_position_y);
 
 /* Tracks */
 struct libmv_Tracks *libmv_tracksNew(void);
diff --git a/extern/libmv/libmv-capi_stub.cc b/extern/libmv/libmv-capi_stub.cc
index bd5d16c..6db0797 100644
--- a/extern/libmv/libmv-capi_stub.cc
+++ b/extern/libmv/libmv-capi_stub.cc
@@ -68,11 +68,24 @@ int libmv_trackRegion(const libmv_TrackRegionOptions * /*options*/,
 	return false;
 }
 
-void libmv_samplePlanarPatch(const float *image, int width, int height,
-                             int channels, const double *xs, const double *ys,
-                             int num_samples_x, int num_samples_y,
-                             const float *mask, float *patch,
-                             double *warped_position_x, double *warped_position_y)
+void libmv_samplePlanarPatch(const float * /*image*/,
+                             int /*width*/, int /*height*/, int /*channels*/,
+                             const double * /*xs*/, const double * /*ys*/,
+                             int /*num_samples_x*/, int /*num_samples_y*/,
+                             const float * /*mask*/,
+                             float * /*patch*/,
+                             double * /*warped_position_x*/, double * /*warped_position_y*/
+{
+	/* TODO(sergey): implement */
+}
+
+void libmv_samplePlanarPatch(const unsigned char * /*image*/,
+                             int /*width*/, int /*height*/, int /*channels*/,
+                             const double * /*xs*/, const double * /*ys*/,
+                             int /*num_samples_x*/, int /*num_samples_y*/,
+                             const float * /*mask*/,
+                             unsigned char * /*patch*/,
+                             double * /*warped_position_x*/, double * /*warped_position_y*/
 {
 	/* TODO(sergey): implement */
 }
diff --git a/source/blender/blenkernel/intern/movieclip.c b/source/blender/blenkernel/intern/movieclip.c
index f9cd1b2..de4846e 100644
--- a/source/blender/blenkernel/intern/movieclip.c
+++ b/source/blender/blenkernel/intern/movieclip.c
@@ -1243,7 +1243,6 @@ void BKE_movieclip_update_scopes(MovieClip *clip, MovieClipUser *user, MovieClip
 				scopes->track_disabled = false;
 
 				if (ibuf && (ibuf->rect || ibuf->rect_float)) {
-					ImBuf *search_ibuf;
 					MovieTrackingMarker undist_marker = *marker;
 
 					if (user->render_flag & MCLIP_PROXY_RENDER_UNDISTORT) {
@@ -1261,16 +1260,7 @@ void BKE_movieclip_update_scopes(MovieClip *clip, MovieClipUser *user, MovieClip
 						undist_marker.pos[1] /= height * aspy;
 					}
 
-					search_ibuf = BKE_tracking_get_search_imbuf(ibuf, track, &undist_marker, true, true);
-
-					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->track_search = BKE_tracking_get_search_imbuf(ibuf, track, &undist_marker, true, true);
 
 					scopes->undist_marker = undist_marker;
 
diff --git a/source/blender/blenkernel/intern/tracking.c b/source/blender/blenkernel/intern/tracking.c
index a96960c..8434fde 100644
--- a/source/blender/blenkernel/intern/tracking.c
+++ b/source/blender/blenkernel/intern/tracking.c
@@ -1981,11 +1981,9 @@ ImBuf *BKE_tracking_sample_pattern(int frame_width, int frame_height, ImBuf *sea
 	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) {
-		IMB_float_from_rect(search_ibuf);
-	}
+	pattern_ibuf = IMB_allocImBuf(num_samples_x, num_samples_y,
+	                              32,
+	                              search_ibuf->rect_float ? IB_rectfloat : IB_rect);
 
 	tracking_get_marker_coords_for_tracking(frame_width, frame_height, marker, src_pixel_x, src_pixel_y);
 
@@ -2015,10 +2013,26 @@ ImBuf *BKE_tracking_sample_pattern(int frame_width, int frame_height, ImBuf *sea
 		mask = BKE_tracking_track_get_mask(frame_width, frame_height, track, marker);
 	}
 
-	libmv_samplePlanarPatch(search_ibuf->rect_float, search_ibuf->x, search_ibuf->y, 4,
-	                        src_pixel_x, src_pixel_y, num_samples_x,
-	                        num_samples_y, mask, pattern_ibuf->rect_float,
-	                        &warped_position_x, &warped_position_y);
+	if (search_ibuf->rect_float) {
+		libmv_samplePlanarPatch(search_ibuf->rect_float,
+		                        search_ibuf->x, search_ibuf->y, 4,
+		                        src_pixel_x, src_pixel_y,
+		                        num_samples_x, num_samples_y,
+		                        mask,
+		                        pattern_ibuf->rect_float,
+		                        &warped_position_x,
+		                        &warped_position_y);
+	}
+	else {
+		libmv_samplePlanarPatchByte((unsigned char *) search_ibuf->rect,
+		                            search_ibuf->x, search_ibuf->y, 4,
+		                            src_pixel_x, src_pixel_y,
+		                            num_samples_x, num_samples_y,
+		                            mask,
+		                            (unsigned char *) pattern_ibuf->rect,
+		                        

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list