[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [55302] trunk/blender: Multi-threaded frame calculation for movie clip proxies

Sergey Sharybin sergey.vfx at gmail.com
Fri Mar 15 12:59:47 CET 2013


Revision: 55302
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=55302
Author:   nazgul
Date:     2013-03-15 11:59:46 +0000 (Fri, 15 Mar 2013)
Log Message:
-----------
Multi-threaded frame calculation for movie clip proxies

This commit implements multi-threaded calculation of frames
when building proxies. Both scaling and undistortion steps
are now threaded.

Frames and proxy resolution are still handled one-by-one,
saving files after every single step. So if HDD is not so
fast, this commit could have not so much benefit.

Internal changes:

- Added IMB_scaleImBuf_threaded which scales given image
  buffer in multiple threads and uses bilinear filtering.

- libmv's camera intrinsics now have SetThreads() method
  which is used to specify how many OpenMP threads to use
  for buffer distortion/undistortion.

  And yeah, this code is using OpenMP for threading.

- Reshuffled a bit libmv-capi calls and added function
  BKE_tracking_distortion_set_threads to specify number
  of threads used by intrinscis.

Modified Paths:
--------------
    trunk/blender/extern/libmv/libmv/simple_pipeline/camera_intrinsics.cc
    trunk/blender/extern/libmv/libmv/simple_pipeline/camera_intrinsics.h
    trunk/blender/extern/libmv/libmv-capi.cpp
    trunk/blender/extern/libmv/libmv-capi.h
    trunk/blender/source/blender/blenkernel/BKE_tracking.h
    trunk/blender/source/blender/blenkernel/intern/movieclip.c
    trunk/blender/source/blender/blenkernel/intern/tracking.c
    trunk/blender/source/blender/editors/space_clip/clip_ops.c
    trunk/blender/source/blender/imbuf/IMB_imbuf.h
    trunk/blender/source/blender/imbuf/intern/scaling.c

Modified: trunk/blender/extern/libmv/libmv/simple_pipeline/camera_intrinsics.cc
===================================================================
--- trunk/blender/extern/libmv/libmv/simple_pipeline/camera_intrinsics.cc	2013-03-15 11:07:36 UTC (rev 55301)
+++ trunk/blender/extern/libmv/libmv/simple_pipeline/camera_intrinsics.cc	2013-03-15 11:59:46 UTC (rev 55302)
@@ -62,7 +62,8 @@
       p1_(0),
       p2_(0),
       distort_(0),
-      undistort_(0) {}
+      undistort_(0),
+      threads_(1) {}
 
 CameraIntrinsics::CameraIntrinsics(const CameraIntrinsics &from)
     : K_(from.K_),
@@ -72,7 +73,8 @@
       k2_(from.k2_),
       k3_(from.k3_),
       p1_(from.p1_),
-      p2_(from.p2_)
+      p2_(from.p2_),
+      threads_(from.threads_)
 {
   distort_ = copyGrid(from.distort_);
   undistort_ = copyGrid(from.undistort_);
@@ -120,6 +122,11 @@
   FreeLookupGrid();
 }
 
+void CameraIntrinsics::SetThreads(int threads)
+{
+	threads_ = threads;
+}
+
 void CameraIntrinsics::ApplyIntrinsics(double normalized_x,
                                        double normalized_y,
                                        double *image_x,
@@ -188,6 +195,7 @@
   double aspx = (double)w / image_width_;
   double aspy = (double)h / image_height_;
 
+  #pragma omp parallel for schedule(dynamic) num_threads(threads_) if (threads_ > 1 && height > 100)
   for (int y = 0; y < height; y++) {
     for (int x = 0; x < width; x++) {
       double src_x = (x - 0.5 * overscan * w) / aspx, src_y = (y - 0.5 * overscan * h) / aspy;
@@ -214,7 +222,8 @@
 // TODO(MatthiasF): cubic B-Spline image sampling, bilinear lookup
 template<typename T,int N>
 static void Warp(const Grid* grid, const T* src, T* dst,
-                 int width, int height) {
+                 int width, int height, int threads) {
+  #pragma omp parallel for schedule(dynamic) num_threads(threads) if (threads > 1 && height > 100)
   for (int y = 0; y < height; y++) {
     for (int x = 0; x < width; x++) {
       Offset offset = grid->offset[y*width+x];
@@ -306,37 +315,37 @@
 
 void CameraIntrinsics::Distort(const float* src, float* dst, int width, int height, double overscan, int channels) {
   CheckDistortLookupGrid(width, height, overscan);
-       if(channels==1) Warp<float,1>(distort_,src,dst,width,height);
-  else if(channels==2) Warp<float,2>(distort_,src,dst,width,height);
-  else if(channels==3) Warp<float,3>(distort_,src,dst,width,height);
-  else if(channels==4) Warp<float,4>(distort_,src,dst,width,height);
+       if(channels==1) Warp<float,1>(distort_,src,dst,width,height,threads_);
+  else if(channels==2) Warp<float,2>(distort_,src,dst,width,height,threads_);
+  else if(channels==3) Warp<float,3>(distort_,src,dst,width,height,threads_);
+  else if(channels==4) Warp<float,4>(distort_,src,dst,width,height,threads_);
   //else assert("channels must be between 1 and 4");
 }
 
 void CameraIntrinsics::Distort(const unsigned char* src, unsigned char* dst, int width, int height, double overscan, int channels) {
   CheckDistortLookupGrid(width, height, overscan);
-       if(channels==1) Warp<unsigned char,1>(distort_,src,dst,width,height);
-  else if(channels==2) Warp<unsigned char,2>(distort_,src,dst,width,height);
-  else if(channels==3) Warp<unsigned char,3>(distort_,src,dst,width,height);
-  else if(channels==4) Warp<unsigned char,4>(distort_,src,dst,width,height);
+       if(channels==1) Warp<unsigned char,1>(distort_,src,dst,width,height,threads_);
+  else if(channels==2) Warp<unsigned char,2>(distort_,src,dst,width,height,threads_);
+  else if(channels==3) Warp<unsigned char,3>(distort_,src,dst,width,height,threads_);
+  else if(channels==4) Warp<unsigned char,4>(distort_,src,dst,width,height,threads_);
   //else assert("channels must be between 1 and 4");
 }
 
 void CameraIntrinsics::Undistort(const float* src, float* dst, int width, int height, double overscan, int channels) {
   CheckUndistortLookupGrid(width, height, overscan);
-       if(channels==1) Warp<float,1>(undistort_,src,dst,width,height);
-  else if(channels==2) Warp<float,2>(undistort_,src,dst,width,height);
-  else if(channels==3) Warp<float,3>(undistort_,src,dst,width,height);
-  else if(channels==4) Warp<float,4>(undistort_,src,dst,width,height);
+       if(channels==1) Warp<float,1>(undistort_,src,dst,width,height,threads_);
+  else if(channels==2) Warp<float,2>(undistort_,src,dst,width,height,threads_);
+  else if(channels==3) Warp<float,3>(undistort_,src,dst,width,height,threads_);
+  else if(channels==4) Warp<float,4>(undistort_,src,dst,width,height,threads_);
   //else assert("channels must be between 1 and 4");
 }
 
 void CameraIntrinsics::Undistort(const unsigned char* src, unsigned char* dst, int width, int height, double overscan, int channels) {
   CheckUndistortLookupGrid(width, height, overscan);
-       if(channels==1) Warp<unsigned char,1>(undistort_,src,dst,width,height);
-  else if(channels==2) Warp<unsigned char,2>(undistort_,src,dst,width,height);
-  else if(channels==3) Warp<unsigned char,3>(undistort_,src,dst,width,height);
-  else if(channels==4) Warp<unsigned char,4>(undistort_,src,dst,width,height);
+       if(channels==1) Warp<unsigned char,1>(undistort_,src,dst,width,height,threads_);
+  else if(channels==2) Warp<unsigned char,2>(undistort_,src,dst,width,height,threads_);
+  else if(channels==3) Warp<unsigned char,3>(undistort_,src,dst,width,height,threads_);
+  else if(channels==4) Warp<unsigned char,4>(undistort_,src,dst,width,height,threads_);
   //else assert("channels must be between 1 and 4");
 }
 

Modified: trunk/blender/extern/libmv/libmv/simple_pipeline/camera_intrinsics.h
===================================================================
--- trunk/blender/extern/libmv/libmv/simple_pipeline/camera_intrinsics.h	2013-03-15 11:07:36 UTC (rev 55301)
+++ trunk/blender/extern/libmv/libmv/simple_pipeline/camera_intrinsics.h	2013-03-15 11:59:46 UTC (rev 55302)
@@ -68,6 +68,9 @@
 
   void SetTangentialDistortion(double p1, double p2);
 
+  /// Set number of threads using for buffer distortion/undistortion
+  void SetThreads(int threads);
+
   /*!
       Apply camera intrinsics to the normalized point to get image coordinates.
 
@@ -153,6 +156,8 @@
 
   struct Grid *distort_;
   struct Grid *undistort_;
+
+  int threads_;
 };
 
 /// A human-readable representation of the camera intrinsic parameters.

Modified: trunk/blender/extern/libmv/libmv-capi.cpp
===================================================================
--- trunk/blender/extern/libmv/libmv-capi.cpp	2013-03-15 11:07:36 UTC (rev 55301)
+++ trunk/blender/extern/libmv/libmv-capi.cpp	2013-03-15 11:59:46 UTC (rev 55302)
@@ -821,6 +821,13 @@
 	return (struct libmv_CameraIntrinsics *)&libmv_Reconstruction->intrinsics;
 }
 
+struct libmv_CameraIntrinsics *libmv_CameraIntrinsicsNewEmpty(void)
+{
+	libmv::CameraIntrinsics *camera_intrinsics = new libmv::CameraIntrinsics();
+
+	return (struct libmv_CameraIntrinsics *) camera_intrinsics;
+}
+
 struct libmv_CameraIntrinsics *libmv_CameraIntrinsicsNew(libmv_cameraIntrinsicsOptions *libmv_camera_intrinsics_options)
 {
 	libmv::CameraIntrinsics *camera_intrinsics = new libmv::CameraIntrinsics();
@@ -884,6 +891,13 @@
 	}
 }
 
+void libmv_CameraIntrinsicsSetThreads(struct libmv_CameraIntrinsics *libmv_intrinsics, int threads)
+{
+	libmv::CameraIntrinsics *camera_intrinsics = (libmv::CameraIntrinsics *) libmv_intrinsics;
+
+	camera_intrinsics->SetThreads(threads);
+}
+
 void libmv_CameraIntrinsicsExtract(struct libmv_CameraIntrinsics *libmv_intrinsics, double *focal_length,
 			double *principal_x, double *principal_y, double *k1, double *k2, double *k3, int *width, int *height)
 {

Modified: trunk/blender/extern/libmv/libmv-capi.h
===================================================================
--- trunk/blender/extern/libmv/libmv-capi.h	2013-03-15 11:07:36 UTC (rev 55301)
+++ trunk/blender/extern/libmv/libmv-capi.h	2013-03-15 11:59:46 UTC (rev 55302)
@@ -132,6 +132,8 @@
 /* camera intrinsics */
 struct libmv_CameraIntrinsics *libmv_ReconstructionExtractIntrinsics(struct libmv_Reconstruction *libmv_Reconstruction);
 
+struct libmv_CameraIntrinsics *libmv_CameraIntrinsicsNewEmpty(void);
+
 struct libmv_CameraIntrinsics *libmv_CameraIntrinsicsNew(libmv_cameraIntrinsicsOptions *libmv_camera_intrinsics_options);
 
 struct libmv_CameraIntrinsics *libmv_CameraIntrinsicsCopy(struct libmv_CameraIntrinsics *libmv_intrinsics);
@@ -141,6 +143,8 @@
 void libmv_CameraIntrinsicsUpdate(struct libmv_CameraIntrinsics *libmv_intrinsics,
                                   libmv_cameraIntrinsicsOptions *libmv_camera_intrinsics_options);
 
+void libmv_CameraIntrinsicsSetThreads(struct libmv_CameraIntrinsics *libmv_intrinsics, int threads);
+
 void libmv_CameraIntrinsicsExtract(struct libmv_CameraIntrinsics *libmv_intrinsics, double *focal_length,
 			double *principal_x, double *principal_y, double *k1, double *k2, double *k3, int *width, int *height);
 

Modified: trunk/blender/source/blender/blenkernel/BKE_tracking.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_tracking.h	2013-03-15 11:07:36 UTC (rev 55301)
+++ trunk/blender/source/blender/blenkernel/BKE_tracking.h	2013-03-15 11:59:46 UTC (rev 55302)
@@ -144,6 +144,7 @@
 struct MovieDistortion *BKE_tracking_distortion_new(void);
 void BKE_tracking_distortion_update(struct MovieDistortion *distortion, struct MovieTracking *tracking,
                                     int calibration_width, int calibration_height);
+void BKE_tracking_distortion_set_threads(struct MovieDistortion *distortion, int threads);
 struct MovieDistortion *BKE_tracking_distortion_copy(struct MovieDistortion *distortion);
 struct ImBuf *BKE_tracking_distortion_exec(struct MovieDistortion *distortion, struct MovieTracking *tracking,
                                            struct ImBuf *ibuf, int width, int height, float overscan, int undistort);

Modified: trunk/blender/source/blender/blenkernel/intern/movieclip.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/movieclip.c	2013-03-15 11:07:36 UTC (rev 55301)
+++ trunk/blender/source/blender/blenkernel/intern/movieclip.c	2013-03-15 11:59:46 UTC (rev 55302)
@@ -1244,7 +1244,7 @@
 
 	scaleibuf = IMB_dupImBuf(ibuf);
 
-	IMB_scaleImBuf(scaleibuf, (short)rectx, (short)recty);

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list