LCMS performance optimizations
This commit is contained in:
parent
31791b268f
commit
6024cb817a
@ -271,3 +271,10 @@ Image16::tofloat() const
|
|||||||
}
|
}
|
||||||
return imgfloat;
|
return imgfloat;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Parallized transformation; create transform with cmsFLAGS_NOCACHE!
|
||||||
|
void Image16::ExecCMSTransform(cmsHTRANSFORM hTransform) {
|
||||||
|
#pragma omp parallel for
|
||||||
|
for (int i=0; i<height; i++)
|
||||||
|
cmsDoTransform(hTransform, data + 3*i*rowstride, data + 3*i*rowstride, rowstride);
|
||||||
|
}
|
@ -87,6 +87,8 @@ class Image16 : public ImageIO, public IImage16 {
|
|||||||
virtual unsigned short** getRPlane () { return r; }
|
virtual unsigned short** getRPlane () { return r; }
|
||||||
virtual unsigned short** getGPlane () { return g; }
|
virtual unsigned short** getGPlane () { return g; }
|
||||||
virtual unsigned short** getBPlane () { return b; }
|
virtual unsigned short** getBPlane () { return b; }
|
||||||
|
|
||||||
|
void ExecCMSTransform(cmsHTRANSFORM hTransform);
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
|
@ -21,6 +21,7 @@
|
|||||||
#include <image8.h>
|
#include <image8.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <rtengine.h>
|
#include <rtengine.h>
|
||||||
|
#include <mytime.h>
|
||||||
|
|
||||||
using namespace rtengine;
|
using namespace rtengine;
|
||||||
|
|
||||||
@ -234,4 +235,9 @@ Imagefloat::to16() const
|
|||||||
return img16;
|
return img16;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Parallized transformation; create transform with cmsFLAGS_NOCACHE!
|
||||||
|
void Imagefloat::ExecCMSTransform(cmsHTRANSFORM hTransform) {
|
||||||
|
#pragma omp parallel for
|
||||||
|
for (int i=0; i<height; i++)
|
||||||
|
cmsDoTransform(hTransform, data + 3*i*rowstride, data + 3*i*rowstride, rowstride);
|
||||||
|
}
|
||||||
|
@ -89,6 +89,8 @@ class Imagefloat : public ImageIO, public IImagefloat {
|
|||||||
virtual float** getRPlane () { return r; }
|
virtual float** getRPlane () { return r; }
|
||||||
virtual float** getGPlane () { return g; }
|
virtual float** getGPlane () { return g; }
|
||||||
virtual float** getBPlane () { return b; }
|
virtual float** getBPlane () { return b; }
|
||||||
|
|
||||||
|
void ExecCMSTransform(cmsHTRANSFORM hTransform);
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
|
@ -1587,7 +1587,8 @@ void RawImageSource::colorSpaceConversion (Imagefloat* im, ColorManagementParams
|
|||||||
im->b[i][j] = (newb);
|
im->b[i][j] = (newb);
|
||||||
|
|
||||||
}
|
}
|
||||||
} else {// use supplied input profile
|
} else {
|
||||||
|
// use supplied input profile
|
||||||
// color space transform is expecting data in the range (0,1)
|
// color space transform is expecting data in the range (0,1)
|
||||||
for ( int h = 0; h < im->height; ++h )
|
for ( int h = 0; h < im->height; ++h )
|
||||||
for ( int w = 0; w < im->width; ++w ) {
|
for ( int w = 0; w < im->width; ++w ) {
|
||||||
@ -1597,13 +1598,18 @@ void RawImageSource::colorSpaceConversion (Imagefloat* im, ColorManagementParams
|
|||||||
}
|
}
|
||||||
out = iccStore->workingSpace (cmp.working);
|
out = iccStore->workingSpace (cmp.working);
|
||||||
// out = iccStore->workingSpaceGamma (wProfile);
|
// out = iccStore->workingSpaceGamma (wProfile);
|
||||||
|
|
||||||
lcmsMutex->lock ();
|
lcmsMutex->lock ();
|
||||||
cmsHTRANSFORM hTransform = cmsCreateTransform (in, (FLOAT_SH(1)|COLORSPACE_SH(PT_RGB)|CHANNELS_SH(3)|BYTES_SH(4)|PLANAR_SH(1)), out, (FLOAT_SH(1)|COLORSPACE_SH(PT_RGB)|CHANNELS_SH(3)|BYTES_SH(4)|PLANAR_SH(1)), settings->colorimetricIntent, 0);
|
cmsHTRANSFORM hTransform = cmsCreateTransform (in, (FLOAT_SH(1)|COLORSPACE_SH(PT_RGB)|CHANNELS_SH(3)|BYTES_SH(4)|PLANAR_SH(1)), out, (FLOAT_SH(1)|COLORSPACE_SH(PT_RGB)|CHANNELS_SH(3)|BYTES_SH(4)|PLANAR_SH(1)), settings->colorimetricIntent,
|
||||||
|
cmsFLAGS_NOCACHE ); // NOCACHE is important for thread safety
|
||||||
lcmsMutex->unlock ();
|
lcmsMutex->unlock ();
|
||||||
if (hTransform) {//there is an input profile
|
|
||||||
|
if (hTransform) {
|
||||||
|
// there is an input profile
|
||||||
if (cmp.gammaOnInput) {
|
if (cmp.gammaOnInput) {
|
||||||
float gd = pow (2.0, defgain);
|
float gd = pow (2.0, defgain);
|
||||||
defgain = 0.0; // Writeback defgain to be 0.0
|
defgain = 0.0; // Writeback defgain to be 0.0
|
||||||
|
|
||||||
#pragma omp parallel for
|
#pragma omp parallel for
|
||||||
for (int i=0; i<im->height; i++)
|
for (int i=0; i<im->height; i++)
|
||||||
for (int j=0; j<im->width; j++) {
|
for (int j=0; j<im->width; j++) {
|
||||||
@ -1613,21 +1619,28 @@ void RawImageSource::colorSpaceConversion (Imagefloat* im, ColorManagementParams
|
|||||||
im->b[i][j] = CurveFactory::gamma (CLIP(gd*im->b[i][j]));
|
im->b[i][j] = CurveFactory::gamma (CLIP(gd*im->b[i][j]));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
cmsDoTransform (hTransform, im->data, im->data, im->planestride);
|
|
||||||
} else {//create the profile
|
im->ExecCMSTransform(hTransform);
|
||||||
|
} else {
|
||||||
|
// create the profile from camera
|
||||||
lcmsMutex->lock ();
|
lcmsMutex->lock ();
|
||||||
hTransform = cmsCreateTransform (camprofile, (FLOAT_SH(1)|COLORSPACE_SH(PT_RGB)|CHANNELS_SH(3)|BYTES_SH(4)|PLANAR_SH(1)), out, (FLOAT_SH(1)|COLORSPACE_SH(PT_RGB)|CHANNELS_SH(3)|BYTES_SH(4)|PLANAR_SH(1)), settings->colorimetricIntent, cmsFLAGS_NOOPTIMIZE);
|
hTransform = cmsCreateTransform (camprofile, (FLOAT_SH(1)|COLORSPACE_SH(PT_RGB)|CHANNELS_SH(3)|BYTES_SH(4)|PLANAR_SH(1)), out, (FLOAT_SH(1)|COLORSPACE_SH(PT_RGB)|CHANNELS_SH(3)|BYTES_SH(4)|PLANAR_SH(1)), settings->colorimetricIntent,
|
||||||
|
cmsFLAGS_NOOPTIMIZE | cmsFLAGS_NOCACHE ); // NOCACHE is important for thread safety
|
||||||
lcmsMutex->unlock ();
|
lcmsMutex->unlock ();
|
||||||
cmsDoTransform (hTransform, im->data, im->data, im->planestride);
|
|
||||||
|
im->ExecCMSTransform(hTransform);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
cmsDeleteTransform(hTransform);
|
||||||
|
|
||||||
// restore normalization to the range (0,65535)
|
// restore normalization to the range (0,65535)
|
||||||
|
#pragma omp parallel for
|
||||||
for ( int h = 0; h < im->height; ++h )
|
for ( int h = 0; h < im->height; ++h )
|
||||||
for ( int w = 0; w < im->width; ++w ) {
|
for ( int w = 0; w < im->width; ++w ) {
|
||||||
im->r[h][w] *= 65535.0 ;
|
im->r[h][w] *= 65535.0 ;
|
||||||
im->g[h][w] *= 65535.0 ;
|
im->g[h][w] *= 65535.0 ;
|
||||||
im->b[h][w] *= 65535.0 ;
|
im->b[h][w] *= 65535.0 ;
|
||||||
}
|
}
|
||||||
cmsDeleteTransform(hTransform);
|
|
||||||
}
|
}
|
||||||
t3.set ();
|
t3.set ();
|
||||||
// printf ("ICM TIME: %d\n", t3.etime(t1));
|
// printf ("ICM TIME: %d\n", t3.etime(t1));
|
||||||
@ -1642,9 +1655,8 @@ void RawImageSource::colorSpaceConversion16 (Image16* im, ColorManagementParams
|
|||||||
if (cmp.input == "(none)")
|
if (cmp.input == "(none)")
|
||||||
return;
|
return;
|
||||||
|
|
||||||
MyTime t1, t2, t3;
|
//MyTime t1, t2, t3;
|
||||||
|
//t1.set ();
|
||||||
t1.set ();
|
|
||||||
|
|
||||||
cmsHPROFILE in;
|
cmsHPROFILE in;
|
||||||
cmsHPROFILE out;
|
cmsHPROFILE out;
|
||||||
@ -1697,12 +1709,14 @@ void RawImageSource::colorSpaceConversion16 (Image16* im, ColorManagementParams
|
|||||||
out = iccStore->workingSpace (cmp.working);
|
out = iccStore->workingSpace (cmp.working);
|
||||||
// out = iccStore->workingSpaceGamma (wProfile);
|
// out = iccStore->workingSpaceGamma (wProfile);
|
||||||
lcmsMutex->lock ();
|
lcmsMutex->lock ();
|
||||||
cmsHTRANSFORM hTransform = cmsCreateTransform (in, TYPE_RGB_16_PLANAR, out, TYPE_RGB_16_PLANAR, settings->colorimetricIntent, 0);
|
cmsHTRANSFORM hTransform = cmsCreateTransform (in, TYPE_RGB_16_PLANAR, out, TYPE_RGB_16_PLANAR, settings->colorimetricIntent, cmsFLAGS_NOCACHE); // NOCACHE is important for thread safety
|
||||||
lcmsMutex->unlock ();
|
lcmsMutex->unlock ();
|
||||||
|
|
||||||
if (hTransform) {
|
if (hTransform) {
|
||||||
if (cmp.gammaOnInput) {
|
if (cmp.gammaOnInput) {
|
||||||
float gd = pow (2.0, defgain);
|
float gd = pow (2.0, defgain);
|
||||||
defgain = 0.0;
|
defgain = 0.0;
|
||||||
|
|
||||||
#pragma omp parallel for
|
#pragma omp parallel for
|
||||||
for (int i=0; i<im->height; i++)
|
for (int i=0; i<im->height; i++)
|
||||||
for (int j=0; j<im->width; j++) {
|
for (int j=0; j<im->width; j++) {
|
||||||
@ -1711,17 +1725,21 @@ void RawImageSource::colorSpaceConversion16 (Image16* im, ColorManagementParams
|
|||||||
im->b[i][j] = CurveFactory::gamma ((gd*im->b[i][j]));
|
im->b[i][j] = CurveFactory::gamma ((gd*im->b[i][j]));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
cmsDoTransform (hTransform, im->data, im->data, im->planestride);
|
|
||||||
|
im->ExecCMSTransform(hTransform);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
lcmsMutex->lock ();
|
lcmsMutex->lock ();
|
||||||
hTransform = cmsCreateTransform (camprofile, TYPE_RGB_16_PLANAR, out, TYPE_RGB_16_PLANAR, settings->colorimetricIntent, 0);
|
hTransform = cmsCreateTransform (camprofile, TYPE_RGB_16_PLANAR, out, TYPE_RGB_16_PLANAR, settings->colorimetricIntent, cmsFLAGS_NOCACHE);
|
||||||
lcmsMutex->unlock ();
|
lcmsMutex->unlock ();
|
||||||
cmsDoTransform (hTransform, im->data, im->data, im->planestride);
|
|
||||||
|
im->ExecCMSTransform(hTransform);
|
||||||
}
|
}
|
||||||
|
|
||||||
cmsDeleteTransform(hTransform);
|
cmsDeleteTransform(hTransform);
|
||||||
}
|
}
|
||||||
t3.set ();
|
|
||||||
|
//t3.set ();
|
||||||
// printf ("ICM TIME: %d\n", t3.etime(t1));
|
// printf ("ICM TIME: %d\n", t3.etime(t1));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -315,9 +315,12 @@ void StdImageSource::colorSpaceConversion (Imagefloat* im, ColorManagementParams
|
|||||||
|
|
||||||
if (cmp.input!="(none)") {
|
if (cmp.input!="(none)") {
|
||||||
lcmsMutex->lock ();
|
lcmsMutex->lock ();
|
||||||
cmsHTRANSFORM hTransform = cmsCreateTransform (in, (FLOAT_SH(1)|COLORSPACE_SH(PT_RGB)|CHANNELS_SH(3)|BYTES_SH(4)|PLANAR_SH(1)), out, (FLOAT_SH(1)|COLORSPACE_SH(PT_RGB)|CHANNELS_SH(3)|BYTES_SH(4)|PLANAR_SH(1)), settings->colorimetricIntent, cmsFLAGS_NOOPTIMIZE);
|
cmsHTRANSFORM hTransform = cmsCreateTransform (in, (FLOAT_SH(1)|COLORSPACE_SH(PT_RGB)|CHANNELS_SH(3)|BYTES_SH(4)|PLANAR_SH(1)), out, (FLOAT_SH(1)|COLORSPACE_SH(PT_RGB)|CHANNELS_SH(3)|BYTES_SH(4)|PLANAR_SH(1)), settings->colorimetricIntent,
|
||||||
|
cmsFLAGS_NOOPTIMIZE | cmsFLAGS_NOCACHE);
|
||||||
lcmsMutex->unlock ();
|
lcmsMutex->unlock ();
|
||||||
cmsDoTransform (hTransform, im->data, im->data, im->planestride);
|
|
||||||
|
im->ExecCMSTransform(hTransform);
|
||||||
|
|
||||||
cmsDeleteTransform(hTransform);
|
cmsDeleteTransform(hTransform);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -350,9 +353,11 @@ void StdImageSource::colorSpaceConversion16 (Image16* im, ColorManagementParams
|
|||||||
|
|
||||||
if (cmp.input!="(none)") {
|
if (cmp.input!="(none)") {
|
||||||
lcmsMutex->lock ();
|
lcmsMutex->lock ();
|
||||||
cmsHTRANSFORM hTransform = cmsCreateTransform (in, TYPE_RGB_16_PLANAR, out, TYPE_RGB_16_PLANAR, settings->colorimetricIntent, 0);
|
cmsHTRANSFORM hTransform = cmsCreateTransform (in, TYPE_RGB_16_PLANAR, out, TYPE_RGB_16_PLANAR, settings->colorimetricIntent, cmsFLAGS_NOCACHE);
|
||||||
lcmsMutex->unlock ();
|
lcmsMutex->unlock ();
|
||||||
cmsDoTransform (hTransform, im->data, im->data, im->planestride);
|
|
||||||
|
im->ExecCMSTransform(hTransform);
|
||||||
|
|
||||||
cmsDeleteTransform(hTransform);
|
cmsDeleteTransform(hTransform);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user