Speedup for initial thumb creation from raw files, fixes #4109
This commit is contained in:
@@ -38,7 +38,6 @@
|
|||||||
#include "improccoordinator.h"
|
#include "improccoordinator.h"
|
||||||
#include <locale.h>
|
#include <locale.h>
|
||||||
|
|
||||||
|
|
||||||
namespace
|
namespace
|
||||||
{
|
{
|
||||||
|
|
||||||
@@ -659,69 +658,18 @@ Thumbnail* Thumbnail::loadFromRaw (const Glib::ustring& fname, RawMetaDataLocati
|
|||||||
tpp->scale = (double) height / (rotate_90 ? w : h);
|
tpp->scale = (double) height / (rotate_90 ? w : h);
|
||||||
}
|
}
|
||||||
|
|
||||||
// generate histogram for auto exposure
|
// generate histogram for auto exposure, also calculate autoWB
|
||||||
tpp->aeHistCompression = 3;
|
tpp->aeHistCompression = 3;
|
||||||
tpp->aeHistogram (65536 >> tpp->aeHistCompression);
|
tpp->aeHistogram(65536 >> tpp->aeHistCompression);
|
||||||
tpp->aeHistogram.clear();
|
tpp->aeHistogram.clear();
|
||||||
int radd = 4;
|
|
||||||
int gadd = 4;
|
|
||||||
int badd = 4;
|
|
||||||
|
|
||||||
if (!filter) {
|
const unsigned int add = filter ? 1 : 4 / ri->get_colors();
|
||||||
radd = gadd = badd = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (int i = 8; i < height - 8; i++) {
|
double pixSum[3] = {0.0};
|
||||||
int start, end;
|
unsigned int n[3] = {0};
|
||||||
|
const double compression = pow(2.0, tpp->aeHistCompression);
|
||||||
if (ri->get_FujiWidth() != 0) {
|
const double camWb[3] = {tpp->camwbRed / compression, tpp->camwbGreen / compression, tpp->camwbBlue / compression};
|
||||||
int fw = ri->get_FujiWidth();
|
const double clipval = 64000.0 / tpp->defGain;
|
||||||
start = ABS (fw - i) + 8;
|
|
||||||
end = min (height + width - fw - i, fw + i) - 8;
|
|
||||||
} else {
|
|
||||||
start = 8;
|
|
||||||
end = width - 8;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (ri->get_colors() == 1) {
|
|
||||||
for (int j = start; j < end; j++) {
|
|
||||||
tpp->aeHistogram[ ((int) (image[i * width + j][0])) >> tpp->aeHistCompression] += radd;
|
|
||||||
tpp->aeHistogram[ ((int) (image[i * width + j][0])) >> tpp->aeHistCompression] += gadd;
|
|
||||||
tpp->aeHistogram[ ((int) (image[i * width + j][0])) >> tpp->aeHistCompression] += badd;
|
|
||||||
}
|
|
||||||
} else if (ri->getSensorType() == ST_BAYER) {
|
|
||||||
for (int j = start; j < end; j++)
|
|
||||||
if (FISGREEN (filter, i, j)) {
|
|
||||||
tpp->aeHistogram[ ((int) (tpp->camwbGreen * image[i * width + j][1])) >> tpp->aeHistCompression] += gadd;
|
|
||||||
} else if (FISRED (filter, i, j)) {
|
|
||||||
tpp->aeHistogram[ ((int) (tpp->camwbRed * image[i * width + j][0])) >> tpp->aeHistCompression] += radd;
|
|
||||||
} else if (FISBLUE (filter, i, j)) {
|
|
||||||
tpp->aeHistogram[ ((int) (tpp->camwbBlue * image[i * width + j][2])) >> tpp->aeHistCompression] += badd;
|
|
||||||
}
|
|
||||||
} else if (ri->getSensorType() == ST_FUJI_XTRANS) {
|
|
||||||
for (int j = start; j < end; j++)
|
|
||||||
if (ri->ISXTRANSGREEN (i, j)) {
|
|
||||||
tpp->aeHistogram[ ((int) (tpp->camwbGreen * image[i * width + j][1])) >> tpp->aeHistCompression] += gadd;
|
|
||||||
} else if (ri->ISXTRANSRED (i, j)) {
|
|
||||||
tpp->aeHistogram[ ((int) (tpp->camwbRed * image[i * width + j][0])) >> tpp->aeHistCompression] += radd;
|
|
||||||
} else if (ri->ISXTRANSBLUE (i, j)) {
|
|
||||||
tpp->aeHistogram[ ((int) (tpp->camwbBlue * image[i * width + j][2])) >> tpp->aeHistCompression] += badd;
|
|
||||||
}
|
|
||||||
} else { /* if(ri->getSensorType()==ST_FOVEON) */
|
|
||||||
for (int j = start; j < end; j++) {
|
|
||||||
tpp->aeHistogram[ ((int) (image[i * width + j][0] * 2.f)) >> tpp->aeHistCompression] += radd;
|
|
||||||
tpp->aeHistogram[ ((int) (image[i * width + j][1])) >> tpp->aeHistCompression] += gadd;
|
|
||||||
tpp->aeHistogram[ ((int) (image[i * width + j][2] * 0.5f)) >> tpp->aeHistCompression] += badd;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// generate autoWB
|
|
||||||
double avg_r = 0;
|
|
||||||
double avg_g = 0;
|
|
||||||
double avg_b = 0;
|
|
||||||
|
|
||||||
unsigned int rn = 0, gn = 0, bn = 0;
|
|
||||||
|
|
||||||
for (int i = 32; i < height - 32; i++) {
|
for (int i = 32; i < height - 32; i++) {
|
||||||
int start, end;
|
int start, end;
|
||||||
@@ -735,110 +683,118 @@ Thumbnail* Thumbnail::loadFromRaw (const Glib::ustring& fname, RawMetaDataLocati
|
|||||||
end = width - 32;
|
end = width - 32;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ri->getSensorType() == ST_BAYER) {
|
if (ri->get_colors() == 1) {
|
||||||
for (int j = start; j < end; j++) {
|
for (int j = start; j < end; j++) {
|
||||||
if (!filter) {
|
tpp->aeHistogram[image[i * width + j][0] >> tpp->aeHistCompression]++;
|
||||||
double d = tpp->defGain * image[i * width + j][0];
|
}
|
||||||
|
} else if (ri->getSensorType() == ST_BAYER) {
|
||||||
if (d > 64000.) {
|
int c0 = ri->FC(i, start);
|
||||||
continue;
|
int c1 = ri->FC(i, start + 1);
|
||||||
}
|
int j = start;
|
||||||
|
int n0 = 0;
|
||||||
avg_g += d;
|
int n1 = 0;
|
||||||
avg_r += d;
|
double pixSum0 = 0.0;
|
||||||
avg_b += d;
|
double pixSum1 = 0.0;
|
||||||
rn++;
|
for (; j < end - 1; j+=2) {
|
||||||
gn++;
|
double v0 = image[i * width + j][c0];
|
||||||
bn++;
|
tpp->aeHistogram[(int)(camWb[c0] * v0)]++;
|
||||||
} else if (FISGREEN (filter, i, j)) {
|
if (v0 <= clipval) {
|
||||||
double d = tpp->defGain * image[i * width + j][1];
|
pixSum0 += v0;
|
||||||
|
n0++;
|
||||||
if (d > 64000.) {
|
}
|
||||||
continue;
|
double v1 = image[i * width + j + 1][c1];
|
||||||
}
|
tpp->aeHistogram[(int)(camWb[c1] * v1)]++;
|
||||||
|
if (v1 <= clipval) {
|
||||||
avg_g += d;
|
pixSum1 += v1;
|
||||||
gn++;
|
n1++;
|
||||||
} else if (FISRED (filter, i, j)) {
|
|
||||||
double d = tpp->defGain * image[i * width + j][0];
|
|
||||||
|
|
||||||
if (d > 64000.) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
avg_r += d;
|
|
||||||
rn++;
|
|
||||||
} else if (FISBLUE (filter, i, j)) {
|
|
||||||
double d = tpp->defGain * image[i * width + j][2];
|
|
||||||
|
|
||||||
if (d > 64000.) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
avg_b += d;
|
|
||||||
bn++;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (j < end) {
|
||||||
|
double v0 = image[i * width + j][c0];
|
||||||
|
tpp->aeHistogram[(int)(camWb[c0] * v0)]++;
|
||||||
|
if (v0 <= clipval) {
|
||||||
|
pixSum0 += v0;
|
||||||
|
n0++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
n[c0] += n0;
|
||||||
|
n[c1] += n1;
|
||||||
|
pixSum[c0] += pixSum0;
|
||||||
|
pixSum[c1] += pixSum1;
|
||||||
} else if (ri->getSensorType() == ST_FUJI_XTRANS) {
|
} else if (ri->getSensorType() == ST_FUJI_XTRANS) {
|
||||||
for (int j = start; j < end; j++) {
|
int c[6];
|
||||||
|
for(int cc = 0; cc < 6; ++cc) {
|
||||||
|
c[cc] = ri->XTRANSFC(i, start + cc);
|
||||||
|
}
|
||||||
|
int j = start;
|
||||||
|
for (; j < end - 5; j += 6) {
|
||||||
|
for(int cc = 0; cc < 6; ++cc) {
|
||||||
|
double d = image[i * width + j + cc][c[cc]];
|
||||||
|
tpp->aeHistogram[(int)(camWb[c[cc]] * d)]++;
|
||||||
|
if (d <= clipval) {
|
||||||
|
pixSum[c[cc]] += d;
|
||||||
|
n[c[cc]]++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for (; j < end; j++) {
|
||||||
if (ri->ISXTRANSGREEN (i, j)) {
|
if (ri->ISXTRANSGREEN (i, j)) {
|
||||||
double d = tpp->defGain * image[i * width + j][1];
|
double d = image[i * width + j][1];
|
||||||
|
tpp->aeHistogram[(int)(camWb[1] * d)]++;
|
||||||
if (d > 64000.) {
|
if (d <= clipval) {
|
||||||
continue;
|
pixSum[1] += d;
|
||||||
|
n[1]++;
|
||||||
}
|
}
|
||||||
|
|
||||||
avg_g += d;
|
|
||||||
gn++;
|
|
||||||
} else if (ri->ISXTRANSRED (i, j)) {
|
} else if (ri->ISXTRANSRED (i, j)) {
|
||||||
double d = tpp->defGain * image[i * width + j][0];
|
double d = image[i * width + j][0];
|
||||||
|
tpp->aeHistogram[(int)(camWb[0] * d)]++;
|
||||||
if (d > 64000.) {
|
if (d <= clipval) {
|
||||||
continue;
|
pixSum[0] += d;
|
||||||
|
n[0]++;
|
||||||
}
|
}
|
||||||
|
|
||||||
avg_r += d;
|
|
||||||
rn++;
|
|
||||||
} else if (ri->ISXTRANSBLUE (i, j)) {
|
} else if (ri->ISXTRANSBLUE (i, j)) {
|
||||||
double d = tpp->defGain * image[i * width + j][2];
|
double d = image[i * width + j][2];
|
||||||
|
tpp->aeHistogram[(int)(camWb[2] * d)]++;
|
||||||
if (d > 64000.) {
|
if (d <= clipval) {
|
||||||
continue;
|
pixSum[2] += d;
|
||||||
|
n[2]++;
|
||||||
}
|
}
|
||||||
|
|
||||||
avg_b += d;
|
|
||||||
bn++;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else { /* if(ri->getSensorType()==ST_FOVEON) */
|
} else { /* if(ri->getSensorType()==ST_FOVEON) */
|
||||||
for (int j = start; j < end; j++) {
|
for (int j = start; j < end; j++) {
|
||||||
double d = tpp->defGain * image[i * width + j][0];
|
double r = image[i * width + j][0];
|
||||||
|
if (r <= clipval) {
|
||||||
if (d <= 64000.) {
|
pixSum[0] += r;
|
||||||
avg_r += d;
|
n[0]++;
|
||||||
rn++;
|
|
||||||
}
|
}
|
||||||
|
double g = image[i * width + j][1];
|
||||||
d = tpp->defGain * image[i * width + j][1];
|
if (g <= clipval) {
|
||||||
|
pixSum[1] += g;
|
||||||
if (d <= 64000.) {
|
n[1]++;
|
||||||
avg_g += d;
|
|
||||||
gn++;
|
|
||||||
}
|
}
|
||||||
|
tpp->aeHistogram[((int)g) >> tpp->aeHistCompression] += add;
|
||||||
d = tpp->defGain * image[i * width + j][2];
|
double b = image[i * width + j][2];
|
||||||
|
if (b <= clipval) {
|
||||||
if (d <= 64000.) {
|
pixSum[2] += b;
|
||||||
avg_b += d;
|
n[2]++;
|
||||||
bn++;
|
|
||||||
}
|
}
|
||||||
|
tpp->aeHistogram[((int) (b * 0.5f)) >> tpp->aeHistCompression] += add;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
double reds = avg_r / std::max(rn, 1u) * tpp->camwbRed;
|
if (ri->get_colors() == 1) {
|
||||||
double greens = avg_g / std::max(gn, 1u) * tpp->camwbGreen;
|
pixSum[0] = pixSum[1] = pixSum[2] = 1.;
|
||||||
double blues = avg_b / std::max(bn, 1u) * tpp->camwbBlue;
|
n[0] = n[1] = n[2] = 1;
|
||||||
|
}
|
||||||
|
pixSum[0] *= tpp->defGain;
|
||||||
|
pixSum[1] *= tpp->defGain;
|
||||||
|
pixSum[2] *= tpp->defGain;
|
||||||
|
|
||||||
|
double reds = pixSum[0] / std::max(n[0], 1u) * tpp->camwbRed;
|
||||||
|
double greens = pixSum[1] / std::max(n[1], 1u) * tpp->camwbGreen;
|
||||||
|
double blues = pixSum[2] / std::max(n[2], 1u) * tpp->camwbBlue;
|
||||||
|
|
||||||
tpp->redAWBMul = ri->get_rgb_cam (0, 0) * reds + ri->get_rgb_cam (0, 1) * greens + ri->get_rgb_cam (0, 2) * blues;
|
tpp->redAWBMul = ri->get_rgb_cam (0, 0) * reds + ri->get_rgb_cam (0, 1) * greens + ri->get_rgb_cam (0, 2) * blues;
|
||||||
tpp->greenAWBMul = ri->get_rgb_cam (1, 0) * reds + ri->get_rgb_cam (1, 1) * greens + ri->get_rgb_cam (1, 2) * blues;
|
tpp->greenAWBMul = ri->get_rgb_cam (1, 0) * reds + ri->get_rgb_cam (1, 1) * greens + ri->get_rgb_cam (1, 2) * blues;
|
||||||
|
Reference in New Issue
Block a user