[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