1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
|
/* SPDX-License-Identifier: LGPL-2.1-or-later */
/*
* Copyright (C) 2024, Ideas On Board
*
* lux.cpp - RkISP1 Lux control
*/
#include "lux.h"
#include <libcamera/base/log.h>
#include <libcamera/control_ids.h>
#include "libipa/histogram.h"
#include "libipa/lux.h"
/**
* \file lux.h
*/
namespace libcamera {
namespace ipa::rkisp1::algorithms {
/**
* \class Lux
* \brief RkISP1 Lux control
*
* The Lux algorithm is responsible for estimating the lux level of the image.
* It doesn't take or generate any controls, but it provides a lux level for
* other algorithms (such as AGC) to use.
*/
/**
* \brief Construct an rkisp1 Lux algo module
*
* The Lux helper is initialized to 65535 as that is the max bin count on the
* rkisp1.
*/
Lux::Lux()
: lux_(65535)
{
}
/**
* \copydoc libcamera::ipa::Algorithm::init
*/
int Lux::init([[maybe_unused]] IPAContext &context, const YamlObject &tuningData)
{
return lux_.parseTuningData(tuningData);
}
/**
* \copydoc libcamera::ipa::Algorithm::process
*/
void Lux::process(IPAContext &context,
[[maybe_unused]] const uint32_t frame,
IPAFrameContext &frameContext,
const rkisp1_stat_buffer *stats,
ControlList &metadata)
{
utils::Duration exposureTime = context.configuration.sensor.lineDuration
* frameContext.sensor.exposure;
double gain = frameContext.sensor.gain;
/* \todo Deduplicate the histogram calculation from AGC */
const rkisp1_cif_isp_stat *params = &stats->params;
Histogram yHist({ params->hist.hist_bins, context.hw->numHistogramBins },
[](uint32_t x) { return x >> 4; });
double lux = lux_.estimateLux(exposureTime, gain, 1.0, yHist);
frameContext.lux.lux = lux;
metadata.set(controls::Lux, lux);
}
REGISTER_IPA_ALGORITHM(Lux, "Lux")
} /* namespace ipa::rkisp1::algorithms */
} /* namespace libcamera */
|