Fixed crash on OSX wit OMP
see issue 757
This commit is contained in:
parent
4dd7a47040
commit
a6989bb63b
@ -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];
|
||||||
|
@ -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));
|
||||||
|
@ -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();
|
||||||
|
@ -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);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user