@@ -12,6 +12,7 @@
#include <libcamera/base/log.h>
+#include "libipa/colours.h"
#include "simple/ipa_context.h"
namespace libcamera {
@@ -23,7 +24,7 @@ namespace ipa::soft::algorithms {
int Awb::configure(IPAContext &context,
[[maybe_unused]] const IPAConfigInfo &configInfo)
{
- auto &gains = context.activeState.gains;
+ auto &gains = context.activeState.awb.gains;
gains.red = gains.green = gains.blue = 1.0;
return 0;
@@ -54,12 +55,18 @@ void Awb::process(IPAContext &context,
* Calculate red and blue gains for AWB.
* Clamp max gain at 4.0, this also avoids 0 division.
*/
- auto &gains = context.activeState.gains;
+ auto &gains = context.activeState.awb.gains;
gains.red = sumR <= sumG / 4 ? 4.0 : static_cast<double>(sumG) / sumR;
gains.blue = sumB <= sumG / 4 ? 4.0 : static_cast<double>(sumG) / sumB;
/* Green gain is fixed to 1.0 */
- LOG(IPASoftAwb, Debug) << "gain R/B " << gains.red << "/" << gains.blue;
+ RGB<double> rgbGains{ { 1 / gains.red, 1 / gains.green, 1 / gains.blue } };
+ uint32_t temperature = estimateCCT(rgbGains);
+ context.activeState.awb.temperatureK = temperature;
+
+ LOG(IPASoftAwb, Debug)
+ << "gain R/B: " << gains.red << "/" << gains.blue
+ << "; temperature: " << context.activeState.awb.temperatureK;
}
REGISTER_IPA_ALGORITHM(Awb, "Awb")
@@ -95,7 +95,7 @@ void Lut::prepare(IPAContext &context,
context.activeState.gamma.contrast != context.activeState.knobs.contrast)
updateGammaTable(context);
- auto &gains = context.activeState.gains;
+ auto &gains = context.activeState.awb.gains;
auto &gammaTable = context.activeState.gamma.gammaTable;
const unsigned int gammaTableSize = gammaTable.size();
@@ -36,10 +36,13 @@ struct IPAActiveState {
} blc;
struct {
- double red;
- double green;
- double blue;
- } gains;
+ struct {
+ double red;
+ double green;
+ double blue;
+ } gains;
+ unsigned int temperatureK;
+ } awb;
static constexpr unsigned int kGammaLookupSize = 1024;
struct {