统计信息¶
概述¶
ISP提供的3A统计信息及相关配置。
功能描述¶
AE统计信息¶
实现自动曝光信息的统计,软件根据统计信息调节sensor可实现自动曝光的功能。AE统计信息包含分区间的R/Gr/Gb/B均值统计、带权重的全局R/Gr/Gb/B均值、1024段直方图信息。
AE 区域统计信息¶
AE最大支持17×15分块,最小支持1×1分块,每个分块均可以输出16bit R,Gr,Gb,B均值(Average R/Gr/Gb/B)。以R、Gr为例,区块的统计信息读取地址与数据的对应关系如表1所示。m表示水平分区个数,n表示垂直分区个数。
表 1 AE区域统计信息
带权重的AE全局统计信息¶
与AE的区域统计信息基本一致,对于整幅图像,AE也提供了4个全局统计信息。分别为OT_ISP_AE_TOTAL_R_AVER,OT_ISP_AE_TOTAL_GR_AVER,OT_ISP_AE_TOTAL_GB_AVER,OT_ISP_AE_TOTAL_B_AVER。其物理意义与分块统计一致。
带权重的AE直方图信息¶
AE提供1024阶直方图统计0-1023,直方图信息读取地址与数据的对应关系如表1所示。
表 1 AE直方图统计信息
AE支持FourPlaneMode模式,在FourPlaneMode模式下,AE提供四通道256段直方图统计0~255,直方图信息读取地址与数据的对应关系如表2所示。
表 2 AE直方图统计信息
MG统计信息¶
MG模块统计DRC后分块均值,与AE统计分块均值相比,可以得出分块均值增益最大值。MG统计信息包含分区间R/Gr/Gb/B均值统计。
MG区域统计信息¶
MG最大支持17×15分块,最小支持1×1分块,每个分块均可以输出8bit R,Gr,Gb,B均值(Average R/Gr/Gb/B)。区块的统计信息读取地址与数据的对应关系如表1所示。m表示水平分区个数,n表示垂直分区个数。
表 1 MG区域统计信息
AWB统计信息¶
AWB统计信息包含全局统计信息和区域统计信息。
全局统计信息:整幅图像的R,G,B均值,以及有效统计点的个数。
区域统计信息:最大支持图像的32x32分块,每个分块均可以输出R,G,B均值,以及有效统计点的个数。
AWB中统计的有效点,除了要满足配置的RGB上限与下限要求外(black_level,white_level),像素点颜色还需要满足配置的有效像素颜色空间,具体如图1所示,绿色区块内的为有效像素的颜色范围。
AWB统计的有效像素区域是一个四边形,其中上下左右四个边界由cr_ref_min/max, cb_ref_min/max这4个参数决定,它们代表了允许的r/g, b/g的最大与最小值。
AWB区域统计信息¶
AWB中最大支持图像的32x32分块,每个分块均可以输出R、G、B均值(Average R/G/B)。其中统计的像素点均为16bit,分块内统计有效点个数Count All,点数统计值均已根据图像大小做了归一化处理,归一化到16bit。同时,每一个分块支持分亮度区间进行统计,最大支持分4个亮度区间。区块的统计信息读取地址与数据的对应关系如表1所示。
须知:
当分辨率较小,分块数较多时,如果每块的分辨率小于60x14,那么需要减少分块数,以免每块过小。建议在分辨率小的情况下,使用较少的分块数。
如果要输出低分辨率,需要在业务启动的时候设置一个比较小的AWB统计信息分块数。
表 1 AWB区域统计信息
AWB全局统计信息¶
与AWB的区域统计信息基本一致,对于整幅图像,AWB也提供了四个全局统计信息。分别为ISP_AWB_AVG_R/G/B,ISP_AWB_CNT_ALL。其物理意义与分块统计一致。
API参考¶
统计信息的API接口必须在调用ss_mpi_isp_init接口之后才能调用。
ss_mpi_isp_set_stats_cfg:设置ISP 3A统计信息配置。
ss_mpi_isp_get_stats_cfg:获取ISP 3A统计信息配置。
ss_mpi_isp_get_ae_stats:获取AE统计信息。
ss_mpi_isp_get_ae_stitch_stats:获取拼接模式AE统计信息。
ss_mpi_isp_get_mg_stats:获取MG统计信息。
ss_mpi_isp_get_wb_stats:获取AWB统计信息。
ss_mpi_isp_get_wb_stitch_stats:获取拼接模式AWB统计信息。
ss_mpi_isp_get_focus_stats:获取AF统计信息。
ss_mpi_isp_set_stats_cfg¶
【描述】
设置ISP 3A统计信息配置。
【语法】
td_s32 ss_mpi_isp_set_stats_cfg(ot_vi_pipe vi_pipe, const ot_isp_stats_cfg *stat_cfg);
【参数】
【返回值】
失败,其值为错误码。 |
【需求】
头文件:ot_common_isp.h、ss_mpi_isp.h
库文件:libot_isp.a、libss_isp.a
【注意】
用户可以关闭不需要的统计信息,以提高系统性能。
【举例】
无
【相关主题】
ss_mpi_isp_get_stats_cfg¶
【描述】
获取ISP 3A统计信息配置。
【语法】
td_s32 ss_mpi_isp_get_stats_cfg(ot_vi_pipe vi_pipe, ot_isp_stats_cfg *stat_cfg);
【参数】
【返回值】
失败,其值为错误码。 |
【需求】
头文件:ot_common_isp.h、ss_mpi_isp.h
库文件:libot_isp.a、libss_isp.a
【注意】
无
【举例】
无
【相关主题】
ss_mpi_isp_get_ae_stats¶
【描述】
获取AE统计信息。
【语法】
td_s32 ss_mpi_isp_get_ae_stats(ot_vi_pipe vi_pipe, ot_isp_ae_stats *ae_stat);
【参数】
【返回值】
失败,其值为错误码。 |
【需求】
头文件:ot_common_isp.h、ss_mpi_isp.h
库文件:libot_isp.a、libss_isp.a
【注意】
ot_isp_ae_stats结构体较大,调用该接口时推荐调用malloc动态分配空间。
【举例】
无
【相关主题】
无
ss_mpi_isp_get_ae_stitch_stats¶
【描述】
获取拼接模式AE统计信息。
【语法】
td_s32 ss_mpi_isp_get_ae_stitch_stats(ot_vi_pipe vi_pipe, ot_isp_ae_stitch_stats *stitch_stat);
【参数】
【返回值】
失败,其值为错误码。 |
【需求】
头文件:ot_common_isp.h、ss_mpi_isp.h
库文件:libot_isp.a、libss_isp.a
【注意】
ot_isp_ae_stitch_stats结构体较大,调用该接口时推荐调用malloc动态分配空间。
【举例】
无
【相关主题】
无
ss_mpi_isp_get_mg_stats¶
【描述】
获取MG统计信息。
【语法】
td_s32 ss_mpi_isp_get_mg_stats(ot_vi_pipe vi_pipe, ot_isp_mg_stats *mg_stat);
【参数】
【返回值】
失败,其值为错误码。 |
【需求】
头文件:ot_common_isp.h、ss_mpi_isp.h
库文件:libot_isp.a、libss_isp.a
【注意】
ot_isp_mg_stats结构体较大,调用该接口时推荐调用malloc动态分配空间。
【举例】
无
【相关主题】
无
ss_mpi_isp_get_wb_stats¶
【描述】
获取AWB统计信息。
【语法】
td_s32 ss_mpi_isp_get_wb_stats(ot_vi_pipe vi_pipe, ot_isp_wb_stats *wb_stat);
【参数】
【返回值】
失败,其值为错误码。 |
【需求】
头文件:ot_common_isp.h、ss_mpi_isp.h
库文件:libot_isp.a、libss_isp.a
【注意】
ot_isp_wb_stats结构体较大,调用该接口时推荐调用malloc动态分配空间。
【举例】
无
【相关主题】
无
ss_mpi_isp_get_wb_stitch_stats¶
【描述】
获取拼接模式下WB统计信息。
【语法】
td_s32 ss_mpi_isp_get_wb_stitch_stats (ot_vi_pipe vi_pipe, ot_isp_wb_stitch_stats *stitch_wb_stat);
【参数】
【返回值】
失败,其值为错误码。 |
【需求】
头文件:ot_common_isp.h、ss_mpi_isp.h
库文件:libot_isp.a、libss_isp.a
【注意】
ot_isp_wb_stitch_stats结构体较大,调用该接口时推荐调用malloc动态分配空间。
【举例】
无
【相关主题】
无
ss_mpi_isp_get_focus_stats¶
【描述】
获取AF统计信息。
【语法】
td_s32 ss_mpi_isp_get_focus_stats(ot_vi_pipe vi_pipe, ot_isp_af_stats *af_stat);
【参数】
【返回值】
失败,其值为错误码。 |
【需求】
头文件:ot_common_isp.h、ss_mpi_isp.h
库文件:libot_isp.a、libss_isp.a
【注意】
ot_isp_af_stats结构体较大,调用该接口时推荐调用malloc动态分配空间。
【举例】
无
【相关主题】
无
数据类型¶
ot_isp_stats_cfg:定义ISP 3A统计信息配置。
ot_isp_stats_ctrl:定义ISP 3A统计信息使能。
ot_isp_ae_stats_cfg:定义AE统计信息配置。
ot_isp_ae_switch:定义AE统计模块在ISP pipeline的位置。
ot_isp_ae_four_plane_mode:FourPlaneMode使能。
ot_isp_ae_hist_skip: 直方图统计时采样点设置。
ot_isp_ae_hist_offset_x:直方图统计时水平方向起始点设置。
ot_isp_ae_hist_offset_y:直方图统计时垂直方向起始点设置。
ot_isp_ae_hist_config:定义全局直方图统计时的采样点方式。
ot_isp_ae_stat_mode:定义统计模块的开方模式。
ot_isp_ae_crop:对AE模块输入图像进行裁剪。
ot_isp_awb_switch:定义ISP WB统计模块在ISP pipeline的位置。
ot_isp_awb_gain_switch:定义AWB增益的位置。
ot_isp_awb_crop:对AWB模块输入图像进行裁剪。
ot_isp_wb_stats_cfg:定义AWB统计信息配置。
ot_isp_ae_grid_info:定义AE分区间统计信息的坐标信息。
ot_isp_ae_stats:定义AE统计信息。
ot_isp_ae_stitch_stats:定义拼接模式AE统计信息。
ot_isp_mg_grid_info:定义MG分区间统计信息的坐标信息。
ot_isp_mg_stats:定义MG统计信息。
ot_isp_awb_grid_info:定义AWB分区间统计信息的坐标信息。
ot_isp_wb_stats:定义AWB统计信息。
ot_isp_wb_stitch_stats:定义拼接模式AWB统计信息。
OT_ISP_IIR_EN_NUM:定义AF IIR使能的个数。
OT_ISP_IIR_GAIN_NUM:定义AF IIR gain的个数。
OT_ISP_IIR_SHIFT_NUM:定义AF IIR shift的个数。
OT_ISP_ACC_SHIFT_H_NUM:定义AF IIR累加统计shift的个数。
OT_ISP_ACC_SHIFT_V_NUM:定义AF FIR累加统计shift的个数。
OT_ISP_AF_ZONE_ROW:定义AF水平方向的分块个数。
OT_ISP_AF_ZONE_COLUMN:定义AF垂直方向的分块个数。
ot_isp_focus_stats_cfg:定义AF统计信息配置。
ot_isp_af_cfg:定义AF统计信息配置参数。
ot_isp_af_peak_mode:统计模式。
ot_isp_af_square_mode:平方模式。
ot_isp_af_crop:AF输入图像的裁剪。
ot_isp_af_stats_pos:AF统计位置。
ot_isp_af_raw_cfg:AF RAW域统计配置。
ot_isp_af_pre_filter_cfg:AF预滤波器配置。
ot_isp_af_level_depend:AF Level Depend Gain配置。
ot_isp_af_coring:AF Coring 配置。
ot_isp_af_h_param:AF统计水平滤波器IIR参数设置。
ot_isp_af_v_param:AF统计水平滤波器IIR参数设置。
ot_isp_af_fv_param:AF统计结果输出格式参数。
ot_isp_focus_zone:定义AF统计信息参数。
ot_isp_fe_focus_stats:定义FE AF统计信息。
ot_isp_be_focus_stats:定义BE AF统计信息。
ot_isp_focus_grid_info:定义AF分区间统计信息的坐标信息。
ot_isp_af_stats:定义FE和BE的AF统计信息。
ot_isp_stats_cfg¶
【说明】
定义ISP 3A统计信息配置。
【定义】
typedef struct {
ot_isp_stats_ctrl key;
ot_isp_ae_stats_cfg ae_cfg;
ot_isp_wb_stats_cfg wb_cfg;
ot_isp_focus_stats_cfg focus_cfg;
} ot_isp_stats_cfg;
【成员】
【注意事项】
无。
【相关数据类型及接口】
无
ot_isp_stats_ctrl¶
【说明】
定义ISP 3A统计信息使能。
【定义】
typedef union {
td_u64 key;
struct {
td_u64 bit1_fe_ae_global_stat : 1 ; /* [0] */
td_u64 bit1_fe_ae_local_stat : 1 ; /* [1] */
td_u64 bit1_fe_ae_stitch_global_stat : 1 ; /* [2] */
td_u64 bit1_fe_ae_stitch_local_stat : 1 ; /* [3] */
td_u64 bit1_be_ae_global_stat : 1 ; /* [4] */
td_u64 bit1_be_ae_local_stat : 1 ; /* [5] */
td_u64 bit1_be_ae_stitch_global_stat : 1 ; /* [6] */
td_u64 bit1_be_ae_stitch_local_stat : 1 ; /* [7] */
td_u64 bit1_awb_stat1 : 1 ; /* [8] */
td_u64 bit1_awb_stat2 : 1 ; /* [9] */
td_u64 bit2_reserved0 : 2 ; /* [10:11] */
td_u64 bit1_fe_af_stat : 1 ; /* [12] */
td_u64 bit1_be_af_stat : 1 ; /* [13] */
td_u64 bit2_reserved1 : 2 ; /* [14:15] */
td_u64 bit1_dehaze : 1 ; /* [16] */
td_u64 bit1_mg_stat : 1 ; /* [17] */
td_u64 bit1_extend_stats : 1; /* [18] */
td_u64 bit13_reserved : 13; /* [19:31] */
td_u64 bit32_isr_access : 32; /* [32:63] */
};
} ot_isp_stats_ctrl;
【成员】
【注意事项】
用户可以关闭不使用的统计信息,如此就不会读相应统计信息,从而提高系统性能。
bit1_fe_ae_global_stat~ bit13_reserved 32个bit为使用ss_mpi_isp_get_xx_stats接口(xx表示AE/AWB/AF)获取统计信息时相应的开关。isp firmware运转需要获取统计信息供相关算法使用。
如果用户使用ss_mpi_isp_get_xx_stats(xx表示AE/AWB/AF)实现自己的3A算法,可以通过disable bit32_isr_access中相应的bit来关掉中断服务程序中相关统计信息的更新以达到降低CPU占用率的目的。bit32_isr_access中bit顺序定义也是bit1_fe_ae_global_stat~ bit14_reserved。
例如:可以置零bit32_isr_access的bit0来停止更新fe_ae_global_stat统计信息。
如果用户需要使用FE统计信息估算出来的BE统计信息,则需要打开bit1_extend_stats扩展统计信息使能。
【相关数据类型及接口】
无
ot_isp_ae_stats_cfg¶
【说明】
定义AE统计信息配置。
【定义】
typedef struct {
ot_isp_ae_switch ae_switch;
ot_isp_ae_hist_config hist_config;
ot_isp_ae_four_plane_mode four_plane_mode;
ot_isp_ae_stat_mode hist_mode;
ot_isp_ae_stat_mode aver_mode;
ot_isp_ae_stat_mode max_gain_mode;
ot_isp_ae_crop crop;
ot_isp_ae_crop fe_crop;
td_u8 weight[OT_ISP_AE_ZONE_ROW][OT_ISP_AE_ZONE_COLUMN];
} ot_isp_ae_stats_cfg;
【成员】
MG模块开方模式。0为不开方,1为开方。仅影响MG模块统计信息。为了与AE分块统计信息进行比较,建议与aver_mode配置为同一模式。 |
|
【注意事项】
线性模式数据流走的是channel 1,默认使用全局1024段直方图进行AE控制,此时channel 2/3/4 WDR合成前全局1024段直方图全为0。
全局4分量统计平均值会受15*17权重表的影响,。
Channel 1/2/3/4全局1024段段直方图会受15*17权重表的影响,WDR模式可以使用这几路直方图信息进行AE控制。如2合1可使用channel 1/2,3合1可使用channel 1/2/3,4合1可使用channel 1/2/3/4等。
配置ae_switch/hist_config/four_plane_mode相关参数时,需要把AE的大面积单色判断功能关闭。
自动曝光的静态统计信息分为15*17个区域,可通过设定权重表改变每个区域的权重。如可使中心区域的权重加大,则中心区域的亮度变化会使图像的全局直方图统计信息产生更多的变化。该属性可调节感兴趣区域的曝光权重,可用于实现指定区域的背光补偿。若能确定具体产品形态感兴趣区域的位置,可将这些位置的权重加大。如对于运动DV和行车记录仪,感兴趣区域一般在画面的中下部分,那么可适当加大场景中下部分区域的权重,使得感兴趣区域得到合理曝光。
WDR模式下,hist_mode、aver_mode、max_gain_mode推荐使用root模式(不开方模式),但是如果BLC偏移导致AE统计信息误差偏大,可以切换为normal模式(开方模式),减少统计信息误差。
【相关数据类型及接口】
无
ot_isp_ae_switch¶
【说明】
定义AE统计模块在ISP pipeline的位置。
【定义】
typedef enum {
OT_ISP_AE_AFTER_DG = 0,
OT_ISP_AE_AFTER_WB,
OT_ISP_AE_AFTER_DRC,
OT_ISP_AE_SWITCH_BUTT
} ot_isp_ae_switch;
【成员】
【注意事项】
配置此参数时,需要把AE的大面积单色判断功能关闭。
【相关数据类型及接口】
ot_isp_ae_four_plane_mode¶
【说明】
FourPlaneMode使能。
【定义】
typedef enum {
OT_ISP_AE_FOUR_PLANE_MODE_DISABLE = 0,
OT_ISP_AE_FOUR_PLANE_MODE_ENABLE,
OT_ISP_AE_FOUR_PLANE_MODE_BUTT
} ot_isp_ae_four_plane_mode;
【成员】
【注意事项】
配置此参数时,需要把AE的大面积单色判断功能关闭。
【相关数据类型及接口】
ot_isp_ae_hist_skip¶
【说明】
直方图统计时采样点设置。
【定义】
typedef enum {
OT_ISP_AE_HIST_SKIP_EVERY_PIXEL = 0,
OT_ISP_AE_HIST_SKIP_EVERY_2ND_PIXEL,
OT_ISP_AE_HIST_SKIP_EVERY_3RD_PIXEL,
OT_ISP_AE_HIST_SKIP_EVERY_4TH_PIXEL,
OT_ISP_AE_HIST_SKIP_EVERY_5TH_PIXEL,
OT_ISP_AE_HIST_SKIP_EVERY_8TH_PIXEL,
OT_ISP_AE_HIST_SKIP_EVERY_9TH_PIXEL,
OT_ISP_AE_HIST_SKIP_BUTT
} ot_isp_ae_hist_skip;
【成员】
【注意事项】
无
【相关数据类型及接口】
ot_isp_ae_hist_offset_x¶
【说明】
直方图统计时水平方向起始点设置。
【定义】
typedef enum {
OT_ISP_AE_HIST_START_FORM_FIRST_COLUMN = 0,
OT_ISP_AE_HIST_START_FORM_SECOND_COLUMN,
OT_ISP_AE_HIST_OFFSET_X_BUTT
} ot_isp_ae_hist_offset_x;
【成员】
【注意事项】
无
【相关数据类型及接口】
ot_isp_ae_hist_offset_y¶
【说明】
直方图统计时垂直方向起始点设置。
【定义】
typedef enum {
OT_ISP_AE_HIST_START_FORM_FIRST_ROW = 0,
OT_ISP_AE_HIST_START_FORM_SECOND_ROW,
OT_ISP_AE_HIST_OFFSET_Y_BUTT
} ot_isp_ae_hist_offset_y;
【成员】
【注意事项】
无
【相关数据类型及接口】
ot_isp_ae_hist_config¶
【说明】
定义全局直方图统计时的采样点方式。
【定义】
typedef struct {
ot_isp_ae_hist_skip hist_skip_x;
ot_isp_ae_hist_skip hist_skip_y;
ot_isp_ae_hist_offset_x hist_offset_x;
ot_isp_ae_hist_offset_y hist_offset_y;
} ot_isp_ae_hist_config;
【成员】
【注意事项】
可根据Sensor输入的Bayer数据格式,合理配置该结构体,使得全局直方图统计时只计入某单个分量数据。
RGBIR模式推荐全局直方图统计时只计入G分量,可根据RGBIR Sensor的Bayer数据格式合理配置该结构体实现。
配置hist_config相关参数时,需要把AE的大面积单色判断功能关闭。
【相关数据类型及接口】
无
ot_isp_ae_stat_mode¶
【说明】
定义统计模块的开方模式。
【定义】
typedef enum {
OT_ISP_AE_NORMAL = 0,
OT_ISP_AE_ROOT,
OT_ISP_AE_STAT_MODE_BUTT
} ot_isp_ae_stat_mode;
【成员】
【注意事项】
无
【相关数据类型及接口】
ot_isp_ae_crop¶
【说明】
对AE模块输入图像进行裁剪。
【定义】
typedef struct {
td_bool en;
td_u16 x;
td_u16 y;
td_u16 width;
td_u16 height;
} ot_isp_ae_crop;
【成员】
【注意事项】
默认分块数下,当裁剪图像宽小于820或高小于200时,AE统计信息仅全局直方图可用。
水平方向起始位置与Crop宽度之和应小于图像宽度,垂直方向起始位置与Crop高度之和应小于图像高度。
对于BE的AE统计信息,ISP BE分块场景下,不支持AE CROP(输入图像裁剪)功能。
AE CROP(输入图像裁剪)参数会同步对MG模块生效。
AE的FE1、FE2、FE3统计图像大小限制为4096X4096,如果图像大于4096X4096,需要将图像裁剪为小于4096X4096,WDR模式FE1同理。
【相关数据类型及接口】
ot_isp_awb_switch¶
【说明】
定义AWB统计模块在ISP pipeline的位置。
【定义】
typedef enum {
OT_ISP_AWB_AFTER_DG = 0,
OT_ISP_AWB_AFTER_EXPANDER,
OT_ISP_AWB_AFTER_DRC,
OT_ISP_AWB_SWITCH_BUTT
} ot_isp_awb_switch;
【成员】
【注意事项】
SS928V100不支持配置AWB统计模块位置在Expander后。
【相关数据类型及接口】
ot_isp_awb_gain_switch¶
【说明】
定义AWB增益的位置。
【定义】
typedef enum {
OT_ISP_AWB_GAIN_IN_ISP = 0,
OT_ISP_AWB_GAIN_IN_SENSOR,
OT_ISP_AWB_GAIN_IN_BUTT
} ot_isp_awb_gain_switch;
【成员】
【注意事项】
无
【相关数据类型及接口】
无
ot_isp_awb_crop¶
【说明】
对AWB模块输入图像进行裁剪。
【定义】
typedef struct {
td_bool en;
td_u16 x;
td_u16 y;
td_u16 width;
td_u16 height;
} ot_isp_awb_crop;
【成员】
【注意事项】
AWB要求每个分块的最小分辨率为60*14,当裁剪后的图像分辨率较小,分块数较多时,如果每块的分辨率小于60x14,那么需要减少分块数,以免每块过小。
水平方向起始位置与Crop宽度之和应小于图像宽度,垂直方向起始位置与Crop高度之和应小于图像高度。
ISP BE分块场景下,不支持AWB CROP(输入图像裁剪)功能。
【相关数据类型及接口】
ot_isp_wb_stats_cfg¶
【说明】
定义AWB统计信息配置。
【定义】
typedef struct {
ot_isp_awb_switch awb_switch;
td_u16 zone_row;
td_u16 zone_col;
td_u16 white_level;
td_u16 black_level;
td_u16 cb_max;
td_u16 cb_min;
td_u16 cr_max;
td_u16 cr_min;
ot_isp_awb_crop crop;
} ot_isp_wb_stats_cfg;
【成员】
WB统计水平方向分块个数,取值范围:[BlkNum, min(0x20, ImageWidth/60)], BlkNum为ISP BE的分块数目。 |
|
【注意事项】
拼接模式下,每一路的参数是独立配置的。每一路的分块个数都需要配置,而且需要相同。即每一路的awb_switch,zone_row,zone_col需要相同。
【相关数据类型及接口】
无
ot_isp_ae_grid_info¶
【说明】
定义AE分区间统计信息的坐标信息。
【定义】
typedef struct {
td_u16 grid_y_pos[OT_ISP_AE_ZONE_ROW + 1];
td_u16 grid_x_pos[OT_ISP_AE_ZONE_COLUMN + 1];
td_u8 status;
} ot_isp_ae_grid_info;
【成员】
【注意事项】
非分块场景下,AE分区间统计信息为15*17个均匀分区的统计信息。
BE分块场景下,AE分区间统计信息的分区大小是不均匀的,若按照均匀分区间的方式显示AE统计信息,会出现图像与统计信息不对应的情况,为避免这种问题,故提供每个分区的起始坐标信息。
【相关数据类型及接口】
无
ot_isp_ae_stats¶
【说明】
定义AE统计信息。
【定义】
typedef struct {
td_u32 fe_hist1024_value[OT_ISP_WDR_MAX_FRAME_NUM][OT_ISP_HIST_NUM];
td_u16 fe_global_avg[OT_ISP_WDR_MAX_FRAME_NUM][OT_ISP_BAYER_CHN_NUM];
td_u16 fe_zone_avg[OT_ISP_WDR_MAX_FRAME_NUM][OT_ISP_AE_ZONE_ROW][OT_ISP_AE_ZONE_COLUMN][OT_ISP_BAYER_CHN_NUM];
td_u32 be_estimate_hist1024_value[OT_ISP_HIST_NUM];
td_u32 be_hist1024_value[OT_ISP_HIST_NUM];
td_u16 be_global_avg[OT_ISP_BAYER_CHN_NUM];
td_u16 be_zone_avg[OT_ISP_AE_ZONE_ROW][OT_ISP_AE_ZONE_COLUMN][OT_ISP_BAYER_CHN_NUM];
ot_isp_ae_grid_info fe_grid_info;
ot_isp_ae_grid_info be_grid_info;
td_u64 pts;
} ot_isp_ae_stats;
【成员】
【注意事项】
WDR模式下只在主路即最短帧所在Pipe才可以获取所有长短帧的统计信息,以WDR2TO1为例,OT_ISP_WDR_MAX_FRAME_NUM对应下标为0时表示短帧统计信息,为1时表示长帧信息。
WDR合成前(FE)统计信息受到位于FE AE之前处理模块(FE AE之前的模块有DG/WB)增益影响,这些模块的FE增益值由算法内部保证与BE保持一致,无需单独配置。
当图像宽小于600或高小于200时,分区间统计信息不可用。
be_estimate_hist1024_value仅在2合1WDR模式下可使用,且仅支持估算DG后的统计信息,该直方图形式不支持FourPlaneMode。噪声会对BE统计信息有影响,在噪声大的场景,开启BNR之后,估算的统计信息不能接近真实的BE统计信息。另外DPC、CRB、LSC等模块也会影响统计信息的估算。
YUV模式不支持获取统计信息pts。
pts每帧都会覆盖更新,若需要获取到每一帧raw对应的统计信息pts,则需要以帧间隔调用此接口;否则,统计信息pts与raw pts可能不是一一对应的。
【相关数据类型及接口】
ot_isp_ae_stitch_stats¶
【说明】
定义拼接模式AE统计信息。
【定义】
typedef struct {
td_u32 fe_hist1024_value[OT_ISP_WDR_MAX_FRAME_NUM][OT_ISP_HIST_NUM];
td_u16 fe_global_avg[OT_ISP_WDR_MAX_FRAME_NUM][OT_ISP_BAYER_CHN_NUM];
td_u16 fe_zone_avg[OT_ISP_MAX_PIPE_NUM][OT_ISP_WDR_MAX_FRAME_NUM][OT_ISP_AE_ZONE_ROW][OT_ISP_AE_ZONE_COLUMN][OT_ISP_BAYER_CHN_NUM];
td_u32 be_hist1024_value[OT_ISP_HIST_NUM];
td_u16 be_global_avg[OT_ISP_BAYER_CHN_NUM];
td_u16 be_zone_avg[OT_ISP_MAX_PIPE_NUM][OT_ISP_AE_ZONE_ROW][OT_ISP_AE_ZONE_COLUMN][OT_ISP_BAYER_CHN_NUM];
td_u64 pts;
} ot_isp_ae_stitch_stats;
【成员】
【注意事项】
拼接后统计信息仅在拼接模式下生效,并且仅在拼接主路可以获取。
拼接后的分块均值只有参与拼接的Pipe分区间均值有效,其余Pipe的均值无效。如Pipe0和Pipe1进行拼接,则OT_ISP_MAX_PIPE_NUM对应下标为0,1时fe_zone_avg/be_zone_avg才有有效统计信息。
WDR模式下只在拼接主路即最短帧所在Pipe才可以获取所有长短帧的统计信息,以WDR2TO1为例,OT_ISP_WDR_MAX_FRAME_NUM对应下标为0时表示短帧统计信息,为1时表示长帧信息。
WDR合成前(FE)统计信息受到位于FE AE之前处理模块(FE AE之前的模块有DG/WB)增益影响,这些模块的FE增益值由算法内部保证与BE保持一致,无需单独配置。
YUV模式不支持获取统计信息pts。
pts每帧都会覆盖更新,若需要获取到每一帧raw对应的统计信息pts,则需要以帧间隔调用此接口;否则,统计信息pts与raw pts可能不是一一对应的。
【相关数据类型及接口】
无
ot_isp_mg_grid_info¶
【说明】
定义MG分区间统计信息的坐标信息。
【定义】
typedef struct {
td_u16 grid_y_pos[OT_ISP_MG_ZONE_ROW + 1];
td_u16 grid_x_pos[OT_ISP_MG_ZONE_COLUMN + 1];
td_u8 status;
} ot_isp_mg_grid_info;
【成员】
【注意事项】
非分块场景下,MG分区间统计信息为15*17个均匀分区的统计信息。
BE分块场景下,MG分区间统计信息的分区大小是不均匀的,若按照均匀分区间的方式显示MG统计信息,会出现图像与统计信息不对应的情况,为避免这种问题,故提供每个分区的起始坐标信息。
【相关数据类型及接口】
无
ot_isp_mg_stats¶
【说明】
定义MG统计信息。
【定义】
typedef struct {
td_u16 zone_avg[OT_ISP_MG_ZONE_ROW][OT_ISP_MG_ZONE_COLUMN][OT_ISP_BAYER_CHN_NUM];
ot_isp_mg_grid_info grid_info;
} ot_isp_mg_stats;
【成员】
【注意事项】
无
【相关数据类型及接口】
无
ot_isp_awb_grid_info¶
【说明】
定义AWB分区间统计信息的坐标信息。
【定义】
typedef struct {
td_u16 grid_y_pos[OT_ISP_AWB_ZONE_ORIG_ROW + 1];
td_u16 grid_x_pos[OT_ISP_AWB_ZONE_ORIG_COLUMN + 1];
td_u8 status;
} ot_isp_awb_grid_info;
【成员】
【注意事项】
非分块场景下,AWB分区间统计信息为zone_row* zone_col个均匀分区的统计信息。
BE分块场景下,AWB分区间统计信息的分区大小是不均匀的,若按照均匀分区间的方式显示AWB统计信息,会出现图像与统计信息不对应的情况,为避免这种问题,故提供每个分区的起始坐标信息。
【相关数据类型及接口】
无
ot_isp_wb_stats¶
【说明】
定义AWB统计信息。
【定义】
typedef struct {
td_u16 global_r;
td_u16 global_g;
td_u16 global_b;
td_u16 count_all;
td_u16 zone_avg_r[OT_ISP_AWB_ZONE_NUM];
td_u16 zone_avg_g[OT_ISP_AWB_ZONE_NUM];
td_u16 zone_avg_b[OT_ISP_AWB_ZONE_NUM];
td_u16 zone_count_all[OT_ISP_AWB_ZONE_NUM];
ot_isp_awb_grid_info grid_info;
td_u64 pts;
} ot_isp_wb_stats;
【成员】
【注意事项】
表 1 AWB区域统计信息(以zone_avg_r为例,zone_row=32,zone_col=32)
zone_count_all做归一化是为了消除分辨率差异对灰点个数的影响。归一化公式:CountAll = (Count of Gray Pixels << 16) / (Count of All Pixels)。
YUV模式不支持获取统计信息pts。
pts每帧都会覆盖更新,若需要获取到每一帧raw对应的统计信息pts,则需要以帧间隔调用此接口;否则,统计信息pts与raw pts可能不是一一对应的。
【相关数据类型及接口】
无
ot_isp_wb_stitch_stats¶
【说明】
定义拼接模式WB统计信息。
【定义】
typedef struct {
td_u16 zone_row;
td_u16 zone_col;
td_u16 zone_avg_r[OT_ISP_AWB_ZONE_STITCH_MAX];
td_u16 zone_avg_g[OT_ISP_AWB_ZONE_STITCH_MAX];
td_u16 zone_avg_b[OT_ISP_AWB_ZONE_STITCH_MAX];
td_u16 zone_count_all[OT_ISP_AWB_ZONE_STITCH_MAX];
td_u64 pts;
} ot_isp_wb_stitch_stats;
【成员】
【注意事项】
AWB统计信息的排列顺序请参考表1。
拼接后统计信息仅在拼接模式下生效,并且仅在拼接主路可以获取。
YUV模式不支持获取统计信息pts。
pts每帧都会覆盖更新,若需要获取到每一帧raw对应的统计信息pts,则需要以帧间隔调用此接口;否则,统计信息pts与raw pts可能不是一一对应的。
【相关数据类型及接口】
无
OT_ISP_IIR_EN_NUM¶
【说明】
定义AF IIR使能的个数。
【定义】
#define OT_ISP_IIR_EN_NUM 3
【注意事项】
无。
【相关数据类型及接口】
OT_ISP_IIR_GAIN_NUM¶
【说明】
定义AF IIR gain的个数。
【定义】
#define OT_ISP_IIR_GAIN_NUM 7
【注意事项】
无。
【相关数据类型及接口】
OT_ISP_IIR_SHIFT_NUM¶
【说明】
定义AF IIR shift的个数。
【定义】
#define OT_ISP_IIR_SHIFT_NUM 4
【注意事项】
无。
【相关数据类型及接口】
OT_ISP_FIR_GAIN_NUM¶
【说明】
定义AF FIR gain的个数。
【定义】
#define OT_ISP_FIR_GAIN_NUM 5
【注意事项】
无。
【相关数据类型及接口】
OT_ISP_ACC_SHIFT_H_NUM¶
【说明】
定义AF IIR累加统计shift的个数。
【定义】
#define OT_ISP_ACC_SHIFT_H_NUM 2
【注意事项】
无。
【相关数据类型及接口】
OT_ISP_ACC_SHIFT_V_NUM¶
【说明】
定义AF FIR累加统计shift的个数。
【定义】
#define OT_ISP_ACC_SHIFT_V_NUM 2
【注意事项】
无。
【相关数据类型及接口】
OT_ISP_AF_ZONE_ROW¶
【说明】
定义AF水平方向的分块个数。
【定义】
#define OT_ISP_AF_ZONE_ROW 15
【注意事项】
无。
【相关数据类型及接口】
OT_ISP_AF_ZONE_COLUMN¶
【说明】
定义AF垂直方向的分块个数。
【定义】
#define OT_ISP_AF_ZONE_COLUMN 17
【注意事项】
无。
【相关数据类型及接口】
ot_isp_focus_stats_cfg¶
【说明】
定义AF统计信息配置。
【定义】
typedef struct {
ot_isp_af_cfg config;
ot_isp_af_h_param h_param_iir0;
ot_isp_af_h_param h_param_iir1;
ot_isp_af_v_param v_param_fir0;
ot_isp_af_v_param v_param_fir1;
ot_isp_af_fv_param fv_param;
} ot_isp_focus_stats_cfg;
【成员】
【注意事项】
当分辨率较小,分块数较多时,如果每块的分辨率小于32x32,那么需要减少分块数,以免每块过小。建议在分辨率小的情况下,使用较少的分块数。
【相关数据类型及接口】
无
ot_isp_af_cfg¶
【说明】
定义AF统计信息配置参数。
【定义】
typedef struct {
td_bool af_en;
td_u16 zone_col;
td_u16 zone_row;
ot_isp_af_peak_mode peak_mode;
ot_isp_af_square_mode square_mode;
ot_isp_af_crop crop;
ot_isp_af_crop fe_crop;
ot_isp_af_stats_pos stats_pos;
ot_isp_af_raw_cfg raw_cfg;
ot_isp_af_pre_filter_cfg pre_flt_cfg;
td_u16 high_luma_threshold
} ot_isp_af_cfg;
【成员】
【注意事项】
分区间统计值的计算方式为:
peak_mode为OT_ISP_AF_STA_NORM且square_mode为OT_ISP_AF_STA_SUM_NORM模式时,对分区间内每个像素的滤波器输出值求和即为分区间统计值;
peak_mode为OT_ISP_AF_STA_NORM且square_mode为OT_ISP_AF_STA_SUM_SQUARE模式时,对分区间内每个像素的滤波器输出值求平方和即为分区间统计值;
peak_mode为OT_ISP_AF_STA_PEAK且square_mode为OT_ISP_AF_STA_SUM_NORM模式时,先对分区间内一行中每个像素的滤波器输出值取最大值,再对多行的最大值求和即为分区间统计值;
peak_mode为OT_ISP_AF_STA_PEAK且square_mode为OT_ISP_AF_STA_SUM_SQUARE模式时,先对分区间内一行中每个像素的滤波器输出值取最大值,再对多行的最大值求平方和即为分区间统计值。
分区间亮度统计值(y)的计算方式为:
对分区间内每个像素的亮度求和即为分区间亮度统计值(y)。
当ISP BE处于分块方式时,AF统计信息的水平方向窗口个数最小为BlockNum(BlockNum可以参考ISP 的proc信息)分块的个数,此时取值范围为[BlockNum, 17]。
【相关数据类型及接口】
无
ot_isp_af_peak_mode¶
【说明】
PEAK模式,决定分区间统计值是否进行求峰值处理。
【定义】
typedef enum {
OT_ISP_AF_STA_NORM = 0,
OT_ISP_AF_STA_PEAK ,
OT_ISP_AF_STA_BUTT
} ot_isp_af_peak_mode;
【成员】
【注意事项】
无
【相关数据类型及接口】
无
ot_isp_af_square_mode¶
【说明】
平方模式,决定分区间统计值是否进行平方处理。
【定义】
typedef enum {
OT_ISP_AF_STA_SUM_NORM = 0,
OT_ISP_AF_STA_SUM_SQUARE,
OT_ISP_AF_STA_SUM_BUTT
} ot_isp_af_square_mode;
【成员】
【注意事项】
采用Square模式,会对滤波器输出归一化后平方再做统计,如图1所示,input为滤波后输出像素值,output为处理后输出值,相比normal模式,在临近焦点附近可以得到比较陡峭的FV曲线,并且对幅值较小的噪声信号有一定的抑制作用,但也会使FV曲线平坦区域更加平坦,用户应该根据实际的场景需求来设定这个参数。
【相关数据类型及接口】
无
ot_isp_af_crop¶
【说明】
对AF模块输入图像进行裁剪。
【定义】
typedef struct {
td_bool en;
td_u16 x;
td_u16 y;
td_u16 width;
td_u16 height;
} ot_isp_af_crop;
【成员】
【注意事项】
水平方向起始位置与Crop宽度之和应小于图像宽度,垂直方向起始位置与Crop高度之和应小于图像高度。
对于BE的AF统计信息,ISP BE 分块场景下,不支持AF CROP(输入图像裁剪)功能。
【相关数据类型及接口】
无
ot_isp_af_stats_pos¶
【说明】
配置AF模块统计位置。
【定义】
typedef enum {
OT_ISP_AF_STATS_AFTER_DGAIN = 0,
OT_ISP_AF_STATS_AFTER_DRC,
OT_ISP_AF_STATS_AFTER_CSC,
OT_ISP_AF_STATS_BUTT
} ot_isp_af_stats_pos;
【成员】
【注意事项】
WDR模式下,非宽动态场景的Bayer域(即RAW域)统计信息无明显变化趋势,推荐使用YUV域统计信息。
AF的FE统计信息只支持DGain之后进行统计,而BE统计信息支持DGain、DRC和CSC之后进行统计,详见《ISP 图像调优指南》文档的ISP功能框图章节。
【相关数据类型及接口】
无
ot_isp_af_raw_cfg¶
【说明】
AF模块Bayer域配置。
【定义】
typedef struct {
td_u8 gamma_gain_limit;
td_u8 gamma_value;
ot_isp_bayer_format bayer_format;
} ot_isp_af_raw_cfg;
【成员】
设置Bayer pattern,支持BAYER_RGGB,BAYER_GRBG,BAYER_GBRG,BAYER_BGGR四种。 |
【注意事项】
无
【相关数据类型及接口】
无
ot_isp_af_pre_filter_cfg¶
【说明】
AF模块预滤波器配置。
【定义】
typedef struct {
td_bool en;
td_u16 strength;
} ot_isp_af_pre_filter_cfg;
【成员】
【注意事项】
无
【相关数据类型及接口】
无
ot_isp_af_level_depend¶
【说明】
AF Level Depend Gain 模块配置。
【定义】
typedef struct {
td_bool en;
td_u16 threshold_low;
td_u16 gain_low;
td_u16 slope_low;
td_u16 threshold_high;
td_u16 gain_high;
td_u16 slope_high;
} ot_isp_af_level_depend;
【成员】
【注意事项】
无
【相关数据类型及接口】
无
ot_isp_af_coring¶
【说明】
AF Coring 模块配置。
【定义】
typedef struct {
td_u16 threshold;
td_u16 slope;
td_u16 limit;
} ot_isp_af_coring;
【成员】
【注意事项】
无
【相关数据类型及接口】
无
ot_isp_af_h_param¶
【说明】
AF统计水平滤波器IIR参数设置。
【定义】
typedef struct {
td_bool narrow_band_en;
td_bool iir_en[OT_ISP_IIR_EN_NUM];
td_u8 iir_shift;
td_s16 iir_gain[OT_ISP_IIR_GAIN_NUM];
td_u16 iir_shift_lut[OT_ISP_IIR_SHIFT_NUM];
ot_isp_af_level_depend level_depend;
ot_isp_af_coring coring;
} ot_isp_af_h_param;
【成员】
iir_en[OT_ISP_IIR_EN_NUM] |
|
iir_gain[OT_ISP_IIR_GAIN_NUM] |
|
iir_shift_lut[OT_ISP_IIR_SHIFT_NUM] |
|
【注意事项】
iir_gain[0]为无符号8bit数,其他iir_gain[1]-[6]为有符号10bit数,且不能等于-512。IIR使能、narrow_band_en使能、滤波器系数以及iir_shift通过PQ Tools可以生成,用户可以根据实际需要调节LDG和Coring模块以获取最优FV统计值输出。
【相关数据类型及接口】
无
ot_isp_af_v_param¶
【说明】
AF统计垂直滤波器FIR参数设置。
【定义】
typedef struct {
td_s16 fir_gain[OT_ISP_FIR_GAIN_NUM];
ot_isp_af_level_depend level_depend;
ot_isp_af_coring coring;
} ot_isp_af_v_param;
【成员】
fir_gain[OT_ISP_FIR_GAIN_NUM] |
|
【注意事项】
FIR滤波器系数通过PQ Tools可以生成,用户可以根据实际需要调节LDG和Coring模块以获取最优垂直FV统计值输出。
【相关数据类型及接口】
无
ot_isp_af_fv_param¶
【说明】
AF统计结果输出格式参数。
【定义】
typedef struct {
td_u16 acc_shift_y;
td_u16 acc_shift_h[OT_ISP_ACC_SHIFT_H_NUM];
td_u16 acc_shift_v[OT_ISP_ACC_SHIFT_V_NUM];
td_u16 hl_cnt_shift;
} ot_isp_af_fv_param;
【成员】
acc_shift_h[OT_ISP_ACC_SHIFT_H_NUM] |
|
acc_shift_v[OT_ISP_ACC_SHIFT_V_NUM] |
|
【注意事项】
FV值用unsigned 16bit表示,当场景细节较多或噪声较多时,FV值可能会溢出,这就需要对输出进行向右移位以保证输出在合理范围。用户根据自己的需求对相应的shift值进行调节。
【相关数据类型及接口】
无
ot_isp_focus_zone¶
【说明】
定义AF统计信息参数。
【定义】
typedef struct {
td_u16 v1;
td_u16 h1;
td_u16 v2;
td_u16 h2;
td_u16 y;
td_u16 hl_cnt;
} ot_isp_focus_zone;
【成员】
【注意事项】
y为每个块的Y分量累加值,用户可以用此值辅助AF算法,比如某些块中含有高亮光源,容易对FV值产生干扰,可根据亮度情况降低块FV对全局FV的影响,亦可用这些块实现一个移动侦测算法,用于检测聚焦过程中的一些运动干扰,用户可以根据自己AF算法的需求使用这个字段的统计信息。
【相关数据类型及接口】
无
ot_isp_fe_focus_stats¶
【说明】
定义FE AF统计信息。
【定义】
typedef struct {
ot_isp_focus_zone zone_metrics[OT_ISP_WDR_MAX_FRAME_NUM][OT_ISP_AF_ZONE_ROW][OT_ISP_AF_ZONE_COLUMN];
} ot_isp_fe_focus_stats;
【成员】
【注意事项】
无
【相关数据类型及接口】
无
ot_isp_be_focus_stats¶
【说明】
定义BE AF统计信息。
【定义】
typedef struct {
ot_isp_focus_zone zone_metrics[OT_ISP_AF_ZONE_ROW][OT_ISP_AF_ZONE_COLUMN];
} ot_isp_be_focus_stats;
【成员】
【注意事项】
无
【相关数据类型及接口】
无
ot_isp_focus_grid_info¶
【说明】
定义AF分区间统计信息的坐标信息。
【定义】
typedef struct {
td_u16 grid_y_pos[OT_ISP_AF_ZONE_ROW + 1];
td_u16 grid_x_pos[OT_ISP_AF_ZONE_COLUMN + 1];
td_u8 status;
} ot_isp_focus_grid_info;
【成员】
【注意事项】
非分块场景下,AF分区间统计信息为zone_col * zone_row个均匀分区的统计信息。
BE分块场景下,AF分区间统计信息的分区大小是不均匀的,若按照均匀分区间的方式显示AF统计信息,会出现图像与统计信息不对应的情况,为避免这种问题,故提供每个分区的起始坐标信息。
【相关数据类型及接口】
无
ot_isp_af_stats¶
【说明】
定义FE和BE的AF统计信息。
【定义】
typedef struct {
ot_isp_fe_focus_stats fe_af_stat;
ot_isp_be_focus_stats be_af_stat;
ot_isp_focus_grid_info fe_af_grid_info;
ot_isp_focus_grid_info be_af_grid_info;
td_u64 pts;
} ot_isp_af_stats;
【成员】
【注意事项】
线性模式下离线模式推荐使用FE的统计信息(实时性更佳)。
WDR模式下推荐使用BE DRC后的统计信息(参考ot_isp_af_stats_pos)。
SS928V100中AF支持从FE0获取统计信息,不支持从其他FE通道获取统计信息。请参考《ISP 图像调优指南》第2章关于ISP FE的说明。
YUV模式不支持获取统计信息pts。
pts每帧都会覆盖更新,若需要获取到每一帧raw对应的统计信息pts,则需要以帧间隔调用此接口;否则,统计信息pts与raw pts可能不是一一对应的。
VI离线时,如果需要获取到AF pts对应帧的AF BE统计信息,使用ss_mpi_isp_get_vd_time_out接口获取到帧起始中断后马上调用接口获取AF统计信息。
VI离线时,如果需要减少一帧AF BE统计信息获取延时(获取同一帧的AF FE、BE统计信息),使用ss_mpi_isp_get_vd_time_out接口获取到帧结束中断后马上调用接口获取AF统计信息。
AF统计信息中的宏定义OT_ISP_WDR_MAX_FRAME_NUM,表示当前统计信息所在的帧索引。默认情况下,只有索引0有统计信息。但是当pipe reverse之后,AF统计信息的索引也要相应调整。
【相关数据类型及接口】
无
Debug¶
概述¶
ISP提供Debug MPI供客户调用,以方便客户定位相关图像质量问题。
功能描述¶
Debug提供记录ISP在运行过程中的状态信息,以方便记录在ISP运行过程中出现的异常状态,需要记录的帧数可以由用户自己指定。
API参考¶
ss_mpi_isp_set_debug:设置ISP调试接口。
ss_mpi_isp_get_debug:获取ISP调试接口。
ss_mpi_isp_set_debug¶
【描述】
设置ISP调试信息属性。
【语法】
td_s32 ss_mpi_isp_set_debug(ot_vi_pipe vi_pipe, const ot_isp_debug_info *isp_debug);
【参数】
【返回值】
失败,其值为错误码。 |
【需求】
头文件:ot_common_isp.h、ss_mpi_isp.h
库文件:libot_isp.a、libss_isp.a
【注意】
调试信息的成员变量为SYS,可以设置使能开关。
需要用户来分配内存以存储相应的调试信息,且需要将分配的内存地址作为输入传入。
调用该接口的进程需要与isp主进程是不同进程。
【举例】
td_s32 ret = 0;
td_u32 depth = 10;
td_u32 size = 0;
ot_isp_debug_info debug_info;
ot_void *virt_aAddr = OT_NULL; /* virt addr malloc memory */
td_u64 phys_Addr;
size = sizeof(ot_isp_debug_attr) + sizeof(ot_isp_debug_status) * depth;
ret = ss_mpi_sys_mmz_alloc(&phys_Addr, &virt_aAddr, OT_NULL, OT_NULL, size);
if (ret != TD_SUCCESS) {
printf("Buf not enough!\n");
return TD_FAILURE;
}
debug_info.debug_en = TD_TRUE;
debug_info.depth = depth;
debug_info.phys_addr = phys_Addr;
ret = ss_mpi_isp_set_debug(vi_pipe, &debug_info);
if (ret != TD_SUCCESS) {
printf("ss_mpi_isp_set_debug failed 0x%x!\n", ret);
return TD_FAILURE;
}
【相关主题】
无
ss_mpi_isp_get_debug¶
【描述】
获取ISP调试信息属性。
【语法】
td_s32 ss_mpi_isp_get_debug(ot_vi_pipe vi_pipe, ot_isp_debug_info * isp_debug);
【参数】
【返回值】
失败,其值为错误码。 |
【需求】
头文件:ot_common_isp.h、ss_mpi_isp.h
库文件:libot_isp.a、libss_isp.a
【注意】
无
【举例】
无
数据类型¶
ot_isp_debug_info:定义ISP调试信息属性。
ot_isp_debug_info¶
【说明】
定义ISP调试信息属性。
【定义】
typedef struct {
td_bool debug_en;
td_u64 phys_addr;
td_u32 depth;
} ot_isp_debug_info;
【成员】
【注意事项】
无
【相关数据类型及接口】
无
错误码¶
ISP API错误码如下所示。
表 1 ISP API错误码
Proc 调试信息说明¶
概述¶
调试信息采用了proc文件系统,可实时反映当前系统的运行状态,所记录的信息可供问题定位及分析时使用。
【文件目录】
/proc/umap/isp
【开启方法】
调用ss_mpi_isp_set_ctrl_param设置ISP控制参数proc_param = n,其中n=0关闭proc,非0表示每隔n帧更新一次proc。
调用ss_mpi_isp_set_ctrl_param设置update_pos = 0或update_pos = 1,默认值为0
update_pos =0表示ISP中断配置寄存器的位置是使用帧起始中断update_pos =1表示ISP中断配置寄存器的位置是使用帧结束中断
调用ss_mpi_isp_set_mod_param设置interrupt_bottom_half中断底半部,默认值为0
interrupt_bottom_half =0表示ISP内核态处理(读统计信息和配置sensor和ISP同步寄存器)在中断服务程序中完成
interrupt_bottom_half =1表示ISP内核态处理(读统计信息和配置sensor和ISP同步寄存器)在中断下半部完成
注意:
开启Proc信息会消耗CPU资源。推荐设为30帧更新一次,或仅Debug时开启。
拼接sync模式时,拼接组内的PIPE共同使用拼接组内主pipe对应ISP的配置,proc以主pipe为准。
【信息查看方法】
在控制台上可以使用cat命令查看信息,例如cat /proc/umap/isp;也可以使用其他常用的文件操作命令,例如cp /proc/umap/isp ./ -f,将ISP的proc文件拷贝到当前目录。
在应用程序中可以将上述文件当作普通只读文件进行读操作,例如fopen、fread等。
说明: 参数在描述时有以下2种情况需要注意:
取值为{0, 1}的参数,如未列出具体取值和含义的对应关系,则参数为1时表示肯定,为0时表示否定。
取值为{aaa, bbb, ccc}的参数,未列出具体取值和含义的对应关系,但可直接根据取值aaa、bbb或ccc判断参数含义。
ISP¶
【调试信息】
[ISP] Version: [V1.0.0.0 B00 Release], Build Time[Jun 2 2021, 19:57:53]
------------------------------------------------------------------------------
------------------------------ isp proc pipe[0] -----------------------------
------------------------------------------------------------------------------
-----------------------------module/control param-----------------------------------------------------
proc_param stat_intvl update_pos int_bothalf int_timeout pwm_number run_wakeup
30 1 0 0 200 3 0
port_int_delay quick_start ldci_tprflten long_frm_int_en be_buf_num ob_update_pos alg_run_sel
0 0 0 0 8 frame end normal
-----------------------------isp mode------------------------------------------------------------------
stitch_mode running_mode block_num
normal online 1
-----------------------------sensor info----------------------------------------------------------------
sensor_type dev
i2c 2
-----------------------------drv info-------------------------------------------------------------------
vi_pipe int_cnt int_t max_int_t int_gap_t max_gap_t int_rat reset_cnt be_stat_lost
0 214 157 171 33296 33305 31 2 0
int_type pt_int_cnt pt_int_t pt_max_int_t pt_int_gap_t pt_max_gap_t pt_int_rat sensor_cfg_t sensor_max_t
start 0 0 0 0 0 0 3 35
sync_cfg_gap sync_cfg_gap_max sync_cfg_gap_min ldci_comp_err_cnt
33301 33309 33285 0
-----------------------------be_cfg phy addr--------------------------------------------------------------
be_cfg[0] be_cfg[1] be_cfg[2] be_cfg[3]
0x1064b0000 0x106536100 0x1065bc200 0x106642300
be_cfg[4] be_cfg[5] be_cfg[6] be_cfg[7]
0x1066c8400 0x10674e500 0x1067d4600 0x10685a700
-----------------------------pubattr info--------------------------------------------------------------
wnd_x wnd_y wnd_w wnd_h sns_w sns_h sns_mode flip
0 24 3840 2160 3840 2160 0 0
mirror crop_en crop_x crop_y crop_w crop_h bayer
0 0 0 0 3840 2160 bggr
----------------------------------------send raw isp frame info---------------------------------------------------------
fe_id exp_time isp_dg again dgain vi_send_raw_cnt
0 0 1036 9667 1024 283
1 0 0 0 0 283
2 0 0 0 0 283
fswdr mode
normal
----------------------------------------share mem info------------------------------------------------------
share_all_en share[0] share[1] share[2] share[3] share[4]
0 1623
[AE] Version: [SS928V100V1.0.0.0 B010 Release], Build Time[Feb 21 2022, 19:04:13]
-----ae info-------------------------------------------------------------------
sys_gain line ae_inter in_crmnt exp 1st_time
5272 2248 1 256 162234 466666
comp ev_bias ori_ave offset speed tole error fps real_fps b_delay w_delay
56 1024 45 13 64 2 -2 30.00 3000 8 0
max_line max_linet max_agt max_dgt max_idgt max_sgt manu_en ma_line ma_ag ma_dg ma_ispdg
2248 65535 62416 1024 261120 15916080 0 0 0 0 0
wdr_mode anflick slow_mod gain_th au_ir_en ir_type ma_ir_en dbg_ir_st
linear 0 1 15916080 0 dc_iris 0 0
node_id int_time sys_gain iris_ape up_stgy dw_stgy mltply
0 2 1024 1 0 4 2048
1 2248 1024 1 1 0 2301952
2 2248 15916080 1 4 1 35779347840
-----isp ae info----------------------------------------------------------------
again dgain isp_dg iso
5191 1024 260 514
int_time[0] int_time[1] int_time[2] int_time[3] ae_inter sns_ratio
532859 0 0 0 1 64
piris_valid piris_pos piris_gain hmax_times vmax
0 0 1 14814 2250
[AWB] Version: [SS928V100V1.0.0.0 B010 Release], Build Time[Feb 21 2022, 19:04:17]
-----awb info------------------------------------------------------------------
manuen sat zones speed
0 128 32 256
-----isp awb info---------------------------------------------------------------
gain0 gain1 gain2 gain3 cotemp
0x205 0x100 0x100 0x16d 6802
color00 color01 color02 color10 color11 color12 color20 color21 color22
0x241 0x8128 0x8019 0x8068 0x1a9 0x8041 0x5 0x8127 0x222
-----------------------------dpc info-----------------------------------
enable strength blend_ratio
1 12 0
-----------------------------crosstalk info-------------------------------------------------------------
enable np_offset threshold strength
1 1108 300 128
-----------------------------framewdr info------------------------------------------------
mdt_en long_thr short_thr md_thr_low_gain md_thr_high_gain
1 3008 4032 0 0
-----------------------------fpn correct info--------------------------------------------
en op_type strength offset
0 -- -- --
-----------------------------black level actual info--------------------------------------
mode user_en isp_blc_r isp_blc_gr isp_blc_gb isp_blc_b sns_blc_r sns_blc_gr sns_blc_gb sns_blc_b
auto 0 1024 1024 1024 1024 1024 1024 1024 1024
offset ob_x ob_y ob_width ob_height blc_clamp_info
0 0 0 3840 20 1
-----------------------------bayernr info------------------------------------------------------------------------
enable tnr_enable nr_lsc_enable coarse_str0 coarse_str1 coarse_str2 coarse_str3
1 1 0 108 108 108 108
sfm0_ex_str sfm_threshold bnr_sfm0_mode sfm0_ex_de_prot sfm0_norm_ede_str sfm1_de_prot sfm1_coarse_str
13 255 1 16 0 16 32
fine_strength coring_wgt coring_mot_thresh tss tfr tfs
128 50 0 0 255 255
md_mode md_anti_fli md_static_ratio sfr_r sfr_g sfr_b md_static_fine_str
0 64 32 26 32 26 32
user_define_md user_define_slope user_define_dark user_define_color
0 0 90 16
-----------------------------acs info------------------------------------------------------------------
enable y_strength run_interval lock_enable
0 256 2 0
-----------------drc info------------------------------------------------------------------
en manu_en strength
0 0 0
-----------------------------lcac info-----------------------------------
enable cr_str cb_str
1 0 3
-----------------------------acac info-----------------------------------
enable edge_thr[0] edge_thr[1] edge_gain purple_upper purple_lower
0 0 0 0 0 0
purple_sat_thr purple_alpha edge_alpha fcc_y_str fcc_rb_str
0 0 0 0 0
-----------------------------bayershp info------------------------------------------
enable edge_filt_str texture_max edge_max overshoot undershoot g_chn_gain
1 0 150 150 80 100 50
luma_wgt 0--15:
23 23 23 23 23 29 29 30 30 30 31 31 31 31 31 31
luma_wgt 16--31:
31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31
edge_mf_strength 0--15:
75 75 75 76 77 78 79 80 82 86 90 94 98 101 102 104
edge_mf_strength 16--31:
105 107 108 109 111 112 114 115 117 118 120 120 120 120 120 120
texture_mf_strength 0--15:
84 84 84 82 78 74 70 69 68 68 68 67 67 67 67 67
texture_mf_strength 16--31:
66 66 65 65 63 61 59 57 55 53 51 49 47 45 43 41
edge_hf_strength 0--15:
86 86 86 86 85 85 85 85 84 84 83 90 96 103 110 116
edge_hf_strength 16--31:
123 130 135 139 143 147 151 155 159 162 166 167 167 167 167 167
texture_hf_strength 0--15:
84 84 84 80 72 64 56 53 53 52 51 50 49 49 48 47
texture_hf_strength 16--31:
46 45 45 44 44 43 42 42 42 41 40 40 40 39 38 38
-----------------------------demosaic info------------------------------------------------
enable nondir_str nondir_mf_str nondir_hf_str de_smth_range
1 48 68 1 1
color_noise_thdf color_noise_strf color_noise_thdy color_noise_stry
0 8 1 10
----------------------------anti false color info----------------------------------------
en threshold strength
1 12 12
-----------------------------sharpen info-------------------------------------------------
sharpen_en
1
luma_wgt 0--7:
20 20 20 20 20 20 20 23
luma_wgt 8--15:
25 28 31 31 31 31 31 31
luma_wgt 16--23:
31 31 31 31 31 31 31 31
luma_wgt 24--31:
31 31 31 31 31 31 31 31
texture_strength 0--7:
158 188 217 251 271 281 278 274
texture_strength 8--15:
270 265 260 260 255 250 245 240
texture_strength 16--23:
235 230 225 224 219 219 214 213
texture_strength 24--31:
208 199 193 184 174 169 159 150
edge_strength 0--7:
195 200 220 230 240 250 260 270
edge_strength 8--15:
280 280 285 290 290 295 295 295
edge_strength 16--23:
295 295 295 290 285 280 275 265
edge_strength 24--31:
250 240 220 200 180 160 140 125
motion_texture_strength 0--7:
158 188 217 251 271 281 278 274
motion_texture_strength 8--15:
270 265 260 260 255 250 245 240
motion_texture_strength 16--23:
235 230 225 224 219 219 214 213
motion_texture_strength 24--31:
208 199 193 184 174 169 159 150
motion_edge_strength 0--7:
195 200 220 230 240 250 260 270
motion_edge_strength 8--15:
280 280 285 290 290 295 295 295
motion_edge_strength 16--23:
295 295 295 290 285 280 275 265
motion_edge_strength 24--31:
250 240 220 200 180 160 140 125
texture_freq edge_freq over_shoot under_shoot shoot_sup_str detail_ctrl
188 100 62 62 7 128
motion_texture_freq motion_edge_freq motion_over_shoot motion_under_shoot
188 100 62 62
edge_filt_str edge_filt_max_cap r_gain g_gain b_gain skin_gain
60 18 20 32 24 31
shoot_sup_adj detail_ctrl_thr max_sharp_gain skin_umax skin_umin skin_vmax skin_vmin
8 160 30 128 100 150 135
-----------------------------ldci info------------------------------------------------------------------------------
enable manual gauss_lpf_sigma he_pos_wgt he_pos_sigma he_pos_mean he_neg_wgt he_neg_sigma he_neg_mean blc_ctrl
1 0 36 42 70 0 45 80 118 20
-----------------ca info-----------------------------------
enable iso_ratio
1 1024
-----------------crb info-----------------------------------
enable r_gain b_gain
0 1024 1024
-----------------------------pregamma info-----------------------------------------------
enable
0
----------------------------------- isp proc end[0] ------------------------
-----------------------------------------------------------------------------
【调试信息分析】
记录当前ISP模块的使用情况。
【参数说明】
ISO值,表示系统增益,以常数100乘以倍数为单位,例如系统中sensor的增益为2倍,ISP的增益为1倍,那么整个系统的ISO值计算方式为:2*1*100=200,即系统ISO为200,本文档中涉及到的ISO都是采用这种计算方法。 |
||
acac的边缘检测阈值。两个阈值分别代表高低阈值,小于edge_thr[0]的为平坦区域,大于edge_thr[1]的是强边缘 |
||
【注意事项】
用户通过PQTools手动配置PubAttr修改画面帧率时,sensor的最大曝光时间会发生修改。绝大部分修改帧率时,帧率越高则最大曝光时间越低。
3A开发指南概述¶
概述¶
ISP 3A版本依赖于相应的SDK大版本,通过一系列数字图像处理算法完成对数字图像的效果处理。主要包含Firmware框架及SDK提供的3A库,Firmware提供算法的基本框架,处理统计信息,驱动数字图像处理算法,并包含坏点校正、去噪、色彩增强、镜头阴影校正等处理。3A库以注册的方式,添加到Firmware中,完成曝光、白平衡、色彩还原等处理。
功能描述¶
ISP的Firmware架构及Firmware工作流程及文件组织结构请参考本文档“功能描述”小节,本小节不再赘述。
3A开发使用者指南¶
软件流程¶
ISP 软件流程请参考“软件流程”小节,本小节不再赘述。
Sensor对接¶
Sensor库主要是为了提供差异化的sensor适配,里面的内容可以分为两部分:Sensor向ISP库注册的差异化适配,这些差异化适配主要由Firmware中的基础算法单元决定;Sensor向3A库注册的差异化适配。Sensor的适配包括算法的初始化默认值,及sensor控制接口,sensor的适配是通过接口回调的形式注册给ISP库和3A算法库。图1表示了Sensor与ISP库和3A算法库之间的关系。
关于sensor注册ISP库,sensor注册3A算法库部分详细请参考《sensor 调试指南》
开发者指南¶
概述¶
用户可以基于Firmware框架开发定制3A库,并注册到Firmware中,Firmware将会在中断的驱动下,获取每帧的统计信息,运行算法库,配置ISP寄存器。
Sensor注册到ISP库,以实现差异化适配Firmware中的基础算法单元的部分,仍需要参考使用者指南部分的内容实现,以保证Firmware中的坏点校正、去噪、色彩增强、镜头阴影校正等处理算法正常运行。Sensor注册到3A算法库的部分,请用户根据自己开发定制的3A库,自行定义数据结构,实现Sensor曝光控制等。
如果用户只是使用3A算法库,并不自己开发3A算法库,可以忽略此章节内容。
AE算法注册ISP库¶
AE算法注册ISP库调用ss_mpi_isp_ae_lib_reg_callback,如图1所示。
AE算法实现了一个ss_mpi_ae_register的注册函数,在这个函数中调用ISP提供的ss_mpi_isp_ae_lib_reg_callback回调接口,用户调用注册函数以实现向ISP注册AE算法,示例如下:
【举例】
/* 实现注册函数 */
ot_isp_ae_register ae_register;
td_s32 ret = TD_SUCCESS;
ae_check_pointer_return(ae_lib);
ae_check_handle_id_return(ae_lib->id);
ae_check_lib_name_return(ae_lib->lib_name);
/* 调用钩子函数 */
ae_register.ae_exp_func.pfn_ae_init = ae_init;
ae_register.ae_exp_func.pfn_ae_run = ae_run;
ae_register.ae_exp_func.pfn_ae_ctrl = ae_ctrl;
ae_register.ae_exp_func.pfn_ae_exit = ae_exit;
ret = ss_mpi_isp_ae_lib_reg_callback(vi_pipe, ae_lib, &ae_register);
if (ret != TD_SUCCESS) {
printf("Ot_ae register failed!\n");
}
用户需要在自开发定制的AE库中实现以下回调函数:
表 1 AE算法向ISP库注册的回调函数
说明:
调用ss_mpi_isp_init时将调用pfn_ae_init回调函数,以初始化AE算法库。
调用ss_mpi_isp_run时将调用pfn_ae_run回调函数,以运行AE算法库,计算得到sensor的曝光时间和增益、ISP的数字增益。
pfn_ae_ctrl回调函数的目的是改变算法库内部状态。运行时Firmware会隐式调用pfn_ae_ctrl回调函数,通知AE算法库切换WDR和线性模式、设置FPS。
当前Firmware定义的ctrl命令详参ot_isp_ctrl_cmd。 调用ss_mpi_isp_exit时将调用pfn_ae_exit回调函数,以销毁AE算法库。
结构体ot_isp_ae_param,ot_isp_ae_info,ot_isp_ae_result的成员变量请参看"数据类型"小节相应的数据类型。
AWB算法注册ISP库¶
AWB算法注册ISP库调用ss_mpi_isp_awb_lib_reg_callback,如图1所示:
AWB算法实现了一个ss_mpi_awb_register的注册函数,在这个函数中调用ISP提供的ss_mpi_isp_awb_lib_reg_callback回调接口,用户调用注册函数以实现向ISP注册AWB算法,示例和AE算法库注册类似。
用户需要在自开发定制的AWB库中实现以下回调函数:
表 1 AWB算法向ISP库注册的回调函数
说明:
调用ss_mpi_isp_init时将调用pfn_awb_init回调函数,以初始化AWB算法库。
调用ss_mpi_isp_run时将调用pfn_awb_run回调函数,以运行AWB算法库,计算得到白平衡增益、色彩校正矩阵。
pfn_awb_ctrl回调函数的目的是改变算法库内部状态。运行时Firmware会隐式调用pfn_awb_ctrl回调函数,通知AWB算法库切换WDR和线性模式、设置ISO和曝光时间。设置ISO的目的是为了实现ISO与饱和度的联动,增益大时色度噪声也会比较大,所以需要调节饱和度。设置曝光时间是为了awb算法判断环境照度,优化场景效果。当前Firmware定义的ctrl命令详参ot_isp_ctrl_cmd。
调用ss_mpi_isp_exit时将调用pfn_awb_exit回调函数,以销毁AWB算法库。
结构体ot_isp_awb_param,ot_isp_awb_info,ot_isp_awb_result的成员变量请参看“数据类型”小节相应的数据类型。
开发用户AF算法¶
说明: ss_mpi_isp_get_vd_time_out和ss_mpi_isp_get_focus_stats请参考前面章节。
用户开发的AF算法可以参考图1所示的结构,AF算法在一个thread内运行,使用ss_mpi_isp_get_vd_time_out接口将算法同步在VD下运行。通过调用ss_mpi_isp_get_focus_stats来获取AF相关的统计信息,相关算法参考统计信息完成目标zoom和focus位置的计算,AF算法输出result,包括lens的位置信息和速度。调用Lens Driver将镜头镜片驱动到设定的位置即完成当前帧的操作。AF Alg向上提供控制接口和查询接口,方便用户完成一键聚焦,变焦,手动聚焦,查询算法状态等操作。
【举例】
如果用户使用的是Linux系统,推荐将算法放在user space完成,lens driver放在kernel space,ISP驱动提供同步回调功能,参考“AF同步回调”章节。
while (1)
{
ret = ss_mpi_isp_get_vd_time_out(vi_pipe, OT_ISP_VD_FE_START, 5000);
ret |= ss_mpi_isp_get_focus_stats(vi_pipe, &af_stat);
if (TD_SUCCESS != ret) {
printf("ss_mpi_isp_get_focus_stats error!(ret = 0x%x)\n", ret);
return TD_FAILURE;
}
// User Auto Focus Alg Source
UsrAfAlgRun();
// Update Lens Position
LensDrv_ZoomToDestPos(pos, pps);
LensDrv_FocusToDestPos(pos, pps);
}
AF统计信息使用说明¶
概述¶
被动式自动对焦一般是通过分析图像特征得出图像清晰度值FV(Focus Value), 通过驱动对焦马达调节焦点到最佳位置,如图1所示,图像越清晰FV值越大,Peak点对应聚焦清晰点。获取图像清晰度算法有多种,如灰度梯度法,高频分量法等,SS928V100采用高频分量法来计算FV,即图像越清晰的时候高频部分幅值越大,将图像通过高通滤波器便可以得到高频分量,SS928V100一共提供四个滤波器和亮度信息,分别为水平方向滤波H1,H2,垂直方向滤波V1,V2,以及Y和高亮计数器HlCnt。SS928V100提供FE(Front End)及BE(Back End)两个独立的AF统计信息获取模块。AF模块支持的最小分辨率为256*120,低于该分辨率AF逻辑功能无法支持。
SS928V100提供Bayer域或者YUV域进行统计,配置MPI中的stats_pos字段即可以进行统计位置的调整。WDR模式下,非宽动态场景的Bayer域(即RAW域)统计信息无明显变化趋势,推荐使用YUV域统计信息。首先对图像进行预处理滤波,去除椒盐噪声对统计值的干扰,用户可以设置pre_flt_cfg.en来使能PreFilter。配置pre_flt_cfg.strength来控制图3滤波强度。在经过水平垂直四组滤波器后会对输出做Level Depend Gain和Coring,关于这两个模块将在后面的章节详述。模块框图2所示。
水平垂直滤波器分别采用IIR和FIR实现如图3所示。
输入图像的裁剪¶
AF模块支持对输入图像的裁剪,如下如图1用户可以根据实际需求配置crop中X,Y,W,H四个参数对指定区域进行统计。
Bayer域配置¶
如果用户将统计位置调整到Bayer域则需要配置以下几点。
配置bayer_format来指定bayer数据的pattern。支持如图1所示的4种pattern。
配置AF 模块Gamma使能,raw上的线性数据需要做Gamma处理。
须知: 图中的GAMMA_EN与ot_isp_af_raw_cfg中的gamma_value等效,GAIN_LMT与ot_isp_af_raw_cfg中的gamma_gain_limit等效。
抑制光源对FV值的影响¶
因为FV值容易受到SpotLight的影响,在聚焦模糊的时候因为光晕扩散,图像中低频分量会增加,会出现图像模糊反而FV值变大的现象。为了抑制这一现象,提供以下方法。
Coring¶
将滤波器输出通过Coring模块可以提高FV曲线的抗噪声能力,如图1所示,设置图中3个参数便可以确定coring曲线的形状,通过设置合理的参数便可以实现不统计噪声,以及增加有效信号对统计信息的贡献,从而提升统计信息在低照度场景中的性能。
统计模式配置¶
统计模块支持以下两种模式:
峰值配置模式
设置为peak模式时,block的统计值为滤波后图像每行最大值之和,否则直接将每个点的值求和。求和模式适用于噪声较大场景。
平方配置模式,有以下两种选择。
0:Linear mode
1:Square mode
设置为Square模式后,会先对滤波器输出进行归一化后进行平方再做统计。
Square模式的FV曲线在焦点附近会更加陡峭,相应的映射曲线如图1所示。
同时也支持以下配置:
输出shift
对输出值right shift缩小,防止值溢出。
Block大小
对通过滤波器后的图像可以进行分块统计,如图2所示,块的大小可以设置,最大支持17*15个blocks,最终块的统计值是对每个pixel的累加或者对每行最大值累加。以水平方向为例,因为累加器的宽度为unsigned 29bits,滤波器输出pixel宽度为unsigned 11bits,所以当块内输出值都为2047的时候,最大支持累加的pixel个数为2^18,否则会发生溢出,用户设置大小时应该注意。
统计信息配置注意事项¶
表 1 统计信息配置注意事项
YUV输入时gamma_value(参考 ot_isp_af_raw_cfg)设置为0。 |
统计值的获取¶
当一帧图像最后一个pixel通过AF模块后, 统计值即更新,推荐用户通过ss_mpi_isp_get_vd_time_out同步获取统计值,然后AutoFocus和ZoomTracking算法完成目标focus和zoom position的计算,需要注意的是因为Linux user space任务调度不能保证一致的实时性,建议将需要保证实时性的驱动配置放在kernel space完成。
FV值计算¶
一般的推荐最终生成如图1所示的两条曲线,我们将low BandPass filter生成的FV命名为FV1,High BandPass filter生成的命名为FV2,“FV计算参考代码”中变量stFocusCfg的值为默认推荐使用的AF滤波器参数,FV1使用在低照度场合,FV2使用在正常照度场合。对于每一个block,FV1,FV2的计算方式为:

H1,H2,V1,V2分别为水平垂直四组滤波器的统计值,可设置适当的权重对水平和垂直方向的滤波器输出统计值进行混合。
最终的FV值还需要对每个block进行加权,即FV1,FV2采用如下公式计算。

FV计算参考代码¶
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "ot_type.h"
#include "ss_mpi_isp.h"
#define BLEND_SHIFT 6
#define ALPHA 64 // 1
#define BELTA 54 // 0.85
#define FEINFO
static int af_weight[15][17] = {
{1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
{1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1},
{1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1},
{1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1},
{1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1},
{1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1},
{1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1},
{1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1},
{1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1},
{1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1},
{1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1},
{1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1},
{1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1},
{1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1},
{1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
};
int main(int argc, char *argv[])
{
td_s32 ret = TD_SUCCESS;
td_u8 wdr_chn;
td_u32 frm_cnt = 0;
td_u32 i, j, k;
td_u16 stat_data;
ot_vi_pipe vi_pipe;
ot_isp_af_stats af_stats;
ot_isp_stats_cfg stats_cfg;
ot_isp_focus_zone zone_metrics[OT_ISP_WDR_MAX_FRAME_NUM][OT_ISP_AF_ZONE_ROW][OT_ISP_AF_ZONE_COLUMN] = { 0 };
ot_isp_focus_stats_cfg focus_cfg = {
{1, 17, 15, 1, 0, {0, 0, 0, 1920, 1080}, {0, 0, 0, 1920, 1080}, 0, {0x2, 0x4, 0}, {1, 0x9bff}, 0xf0},
{1, {1, 1, 1}, 15, {188, 414, -330, 486, -461, 400, -328}, {7, 0, 3, 1}, {1, 0, 255, 0, 240, 8, 14},
{127, 12, 2047}
},
{0, {1, 1, 0}, 2, {200, 200, -110, 461, -415, 0, 0}, {6, 0, 1, 0}, {0, 0, 0, 0, 0, 0, 0},
{ 15, 12, 2047}
},
{{ 20, 16, 0, -16, -20}, {1, 0, 255, 0, 220, 8, 14}, {38, 12, 1800}},
{{ -12, -24, 0, 24, 12}, {1, 0, 255, 0, 220, 8, 14}, {15, 12, 2047}},
{4, {0, 0}, {1, 1}, 0}
};
char param1, param2;
if (argc < 3) {
printf("use like. ./sample_af isp_Pipe c -> Fv curve\n");
printf("......... ./sample_af isp_Pipe h 0 -> h0 blocks\n");
printf("......... ./sample_af isp_Pipe h 1 -> h1 blocks\n");
printf("......... ./sample_af isp_Pipe v 0 -> v0 blocks\n");
printf("......... ./sample_af isp_Pipe v 1 -> v1 blocks\n");
printf("......... ./sample_af isp_Pipe y 0 -> y blocks\n");
printf("......... ./sample_af isp_Pipe y 1 -> hlcnt blocks\n");
return -1;
}
if ((param1 = *argv[2]) != 'c' && !argv[3]) {
printf("args was too less!, should be %c + X\n", *argv[1]);
return -1;
} else if (argv[3]) {
param2 = *argv[3];
}
if ('0' != *argv[1] && '1' != *argv[1]) {
printf("vi_pipe num Err!\n");
return -1;
}
vi_pipe = atoi(argv[1]);
ret = ss_mpi_isp_get_stats_cfg(vi_pipe, &stats_cfg);
if (TD_SUCCESS != ret) {
printf("ss_mpi_isp_get_stats_cfg error!(ret = 0x%x)\n", ret);
return TD_FAILURE;
}
memcpy(&stats_cfg.focus_cfg, &focus_cfg, sizeof(ot_isp_focus_stats_cfg));
ret = ss_mpi_isp_set_stats_cfg(vi_pipe, &stats_cfg);
if (TD_SUCCESS != ret) {
printf("ss_mpi_isp_set_stats_cfg error!(ret = 0x%x)\n", ret);
return TD_FAILURE;
}
#if 1
while (1) {
ret = ss_mpi_isp_get_vd_time_out(vi_pipe, OT_ISP_VD_FE_START, 5000);
ret |= ss_mpi_isp_get_focus_stats(vi_pipe, &af_stats);
if (ret != TD_SUCCESS) {
printf("ss_mpi_isp_get_focus_stats error!(ret = 0x%x)\n", ret);
return TD_FAILURE;
}
#ifdef FEINFO
memcpy(zone_metrics, &af_stats.fe_af_stat, sizeof(ot_isp_focus_zone) * OT_ISP_WDR_MAX_FRAME_NUM * OT_ISP_AF_ZONE_ROW * OT_ISP_AF_ZONE_COLUMN);
#else
memcpy(zone_metrics[0], &af_stats.be_af_stat, sizeof(ot_isp_focus_zone) * OT_ISP_AF_ZONE_ROW * OT_ISP_AF_ZONE_COLUMN);
#endif
if (param1 != 'c') {
if ((++frm_cnt % 30)) {
continue;
}
wdr_chn = 1;
for (k = 0; k < wdr_chn; k++) {
for (i = 0; i < 15; i++) {
for (j = 0; j < 17; j++) {
if (param1 == 'h' && param2 == '0') {
stat_data = zone_metrics[k][i][j].h1;
} else if (param1 == 'h' && param2 == '1') {
stat_data = zone_metrics[k][i][j].h2;
} else if (param1 == 'v' && param2 == '0') {
stat_data = zone_metrics[k][i][j].v1;
} else if (param1 == 'v' && param2 == '1') {
stat_data = zone_metrics[k][i][j].v2;
} else if (param1 == 'y' && param2 == '0') {
stat_data = zone_metrics[k][i][j].y;
} else {
stat_data = zone_metrics[k][i][j].hl_cnt;
}
printf("%6d", stat_data);
}
printf("\n");
}
}
printf("------------------------------------------------%c-%c----------------------------------------------\n\n\n\n\n", param1, param2);
continue;
}
td_u32 sum_fv1 = 0;
td_u32 sum_fv2 = 0;
td_u32 wgt_sum = 0;
td_u32 fv1_n, fv2_n, fv1, fv2;
if ((++frm_cnt % 2)) {
continue;
}
wdr_chn = 1;
for (k = 0; k < wdr_chn; k++) {
for ( i = 0 ; i < focus_cfg.config.zone_row; i++ ) {
for ( j = 0 ; j < focus_cfg.config.zone_col; j++ ) {
td_u32 h1 = zone_metrics[k][i][j].h1;
td_u32 h2 = zone_metrics[k][i][j].h2;
td_u32 v1 = zone_metrics[k][i][j].v1;
td_u32 v2 = zone_metrics[k][i][j].v2;
fv1_n = (h1 * ALPHA + v1 * ((1 << BLEND_SHIFT) - ALPHA)) >> BLEND_SHIFT;
fv2_n = (h2 * BELTA + v2 * ((1 << BLEND_SHIFT) - BELTA)) >> BLEND_SHIFT;
sum_fv1 += af_weight[i][j] * fv1_n;
sum_fv2 += af_weight[i][j] * fv2_n;
wgt_sum += af_weight[i][j];
}
}
}
fv1 = sum_fv1 / wgt_sum;
fv2 = sum_fv2 / wgt_sum;
printf("%4d %4d\n", fv1, fv2);
}
#endif
return TD_SUCCESS;
}
PQTools 滤波器设计工具使用说明¶
OtPQ工具提供了自动对焦参数仿真插件,使图像质量调试人员可以:
根据截止频率自动获取较适合的AF参数,并查看对应的频率响应曲线;
自行配置AF参数,并查看对应的频率响应曲线。
目前版本的插件可用于图像质量调测,使用该工具之前,用户需要安装Matlab运行时的2012a(32位)版本。
工具界面¶
从OtPQ工具主界面工具栏的外挂插件下拉框中选择“OtPQ Auto Focus Simulator”,可以打开自动对焦参数仿真工具,如图1所示。
工具分为For Horizontal filters 和For Vertical filters两个页签,相互独立,分别对应水平和垂直方向的滤波器参数仿真。下面叙述的内容对两个页签均有效。
AF水平滤波器具备以下两种模式:
窄带模式(Narrow Band):此种模式下,AF水平滤波器将在一个较小的频率范围内进行对焦。当用户设置的截止频率的低频小于0.04时,工具将推荐用户使用窄带模式。这个模式下,截止频率高频最大值为0.25。
宽带模式(Wide Band):此种模式下,AF水平滤波器将在一个较大的频率范围内进行对焦。当截止频率的低频大于或等于0.04时,工具将推荐用户使用宽带模式。这个模式下,截止频率高频最大值为0.5。
用户可以在PQ工具主界面(已经加载调试表)上找到StatisticsConfig -> AFConfig_HParam_IIR0的寄存器分组来对模式和滤波系数进行设置。
通过截止频率获取AF滤波系数¶
在每个页签中,用户均可以用截止频率来生成滤波系数。在Generate from Frequences处输入截止频率的低频和高频后,点击“Generate AF Parameters”,即可生成截止频率对应的滤波系数,显示在Parameters adjustment下方的各个文本框中,并在右侧的坐标图上显示对应该组滤波系数的频率响应曲线,曲线以红色表示,如图1和图2所示。
须知: 截止频率在工具中会自动适配精度。水平滤波器的截止频率取小数点后两位,垂直滤波器的截止频率取小数点后一位。取精度时,多余的小数位数直接舍弃。
手动配置滤波系数¶
除了通过截止频率获取对应的滤波系数,用户还可以手动进行每个滤波系数项进行设置。在Parameters adjustment处,找到对应的参数并进行修改后,工具将自动计算这组参数的频率响应曲线并绘制在右侧。曲线以红色表示。
设置参考组¶
如果用户想要在不同组的滤波系数间对比,可以使用参考组功能。当用户需要将某一组滤波系数列为参考组时,点击“Add to Reference List”按钮,工具即会在右下角的列表中添加一行,列出该参考组的参数项,如图1所示。
对于每一个参考组,工具还将在上方的坐标图上生成一条曲线,以灰色表示,如图2所示:
用户还可以将某一参考组的曲线高亮显示出来。在列表中点击需要高亮显示的参考组,此时对应的曲线会在上方的坐标图中变成蓝色,如图3所示。
通过这样的方式,用户可以在不同的参考组间进行频率响应曲线对比,从而发现更优的方案。
须知:
在坐标图上,红色的当前参数曲线和蓝色的参考组高亮曲线相对其他的灰色参考组曲线处于更上方的位置。因此,会出现刚刚添加参考组时看不到灰色曲线的状况。此时只要修改滤波系数,使红色曲线重新绘制,就能看到灰色的参考曲线。
每个页签上最多只能添加6组参考组。如果需要添加更多参考组,请先点击Clear Reference List删除所有参考组。
AF同步回调¶
当一帧图像最后一个pixel通过AF模块后,统计值即更新,推荐用户通过ss_mpi_isp_get_vd_time_out同步获取统计值,AutoFocus和ZoomTracking算法完成目标focus和zoom position的计算,如果用户使用的是Linux系统,因为user space任务调度不能保证一致的实时性,建议将需要保证实时性的驱动配置放在kernel space完成。ISP提供同步回调接口的注册,可以实现与VD同步。在本章有相应的接口使用描述,用户可以将实时性要求较高的任务放在同步回调里面,底层提供HwIRQ,Workqueue两种方式实现,可以选择相应的实现方式以确定实时级别。HwIRQ是指任务放在中断服务中实现,实时性最高;Workqueue的实时性取决于Linux系统调用。
API参考¶
ot_isp_sync_task_register:向ISP注册同步回调接口。
ot_isp_sync_task_unregister:向ISP反注册同步回调接口。
ot_isp_sync_task_register¶
【描述】
向ISP注册同步回调接口。
【语法】
td_s32 ot_isp_sync_task_register(ot_vi_pipe vi_pipe, ot_isp_sync_task_node *new_node);
【参数】
【返回值】
【需求】
头文件:isp_ext.h.
【注意】
使用前需要确保ISP驱动已加载。
因为ISP同步回调内部实现不保存用户传入的new_node指向的实体,所以要求使用ot_isp_sync_task_node定义实体时不能为局部变量。
【举例】
无
【相关主题】
ot_isp_sync_task_unregister¶
【描述】
向ISP反注册同步回调接口。
【语法】
td_s32 ot_isp_sync_task_unregister(ot_vi_pipe vi_pipe, ot_isp_sync_task_node *del_node)
【参数】
【返回值】
【需求】
头文件:isp_ext.h.
【注意】
使用前需要确保ISP驱动已加载。
【举例】
无
【相关主题】
数据类型¶
ot_isp_sync_tsk_method:定义同步回调方法,决定实时性。
ot_isp_drv_focus_zone:AF分区间统计信息。
ot_isp_drv_fe_focus_statistics:AF FE统计信息
ot_isp_drv_be_focus_statistics:AF BE统计信息
ot_isp_drv_af_statistics:AF模块统计信息。
ot_isp_sync_task_node:定义同步回调节点信息。
ot_isp_sync_tsk_method¶
【说明】
定义同步回调方法,决定实时性。
【定义】
typedef enum {
ISP_SYNC_TSK_METHOD_HW_IRQ = 0,
ISP_SYNC_TSK_METHOD_WORKQUE,
ISP_SYNC_TSK_METHOD_BUTT
} ot_isp_sync_tsk_method;
【成员】
【注意事项】
无
【相关数据类型及接口】
无
ot_isp_drv_focus_zone¶
【说明】
AF分区间统计信息。
【定义】
typedef struct {
td_u16 v1;
td_u16 h1;
td_u16 v2;
td_u16 h2;
td_u16 y;
td_u16 hl_cnt;
} ot_isp_drv_focus_zone;
【成员】
【注意事项】
无
【相关数据类型及接口】
无
ot_isp_drv_fe_focus_statistics¶
【说明】
AF FE分块统计信息。
【定义】
typedef struct {
ot_isp_drv_focus_zone zone_metrics[4][15][17];
} ot_isp_drv_fe_focus_statistics;
【成员】
【注意事项】
无
【相关数据类型及接口】
无
ot_isp_drv_be_focus_statistics¶
【说明】
AF BE分块统计信息。
【定义】
typedef struct {
ot_isp_drv_focus_zone zone_metrics[15][17];
} ot_isp_drv_be_focus_statistics;
【成员】
【注意事项】
无
【相关数据类型及接口】
无
ot_isp_drv_af_statistics¶
【说明】
AF模块统计信息。
【定义】
typedef struct {
ot_isp_drv_fe_focus_statistics fe_af_stat;
ot_isp_drv_be_focus_statistics be_af_stat;
} ot_isp_drv_af_statistics;
【成员】
【注意事项】
无
【相关数据类型及接口】
无
ot_isp_sync_task_node¶
【说明】
定义同步回调节点信息。
【定义】
typedef struct {
ot_isp_sync_tsk_method method;
td_s32 (*isp_sync_tsk_callback)(td_u64 data);
td_u64 data;
const char *sz_id;
struct osal_list_head list;
ot_isp_drv_af_statistics *focus_stat;
} ot_isp_sync_task_node;
【成员】
【举例】
ot_isp_sync_task_node sync_node= {
.method = ISP_SYNC_TSK_METHOD_HW_IRQ,
.isp_sync_tsk_callback = usr_task_callback,
.data = 0,
.sz_id= "HardwareInterrupt "
};
【注意事项】
无
【相关数据类型及接口】
不带光敏AE快速收敛模式(无光敏快启)使用说明¶
概述¶
无光敏快启是在没有光敏传感器反馈当前亮度的情况下,AE算法在启动后以最快速收敛到目标亮度范围的功能。此功能目前在大部分场景下可以在10帧内收敛到目标亮度范围。其中目标亮度范围为[目标亮度-目标亮度*10%,目标亮度+目标亮度*10%]。例如,当目标量亮度为50,则目标亮度范围为[45,55]。在使用此功能时,Sensor的驱动要进行相应的适配。
适配不带光敏AE快速收敛模式(无光敏快启)¶
适配Sensor的写寄存器方式。无光敏快启要求对配置给Sensor的曝光参数的延迟生效要求为3帧。即AE算法在第1帧对Sensor配置曝光参数,在第4帧时能够获取到相应曝光参数生效的亮度统计信息(即Raw)。如果Sensor的延迟生效帧数不符合3帧,则需要对Sensor的驱动进行修改适配。一般来说,目前大部分的Sensor在平台上,总体的延迟生效帧数为4帧。可将Sensor驱动适配为调用I2C接口直接写Sensor寄存器的方式设定曝光参数(包括曝光行数、Sensor模拟增益、Sensor数字增益)。这样的方式可以使Sensor提前1帧生效曝光参数。具体可参考F37 Sensor的驱动代码进行适配。
需要注意将Sensor改为用I2C接口直接写寄存器的方式后,相应的曝光行数、Sensor模拟增益、Sensor数字增益和ISP 数字增益的生效延迟帧数也要同保证同步,以确保曝光的同步。
配置pfn_cmos_ae_quick_start_status_set回调函数。无光敏快启收敛后,会调用此回调函数同时设定quick_start_status为TD_TRUE。此时通过此参数状态,将步骤1中的直接调用I2C接口方式配置寄存器的方式更改回普通方式。
设定无光敏快启相关参数:
ae_sns_dft->quick_start.quick_start_enable设置为TD_TRUE打开无光敏快启功能。
ae_sns_dft->quick_start.black_frame_num设定初始坏帧数。因部分Sensor在启动时,会输出若干坏帧,为了确保AE算法能够及时获取到有效的统计数据。需要填入正确的坏帧数,没有坏帧则填入0。
ae_sns_dft->quick_start.ir_mode_en 设置无光敏快启下是否支持红外模式。如果是需要支持带有IR CUT和IR LED无光敏快启,则需要打开此模式。
ae_sns_dft->quick_start.init_exposure_ir 设置无光敏快启红外模式下的初始曝光量。
ae_sns_dft->quick_start.iso_thr_ir 设置无光敏快启普通模式切换到红外模式的ISO阈值。上层根据获取到的ISO值是否大于iso_thr_ir判定是否要打开IR CUT和IR LED进入红外模式。同时AE快速收敛算法内部也会根据此参数判定是否要切换到快速收敛的红外模式进行继续收敛。
ae_sns_dft->quick_start.ir_cut_delay_time 设置无光敏快启IR CUT打开需要的物理时间。单位为ms。
以上变量值均可通过Sensor驱动中的sensor_set_init()函数由外部传入进行灵活设定。
标定初始曝光量。在相同的曝光参数下,由于不同Sensor具有不同的光电敏感度。同时不同大小的光圈和不同的滤光片的选择都会对Sensor的最终曝光亮度有不同影响。当前的无光敏快启的初始曝光量需要进行标定。标定步骤和方法如下:
将辉度箱设定为EV8亮度。
将max_hist_offset设置为0,同时将AE算法设定为手动模式。
将相机镜头对着辉度箱。调节曝光量,同时查看Proc调试信息的OriAve值(不带权重的画面平均亮度),当OriAve值为80时,此时对应的曝光量作为初始曝光量。
初始曝光量微调。对于不同的产品形态有不同的亮度使用范围,可以对步骤4的初始曝光量进行微调,加快无光敏快启AE算法收敛的速度,以适应不同产品需求。
注意事项¶
在13.6.2小节的2中,将Sensor 配置为用I2C接口直接写Sensor寄存器的方式设定曝光量。在无光敏快启收敛完成后,需要进行相应的配置将Sensor的配置方式设定回普通方式。
初始亮度80为推荐值,用户可以根据产品形态和适应的亮度范围在此基础上进行上下调节以达到最佳收敛速度。如果没有辉度箱标定环境。可以使用曝光时间24ms,ISO100,光圈1.6相应的等曝光量曝光参数组合作为初始曝光量的进行调试。
带IR CUT无光敏快启基本流程¶

须知:
在确定长时间处于低照度环境下,为了减少IR CUT的切换次数,可以不进行IR CUT复位操作,即省略如上红色字体部分操作。
蓝框内的流程为上层应用操作。
附录¶
注册函数的关系¶
ss_mpi_isp_awb_lib_reg_callback和ss_mpi_isp_awb_lib_reg_callback这两个接口是ISP firmware库提供的钩子函数,用于开发3A算法库时实现注册动作。例如SDK 提供的3A算法库的ss_mpi_ae_register和ss_mpi_awb_register接口,在实现时调用了相应的钩子函数,所以调用ss_mpi_ae_register能实现AE算法库向ISP firmware库注册。
同样的,3A算法库同样也提供了钩子函数,用于Sensor库实现向3A算法库注册的动作。例如ss_mpi_ae_sensor_reg_callback和ss_mpi_awb_sensor_reg_callback,在xxx_cmos.c中可以看到调用了这些钩子函数的函数sensor_register_callback。用户在开发3A算法库时,也可以通过提供钩子函数的方式,实现Sensor库向3A算法库的注册。
当然,ISP firmware库也提供了钩子函数,用于Sensor库实现向ISP firmware库注册的动作。例如ss_mpi_isp_sensor_reg_callback,在xxx_cmos.c中可以看到调用了该钩子函数的函数sensor_register_callback。
所以,当用户调用ss_mpi_ae_register、ss_mpi_awb_register和sensor_register_callback就完成了3A算法库向ISP firmware库注册、Sensor库向3A算法库和ISP firmware库注册。
说明: 用户开发3A算法库时,请自行实现ss_mpi_axx_register接口。同时也请自行实现ss_mpi_axx_sensor_reg_callback钩子函数,并在sensor_register_callback中增加调用该钩子函数的代码,相关代码可以参考ISP firmware库的开源代码。
扩展性的设计考虑¶
在代码中有ot_vi_pipe、ot_isp_3a_alg_lib、ot_sensor_id这样一些概念,这些概念是出于架构扩展性的考虑。
ot_vi_pipe主要考虑的是支持多个ISP单元的情形。无论是多个ISP硬件单元,或是一个ISP硬件单元分时复用,从软件意义上讲,需要预留出扩展性。
ot_isp_3a_alg_lib主要考虑的是支持多个算法库,并动态切换的情形。例如用户实现了一套AE算法代码,但注册两个库,分别用于正常场景和抓拍场景,那么这时候需要用结构体中的handle来进行区分。例如用户实现了一套AWB算法代码,同时又想在某些场景下使用AWB算法库,那么这时候可以用结构体中的lib_name进行区分。当用户注册多个AE库,或AWB库时,ISP firmware将会全部对它们进行初始化,但是在运行时,仅会调用有效的库,设置有效库的接口是ss_mpi_isp_set_bind_attr,通过此接口可以快速切换运算的库。
ot_sensor_id仅起一个校验作用,确认注册给ISP firmware库和3A算法库的是同一款sensor。
这些概念仅是设计时预留的冗余,如果完全不需要这些概念,可以在开发时去掉这些概念。
3A架构的设计思路¶
设计思路基本是这样,ISP firmware初始化并销毁各个算法单元;在运行时,提供前一帧的统计信息,并根据返回值配置寄存器,其他内容,均由用户开发。所以当用户替换自己的3A算法后,当前的AE/AWB的MPI不可复用,cmos.c中的AE/AWB相关的内容不可复用,对于AE的权重配置和AWB的找白点配置的内容不可复用,这几个配置理论上是由3A算法配置,而不是从ISP firmware获取,ISP firmware中仅有简单的初始化值。
3A算法并不需要显式地去配置ISP寄存器,只需将需要配置的ISP寄存器值写到ot_isp_ae_result和ot_isp_awb_result结构体中即可;也不需要显式地去读取ISP寄存器,只需从ot_isp_ae_info和ot_isp_awb_info结构体中读取即可。
外部寄存器的说明¶
在_录像机_的应用中,通常除了业务主程序进程外,板端还会有另外的进程去支持PC端的工具来调节图像质量。ISP的各个算法的许多状态、参数均驻留于全局变量中,不足以支持多进程的访问,所以引入外部寄存器的概念,用以支持多进程的业务场景。用户通过PC端工具与板端进程通信,调用SDK提供的MPI,实际是改变外部寄存器中的内容,从而改变业务主程序中的ISP的各个算法的状态和参数。
外部寄存器还能与实际的硬件寄存器通过统一的接口读写,形式上与实际的硬件寄存器无差别。
用户如果使用外部寄存器的话,有这些已封装好的接口可以使用,当然用户也可以有其他方案实现多进程的支持。外部寄存器的地址空间是自定义的,只要不冲突即可。详细请参考开源代码,接口定义在isp_vreg.h文件中。
工频闪类型自适应Sample用例处理流程¶
以上为工频闪类型自适应Sample用例的处理流程(calcflicker sample用例0)。此用例使用多次检测的结果进行确认后自动适配相应的抗闪参数。此用例作为使用Auto Flicker Type Detection(自动工频闪类型检测)接口进行自适应抗闪的参考。
检测结果为OT_ISP_FLICKER_TYPE_UNKNOW(有未知类型的工频闪)的原因有几种情况:
Camera摇晃导致检测不稳定。
图像中存在大面积的运动物体。
环境光源为同时存在50Hz和60Hz的混合光源。
环境光源为既不是50Hz也不是60Hz频率的非通用频率光源。以上这几种情况可根据实际情况灵活处理。
























