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

rg

the ratio of R / G in a zone

bg

the ratio of B / G in a zone

pixel_sum

the 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

stats

array 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

hist0

the global normalized pixel count for bin 0

hist1

the global normalized pixel count for bin 1

hist3

the global normalized pixel count for bin 3

hist4

the 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

stats

array of auto exposure block statistics

reserved

undefined buffer space

hist

a 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_mat

the mantissa of zonal squared image pixel sum

i4_mat

the mantissa of zonal quartic image pixel sum

e4_mat

the mantissa of zonal multi-directional quartic edge sum

e4_exp

the exponent of zonal multi-directional quartic edge sum

i2_exp

the exponent of zonal squared image pixel sum

i4_exp

the 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

stats

array of auto focus block statistics

reserved

undefined 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

awb

auto white balance stats

ae

auto exposure stats

af

auto focus stats

Description

Contains ISP statistics

enum c3_isp_params_buffer_version

C3 ISP parameters block versioning

Constants

C3_ISP_PARAMS_BUFFER_V0

First version of C3 ISP parameters block

enum c3_isp_params_block_type

Enumeration of C3 ISP parameter blocks

Constants

C3_ISP_PARAMS_BLOCK_AWB_GAINS

White balance gains

C3_ISP_PARAMS_BLOCK_AWB_CONFIG

AWB statistic format configuration for all blocks that control how stats are generated

C3_ISP_PARAMS_BLOCK_AE_CONFIG

AE statistic format configuration for all blocks that control how stats are generated

C3_ISP_PARAMS_BLOCK_AF_CONFIG

AF statistic format configuration for all blocks that control how stats are generated

C3_ISP_PARAMS_BLOCK_PST_GAMMA

post gamma parameters

C3_ISP_PARAMS_BLOCK_CCM

Color correction matrix parameters

C3_ISP_PARAMS_BLOCK_CSC

Color space conversion parameters

C3_ISP_PARAMS_BLOCK_BLC

Black level correction parameters

C3_ISP_PARAMS_BLOCK_SENTINEL

First 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

type

The parameters block type from c3_isp_params_block_type

flags

A bitmask of block flags

size

Size (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

header

The C3 ISP parameters block header

gr_gain

Multiplier for Gr channel (Q4.8 format)

r_gain

Multiplier for R channel (Q4.8 format)

b_gain

Multiplier for B channel (Q4.8 format)

gb_gain

Multiplier 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_OFE

immediately after the optical frontend block

C3_ISP_AWB_STATS_TAP_GE

immediately after the green equal block

C3_ISP_AWB_STATS_TAP_BEFORE_WB

immediately before the white balance block

C3_ISP_AWB_STATS_TAP_AFTER_WB

immediately 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

header

the C3 ISP parameters block header

tap_point

the tap point from enum c3_isp_params_awb_tap_point

satur_vald

AWB statistic over saturation control value: 0: disable, 1: enable

horiz_zones_num

active number of hotizontal zones [0..32]

vert_zones_num

active number of vertical zones [0..24]

rg_min

minimum R/G ratio (Q4.8 format)

rg_max

maximum R/G ratio (Q4.8 format)

bg_min

minimum B/G ratio (Q4.8 format)

bg_max

maximum B/G ratio (Q4.8 format)

rg_low

R/G ratio trim low (Q4.8 format)

rg_high

R/G ratio trim hight (Q4.8 format)

bg_low

B/G ratio trim low (Q4.8 format)

bg_high

B/G ratio trim high (Q4.8 format)

zone_weight

array of weights for AWB statistics zones [0..15]

horiz_coord

the horizontal coordinate of points on the diagonal [0..2888]

vert_coord

the 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_GE

immediately after the green equal block

C3_ISP_AE_STATS_TAP_MLS

immediately 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

header

the C3 ISP parameters block header

tap_point

the tap point from enum c3_isp_params_ae_tap_point

horiz_zones_num

active number of horizontal zones [0..17]

vert_zones_num

active number of vertical zones [0..15]

zone_weight

array of weights for AE statistics zones [0..15]

horiz_coord

the horizontal coordinate of points on the diagonal [0..2888]

vert_coord

the vertical coordinate of points on the diagonal [0..2240]

reserved

applications 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_SNR

immediately after the spatial noise reduce block

C3_ISP_AF_STATS_TAP_DMS

immediately 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

header

the C3 ISP parameters block header

tap_point

the tap point from enum c3_isp_params_af_tap_point

horiz_zones_num

active number of hotizontal zones [0..17]

vert_zones_num

active number of vertical zones [0..15]

reserved

applications must zero this array

horiz_coord

the horizontal coordinate of points on the diagonal [0..2888]

vert_coord

the 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

header

the C3 ISP parameters block header

lut

lookup table for P-Stitch gamma [0..1023]

reserved

applications 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

header

the C3 ISP parameters block header

matrix

a 3 x 3 matrix used for color correction, the value of matrix[x][y] is orig_value x 256. [-4096..4095]

reserved

applications 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

header

the C3 ISP parameters block header

matrix

a 3x3 matrix used for the color space conversion, the value of matrix[x][y] is orig_value x 256. [-4096..4095]

reserved

applications 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

header

the C3 ISP parameters block header

gr_ofst

Gr blc offset (Q4.12 format)

r_ofst

R blc offset (Q4.12 format)

b_ofst

B blc offset (Q4.12 format)

gb_ofst

Gb 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

version

The C3 ISP parameters buffer version

data_size

The C3 ISP configuration data effective size, excluding this header

data

The 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 = ...;                                       | | |
| | +-------------------------------------------------------------+ | |
| +-----------------------------------------------------------------+ |
+---------------------------------------------------------------------+