https://blog.csdn.net/zhi11235813/article/details/78801528
ISP(Image Signal Processor)流程概述
对前端图像传感器输出的信号做后期处理,
依赖于ISP才能在不同的光学条件下都能较好的还原现场细节。
实现代码
海思mpp_sample_venc流程中
SAMPLE_VENC_1080P_CLASSIC
{
step 1: init sys variable
step 2: mpp system init. -------SAMPLE_COMM_SYS_Init
step 3: start vi dev & chn to capture---SAMPLE_COMM_VI_StartVi
↓分支线程SAMPLE_COMM_VI_StartIspAndVi ↓
{
step 1: mipi configure
step 2: configure sensor and ISP (include WDR mode).
step 3: run isp thread
step 4 : config & start vicap dev
Step 5: config & start vicap chn (max 1)
}
step 4: start vpss and vi bind vpss---SAMPLE_COMM_SYS_GetPicSize
}
如果用户调试好图像效果后,可以使用 PQ Tools 工具提供的配置文件保存功能进行配 置参数保存。在下次启动时系统可以使用 PQ Tools 工具提供的配置文件加载功能加载 已经调节好的图像参数。
来自sample_comm_isp.c 38行
HI_S32 SAMPLE_COMM_ISP_Init(WDR_MODE_E enWDRMode)
{
ISP_DEV IspDev = 0;
HI_S32 s32Ret;
ISP_PUB_ATTR_S stPubAttr;
ALG_LIB_S stLib;
/*1.sensor register callback*/-注册sensor库(sensor向3A算法和ISP注册回调函数)
s32Ret = sensor_register_callback();
if (s32Ret != HI_SUCCESS)
{
printf("%s: sensor_register_callback failed with %#x!\n", \
__FUNCTION__, s32Ret);
return s32Ret;
}
/* 2. register hisi ae lib */---(3A算法向ISP注册回调函数)---注册海思AE算法库
stLib.s32Id = 0;
strcpy(stLib.acLibName, HI_AE_LIB_NAME);
s32Ret = HI_MPI_AE_Register(IspDev, &stLib);
/* 3. register hisi awb lib */-(3A算法向ISP注册回调函数)--注册海思AWB算法库
stLib.s32Id = 0;
strcpy(stLib.acLibName, HI_AWB_LIB_NAME);
s32Ret = HI_MPI_AWB_Register(IspDev, &stLib);
/* 4. register hisi af lib */--(3A算法向ISP注册回调函数)----注册海思AF算法库
stLib.s32Id = 0;
strcpy(stLib.acLibName, HI_AF_LIB_NAME);
s32Ret = HI_MPI_AF_Register(IspDev, &stLib);
/* 5. isp mem init */-----------------------------初始化ISP外部寄存器
s32Ret = HI_MPI_ISP_MemInit(IspDev);
/* 6. isp set WDR mode */-------------------------------配置ISP宽动态模式
ISP_WDR_MODE_S stWdrMode;
stWdrMode.enWDRMode = enWDRMode;
s32Ret = HI_MPI_ISP_SetWDRMode(0, &stWdrMode);
/* 7. isp set pub attributes */-------------------------配置图像公共属性
/*不同sensor所用参数不同,也可以用自己的参数 */
switch(SENSOR_TYPE)
{
case APTINA_9M034_DC_720P_30FPS:
stPubAttr.enBayer = BAYER_GRBG;
stPubAttr.f32FrameRate = 30;
stPubAttr.stWndRect.s32X = 0;
stPubAttr.stWndRect.s32Y = 0;
stPubAttr.stWndRect.u32Width = 1280;
stPubAttr.stWndRect.u32Height = 720;
break;
……
}
s32Ret = HI_MPI_ISP_SetPubAttr(IspDev, &stPubAttr);------ 配置图像公共属性
/* 8. isp init */------------------------------------ 初始化ISP Firmware
s32Ret = HI_MPI_ISP_Init(IspDev);
---------------------------------------------------
后面则是 运行HI_MPI_ISP_Run线程+ 启动&停止VI/VO等业务
s32Ret = HI_MPI_ISP_Exit();
pthread_join(isp_pid, 0)
-------------------------------------------------
gbIspInited = HI_TRUE;
return HI_SUCCESS;
}
HI_VOID* Test_ISP_Run(HI_VOID *param)
{
ISP_DEV IspDev = 0;
HI_MPI_ISP_Run(IspDev);
return HI_NULL;
}
来自sample_comm_isp.c
/******************************************************************************
* funciton : ISP Run
******************************************************************************/
HI_S32 SAMPLE_COMM_ISP_Run()
{
#if (CHIP_ID == CHIP_HI3516C_V200)
if (0 != pthread_create(&gs_IspPid, 0, (void* (*)(void*))Test_ISP_Run, NULL))
{
printf("%s: create isp running thread failed!\n", __FUNCTION__);
return HI_FAILURE;
}
usleep(1000);
#else
pthread_attr_t attr;
pthread_attr_init(&attr);
pthread_attr_setstacksize(&attr, 4096 * 1024);
if (0 != pthread_create(&gs_IspPid, &attr, (void* (*)(void*))Test_ISP_Run, NULL))
{
printf("%s: create isp running thread failed!\n", __FUNCTION__);
pthread_attr_destroy(&attr);
return HI_FAILURE;
}
usleep(1000);
pthread_attr_destroy(&attr);
#endif
return HI_SUCCESS;
}
版权声明:本文为qq_42024067原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。