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, flags 和 size) 和特定于块的参数。
例如
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 = ...; | | |
| | +-------------------------------------------------------------+ | |
| +-----------------------------------------------------------------+ |
+---------------------------------------------------------------------+