From bec0a30ef1fda9cc74ce44fc68582acb7325b50f Mon Sep 17 00:00:00 2001 From: Emil Martinec Date: Thu, 29 Mar 2012 07:52:32 -0500 Subject: [PATCH] Bugfixes, in particular fixed memory leak in destructor of cplx_wavelet_dec.cc. --- rtengine/FTblockDN.cc | 77 ++++++++++++++++++----------------- rtengine/cplx_wavelet_dec.cc | 4 +- rtengine/cplx_wavelet_dec.h | 8 ++-- rtengine/cplx_wavelet_level.h | 10 ++--- rtengine/improcfun.h | 4 +- 5 files changed, 52 insertions(+), 51 deletions(-) diff --git a/rtengine/FTblockDN.cc b/rtengine/FTblockDN.cc index 15aa905a8..272ce3469 100644 --- a/rtengine/FTblockDN.cc +++ b/rtengine/FTblockDN.cc @@ -253,8 +253,9 @@ namespace rtengine { float noisevarL = SQR(dnparams.luma/25.0f); float noisevarab = SQR(dnparams.chroma/10.0f); - WaveletDenoiseAll_BiShrink(Ldecomp, adecomp, bdecomp, noisevarL, noisevarab); - + //WaveletDenoiseAll_BiShrink(Ldecomp, adecomp, bdecomp, noisevarL, noisevarab); + WaveletDenoiseAll(Ldecomp, adecomp, bdecomp, noisevarL, noisevarab); + Ldecomp.reconstruct(labdn->data); adecomp.reconstruct(labdn->data+datalen); bdecomp.reconstruct(labdn->data+2*datalen); @@ -694,12 +695,12 @@ namespace rtengine { sfave[coeffloc_L] = sf_L; - edge[i][j] = (WavCoeffs_L[dir][coeffloc_L] - WavPars_L[dir][coeffloc_Lpar]); + //edge[i][j] = (WavCoeffs_L[dir][coeffloc_L] - WavPars_L[dir][coeffloc_Lpar]); } //blur edge measure - gaussHorizontal (edge, edge, buffer, Wlvl_L, Hlvl_L, 1<<(lvl+1), false /*multiThread*/); - gaussVertical (edge, edge, buffer, Wlvl_L, Hlvl_L, 1<<(lvl+1), false); + //gaussHorizontal (edge, edge, buffer, Wlvl_L, Hlvl_L, 1<<(lvl+1), false /*multiThread*/); + //gaussVertical (edge, edge, buffer, Wlvl_L, Hlvl_L, 1<<(lvl+1), false); boxblur(sfave, sfave, lvl+2, lvl+2, Wlvl_L, Hlvl_L);//increase smoothness by locally averaging shrinkage //OpenMP here @@ -733,6 +734,34 @@ namespace rtengine { //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + void ImProcFunctions::WaveletDenoiseAll(wavelet_decomposition &WaveletCoeffs_L, wavelet_decomposition &WaveletCoeffs_a, + wavelet_decomposition &WaveletCoeffs_b, float noisevar_L, float noisevar_ab ) + { + int maxlvl = WaveletCoeffs_L.maxlevel(); + + for (int lvl=0; lvl2*thresh_a ? 1 : (coeff_a2*thresh_b ? 1 : (coeff_b0.01) { //OpenMP here for (int i=0; i2*thresh_L ? 1 : (coeff_L2*thresh_L ? 1 : (coeff_L0; lvl--) { dual_tree[lvl][2*n+m]->reconstruct_level(dual_tree[lvl-1][2*n+m]->wavcoeffs[0], wavfilt_synth+wavfilt_len*2*n, \ - wavfilt_synth+wavfilt_len*2*m, wavfilt_len, wavfilt_offset, skip); + wavfilt_synth+wavfilt_len*2*m, wavfilt_len, wavfilt_offset); skip /=2; } dual_tree[0][2*n+m]->reconstruct_level(tmp[2*n+m], first_lev_synth+first_lev_len*2*n, - first_lev_synth+first_lev_len*2*m, first_lev_len, first_lev_offset, skip); + first_lev_synth+first_lev_len*2*m, first_lev_len, first_lev_offset); } } @@ -428,13 +428,13 @@ public: //int skip=1<<(lvltot-1); for (int lvl=lvltot-1; lvl>0; lvl--) { - wavelet_decomp[lvl]->reconstruct_level(wavelet_decomp[lvl-1]->wavcoeffs[0], wavfilt_synth, wavfilt_synth, wavfilt_len, wavfilt_offset, subsamp); + wavelet_decomp[lvl]->reconstruct_level(wavelet_decomp[lvl-1]->wavcoeffs[0], wavfilt_synth, wavfilt_synth, wavfilt_len, wavfilt_offset); //skip /=2; } internal_type * tmp = new internal_type[m_w*m_h]; - wavelet_decomp[0]->reconstruct_level(tmp, wavfilt_synth, wavfilt_synth, wavfilt_len, wavfilt_offset, subsamp); + wavelet_decomp[0]->reconstruct_level(tmp, wavfilt_synth, wavfilt_synth, wavfilt_len, wavfilt_offset); copy_out(tmp,dst,m_w*m_h); diff --git a/rtengine/cplx_wavelet_level.h b/rtengine/cplx_wavelet_level.h index 4d43ec0d1..26d48d7e1 100644 --- a/rtengine/cplx_wavelet_level.h +++ b/rtengine/cplx_wavelet_level.h @@ -104,7 +104,7 @@ namespace rtengine { m_pad= skip*padding; wavcoeffs = create((m_w2)*(m_h2)); - decompose_level(src, filterV, filterH, len, offset, skip); + decompose_level(src, filterV, filterH, len, offset); } @@ -144,10 +144,10 @@ namespace rtengine { } template - void decompose_level(E *src, float *filterV, float *filterH, int len, int offset, int skip); + void decompose_level(E *src, float *filterV, float *filterH, int len, int offset); template - void reconstruct_level(E *dst, float *filterV, float *filterH, int len, int offset, int skip); + void reconstruct_level(E *dst, float *filterV, float *filterH, int len, int offset); }; @@ -497,7 +497,7 @@ namespace rtengine { template template - void wavelet_level::decompose_level(E *src, float *filterV, float *filterH, int taps, int offset, int skip) { + void wavelet_level::decompose_level(E *src, float *filterV, float *filterH, int taps, int offset) { T *tmpLo = new T[m_w*m_h2]; T *tmpHi = new T[m_w*m_h2]; @@ -547,7 +547,7 @@ namespace rtengine { // %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% template template - void wavelet_level::reconstruct_level(E *dst, float *filterV, float *filterH, int taps, int offset, int skip) { + void wavelet_level::reconstruct_level(E *dst, float *filterV, float *filterH, int taps, int offset) { T *tmpLo = new T[m_w*m_h2]; T *tmpHi = new T[m_w*m_h2]; diff --git a/rtengine/improcfun.h b/rtengine/improcfun.h index 57d9001d8..2b455ae8d 100644 --- a/rtengine/improcfun.h +++ b/rtengine/improcfun.h @@ -150,8 +150,8 @@ namespace rtengine { void RGBoutput_tile_row (float *Lbloxrow, float ** Ldetail, float ** tilemask_out, int height, int width, int top ); //void WaveletDenoise(cplx_wavelet_decomposition &DualTreeCoeffs, float noisevar ); //void WaveletDenoise(wavelet_decomposition &WaveletCoeffs, float noisevar ); - //void WaveletDenoiseAll(wavelet_decomposition &WaveletCoeffs_L, wavelet_decomposition &WaveletCoeffs_a, - // wavelet_decomposition &WaveletCoeffs_b, float noisevar_L, float noisevar_ab ); + void WaveletDenoiseAll(wavelet_decomposition &WaveletCoeffs_L, wavelet_decomposition &WaveletCoeffs_a, + wavelet_decomposition &WaveletCoeffs_b, float noisevar_L, float noisevar_ab ); void WaveletDenoiseAll_BiShrink(wavelet_decomposition &WaveletCoeffs_L, wavelet_decomposition &WaveletCoeffs_a, wavelet_decomposition &WaveletCoeffs_b, float noisevar_L, float noisevar_ab ); //void BiShrink(float * ReCoeffs, float * ImCoeffs, float * ReParents, float * ImParents,