Hi Loic, et.al,
On 24-Jul-26 14:42, Loic Poulain wrote:
> Add the uapi header camss-ope-config.h defining the ISP parameter
> structures used by the CAMSS Offline Processing Engine (OPE) driver.
> This includes structures for white balance, chroma enhancement and
> color correction configuration.
>
> Signed-off-by: Loic Poulain <[email protected]>
> ---
> include/uapi/linux/camss-ope-config.h | 160 ++++++++++++++++++++++++++++++++++
> 1 file changed, 160 insertions(+)
>
> diff --git a/include/uapi/linux/camss-ope-config.h b/include/uapi/linux/camss-ope-config.h
> new file mode 100644
> index 0000000000000000000000000000000000000000..800e6ef1dba218ca33b565e1e51d6647f02f8753
> --- /dev/null
> +++ b/include/uapi/linux/camss-ope-config.h
> @@ -0,0 +1,160 @@
> +/* SPDX-License-Identifier: GPL-2.0-only WITH Linux-syscall-note */
> +/*
> + * Qualcomm CAMSS Offline Processing Engine (OPE) ISP parameters UAPI
> + *
> + * Uses the generic V4L2 extensible ISP parameters buffer format defined in
> + * <uapi/linux/media/v4l2-isp.h>.
> + *
> + * Copyright (c) Qualcomm Technologies, Inc. and/or its subsidiaries.
> + */
> +
> +#ifndef _UAPI_LINUX_CAMSS_OPE_CONFIG_H
> +#define _UAPI_LINUX_CAMSS_OPE_CONFIG_H
> +
> +#include <linux/types.h>
> +#include <linux/media/v4l2-isp.h>
> +
> +/**
> + * enum camss_ope_params_block_type - CAMSS ISP parameter block identifiers
> + *
> + * Each value identifies one ISP processing block. The value is placed in
> + * the @type field of &struct v4l2_isp_params_block_header.
> + */
> +enum camss_ope_params_block_type {
> + CAMSS_OPE_PARAMS_WB_GAIN = 1,
> + CAMSS_OPE_PARAMS_CHROMA_ENHAN = 2,
> + CAMSS_OPE_PARAMS_COLOR_CORRECT = 3,
> +};
I don't think we want this enum to be OPE specific. The whole idea behind
the extensible ISP parameters is that there is a single set of parameter
definitions spanning multiple ISP generations.
There is going to be a mirroring patch for libcamera defining some C++
magic around this header:
https://patchwork.libcamera.org/patch/27430/
and this will be used in the camss libcamera IPA and we don't want to
have one version of the libcamera wrapper per ISP "generation".
So I think this should all be moved back to a generic camss-config.h
(or maybe camss-parameters.h ?) and then if for the planned Hamoa /
Monoca inline ISP work of we need say a new version of CAMSS_PARAMS_WB_GAIN
just add a CAMSS_OPE_PARAMS_WB_GAIN_V2 for that.
That is the whole idea behind the extensible params, otherwise libcamera
will effectively need to have 1 IPA per ISP generation / type which is
not what we want.
Regards,
Hans
> +
> +/**
> + * struct camss_ope_params_wb_gain - White Balance gains
> + *
> + * Implements the CLC_WB pipeline module. The pipeline applies three
> + * sequential operations per channel:
> + * 1. Subtract sub-offset (black-level subtraction)
> + * 2. Multiply by gain (colour balance)
> + * 3. Add add-offset (output pedestal)
> + *
> + * Gains are 15uQ10 (15-bit unsigned, 10 fractional bits). Offsets
> + * are 16-bit unsigned, normalised to full input scale (65535 = 1.0)
> + *
> + * @header: block header; @header.type = CAMSS_OPE_PARAMS_WB_GAIN
> + * @g_gain: green channel gain (15uQ10, 1024 = 1.0)
> + * @b_gain: blue channel gain (15uQ10, 1024 = 1.0)
> + * @r_gain: red channel gain (15uQ10, 1024 = 1.0)
> + * @g_sub: green sub-offset, subtracted before gain (16u)
> + * @b_sub: blue sub-offset, subtracted before gain (16u)
> + * @r_sub: red sub-offset, subtracted before gain (16u)
> + * @g_add: green add-offset, added after gain (16u)
> + * @b_add: blue add-offset, added after gain (16u)
> + * @r_add: red add-offset, added after gain (16u)
> + */
> +struct camss_ope_params_wb_gain {
> + struct v4l2_isp_params_block_header header;
> + __u16 g_gain;
> + __u16 b_gain;
> + __u16 r_gain;
> + __u16 g_sub;
> + __u16 b_sub;
> + __u16 r_sub;
> + __u16 g_add;
> + __u16 b_add;
> + __u16 r_add;
> + __u16 _pad[3];
> +} __attribute__((aligned(8)));
> +
> +/**
> + * struct camss_ope_params_chroma_enhan - RGB to YUV colour transfer matrix
> + *
> + * Implements the CLC_CHROMA_ENHAN pipeline module. All coefficients are
> + * signed 12-bit fixed-point Q3.8 (range roughly -8.0 to +7.996).
> + *
> + * RGB2Y - Luma (Y) coefficients
> + * Y = v0 * R + v1 * G + v2 * B
> + *
> + * @luma_v0: R-to-Y coefficient (12sQ8)
> + * @luma_v1: G-to-Y coefficient (12sQ8)
> + * @luma_v2: B-to-Y coefficient (12sQ8)
> + * @luma_k: Y output offset (9s, 0 = no offset)
> + *
> + * RGB2Cb - Chroma (Cb) coefficients
> + * Cb = a x ((B - G) + b(R - G)) + KCb
> + * with:
> + * a = ap, when (B-G) + b(R-G) > 0; a = am, when (B-G) + b(R-G) ≤ 0;
> + * b = bp when (R-G) > 0; b = bm when (R-G) ≤ 0
> + *
> + * @coeff_ap: Cb positive coefficient (12sQ8)
> + * @coeff_am: Cb negative coefficient (12sQ8)
> + * @coeff_bp: Cb positive coefficient (12sQ8)
> + * @coeff_bm: Cb negative coefficient (12sQ8)
> + * @kcb: Cb output offset (11s)
> + *
> + * RGB2Cr - Chroma (Cr) coefficients:
> + * Cr = c x ((R - G) + d(B - G)) + KCr
> + * with:
> + * c = cp, when (R-G) + d(B-G) > 0; c = cm, when (R-G) + d(B-G) ≤ 0
> + * d = dp when (B-G) > 0; d = dm when (B-G) ≤ 0
> + *
> + * @coeff_cp: Cr positive coefficient (12sQ8)
> + * @coeff_cm: Cr negative coefficient (12sQ8)
> + * @coeff_dp: Cr positive coefficient (12sQ8)
> + * @coeff_dm: Cr negative coefficient (12sQ8)
> + * @kcr: Cr output offset (11s)
> + *
> + * @header: generic block header; @header.type = CAMSS_OPE_PARAMS_CHROMA_ENHAN
> + */
> +struct camss_ope_params_chroma_enhan {
> + struct v4l2_isp_params_block_header header;
> + __u16 luma_v0;
> + __u16 luma_v1;
> + __u16 luma_v2;
> + __u16 luma_k;
> + __u16 coeff_ap;
> + __u16 coeff_am;
> + __u16 coeff_bp;
> + __u16 coeff_bm;
> + __u16 coeff_cp;
> + __u16 coeff_cm;
> + __u16 coeff_dp;
> + __u16 coeff_dm;
> + __u16 kcb;
> + __u16 kcr;
> + __u16 _pad[2];
> +} __attribute__((aligned(8)));
> +
> +/**
> + * struct camss_ope_params_color_correct - colour correction matrix
> + *
> + * Implements the CLC_CC pipeline module. The matrix computes:
> + * Out_ch0 (G) = a0*G + b0*B + c0*R + k0
> + * Out_ch1 (B) = a1*G + b1*B + c1*R + k1
> + * Out_ch2 (R) = a2*G + b2*B + c2*R + k2
> + *
> + * @header: block header; @header.type = CAMSS_OPE_PARAMS_COLOR_CORRECT
> + * @a: G-input coefficients per output channel (12s;
> + * a[0]=Out_G, a[1]=Out_B, a[2]=Out_R)
> + * @b: B-input coefficients (12s)
> + * @c: R-input coefficients (12s)
> + * @k: per-output-channel offsets (typically 9s effective)
> + * @qfactor: Q-format selector (2u):
> + * 0 = 12sQ7 (range ~-16.0 .. +15.992)
> + * 1 = 12sQ8 (range ~-8.0 .. +7.996)
> + * 2 = 12sQ9 (range ~-4.0 .. +3.998)
> + * 3 = 12sQ10 (range ~-2.0 .. +1.999)
> + */
> +struct camss_ope_params_color_correct {
> + struct v4l2_isp_params_block_header header;
> + __u16 a[3];
> + __u16 b[3];
> + __u16 c[3];
> + __u16 k[3];
> + __u16 qfactor;
> + __u16 _pad[3];
> +} __attribute__((aligned(8)));
> +
> +#define CAMSS_OPE_PARAMS_MAX_PAYLOAD \
> + (sizeof(struct camss_ope_params_wb_gain) +\
> + sizeof(struct camss_ope_params_chroma_enhan) +\
> + sizeof(struct camss_ope_params_color_correct))
> +
> +#endif /* _UAPI_LINUX_CAMSS_OPE_CONFIG_H */
>
lmpx.com only provides a reader for public news (NNTP) servers. It is not
affiliated with the servers or forums shown here and is not responsible for
the content of articles, which is written by their respective authors.