mirror of
https://git.libcamera.org/libcamera/libcamera.git
synced 2025-07-14 16:09:51 +03:00
libcamera: software_isp: Use floating point for color parameters
It's more natural to represent color gains as floating point numbers rather than using a particular pixel-related representation. double is used rather than float because it's a more common floating point type in libcamera algorithms. Otherwise there is no obvious reason to select one over the other here. The constructed color tables still use integer representation for efficiency. Black level still uses pixel (integer) values, for consistency with other libcamera parts. Signed-off-by: Milan Zamazal <mzamazal@redhat.com> Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com> Reviewed-by: Umang Jain <umang.jain@ideasonboard.com> Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
This commit is contained in:
parent
7fab2062d8
commit
8c84efa486
3 changed files with 15 additions and 13 deletions
|
@ -24,7 +24,7 @@ int Awb::configure(IPAContext &context,
|
||||||
[[maybe_unused]] const IPAConfigInfo &configInfo)
|
[[maybe_unused]] const IPAConfigInfo &configInfo)
|
||||||
{
|
{
|
||||||
auto &gains = context.activeState.gains;
|
auto &gains = context.activeState.gains;
|
||||||
gains.red = gains.green = gains.blue = 256;
|
gains.red = gains.green = gains.blue = 1.0;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -53,12 +53,11 @@ void Awb::process(IPAContext &context,
|
||||||
/*
|
/*
|
||||||
* Calculate red and blue gains for AWB.
|
* Calculate red and blue gains for AWB.
|
||||||
* Clamp max gain at 4.0, this also avoids 0 division.
|
* Clamp max gain at 4.0, this also avoids 0 division.
|
||||||
* Gain: 128 = 0.5, 256 = 1.0, 512 = 2.0, etc.
|
|
||||||
*/
|
*/
|
||||||
auto &gains = context.activeState.gains;
|
auto &gains = context.activeState.gains;
|
||||||
gains.red = sumR <= sumG / 4 ? 1024 : 256 * sumG / sumR;
|
gains.red = sumR <= sumG / 4 ? 4.0 : static_cast<double>(sumG) / sumR;
|
||||||
gains.blue = sumB <= sumG / 4 ? 1024 : 256 * sumG / sumB;
|
gains.blue = sumB <= sumG / 4 ? 4.0 : static_cast<double>(sumG) / sumB;
|
||||||
/* Green gain is fixed to 256 */
|
/* Green gain is fixed to 1.0 */
|
||||||
|
|
||||||
LOG(IPASoftAwb, Debug) << "gain R/B " << gains.red << "/" << gains.blue;
|
LOG(IPASoftAwb, Debug) << "gain R/B " << gains.red << "/" << gains.blue;
|
||||||
}
|
}
|
||||||
|
|
|
@ -63,15 +63,18 @@ void Lut::prepare(IPAContext &context,
|
||||||
const unsigned int gammaTableSize = gammaTable.size();
|
const unsigned int gammaTableSize = gammaTable.size();
|
||||||
|
|
||||||
for (unsigned int i = 0; i < DebayerParams::kRGBLookupSize; i++) {
|
for (unsigned int i = 0; i < DebayerParams::kRGBLookupSize; i++) {
|
||||||
const unsigned int div = static_cast<double>(DebayerParams::kRGBLookupSize) *
|
const double div = static_cast<double>(DebayerParams::kRGBLookupSize) /
|
||||||
256 / gammaTableSize;
|
gammaTableSize;
|
||||||
/* Apply gamma after gain! */
|
/* Apply gamma after gain! */
|
||||||
unsigned int idx;
|
unsigned int idx;
|
||||||
idx = std::min({ i * gains.red / div, gammaTableSize - 1 });
|
idx = std::min({ static_cast<unsigned int>(i * gains.red / div),
|
||||||
|
gammaTableSize - 1 });
|
||||||
params->red[i] = gammaTable[idx];
|
params->red[i] = gammaTable[idx];
|
||||||
idx = std::min({ i * gains.green / div, gammaTableSize - 1 });
|
idx = std::min({ static_cast<unsigned int>(i * gains.green / div),
|
||||||
|
gammaTableSize - 1 });
|
||||||
params->green[i] = gammaTable[idx];
|
params->green[i] = gammaTable[idx];
|
||||||
idx = std::min({ i * gains.blue / div, gammaTableSize - 1 });
|
idx = std::min({ static_cast<unsigned int>(i * gains.blue / div),
|
||||||
|
gammaTableSize - 1 });
|
||||||
params->blue[i] = gammaTable[idx];
|
params->blue[i] = gammaTable[idx];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -26,9 +26,9 @@ struct IPAActiveState {
|
||||||
} blc;
|
} blc;
|
||||||
|
|
||||||
struct {
|
struct {
|
||||||
unsigned int red;
|
double red;
|
||||||
unsigned int green;
|
double green;
|
||||||
unsigned int blue;
|
double blue;
|
||||||
} gains;
|
} gains;
|
||||||
|
|
||||||
static constexpr unsigned int kGammaLookupSize = 1024;
|
static constexpr unsigned int kGammaLookupSize = 1024;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue