From d53e44d45bd72d2a2492816532e1410385188d9d Mon Sep 17 00:00:00 2001 From: heckflosse Date: Fri, 26 Oct 2018 16:51:05 +0200 Subject: [PATCH 1/5] vng4 demosaic: precalculate weight --- rtengine/vng4_demosaic_RT.cc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/rtengine/vng4_demosaic_RT.cc b/rtengine/vng4_demosaic_RT.cc index 8ed05dd09..241c05507 100644 --- a/rtengine/vng4_demosaic_RT.cc +++ b/rtengine/vng4_demosaic_RT.cc @@ -24,7 +24,7 @@ #include "rawimagesource.h" #include "rawimagesource_i.h" #include "../rtgui/multilangmgr.h" -//#define BENCHMARK +#define BENCHMARK #include "StopWatch.h" namespace rtengine @@ -176,7 +176,7 @@ void RawImageSource::vng4_demosaic (const array2D &rawData, array2D &rawData, array2D Date: Fri, 26 Oct 2018 17:09:28 +0200 Subject: [PATCH 2/5] vng4 demosaic: move red/blue interpolation inside main loop for better cache usage, #4633 --- rtengine/vng4_demosaic_RT.cc | 47 ++++++++++++++++++++++-------------- 1 file changed, 29 insertions(+), 18 deletions(-) diff --git a/rtengine/vng4_demosaic_RT.cc b/rtengine/vng4_demosaic_RT.cc index 241c05507..62f5018c5 100644 --- a/rtengine/vng4_demosaic_RT.cc +++ b/rtengine/vng4_demosaic_RT.cc @@ -215,11 +215,18 @@ void RawImageSource::vng4_demosaic (const array2D &rawData, array2D &rawData, array2D firstRow) { + interpolate_row_rb_mul_pp (rawData, red[row - 1], blue[row - 1], green[row - 2], green[row - 1], green[row], row - 1, 1.0, 1.0, 1.0, 0, W, 1); + } if(plistenerActive) { if((row % progressStep) == 0) @@ -311,6 +321,24 @@ void RawImageSource::vng4_demosaic (const array2D &rawData, array2D &rawData, array2DsetProgress (0.98); } - // Interpolate R and B -#ifdef _OPENMP - #pragma omp parallel for -#endif - - for (int i = 0; i < H; i++) { - if (i == 0) - // rm, gm, bm must be recovered - //interpolate_row_rb_mul_pp (red, blue, NULL, green[i], green[i+1], i, rm, gm, bm, 0, W, 1); - { - interpolate_row_rb_mul_pp (rawData, red[i], blue[i], nullptr, green[i], green[i + 1], i, 1.0, 1.0, 1.0, 0, W, 1); - } else if (i == H - 1) { - interpolate_row_rb_mul_pp (rawData, red[i], blue[i], green[i - 1], green[i], nullptr, i, 1.0, 1.0, 1.0, 0, W, 1); - } else { - interpolate_row_rb_mul_pp (rawData, red[i], blue[i], green[i - 1], green[i], green[i + 1], i, 1.0, 1.0, 1.0, 0, W, 1); - } - } border_interpolate2(W, H, 3, rawData, red, green, blue); if(plistenerActive) { From 3d61eca91f648c8c09f2ad7b62bcdfa69ae39831 Mon Sep 17 00:00:00 2001 From: heckflosse Date: Fri, 26 Oct 2018 20:23:27 +0200 Subject: [PATCH 3/5] vng4 demosaic: remove unreachable code, #4633 --- rtengine/vng4_demosaic_RT.cc | 55 ++++++++++++------------------------ 1 file changed, 18 insertions(+), 37 deletions(-) diff --git a/rtengine/vng4_demosaic_RT.cc b/rtengine/vng4_demosaic_RT.cc index 62f5018c5..0e7d8e0f9 100644 --- a/rtengine/vng4_demosaic_RT.cc +++ b/rtengine/vng4_demosaic_RT.cc @@ -71,9 +71,8 @@ void RawImageSource::vng4_demosaic (const array2D &rawData, array2Dprefilters; const int width = W, height = H; constexpr unsigned int colors = 4; - float (*image)[4]; - image = (float (*)[4]) calloc (height * width, sizeof * image); + float (*image)[4] = (float (*)[4]) calloc (height * width, sizeof * image); #ifdef _OPENMP #pragma omp parallel for @@ -87,7 +86,7 @@ void RawImageSource::vng4_demosaic (const array2D &rawData, array2D &rawData, array2D &rawData, array2D &rawData, array2D &rawData, array2D gval[g]) { - gmin = gval[g]; - } - - if (gmax < gval[g]) { - gmax = gval[g]; - } + gmin = std::min(gmin, gval[g]); + gmax = std::max(gmax, gval[g]); } thold = gmin + (gmax / 2); } memset (sum, 0, sizeof sum); - float t1, t2; - t1 = t2 = pix[color]; + float t1p2 = pix[color]; if(color & 1) { int num = 0; @@ -273,7 +266,7 @@ void RawImageSource::vng4_demosaic (const array2D &rawData, array2D &rawData, array2D &rawData, array2D firstRow) { @@ -321,23 +313,12 @@ void RawImageSource::vng4_demosaic (const array2D &rawData, array2D 2 && firstRow < H - 3) { + interpolate_row_rb_mul_pp (rawData, red[firstRow], blue[firstRow], green[firstRow - 1], green[firstRow], green[firstRow + 1], firstRow, 1.0, 1.0, 1.0, 0, W, 1); } - if (lastRow != -1) { - if (lastRow == 0) { - interpolate_row_rb_mul_pp (rawData, red[0], blue[0], nullptr, green[0], green[1], 0, 1.0, 1.0, 1.0, 0, W, 1); - } else if (lastRow == H - 1) { - interpolate_row_rb_mul_pp (rawData, red[lastRow], blue[lastRow], green[lastRow - 1], green[lastRow], nullptr, lastRow, 1.0, 1.0, 1.0, 0, W, 1); - } else { - interpolate_row_rb_mul_pp (rawData, red[lastRow], blue[lastRow], green[lastRow - 1], green[lastRow], green[lastRow + 1], lastRow, 1.0, 1.0, 1.0, 0, W, 1); - } + + if (lastRow > 2 && lastRow < H - 3) { + interpolate_row_rb_mul_pp (rawData, red[lastRow], blue[lastRow], green[lastRow - 1], green[lastRow], green[lastRow + 1], lastRow, 1.0, 1.0, 1.0, 0, W, 1); } } free (code[0][0]); From 1b291aee9bdbed9520f394747a6cffa42932a218 Mon Sep 17 00:00:00 2001 From: heckflosse Date: Fri, 26 Oct 2018 22:20:20 +0200 Subject: [PATCH 4/5] vng4 demosaic: minor speedup, #4633 --- rtengine/vng4_demosaic_RT.cc | 46 ++++++++++++++++-------------------- 1 file changed, 20 insertions(+), 26 deletions(-) diff --git a/rtengine/vng4_demosaic_RT.cc b/rtengine/vng4_demosaic_RT.cc index 0e7d8e0f9..500590b04 100644 --- a/rtengine/vng4_demosaic_RT.cc +++ b/rtengine/vng4_demosaic_RT.cc @@ -210,9 +210,7 @@ void RawImageSource::vng4_demosaic (const array2D &rawData, array2D &rawData, array2D &rawData, array2D &rawData, array2D &rawData, array2D firstRow) { - interpolate_row_rb_mul_pp (rawData, red[row - 1], blue[row - 1], green[row - 2], green[row - 1], green[row], row - 1, 1.0, 1.0, 1.0, 0, W, 1); + interpolate_row_rb_mul_pp(rawData, red[row - 1], blue[row - 1], green[row - 2], green[row - 1], green[row], row - 1, 1.0, 1.0, 1.0, 0, W, 1); } if(plistenerActive) { @@ -314,22 +306,24 @@ void RawImageSource::vng4_demosaic (const array2D &rawData, array2D 2 && firstRow < H - 3) { - interpolate_row_rb_mul_pp (rawData, red[firstRow], blue[firstRow], green[firstRow - 1], green[firstRow], green[firstRow + 1], firstRow, 1.0, 1.0, 1.0, 0, W, 1); + interpolate_row_rb_mul_pp(rawData, red[firstRow], blue[firstRow], green[firstRow - 1], green[firstRow], green[firstRow + 1], firstRow, 1.0, 1.0, 1.0, 0, W, 1); } if (lastRow > 2 && lastRow < H - 3) { - interpolate_row_rb_mul_pp (rawData, red[lastRow], blue[lastRow], green[lastRow - 1], green[lastRow], green[lastRow + 1], lastRow, 1.0, 1.0, 1.0, 0, W, 1); + interpolate_row_rb_mul_pp(rawData, red[lastRow], blue[lastRow], green[lastRow - 1], green[lastRow], green[lastRow + 1], lastRow, 1.0, 1.0, 1.0, 0, W, 1); + } +#ifdef _OPENMP + #pragma omp single +#endif + { + // let the first thread, which is out of work, do the border interpolation + border_interpolate2(W, H, 3, rawData, red, green, blue); } } + free (code[0][0]); free (image); - if(plistenerActive) { - plistener->setProgress (0.98); - } - - border_interpolate2(W, H, 3, rawData, red, green, blue); - if(plistenerActive) { plistener->setProgress (1.0); } From 47cfcd51d49b9f6890558ee0d4dce3e9e69979a5 Mon Sep 17 00:00:00 2001 From: heckflosse Date: Sat, 27 Oct 2018 18:46:02 +0200 Subject: [PATCH 5/5] vng4 demosaic: removed StopWatch, fixes #4897 --- rtengine/vng4_demosaic_RT.cc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/rtengine/vng4_demosaic_RT.cc b/rtengine/vng4_demosaic_RT.cc index 500590b04..5ed0b35c7 100644 --- a/rtengine/vng4_demosaic_RT.cc +++ b/rtengine/vng4_demosaic_RT.cc @@ -24,13 +24,13 @@ #include "rawimagesource.h" #include "rawimagesource_i.h" #include "../rtgui/multilangmgr.h" -#define BENCHMARK +//#define BENCHMARK #include "StopWatch.h" namespace rtengine { #define fc(row,col) (prefilters >> ((((row) << 1 & 14) + ((col) & 1)) << 1) & 3) -typedef unsigned short ushort; + void RawImageSource::vng4_demosaic (const array2D &rawData, array2D &red, array2D &green, array2D &blue, bool keepGreens) { BENCHFUN