libcamera: software_isp: Use RGB type to represent gains
Rather than using a custom struct to represent RGB values, let's use the corresponding type and its facilities. Signed-off-by: Milan Zamazal <mzamazal@redhat.com> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Signed-off-by: Milan Zamazal <mzamazal@redhat.com> Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com> Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
This commit is contained in:
parent
84f82c6b3c
commit
94e849bcf7
3 changed files with 16 additions and 22 deletions
|
@ -25,7 +25,7 @@ int Awb::configure(IPAContext &context,
|
||||||
[[maybe_unused]] const IPAConfigInfo &configInfo)
|
[[maybe_unused]] const IPAConfigInfo &configInfo)
|
||||||
{
|
{
|
||||||
auto &gains = context.activeState.awb.gains;
|
auto &gains = context.activeState.awb.gains;
|
||||||
gains.red = gains.green = gains.blue = 1.0;
|
gains = { { 1.0, 1.0, 1.0 } };
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -56,16 +56,18 @@ void Awb::process(IPAContext &context,
|
||||||
* Clamp max gain at 4.0, this also avoids 0 division.
|
* Clamp max gain at 4.0, this also avoids 0 division.
|
||||||
*/
|
*/
|
||||||
auto &gains = context.activeState.awb.gains;
|
auto &gains = context.activeState.awb.gains;
|
||||||
gains.red = sumR <= sumG / 4 ? 4.0 : static_cast<double>(sumG) / sumR;
|
gains = { {
|
||||||
gains.blue = sumB <= sumG / 4 ? 4.0 : static_cast<double>(sumG) / sumB;
|
sumR <= sumG / 4 ? 4.0 : static_cast<double>(sumG) / sumR,
|
||||||
/* Green gain is fixed to 1.0 */
|
1.0,
|
||||||
|
sumB <= sumG / 4 ? 4.0 : static_cast<double>(sumG) / sumB,
|
||||||
|
} };
|
||||||
|
|
||||||
RGB<double> rgbGains{ { 1 / gains.red, 1 / gains.green, 1 / gains.blue } };
|
RGB<double> rgbGains{ { 1 / gains.r(), 1 / gains.g(), 1 / gains.b() } };
|
||||||
context.activeState.awb.temperatureK = estimateCCT(rgbGains);
|
context.activeState.awb.temperatureK = estimateCCT(rgbGains);
|
||||||
|
|
||||||
LOG(IPASoftAwb, Debug)
|
LOG(IPASoftAwb, Debug)
|
||||||
<< "gain R/B: " << gains.red << "/" << gains.blue
|
<< "gain R/B: " << gains << "; temperature: "
|
||||||
<< "; temperature: " << context.activeState.awb.temperatureK;
|
<< context.activeState.awb.temperatureK;
|
||||||
}
|
}
|
||||||
|
|
||||||
REGISTER_IPA_ALGORITHM(Awb, "Awb")
|
REGISTER_IPA_ALGORITHM(Awb, "Awb")
|
||||||
|
|
|
@ -103,16 +103,10 @@ void Lut::prepare(IPAContext &context,
|
||||||
const double div = static_cast<double>(DebayerParams::kRGBLookupSize) /
|
const double div = static_cast<double>(DebayerParams::kRGBLookupSize) /
|
||||||
gammaTableSize;
|
gammaTableSize;
|
||||||
/* Apply gamma after gain! */
|
/* Apply gamma after gain! */
|
||||||
unsigned int idx;
|
const RGB<double> lutGains = (gains * i / div).min(gammaTableSize - 1);
|
||||||
idx = std::min({ static_cast<unsigned int>(i * gains.red / div),
|
params->red[i] = gammaTable[static_cast<unsigned int>(lutGains.r())];
|
||||||
gammaTableSize - 1 });
|
params->green[i] = gammaTable[static_cast<unsigned int>(lutGains.g())];
|
||||||
params->red[i] = gammaTable[idx];
|
params->blue[i] = gammaTable[static_cast<unsigned int>(lutGains.b())];
|
||||||
idx = std::min({ static_cast<unsigned int>(i * gains.green / div),
|
|
||||||
gammaTableSize - 1 });
|
|
||||||
params->green[i] = gammaTable[idx];
|
|
||||||
idx = std::min({ static_cast<unsigned int>(i * gains.blue / div),
|
|
||||||
gammaTableSize - 1 });
|
|
||||||
params->blue[i] = gammaTable[idx];
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -13,6 +13,8 @@
|
||||||
|
|
||||||
#include <libcamera/controls.h>
|
#include <libcamera/controls.h>
|
||||||
|
|
||||||
|
#include "libcamera/internal/vector.h"
|
||||||
|
|
||||||
#include <libipa/fc_queue.h>
|
#include <libipa/fc_queue.h>
|
||||||
|
|
||||||
namespace libcamera {
|
namespace libcamera {
|
||||||
|
@ -36,11 +38,7 @@ struct IPAActiveState {
|
||||||
} blc;
|
} blc;
|
||||||
|
|
||||||
struct {
|
struct {
|
||||||
struct {
|
RGB<double> gains;
|
||||||
double red;
|
|
||||||
double green;
|
|
||||||
double blue;
|
|
||||||
} gains;
|
|
||||||
unsigned int temperatureK;
|
unsigned int temperatureK;
|
||||||
} awb;
|
} awb;
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue