/****************************************************************************** * funciton : ISP init ******************************************************************************/ HI_S32 SAMPLE_COMM_ISP_Init(void) { HI_S32 s32Ret; ISP_IMAGE_ATTR_S stImageAttr; ISP_INPUT_TIMING_S stInputTiming; #ifdef ISP_V2 ALG_LIB_S stLib; /* 1. register ae lib */ stLib.s32Id = 0; strcpy(stLib.acLibName, HI_AE_LIB_NAME); s32Ret = HI_MPI_AE_Register(&stLib); if (s32Ret != HI_SUCCESS) { printf("%s: HI_MPI_AE_Register failed!\n", __FUNCTION__); return s32Ret; } /* 2. register awb lib */ stLib.s32Id = 0; strcpy(stLib.acLibName, HI_AWB_LIB_NAME); s32Ret = HI_MPI_AWB_Register(&stLib); if (s32Ret != HI_SUCCESS) { printf("%s: HI_MPI_AWB_Register failed!\n", __FUNCTION__); return s32Ret; } /* 3. register af lib */ stLib.s32Id = 0; strcpy(stLib.acLibName, HI_AF_LIB_NAME); s32Ret = HI_MPI_AF_Register(&stLib); if (s32Ret != HI_SUCCESS) { printf("%s: HI_MPI_AF_Register failed!\n", __FUNCTION__); return s32Ret; } #endif /* 4. isp init */ s32Ret = HI_MPI_ISP_Init(); if (s32Ret != HI_SUCCESS) { printf("%s: HI_MPI_ISP_Init failed!\n", __FUNCTION__); return s32Ret; } /* 5. isp set image attributes */ /* note : different sensor, different ISP_IMAGE_ATTR_S define. if the sensor you used is different, you can change ISP_IMAGE_ATTR_S definition */ switch(SENSOR_TYPE) { case APTINA_9M034_DC_720P_30FPS: case APTINA_AR0130_DC_720P_30FPS: stImageAttr.enBayer = BAYER_GRBG; stImageAttr.u16FrameRate = 30; stImageAttr.u16Width = 1280; stImageAttr.u16Height = 720; break; case SONY_ICX692_DC_720P_30FPS: stImageAttr.enBayer = BAYER_GRBG; stImageAttr.u16FrameRate = 30; stImageAttr.u16Width = 1280; stImageAttr.u16Height = 720; break; case SONY_IMX104_DC_720P_30FPS: case SONY_IMX138_DC_720P_30FPS: stImageAttr.enBayer = BAYER_GBRG; stImageAttr.u16FrameRate = 30; stImageAttr.u16Width = 1280; stImageAttr.u16Height = 720; break; case OMNI_OV9712_DC_720P_30FPS: stImageAttr.enBayer = BAYER_BGGR; stImageAttr.u16FrameRate = 30; stImageAttr.u16Width = 1280; stImageAttr.u16Height = 720; break; case SOI_H22_DC_720P_30FPS: case PIXELPLUS_3100K_DC_720P_30FPS: stImageAttr.enBayer = BAYER_BGGR; stImageAttr.u16FrameRate = 30; stImageAttr.u16Width = 1280; stImageAttr.u16Height = 720; break; case HIMAX_1375_DC_720P_30FPS: stImageAttr.enBayer = BAYER_BGGR; stImageAttr.u16FrameRate = 30; stImageAttr.u16Width = 1280; stImageAttr.u16Height = 720; break; case SONY_IMX122_DC_1080P_30FPS: case SONY_IMX236_DC_1080P_30FPS: stImageAttr.enBayer = BAYER_RGGB; stImageAttr.u16FrameRate = 30; stImageAttr.u16Width = 1920; stImageAttr.u16Height = 1080; break; case APTINA_MT9P006_DC_1080P_30FPS: case APTINA_AR0330_DC_1080P_30FPS: stImageAttr.enBayer = BAYER_GRBG; stImageAttr.u16FrameRate = 30; stImageAttr.u16Width = 1920; stImageAttr.u16Height = 1080; break; default: stImageAttr.enBayer = BAYER_GRBG; stImageAttr.u16FrameRate = 30; stImageAttr.u16Width = 1280; stImageAttr.u16Height = 720; break; } s32Ret = HI_MPI_ISP_SetImageAttr(&stImageAttr); if (s32Ret != HI_SUCCESS) { printf("%s: HI_MPI_ISP_SetImageAttr failed with %#x!\n", __FUNCTION__, s32Ret); return s32Ret; } /* 6. isp set timing */ switch(SENSOR_TYPE) { case APTINA_9M034_DC_720P_30FPS: case APTINA_AR0130_DC_720P_30FPS: case OMNI_OV9712_DC_720P_30FPS: case SOI_H22_DC_720P_30FPS: case PIXELPLUS_3100K_DC_720P_30FPS: stInputTiming.enWndMode = ISP_WIND_NONE; break; case HIMAX_1375_DC_720P_30FPS: stInputTiming.enWndMode = ISP_WIND_ALL; //for sony or pana stInputTiming.u16HorWndLength = 1280; stInputTiming.u16HorWndStart = 0; stInputTiming.u16VerWndLength = 720; stInputTiming.u16VerWndStart = 4; break; case SONY_ICX692_DC_720P_30FPS: stInputTiming.enWndMode = ISP_WIND_ALL; //for sony or pana stInputTiming.u16HorWndLength = 1280; stInputTiming.u16HorWndStart = 200; stInputTiming.u16VerWndLength = 720; stInputTiming.u16VerWndStart = 2; break; case SONY_IMX104_DC_720P_30FPS: case SONY_IMX138_DC_720P_30FPS: stInputTiming.enWndMode = ISP_WIND_ALL; stInputTiming.u16HorWndStart = 72; stInputTiming.u16HorWndLength = 1280; stInputTiming.u16VerWndStart = 20; stInputTiming.u16VerWndLength = 720; break; case SONY_IMX122_DC_1080P_30FPS: stInputTiming.enWndMode = ISP_WIND_ALL; stInputTiming.u16HorWndStart = 200; stInputTiming.u16HorWndLength = 1920; stInputTiming.u16VerWndStart = 18; stInputTiming.u16VerWndLength = 1080; break; case SONY_IMX236_DC_1080P_30FPS: stInputTiming.enWndMode = ISP_WIND_ALL; stInputTiming.u16HorWndStart = 96; stInputTiming.u16HorWndLength = 1920; stInputTiming.u16VerWndStart = 12; stInputTiming.u16VerWndLength = 1080; break; case APTINA_MT9P006_DC_1080P_30FPS: stInputTiming.enWndMode = ISP_WIND_ALL; stInputTiming.u16HorWndStart = 0; stInputTiming.u16HorWndLength = 1920; stInputTiming.u16VerWndStart = 2; stInputTiming.u16VerWndLength = 1080; break; case APTINA_AR0330_DC_1080P_30FPS: stInputTiming.enWndMode = ISP_WIND_ALL; stInputTiming.u16HorWndStart = 0; stInputTiming.u16HorWndLength = 1920; stInputTiming.u16VerWndStart = 0; stInputTiming.u16VerWndLength = 1080; break; default: printf("%s: SENSOR_TYPE %d not support!\n", __FUNCTION__, SENSOR_TYPE); stInputTiming.enWndMode = ISP_WIND_NONE; break; } s32Ret = HI_MPI_ISP_SetInputTiming(&stInputTiming); if (s32Ret != HI_SUCCESS) { printf("%s: HI_MPI_ISP_SetInputTiming failed with %#x!\n", __FUNCTION__, s32Ret); return s32Ret; } return HI_SUCCESS; }
/****************************************************************************** * funciton : ISP init ******************************************************************************/ HI_S32 SAMPLE_COMM_ISP_Init(WDR_MODE_E enWDRMode, SAMPLE_VI_MODE_E enMode) { ISP_DEV IspDev = 0; HI_S32 s32Ret; ISP_PUB_ATTR_S stPubAttr; ALG_LIB_S stLib; #if 0 /* 0. set cmos iniparser file path */ s32Ret = sensor_set_inifile_path("configs/"); if (s32Ret != HI_SUCCESS) { printf("%s: set cmos iniparser file path failed with %#x!\n", \ __FUNCTION__, s32Ret); return s32Ret; } #endif /* 1. sensor register callback */ s32Ret = sensor_register_callback_fn(); if (s32Ret != HI_SUCCESS) { printf("%s: sensor_register_callback_fn failed with %#x!\n", \ __FUNCTION__, s32Ret); return s32Ret; } /* 2. register hisi ae lib */ stLib.s32Id = 0; strcpy(stLib.acLibName, HI_AE_LIB_NAME); s32Ret = HI_MPI_AE_Register(IspDev, &stLib); if (s32Ret != HI_SUCCESS) { printf("%s: HI_MPI_AE_Register failed!\n", __FUNCTION__); return s32Ret; } /* 3. register hisi awb lib */ stLib.s32Id = 0; strcpy(stLib.acLibName, HI_AWB_LIB_NAME); s32Ret = HI_MPI_AWB_Register(IspDev, &stLib); if (s32Ret != HI_SUCCESS) { printf("%s: HI_MPI_AWB_Register failed!\n", __FUNCTION__); return s32Ret; } /* 4. register hisi af lib */ stLib.s32Id = 0; strcpy(stLib.acLibName, HI_AF_LIB_NAME); s32Ret = HI_MPI_AF_Register(IspDev, &stLib); if (s32Ret != HI_SUCCESS) { printf("%s: HI_MPI_AF_Register failed!\n", __FUNCTION__); return s32Ret; } /* 5. isp mem init */ s32Ret = HI_MPI_ISP_MemInit(IspDev); if (s32Ret != HI_SUCCESS) { printf("%s: HI_MPI_ISP_Init failed!\n", __FUNCTION__); return s32Ret; } /* 6. isp set WDR mode */ ISP_WDR_MODE_S stWdrMode; stWdrMode.enWDRMode = enWDRMode; s32Ret = HI_MPI_ISP_SetWDRMode(0, &stWdrMode); if (HI_SUCCESS != s32Ret) { printf("start ISP WDR failed!\n"); return s32Ret; } /* 7. isp set pub attributes */ /* note : different sensor, different ISP_PUB_ATTR_S define. if the sensor you used is different, you can change ISP_PUB_ATTR_S definition */ switch(enMode) { case APTINA_9M034_DC_720P_30FPS: case APTINA_AR0130_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; case SONY_IMX222_DC_1080P_30FPS: stPubAttr.enBayer = BAYER_RGGB; stPubAttr.f32FrameRate = 30; stPubAttr.stWndRect.s32X = 200; stPubAttr.stWndRect.s32Y = 20; stPubAttr.stWndRect.u32Width = 1920; stPubAttr.stWndRect.u32Height = 1080; break; case SONY_IMX222_DC_720P_30FPS: stPubAttr.enBayer = BAYER_RGGB; stPubAttr.f32FrameRate = 30; stPubAttr.stWndRect.s32X = 200; stPubAttr.stWndRect.s32Y = 20; stPubAttr.stWndRect.u32Width = 1280; stPubAttr.stWndRect.u32Height = 720; break; case APTINA_AR0230_HISPI_1080P_30FPS: stPubAttr.enBayer = BAYER_GRBG; stPubAttr.f32FrameRate = 30; stPubAttr.stWndRect.s32X = 0; stPubAttr.stWndRect.s32Y = 0; stPubAttr.stWndRect.u32Width = 1920; stPubAttr.stWndRect.u32Height = 1080; break; case PANASONIC_MN34222_MIPI_1080P_30FPS: stPubAttr.enBayer = BAYER_GRBG; stPubAttr.f32FrameRate = 30; stPubAttr.stWndRect.s32X = 0; stPubAttr.stWndRect.s32Y = 0; stPubAttr.stWndRect.u32Width = 1920; stPubAttr.stWndRect.u32Height = 1080; break; case OMNIVISION_OV9712_DC_720P_30FPS: stPubAttr.enBayer = BAYER_BGGR; stPubAttr.f32FrameRate = 30; stPubAttr.stWndRect.s32X = 0; stPubAttr.stWndRect.s32Y = 0; stPubAttr.stWndRect.u32Width = 1280; stPubAttr.stWndRect.u32Height = 720; break; case OMNIVISION_OV9732_DC_720P_30FPS: stPubAttr.enBayer = BAYER_BGGR; stPubAttr.f32FrameRate = 30; stPubAttr.stWndRect.s32X = 0; stPubAttr.stWndRect.s32Y = 0; stPubAttr.stWndRect.u32Width = 1280; stPubAttr.stWndRect.u32Height = 720; break; case OMNIVISION_OV9750_MIPI_720P_30FPS: case OMNIVISION_OV9752_MIPI_720P_30FPS: stPubAttr.enBayer = BAYER_BGGR; stPubAttr.f32FrameRate = 30; stPubAttr.stWndRect.s32X = 0; stPubAttr.stWndRect.s32Y = 0; stPubAttr.stWndRect.u32Width = 1280; stPubAttr.stWndRect.u32Height = 720; break; case OMNIVISION_OV2718_MIPI_1080P_25FPS: stPubAttr.enBayer = BAYER_BGGR; stPubAttr.f32FrameRate = 25; stPubAttr.stWndRect.s32X = 0; stPubAttr.stWndRect.s32Y = 0; stPubAttr.stWndRect.u32Width = 1920; stPubAttr.stWndRect.u32Height = 1080; break; default: stPubAttr.enBayer = BAYER_GRBG; stPubAttr.f32FrameRate = 30; stPubAttr.stWndRect.s32X = 0; stPubAttr.stWndRect.s32Y = 0; stPubAttr.stWndRect.u32Width = 1920; stPubAttr.stWndRect.u32Height = 1080; break; } s32Ret = HI_MPI_ISP_SetPubAttr(IspDev, &stPubAttr); if (s32Ret != HI_SUCCESS) { printf("%s: HI_MPI_ISP_SetPubAttr failed with %#x!\n", __FUNCTION__, s32Ret); return s32Ret; } /* 8. isp init */ s32Ret = HI_MPI_ISP_Init(IspDev); if (s32Ret != HI_SUCCESS) { printf("%s: HI_MPI_ISP_Init failed!\n", __FUNCTION__); return s32Ret; } gbIspInited = HI_TRUE; return HI_SUCCESS; }
bool HimppVideoISP::enableObject() { HI_S32 s32Ret; ISP_IMAGE_ATTR_S *pstImageAttr = *video_sensor; ISP_INPUT_TIMING_S *pstInputTiming = *video_sensor; if (!loadSensorModule()) return false; if (!registerAlgorithm()) goto err_unload_mod; if ((s32Ret = HI_MPI_ISP_Init()) != HI_SUCCESS) { goto err_unreg_alg; } if (HI_MPI_ISP_SetImageAttr(pstImageAttr) != HI_SUCCESS) { goto err_exit_isp; } if (HI_MPI_ISP_SetInputTiming(pstInputTiming) != HI_SUCCESS) { goto err_exit_isp; } if (pthread_create(&isp_thread, 0, isp_thread_routine, NULL)) goto err_exit_isp; ISP_OP_TYPE_E exp_opmode; exp_opmode = (_exposure._mode == IVideoSource::Imaging::Exposure::AUTO_EXPOSURE) ? OP_TYPE_AUTO : OP_TYPE_MANUAL; if (HI_MPI_ISP_SetExposureType(exp_opmode) != HI_SUCCESS) { fprintf(stderr, "HI_MPI_ISP_SetExposureType failed\n"); } // initialize Exposure ISP_AE_ATTR_EX_S ae_attr; if (HI_MPI_ISP_GetAEAttrEx(&ae_attr) == HI_SUCCESS) { ae_attr.enAEMode = (_exposure._priority == IVideoSource::Imaging::Exposure::LOWNOISE_PRIORITY) ? \ AE_MODE_LOW_NOISE : AE_MODE_FRAME_RATE; ae_attr.u32ExpTimeMin = _exposure._min_exp_time; ae_attr.u32ExpTimeMax = _exposure._max_exp_time; ae_attr.u32AGainMin = _exposure._min_gain; ae_attr.u32AGainMax = _exposure._max_gain; if (HI_MPI_ISP_SetAEAttrEx(&ae_attr) != HI_SUCCESS) { fprintf(stderr, "HI_MPI_ISP_SetAEAttrEx failed\n"); } } ISP_ME_ATTR_EX_S me_attr; if (HI_MPI_ISP_GetMEAttrEx(&me_attr) == HI_SUCCESS) { me_attr.u32ExpLine = _exposure._exp_time; me_attr.s32AGain = _exposure._gain; if (HI_MPI_ISP_SetMEAttrEx(&me_attr) != HI_SUCCESS) { fprintf(stderr, "HI_MPI_ISP_SetMEAttrEx failed\n"); } } // Initialize WhiteBalance ISP_OP_TYPE_E wb_opmode; wb_opmode = (_whitebalance._mode == IVideoSource::Imaging::WhiteBalance::AUTO_WB) ? OP_TYPE_AUTO : OP_TYPE_MANUAL; if (HI_MPI_ISP_SetWBType(wb_opmode) != HI_SUCCESS) { fprintf(stderr, "HI_MPI_ISP_SetWBType failed\n"); } if (_whitebalance._mode == IVideoSource::Imaging::WhiteBalance::AUTO_WB) { ISP_AWB_ATTR_S awb_attr; if (HI_MPI_ISP_GetAWBAttr(&awb_attr) == HI_SUCCESS) { awb_attr.u8BGStrength = (HI_U8)_whitebalance._cb_gain; awb_attr.u8RGStrength = (HI_U8)_whitebalance._cr_gain; if (HI_MPI_ISP_SetAWBAttr(&awb_attr) != HI_SUCCESS) fprintf(stderr, "HI_MPI_ISP_SetWBType failed\n"); } } else { ISP_MWB_ATTR_S mwb_attr; if (HI_MPI_ISP_GetMWBAttr(&mwb_attr) == HI_SUCCESS) mwb_attr.u16Rgain = (HI_U16)_whitebalance._r_gain; mwb_attr.u16Ggain = (HI_U16)_whitebalance._g_gain; mwb_attr.u16Bgain = (HI_U16)_whitebalance._b_gain; if (HI_MPI_ISP_SetMWBAttr(&mwb_attr) != HI_SUCCESS) throw IpcamError("Cannot set MWB attr"); } return true; err_exit_isp: HI_MPI_ISP_Exit(); err_unreg_alg: unregisterAlgorithm(); err_unload_mod: unloadSensorModule(); return false; }
/****************************************************************************** * funciton : ISP init ******************************************************************************/ static HI_S32 s32IspInit(VI_ATTR_S * pstViAttr) { ISP_DEV IspDev = 0; HI_S32 s32Ret; ALG_LIB_S stLib; ISP_PUB_ATTR_S *pstPubAttr; ISP_WDR_MODE_S stWdrMode; if (NULL == pstViAttr) { printf("Func %s() Line[%d], parament is null\n", __FUNCTION__, __LINE__); return HI_FAILURE; } IspDev = pstViAttr->IspDev; pstPubAttr = pstViAttr->pstIspPubAttr; stWdrMode.enWDRMode = pstViAttr->enWDRMode; /* 1. sensor register callback */ 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 */ stLib.s32Id = 0; strcpy(stLib.acLibName, HI_AE_LIB_NAME); s32Ret = HI_MPI_AE_Register(IspDev, &stLib); if (s32Ret != HI_SUCCESS) { printf("%s: HI_MPI_AE_Register failed!\n", __FUNCTION__); return s32Ret; } /* 3. register hisi awb lib */ stLib.s32Id = 0; strcpy(stLib.acLibName, HI_AWB_LIB_NAME); s32Ret = HI_MPI_AWB_Register(IspDev, &stLib); if (s32Ret != HI_SUCCESS) { printf("%s: HI_MPI_AWB_Register failed!\n", __FUNCTION__); return s32Ret; } /* 4. register hisi af lib */ stLib.s32Id = 0; strcpy(stLib.acLibName, HI_AF_LIB_NAME); s32Ret = HI_MPI_AF_Register(IspDev, &stLib); if (s32Ret != HI_SUCCESS) { printf("%s: HI_MPI_AF_Register failed!\n", __FUNCTION__); return s32Ret; } /* 5. isp mem init */ s32Ret = HI_MPI_ISP_MemInit(IspDev); if (s32Ret != HI_SUCCESS) { printf("%s: HI_MPI_ISP_Init failed!\n", __FUNCTION__); return s32Ret; } /* 6. isp set WDR mode */ s32Ret = HI_MPI_ISP_SetWDRMode(IspDev, &stWdrMode); if (HI_SUCCESS != s32Ret) { printf("start ISP WDR failed!\n"); return s32Ret; } /* 7. isp set pub attributes */ s32Ret = HI_MPI_ISP_SetPubAttr(IspDev, pstPubAttr); if (s32Ret != HI_SUCCESS) { printf("%s: HI_MPI_ISP_SetPubAttr failed with %#x!\n", __FUNCTION__, s32Ret); return s32Ret; } /* 8. isp init */ s32Ret = HI_MPI_ISP_Init(IspDev); if (s32Ret != HI_SUCCESS) { printf("%s: HI_MPI_ISP_Init failed!\n", __FUNCTION__); return s32Ret; } gbIspInited = HI_TRUE; /*9. isp run*/ if (0 != pthread_create(&gs_IspPid, NULL, (void* (*)(void*))vdIspRun, NULL)) { printf("%s: create isp running thread failed!\n", __FUNCTION__); return HI_FAILURE; } usleep(1000); return HI_SUCCESS; }