ipa: ipu3: Rework IPAFrameContext

Currently, IPAFrameContext consolidates the values computed by the
active state of the algorithms, along with the values applied on
the sensor.

Moving ahead, we want to have a frame context associated with each
incoming request (or frame to be captured). This shouldn't necessarily
be tied to "active state" of the algorithms hence:

- Rename current IPAFrameContext -> IPAActiveState
  This will now reflect the latest active state of the algorithms and
  has nothing to do with any frame-related ops/values.

- Re-instate IPAFrameContext with a sub-structure 'sensor' currently
  storing the exposure and gain value.

Adapt the various access to the frame context to the new changes
as described above.

Subsequently, the re-instated IPAFrameContext will be extended to
contain a frame number and ControlList to remember the incoming
request controls provided by the application. A ring-buffer will
be introduced to store these frame contexts for a certain number
of frames.

Signed-off-by: Umang Jain <umang.jain@ideasonboard.com>
Reviewed-by: Jacopo Mondi <jacopo@jmondi.org>
Reviewed-by: Jean-Michel Hautbois <jeanmichel.hautbois@ideasonboard.com>
Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
This commit is contained in:
Umang Jain
2022-05-06 15:23:06 +05:30
committed by Kieran Bingham
parent e0766fa205
commit bab437df1f
8 changed files with 113 additions and 95 deletions
+51 -39
View File
@@ -24,19 +24,31 @@ namespace libcamera::ipa::ipu3 {
* may also be updated in the start() operation.
*/
/**
* \struct IPAActiveState
* \brief The active state of the IPA algorithms
*
* The IPA is fed with the statistics generated from the latest frame captured
* by the hardware. The statistics are then processed by the IPA algorithms to
* compute ISP parameters required for the next frame capture. The current state
* of the algorithms is reflected through the IPAActiveState to store the values
* most recently computed by the IPA algorithms.
*/
/**
* \struct IPAFrameContext
* \brief Per-frame context for algorithms
* \brief Context for a frame
*
* The frame context stores data specific to a single frame processed by the
* IPA. Each frame processed by the IPA has a context associated with it,
* accessible through the IPAContext structure.
*
* \todo Detail how to access contexts for a particular frame
*
* Each of the fields in the frame context belongs to either a specific
* algorithm, or to the top-level IPA module. A field may be read by any
* algorithm, but should only be written by its owner.
* Fields in the frame context should reflect values and controls
* associated with the specific frame as requested by the application, and
* as configured by the hardware. Fields can be read by algorithms to
* determine if they should update any specific action for this frame, and
* finally to update the metadata control lists when the frame is fully
* completed.
*/
/**
@@ -49,10 +61,10 @@ namespace libcamera::ipa::ipu3 {
* \var IPAContext::frameContext
* \brief The frame context for the frame being processed
*
* \todo While the frame context is supposed to be per-frame, this
* single frame context stores data related to both the current frame
* and the previous frames, with fields being updated as the algorithms
* are run. This needs to be turned into real per-frame data storage.
* \var IPAContext::activeState
* \brief The current state of IPA algorithms
*
* \todo The frame context needs to be turned into real per-frame data storage.
*/
/**
@@ -78,17 +90,17 @@ namespace libcamera::ipa::ipu3 {
*/
/**
* \var IPAFrameContext::af
* \var IPAActiveState::af
* \brief Context for the Automatic Focus algorithm
*
* \struct IPAFrameContext::af
* \var IPAFrameContext::af.focus
* \struct IPAActiveState::af
* \var IPAActiveState::af.focus
* \brief Current position of the lens
*
* \var IPAFrameContext::af.maxVariance
* \var IPAActiveState::af.maxVariance
* \brief The maximum variance of the current image.
*
* \var IPAFrameContext::af.stable
* \var IPAActiveState::af.stable
* \brief It is set to true, if the best focus is found.
*/
@@ -121,44 +133,58 @@ namespace libcamera::ipa::ipu3 {
*/
/**
* \var IPAFrameContext::agc
* \var IPAActiveState::agc
* \brief Context for the Automatic Gain Control algorithm
*
* The exposure and gain determined are expected to be applied to the sensor
* at the earliest opportunity.
*
* \var IPAFrameContext::agc.exposure
* \var IPAActiveState::agc.exposure
* \brief Exposure time expressed as a number of lines
*
* \var IPAFrameContext::agc.gain
* \var IPAActiveState::agc.gain
* \brief Analogue gain multiplier
*
* The gain should be adapted to the sensor specific gain code before applying.
*/
/**
* \var IPAFrameContext::awb
* \var IPAActiveState::awb
* \brief Context for the Automatic White Balance algorithm
*
* \struct IPAFrameContext::awb.gains
* \struct IPAActiveState::awb.gains
* \brief White balance gains
*
* \var IPAFrameContext::awb.gains.red
* \var IPAActiveState::awb.gains.red
* \brief White balance gain for R channel
*
* \var IPAFrameContext::awb.gains.green
* \var IPAActiveState::awb.gains.green
* \brief White balance gain for G channel
*
* \var IPAFrameContext::awb.gains.blue
* \var IPAActiveState::awb.gains.blue
* \brief White balance gain for B channel
*
* \var IPAFrameContext::awb.temperatureK
* \var IPAActiveState::awb.temperatureK
* \brief Estimated color temperature
*/
/**
* \var IPAActiveState::toneMapping
* \brief Context for ToneMapping and Gamma control
*
* \var IPAActiveState::toneMapping.gamma
* \brief Gamma value for the LUT
*
* \var IPAActiveState::toneMapping.gammaCorrection
* \brief Per-pixel tone mapping implemented as a LUT
*
* The LUT structure is defined by the IPU3 kernel interface. See
* <linux/intel-ipu3.h> struct ipu3_uapi_gamma_corr_lut for further details.
*/
/**
* \var IPAFrameContext::sensor
* \brief Effective sensor values
* \brief Effective sensor values that were applied for the frame
*
* \var IPAFrameContext::sensor.exposure
* \brief Exposure time expressed as a number of lines
@@ -167,18 +193,4 @@ namespace libcamera::ipa::ipu3 {
* \brief Analogue gain multiplier
*/
/**
* \var IPAFrameContext::toneMapping
* \brief Context for ToneMapping and Gamma control
*
* \var IPAFrameContext::toneMapping.gamma
* \brief Gamma value for the LUT
*
* \var IPAFrameContext::toneMapping.gammaCorrection
* \brief Per-pixel tone mapping implemented as a LUT
*
* The LUT structure is defined by the IPU3 kernel interface. See
* <linux/intel-ipu3.h> struct ipu3_uapi_gamma_corr_lut for further details.
*/
} /* namespace libcamera::ipa::ipu3 */