前言¶
与本文档相对应的产品版本如下。
说明: 本文以SS928V100描述为例,未有特殊说明,SS927V100与SS928V100内容一致。
修订记录累积了每次文档更新的说明。最新版本的文档包含以前所有文档版本的更新内容。
消费类抓拍方案使用指南¶
概述¶
消费类抓拍方案主要面向消费类电子产品中的拍照功能,支持Normal、PRO的抓拍模式,可以抓拍单张或者多张不同曝光时间的照片。消费类抓拍方案也支持HDR、SFNR、MFNR和DE的后处理算法。
抓拍的数据通路分为单pipe和双pipe,每个pipe可以在线,也可以离线,每种数据通路适用的场景都有些差异。
重要概念¶
单pipe模式
拍照和预览使用同一ISP通路。
双pipe模式
拍照和预览使用不同的ISP通路。
PRO(Professional)模式
专业模式拍照,这种模式下ISP会控制sensor曝光,得到多张曝光时间和增益可调的图片。可以用于HDR算法做多张不同曝光的照片合成,也可以用于拍摄固定曝光时间的照片。
ZSL(Zero Shutter Lag)
零延时拍照。可以减少因为快门延迟或其他因素导致的延时,可以拍摄到触发拍照瞬间的图像。
抓拍数据通路¶
VI的pipe工作模式分为离线模式、在线模式,拍照的数据通路建立在VI之上,所以也分这两种模式。
在拍照的场景中,一般视频预览和抓拍的分辨率是不一样的;而且拍照的ISP效果处理要对人脸肤色等做优化处理,也会和视频预览通路的不一样。所以拍照的数据通路又分为单pipe和双pipe两种。
另外消费类电子产品中还有ZSL模式拍照这种特殊场景下的拍照通路。
须知: VI和VPSS之间的在线、离线关系只影响拍照的YUV输出的位置,不影响拍照的控制流,所以下文说的在线和离线,都是指的拍照的那个VI pipe是在线或者离线。
综上,拍照的数据通路就会有很多种,每种数据通路的适用场景不一样,我们推荐客户采用双pipe离线模式的拍照方案,这种方案在功耗控制上是最优的,拍照的耗时也较短。
下面介绍每种数据通路的优缺点。
双pipe离线模式拍照¶
双pipe离线模式拍照的数据通路如图1所示。
图1所标示的分辨率只是示意分辨率,实际分辨率根据客户不同的场景可能会有差异。后面的数据通路中所标示分辨率也是同样的意思。
双pipe离线的数据通路是一个sensor进来的数据,经过VI Dev时序解析后,分别绑定到2个不同的pipe,上面的pipe用于视频预览和录像,下面的pipe用于拍照。视频预览和录像的pipe是离线的;拍照的pipe也是离线的。
预览和录像的分辨率一般比较小,所以经过了BAS,做了Bayer Scale,主要目的是减小上面的pipe处理的分辨率,从而降低功耗。DV产品中预览用的LCD屏分辨率一般都很小,但需要预览通路一直存在。
拍照的分辨率一般都比较大,但用户并不会一直拍照,所以下面的pipe用于拍照,一般是在客户需要拍照时才启动下面的pipe的通路。
Sensor的曝光控制是由上面的视频pipe的ISP来控制的。
用户设置拍照相关的属性和触发拍照接口,用的pipe号都是下面那个拍照用的pipe,内部的数据同步由VI和ISP的驱动来完成。
这种数据通路可以用于NORMAL和PRO模式的拍照。PRO模式是在用户调用ss_mpi_snap_trigger_pipe接口之后才开始控制sensor进行长短曝光的。
双pipe离线时,拍照的pipe在用户调用ss_mpi_snap_trigger_pipe接口时才打开中断做数据处理,并且只处理抓拍的那几帧数据,抓拍完成后可以调用ss_mpi_snap_disable_pipe停止数据处理。这样处理是为了降低拍照那个pipe的功耗。
双pipe离线时,用户拍摄正常曝光的照片,从调用ss_mpi_snap_trigger_pipe接口到VI输出第一张正常YUV数据,理论上的耗时在3帧左右,可以满足大部分客户场景的需求。所以,我们推荐客户采用双pipe离线的数据通路来实现拍照的方案。
单pipe离线模式拍照¶
单pipe离线模式拍照的数据通路如图1所示。
单pipe离线数据通路是视频预览和拍照共用一个pipe。
单pipe离线模式拍照使用的方法是平时只有视频预览时整个通路可以采用比较小的分辨率,只有切换到拍照模式时才将sensor和VI等通路切换到大的拍照分辨率。这样可以节省一定的功耗。
单pipe离线模式拍照应用的场景是当客户的产品有多个sensor同时输入将VI pipe全部占用,无法做到一个sensor输入绑定两个pipe时,就需要用这种模式来拍照。
这种数据通路可以拍摄NORMAL和PRO模式的照片。
当录像和拍照的分辨率一样,客户又不需要对拍照的ISP做特殊的调节时,可以从单pipe的视频流里面取YUV编成jpeg来实现拍照的方案。这种方案并不需要VI和ISP的驱动做额外的事情,所以不需要调拍照相关的MPI接口。
单pipe在线模式拍照¶
单pipe在线模式拍照的数据通路如图1所示。
单pipe在线拍照的数据通路和单pipe离线的类似,区别是数据通路是在线的。这种数据通路可以拍摄NORMAL和PRO模式的照片。
须知: SS928V100的VI模块目前只支持1个pipe在线,如果多于1个sensor输入的场景,所有sensor要离线处理。
ZSL模式拍照¶
ZSL模式的拍照通路和双pipe离线模式的拍照通路一样,区别是VI驱动内部会缓存一个RAW数据的队列。在调用ss_mpi_snap_enable_pipe接口后,VI内部就开始缓存RAW数据,调用ss_mpi_snap_trigger_pipe接口会选择ZSL的拍照帧,然后将拍照的帧送给ISP做处理。
ZSL模式拍照,只支持拍摄NORMAL模式的照片。
功能描述¶
连拍时的帧率控制¶
连拍时可以做帧率控制,是通过ss_mpi_vi_create_pipe或者ss_mpi_vi_set_pipe_attr接口设置的ot_vi_pipe_attr中的帧率控制来实现的。
说明: 以上接口请参考《MPP 媒体处理软件V5.0 开发参考》“视频输入”章节。
API参考¶
该模块提供以下MPI:
ss_mpi_snap_set_pipe_attr:设置拍照属性。
ss_mpi_snap_get_pipe_attr:获取拍照属性。
ss_mpi_snap_enable_pipe:使能拍照的pipe。
ss_mpi_snap_disable_pipe:停止拍照的pipe。
ss_mpi_snap_trigger_pipe:触发抓拍。
ss_mpi_snap_set_pipe_attr¶
【描述】
设置拍照的属性。
【语法】
td_s32 ss_mpi_snap_set_pipe_attr(ot_vi_pipe vi_pipe, const ot_snap_attr *snap_attr);
【参数】
【返回值】
失败,其值为错误码。 |
【解决方案差异】
无。
【需求】
头文件:ot_common_snap.h、ss_mpi_snap.h
库文件:libss_snap.a
【注意】
PIPE必须已创建。
拍照参数必须合法,具体请参见ot_snap_attr。
双pipe离线模式下,若拍照参数设置的重复送帧数不为0,在调用ss_mpi_vpss_get_chn_frame及ss_mpi_vpss_get_grp_frame接口(具体请参考《MPP媒体处理软件V5.0开发参考》“视频处理子系统”章节)从抓拍通路中获取帧时,会获取到重复帧。若将获取到的帧用于编码,VENC模块会自动删除重复帧,但若将获取到的帧用于图像处理,则需要手动删除重复帧。
WDR模式不支持拍照。
ZSL拍照模式下,设置的depth需要大于重复送帧的次数,否则可能因为VI处理不及时缓存队列里面的帧被冲掉而导致丢帧。
在调用ss_mpi_snap_enable_pipe接口之后,再次调用ss_mpi_snap_set_pipe_attr接口时,只能修改成员ot_snap_attr的pro_attr属性,修改其他属性都会报错。
【举例】
无
【相关主题】
ss_mpi_snap_get_pipe_attr¶
【描述】
获取拍照的属性。
【语法】
td_s32 ss_mpi_snap_get_pipe_attr(ot_vi_pipe vi_pipe, ot_snap_attr *snap_attr);
【参数】
|
取值范围:[0, OT_VI_MAX_PHYS_PIPE_NUM)。 |
||
【返回值】
失败,其值为错误码。 |
【解决方案差异】
无。
【需求】
头文件:ot_common_snap.h、ss_mpi_snap.h
库文件:libss_snap.a
【注意】
PIPE必须已创建。
snap属性已设置。
【举例】
无
【相关主题】
ss_mpi_snap_enable_pipe¶
【描述】
使能拍照的pipe。
【语法】
td_s32 ss_mpi_snap_enable_pipe(ot_vi_pipe vi_pipe);
【参数】
|
取值范围:[0, OT_VI_MAX_PHYS_PIPE_NUM)。 |
【返回值】
失败,其值为错误码。 |
【解决方案差异】
无。
【需求】
头文件:ot_common_snap.h、ss_mpi_snap.h
库文件:libss_snap.a
【注意】
PIPE必须已创建。
拍照的属性必须已经设置。
此接口不支持单PIPE拍照场景,调用ss_mpi_vi_start_pipe之后直接使用ss_mpi_snap_trigger_pipe接口即可拍照。
双pipe拍照场景,使能拍照PIPE只能调用ss_mpi_snap_enable_pipe,而不能调用ss_mpi_vi_start_pipe接口,ss_mpi_vi_start_pipe的详细功能描述,请参考《MPP 媒体处理软件V5.0 开发参考》中“视频输入”章节的说明。
不支持重复使能拍照的PIPE。
双PIPE拍照时,ss_mpi_snap_enable_pipe和ss_mpi_snap_trigger_pipe两个接口的调用间隔要大于2帧的曝光时间,才能使拍照的ISP处理效果正常。
PRO模式拍照时,ss_mpi_snap_disable_pipe和ss_mpi_snap_enable_pipe两个接口的调用间隔要大于4帧,即两次拍照的间隔,在低帧率下间隔过小,第二次拍照的帧可能不是期望的曝光帧。
【举例】
无
【相关主题】
ss_mpi_snap_disable_pipe¶
【描述】
停止拍照的pipe,也可以用于中断正在拍照的数据流。
【语法】
td_s32 ss_mpi_snap_disable_pipe(ot_vi_pipe vi_pipe);
【参数】
|
取值范围:[0, OT_VI_MAX_PHYS_PIPE_NUM)。 |
【返回值】
失败,其值为错误码。 |
【解决方案差异】
无。
【需求】
头文件:ot_common_snap.h、ss_mpi_snap.h
库文件:libss_snap.a
【注意】
PIPE必须已创建。
单pipe拍照场景,不支持此接口。
抓拍场景需保证VI通路有帧数据,否则会出现抓拍数据流内部死等帧数据,造成退出抓拍时异常卡住。
【举例】
无
【相关主题】
ss_mpi_snap_trigger_pipe¶
【描述】
触发拍照。
【语法】
td_s32 ss_mpi_snap_trigger_pipe(ot_vi_pipe vi_pipe);
【参数】
|
取值范围:[0, OT_VI_MAX_PHYS_PIPE_NUM)。 |
【返回值】
失败,其值为错误码。 |
【解决方案差异】
无。
【需求】
头文件:ot_common_snap.h、ss_mpi_snap.h
库文件:libss_snap.a
【注意】
PIPE必须已创建。
拍照 PIPE必须已使能,单pipe模式下拍照的属性必须已经设置。
正在拍照过程中,不能再次触发拍照。
双pipe Pro模式拍照时,由于调节曝光会导致视频通路拍照过程中有几帧闪烁,可参考《MPP 媒体处理软件 V5.0 开发参考》“视频输入”章节 ss_mpi_vi_get_pipe_param设置抓拍时丢弃曝光帧,减弱闪烁效果。
【举例】
无
【相关主题】
数据类型¶
拍照相关数据类型定义如下:
ot_snap_attr:定义拍照参数的结构体。
ot_snap_type:定义拍照类型的枚举。
ot_snap_norm_attr:定义Normal类型拍照参数的结构体。
ot_snap_pro_attr:定义PRO类型拍照参数的结构体。
ot_snap_pro_param:定义PRO类型ISP相关参数结构体。
ot_snap_pro_auto_param:定义PRO类型ISP自动模式参数结构体。
ot_snap_pro_manual_param:定义PRO类型ISP手动模式参数结构体。
ot_snap_attr¶
【说明】
定义拍照参数的结构体。
【定义】
typedef struct {
ot_snap_type snap_type;
td_bool load_ccm_en;
union {
ot_snap_norm_attr norm_attr;
ot_snap_pro_attr pro_attr;
};
} ot_snap_attr;
【成员】
|
|
【注意事项】
无
【相关数据类型及接口】
ot_snap_type¶
【说明】
定义拍照类型的枚举。
【定义】
typedef enum {
OT_SNAP_TYPE_NORM,
OT_SNAP_TYPE_PRO,
OT_SNAP_TYPE_BUTT
} ot_snap_type;
【成员】
【注意事项】
无
【相关数据类型及接口】
ot_snap_norm_attr¶
【说明】
定义Normal类型拍照参数的结构体。
【定义】
typedef struct {
td_u32 frame_cnt;
td_u32 repeat_send_times;
td_bool zsl_en;
td_u32 frame_depth;
td_u32 rollback_ms;
td_u32 interval;
} ot_snap_norm_attr;
【成员】
【注意事项】
无
【相关数据类型及接口】
ot_snap_pro_attr¶
【说明】
定义PRO类型拍照参数的结构体。
【定义】
typedef struct {
td_u32 frame_cnt;
td_u32 repeat_send_times;
ot_snap_pro_param pro_param;
} ot_snap_pro_attr;
【成员】
重复送首帧RAW的张数。当VI的pipe离线时,ISP里面的某些算法需要将拍照的首帧RAW重复送多次,用于生成参考信息。 |
|
【注意事项】
无
【相关数据类型及接口】
ot_snap_pro_param¶
【说明】
定义PRO类型中ISP参数的结构体。
【定义】
typedef struct {
ot_op_mode op_mode;
ot_snap_pro_auto_param auto_param;
ot_snap_pro_manual_param manual_param;
} ot_snap_pro_param;
【成员】
【注意事项】
无
【相关数据类型及接口】
ot_snap_pro_auto_param¶
【说明】
定义PRO类型ISP自动模式参数结构体。
【定义】
typedef struct {
td_u16 exp_step[OT_ISP_PRO_MAX_FRAME_NUM];
} ot_snap_pro_auto_param;
【成员】
|
取值范围:[0, 0xFFFF],与曝光时间的计算公式见注意事项。 曝光时间范围上限与sensor相关,如果按照设置值计算后的曝光时间超过sensor的范围上限,则按照sensor的上限生效。 |
【注意事项】
exp_step是以当前预览通道的曝光量为基准,增益保持不变,根据曝光等级调整曝光时间。
ExpTime_i = ExpTime_base* exp_step[i]/256
ExpTime_base代表基准曝光时间,ExpTime_i代表专业拍照第i帧的曝光时间。
当ExpTime_i大于当前设置的最大曝光时间时,ISP会自动进入慢快门模式,使曝光时间等于ExpTime_i;
当ExpTime_i小于设置的最小曝光时间时,实际曝光时间等于设置的最小曝光时间。
当前预览通路的基准曝光量是指AE在自动模式下的曝光量,不支持手动AE设置基准曝光量。
【相关数据类型及接口】
ot_snap_pro_manual_param¶
【说明】
定义PRO类型ISP手动模式参数结构体。
【定义】
typedef struct {
td_u32 exp_time[OT_ISP_PRO_MAX_FRAME_NUM];
td_u32 sys_gain[OT_ISP_PRO_MAX_FRAME_NUM];
} ot_snap_pro_manual_param;
【成员】
|
取值范围:[0, 0xFFFFFFFF],范围上限与sensor相关,如果设置值超过sensor的范围上限,则按照sensor的上限生效。 |
|
|
取值范围:[0x400, 0xFFFFFFFF],范围上限与sensor相关,如果设置值超过sensor的范围上限,则按照sensor的上限生效。 |
【注意事项】
无
【相关数据类型及接口】
错误码¶
SNAP模块API错误码如下所示。
表 1 SNAP模块API错误码
拍照后处理算法¶
概述¶
PHOTO代表消费类抓拍方案中的拍照后处理算法,包括HDR、MFNR、SFNR、DE这几种。
拍照后,运行于CPU和DSP上的软件处理算法。
重要概念¶
HDR(High Dynamic Range)
HDR图像后处理算法,能提升图像的动态范围;通过拍照的PRO模式拍照,得到多张曝光时间和增益可调的图片,然后经过HDR算法模块合成一张具有高动态范围的图像,相比普通的图像,HDR可以提供更多的动态范围和图像细节。
SFNR(Single frame noise reduction)
单帧降噪。
MFNR(Multi-frame noise reduction)
多帧降噪。
DE(Detail enhancement)
细节增强。ISP中的BNR处理,会造成图像中一些细节信息的丢失,DE算法可以补偿这些丢失的图像细节信息。DE算法的输入是一张YUV和BNR写出的RAW,输出是一张细节增强过的YUV。
功能描述¶
PHOTO模块的运行依赖DSP的资源,PHOTO的库默认编译到DSP0的镜像中,所以在调用PHOTO的接口之前,请确保已经调用了ss_mpi_svp_dsp_load_bin接口加载了DSP0的镜像。(ss_mpi_svp_dsp_load_bin的具体描述,请参考《SVP2.0 API 参考》)
HDR合成当前仅支持三合一,就是输入三帧不同曝光的连续YUV,输出一帧高动态范围的YUV。三帧的输入顺序依次是短曝光的YUV,正常曝光的YUV,长曝光的YUV。
HDR算法支持对人脸区域的图像效果做特殊优化处理。图像中的人脸区域坐标需要提前通过人脸检测的智能算法检测出来。
MFNR当前仅支持四合一,输入是四帧连续的正常曝光的YUV,输出是一帧经过时域和空域降噪的YUV。
DE算法需要BNR RAW数据,SS928V100暂不支持获取BNR RAW数据
MFNR算法做完后,可以再对输出后的YUV做一次DE算法处理。DE算法需要的BNR RAW数据可以是MFNR输入的四帧YUV里面任意一帧YUV对应的BNR RAW;SS928V100暂不支持获取BNR RAW数据,因此不支持MFNR+DE的算法处理。
算法处理输入和输出帧数据的Stride必须是128Byte对齐,并且帧数据的像素宽高必须是8的倍数。
算法处理的输入YUV数据,仅支持处理NV21格式(也就是OT_PIXEL_FORMAT_YVU_SEMIPLANAR_420格式)的非压缩数据,输入图像的动态范围仅支持OT_DYNAMIC_RANGE_SDR8的。
拍照后处理是一个原子任务,该原子任务包含完整的init->process->deinit流程(不同算法需要调用的process次数可能不同),仅支持在同一个进程或线程中以原子任务为单位串行处理,不支持多个原子任务并行处理,不支持前一个原子任务未结束就启动下一个原子任务。
PHOTO中算法运行依赖DSP,由于当前DSP使用32bit地址总线,只能访问4GB的内存地址空间。所以,PHOTO算法使用的Public内存,输入、输出帧存都必须位于4GB的内存地址空间中。详细的地址范围限制说明请参考《SVP2.0 开发指南》。
API参考¶
该模块提供以下MPI:
ss_mpi_photo_alg_init:初始化某个PHOTO算法。
ss_mpi_photo_alg_deinit:去初始化某个PHOTO算法。
ss_mpi_photo_alg_process:启动某个PHOTO算法的处理。
ss_mpi_photo_set_alg_coef:设置某个PHOTO算法的图像效果调节系数。
ss_mpi_photo_get_alg_coef:获取某个PHOTO算法的图像效果调节系数。
ss_mpi_photo_alg_init¶
【描述】
初始化某个PHOTO算法。
【语法】
td_s32 ss_mpi_photo_alg_init(ot_photo_alg_type alg_type, const ot_photo_alg_init *photo_init);
【参数】
【返回值】
失败,其值为错误码。 |
【解决方案差异】
无。
【需求】
头文件:ot_common_photo.h、ss_mpi_photo.h
库文件:libss_photo.a
【注意】
调用该接口之前需要确保DSP端的bin文件已经加载成功。
该接口传入的内存是已经从MMZ中分配好的。
不同算法,不同分辨率需要的Public内存大小不同,建议使用ot_common_photo.h中定义的hdr_get_public_mem_size,mfnr_get_public_mem_size,sfnr_get_public_mem_size,de_get_public_mem_size这几个函数来获取不同分辨率对应的算法Public内存大小。
【举例】
无
【相关主题】
ss_mpi_photo_alg_deinit¶
【描述】
去初始化某个PHOTO算法。
【语法】
td_s32 ss_mpi_photo_alg_deinit(ot_photo_alg_type alg_type);
【参数】
【返回值】
失败,其值为错误码。 |
【解决方案差异】
无
【需求】
头文件:ot_common_photo.h、ss_mpi_photo.h
库文件:libss_photo.a
【注意】
无
【举例】
无
【相关主题】
ss_mpi_photo_alg_process¶
【描述】
启动某个PHOTO算法的处理。这个接口是阻塞接口,当前帧处理完成之后才返回。
多帧合成的算法需要调用多次,比如HDR三合一需要调用三次这个接口,每次传一帧输入的帧数据信息,调用后当前帧就开始处理。
【语法】
td_s32 ss_mpi_photo_alg_process(ot_photo_alg_type alg_type, const ot_photo_alg_attr *photo_attr);
【参数】
【返回值】
失败,其值为错误码。 |
【解决方案差异】
无。
【需求】
头文件:ot_common_photo.h、ss_mpi_photo.h
库文件:libss_photo.a
【注意】
对应算法必须初始化成功后,才能调用该接口。
【举例】
无
【相关主题】
ss_mpi_photo_set_alg_coef¶
【描述】
设置某个PHOTO算法的图像效果调节系数。
这个接口不是必设的接口,PHOTO内部保存了一套默认的系数,如果不设置,就使用默认的值。
【语法】
td_s32 ss_mpi_photo_set_alg_coef(ot_photo_alg_type alg_type, const ot_photo_alg_coef *alg_coef);
【参数】
【返回值】
失败,其值为错误码。 |
【解决方案差异】
无。
【需求】
头文件:ot_common_photo.h、ss_mpi_photo.h
库文件:libss_photo.a
【注意】
该接口可在算法处理第一帧之前,初始化之后调用。
【举例】
无
【相关主题】
ss_mpi_photo_get_alg_coef¶
【描述】
获取某个PHOTO算法的图像效果调节系数。
【语法】
td_s32 ss_mpi_photo_get_alg_coef(ot_photo_alg_type alg_type, ot_photo_alg_coef *alg_coef);
【参数】
【返回值】
失败,其值为错误码。 |
【解决方案差异】
无。
【需求】
头文件:ot_common_photo.h、ss_mpi_photo.h
库文件:libss_photo.a
【注意】
无
【举例】
无
【相关主题】
数据类型¶
PHOTO相关数据类型定义如下:
ot_photo_alg_type:定义PHOTO算法类型的枚举。
ot_photo_alg_init:定义PHOTO算法初始化的结构体。
ot_photo_alg_attr:定义PHOTO算法处理的属性结构体。
ot_photo_hdr_attr:定义HDR算法处理的结构体。
ot_photo_sfnr_attr:定义SFNR算法处理的结构体。
ot_photo_mfnr_attr:定义MFNR算法处理的结构体。
ot_photo_de_attr:定义DE算法处理的结构体。
ot_photo_face_info:定义人脸区域信息的结构体。
ot_photo_alg_coef:定义PHOTO算法系数的结构体。
ot_photo_hdr_coef:定义HDR算法系数的结构体。
ot_photo_image_fusion_param:定义图像融合参数的结构体。
ot_photo_dark_motion_detection_param:定义HDR中鬼影检测参数的结构体。
ot_photo_sfnr_coef:定义SFNR算法系数的结构体。
ot_photo_sfnr_iso_strategy:定义SFNR算法ISO策略的结构体。
ot_photo_mfnr_coef:定义MFNR算法系数的结构体。
ot_photo_mfnr_3dnr_param:定义MFNR算法中时域降噪系数的结构体。
ot_photo_mfnr_3dnr_iso_strategy:定义MFNR算法时域降噪系数中每个ISO档位的结构体。
ot_photo_mfnr_2dnr_param:定义MFNR算法中空域降噪系数的结构体。
ot_photo_mfnr_2dnr_iso_strategy:定义MFNR算法空域降噪系数中每个ISO档位的结构体。
ot_photo_de_coef:定义DE算法系数的结构体。
ot_photo_de_iso_strategy:定义DE算法每个ISO档位对应策略的结构体。
OT_PHOTO_HDR_FRAME_NUM:定义HDR合成的帧数目。
OT_PHOTO_MFNR_FRAME_NUM:定义MFNR合成的帧数目。
OT_PHOTO_HDR_ISO_LEVEL_CNT:定义调节HDR图像效果的ISO档位数目。
OT_PHOTO_SFNR_ISO_LEVEL_CNT:定义调节SFNR图像效果的ISO档位数目。
OT_PHOTO_MFNR_ISO_LEVEL_CNT:定义调节MFNR图像效果的ISO档位数目。
OT_PHOTO_DE_ISO_LEVEL_CNT:定义调节DE图像效果的ISO档位数目。
OT_PHOTO_MAX_FACE_NUM:定义算法处理中最大的人脸区域的数目。
OT_PHOTO_MIN_WIDTH:定义算法处理支持的最小图像分辨率的宽。
OT_PHOTO_MIN_HEIGHT:定义算法处理支持的最小图像分辨率的高。
OT_PHOTO_MAX_WIDTH:定义算法处理支持的最大图像分辨率的宽。
OT_PHOTO_MAX_HEIGHT:定义算法处理支持的最大图像分辨率的高。
ot_photo_alg_type¶
【说明】
定义PHOTO算法类型的枚举。
【定义】
typedef enum {
OT_PHOTO_ALG_TYPE_HDR = 0x0,
OT_PHOTO_ALG_TYPE_SFNR = 0x1,
OT_PHOTO_ALG_TYPE_MFNR = 0x2,
OT_PHOTO_ALG_TYPE_DE = 0x3,
OT_PHOTO_ALG_TYPE_BUTT
} ot_photo_alg_type;
【成员】
【注意事项】
无
【相关数据类型及接口】
ot_photo_alg_init¶
【说明】
定义PHOTO算法初始化的结构体。
【定义】
typedef struct {
td_u64 public_mem_phy_addr;
td_u64 public_mem_vir_addr;
td_u32 public_mem_size;
td_bool print_debug_info;
} ot_photo_alg_init;
【成员】
【注意事项】
无
【相关数据类型及接口】
ot_photo_alg_attr¶
【说明】
定义PHOTO算法处理的属性结构体。
typedef struct {
union {
ot_photo_hdr_attr hdr_attr;
ot_photo_sfnr_attr sfnr_attr;
ot_photo_mfnr_attr mfnr_attr;
ot_photo_de_attr de_attr;
};
} ot_photo_alg_attr;
【成员】
【注意事项】
无
【相关数据类型及接口】
ot_photo_hdr_attr¶
【说明】
定义HDR算法处理的结构体。
【定义】
typedef struct {
ot_video_frame_info src_frm;
ot_video_frame_info des_frm;
td_u32 frm_index;
td_u32 iso;
td_u32 face_num;
ot_photo_face_info face_info[OT_PHOTO_MAX_FACE_NUM];
} ot_photo_hdr_attr;
【成员】
【注意事项】
无
【相关数据类型及接口】
ot_photo_sfnr_attr¶
【说明】
定义SFNR算法处理的结构体。
【定义】
typedef struct {
ot_video_frame_info frm; /* src & des */
td_u32 iso;
} ot_photo_sfnr_attr;
【成员】
【注意事项】
无
【相关数据类型及接口】
ot_photo_mfnr_attr¶
【说明】
定义MFNR算法处理的结构体。
【定义】
typedef struct {
ot_video_frame_info src_frm;
ot_video_frame_info des_frm;
ot_video_frame_info raw_frm;
td_u32 frm_index;
td_u32 iso;
} ot_photo_mfnr_attr;
【成员】
如果MFNR处理之后不需要做DE算法,那么该结构体不需要赋值。 如果MFNR处理之后需要做DE算法,那么该结构体为DE算法需要的RAW数据的结构体。 MFNR的四帧处理中,只使用了frm_index为0的那帧对应的RAW数据,其余三帧传入的RAW数据结构体需要保持和frm_index为0的那帧RAW数据一致。 |
|
【注意事项】
无
【相关数据类型及接口】
ot_photo_de_attr¶
【说明】
定义DE算法处理的结构体。
【定义】
typedef struct {
ot_video_frame_info frm; /* src & des */
ot_video_frame_info raw_frm;
td_u32 iso;
} ot_photo_de_attr;
【成员】
【注意事项】
无
【相关数据类型及接口】
ot_photo_face_info¶
【说明】
定义人脸区域信息的结构体。
【定义】
typedef struct {
td_u32 id;
ot_rect face_rect;
ot_rect left_eye_rect;
ot_rect right_eye_rect;
td_u32 blink_score;
td_u32 smile_score;
} ot_photo_face_info;
【成员】
【注意事项】
无
【相关数据类型及接口】
ot_photo_alg_coef¶
【说明】
定义PHOTO算法系数的结构体。
【定义】
typedef struct {
union {
ot_photo_hdr_coef hdr_coef;
ot_photo_sfnr_coef sfnr_coef;
ot_photo_mfnr_coef mfnr_coef;
ot_photo_de_coef de_coef;
};
} ot_photo_alg_coef;
【成员】
【注意事项】
无
【相关数据类型及接口】
ot_photo_hdr_coef¶
【说明】
定义HDR算法系数的结构体。
【定义】
typedef struct {
td_s32 ajust_ratio;
td_s32 image_scale_method;
ot_photo_dark_motion_detection_param motion_detection_param[OT_PHOTO_HDR_ISO_LEVEL_CNT];
ot_photo_image_fusion_param hdr_image_fusion_param[OT_PHOTO_HDR_ISO_LEVEL_CNT];
} ot_photo_hdr_coef;
【成员】
【注意事项】
无
【相关数据类型及接口】
ot_photo_image_fusion_param¶
【说明】
定义图像融合参数的结构体。
【定义】
typedef struct {
td_s32 iso_speed;
td_s32 pyramid_top_size;
td_s32 weight_curve_method;
td_s32 weight_calc_method;
td_s32 blend_uv_gain;
td_s32 detail_enhance_ratio_l0;
td_s32 detail_enhance_ratio_l1;
td_float blend_sigma;
ot_photo_hdr_fusion_mode fusion_mode;
} ot_photo_image_fusion_param;
【成员】
【注意事项】
无
【调试建议】
融合模式(weight_curve_method, weight_calc_method)
当融合模式为(weight_curve_method = 0, weight_calc_method = 0) 选择公用曲线,短帧,中帧,长帧分别以公用曲线算对应融合权重。
当融合模式为(weight_curve_method = 0, weight_calc_method = 1) 选择公用曲线,只用中帧算对应权重,相当于短帧,中帧,长帧的平均,短帧,中帧,长帧权重都一样。注意:当blend_sigma值非常小时(如小于0.1时),融合权重会以中帧为主。
当融合模式为(weight_curve_method = 1, weight_calc_method = 0) 选择各自曲线,短帧选择high曲线,中帧选择mid曲线,长帧选择dark曲线得到融合权重。
当融合模式为(weight_curve_method = 1, weight_calc_method = 1) 选择各自曲线,只用中帧计算融合权重,中帧选择high曲线作为短帧权重,中帧选择mid曲线作为中帧权重,中帧选择dark曲线作为长帧权重。
【相关数据类型及接口】
ot_photo_dark_motion_detection_param¶
【说明】
定义HDR中鬼影检测参数的结构体。
【定义】
typedef struct {
td_s32 iso_speed;
td_s32 motion_low_gray;
td_s32 motion_high_gray;
td_float motion_ratio;
td_s32 night_average_luma;
} ot_photo_dark_motion_detection_param;
【成员】
【注意事项】
无
【相关数据类型及接口】
ot_photo_sfnr_coef¶
【说明】
定义SFNR算法系数的结构体。
【定义】
typedef struct {
ot_photo_sfnr_iso_strategy ast_iso_strat[OT_PHOTO_SFNR_ISO_LEVEL_CNT];
} ot_photo_sfnr_coef;
【成员】
【注意事项】
无
【相关数据类型及接口】
ot_photo_sfnr_iso_strategy¶
【说明】
定义SFNR算法ISO策略的结构体。
【定义】
typedef struct {
td_s32 iso_value;
td_s32 luma;
td_s32 chroma;
td_s32 luma_hf;
td_s32 chroma_hf;
} ot_photo_sfnr_iso_strategy;
【成员】
【注意事项】
无
【相关数据类型及接口】
ot_photo_mfnr_coef¶
【说明】
定义MFNR算法系数的结构体。
【定义】
typedef struct {
td_bool image_scale;
ot_photo_mfnr_3dnr_param mfnr_3dnr;
ot_photo_mfnr_2dnr_param mfnr_2dnr;
td_bool de_enable;
ot_photo_de_coef mfnr_de_coef;
} ot_photo_mfnr_coef;
【成员】
【注意事项】
无
【相关数据类型及接口】
ot_photo_mfnr_3dnr_param¶
【说明】
定义MFNR算法中时域降噪系数的结构体。
【定义】
typedef struct {
ot_photo_mfnr_3dnr_iso_strategy iso_3dnr_param[OT_PHOTO_MFNR_ISO_LEVEL_CNT];
} ot_photo_mfnr_3dnr_param;
【成员】
【注意事项】
无
【相关数据类型及接口】
ot_photo_mfnr_3dnr_iso_strategy¶
【说明】
定义MFNR算法时域降噪系数中每个ISO档位的结构体。
【定义】
typedef struct {
td_s32 iso_value;
td_s32 stnr;
td_s32 tnr_frm_num;
td_s32 stnr_dark_less;
td_s32 stnr_ghost_less;
td_s32 luma_alpha;
td_s32 luma_delta;
td_s32 chroma_alpha;
td_s32 chroma_delta;
} ot_photo_mfnr_3dnr_iso_strategy;
【成员】
【注意事项】
无
【相关数据类型及接口】
ot_photo_mfnr_2dnr_param¶
【说明】
定义MFNR算法中空域降噪系数的结构体。
【定义】
typedef struct {
ot_photo_mfnr_2dnr_iso_strategy iso_2dnr_param[OT_PHOTO_MFNR_ISO_LEVEL_CNT];
} ot_photo_mfnr_2dnr_param;
【成员】
【注意事项】
无
【相关数据类型及接口】
ot_photo_mfnr_2dnr_iso_strategy¶
【说明】
定义MFNR算法空域降噪系数中每个ISO档位的结构体。
【定义】
typedef struct {
td_s32 iso_value;
td_s32 luma;
td_s32 chroma;
td_s32 luma_hf2;
td_s32 detail_min;
} ot_photo_mfnr_2dnr_iso_strategy;
【成员】
【注意事项】
无
【相关数据类型及接口】
ot_photo_de_coef¶
【说明】
定义DE算法系数的结构体。
【定义】
typedef struct {
ot_photo_de_iso_strategy de_iso_strat[OT_PHOTO_DE_ISO_LEVEL_CNT];
} ot_photo_de_coef;
【成员】
【注意事项】
无
【相关数据类型及接口】
ot_photo_de_iso_strategy¶
【说明】
定义DE算法每个ISO档位对应策略的结构体。
【定义】
typedef struct {
td_s32 iso_value;
td_s32 global_gain;
td_s32 gain_lf;
td_s32 gain_hf_pos;
td_s32 gain_hf_neg;
td_s32 luma_scale_x0;
td_s32 luma_scale_x1;
td_s32 luma_scale_y1;
td_s32 satu_gain_x0;
td_s32 satu_gain_x1;
td_s32 satu_gain_y1;
} ot_photo_de_iso_strategy;
【成员】
【注意事项】
无
【相关数据类型及接口】
ot_photo_hdr_fusion_mode¶
【说明】
定义HDR融合模式。
【定义】
typedef enum {
OT_PHOTO_HDR_FUSION_AUTO = 0,
OT_PHOTO_HDR_FUSION_SHORT_MEDIAN = 1,
OT_PHOTO_HDR_FUSION_MEDIAN_LONG = 2,
OT_PHOTO_HDR_FUSION_ALL = 3,
OT_PHOTO_HDR_FUSION_BUTT
} ot_photo_hdr_fusion_mode;
【成员】
【注意事项】
当自动模式选择不做融合,直接输出中帧时,如果暗区亮度不足时,可以选择使用OT_PHOTO_HDR_FUSION_MEDIAN_LONG,OT_PHOTO_HDR_FUSION_ALL模式提高暗区亮度。
当自动模式选择不做融合,直接输出中帧时,如果亮区过亮时,可以选择使用OT_PHOTO_HDR_FUSION_SHORT_MEDIAN模式压制亮区亮度。
具体融合权重参考weight_curve_method, weight_calc_method参数的调试建议。
【相关数据类型及接口】
OT_PHOTO_HDR_FRAME_NUM¶
【说明】
定义HDR合成的帧数目。
【定义】
#define OT_PHOTO_HDR_FRAME_NUM 3
【注意事项】
无。
【相关数据类型及接口】
无。
OT_PHOTO_MFNR_FRAME_NUM¶
【说明】
定义MFNR合成的帧数目。
【定义】
#define OT_PHOTO_MFNR_FRAME_NUM 4
【注意事项】
无。
【相关数据类型及接口】
无。
OT_PHOTO_HDR_ISO_LEVEL_CNT¶
【说明】
定义调节HDR图像效果的ISO档位数目。
【定义】
#define OT_PHOTO_HDR_ISO_LEVEL_CNT 10
【注意事项】
无。
【相关数据类型及接口】
无。
OT_PHOTO_SFNR_ISO_LEVEL_CNT¶
【说明】
定义调节SFNR图像效果的ISO档位数目。
【定义】
#define OT_PHOTO_SFNR_ISO_LEVEL_CNT 8
【注意事项】
无。
【相关数据类型及接口】
无。
OT_PHOTO_MFNR_ISO_LEVEL_CNT¶
【说明】
定义调节MFNR图像效果的ISO档位数目。
【定义】
#define OT_PHOTO_MFNR_ISO_LEVEL_CNT 8
【注意事项】
无。
【相关数据类型及接口】
无。
OT_PHOTO_DE_ISO_LEVEL_CNT¶
【说明】
定义调节DE图像效果的ISO档位数目。
【定义】
#define OT_PHOTO_DE_ISO_LEVEL_CNT 8
【注意事项】
无。
【相关数据类型及接口】
无。
OT_PHOTO_MAX_FACE_NUM¶
【说明】
定义算法处理中最大的人脸区域的数目。
【定义】
#define OT_PHOTO_MAX_FACE_NUM 10
【注意事项】
无。
【相关数据类型及接口】
无。
OT_PHOTO_MIN_WIDTH¶
【说明】
定义算法处理支持的最小图像分辨率的宽。
【定义】
#define OT_PHOTO_MIN_WIDTH 1280
【注意事项】
无。
【相关数据类型及接口】
无。
OT_PHOTO_MIN_HEIGHT¶
【说明】
定义算法处理支持的最小图像分辨率的高。
【定义】
#define OT_PHOTO_MIN_HEIGHT 720
【注意事项】
无。
【相关数据类型及接口】
无。
OT_PHOTO_MAX_WIDTH¶
【说明】
定义算法处理支持的最大图像分辨率的宽。
【定义】
#define OT_PHOTO_MAX_WIDTH 8192
【注意事项】
无。
【相关数据类型及接口】
无。
OT_PHOTO_MAX_HEIGHT¶
【说明】
定义算法处理支持的最大图像分辨率的高。
【定义】
#define OT_PHOTO_MAX_HEIGHT 6144
【注意事项】
HDR算法的最大图像分辨率的高由OT_PHOTO_HDR_MAX_HEIGHT定义。
【相关数据类型及接口】
无。
OT_PHOTO_HDR_MAX_HEIGHT¶
【说明】
定义HDR算法处理支持的最大图像分辨率的高。
【定义】
#define OT_PHOTO_HDR_MAX_HEIGHT 8192
【注意事项】
无。
【相关数据类型及接口】
无。
错误码¶
PHOTO模块API错误码如下所示。
表 1 PHOTO模块API错误码
视频采集类抓拍方案使用指南¶
概述¶
视频采集类抓拍方案主要是面向视频采集产品中的电子警察、卡口视频采集等场景下的抓拍解决方案。视频采集类抓拍方案和消费类抓拍的显著区别是客户的定制化程度较高,与外设的交互也很多。
数据通路¶
视频采集类抓拍机的产品形态较多,典型的数据通路如图1所示。
视频采集类抓拍机需要控制外部设备爆闪灯和频闪灯,同时需要接收交通信号灯信号、抓拍触发信号等。sensor的时序控制和AE调节需要和交通信号灯保持同步,因此需要使用客户自定义的ISP 3A算法。
实时性要求较高的场景,一般是由客户实现的FPGA来完成sensor时序的控制,爆闪灯和频闪灯的控制等。抓拍帧的标记也是由FPGA来完成,一般是在sensor输入的有效数据后额外增加几行有效数据,在里面标识是否是抓拍帧,以及其他一些客户需要的自定义信息。
从Pipe0-FE采集的RAW数据需要识别抓拍帧,同时送给不同的Pipe做后续处理。在送BE做处理之前,需要客户自己将RAW数据中额外增加的那几行自定义信息裁剪掉,防止对BE处理的图像效果有影响。当前VI Pipe要求FE写出的宽高和BE处理的宽高必须一致,所以Pipe0那一路FE写出的RAW经过裁剪后无法再送到Pipe0那一路的BE做处理,可以再起一个新的Pipe来替代Pipe0-BE。
抓拍帧的处理和视频帧不同,视频帧的ISP图像效果参数配置可以参考前一帧的统计信息计算当前帧的配置。但是抓拍帧只有一帧,没用参考帧,因此需要将抓拍帧的RAW送到Pipe2-BE两次,第一次用于生成抓拍帧的统计信息,然后根据统计信息计算出ISP的参数配置信息,再用正确的参数配置信息和抓拍帧RAW数据再做一次BE的处理,才能生成正确的抓拍帧YUV数据。
ISP算法的运行一般是由每帧的帧起始中断来驱动,但是在抓拍机的场景中都是离线送RAW数据给BE做处理的,并不适合用帧起始中断,因此需要用户程序来驱动ISP运行。在每次送RAW数据给BE做处理之前,需要调用ss_mpi_isp_run_once生成当前帧需要的寄存器配置信息,替代ss_mpi_isp_run函数做的处理。
ss_mpi_isp_run_once会获取ISP处理完上一帧图像时生成的统计信息,因此,需要保证上一帧图像已经处理完成,才调用ss_mpi_isp_run_once,否则获取ISP统计信息是旧的,可能导致图像效果不符合预期。如何保证?我们可以调用ss_mpi_vi_get_chn_frame(VPSS离线)或者ss_mpi_vpss_get_chn_frame(VPSS在线)接口获取通道数据成功来保证上一帧已经处理完成。
程序调用流程¶
程序调用流程请参考mpp/sample/ traffic_capture中的代码实现。
程序中用到的接口请参考《ISP 开发参考》和《MPP 媒体处理软件V5.0 开发参考》。





