2.13.1. V4L2_META_FMT_C3ISP_STATS (‘C3ST’), V4L2_META_FMT_C3ISP_PARAMS (‘C3PM’)¶
2.13.1.1. 3A Statistics¶
The C3 ISP can collect different statistics over an input Bayer frame.
Those statistics are obtained from the “c3-isp-stats” metadata capture video nodes,
using the v4l2_meta_format interface.
They are formatted as described by the c3_isp_stats_info structure.
The statistics collected are Auto-white balance, Auto-exposure and Auto-focus information.
2.13.1.2. Configuration Parameters¶
The configuration parameters are passed to the c3-isp-params metadata output video node,
using the v4l2_meta_format interface. Rather than a single struct containing
sub-structs for each configurable area of the ISP, parameters for the C3-ISP
are defined as distinct structs or “blocks” which may be added to the data
member of c3_isp_params_cfg. Userspace is responsible for
populating the data member with the blocks that need to be configured by the driver, but
need not populate it with all the blocks, or indeed with any at all if there
are no configuration changes to make. Populated blocks must be consecutive
in the buffer. To assist both userspace and the driver in identifying the
blocks each block-specific struct embeds
c3_isp_params_block_header as its first member and userspace
must populate the type member with a value from
c3_isp_params_block_type. Once the blocks have been populated
into the data buffer, the combined size of all populated blocks shall be set in
the data_size member of c3_isp_params_cfg. For example:
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 data types¶
-
struct c3_isp_awb_zone_stats¶
AWB statistics of a zone
Definition:
struct c3_isp_awb_zone_stats {
__u16 rg;
__u16 bg;
__u32 pixel_sum;
};
Members
rgthe ratio of R / G in a zone
bgthe ratio of B / G in a zone
pixel_sumthe total number of pixels used in a zone
Description
AWB zone stats is aligned with 8 bytes
-
struct c3_isp_awb_stats¶
Auto white balance statistics information.
Definition:
struct c3_isp_awb_stats {
struct c3_isp_awb_zone_stats stats[C3_ISP_AWB_MAX_ZONES];
};
Members
statsarray of auto white balance statistics
Description
AWB statistical information of all zones.
-
struct c3_isp_ae_zone_stats¶
AE statistics of a zone
Definition:
struct c3_isp_ae_zone_stats {
__u16 hist0;
__u16 hist1;
__u16 hist3;
__u16 hist4;
};
Members
hist0the global normalized pixel count for bin 0
hist1the global normalized pixel count for bin 1
hist3the global normalized pixel count for bin 3
hist4the global normalized pixel count for bin 4
Description
AE zone stats is aligned with 8 bytes. This is a 5-bin histogram and the total sum is normalized to 0xffff. So hist2 = 0xffff - (hist0 + hist1 + hist3 + hist4)
-
struct c3_isp_ae_stats¶
Exposure statistics information
Definition:
struct c3_isp_ae_stats {
struct c3_isp_ae_zone_stats stats[C3_ISP_AE_MAX_ZONES];
__u32 reserved[2];
__u32 hist[1024];
};
Members
statsarray of auto exposure block statistics
reservedundefined buffer space
hista 1024-bin histogram for the entire image
Description
AE statistical information consists of all blocks information and a 1024-bin histogram.
-
struct c3_isp_af_zone_stats¶
AF statistics of a zone
Definition:
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;
};
Members
i2_matthe mantissa of zonal squared image pixel sum
i4_matthe mantissa of zonal quartic image pixel sum
e4_matthe mantissa of zonal multi-directional quartic edge sum
e4_expthe exponent of zonal multi-directional quartic edge sum
i2_expthe exponent of zonal squared image pixel sum
i4_expthe exponent of zonal quartic image pixel sum
Description
AF zone stats is aligned with 8 bytes. The zonal accumulated contrast metrics are stored in floating point format with 16 bits mantissa and 5 or 6 bits exponent. Apart from contrast metrics we accumulate squared image and quartic image data over the zone.
-
struct c3_isp_af_stats¶
Auto Focus statistics information
Definition:
struct c3_isp_af_stats {
struct c3_isp_af_zone_stats stats[C3_ISP_AF_MAX_ZONES];
__u32 reserved[2];
};
Members
statsarray of auto focus block statistics
reservedundefined buffer space
Description
AF statistical information of each zone
-
struct c3_isp_stats_info¶
V4L2_META_FMT_C3ISP_STATS
Definition:
struct c3_isp_stats_info {
struct c3_isp_awb_stats awb;
struct c3_isp_ae_stats ae;
struct c3_isp_af_stats af;
};
Members
awbauto white balance stats
aeauto exposure stats
afauto focus stats
Description
Contains ISP statistics
-
enum c3_isp_params_buffer_version¶
C3 ISP parameters block versioning
Constants
C3_ISP_PARAMS_BUFFER_V0First version of C3 ISP parameters block
-
enum c3_isp_params_block_type¶
Enumeration of C3 ISP parameter blocks
Constants
C3_ISP_PARAMS_BLOCK_AWB_GAINSWhite balance gains
C3_ISP_PARAMS_BLOCK_AWB_CONFIGAWB statistic format configuration for all blocks that control how stats are generated
C3_ISP_PARAMS_BLOCK_AE_CONFIGAE statistic format configuration for all blocks that control how stats are generated
C3_ISP_PARAMS_BLOCK_AF_CONFIGAF statistic format configuration for all blocks that control how stats are generated
C3_ISP_PARAMS_BLOCK_PST_GAMMApost gamma parameters
C3_ISP_PARAMS_BLOCK_CCMColor correction matrix parameters
C3_ISP_PARAMS_BLOCK_CSCColor space conversion parameters
C3_ISP_PARAMS_BLOCK_BLCBlack level correction parameters
C3_ISP_PARAMS_BLOCK_SENTINELFirst non-valid block index
Description
Each block configures a specific processing block of the C3 ISP. The block type allows the driver to correctly interpret the parameters block data.
-
struct c3_isp_params_block_header¶
C3 ISP parameter block header
Definition:
struct c3_isp_params_block_header {
__u16 type;
__u16 flags;
__u32 size;
};
Members
typeThe parameters block type from
c3_isp_params_block_typeflagsA bitmask of block flags
sizeSize (in bytes) of the parameters block, including this header
Description
This structure represents the common part of all the ISP configuration blocks. Each parameters block shall embed an instance of this structure type as its first member, followed by the block-specific configuration data. The driver inspects this common header to discern the block type and its size and properly handle the block content by casting it to the correct block-specific type.
The type field is one of the values enumerated by
c3_isp_params_block_type and specifies how the data should be
interpreted by the driver. The size field specifies the size of the
parameters block and is used by the driver for validation purposes. The
flags field is a bitmask of per-block flags C3_ISP_PARAMS_FL*.
When userspace wants to disable an ISP block the C3_ISP_PARAMS_BLOCK_FL_DISABLED bit should be set in the flags field. In this case userspace may optionally omit the remainder of the configuration block, which will be ignored by the driver.
When a new configuration of an ISP block needs to be applied userspace shall fully populate the ISP block and omit setting the C3_ISP_PARAMS_BLOCK_FL_DISABLED bit in the flags field.
Userspace is responsible for correctly populating the parameters block header fields (type, flags and size) and the block-specific parameters.
For example:
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¶
Gains for auto-white balance
Definition:
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;
};
Members
headerThe C3 ISP parameters block header
gr_gainMultiplier for Gr channel (Q4.8 format)
r_gainMultiplier for R channel (Q4.8 format)
b_gainMultiplier for B channel (Q4.8 format)
gb_gainMultiplier for Gb channel (Q4.8 format)
Description
This struct allows users to configure the gains for white balance.
There are four gain settings corresponding to each colour channel in
the bayer domain. All of the gains are stored in Q4.8 format.
header.type should be set to C3_ISP_PARAMS_BLOCK_AWB_GAINS
from c3_isp_params_block_type
-
enum c3_isp_params_awb_tap_points¶
Tap points for the AWB statistics
Constants
C3_ISP_AWB_STATS_TAP_OFEimmediately after the optical frontend block
C3_ISP_AWB_STATS_TAP_GEimmediately after the green equal block
C3_ISP_AWB_STATS_TAP_BEFORE_WBimmediately before the white balance block
C3_ISP_AWB_STATS_TAP_AFTER_WBimmediately after the white balance block
-
struct c3_isp_params_awb_config¶
Stats settings for auto-white balance
Definition:
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];
};
Members
headerthe C3 ISP parameters block header
tap_pointthe tap point from
enum c3_isp_params_awb_tap_pointsatur_valdAWB statistic over saturation control value: 0: disable, 1: enable
horiz_zones_numactive number of hotizontal zones [0..32]
vert_zones_numactive number of vertical zones [0..24]
rg_minminimum R/G ratio (Q4.8 format)
rg_maxmaximum R/G ratio (Q4.8 format)
bg_minminimum B/G ratio (Q4.8 format)
bg_maxmaximum B/G ratio (Q4.8 format)
rg_lowR/G ratio trim low (Q4.8 format)
rg_highR/G ratio trim hight (Q4.8 format)
bg_lowB/G ratio trim low (Q4.8 format)
bg_highB/G ratio trim high (Q4.8 format)
zone_weightarray of weights for AWB statistics zones [0..15]
horiz_coordthe horizontal coordinate of points on the diagonal [0..2888]
vert_coordthe vertical coordinate of points on the diagonal [0..2240]
Description
This struct allows the configuration of the statistics generated for auto
white balance.
header.type should be set to C3_ISP_PARAMS_BLOCK_AWB_CONFIG
from c3_isp_params_block_type
-
enum c3_isp_params_ae_tap_points¶
Tap points for the AE statistics
Constants
C3_ISP_AE_STATS_TAP_GEimmediately after the green equal block
C3_ISP_AE_STATS_TAP_MLSimmediately after the mesh lens shading block
-
struct c3_isp_params_ae_config¶
Stats settings for auto-exposure
Definition:
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];
};
Members
headerthe C3 ISP parameters block header
tap_pointthe tap point from
enum c3_isp_params_ae_tap_pointhoriz_zones_numactive number of horizontal zones [0..17]
vert_zones_numactive number of vertical zones [0..15]
zone_weightarray of weights for AE statistics zones [0..15]
horiz_coordthe horizontal coordinate of points on the diagonal [0..2888]
vert_coordthe vertical coordinate of points on the diagonal [0..2240]
reservedapplications must zero this array
Description
This struct allows the configuration of the statistics generated for
auto exposure.
header.type should be set to C3_ISP_PARAMS_BLOCK_AE_CONFIG
from c3_isp_params_block_type
-
enum c3_isp_params_af_tap_points¶
Tap points for the AF statistics
Constants
C3_ISP_AF_STATS_TAP_SNRimmediately after the spatial noise reduce block
C3_ISP_AF_STATS_TAP_DMSimmediately after the demosaic block
-
struct c3_isp_params_af_config¶
Stats settings for auto-focus
Definition:
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];
};
Members
headerthe C3 ISP parameters block header
tap_pointthe tap point from
enum c3_isp_params_af_tap_pointhoriz_zones_numactive number of hotizontal zones [0..17]
vert_zones_numactive number of vertical zones [0..15]
reservedapplications must zero this array
horiz_coordthe horizontal coordinate of points on the diagonal [0..2888]
vert_coordthe vertical coordinate of points on the diagonal [0..2240]
Description
This struct allows the configuration of the statistics generated for
auto focus.
header.type should be set to C3_ISP_PARAMS_BLOCK_AF_CONFIG
from c3_isp_params_block_type
-
struct c3_isp_params_pst_gamma¶
Post gamma configuration
Definition:
struct c3_isp_params_pst_gamma {
struct c3_isp_params_block_header header;
__u16 lut[129];
__u16 reserved[3];
};
Members
headerthe C3 ISP parameters block header
lutlookup table for P-Stitch gamma [0..1023]
reservedapplications must zero this array
Description
This struct allows the configuration of the look up table for
post gamma. The gamma curve consists of 129 points, so need to
set lut[129].
header.type should be set to C3_ISP_PARAMS_BLOCK_PST_GAMMA
from c3_isp_params_block_type
-
struct c3_isp_params_ccm¶
ISP CCM configuration
Definition:
struct c3_isp_params_ccm {
struct c3_isp_params_block_header header;
__s16 matrix[3][3];
__u16 reserved[3];
};
Members
headerthe C3 ISP parameters block header
matrixa 3 x 3 matrix used for color correction, the value of matrix[x][y] is orig_value x 256. [-4096..4095]
reservedapplications must zero this array
Description
This struct allows the configuration of the matrix for
color correction. The matrix consists of 3 x 3 points,
so need to set matrix[3][3].
header.type should be set to C3_ISP_PARAMS_BLOCK_CCM
from c3_isp_params_block_type
-
struct c3_isp_params_csc¶
ISP Color Space Conversion configuration
Definition:
struct c3_isp_params_csc {
struct c3_isp_params_block_header header;
__s16 matrix[3][3];
__u16 reserved[3];
};
Members
headerthe C3 ISP parameters block header
matrixa 3x3 matrix used for the color space conversion, the value of matrix[x][y] is orig_value x 256. [-4096..4095]
reservedapplications must zero this array
Description
This struct allows the configuration of the matrix for color space
conversion. The matrix consists of 3 x 3 points, so need to set matrix[3][3].
header.type should be set to C3_ISP_PARAMS_BLOCK_CSC
from c3_isp_params_block_type
-
struct c3_isp_params_blc¶
ISP Black Level Correction configuration
Definition:
struct c3_isp_params_blc {
struct c3_isp_params_block_header header;
__u16 gr_ofst;
__u16 r_ofst;
__u16 b_ofst;
__u16 gb_ofst;
};
Members
headerthe C3 ISP parameters block header
gr_ofstGr blc offset (Q4.12 format)
r_ofstR blc offset (Q4.12 format)
b_ofstB blc offset (Q4.12 format)
gb_ofstGb blc offset(Q4.12 format)
Description
This struct allows the configuration of the block level offset for each
color channel.
header.type should be set to C3_ISP_PARAMS_BLOCK_BLC
from c3_isp_params_block_type
-
C3_ISP_PARAMS_MAX_SIZE¶
C3_ISP_PARAMS_MAX_SIZE
Maximum size of all C3 ISP Parameters
Description
Though the parameters for the C3 ISP are passed as optional blocks, the driver still needs to know the absolute maximum size so that it can allocate a buffer sized appropriately to accommodate userspace attempting to set all possible parameters in a single frame.
-
struct c3_isp_params_cfg¶
C3 ISP configuration parameters
Definition:
struct c3_isp_params_cfg {
__u32 version;
__u32 data_size;
__u8 data[C3_ISP_PARAMS_MAX_SIZE];
};
Members
versionThe C3 ISP parameters buffer version
data_sizeThe C3 ISP configuration data effective size, excluding this header
dataThe C3 ISP configuration blocks data
Description
This struct contains the configuration parameters of the C3 ISP
algorithms, serialized by userspace into an opaque data buffer. Each
configuration parameter block is represented by a block-specific structure
which contains a c3_isp_param_block_header entry as first
member. Userspace populates the data buffer with configuration parameters
for the blocks that it intends to configure. As a consequence, the data
buffer effective size changes according to the number of ISP blocks that
userspace intends to configure.
The parameters buffer is versioned by the version field to allow modifying and extending its definition. Userspace should populate the version field to inform the driver about the version it intends to use. The driver will parse and handle the data buffer according to the data layout specific to the indicated revision and return an error if the desired revision is not supported.
For each ISP block that userspace wants to configure, a block-specific structure is appended to the data buffer, one after the other without gaps in between nor overlaps. Userspace shall populate the total_size field with the effective size, in bytes, of the data buffer.
The expected memory layout of the parameters buffer is:
+-------------------- 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 = ...; | | |
| | +-------------------------------------------------------------+ | |
| +-----------------------------------------------------------------+ |
+---------------------------------------------------------------------+