2.13.1. V4L2_META_FMT_C3ISP_STATS (‘C3ST’), V4L2_META_FMT_C3ISP_PARAMS (‘C3PM’)

2.13.1.1. 3A 统计

C3 ISP 可以收集输入 Bayer 帧的不同统计信息。这些统计信息从“c3-isp-stats”元数据捕获视频节点获得,使用 v4l2_meta_format 接口。它们的格式由 c3_isp_stats_info 结构描述。

收集的统计信息是自动白平衡、自动曝光和自动对焦信息。

2.13.1.2. 配置参数

配置参数被传递到 c3-isp-params 元数据输出视频节点,使用 v4l2_meta_format 接口。对于 C3-ISP 的参数,不是单个包含 ISP 每个可配置区域的子结构的结构,而是被定义为不同的结构或“块”,可以添加到 c3_isp_params_cfg 的数据成员中。用户空间负责使用驱动程序需要配置的块填充数据成员,但不需要填充所有块,或者如果没有配置更改,则根本不需要填充任何块。填充的块必须在缓冲区中是连续的。为了帮助用户空间和驱动程序识别块,每个块特定的结构都嵌入了 c3_isp_params_block_header 作为其第一个成员,并且用户空间必须使用来自 c3_isp_params_block_type 的值填充 type 成员。一旦这些块被填充到数据缓冲区中,所有填充的块的总大小应设置在 c3_isp_params_cfg 的 data_size 成员中。例如

struct c3_isp_params_cfg *params =
        (struct c3_isp_params_cfg *)buffer;

params->version = C3_ISP_PARAM_BUFFER_V0;
params->data_size = 0;

void *data = (void *)params->data;

struct c3_isp_params_awb_gains *gains =
        (struct c3_isp_params_awb_gains *)data;

gains->header.type = C3_ISP_PARAMS_BLOCK_AWB_GAINS;
gains->header.flags = C3_ISP_PARAMS_BLOCK_FL_ENABLE;
gains->header.size = sizeof(struct c3_isp_params_awb_gains);

gains->gr_gain = 256;
gains->r_gain = 256;
gains->b_gain = 256;
gains->gb_gain = 256;

data += sizeof(struct c3_isp__params_awb_gains);
params->data_size += sizeof(struct c3_isp_params_awb_gains);

struct c3_isp_params_awb_config *awb_cfg =
        (struct c3_isp_params_awb_config *)data;

awb_cfg->header.type = C3_ISP_PARAMS_BLOCK_AWB_CONFIG;
awb_cfg->header.flags = C3_ISP_PARAMS_BLOCK_FL_ENABLE;
awb_cfg->header.size = sizeof(struct c3_isp_params_awb_config);

awb_cfg->tap_point = C3_ISP_AWB_STATS_TAP_BEFORE_WB;
awb_cfg->satur = 1;
awb_cfg->horiz_zones_num = 32;
awb_cfg->vert_zones_num = 24;

params->data_size += sizeof(struct c3_isp_params_awb_config);

2.13.1.3. Amlogic C3 ISP uAPI 数据类型

struct c3_isp_awb_zone_stats

区域的 AWB 统计信息

定义:

struct c3_isp_awb_zone_stats {
    __u16 rg;
    __u16 bg;
    __u32 pixel_sum;
};

成员

rg

区域中 R / G 的比率

bg

区域中 B / G 的比率

pixel_sum

区域中使用的像素总数

描述

AWB 区域统计与 8 个字节对齐

struct c3_isp_awb_stats

自动白平衡统计信息。

定义:

struct c3_isp_awb_stats {
    struct c3_isp_awb_zone_stats stats[C3_ISP_AWB_MAX_ZONES];
};

成员

stats

自动白平衡统计信息数组

描述

所有区域的 AWB 统计信息。

struct c3_isp_ae_zone_stats

区域的 AE 统计信息

定义:

struct c3_isp_ae_zone_stats {
    __u16 hist0;
    __u16 hist1;
    __u16 hist3;
    __u16 hist4;
};

成员

hist0

bin 0 的全局归一化像素计数

hist1

bin 1 的全局归一化像素计数

hist3

bin 3 的全局归一化像素计数

hist4

bin 4 的全局归一化像素计数

描述

AE 区域统计与 8 个字节对齐。这是一个 5-bin 直方图,总和归一化为 0xffff。因此 hist2 = 0xffff - (hist0 + hist1 + hist3 + hist4)

struct c3_isp_ae_stats

曝光统计信息

定义:

struct c3_isp_ae_stats {
    struct c3_isp_ae_zone_stats stats[C3_ISP_AE_MAX_ZONES];
    __u32 reserved[2];
    __u32 hist[1024];
};

成员

stats

自动曝光块统计信息数组

reserved

未定义的缓冲区空间

hist

整个图像的 1024-bin 直方图

描述

AE 统计信息由所有块信息和 1024-bin 直方图组成。

struct c3_isp_af_zone_stats

区域的 AF 统计信息

定义:

struct c3_isp_af_zone_stats {
    __u16 i2_mat;
    __u16 i4_mat;
    __u16 e4_mat;
    __u16 e4_exp : 5;
    __u16 i2_exp : 5;
    __u16 i4_exp : 6;
};

成员

i2_mat

区域平方图像像素和的尾数

i4_mat

区域四次图像像素和的尾数

e4_mat

区域多向四次边缘和的尾数

e4_exp

区域多向四次边缘和的指数

i2_exp

区域平方图像像素和的指数

i4_exp

区域四次图像像素和的指数

描述

AF 区域统计与 8 个字节对齐。区域累积对比度指标以浮点格式存储,具有 16 位尾数和 5 或 6 位指数。除了对比度指标外,我们还累积区域上的平方图像和四次图像数据。

struct c3_isp_af_stats

自动对焦统计信息

定义:

struct c3_isp_af_stats {
    struct c3_isp_af_zone_stats stats[C3_ISP_AF_MAX_ZONES];
    __u32 reserved[2];
};

成员

stats

自动对焦块统计信息数组

reserved

未定义的缓冲区空间

描述

每个区域的 AF 统计信息

struct c3_isp_stats_info

V4L2_META_FMT_C3ISP_STATS

定义:

struct c3_isp_stats_info {
    struct c3_isp_awb_stats awb;
    struct c3_isp_ae_stats ae;
    struct c3_isp_af_stats af;
};

成员

awb

自动白平衡统计

ae

自动曝光统计

af

自动对焦统计

描述

包含 ISP 统计信息

enum c3_isp_params_buffer_version

C3 ISP 参数块版本控制

常量

C3_ISP_PARAMS_BUFFER_V0

C3 ISP 参数块的第一个版本

enum c3_isp_params_block_type

C3 ISP 参数块的枚举

常量

C3_ISP_PARAMS_BLOCK_AWB_GAINS

白平衡增益

C3_ISP_PARAMS_BLOCK_AWB_CONFIG

用于控制统计信息生成方式的所有块的 AWB 统计格式配置

C3_ISP_PARAMS_BLOCK_AE_CONFIG

用于控制统计信息生成方式的所有块的 AE 统计格式配置

C3_ISP_PARAMS_BLOCK_AF_CONFIG

用于控制统计信息生成方式的所有块的 AF 统计格式配置

C3_ISP_PARAMS_BLOCK_PST_GAMMA

后期 gamma 参数

C3_ISP_PARAMS_BLOCK_CCM

颜色校正矩阵参数

C3_ISP_PARAMS_BLOCK_CSC

颜色空间转换参数

C3_ISP_PARAMS_BLOCK_BLC

黑电平校正参数

C3_ISP_PARAMS_BLOCK_SENTINEL

第一个无效块索引

描述

每个块配置 C3 ISP 的特定处理块。块类型允许驱动程序正确解释参数块数据。

struct c3_isp_params_block_header

C3 ISP 参数块头

定义:

struct c3_isp_params_block_header {
    __u16 type;
    __u16 flags;
    __u32 size;
};

成员

type

来自 c3_isp_params_block_type 的参数块类型

flags

块标志的位掩码

size

参数块的大小(以字节为单位),包括此标头

描述

此结构表示所有 ISP 配置块的公共部分。每个参数块应嵌入此结构类型的实例作为其第一个成员,然后是特定于块的配置数据。驱动程序检查此公共标头以辨别块类型及其大小,并通过将其强制转换为正确的特定于块的类型来正确处理块内容。

type 字段是 c3_isp_params_block_type 枚举的值之一,并指定驱动程序应如何解释数据。 size 字段指定参数块的大小,驱动程序将其用于验证目的。 flags 字段是每个块标志 C3_ISP_PARAMS_FL* 的位掩码。

当用户空间想要禁用 ISP 块时,应在 flags 字段中设置 C3_ISP_PARAMS_BLOCK_FL_DISABLED 位。在这种情况下,用户空间可以选择省略配置块的其余部分,驱动程序将忽略该部分。

当需要应用 ISP 块的新配置时,用户空间应完全填充 ISP 块,并在 flags 字段中省略设置 C3_ISP_PARAMS_BLOCK_FL_DISABLED 位。

用户空间负责正确填充参数块头字段 (type, flagssize) 和特定于块的参数。

例如

void populate_pst_gamma(struct c3_isp_params_block_header *block) {
        struct c3_isp_params_pst_gamma *gamma =
                (struct c3_isp_params_pst_gamma *)block;

        gamma->header.type = C3_ISP_PARAMS_BLOCK_PST_GAMMA;
        gamma->header.flags = C3_ISP_PARAMS_BLOCK_FL_ENABLE;
        gamma->header.size = sizeof(*gamma);

        for (unsigned int i = 0; i < 129; i++)
                gamma->pst_gamma_lut[i] = i;
}
struct c3_isp_params_awb_gains

自动白平衡的增益

定义:

struct c3_isp_params_awb_gains {
    struct c3_isp_params_block_header header;
    __u16 gr_gain;
    __u16 r_gain;
    __u16 b_gain;
    __u16 gb_gain;
};

成员

header

C3 ISP 参数块头

gr_gain

Gr 通道的乘数(Q4.8 格式)

r_gain

R 通道的乘数(Q4.8 格式)

b_gain

B 通道的乘数(Q4.8 格式)

gb_gain

Gb 通道的乘数(Q4.8 格式)

描述

此结构允许用户配置白平衡的增益。有四个增益设置对应于 bayer 域中的每个颜色通道。所有增益都以 Q4.8 格式存储。

header.type 应设置为来自 c3_isp_params_block_type 的 C3_ISP_PARAMS_BLOCK_AWB_GAINS

enum c3_isp_params_awb_tap_points

AWB 统计信息的 Tap 点

常量

C3_ISP_AWB_STATS_TAP_OFE

紧接在光学前端块之后

C3_ISP_AWB_STATS_TAP_GE

紧接在绿色均衡块之后

C3_ISP_AWB_STATS_TAP_BEFORE_WB

紧接在白平衡块之前

C3_ISP_AWB_STATS_TAP_AFTER_WB

紧接在白平衡块之后

struct c3_isp_params_awb_config

自动白平衡的统计设置

定义:

struct c3_isp_params_awb_config {
    struct c3_isp_params_block_header header;
    __u8 tap_point;
    __u8 satur_vald;
    __u8 horiz_zones_num;
    __u8 vert_zones_num;
    __u16 rg_min;
    __u16 rg_max;
    __u16 bg_min;
    __u16 bg_max;
    __u16 rg_low;
    __u16 rg_high;
    __u16 bg_low;
    __u16 bg_high;
    __u8 zone_weight[C3_ISP_AWB_MAX_ZONES];
    __u16 horiz_coord[C3_ISP_AWB_MAX_PT_NUM];
    __u16 vert_coord[C3_ISP_AWB_MAX_PT_NUM];
};

成员

header

C3 ISP 参数块头

tap_point

来自 enum c3_isp_params_awb_tap_point 的 tap 点

satur_vald

AWB 统计过饱和度控制值:0:禁用,1:启用

horiz_zones_num

水平区域的有效数量 [0..32]

vert_zones_num

垂直区域的有效数量 [0..24]

rg_min

最小 R/G 比率(Q4.8 格式)

rg_max

最大 R/G 比率(Q4.8 格式)

bg_min

最小 B/G 比率(Q4.8 格式)

bg_max

最大 B/G 比率(Q4.8 格式)

rg_low

R/G 比率调整低(Q4.8 格式)

rg_high

R/G 比率调整高(Q4.8 格式)

bg_low

B/G 比率调整低(Q4.8 格式)

bg_high

B/G 比率调整高(Q4.8 格式)

zone_weight

AWB 统计区域的权重数组 [0..15]

horiz_coord

对角线上点的水平坐标 [0..2888]

vert_coord

对角线上点的垂直坐标 [0..2240]

描述

此结构允许配置为自动白平衡生成的统计信息。

header.type 应设置为来自 c3_isp_params_block_type 的 C3_ISP_PARAMS_BLOCK_AWB_CONFIG

enum c3_isp_params_ae_tap_points

AE 统计信息的 Tap 点

常量

C3_ISP_AE_STATS_TAP_GE

紧接在绿色均衡块之后

C3_ISP_AE_STATS_TAP_MLS

紧接在网格镜头阴影块之后

struct c3_isp_params_ae_config

自动曝光的统计设置

定义:

struct c3_isp_params_ae_config {
    struct c3_isp_params_block_header header;
    __u8 tap_point;
    __u8 horiz_zones_num;
    __u8 vert_zones_num;
    __u8 zone_weight[C3_ISP_AE_MAX_ZONES];
    __u16 horiz_coord[C3_ISP_AE_MAX_PT_NUM];
    __u16 vert_coord[C3_ISP_AE_MAX_PT_NUM];
    __u16 reserved[3];
};

成员

header

C3 ISP 参数块头

tap_point

来自 enum c3_isp_params_ae_tap_point 的 tap 点

horiz_zones_num

水平区域的有效数量 [0..17]

vert_zones_num

垂直区域的有效数量 [0..15]

zone_weight

AE 统计区域的权重数组 [0..15]

horiz_coord

对角线上点的水平坐标 [0..2888]

vert_coord

对角线上点的垂直坐标 [0..2240]

reserved

应用程序必须将此数组清零

描述

此结构允许配置为自动曝光生成的统计信息。

header.type 应设置为来自 c3_isp_params_block_type 的 C3_ISP_PARAMS_BLOCK_AE_CONFIG

enum c3_isp_params_af_tap_points

AF 统计信息的 Tap 点

常量

C3_ISP_AF_STATS_TAP_SNR

紧接在空间噪声降低块之后

C3_ISP_AF_STATS_TAP_DMS

紧接在去马赛克块之后

struct c3_isp_params_af_config

自动对焦的统计设置

定义:

struct c3_isp_params_af_config {
    struct c3_isp_params_block_header header;
    __u8 tap_point;
    __u8 horiz_zones_num;
    __u8 vert_zones_num;
    __u8 reserved[5];
    __u16 horiz_coord[C3_ISP_AF_MAX_PT_NUM];
    __u16 vert_coord[C3_ISP_AF_MAX_PT_NUM];
};

成员

header

C3 ISP 参数块头

tap_point

来自 enum c3_isp_params_af_tap_point 的 tap 点

horiz_zones_num

水平区域的有效数量 [0..17]

vert_zones_num

垂直区域的有效数量 [0..15]

reserved

应用程序必须将此数组清零

horiz_coord

对角线上点的水平坐标 [0..2888]

vert_coord

对角线上点的垂直坐标 [0..2240]

描述

此结构允许配置为自动对焦生成的统计信息。

header.type 应设置为来自 c3_isp_params_block_type 的 C3_ISP_PARAMS_BLOCK_AF_CONFIG

struct c3_isp_params_pst_gamma

后期 gamma 配置

定义:

struct c3_isp_params_pst_gamma {
    struct c3_isp_params_block_header header;
    __u16 lut[129];
    __u16 reserved[3];
};

成员

header

C3 ISP 参数块头

lut

P-Stitch gamma 的查找表 [0..1023]

reserved

应用程序必须将此数组清零

描述

此结构允许配置后期 gamma 的查找表。 gamma 曲线由 129 个点组成,因此需要设置 lut[129]。

header.type 应设置为来自 c3_isp_params_block_type 的 C3_ISP_PARAMS_BLOCK_PST_GAMMA

struct c3_isp_params_ccm

ISP CCM 配置

定义:

struct c3_isp_params_ccm {
    struct c3_isp_params_block_header header;
    __s16 matrix[3][3];
    __u16 reserved[3];
};

成员

header

C3 ISP 参数块头

matrix

用于颜色校正的 3 x 3 矩阵,matrix[x][y] 的值为 orig_value x 256。 [-4096..4095]

reserved

应用程序必须将此数组清零

描述

此结构允许配置颜色校正的矩阵。该矩阵由 3 x 3 个点组成,因此需要设置 matrix[3][3]。

header.type 应设置为来自 c3_isp_params_block_type 的 C3_ISP_PARAMS_BLOCK_CCM

struct c3_isp_params_csc

ISP 颜色空间转换配置

定义:

struct c3_isp_params_csc {
    struct c3_isp_params_block_header header;
    __s16 matrix[3][3];
    __u16 reserved[3];
};

成员

header

C3 ISP 参数块头

matrix

用于颜色空间转换的 3x3 矩阵,matrix[x][y] 的值为 orig_value x 256。 [-4096..4095]

reserved

应用程序必须将此数组清零

描述

此结构允许配置颜色空间转换的矩阵。该矩阵由 3 x 3 个点组成,因此需要设置 matrix[3][3]。

header.type 应设置为来自 c3_isp_params_block_type 的 C3_ISP_PARAMS_BLOCK_CSC

struct c3_isp_params_blc

ISP 黑电平校正配置

定义:

struct c3_isp_params_blc {
    struct c3_isp_params_block_header header;
    __u16 gr_ofst;
    __u16 r_ofst;
    __u16 b_ofst;
    __u16 gb_ofst;
};

成员

header

C3 ISP 参数块头

gr_ofst

Gr blc 偏移(Q4.12 格式)

r_ofst

R blc 偏移(Q4.12 格式)

b_ofst

B blc 偏移(Q4.12 格式)

gb_ofst

Gb blc 偏移(Q4.12 格式)

描述

此结构允许配置每个颜色通道的块级别偏移。

header.type 应设置为来自 c3_isp_params_block_type 的 C3_ISP_PARAMS_BLOCK_BLC

C3_ISP_PARAMS_MAX_SIZE

C3_ISP_PARAMS_MAX_SIZE

所有 C3 ISP 参数的最大大小

描述

尽管 C3 ISP 的参数作为可选块传递,但驱动程序仍然需要知道绝对最大大小,以便它可以分配大小适当的缓冲区,以适应用户空间尝试在单个帧中设置所有可能的参数。

struct c3_isp_params_cfg

C3 ISP 配置参数

定义:

struct c3_isp_params_cfg {
    __u32 version;
    __u32 data_size;
    __u8 data[C3_ISP_PARAMS_MAX_SIZE];
};

成员

version

C3 ISP 参数缓冲区版本

data_size

C3 ISP 配置数据有效大小,不包括此标头

data

C3 ISP 配置块数据

描述

此结构包含 C3 ISP 算法的配置参数,用户空间将其序列化为不透明的数据缓冲区。每个配置参数块由一个特定于块的结构表示,该结构包含一个 c3_isp_param_block_header 条目作为第一个成员。用户空间使用它打算配置的块的配置参数填充 data 缓冲区。因此,数据缓冲区的有效大小会根据用户空间打算配置的 ISP 块的数量而变化。

参数缓冲区由 version 字段进行版本控制,以允许修改和扩展其定义。用户空间应填充 version 字段以告知驱动程序它打算使用的版本。驱动程序将根据指示修订版的特定数据布局解析和处理 data 缓冲区,如果不支持所需的修订版,则返回错误。

对于用户空间要配置的每个 ISP 块,一个特定于块的结构将附加到 data 缓冲区,一个接一个,中间没有间隙也没有重叠。用户空间应使用 total_size 字段填充 data 缓冲区的有效大小(以字节为单位)。

参数缓冲区的预期内存布局为

+-------------------- struct c3_isp_params_cfg ---- ------------------+
| version = C3_ISP_PARAM_BUFFER_V0;                                   |
| data_size = sizeof(struct c3_isp_params_awb_gains) +                |
|              sizeof(struct c3_isp_params_awb_config);       |
| +------------------------- data  ---------------------------------+ |
| | +------------ struct c3_isp_params_awb_gains) ------------------+ |
| | | +---------  struct c3_isp_params_block_header header -----+ | | |
| | | | type = C3_ISP_PARAMS_BLOCK_AWB_GAINS;                   | | | |
| | | | flags = C3_ISP_PARAMS_BLOCK_FL_NONE;                    | | | |
| | | | size = sizeof(struct c3_isp_params_awb_gains);          | | | |
| | | +---------------------------------------------------------+ | | |
| | | gr_gain = ...;                                              | | |
| | | r_gain = ...;                                               | | |
| | | b_gain = ...;                                               | | |
| | | gb_gain = ...;                                              | | |
| | +------------------ struct c3_isp_params_awb_config ----------+ | |
| | | +---------- struct c3_isp_param_block_header header ------+ | | |
| | | | type = C3_ISP_PARAMS_BLOCK_AWB_CONFIG;                  | | | |
| | | | flags = C3_ISP_PARAMS_BLOCK_FL_NONE;                    | | | |
| | | | size = sizeof(struct c3_isp_params_awb_config)          | | | |
| | | +---------------------------------------------------------+ | | |
| | | tap_point = ...;                                            | | |
| | | satur_vald = ...;                                           | | |
| | | horiz_zones_num = ...;                                      | | |
| | | vert_zones_num = ...;                                       | | |
| | +-------------------------------------------------------------+ | |
| +-----------------------------------------------------------------+ |
+---------------------------------------------------------------------+