From 67b6aec64eaf4a7ec270b6d736ad60471e65fdcd Mon Sep 17 00:00:00 2001 From: heckflosse Date: Thu, 9 Nov 2017 13:06:12 +0100 Subject: [PATCH] Fattal: one less buffer alloc/dealloc --- rtengine/FTblockDN.cc | 2 +- rtengine/tmo_fattal02.cc | 9 +++++---- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/rtengine/FTblockDN.cc b/rtengine/FTblockDN.cc index a14446358..6cb503f6f 100644 --- a/rtengine/FTblockDN.cc +++ b/rtengine/FTblockDN.cc @@ -117,7 +117,7 @@ void do_median_denoise(float **src, float **dst, float upperBound, const int wid // we need a buffer if src == dst or if (src != dst && iterations > 1) if (src == dst || iterations > 1) { - if (buffer == nullptr) { // we didn't get a buufer => create one + if (buffer == nullptr) { // we didn't get a buffer => create one allocBuffer = new float*[height]; for (int i = 0; i < height; ++i) { diff --git a/rtengine/tmo_fattal02.cc b/rtengine/tmo_fattal02.cc index c1b0a4a5f..d537cce3f 100644 --- a/rtengine/tmo_fattal02.cc +++ b/rtengine/tmo_fattal02.cc @@ -1248,6 +1248,10 @@ void ImProcFunctions::ToneMapFattal02(Imagefloat *rgb) } } // median filter on the deep shadows, to avoid boosting noise + // because w2 >= w and h2 >= h, we can use the L buffer as temporary buffer for Median_Denoise() + int w2 = find_fast_dim(w) + 1; + int h2 = find_fast_dim(h) + 1; + Array2Df L(w2, h2); { #ifdef _OPENMP int num_threads = multiThread ? omp_get_max_threads() : 1; @@ -1265,7 +1269,7 @@ void ImProcFunctions::ToneMapFattal02(Imagefloat *rgb) } else { med = Median::TYPE_3X3_STRONG; } - Median_Denoise(Yr, Yr, luminance_noise_floor, w, h, med, 1, num_threads); + Median_Denoise(Yr, Yr, luminance_noise_floor, w, h, med, 1, num_threads, L); } float noise = alpha * 0.01f; @@ -1275,9 +1279,6 @@ void ImProcFunctions::ToneMapFattal02(Imagefloat *rgb) << ", detail_level = " << detail_level << std::endl; } - int w2 = find_fast_dim(w) + 1; - int h2 = find_fast_dim(h) + 1; - Array2Df L(w2, h2); rescale_nearest(Yr, L, multiThread); tmo_fattal02(w2, h2, L, L, alpha, beta, noise, detail_level, multiThread);