Fixed crash on OSX wit OMP

see issue 757
This commit is contained in:
Oliver Duis 2011-06-24 23:12:41 +02:00
parent 4dd7a47040
commit a6989bb63b
4 changed files with 21 additions and 13 deletions

View File

@ -51,7 +51,7 @@ void RawImageSource::processRawWhitepoint(float expos, float preser) {
for (int i=0; i<H; i++) memcpy (imgd[i], rawData[i], W*sizeof(**imgd)); for (int i=0; i<H; i++) memcpy (imgd[i], rawData[i], W*sizeof(**imgd));
// Demosaic to calc luminosity // Demosaic to calc luminosity
fast_demo (0,0,W,H); fast_demosaic (0,0,W,H);
// calculate CIE luminosity // calculate CIE luminosity
float* luminosity = (float *) new float[width*height]; float* luminosity = (float *) new float[width*height];

View File

@ -25,18 +25,22 @@
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
static LUTf dirwt;
static void __attribute__((constructor)) setup_dirwt()
LUTf RawImageSource::initInvGrad()
{ {
dirwt (0x10000); LUTf invGrad (0x10000);
//set up directional weight function //set up directional weight function
for (int i=0; i<0x10000; i++) for (int i=0; i<0x10000; i++)
dirwt[i] = 1.0/SQR(1.0+i); invGrad[i] = 1.0/SQR(1.0+i);
return invGrad;
} }
void RawImageSource::fast_demo(int winx, int winy, int winw, int winh) { LUTf RawImageSource::invGrad = RawImageSource::initInvGrad();
void RawImageSource::fast_demosaic(int winx, int winy, int winw, int winh) {
//int winx=0, winy=0; //int winx=0, winy=0;
//int winw=W, winh=H; //int winw=W, winh=H;
@ -47,7 +51,7 @@ void RawImageSource::fast_demo(int winx, int winy, int winw, int winh) {
float progress = 0.0; float progress = 0.0;
#define bord 4 const int bord=4;
int clip_pt = 4*65535*initialGain; int clip_pt = 4*65535*initialGain;
@ -193,10 +197,10 @@ void RawImageSource::fast_demo(int winx, int winy, int winw, int winh) {
} else { } else {
//compute directional weights using image gradients //compute directional weights using image gradients
wtu=dirwt[(abs(rawData[i+1][j]-rawData[i-1][j])+abs(rawData[i][j]-rawData[i-2][j])+abs(rawData[i-1][j]-rawData[i-3][j])) >>2]; wtu=invGrad[(abs(rawData[i+1][j]-rawData[i-1][j])+abs(rawData[i][j]-rawData[i-2][j])+abs(rawData[i-1][j]-rawData[i-3][j])) >>2];
wtd=dirwt[(abs(rawData[i-1][j]-rawData[i+1][j])+abs(rawData[i][j]-rawData[i+2][j])+abs(rawData[i+1][j]-rawData[i+3][j])) >>2]; wtd=invGrad[(abs(rawData[i-1][j]-rawData[i+1][j])+abs(rawData[i][j]-rawData[i+2][j])+abs(rawData[i+1][j]-rawData[i+3][j])) >>2];
wtl=dirwt[(abs(rawData[i][j+1]-rawData[i][j-1])+abs(rawData[i][j]-rawData[i][j-2])+abs(rawData[i][j-1]-rawData[i][j-3])) >>2]; wtl=invGrad[(abs(rawData[i][j+1]-rawData[i][j-1])+abs(rawData[i][j]-rawData[i][j-2])+abs(rawData[i][j-1]-rawData[i][j-3])) >>2];
wtr=dirwt[(abs(rawData[i][j-1]-rawData[i][j+1])+abs(rawData[i][j]-rawData[i][j+2])+abs(rawData[i][j+1]-rawData[i][j+3])) >>2]; wtr=invGrad[(abs(rawData[i][j-1]-rawData[i][j+1])+abs(rawData[i][j]-rawData[i][j+2])+abs(rawData[i][j+1]-rawData[i][j+3])) >>2];
//store in rgb array the interpolated G value at R/B grid points using directional weighted average //store in rgb array the interpolated G value at R/B grid points using directional weighted average
green[i][j]=(int)((wtu*rawData[i-1][j]+wtd*rawData[i+1][j]+wtl*rawData[i][j-1]+wtr*rawData[i][j+1])/(wtu+wtd+wtl+wtr)); green[i][j]=(int)((wtu*rawData[i-1][j]+wtd*rawData[i+1][j]+wtl*rawData[i][j-1]+wtr*rawData[i][j+1])/(wtu+wtd+wtl+wtr));

View File

@ -1110,7 +1110,7 @@ void RawImageSource::demosaic(const RAWParams &raw)
else if (raw.dmethod == RAWParams::methodstring[RAWParams::eahd]) else if (raw.dmethod == RAWParams::methodstring[RAWParams::eahd])
eahd_demosaic (); eahd_demosaic ();
else if (raw.dmethod == RAWParams::methodstring[RAWParams::fast] ) else if (raw.dmethod == RAWParams::methodstring[RAWParams::fast] )
fast_demo (0,0,W,H); fast_demosaic (0,0,W,H);
//nodemosaic();//for testing //nodemosaic();//for testing
else else
nodemosaic(); nodemosaic();

View File

@ -54,6 +54,10 @@ template<class T> void freeArray2 (T** a, int H) {
class RawImageSource : public ImageSource { class RawImageSource : public ImageSource {
private:
static LUTf invGrad; // for fast_demosaic
static LUTf initInvGrad ();
protected: protected:
Glib::Mutex getImageMutex; // locks getImage Glib::Mutex getImageMutex; // locks getImage
@ -184,7 +188,7 @@ class RawImageSource : public ImageSource {
void vng4_demosaic(); void vng4_demosaic();
void ppg_demosaic(); void ppg_demosaic();
void amaze_demosaic_RT(int winx, int winy, int winw, int winh);//Emil's code for AMaZE void amaze_demosaic_RT(int winx, int winy, int winw, int winh);//Emil's code for AMaZE
void fast_demo(int winx, int winy, int winw, int winh);//Emil's code for fast demosaicing void fast_demosaic(int winx, int winy, int winw, int winh);//Emil's code for fast demosaicing
void dcb_demosaic(int iterations, int dcb_enhance); void dcb_demosaic(int iterations, int dcb_enhance);
void ahd_demosaic(int winx, int winy, int winw, int winh); void ahd_demosaic(int winx, int winy, int winw, int winh);
void border_interpolate(int border, float (*image)[4], int start = 0, int end = 0); void border_interpolate(int border, float (*image)[4], int start = 0, int end = 0);