Speedup for 3 functions in rawimagesource.cc, Issue 1964

This commit is contained in:
Ingo
2013-09-04 20:12:19 +02:00
parent b1c2480c3e
commit bf6ee1ecdb

View File

@@ -36,7 +36,6 @@
#include "dcp.h" #include "dcp.h"
#include "rt_math.h" #include "rt_math.h"
#include "improcfun.h" #include "improcfun.h"
#ifdef _OPENMP #ifdef _OPENMP
#include <omp.h> #include <omp.h>
#endif #endif
@@ -1366,10 +1365,9 @@ void RawImageSource::cfaboxblur(RawImage *riFlatFile, float* cfablur, int boxH,
// Scale original pixels into the range 0 65535 using black offsets and multipliers // Scale original pixels into the range 0 65535 using black offsets and multipliers
void RawImageSource::scaleColors(int winx,int winy,int winw,int winh, const RAWParams &raw) void RawImageSource::scaleColors(int winx,int winy,int winw,int winh, const RAWParams &raw)
{ {
chmax[0]=chmax[1]=chmax[2]=chmax[3]=0;//channel maxima chmax[0]=chmax[1]=chmax[2]=chmax[3]=0;//channel maxima
float black_lev[4];//black level float black_lev[4];//black level
//adjust black level (eg Canon) //adjust black level (eg Canon)
black_lev[0]=raw.blackone;//R black_lev[0]=raw.blackone;//R
@@ -1383,6 +1381,12 @@ void RawImageSource::scaleColors(int winx,int winy,int winw,int winh, const RAWP
// scale image colors // scale image colors
if( ri->isBayer() ){ if( ri->isBayer() ){
#pragma omp parallel
{
float tmpchmax[3];
tmpchmax[0] = tmpchmax[1] = tmpchmax[2] = 0.0f;
#pragma omp for nowait
for (int row = winy; row < winy+winh; row ++){ for (int row = winy; row < winy+winh; row ++){
for (int col = winx; col < winx+winw; col++) { for (int col = winx; col < winx+winw; col++) {
float val = rawData[row][col]; float val = rawData[row][col];
@@ -1392,10 +1396,23 @@ void RawImageSource::scaleColors(int winx,int winy,int winw,int winh, const RAWP
val*=scale_mul[c4]; val*=scale_mul[c4];
rawData[row][col] = (val); rawData[row][col] = (val);
chmax[c] = max(chmax[c],val); tmpchmax[c] = max(tmpchmax[c],val);
} }
} }
#pragma omp critical
{
chmax[0] = max(tmpchmax[0],chmax[0]);
chmax[1] = max(tmpchmax[1],chmax[1]);
chmax[2] = max(tmpchmax[2],chmax[2]);
}
}
}else{ }else{
#pragma omp parallel
{
float tmpchmax[3];
tmpchmax[0] = tmpchmax[1] = tmpchmax[2] = 0.0f;
#pragma omp for nowait
for (int row = winy; row < winy+winh; row ++){ for (int row = winy; row < winy+winh; row ++){
for (int col = winx; col < winx+winw; col++) { for (int col = winx; col < winx+winw; col++) {
for (int c=0; c<3; c++) { // three colors, 0=R, 1=G, 2=B for (int c=0; c<3; c++) { // three colors, 0=R, 1=G, 2=B
@@ -1403,10 +1420,18 @@ void RawImageSource::scaleColors(int winx,int winy,int winw,int winh, const RAWP
val -= cblacksom[c]; val -= cblacksom[c];
val *= scale_mul[c]; val *= scale_mul[c];
rawData[row][3*col+c] = (val); rawData[row][3*col+c] = (val);
chmax[c] = max(chmax[c],val); tmpchmax[c] = max(tmpchmax[c],val);
} }
} }
} }
#pragma omp critical
{
chmax[0] = max(tmpchmax[0],chmax[0]);
chmax[1] = max(tmpchmax[1],chmax[1]);
chmax[2] = max(tmpchmax[2],chmax[2]);
}
}
chmax[3]=chmax[1]; chmax[3]=chmax[1];
} }
@@ -1444,7 +1469,7 @@ int RawImageSource::defTransform (int tran) {
// Thread called part // Thread called part
void RawImageSource::processFalseColorCorrectionThread (Imagefloat* im, int row_from, int row_to) { void RawImageSource::processFalseColorCorrectionThread (Imagefloat* im, int row_from, int row_to) {
int W = im->width; int W = im->width;
array2D<float> rbconv_Y (W,3); array2D<float> rbconv_Y (W,3);
@@ -1569,7 +1594,7 @@ void RawImageSource::processFalseColorCorrectionThread (Imagefloat* im, int row
// correction_YIQ_LQ // correction_YIQ_LQ
void RawImageSource::processFalseColorCorrection (Imagefloat* im, int steps) { void RawImageSource::processFalseColorCorrection (Imagefloat* im, int steps) {
if (im->height<4) if (im->height<4)
return; return;
@@ -1650,7 +1675,7 @@ void RawImageSource::colorSpaceConversion (Imagefloat* im, ColorManagementParams
im->b(i,j) = newb; im->b(i,j) = newb;
} }
} else { } else {
Imagefloat* imgPreLCMS=NULL; Imagefloat* imgPreLCMS=NULL;
if (cmp.blendCMSMatrix) imgPreLCMS=im->copy(); if (cmp.blendCMSMatrix) imgPreLCMS=im->copy();
@@ -2180,36 +2205,53 @@ void RawImageSource::getAutoExpHistogram (LUTu & histogram, int& histcompr) {
histogram(65536>>histcompr); histogram(65536>>histcompr);
histogram.clear(); histogram.clear();
#pragma omp parallel
{
LUTu tmphistogram(65536>>histcompr);
tmphistogram.clear();
#pragma omp for nowait
for (int i=border; i<H-border; i++) { for (int i=border; i<H-border; i++) {
int start, end; int start, end;
getRowStartEnd (i, start, end); getRowStartEnd (i, start, end);
if (ri->isBayer()) { if (ri->isBayer()) {
for (int j=start; j<end; j++) { for (int j=start; j<end; j++) {
if (ri->ISGREEN(i,j)) histogram[CLIP((int)(camwb_green*rawData[i][j]))>>histcompr]+=4; if (ri->ISGREEN(i,j)) tmphistogram[CLIP((int)(camwb_green*rawData[i][j]))>>histcompr]+=4;
else if (ri->ISRED(i,j)) histogram[CLIP((int)(camwb_red* rawData[i][j]))>>histcompr]+=4; else if (ri->ISRED(i,j)) tmphistogram[CLIP((int)(camwb_red* rawData[i][j]))>>histcompr]+=4;
else if (ri->ISBLUE(i,j)) histogram[CLIP((int)(camwb_blue* rawData[i][j]))>>histcompr]+=4; else if (ri->ISBLUE(i,j)) tmphistogram[CLIP((int)(camwb_blue* rawData[i][j]))>>histcompr]+=4;
} }
} else { } else {
for (int j=start; j<end; j++) { for (int j=start; j<end; j++) {
histogram[CLIP((int)(camwb_red* rawData[i][3*j+0]))>>histcompr]++; tmphistogram[CLIP((int)(camwb_red* rawData[i][3*j+0]))>>histcompr]++;
histogram[CLIP((int)(camwb_green*rawData[i][3*j+1]))>>histcompr]+=2; tmphistogram[CLIP((int)(camwb_green*rawData[i][3*j+1]))>>histcompr]+=2;
histogram[CLIP((int)(camwb_blue* rawData[i][3*j+2]))>>histcompr]++; tmphistogram[CLIP((int)(camwb_blue* rawData[i][3*j+2]))>>histcompr]++;
} }
} }
} }
#pragma omp critical
{
for(int i=0; i<(65536>>histcompr);i++)
histogram[i] += tmphistogram[i];
}
}
} }
// Histogram MUST be 256 in size; gamma is applied, blackpoint and gain also // Histogram MUST be 256 in size; gamma is applied, blackpoint and gain also
void RawImageSource::getRAWHistogram (LUTu & histRedRaw, LUTu & histGreenRaw, LUTu & histBlueRaw) { void RawImageSource::getRAWHistogram (LUTu & histRedRaw, LUTu & histGreenRaw, LUTu & histBlueRaw) {
histRedRaw.clear(); histGreenRaw.clear(); histBlueRaw.clear(); histRedRaw.clear(); histGreenRaw.clear(); histBlueRaw.clear();
float mult = 65535.0 / ri->get_white(); float mult = 65535.0 / ri->get_white();
// WARNING: This parallelization is not thread-safe because it R/W in histRedRaw, histGreenRaw, histBlueRaw #pragma omp parallel
// which are defined before the parallel section and must survive after it {
#pragma omp parallel for LUTu tmphistRedRaw( 256 );
LUTu tmphistGreenRaw( 256 );
LUTu tmphistBlueRaw( 256 );
tmphistRedRaw.clear();
tmphistGreenRaw.clear();
tmphistBlueRaw.clear();
#pragma omp for nowait
for (int i=border; i<H-border; i++) { for (int i=border; i<H-border; i++) {
int start, end, idx; int start, end, idx;
getRowStartEnd (i, start, end); getRowStartEnd (i, start, end);
@@ -2222,9 +2264,9 @@ void RawImageSource::getRAWHistogram (LUTu & histRedRaw, LUTu & histGreenRaw, LU
idx = CLIP((int)Color::gamma(mult*(ri->data[i][j]-(cblacksom[c4]/*+black_lev[c4]*/)))); idx = CLIP((int)Color::gamma(mult*(ri->data[i][j]-(cblacksom[c4]/*+black_lev[c4]*/))));
switch (c) { switch (c) {
case 0: histRedRaw[idx>>8]++; break; case 0: tmphistRedRaw[idx>>8]++; break;
case 1: histGreenRaw[idx>>8]++; break; case 1: tmphistGreenRaw[idx>>8]++; break;
case 2: histBlueRaw[idx>>8]++; break; case 2: tmphistBlueRaw[idx>>8]++; break;
} }
} }
} else { } else {
@@ -2233,14 +2275,23 @@ void RawImageSource::getRAWHistogram (LUTu & histRedRaw, LUTu & histGreenRaw, LU
idx = CLIP((int)Color::gamma(mult*(ri->data[i][3*j+c]-cblacksom[c]))); idx = CLIP((int)Color::gamma(mult*(ri->data[i][3*j+c]-cblacksom[c])));
switch (c) { switch (c) {
case 0: histRedRaw[idx>>8]++; break; case 0: tmphistRedRaw[idx>>8]++; break;
case 1: histGreenRaw[idx>>8]++; break; case 1: tmphistGreenRaw[idx>>8]++; break;
case 2: histBlueRaw[idx>>8]++; break; case 2: tmphistBlueRaw[idx>>8]++; break;
} }
} }
} }
} }
} }
#pragma omp critical
{
for(int i=0;i<256;i++){
histRedRaw[i] += tmphistRedRaw[i];
histGreenRaw[i] += tmphistGreenRaw[i];
histBlueRaw[i] += tmphistBlueRaw[i];
}
}
}
// since there are twice as many greens, correct for it // since there are twice as many greens, correct for it
if (ri->isBayer()) for (int i=0;i<256;i++) histGreenRaw[i]>>=1; if (ri->isBayer()) for (int i=0;i<256;i++) histGreenRaw[i]>>=1;