AE/AWB/AF Interface
1. 系统架构¶
ISP除主要核心外,另外可外挂3A算法模块。可自行开发AWB/AE/AF算法库通过注册AWB/AE/AF Interface 与ISP连结。
在ISP工作时期CUS3A透过AWB/AE/AF Interface提供硬件统计值给算法,算法回报对应的结果给CUS3A Host。CUS3A Host 透过MI_ISP将算法结果写入ISP Middleware,最后透过对应的ISP Drive/Sensor Driver将结果写入硬件。
此架构下用户端算法只需专注在算法的输入与输出计算上,不须处理系统整合相关问题。
2. AE/AWB运作流程¶
用户程序必须在MI_SYS_Init()
之前通过CUS3A_RegInterface()
注册算法库(callback function),之后ISP初始化阶段,ISP核心透过init()通知算法进行初始化工作。当前端Sensor开始取影像,ISP核心会在每侦影像中断时呼叫算法run(),并且将硬件统计值带入算法中。当ISP关闭时,透过release()通知算法释放所有资源。
流程图中红色字体为算法必须提供的callback function。
3. AE/AWB 统计格式¶
AE/AWB统计值在程序代码中定义如下,每张影像均会产生128*90笔取样数据。
在Macaron, Pudding中,AE统计值,每张影像只会产生32*32笔取样数据。
#define isp_3A_ROW (128) /**< number of 3A statistic blocks in a row */ #define isp_3A_COL (90) /**< number of 3A statistic blocks in a column */ @brief Single AE HW statistics data*/ typedef struct { U8 r; /**< block pixel R average , 0~255*/ U8 g; /**< block pixel G average , 0~255, g=(Gr+Gb+1)>>1*/ U8 b; /**< block pixel B average , 0~255*/ U8 y; /**< block pixel Y average , 0~255, \ y=(Ravg*9 +Gavg*19 +Bavg*4 + 16)>>5 */ }__attribute__((packed, aligned(1))) ISP_AE_SAMPLE; /*! @brief Single AWB HW statistics data*/ typedef struct { U8 r; /**<center pixel R value , 0~255 */ U8 g; /**<center pixel G value , 0~255 */ U8 b; /**<center pixel B value , 0~255 */ }__attribute__((packed, aligned(1))) ISP_AWB_SAMPLE;
ISP会在每次Frame End将AE/AWB统计值传给算法端,数据排列方式如下表。ISP将影像切为isp_3A_ROW x isp_3A_COL 区域,并计算每个区域统计值填入
ISP_AWB_INFO::data[isp_3A_ROW*isp_3A_COL]
ISP_AE_INFO::data[isp_3A_ROW*isp_3A_COL]
0 | 1 | 2 | 3 | ………… | isp_3A_ROW-1 | ||||
---|---|---|---|---|---|---|---|---|---|
isp_3A_ROW | isp_3A_ROW +1 | isp_3A_ROW +2 | isp_3A_ROW +3 | . | . | . | . | . | isp_3A_ROW*2-1 |
isp_3A_ROW*2 | |||||||||
. | |||||||||
isp_3A_ROW* (isp_3A_COL-1) | isp_3A_ROW* (isp_3A_COL-1)+1 | isp_3A_ROW* isp_3A_COL-1 |
针对RGB-IR sensor,硬件会额外抽出,IR信息的histogram,供AE参考使用
#define _3A_IR_HIST_BIN (256) /**< histogram type2 resolution*/ typedef struct { u16 u2IRHist[_3A_IR_HIST_BIN]; } ____attribute__((packed, aligned(1))) ISP_IR_HISTX;
4. AF 统计格式¶
设置AF统计window(ISP_AF_RECT),提供16*n(n = 1~16)个window可供设置(af_stats_win[16]),每祯会将统计结果output, output结构如ISP_AF_STATS,每个Window会output 6种filter的统计值-
各filter bit数表示如下
Filter Bit & Chip Type | Twinkie | Pretzel | Macaron/Pudding |
---|---|---|---|
IIR / Sobel | 34 | 35 | 35 |
Luma | 34 | 32 | 32 |
YSat | 24 | 22 | 22 |
AF ROI Mode = AF_ROI_MODE_NORMAL: 只看CusAFStats_t.stParaAPI[0]
AF ROI Mode = AF_ROI_MODE_MATRIX: 可看CusAFStats_t.stParaAPI[0~15]
typedef struct { MI_U32 u32StartX; /*range : 0~1023*/ MI_U32 u32StartY; /*range : 0~1023*/ MI_U32 u32EndX; /*range : 0~1023*/ MI_U32 u32EndY; /*range : 0~1023*/ } AF_WINDOW_PARAM_t; typedef struct { MI_U8 u8WindowIndex; AF_WINDOW_PARAM_t stParaAPI; } CusAFWin_t; //for Pretzel, Macaron, Pudding //for Twinkie typedef struct{ typedef struct{ MI_U8 high_iir[5*16]; MI_U8 high_iir[6*16]; MI_U8 low_iir[5*16]; MI_U8 low_iir[6*16]; MI_U8 luma[4*16]; MI_U8 luma[6*16]; MI_U8 sobel_v[5*16]; MI_U8 sobel_v[6*16]; MI_U8 sobel_h[5*16]; MI_U8 sobel_h[6*16]; MI_U8 ysat[3*16]; MI_U8 ysat[3*16]; } AF_STATS_PARAM_t ; } AF_STATS_PARAM_t ; typedef struct{ typedef struct{ AF_STATS_PARAM_t stParaAPI[16]; AF_STATS_PARAM_t stParaAPI; } CusAFStats_t; } CusAFStats_t;
4.1. 各AF Filter说明¶
参数名称 | 描述 | 输出/输入 |
---|---|---|
IIR_1 | 分区间统计的AF 水平方向IIR滤波器统计值 | 输出 |
IIR_2 | 分区间统计的AF 水平方向IIR滤波器统计值 | 输出 |
Luma | 分区间统计的AF 亮度统计值 | 输出 |
FIR_H | 分区间统计的AF 水平方向FIR滤波器统计值 | 输出 |
FIR_V | 分区间统计的AF 垂直方向FIR滤波器统计值 | 输出 |
YSat | 分区间统计的 AF FIR滤波器, 大于YThd的统计值个数 | 输出 |
数据范例:
一般场景远焦:
一般场景近焦:
低亮度场景远焦:
低亮度场景远焦+灯源:
[PUDDING]
高亮场景,使用IIR结果
低照场景,使用IIR结果
5. AE RESULT¶
当ISP呼叫AE算法run()后,AE算法必须提供相对应的结果给ISP,格式如下。
/*! @brief ISP ae algorithm result*/ typedef struct { U32 Size; /**< struct size*/ U32 Change; /**< if true, apply this result to hw register*/ U32 Shutter; /**< Shutter in us */ U32 SensorGain; /**< Sensor gain, 1X = 1024 */ U32 IspGain; /**< ISP gain, 1X = 1024 */ U32 ShutterHdrShort; /**< Shutter in us */ U32 SensorGainHdrShort; /**< Sensor gain, 1X = 1024 */ U32 IspGainHdrShort; /**< ISP gain, 1X = 1024 */ U32 u4BVx16384; /**< Bv * 16384 in APEX system, EV = Av + Tv = Sv + Bv */ U32 AvgY; /**< frame brightness */ U32 HdrRatio; /**< hdr ratio, 1X = 1024 */ /*CUS3A v1.1*/ U32 FNx10; /**< F number * 10 */ U32 DebandFPS; /**< Target fps when running auto debanding*/ U32 WeightY; /**< frame brightness with ROI weight*/ /*CUS3A v1.3*/ U16 GMBlendRatio; /**< Adaptive Gamma Blending Ratio from AE**/ U16 IRLightStr; /**< Setting IR light source strength , range 0~100**/ }ISP_AE_RESULT;
Size : ISP_AE_RESULT长度,用于处理版本向下兼容问题。
Change: 若该值为1,ISP将此次设定值写入硬件,若为0 ISP会忽略此次的结果。
Shutter: 设定Sensor曝光时间。
SensorGain: 设定Sensor gain,Digital/Analog gain分配率由Sensor驱动决定。
IspGain: 设定ISP digital gain。
ShutterHdrShort: 设定短曝Sensor曝光时间。
SensorGainHdrShort: 设定短曝Sensor gain,Digital/Analog gain分配率由Sensor驱动决定。
IspGainHdrShort: 设定短曝ISP digital gain。
u4BVx16384: 目前场景的亮度值,此处计算公式比照APEX。此设定值将会被IQ算法参考。
AvgY:此张影像的平均灰阶亮度,此设定值将会被IQ算法参考。
HdrRatio:此张影像的HDR长短曝比例,此设定值将会被IQ算法参考。
Fnx10: 设定FN Numbe
DebandFPS: 设定FPS
WeightY: 此张影像经过ROI weighting的平均灰阶亮度,此设定值将会被IQ算法参考。
GMBlendRatio: 当IQ的AdaptiveGamma及RGBGamma皆enable才有作用,IQ会根据此ratio去做AdaptiveGamma和RGBGamma的混和. 请参考下图。值域1~1025,513代表直接使用RGBGamma不做混和。
6. AWB RESULT¶
当ISP呼叫AWB算法run()后,AWB算法必须提供相对应的结果给ISP,格式如下。
/*! @brief AWB algorithm result*/ typedef struct { U32 Size; /**< struct size*/ U32 Change; /**< if true, apply this result to hw register*/ U32 R_gain; /**< AWB gain for R channel*/ U32 G_gain; /**< AWB gain for G channel*/ U32 B_gain; /**< AWB gain for B channel*/ U32 ColorTmp; /**< Return color temperature*/ }ISP_AWB_RESULT;
Size : ISP_AWB_RESULT长度,用于处理版本向下兼容问题。
Change: 若该值为1,ISP将此次设定值写入硬件,若为0,ISP会忽略此次的结果。
R_gain: R channel增益。
G_gain: G channel增益。
B_gain: B channel增益。
ColorTmp: 目前场景色温。
7. AF RESULT¶
当ISP呼叫AF算法run()后,AF算法必须提供相对应的结果给ISP,格式如下。
/*! @brief AF algorithm result*/ typedef struct { u32 Size; /**< struct size*/ u32 Change; /**< if true, apply this result to hw*/ u32 NextPos; /**< Next position*/ /**< CUS3A v1.3*/ u32 ChangeParam; /** if true, apply the following 4 results to hw register **/ CusAFRoiMode_t ROIMode; /** roi mode configuration**/ CusAFWin_t Window[16]; /** AF statistics window position **/ CusAFFilter_t Filter; /** AF filter paramater**/ CusAFFilterSq_t FilterSq; /** AF filter square parameter**/ } ISP_AF_RESULT;
Change: 若该值为1,通知AF演算出的焦距(NextPos)生效
NextPos: AF算法算出的焦距结果。
8. AE,AWB,AF库界面¶
int CUS3A_RegInterfaceEX(IspCh_e eIspCh, AlgoAdaptor eAdaptor, IspAlgoType eAlgoType, void* pAlgo)
说明:
用户AE,AWB,AF库注册接口
参数:
参数名称 | 描述 | 输出/输入 |
---|---|---|
eIspCh | 指定算法对应的ISP channel | 输入 |
eAdaptor | 指定算法对应的 AlgoAdaptor 目前只支持客户端使用E_ALGO_ADAPTOR_1 | 输入 |
eAlgoType | 指定算法类型 E_ALGO_TYPE_AE , E_ALGO_TYPE_AWB, E_ALGO_TYPE_AF | 输入 |
pAlgo | 算法实作端提供库指针,若不需实作算法,则填NULL pAlgo型态对应eAlgoType设定值 E_ALGO_TYPE_AE : pAlgo = ISP_AE_INTERFACE* E_ALGO_TYPE_AWB : pAlgo = ISP_AWB_INTERFACE* E_ALGO_TYPE_AF : pAlgo = ISP_AF_INTERFACE* | 输入 |
返回值:
返回值 | 描述 |
---|---|
0 | 注册成功 |
<0 | 注册失败 |
int CUS3A_SetAlgoAdaptor(IspCh_e eIspCh, AlgoAdaptor eAdaptor, IspAlgoType eAlgoType)
说明:
在已注册的算法间进行切换。
参数:
参数名称 | 描述 | 输出/输入 |
---|---|---|
eIspCh | 指定算法切换的ISP channel | 输入 |
eAdaptor | 指定算法切换的 AlgoAdaptor E_ALGO_ADAPTOR_NATIVE: SStar 3A E_ALGO_ADAPTOR_1 : 用户端3A | 输入 |
eAlgoType | 指定算法类型 E_ALGO_TYPE_AE , E_ALGO_TYPE_AWB, E_ALGO_TYPE_AF | 输入 |
返回值:
返回值 | 描述 |
---|---|
0 | 切换成功 |
<0 | 切换失败 |
范例:
/*ISP0 AE -> SStarAE*/ CUS3A_SetAlgoAdaptor(eIspCh0, eAdapNative, eAlgoAE) /*ISP0 AWB -> Customer AWB*/ CUS3A_SetAlgoAdaptor(eIspCh0, eAdap1, eAlgoAWB) /*ISP0 AF -> Customer AF */ CUS3A_SetAlgoAdaptor(eIspCh0, eAdap1, eAlgoAF)
int CUS3A_RegInterface(U32 nCh, ISP_AE_INTERFACE *pAe, ISP_AWB_INTERFACE *pAwb, ISP_AF_INTERFACE *pAf) int CUS3A_AERegInterface(u32 nCh,ISP_AE_INTERFACE *pAE); int CUS3A_AWBRegInterface(u32 nCh,ISP_AWB_INTERFACE *pAWB); int CUS3A_AFRegInterface(u32 nCh,ISP_AF_INTERFACE *pAF);
CUS3A_RegInterface , CUS3A_AERegInterface, CUS3A_AWBRegInterface, CUS3A_AFRegInterface 不建议使用,请以CUS3A_RegInterfaceEX取代。
说明:
ISP提供AE,AWB,AF库注册接口
可使用*CUS3A_RegInterface*一次注册AE, AWB, AF
或使用*CUS3A_AERegInterface、CUS3A_AWBRegInterface、CUS3A_AFRegInterface*来分别注册AE, AWB, AF
参数:
参数名称 | 描述 | 输出/输入 |
---|---|---|
nCh | nCh = 0 | 输入 |
pAe | 算法实作端提供AE库指针,若不需注册,则填NULL | 输入 |
pAwb | 算法实作端提供AWB库指针,若不需注册,则填NULL | 输入 |
pAf | 算法实作端提供AF库指针,若不需注册,则填NULL | 输入 |
返回值:
返回值 | 描述 |
---|---|
0 | 注册成功 |
<0 | 注册失败 |
9. AE回调界面¶
int (*init)(void* pdata,ISP_AE_INIT_PARAM *init_state)
说明:
ISP透过此接口通知AE库进行初始化
参数:
参数名称 | 描述 | 输出/输入 |
---|---|---|
pdata | 算法私有数据指针 | 输入 |
init_state | AE初始值 | 输入 |
返回值:
返回值 | 描述 |
---|---|
0 | 初始化成功 |
-1 | 初始化失败 |
void (*release)(void* pdata)
说明:
ISP透过此接口通知AE库进行释放程序
参数:
参数名称 | 描述 | 输出/输入 |
---|---|---|
pdata | 算法私有数据指针 | 输入 |
void (*run)(void* pdata,const ISP_AE_INFO *info,ISP_AE_RESULT *result)
说明:
ISP透过此接口呼叫AE库进行运算
参数:
参数名称 | 描述 | 输出/输入 |
---|---|---|
pdata | 算法私有数据指针 | 输入 |
info | ISP AE统计值数据结构指针 | 输入 |
result | ISP AE计算结果数据结构指针 | 输出 |
int (*ctrl)(void* pdata,ISP_AE_CTRL_CMD cmd,void* param)
说明:
ISP透过此接口控制AE参数
参数:
参数名称 | 描述 | 输出/输入 |
---|---|---|
pdata | 算法私有数据指针 | 输入 |
cmd | AE控制指令 | 输入 |
param | AE控制指令参数 | 输入 |
10. AE数据结构¶
ISP_AE_INTERFACE
说明:
AE库注册结构体,算法需实作并且填写init,release,run,ctrl回调指针,供ISP 呼叫。
宣告:
/**@brief ISP AE interface*/ typedef struct { void *pdata; /**< Private data for AE algorithm.*/ int (*init)(void* pdata, ISP_AE_INIT_PARAM *init_state); void (*release)(void* pdata); void (*run)(void* pdata, const ISP_AE_INFO *info, ISP_AE_RESULT *result); int (*ctrl)(void* pdata, ISP_AE_CTRL_CMD cmd, void* param); } ISP_AE_INTERFACE;
成员:
名称 | 描述 |
---|---|
pdata | AE库私有数据指针 |
init | AE库初始化回调指标 |
release | AE库释放回调指针 |
run | AE库计算回调指标,当ISP收到一侦影像统计值时,透过该指针要求AE算法进行计算。 |
ctrl | AE库控制回调指标 |
ISP_AE_INIT_PARAM
说明:
ISP透过此结构,告知AE算法相关硬件初始状态
宣告:
typedef struct { U32 Size; /**< struct size*/ char sensor_id[32]; /**< sensor module id*/ U32 shutter; /**< shutter Shutter in us*/ U32 shutter_step; /**< shutter Shutter step ns*/ U32 shutter_min; /**< shutter Shutter min us*/ U32 shutter_max; /**< shutter Shutter max us*/ U32 sensor_gain; /**< sensor_gain Sensor gain, 1X = 1024*/ U32 sensor_gain_min; /**< sensor_gain_min Minimum Sensor gain, 1X = 1024*/ U32 sensor_gain_max; /**< sensor_gain_max Maximum Sensor gain, 1X = 1024*/ U32 isp_gain; /**< isp_gain Isp digital gain , 1X = 1024 */ U32 isp_gain_max; /**< isp_gain Maximum Isp digital gain , 1X = 1024 */ U32 FNx10; /**< F number * 10*/ U32 fps; /**< initial frame per second*/ U32 shutterHDRShort_step; /**< shutter Shutter step ns*/ U32 shutterHDRShort_min; /**< shutter Shutter min us*/ U32 shutterHDRShort_max; /**< shutter Shutter max us*/ U32 sensor_gainHDRShort_min; /**< sensor_gain_min Minimum Sensor gain, 1X = 1024*/ U32 sensor_gainHDRShort_max; /**< sensor_gain_max Maximum Sensor gain, 1X = 1024*/ /*CUS3A v1.1*/ U32 AvgBlkX; /**< HW statistics average block number*/ U32 AvgBlkY; /**< HW statistics average block number*/ }ISP_AE_INIT_PARAM;
成员:
参数名称 | 描述 | 输出/输入 |
---|---|---|
Size | ISP_AE_INIT_PARAM结构长度 | 输入 |
sensor_id[32] | Image sensor名称 | 输入 |
shutter | 曝光时间初始值 us | 输入 |
shutter_step | 曝光时间步距 ns | 输入 |
shutter_min | 最小曝光时间 us | 输入 |
shutter_max | 最长曝光时间 us | 输入 |
sensor_gain | Sensor增益初始值 | 输入 |
sensor_gain_min | Sensor增益最小值 | 输入 |
sensor_gain_max | Sensor增益最大值 | 输入 |
isp_gain | Isp增益初始值 | 输入 |
isp_gain_max | Isp增益最大值 | 输入 |
FNx10 | 光圈值*10 | 输入 |
fps | 每秒影像侦数 | 输入 |
shutterHDRShort_step | HDR短曝,曝光时间步距 ns | 输入 |
shutterHDRShort_min | HDR短曝,最小曝光时间 us | 输入 |
shutterHDRShort_max | HDR短曝,最长曝光时间 us | 输入 |
sensor_gainHDRShort_min | HDR短曝,Sensor增益最小值 | 输入 |
sensor_gainHDRShort_max | HDR短曝,Sensor增益最大值 | 输入 |
AvgBlkX | AE统计值横向切割数量 | 输入 |
AvgBlkY | AE统计值纵向切割数量 | 输入 |
ISP_AE_INFO
说明:
ISP AE 硬件统计值
宣告:
/*! @brief ISP report to AE, hardware statistic */ typedef struct { U32 Size; /**< struct size*/ ISP_HIST *hist1; /**< HW statistic histogram 1*/ ISP_HIST *hist2; /**< HW statistic histogram 2*/ U32 AvgBlkX; /**< HW statistics average block number*/ U32 AvgBlkY; /**< HW statistics average block number*/ ISP_AE_SAMPLE *avgs; /**< HW statistics average block data*/ U32 Shutter; /**< Current shutter in us*/ U32 SensorGain; /**< Current Sensor gain, 1X = 1024 */ U32 IspGain; /**< Current ISP gain, 1X = 1024*/ U32 ShutterHDRShort; /**< Current shutter in us*/ U32 SensorGainHDRShort; /**< Current Sensor gain, 1X = 1024 */ U32 IspGainHDRShort; /**< Current ISP gain, 1X = 1024*/ /*CUS3A v1.1*/ U32 PreAvgY; /**< Previous frame brightness */ U32 HDRCtlMode; /**< 0 = HDR off;*/ /**< 1 = Separate shutter & Separate sensor gain settings*/ /**< 2 = Separate shutter & Share sensor gain settings*/ /**< 3 = Share shutter & Separate sensor gain settings*/ U32 FNx10; /**< Aperture in FNx10 */ U32 CurFPS; /**< Current sensor FPS */ U32 PreWeightY; /**< Previous frame brightness with ROI weight */ /*CUS3A v1.2*/ ISP_IR_HISTX *histIR; /**< HW statistic histogram IR*/ /*CUS3A v1.3*/ U16 IRLightStr; /**< Setting IR light source strength , range 0~100**/ } ISP_AE_INFO;
成员:
参数名称 | 描述 | 输出/输入 |
---|---|---|
Size | ISP_AE_INFO结构长度 | 输入 |
hist1 | Histogram 1 | 输入 |
hist2 | Histogram 2 (Macaron/Pudding not support) | 输入 |
AvgBlkX | 横向切割数量 | 输入 |
AvgBlkY | 纵向切割数量 | 输入 |
avgs | 区块亮度统计值 | 输入 |
Shutter | 统计值发生时的曝光时间 us | 输入 |
SensorGain | 统计值发生时的Sensor Gain 1X=1024 | 输入 |
IspGain | 统计值发生时的Isp Gain 1X=1024 | 输入 |
ShutterHDRShort | 统计值发生时的曝光时间 us (HDR short) | 输入 |
SensorGainHDRShort | 统计值发生时的Sensor Gain 1X=1024 (HDR short) | 输入 |
IspGainHDRShort | 统计值发生时的Isp Gain 1X=1024 (HDR short) | 输入 |
PreAvgY | 上一次AE结果的平均亮度 8bit*10 | 输入 |
HDRCtlMode | HDR mode时,sensor回传该sensor对于shutter/gain所支持的格式 | 输入 |
FNx10 | 统计值发生时的FN | 输入 |
CurFPS | 当前FPS | 输入 |
PreWeightY | 上一次AE经过ROI weighting的平均亮度 8bit*10 | 输入 |
histIR | RGB-IR sensor时,IR信息的histogram | 输入 |
IRLightStr | 当前IR补光照明强度 0(关闭) ~ 100(最大强度) | 输入 |
ISP_AE_RESULT
说明:
ISP AE 算法计算结果
宣告:
/*! @brief ISP ae algorithm result*/ typedef struct { U32 Size; /**< struct size*/ U32 Change; /**< if true, apply this result to hw register*/ U32 Shutter; /**< Shutter in us */ U32 SensorGain; /**< Sensor gain, 1X = 1024 */ U32 IspGain; /**< ISP gain, 1X = 1024 */ U32 ShutterHdrShort; /**< Shutter in us */ U32 SensorGainHdrShort; /**< Sensor gain, 1X = 1024 */ U32 IspGainHdrShort; /**< ISP gain, 1X = 1024 */ U32 u4BVx16384; /**< Bv * 16384 in APEX system, EV = Av + Tv = Sv + Bv */ U32 AvgY; /**< frame brightness */ U32 HdrRatio; /**< hdr ratio, 1X = 1024 */ /*CUS3A v1.1*/ U32 FNx10; /**< F number * 10 */ U32 DebandFPS; /**< Target fps when running auto debanding*/ U32 WeightY; /**< frame brightness with ROI weight*/ /*CUS3A v1.3*/ U16 GMBlendRatio; /**< Adaptive Gamma Blending Ratio from AE**/ U16 IRLightStr; /**< Setting IR light source strength , range 0~100**/ }ISP_AE_RESULT;
成员:
参数名称 | 描述 | 输出/输入 |
---|---|---|
Size | ISP_AE_RESULT结构长度 | 输入 |
Change | 通知ISP此次计算结果是否要套用到硬件 | 输出 |
Shutter | AE算法回报曝光时间us | 输出 |
SensorGain | AE算法回报Sensor增益 1X=1024 | 输出 |
IspGain | AE算法回报ISP增益 1X=1024 | 输出 |
ShutterHdrShort | AE算法回报曝光时间us (HDR Short) | 输出 |
SensorGainHdrShort | AE算法回报Sensor增益 1X=1024 (HDR Short) | 输出 |
IspGainHdrShort | AE算法回报ISP增益 1X=1024 (HDR Short) | 输出 |
u4Bvx16384 | AE算法回报目前场景亮度估测值 | 输出 |
AvgY | AE算法回报目前影像平均亮度 | 输出 |
HdrRatio | AE算法回报目前影像HDR长短曝比例1x=1024 | 输出 |
FNx10 | AE算法回报目前影像FN Number | 输出 |
DebandFPS | AE算法回报目前影像FPS | 输出 |
WeightY | AE算法回报目前影像经过ROI weighting的平均亮度 | 输出 |
GMBlendRatio | AE算法控制IQ AdaptiveGamma与RGBGamma的混和比例,值域1~1025,513代表直接使用RGBGamma不做混和 | 输出 |
IRLightStr | AE算法决定IR补光照明强度 0(关闭) ~ 100(最大强度) | 输出 |
ISP_AE_CTRL_CMD
说明:
AE控制指令,ISP透过回调接口
int (*ctrl)(void* pdata,ISP_AE_CTRL_CMD cmd,void* param)
设定AE参数,参数param型态随不同的控制命令改变。
宣告:
typedef enum { ISP_AE_FPS_SET, /**< ISP notify AE sensor FPS has changed*/ }ISP_AE_CTRL_CMD;
数值:
名称 | 描述 | 参数型态 |
---|---|---|
ISP_AE_FPS_SET | ISP通知AE库目前的FPS更动 | U32 |
11. AWB回调界面¶
int (*init)(void* pdata)
说明:
ISP透过此接口通AWB库进行初始化
参数:
参数名称 | 描述 | 输出/输入 |
---|---|---|
pdata | 算法私有数据指针 | 输入 |
返回值:
返回值 | 描述 |
---|---|
0 | 初始化成功 |
-1 | 初始化失败 |
void (*release)(void* pdata)
说明:
ISP透过此接口通知AWB库进行释放程序
参数:
参数名称 | 描述 | 输出/输入 |
---|---|---|
pdata | 算法私有数据指针 | 输入 |
void (*run)(void* pdata,const ISP_AWB_INFO *awb_info,const ISP_AE_INFO *ae_info,ISP_AWB_RESULT *result)
说明:
ISP透过此接口呼叫AWB库进行运算
参数:
参数名称 | 描述 | 输出/输入 |
---|---|---|
pdata | 算法私有数据指针 | 输入 |
awb_info | ISP AWB统计值数据结构指针 | 输入 |
ae_info | ISP AE统计值数据结构指针 | 输入 |
result | ISP AWB计算结果数据结构指针 | 输出 |
int (*ctrl)(void* pdata,ISP_AWB_CTRL_CMD cmd,void* param)
说明:
ISP透过此接口控制AWB参数
返回值:
返回值 | 描述 |
---|---|
0 | 控制指令成功 |
<0 | 注册失败 |
参数:
参数名称 | 描述 | 输出/输入 |
---|---|---|
pdata | 算法私有数据指针 | 输入 |
cmd | AWB控制指令 | 输入 |
param | AWB控制指令参数 | 输入 |
12. AWB数据结构¶
ISP_AWB_INTERFACE
说明:
AWB库注册结构体,算法需实作并且填写init,release,run,ctrl回调指针,供ISP 呼叫。
宣告:
typedef struct { void *pdata; /**< Private data for AE algorithm.*/ int (*init)(void *pdata); void (*release)(void *pdata); void (*run)(void *pdata, const ISP_AWB_INFO *awb_info, const ISP_AE_INFO *ae_info, ISP_AWB_RESULT *result); int (*ctrl)(void *pdata, ISP_AWB_CTRL_CMD cmd, void* param); } ISP_AWB_INTERFACE
成员:
名称 | 描述 |
---|---|
pdata | AWB库私有数据指针 |
init | AWB库初始化回调指标 |
release | AWB库释放回调指针 |
run | AWB库计算回调指标,当ISP收到一侦影像统计值时,透过该指针要求AWB算法进行计算。 |
ctrl | AWB库控制回调指标 |
ISP_AWB_INFO
说明:
ISP AWB 硬件统计值
宣告:
/*! @brief AWB HW statistics data*/ typedef struct { U32 AvgBlkX; U32 AvgBlkY; U32 CurRGain; U32 CurGGain; U32 CurBGain; void *avgs; /*CUS3A v1.1*/ U8 HDRMode; /**< Noramal or HDR mode */ void* pAwbStatisShort; /**< Short Shutter AWB statistic data*/ U32 u4BVx16384; /**< From AE output, Bv * 16384 in APEX system, EV = Av + Tv = Sv + Bv */ S32 WeightY; /**< frame brightness with ROI weight0 */ }__attribute__((packed, aligned(1))) ISP_AWB_INFO;
成员:
参数名称 | 描述 | 输出/输入 |
---|---|---|
AvgBlkX | 横向切割数量 | 输入 |
AvgBlkY | 纵向切割数量 | 输入 |
CurRGain | 反应在目前影像的AWB Gain | 输入 |
CurGGain | 反应在目前影像的AWB Gain | 输入 |
CurBGain | 反应在目前影像的AWB Gain | 输入 |
avgs | ISP AWB区块RGB统计值 | 输入 |
HDRMode | 目前影像是否为HDR mode | 输入 |
pAwbStatisShort | ISP AWB区块RGB统计值 (HDR mode下的短曝信息) | 输入 |
U4BVx16384 | AE回传的BV信息 | 输入 |
WeightY | AE回传的ROI weighting的平均亮度 | 输入 |
ISP_AWB_RESULT
说明:
ISP AWB 算法计算结果
宣告:
/*! @brief AWB algorithm result*/ typedef struct { U32 Size; /**< struct size*/ U32 Change; /**< if true, apply this result to hw register*/ U32 R_gain; /**< AWB gain for R channel*/ U32 G_gain; /**< AWB gain for G channel*/ U32 B_gain; /**< AWB gain for B channel*/ U32 ColorTmp; /**< Return color temperature*/ } ISP_AWB_RESULT;
成员:
参数名称 | 描述 | 输出/输入 |
---|---|---|
Size | ISP_AWB_RESULT结构长度 | 输入 |
Change | 通知ISP此次计算结果是否要套用到硬件 | 输出 |
R_gain | AWB算法回报AWB R增益1X = 1024 | 输出 |
G_gain | AWB算法回报AWB G增益1X = 1024 | 输出 |
B_gain | AWB算法回报AWB B增益1X = 1024 | 输出 |
ColorTmp | AWB算法回报目前场景色温K | 输出 |
ISP_AWB_CTRL_CMD
说明:
AWB控制指令,ISP透过回调接口
int (*ctrl)(void* pdata,ISP_AWB_CTRL_CMD cmd,void* param)
设定AE参数,参数param型态随不同的控制命令改变。
宣告:
typedef enum { ISP_AWB_MODE_SET, }ISP_AWB_CTRL_CMD;
数值:
名称 | 描述 | 参数型态 |
---|---|---|
ISP_AWB_MODE_SET | ISP通知AWB库目前的AWB模式更动 | U32 |
13. AF回调界面¶
int (*init)(void* pdata, ISP_AF_INIT_PARAM *param)
说明:
ISP透过此接口通AF库进行初始化
参数:
参数名称 | 描述 | 输出/输入 |
---|---|---|
pdata | 算法私有数据指针 | 输入 |
param | AF初始设定 | 输入/出 |
返回值:
返回值 | 描述 |
---|---|
0 | 初始化成功 |
-1 | 初始化失败 |
void (*release)(void* pdata)
说明:
ISP透过此接口通知AF库进行释放程序
参数:
参数名称 | 描述 | 输出/输入 |
---|---|---|
pdata | 算法私有数据指针 | 输入 |
void (*run)(void* pdata,const ISP_AF_INFO *af_info ,ISP_AF_RESULT *result)
说明:
ISP透过此接口呼叫AF库进行运算
参数:
参数名称 | 描述 | 输出/输入 |
---|---|---|
pdata | 算法私有数据指针 | 输入 |
af_info | ISP AF统计值数据结构指针 | 输入 |
result | ISP AF计算结果数据结构指针 | 输出 |
int (*ctrl)(void* pdata,ISP_AF_CTRL_CMD cmd,void* param) (Reserve)
说明:
ISP透过此接口控制AF参数
返回值:
返回值 | 描述 |
---|---|
0 | 控制指令成功 |
<0 | 注册失败 |
参数:
参数名称 | 描述 | 输出/输入 |
---|---|---|
pdata | 算法私有数据指针 (Reserve) | 输入 |
cmd | AF控制指令 (Reserve) | 输入 |
param | AF控制指令参数 (Reserve) | 输入 |
14. AF数据结构¶
ISP_AF_INTERFACE
说明:
AF库注册结构体,算法需实作并且填写init,release,run,ctrl回调指针,供ISP 呼叫。
宣告:
typedef struct isp_af_interface { void *pdata; /**< Private data for AF algorithm.*/ int (*init)(void *pdata, ISP_AF_INIT_PARAM *param); void (*release)(void *pdata); void (*run)(void *pdata,const ISP_AF_INFO *af_info, ISP_AF_RESULT *result); int (*ctrl)(void *pdata,ISP_AF_CTRL_CMD cmd,void* param); }ISP_AF_INTERFACE;
成员:
名称 | 描述 |
---|---|
pdata | AF库私有数据指针 |
init | AF库初始化回调指标 |
release | AF库释放回调指针 |
run | AF库计算回调指标,当ISP收到一侦影像统计值时,透过该指针要求AF算法进行计算。 |
ctrl | AF库控制回调指标 |
ISP_AF_INIT_PARAM
说明:
ISP透过此结构,告知AF算法相关硬件初始状态
宣告:
typedef struct _isp_af_init_param { u32 Size; /**< struct size*/ ISP_AF_RECT af_stats_win[16]; /**< CUS3A v1.3*/ u32 CurPos; //motor current position u32 MinPos; //motor down position limit u32 MaxPos; //motor up position limit u32 MinStep;//motor minimum step u32 MaxStep;//motor maximum step } ISP_AF_INIT_PARAM;
成员:
参数名称 | 描述 | 输出/输入 |
---|---|---|
Size | ISP_AF_INIT_PARAM结构长度 | 输入 |
Af_stats_win[16] | 当前AF windows 设定值 | 输入 |
CurPos | 当前AF电机位置 | 输入 |
MinPos | AF电机下极限位置 | 输入 |
MaxPos | AF电机上极限位置 | 输入 |
MinStep | AF电机最小步阶 | 输入 |
MaxStep | AF电机最大步阶 |
ISP_AF_INFO
说明:
ISP AF 硬件统计值
宣告:
/*! @brief AF HW statistics data*/ typedef struct { U32 Size; /**< struct size*/ ISP_AF_STATS pStats; /**< AF statistic*/ u32 CurPos; /**<motor current position*/ u32 MinPos; /**<motor down position limit*/ u32 MaxPos; /**<motor up position limit*/ }ISP_AF_INFO;
成员:
参数名称 | 描述 | 输出/输入 |
---|---|---|
Size | ISP_AF_INFO数据结构长度 | 输入 |
pStats | ISP AF统计值 | 输出 |
CurPos | 当前AF电机位置 | 输入 |
MinPos | AF电机下极限位置 | 输入 |
MaxPos | AF电机上极限位置 | 输入 |
ISP_AF_STATS
说明:
ISP AF 硬件统计值
宣告:
//for Pretzel, Macaron, Pudding //for Twinkie typedef struct{ typedef struct{ MI_U8 high_iir[5*16]; MI_U8 high_iir[6*16]; MI_U8 low_iir[5*16]; MI_U8 low_iir[6*16]; MI_U8 luma[4*16]; MI_U8 luma[6*16]; MI_U8 sobel_v[5*16]; MI_U8 sobel_v[6*16]; MI_U8 sobel_h[5*16]; MI_U8 sobel_h[6*16]; MI_U8 ysat[3*16]; MI_U8 ysat[3*16]; } AF_STATS_PARAM_t ; } AF_STATS_PARAM_t ; typedef struct{ typedef struct{ AF_STATS_PARAM_t stParaAPI[16]; AF_STATS_PARAM_t stParaAPI; } CusAFStats_t; } CusAFStats_t;
成员:
参数名称 | 描述 | 输出/输入 |
---|---|---|
IIR_1 | 分区间统计的AF 水平方向IIR滤波器统计值 | 输出 |
IIR_2 | 分区间统计的AF 水平方向IIR滤波器统计值 | 输出 |
Luma | 分区间统计的AF 亮度统计值 | 输出 |
FIR_h | 分区间统计的AF 水平方向FIR滤波器统计值 | 输出 |
FIR_v | 分区间统计的AF 垂直方向FIR滤波器统计值 | 输出 |
YSat | 分区间统计的AF FIR滤波器,大于YThd的统计值个数 | 输出 |
-
IIR_1 default 为 IIR Low,IIR_2 default 为 IIR High
-
每个filter都是16组,前面九个预设对应画面的九宫格分割位置,第16个是自定义使用的,通常是拿来做touch AF。
-
IIR FIR数值越高代表画面就越清晰。Luma表示亮度。
使用参考:
区间加权权重: 建议”中央权重”。
统计值:
建议常时使用IIR_1 (IIR Low)。
IIR_2 (IIR High), 在清晰时会有明显变化,但模糊时几乎不变动,适合做最清晰位置判断。
FIR 会有偏性,仅适合做强度变化参考。
ISP_AF_RESULT
说明:
ISP AF 算法计算结果
宣告:
/*! @brief AF algorithm result*/ typedef struct { u32 Size; /**< struct size*/ u32 Change; /**< if true, apply this result to hw*/ u32 NextPos; /**< Next position*/ /**< CUS3A v1.3*/ u32 ChangeParam; /** if true, apply the following 4 results to hw register **/ CusAFRoiMode_t ROIMode; /** roi mode configuration**/ CusAFWin_t Window[16]; /** AF statistics window position **/ CusAFFilter_t Filter; /** AF filter paramater**/ CusAFFilterSq_t FilterSq; /** AF filter square parameter**/ } ISP_AF_RESULT;
成员:
参数名称 | 描述 | 输出/输入 |
---|---|---|
Change | 通知ISP此次计算结果是否要套用到硬件 | 输出 |
NextPos | AF电机目标位置 | 输出 |
ChangeParam | 通知ISP此次是否更新 ROIMode, Window, Filter, FilterSq | 输出 |
ROIMode | AF window ROI mode | 输出 |
Window | AF window 位置 | 输出 |
Filter | AF滤波参数 | 输出 |
FilterSq | AF滤波后处理 | 输出 |
15. SAMPLE CODE¶
#include <mi_isp.h> //// AE INTERFACE TEST //// int ae_init(void* pdata, ISP_AE_INIT_PARAM *init_state) { printf("****** ae_init ,shutter=%d,shutter_step=%d,sensor_gain_min=%d,sensor_gain_max=%d *******\n", (int)init_state->shutter, (int)init_state->shutter_step, (int)init_state->sensor_gain, (int)init_state->sensor_gain_max ); return 0; } void ae_run(void* pdata, const ISP_AE_INFO *info, ISP_AE_RESULT *result) { #define log_info 1 // Only one can be chosen (the following three define) #define shutter_test 0 #define gain_test 0 #define AE_sample 1 #if (shutter_test) || (gain_test) static int AE_period = 4; #endif static unsigned int fcount = 0; unsigned int max = info->AvgBlkY * info->AvgBlkX; unsigned int avg = 0; unsigned int n; #if gain_test static int tmp = 0; static int tmp1 = 0; #endif result->Change = 0; result->u4BVx16384 = 16384; result->HdrRatio = 10; //infinity5 //TBD //10 * 1024; //user define hdr exposure ratio result->IspGain = 1024; result->SensorGain = 4096; result->Shutter = 20000; result->IspGainHdrShort = 1024; result->SensorGainHdrShort = 1024; result->ShutterHdrShort = 1000; //result->Size = sizeof(CusAEResult_t); for(n = 0; n < max; ++n) { avg += info->avgs[n].y; } avg /= max; result->AvgY = avg; #if shutter_test // shutter test under constant sensor gain int Shutter_Step = 100; //per frame int Shutter_Max = 33333; int Shutter_Min = 150; int Gain_Constant = 10240; result->SensorGain = Gain_Constant; result->Shutter = info->Shutter; if(++fcount % AE_period == 0) { if (tmp == 0) { result->Shutter = info->Shutter + Shutter_Step * AE_period; //printf("[shutter-up] result->Shutter = %d \n", result->SensorGain); } else { result->Shutter = info->Shutter - Shutter_Step * AE_period; //printf("[shutter-down] result->Shutter = %d \n", result->SensorGain); } if (result->Shutter >= Shutter_Max) { result->Shutter = Shutter_Max; tmp = 1; } if (result->Shutter <= Shutter_Min) { result->Shutter = Shutter_Min; tmp = 0; } } #if log_info printf("fcount = %d, Image avg = 0x%X \n", fcount, avg); printf("tmp = %d, Shutter: %d -> %d \n", tmp, info->Shutter, result->Shutter); #endif #endif #if gain_test // gain test under constant shutter int Gain_Step = 1024; //per frame int Gain_Max = 1024 * 100; int Gain_Min = 1024 * 2; int Shutter_Constant = 20000; result->SensorGain = info->SensorGain; result->Shutter = Shutter_Constant; if(++fcount % AE_period == 0) { if (tmp1 == 0) { result->SensorGain = info->SensorGain + Gain_Step * AE_period; //printf("[gain-up] result->SensorGain = %d \n", result->SensorGain); } else { result->SensorGain = info->SensorGain - Gain_Step * AE_period; //printf("[gain-down] result->SensorGain = %d \n", result->SensorGain); } if (result->SensorGain >= Gain_Max) { result->SensorGain = Gain_Max; tmp1 = 1; } if (result->SensorGain <= Gain_Min) { result->SensorGain = Gain_Min; tmp1 = 0; } } #if log_info printf("fcount = %d, Image avg = 0x%X \n", fcount, avg); printf("tmp = %d, SensorGain: %d -> %d \n", tmp, info->SensorGain, result->SensorGain); #endif #endif #if AE_sample int y_lower = 0x28; int y_upper = 0x38; int change_ratio = 10; // percentage int Gain_Min = 1024 * 2; int Gain_Max = 1024 * 1000; int Shutter_Min = 150; int Shutter_Max = 33333; result->SensorGain = info->SensorGain; result->Shutter = info->Shutter; if(avg < y_lower) { if (info->Shutter < Shutter_Max) { result->Shutter = info->Shutter + (info->Shutter * change_ratio / 100); if (result->Shutter > Shutter_Max) result->Shutter = Shutter_Max; } else { result->SensorGain = info->SensorGain + (info->SensorGain * change_ratio / 100); if (result->SensorGain > Gain_Max) result->SensorGain = Gain_Max; } result->Change = 1; } else if(avg > y_upper) { if (info->SensorGain > Gain_Min) { result->SensorGain = info->SensorGain - (info->SensorGain * change_ratio / 100); if (result->SensorGain < Gain_Min) result->SensorGain = Gain_Min; } else { result->Shutter = info->Shutter - (info->Shutter * change_ratio / 100); if (result->Shutter < Shutter_Min) result->Shutter = Shutter_Min; } result->Change = 1; } #if 0 //infinity5 //TBD //hdr demo code result->SensorGainHdrShort = result->SensorGain; result->ShutterHdrShort = result->Shutter * 1024 / result->HdrRatio; #endif #if log_info printf("fcount = %d, Image avg = 0x%X \n", fcount, avg); printf("SensorGain: %d -> %d \n", (int)info->SensorGain, (int)result->SensorGain); printf("Shutter: %d -> %d \n", (int)info->Shutter, (int)result->Shutter); #endif #endif } void ae_release(void* pdata) { printf("************* ae_release *************\n"); } //// AWB INTERFACE TEST //// int awb_init(void *pdata) { printf("************ awb_init **********\n"); return 0; } void awb_run(void* pdata, const ISP_AWB_INFO *info, ISP_AWB_RESULT *result) { #define log_info 1 static u32 count = 0; int avg_r = 0; int avg_g = 0; int avg_b = 0; int tar_rgain = 1024; int tar_bgain = 1024; int x = 0; int y = 0; result->R_gain = info->CurRGain; result->G_gain = info->CurGGain; result->B_gain = info->CurBGain; result->Change = 0; result->ColorTmp = 6000; if (++count % 4 == 0) { //center area YR/G/B avg for (y = 30; y < 60; ++y) { for (x = 32; x < 96; ++x) { avg_r += info->avgs[info->AvgBlkX * y + x].r; avg_g += info->avgs[info->AvgBlkX * y + x].g; avg_b += info->avgs[info->AvgBlkX * y + x].b; } } avg_r /= 30 * 64; avg_g /= 30 * 64; avg_b /= 30 * 64; if (avg_r < 1) avg_r = 1; if (avg_g < 1) avg_g = 1; if (avg_b < 1) avg_b = 1; #if log_info printf("AVG R / G / B = %d, %d, %d \n", avg_r, avg_g, avg_b); #endif // calculate Rgain, Bgain tar_rgain = avg_g * 1024 / avg_r; tar_bgain = avg_g * 1024 / avg_b; if (tar_rgain > info->CurRGain) { if (tar_rgain - info->CurRGain < 384) result->R_gain = tar_rgain; else result->R_gain = info->CurRGain + (tar_rgain - info->CurRGain) / 10; } else { if (info->CurRGain - tar_rgain < 384) result->R_gain = tar_rgain; else result->R_gain = info->CurRGain - (info->CurRGain - tar_rgain) / 10; } if (tar_bgain > info->CurBGain) { if (tar_bgain - info->CurBGain < 384) result->B_gain = tar_bgain; else result->B_gain = info->CurBGain + (tar_bgain - info->CurBGain) / 10; } else { if (info->CurBGain - tar_bgain < 384) result->B_gain = tar_bgain; else result->B_gain = info->CurBGain - (info->CurBGain - tar_bgain) / 10; } result->Change = 1; result->G_gain = 1024; #if log_info printf("[current] r=%d, g=%d, b=%d \n", (int)info->CurRGain, (int)info->CurGGain, (int)info->CurBGain); printf("[result] r=%d, g=%d, b=%d \n", (int)result->R_gain, (int)result->G_gain, (int)result->B_gain); #endif } } void awb_release(void *pdata) { printf("************ awb_release **********\n"); } //// AF INTERFACE TEST //// int af_init(void *pdata, ISP_AF_INIT_PARAM *param) { MI_U32 u32ch = 0; MI_U8 u8win_idx = 16; CusAFRoiMode_t taf_roimode; CusAFWin_t taf_win; printf("************ af_init **********\n"); #if 0 //Init Normal mode setting taf_roimode.mode = AF_ROI_MODE_NORMAL; taf_roimode.u32_vertical_block_number = 1; MI_ISP_CUS3A_SetAFRoiMode(u32ch, &taf_roimode); static CusAFWin_t afwin[16] = { { 0, { 0, 0, 255, 255}}, { 1, { 256, 0, 511, 255}}, { 2, { 512, 0, 767, 255}}, { 3, { 768, 0, 1023, 255}}, { 4, { 0, 256, 255, 511}}, { 5, { 256, 256, 511, 511}}, { 6, { 512, 256, 767, 511}}, { 7, { 768, 256, 1023, 511}}, { 8, { 0, 512, 255, 767}}, { 9, { 256, 512, 511, 767}}, {10, { 512, 512, 767, 767}}, {11, { 768, 512, 1023, 767}}, {12, { 0, 768, 255, 1023}}, {13, { 256, 768, 511, 1023}}, {14, { 512, 768, 767, 1023}}, {15, { 768, 768, 1023, 1023}} }; for(u8win_idx = 0; u8win_idx < 16; ++u8win_idx){ MI_ISP_CUS3A_SetAFWindow(u32ch, &afwin[u8win_idx]); } #else //Init Matrix mode setting taf_roimode.mode = AF_ROI_MODE_MATRIX; taf_roimode.u32_vertical_block_number = 16; //16xN, N=16 MI_ISP_CUS3A_SetAFRoiMode(u32ch, &taf_roimode); static CusAFWin_t afwin[16] = { #if 1 //full image, equal divide to 16x16 {0, {0, 0, 63, 63}}, {1, {64, 64, 127, 127}}, {2, {128, 128, 191, 191}}, {3, {192, 192, 255, 255}}, {4, {256, 256, 319, 319}}, {5, {320, 320, 383, 383}}, {6, {384, 384, 447, 447}}, {7, {448, 448, 511, 511}}, {8, {512, 512, 575, 575}}, {9, {576, 576, 639, 639}}, {10, {640, 640, 703, 703}}, {11, {704, 704, 767, 767}}, {12, {768, 768, 831, 831}}, {13, {832, 832, 895, 895}}, {14, {896, 896, 959, 959}}, {15, {960, 960, 1023, 1023}} #else //use two row only => 16x2 win {0, {0, 0, 63, 63}}, {1, {64, 64, 127, 127}}, {2, {128, 0, 191, 2}}, //win2 v_str, v_end doesn't use, set to (0, 2) {3, {192, 0, 255, 2}}, {4, {256, 0, 319, 2}}, {5, {320, 0, 383, 2}}, {6, {384, 0, 447, 2}}, {7, {448, 0, 511, 2}}, {8, {512, 0, 575, 2}}, {9, {576, 0, 639, 2}}, {10, {640, 0, 703, 2}}, {11, {704, 0, 767, 2}}, {12, {768, 0, 831, 2}}, {13, {832, 0, 895, 2}}, {14, {896, 0, 959, 2}}, {15, {960, 0, 1023, 2}} #endif }; for(u8win_idx = 0; u8win_idx < 16; ++u8win_idx){ MI_ISP_CUS3A_SetAFWindow(u32ch, &afwin[u8win_idx]); } #endif static CusAFFilter_t affilter = { #if Twinkie || Pretzel || Macaron //filter setting with sign value //{63, -126, 63, -109, 48, 0, 320, 0, 1023}, //{63, -126, 63, 65, 55, 0, 320, 0, 1023} //convert to hw format (sign bit with msb) 63, 126+1024, 63, 109+128, 48, 0, 320, 0, 1023, 63, 126+1024, 63, 65, 55, 0, 320, 0, 1023, #elseif Pudding //filter setting with sign value //{s9, s10, s9, s7, s7} //high: 37, 0, -37, 83, 40; 37, 0, -37, -54, 34; 32, 0, -32, 14, 0 //low: 15, 0, -15, -79, 44; 15, 0, -15, -115, 55; 14, 0, -14, -91, 37 //convert to hw format (sign bit with msb) 37, 0, 37+512, 83, 40, 0, 1023, 0, 1023, //high 15, 0, 15+512, 79+128, 44, 0, 1023, 0, 1023, //low 1, 37, 0, 37+512, 54+128, 34, 1, 32, 0, 32+512, 14, 0, //high-e1, e2 1, 15, 0, 15+512, 115+128, 55, 1, 14, 0, 14+512, 91+128, 37, //low-e1, e2 #endif }; MI_ISP_CUS3A_SetAFFilter(0, &affilter); return 0; } void af_run(void *pdata, const ISP_AF_INFO *af_info, ISP_AF_RESULT *result) { #define af_log_info 1 #if af_log_info int i=0,x=0; printf("\n\n"); //print row0 16wins x=0; for (i=0; i<16; i++){ printf("[AF]win%d-%d iir0: 0x%02x%02x%02x%02x%02x, iir1:0x%02x%02x%02x%02x%02x, luma:0x%02x%02x%02x%02x, sobelh:0x%02x%02x%02x%02x%02x, sobelv:0x%02x%02x%02x%02x%02x ysat:0x%02x%02x%02x\n", x, i, af_info->af_stats.stParaAPI[x].high_iir[4+i*5],af_info->af_stats.stParaAPI[x].high_iir[3+i*5],af_info->af_stats.stParaAPI[x].high_iir[2+i*5],af_info->af_stats.stParaAPI[x].high_iir[1+i*5],af_info->af_stats.stParaAPI[x].high_iir[0+i*5], af_info->af_stats.stParaAPI[x].low_iir[4+i*5],af_info->af_stats.stParaAPI[x].low_iir[3+i*5],af_info->af_stats.stParaAPI[x].low_iir[2+i*5],af_info->af_stats.stParaAPI[x].low_iir[1+i*5],af_info->af_stats.stParaAPI[x].low_iir[0+i*5], af_info->af_stats.stParaAPI[x].luma[3+i*4],af_info->af_stats.stParaAPI[x].luma[2+i*4],af_info->af_stats.stParaAPI[x].luma[1+i*4],af_info->af_stats.stParaAPI[x].luma[0+i*4], af_info->af_stats.stParaAPI[x].sobel_h[4+i*5],af_info->af_stats.stParaAPI[x].sobel_h[3+i*5],af_info->af_stats.stParaAPI[x].sobel_h[2+i*5],af_info->af_stats.stParaAPI[x].sobel_h[1+i*5],af_info->af_stats.stParaAPI[x].sobel_h[0+i*5], af_info->af_stats.stParaAPI[x].sobel_v[4+i*5],af_info->af_stats.stParaAPI[x].sobel_v[3+i*5],af_info->af_stats.stParaAPI[x].sobel_v[2+i*5],af_info->af_stats.stParaAPI[x].sobel_v[1+i*5],af_info->af_stats.stParaAPI[x].sobel_v[0+i*5], af_info->af_stats.stParaAPI[x].ysat[2+i*3],af_info->af_stats.stParaAPI[x].ysat[1+i*3],af_info->af_stats.stParaAPI[x].ysat[0+i*3] ); } //print row15 16wins x=15; for (i=0; i<16; i++){ printf("[AF]win%d-%d iir0: 0x%02x%02x%02x%02x%02x, iir1:0x%02x%02x%02x%02x%02x, luma:0x%02x%02x%02x%02x, sobelh:0x%02x%02x%02x%02x%02x, sobelv:0x%02x%02x%02x%02x%02x ysat:0x%02x%02x%02x\n", x, i, af_info->af_stats.stParaAPI[x].high_iir[4+i*5],af_info->af_stats.stParaAPI[x].high_iir[3+i*5],af_info->af_stats.stParaAPI[x].high_iir[2+i*5],af_info->af_stats.stParaAPI[x].high_iir[1+i*5],af_info->af_stats.stParaAPI[x].high_iir[0+i*5], af_info->af_stats.stParaAPI[x].low_iir[4+i*5],af_info->af_stats.stParaAPI[x].low_iir[3+i*5],af_info->af_stats.stParaAPI[x].low_iir[2+i*5],af_info->af_stats.stParaAPI[x].low_iir[1+i*5],af_info->af_stats.stParaAPI[x].low_iir[0+i*5], af_info->af_stats.stParaAPI[x].luma[3+i*4],af_info->af_stats.stParaAPI[x].luma[2+i*4],af_info->af_stats.stParaAPI[x].luma[1+i*4],af_info->af_stats.stParaAPI[x].luma[0+i*4], af_info->af_stats.stParaAPI[x].sobel_h[4+i*5],af_info->af_stats.stParaAPI[x].sobel_h[3+i*5],af_info->af_stats.stParaAPI[x].sobel_h[2+i*5],af_info->af_stats.stParaAPI[x].sobel_h[1+i*5],af_info->af_stats.stParaAPI[x].sobel_h[0+i*5], af_info->af_stats.stParaAPI[x].sobel_v[4+i*5],af_info->af_stats.stParaAPI[x].sobel_v[3+i*5],af_info->af_stats.stParaAPI[x].sobel_v[2+i*5],af_info->af_stats.stParaAPI[x].sobel_v[1+i*5],af_info->af_stats.stParaAPI[x].sobel_v[0+i*5], af_info->af_stats.stParaAPI[x].ysat[2+i*3],af_info->af_stats.stParaAPI[x].ysat[1+i*3],af_info->af_stats.stParaAPI[x].ysat[0+i*3] ); } #endif} void af_release(void *pdata) { printf("************ af_release **********\n"); } int main(int argc,char** argv) { //TO DO: Register 3rd party AE/AWB library ISP_AE_INTERFACE tAeIf; ISP_AWB_INTERFACE tAwbIf; CUS3A_Init(); /*AE*/ tAeIf.ctrl = NULL; tAeIf.pdata = NULL; tAeIf.init = ae_init; tAeIf.release = ae_release; tAeIf.run = ae_run; /*AWB*/ tAwbIf.ctrl = NULL; tAwbIf.pdata = NULL; tAwbIf.init = awb_init; tAwbIf.release = awb_release; tAwbIf.run = awb_run; CUS3A_RegInterface(0,&tAeIf,&tAwbIf,NULL); // or use below reginterface //CUS3A_AERegInterface(0,&tAeIf); //CUS3A_AWBRegInterface(0,&tAwbIf); //TO DO: Open MI MI_SYS_Init(); while(1) { usleep(5000); } }
15.1. CUSA_AeAvgDownSample¶
这边提供一个转换函式,将AE出来的统计值,从32x32缩小为16x16的sample code
void ae_run(void* pdata, const ISP_AE_INFO *info, ISP_AE_RESULT *result) { ISP_AE_SAMPLE *pInBuf = info->avgs; ISP_AE_SAMPLE *pOutBuf = info->avgs; unsigned int u32InBlkNumX = info->AvgBlkX; //value is 32 for MACARON, PUDDING unsigned int u32InBlkNumY = info->AvgBlkY; //value is 32 for MACARON, PUDDING unsigned int u32OutBlkNumX = 16; unsigned int u32OutBlkNumY = 16; CUS3A_AeAvgDownSample(pInBuf, pOutBuf, u32InBlkNumX, u32InBlkNumY, u32OutBlkNumX, u32OutBlkNumY); max = u32OutBlkNumX*u32OutBlkNumY; }
16. MI_ISP 设置AE CROP RANGE¶
16.1. MI_ISP_CUSA_SetAECropSize¶
目的
设定AE的统计值范围
语法
MI_RET MI_ISP_CUS3A_SetAECropSize(U32 nChannel, CusAEAWBCropSize_t *data);
描述
Step1: MI_ISP_CUS3A_SetAECropSize: 调用此界面设置AE的统计值范围
Step2: MI_ISP_CUS3A_SetAEWindowBlockNumber: 针对统计值范围内的区域,切成MxN的Block来获得统计值
参数
参数名称 | 描述 |
---|---|
nChannel | 视讯输入信道号码(一般为0) |
data | 设定AE统计值的范围 |
返回值
返回值 | 描述 |
---|---|
MI_RET_SUCCESS | 成功 |
MI_RET_FAIL | 失败 |
需求
header file:mi_isp_twinkie.h / mi_isp_pretzel.h / mi_isp.h (for Macaron, Pudding)
.so:libmi_isp_twinkie.so / libmi_isp_pretzel.so / libmi_isp.so (for Macaron, Pudding)
16.2. CusAEAWBCropSize_t¶
说明
AE统计值范围
定义
typedef struct { MI_U16 u2CropX; MI_U16 u2CropY; MI_U16 u2CropW; MI_U16 u2CropH; } CusAEAWBCropSize_t;
成员
参数名称 | 描述 |
---|---|
U2CropX | AE/AWB统计值范围的X起点 (0~1023) |
U2CropY | AE/AWB统计值范围的Y起点 (0~1023) |
U2CropW | AE/AWB统计值范围的宽度 (0~1023) |
U2CropH | AE/AWB统计值范围的高度 (0~1023) |
CropSize说明
注意: 影像宽高已经对应到1023,所以Crop信息,都以1023来看,FW会自动取目前实际影像大小,做mapping动作,所以用户不需知道当前影像大小多少,只要设定相对位置就好。
举例: 设定 CropX = 10,CropY = 10,CropW = 300,CropH = 200
若实际影像宽高为1920x1080
则反应在1920x1080上,会是
CropX = 1920*10/1023 = 18
CropY = 1080*10/1023 = 10
CropW = 1920*300/1023 = 563
CropH = 1080*200/1023 = 211
17. MI_ISP 设置AE BLOCK NUMBER¶
17.1. MI_ISP_CUSA_SetAEWindowBlockNumber¶
目的
设定AE的区块数量
语法
MI_RET MI_ISP_CUS3A_SetAEWindowBlockNumber(U32 nChannel, MS_CUST_AE_WIN_BLOCK_NUM_TYPE_e eBlkNum);
描述
调用此界面设置AE区块数量
参数
参数名称 | 描述 |
---|---|
nChannel | 视讯输入信道号码(一般为0) |
eBlkNum | 区块个数,将整张照片切割成X*Y格 |
返回值
返回值 | 描述 |
---|---|
MI_RET_SUCCESS | 成功 |
MI_RET_FAIL | 失败 |
需求
header file:mi_isp_twinkie.h / mi_isp_pretzel.h / mi_isp.h (for Macaron, Pudding)
.so:libmi_isp_twinkie.so / libmi_isp_pretzel.so / libmi_isp.so (for Macaron, Pudding)
17.2. MS_CUST_AE_WIN_BLOCK_NUM_TYPE_e¶
说明
AE区块
定义
typedef enum { AE_16x24 = 0, AE_32x24, AE_64x48, AE_64x45, AE_128x80, AE_128x90 } AeWinBlockNum_e;
成员
参数名称 | 描述 |
---|---|
AE_16x24 | 画面分割成16*24块 |
AE_32x24 | 画面分割成32*24块 |
AE_64x48 | 画面分割成64*48块 |
AE_64x45 | 画面分割成64*45块 |
AE_128x80 | 画面分割成128*80块 |
AE_128x90 | 画面分割成128*90块 |
备注
Macaron, Pudding不支持这支API,画面强制分割成32*32块。
18. MI_ISP 设置AE HISTOGRAM WINDOW¶
18.1. MI_ISP_CUSA_SetAEHistogramWindow¶
目的
AE亮度分布统计值的窗口区域设定
语法
MI_RET MI_ISP_CUS3A_SetAEHistogramWindow(MI_U32 Channel, CusAEHistWin_t *data);
描述
调用此接口设置AE亮度分布统计值的窗口区域位置及大小
成员
参数名称 | 描述 |
---|---|
nChannel | 视讯输入信道号码(一般为0) |
data | 亮度分布统计值的窗口区域位置及大小,窗口编号(0或1) |
返回值
返回值 | 描述 |
---|---|
MI_RET_SUCCESS | 成功 |
MI_RET_FAIL | 失败 |
需求
header file:mi_isp_twinkie.h / mi_isp_pretzel.h / mi_isp.h (for Macaron, Pudding)
.so:libmi_isp_twinkie.so / libmi_isp_pretzel.so / libmi_isp.so (for Macaron, Pudding)
注意
目前只能支持同时设定两个窗口(0/1)。窗口区域可以重迭。
18.2. HistWin_t¶
说明
AE亮度分布统计值的窗口区域设定
定义
typedef struct { MI_U16 u2Stawin_x_offset; MI_U16 u2Stawin_x_size; MI_U16 u2Stawin_y_offset; MI_U16 u2Stawin_y_size; MI_U16 u2WinIdx; } CusAEHistWin_t;
成员
参数名称 | 描述 |
---|---|
u2Stawin_x_offset | 窗口起始坐标x轴偏移 |
u2Stawin_x_size | x轴方向窗口大小 |
u2Stawin_y_offset | 窗口起始坐标y轴偏移 |
u2Stawin_y_size | y轴方向窗口大小 |
u2WinIdx | 窗口编号(0或1) |
参数范围
X轴偏移:0~127
Y轴偏移:0~89
X轴(偏移+大小) <= 128
Y轴(偏移+大小) <= 90
备注
在Macaron, Pudding中,参数范围如下。
X轴偏移:0~31
Y轴偏移:0~31
X轴(偏移+大小) <= 32
Y轴(偏移+大小) <= 32
19. MI_ISP 设置AWB CROP RANGE¶
19.1. MI_ISP_CUSA_SetAWBCropSize¶
目的
设定AWB的统计值范围
语法
MI_RET MI_ISP_CUS3A_SetAWBCropSize(U32 nChannel, CusAEAWBCropSize_t *data);
描述
Step1: MI_ISP_CUS3A_SetAWBCropSize: 调用此界面设置AWB的统计值范围
Step2: 硬件针对此统计值范围,再固定切为128x90 个block
参数
参数名称 | 描述 |
---|---|
nChannel | 视讯输入信道号码(一般为0) |
data | 设定AWB统计值的范围 |
返回值
返回值 | 描述 |
---|---|
MI_RET_SUCCESS | 成功 |
MI_RET_FAIL | 失败 |
需求
header file:mi_isp_twinkie.h / mi_isp_pretzel.h / mi_isp.h (for Macaron, Pudding)
.so:libmi_isp_twinkie.so / libmi_isp_pretzel.so / libmi_isp.so (for Macaron, Pudding)
19.2. CusAWBCropSize_t¶
说明
AWB统计值范围
定义
typedef struct { MI_U16 u2CropX; MI_U16 u2CropY; MI_U16 u2CropW; MI_U16 u2CropH; } CusAEAWBCropSize_t;
成员
参数名称 | 描述 |
---|---|
U2CropX | AE/AWB统计值范围的X起点 (0~1023) |
U2CropY | AE/AWB统计值范围的Y起点 (0~1023) |
U2CropW | AE/AWB统计值范围的宽度 (0~1023) |
U2CropH | AE/AWB统计值范围的高度 (0~1023) |
CropSize说明
注意: 影像宽高已经对应到1023,所以Crop信息,都以1023来看,FW会自动取目前实际影像大小,做mapping动作,所以用户不需知道当前影像大小多少,只要设定相对位置就好。
举例: 设定 CropX = 10,CropY = 10,CropW = 300,CropH = 200
若实际影像宽高为1920x1080
则反应在1920x1080上,会是
CropX = 1920*10/1023 = 18
CropY = 1080*10/1023 = 10
CropW = 1920*300/1023 = 563
CropH = 1080*200/1023 = 211
20. MI_ISP 设置AWB SAMPLING¶
20.1. MI_ISP_CUSA_SetAwbSampling¶
目的
设定AWB取样大小
语法
MI_RET MI_ISP_CUS3A_SetAwbSampling(U32 nChannel, CusAWBSample_t *data)
描述
调用此界面设置AWB取样大小
成员
参数名称 | 描述 |
---|---|
nChannel | 视讯输入信道号码(一般为0) |
SizeX | X轴上取多少个取样点 |
SizeY | Y轴上取多少个取样点 |
IncRatio | 对统计值乘上一个比例 |
返回值
返回值 | 描述 |
---|---|
MI_RET_SUCCESS | 成功 |
MI_RET_FAIL | 失败 |
需求
header file:mi_isp_twinkie.h / mi_isp_pretzel.h / mi_isp.h (for Macaron, Pudding)
.so:libmi_isp_twinkie.so / libmi_isp_pretzel.so / libmi_isp.so (for Macaron, Pudding)
注意
整张照片已经切割成128*90格,每个格子中取其中SizeX * SizeY个pixels做AWB取样。
SizeX:SizeX >=4 && SizeX <= Block_size_X
SizeY:SizeY >=2 && SizeY <= Block_size_Y
当AE亮度很低的时候,可将统计值乘上一个比例(IncRatio),避免统计值为0
21. MI_ISP 设置AF FILTER¶
21.1. MI_ISP_CUSA_SetAFFilter¶
目的
设定AF Filter参数
语法
MI_RET MI_ISP_CUS3A_SetAFFilter (MI_U32 Channel, CusAFFilter_t *data);
描述
调用此界面设置AF Filter参数
参数
参数名称 | 描述 |
---|---|
nChannel | 视讯输入信道号码(一般为0) |
data | AF Filter参数 |
返回值
返回值 | 描述 |
---|---|
MI_RET_SUCCESS | 成功 |
MI_RET_FAIL | 失败 |
21.2. CusAFFilter_t¶
说明
ISP AF 硬件统计值
定义
typedef struct { MI_U16 u16IIR1_a0; MI_U16 u16IIR1_a1; MI_U16 u16IIR1_a2; MI_U16 u16IIR1_b1; MI_U16 u16IIR1_b2; MI_U16 u16IIR1_1st_low_clip; MI_U16 u16IIR1_1st_high_clip; MI_U16 u16IIR1_2nd_low_clip; MI_U16 u16IIR1_2nd_high_clip; MI_U16 u16IIR2_a0; MI_U16 u16IIR2_a1; MI_U16 u16IIR2_a2; MI_U16 u16IIR2_b1; MI_U16 u16IIR2_b2; MI_U16 u16IIR2_1st_low_clip; MI_U16 u16IIR2_1st_high_clip; MI_U16 u16IIR2_2nd_low_clip; MI_U16 u16IIR2_2nd_high_clip; //for Pudding only MI_U16 u16IIR1_e1_en; MI_U16 u16IIR1_e1_a0; MI_U16 u16IIR1_e1_a1; MI_U16 u16IIR1_e1_a2; MI_U16 u16IIR1_e1_b1; MI_U16 u16IIR1_e1_b2; MI_U16 u16IIR1_e2_en; MI_U16 u16IIR1_e2_a0; MI_U16 u16IIR1_e2_a1; MI_U16 u16IIR1_e2_a2; MI_U16 u16IIR1_e2_b1; MI_U16 u16IIR1_e2_b2; MI_U16 u16IIR2_e1_en; MI_U16 u16IIR2_e1_a0; MI_U16 u16IIR2_e1_a1; MI_U16 u16IIR2_e1_a2; MI_U16 u16IIR2_e1_b1; MI_U16 u16IIR2_e1_b2; MI_U16 u16IIR2_e2_en; MI_U16 u16IIR2_e2_a0; MI_U16 u16IIR2_e2_a1; MI_U16 u16IIR2_e2_a2; MI_U16 u16IIR2_e2_b1; MI_U16 u16IIR2_e2_b2; } CusAFFilter_t;
成员
IIR参数如下
名称 | bit表示 | 描述 | IIR1 default | IIR2 default |
---|---|---|---|---|
a0 | S+9 | a0乘法器 | 63 | 63 |
a1 | S+10 | a1乘法器 | -126 | -126 |
a2 | S+9 | a2乘法器 | 63 | 63 |
b1 | S+7 | b1乘法器 | 65 | -109 |
b2 | S+7 | b2乘法器 | 55 | 48 |
1st_low_clip | 10 | X(n) input low clip | 0 | 0 |
1st_high_clip | 10 | X(n) input high clip | 320 | 320 |
2nd_low_clip | 10 | Y(n) output low clip | 0 | 0 |
2nd_high_clip | 10 | Y(n) output high clip | 1023 | 1023 |
** IIR1 default 为 IIR High,IIR2 default 为 IIR Low
//Pudding only
名称 | bit表示 | 描述 | IIR1 default | IIR2 default |
---|---|---|---|---|
a0 | S+9 | a0乘法器 | 37 | 15 |
a1 | S+10 | a1乘法器 | 0 | 0 |
a2 | S+9 | a2乘法器 | -37 | -15 |
b1 | S+7 | b1乘法器 | 83 | -79 |
b2 | S+7 | b2乘法器 | 40 | 44 |
1st_low_clip | 10 | X(n) input low clip | 0 | 0 |
1st_high_clip | 10 | X(n) input high clip | 1023 | 1023 |
2nd_low_clip | 10 | Y(n) output low clip | 0 | 0 |
2nd_high_clip | 10 | Y(n) output high clip | 1023 | 1023 |
e1_en | 1 | Extra1 enable | 1 | 1 |
e1_a0 | S+9 | a0乘法器 | 37 | 15 |
e1_a1 | S+10 | a1乘法器 | 0 | 0 |
e1_a2 | S+9 | a2乘法器 | -37 | -15 |
e1_b1 | S+7 | b1乘法器 | -54 | -115 |
e1_b2 | S+7 | b2乘法器 | 34 | 55 |
e2_en | 1 | Extra2 enable | 1 | 1 |
e2_a0 | S+9 | a0乘法器 | 32 | 14 |
e2_a1 | S+10 | a1乘法器 | 0 | 0 |
e2_a2 | S+9 | a2乘法器 | -32 | -14 |
e2_b1 | S+7 | b1乘法器 | 14 | -91 |
e2_b2 | S+7 | b2乘法器 | 0 | 37 |
** IIR1 default 为 IIR High,IIR2 default 为 IIR Low
IIR 系数,架构图如下:
需求
header file:mi_isp_twinkie.h / mi_isp_pretzel.h / mi_isp.h (for Macaron, Pudding)
.so:libmi_isp_twinkie.so / libmi_isp_pretzel.so / libmi_isp.so (for Macaron, Pudding)
22. MI_ISP 设置AF FILTER SQUARE¶
22.1. MI_ISP_CUSA_SetAFFilterSq¶
目的
设定AF Filter Square参数
语法
MI_RET MI_ISP_CUS3A_SetAFFilterSq (MI_U32 Channel, CusAFFilterSq_t *data);
描述
调用此界面设置AF Filter Square参数
参数
参数名称 | 描述 |
---|---|
nChannel | 视讯输入信道号码(一般为0) |
data | AF Filter Square参数 |
返回值
返回值 | 描述 |
---|---|
MI_RET_SUCCESS | 成功 |
MI_RET_FAIL | 失败 |
22.2. CusAFFilterSq_t¶
说明
ISP AF Square硬件统计值
定义
typedef struct { MI_BOOL bFIRYSatEn; MI_U16 u16FIRYThd; MI_BOOL bIIRSquareAccEn; MI_BOOL bFIRSquareAccEn; MI_U16 u16IIR1Thd; MI_U16 u16IIR2Thd; MI_U16 u16FIRHThd; MI_U16 u16FIRVThd; MI_U8 u8AFTblX[12]; MI_U16 u16AFTblY[13]; } CusAFFilter_t;
成员
名称 | 描述 |
---|---|
bFIRYSatEn | FIR Filter Y阀值控制 |
u16FIRYThd | If bFIRYSatEn = 1 则pixel亮度小于u16FIRYThd时,就会列入fir filter计算中,且回传大于u16FIRYThd的pixel个数(于AF统计值中),数值范围: 0 ~ 1023。 |
bIIRSquareAccEn | IIR Filter 增强控制 |
bFIRSquareAccEn | FIR Filter 增强控制 |
u16IIR1Thd | IIR Filter Output = IIR Filter Output – IIRThd。数值范围: 0 ~ 1023。 |
u16IIR2Thd | IIR Filter Output = IIR Filter Output - IIRThd。数值范围: 0 ~ 1023。 |
u16FIRHThd | FIR Filter Output = FIR Filter Output - FIR Thd。数值范围: 0 ~ 1023。 |
u16FIRVThd | FIR Filter Output = FIR Filter Output - FIR Thd。数值范围: 0 ~ 1023。 |
u8AFTblX[12] | 针对IIR与FIR Filter,做一个non-linear的mapping u8AFTblX为横轴,节点为二的幂次方累加,累加起来需大于1024。数值范围: 0 ~ 15。 |
u16AFTblY[13] | 针对IIR与FIR Filter,做一个non-linear的mapping u8AFTblY为纵轴,数值范围: 0 ~ 8191 |
SquareACC使用时机,针对中高对比度的粗边反差,做放大的动作。且低于Thd的值,会砍为0,用来抗低照下的噪点。
参考设定 (统计值放大效果)
u8AFTblX = 6,7,7,6,6,6,7,6,6,7,6,6
u16AFTblY = 0,1,53,249,431,685,1023,1999,2661,3455,5487,6749,8191
参考设定 (统计值保持原状)
u8AFTblX = 6,7,7,6,6,6,7,6,6,7,6,6
u16AFTblY = 0,64,192,320,384,448,512,640,704,768,896,960,1023
需求
header file:mi_isp_twinkie.h / mi_isp_pretzel.h / mi_isp.h (for Macaron, Pudding)
.so:libmi_isp_twinkie.so / libmi_isp_pretzel.so / libmi_isp.so (for Macaron, Pudding)
备注
Twinkie不支持这支API。
23. MI_ISP 设置AF ROI MODE¶
23.1. MI_ISP_CUSA_SetAFRoiMode¶
目的
设定AF统计值的模式
语法
MI_RET MI_ISP_CUS3A_SetAFRoiMode (U32 nChannel, CusAFRoiMode_t *data);
描述
调用此界面设置AWB统计值来源
参数
参数名称 | 描述 |
---|---|
nChannel | 视讯输入信道号码(一般为0) |
data | AF统计值的模式 |
返回值
返回值 | 描述 |
---|---|
MI_RET_SUCCESS | 成功 |
MI_RET_FAIL | 失败 |
23.2. CusAFRoiMode_t¶
描述
设定AF统计值的模式
定义
typedef enum __attribute__ ((aligned (1))) { AF_ROI_MODE_NORMAL, AF_ROI_MODE_MATRIX } ISP_AF_ROI_MODE_e; typedef struct { ISP_AF_ROI_MODE_e mode; MI_U32 u32_vertical_block_number; } CusAFRoiMode_t;
成员
名称 | 描述 |
---|---|
mode | AF_ROI_MODE_NORMAL: 可切为16组ROI,window size与位置可随意分割,默认为此模式。 AF_ROI_MODE_MATRIX: 可切为16 * N组ROI,window size与位置稍有限制,但可切较多区块。(N= u32_vertical_block_number) |
u32_vertical_block_number | If mode = AF_ROI_MODE_MATRIX 可切为16 * N组ROI。(N= u32_vertical_block_number, 1~16) |
AF_ROI_MODE_NORMAL: AF ROI切割方式
AF_ROI_MODE_MATRIX: AF ROI切割方式
横轴,固定有16个
纵轴,会依据u32_vertical_block_number,来决定有几组16个ROI,上图为u32_vertical_block_number=16,就有 16*16 组ROI
需求
header file:mi_isp_twinkie.h / mi_isp_pretzel.h / mi_isp.h (for Macaron, Pudding)
.so:libmi_isp_twinkie.so / libmi_isp_pretzel.so / libmi_isp.so (for Macaron, Pudding)
备注
Twinkie不支持这支API。
24. MI_ISP 设置AF WINDOW¶
24.1. MI_ISP_CUSA_SetAFWindow¶
目的
设定AF Window
语法
MI_RET MI_ISP_CUS3A_SetAFWindow (U32 nChannel, CusAFWin_t *data);
描述
AF window在AF_Init阶段设置,将CMOS sensor image切成1024*1024坐标格来设置AF window
坐标与实际crop range换算公式:
Image width * X /1024 = 真实X坐标
Image_height * Y/1024 = 真实Y坐标
Ex:
AF window设置为 :
Start_X = 458
End_X = 566
Start_Y = 418
End_Y = 606
则在1920x1080的CMOS sensor下设置的AF window坐标即为:
Real_Start_X = 1920 *458/1024 = 858
Real_End_X = 1920 *566/1024 = 1061
Real_Start_Y = 1080 *418/1024 = 440
Real_End_Y = 1080 *606/1024 = 639
参数
参数名称 | 描述 |
---|---|
nChannel | 视讯输入信道号码(一般为0) |
data | AF Window设置 |
返回值
返回值 | 描述 |
---|---|
MI_RET_SUCCESS | 成功 |
MI_RET_FAIL | 失败 |
24.2. CusAFWin_t¶
typedef struct AF_WINDOW_PARAM_s { MI_U32 u32StartX; /*range : 0~1023*/ MI_U32 u32StartY; /*range : 0~1023*/ MI_U32 u32EndX; /*range : 0~1023*/ MI_U32 u32EndY; /*range : 0~1023*/ } AF_WINDOW_PARAM_t; typedef struct { MI_U8 u8WindowIndex; AF_WINDOW_PARAM_t stParaAPI; } CusAFWin_t;
参数
参数名称 | 描述 |
---|---|
u8WindowIndex | AF ROI Index (0~15), for NORMAL & MARIX mode |
stParaAPI | AF ROI position |
描述
在 AF ROI Mode = AF_ROI_MODE_NORMAL时,StrX, StrY, EndX, EndY就是代表该Window Index的位置
在 AF ROI Mode = AF_ROI_MODE_MATRIX时,StrX, EndX,就是代表横轴window切割的位置,StrY, EndY就是代表纵轴切割的位置
使用限制:
AF ROI Mode = AF_ROI_MODE_NORMAL
-
各自window宽高设置上,可互相重迭
-
h/v end > h/v start
AF ROI Mode = AF_ROI_MODE_MATRIX
-
各自window宽设置上,可互相重迭,但高不可重迭
-
h/v end > h/v start
-
win0_v_start < win0_v_end < win1_v_start < win1_v_end < win2…
-
win(0,0), win(1,0), …, win(15,0) 使用共同的h_start, h_end设定,由af0_h_start, h_end决定
-
win(0,1), win(1,1), …, win(15,1) 使用共同的h_start, h_end设定,由af1_h_start, h_end决定,其他以此推论
-
win(0,0), win(0,1), …, win(0,15) 使用共同的v_start, v_end设定,由af0_v_start, v_end决定
-
win(1,0), win(1,1), …, win(1,15) 使用共同的v_start, v_end设定,由af1_v_start, v_end决定,其他以此推论
需求
header file:mi_isp_twinkie.h / mi_isp_pretzel.h / mi_isp.h (for Macaron, Pudding)
.so:libmi_isp_twinkie.so / libmi_isp_pretzel.so / libmi_isp.so (for Macaron, Pudding)
25. MI_ISP 设置AF YPARAM¶
25.1. MI_ISP_CUSA_SetAFYParam¶
目的
设定AF Y Param
语法
MI_RET MI_ISP_CUS3A_SetAFYParam (U32 nChannel, CusAFYParam_t *data);
描述
AF计算统计值时,会将Bayer data转为Y data,这边提供Bayer转Y时,R/G/B的各自比例的控制。
预设BayerRGB转成Y时,各自比例为 (76, 75, 29),128为1x。当场景为逆光,或较暗时,因为亮度讯号较小,导致AF统计值偏小,反应不出峰值。这时,可将RGB比例提高,相对Y的讯号就变大,使峰值明显一些,例如比例改为 (255, 252, 97),可设定的最大值为255。
参数
参数名称 | 描述 |
---|---|
nChannel | 视讯输入信道号码(一般为0) |
data | AF Window设置 |
返回值
返回值 | 描述 |
---|---|
MI_RET_SUCCESS | 成功 |
MI_RET_FAIL | 失败 |
25.2. CusAFYParam_t¶
typedef struct { MI_U8 r; //0~255 MI_U8 g; //0~255 MI_U8 b; //0~255 } CusAFYParam_t;
参数
参数名称 | 描述 |
---|---|
r | Bayer to Y的r channel比例 (0~255) |
g | Bayer to Y的g channel比例(0~255) |
b | Bayer to Y的b channel比例(0~255) |
需求
header file:mi_isp_twinkie.h / mi_isp_pretzel.h / mi_isp.h (for Macaron, Pudding)
.so:libmi_isp_twinkie.so / libmi_isp_pretzel.so / libmi_isp.so (for Macaron, Pudding)
26. MI_ISP 设置AF SOURCE¶
26.1. MI_ISP_CUSA_SetAFSource¶
目的
选择AF统计值的来源
语法
MI_RET MI_ISP_CUS3A_SetAFSource (U32 nChannel, CusAFSource_e *data);
描述
选择AF统计值的来源。
参数
参数名称 | 描述 |
---|---|
nChannel | 视讯输入信道号码(一般为0) |
data | AF Window设置 |
返回值
返回值 | 描述 |
---|---|
MI_RET_SUCCESS | 成功 |
MI_RET_FAIL | 失败 |
26.2. CusAFSource_e¶
typedef enum { AF_SOURCE_FROM_SE_OBC_BF_HDR = 2, AF_SOURCE_FROM_SE_WBG_BF_HDR = 3, AF_SOURCE_FROM_ALSC_AF_HDR = 4, AF_SOURCE_FROM_WBG_AF_HDR = 5, AF_SOURCE_FROM_LE_OBC_BF_HDR = 6, AF_SOURCE_FROM_LE_WBG_BF_HDR = 7, } CusAFSource_e;
参数
-
HDR模式
参数名称 描述 AF_SOURCE_FROM_SE_OBC_BF_HDR 选择HDR前的短曝结果 (OB后) AF_SOURCE_FROM_SE_WBG_BF_HDR 选择HDR前的短曝结果 (WBGain后) AF_SOURCE_FROM_ALSC_AF_HDR 选择HDR后的结果 (Shading后) AF_SOURCE_FROM_WBG_AF_HDR 选择HDR后的结果 (WBGain后) AF_SOURCE_FROM_LE_OBC_BF_HDR 选择HDR前的长曝结果 (OB后) AF_SOURCE_FROM_LE_WBG_BF_HDR 选择HDR前的长曝结果 (WBGain后) -
线性模式
参数名称 描述 AF_SOURCE_FROM_SE_OBC_BF_HDR 选择OB后的结果 AF_SOURCE_FROM_SE_WBG_BF_HDR 选择WBGain后的结果 AF_SOURCE_FROM_ALSC_AF_HDR 选择CI前的结果 (Shading后) AF_SOURCE_FROM_WBG_AF_HDR 选择CI前的结果 (WBGain后) AF_SOURCE_FROM_LE_OBC_BF_HDR 不支持 AF_SOURCE_FROM_LE_WBG_BF_HDR 不支持
需求
header file:mi_isp_twinkie.h / mi_isp_pretzel.h / mi_isp.h (for Pudding)
.so:libmi_isp_twinkie.so / libmi_isp_pretzel.so / libmi_isp.so (for Pudding)
Macaron不支持
27. GET CUSTA VERSION¶
参考isp_cus3a_if.h
,版号定义如下
-
可藉由查看header file获得版号
-
可藉由CUS3A_GetVersion获得版号
28. TWINKIE/PRETZEL/MACARON/PUDDING差异列表¶
下面描述Twinkie、Pretzel、Macaron与Pudding所支持的功能列表
参数名称 | Twinkie | Pretzel | Macaron |
---|---|---|---|
AE统计值 | 128*90 | 128*90 | 32*32 |
AE hist2 | 支持 | 支持 | 不支持 |
AF统计值 | IIR(34), FIR(34), Luma(34), YSat(24) | IIR(35), FIR(35), Luma(32), YSat(22) | IIR(35), FIR(35), Luma(32), YSat(22) |
MI_ISP_CUS3A_SetAEWindowBlockNumber | 支持 | 支持 | 不支持 |
MI_ISP_CUS3A_SetAEHistogramWindow | 偏移+大小限制: 最大128*90 | 偏移+大小限制: 最大128*90 | 偏移+大小限制: 最大32*32 |
MI_ISP_CUS3A_SetAFFilter | 支持 | 支持 | 支持 |
MI_ISP_CUS3A_SetAFFilterSq | 不支持 | 支持 | 支持 |
MI_ISP_CUS3A_SetAFRoiMode | 不支持 | 支持 | 支持 |
MI_ISP_CUS3A_SetAFSource | 支持 | 支持 | 不支持 |
参数名称 | Pudding | ||
AE统计值 | 32*32 | ||
AE hist2 | 不支持 | ||
AF统计值 | IIR(35), FIR(35), Luma(32), YSat(22) | ||
MI_ISP_CUS3A_SetAEWindowBlockNumber | 不支持 | ||
MI_ISP_CUS3A_SetAEHistogramWindow | 偏移+大小限制: 最大32*32 | ||
MI_ISP_CUS3A_SetAFFilter | 支持,新增Extra参数 | ||
MI_ISP_CUS3A_SetAFFilterSq | 支持 | ||
MI_ISP_CUS3A_SetAFRoiMode | 支持 | ||
MI_ISP_CUS3A_SetAFSource | 支持 |