From 3f60637e7cf3641faca89c9f01ac4eec621ec2ff Mon Sep 17 00:00:00 2001 From: Ingo Date: Tue, 4 Nov 2014 13:51:28 +0100 Subject: [PATCH] Fixed another race condition in raw auto ca correction, Issue 2554 --- rtengine/CA_correct_RT.cc | 63 ++++++++++----------------------------- 1 file changed, 15 insertions(+), 48 deletions(-) diff --git a/rtengine/CA_correct_RT.cc b/rtengine/CA_correct_RT.cc index 59181f3c2..ccb50e03b 100644 --- a/rtengine/CA_correct_RT.cc +++ b/rtengine/CA_correct_RT.cc @@ -151,19 +151,14 @@ void RawImageSource::CA_correct_RT(double cared, double cablue) { blockwt = (float (*)) (buffer1); blockshifts = (float (*)[3][2]) (buffer1+(vblsz*hblsz*sizeof(float))); - double polymat[3][2][256], shiftmat[3][2][16], fitparams[3][2][16]; - for (int i=0; i<256; i++) {polymat[0][0][i] = polymat[0][1][i] = polymat[2][0][i] = polymat[2][1][i] = 0;} - for (int i=0; i<16; i++) {shiftmat[0][0][i] = shiftmat[0][1][i] = shiftmat[2][0][i] = shiftmat[2][1][i] = 0;} + double fitparams[3][2][16]; //order of 2d polynomial fit (polyord), and numpar=polyord^2 int polyord=4, numpar=16; - int numblox[3]={0,0,0}; -#pragma omp parallel shared(Gtmp,width,height,blockave,blocksqave,blockdenom,blockvar,blockwt,blockshifts,polymat,shiftmat,fitparams,polyord,numpar) +#pragma omp parallel shared(Gtmp,width,height,blockave,blocksqave,blockdenom,blockvar,blockwt,blockshifts,fitparams,polyord,numpar) { int progresscounter = 0; - //number of blocks used in the fit - int numbloxthr[3]={0,0,0}; int rrmin, rrmax, ccmin, ccmax; int top, left, row, col; @@ -533,7 +528,7 @@ void RawImageSource::CA_correct_RT(double cared, double cablue) { if (areawt[j][c]>0 && coeff[j][2][c]>eps2) { CAshift[j][c]=coeff[j][1][c]/coeff[j][2][c]; - blockwt[vblock*hblsz+hblock]= areawt[j][c];//*coeff[j][2][c]/(eps+coeff[j][0][c]) ; + blockwt[vblock*hblsz+hblock]= areawt[j][c]*coeff[j][2][c]/(eps+coeff[j][0][c]) ; } else { CAshift[j][c]=17.0; blockwt[vblock*hblsz+hblock]=0; @@ -606,7 +601,6 @@ void RawImageSource::CA_correct_RT(double cared, double cablue) { break; } } -} //printf ("tile variances %f %f %f %f \n",blockvar[0][0],blockvar[1][0],blockvar[0][2],blockvar[1][2] ); @@ -615,8 +609,6 @@ void RawImageSource::CA_correct_RT(double cared, double cablue) { //now prepare for CA correction pass //first, fill border blocks of blockshift array if(processpasstwo) { -#pragma omp single -{ for (vblock=1; vblock4.0*blockvar[0][c] || SQR(bstemp[c][1])>4.0*blockvar[1][c]) + if (SQR(bstemp[0])>4.0*blockvar[0][c] || SQR(bstemp[1])>4.0*blockvar[1][c]) continue; - numbloxthr[c]++; + numblox[c]++; for (dir=0; dir<2; dir++) { for (i=0; i