/***************************************************************************** * function : star vi according to product type * if vi input is hd, we will start sub-chn for cvbs preview *****************************************************************************/ HI_S32 SAMPLE_COMM_VI_Start(SAMPLE_VI_MODE_E enViMode, VIDEO_NORM_E enNorm) { VI_DEV ViDev; VI_CHN ViChn, ViChn_Sub; HI_S32 i; HI_S32 s32Ret; SAMPLE_VI_PARAM_S stViParam; SIZE_S stMainTargetSize; SIZE_S stSubTargetSize; RECT_S stCapRect; /*** get parameter from Sample_Vi_Mode ***/ s32Ret = SAMPLE_COMM_VI_Mode2Param(enViMode, &stViParam); if (HI_SUCCESS !=s32Ret) { SAMPLE_PRT("vi get param failed!\n"); return HI_FAILURE; } s32Ret = SAMPLE_COMM_VI_Mode2Size(enViMode, enNorm, &stCapRect, &stMainTargetSize); if (HI_SUCCESS !=s32Ret) { SAMPLE_PRT("vi get size failed!\n"); return HI_FAILURE; } /*** Start AD ***/ s32Ret = SAMPLE_COMM_VI_ADStart(enViMode, enNorm); if (HI_SUCCESS !=s32Ret) { SAMPLE_PRT("Start AD failed!\n"); return HI_FAILURE; } /*** Start VI Dev ***/ for(i=0; i<stViParam.s32ViDevCnt; i++) { ViDev = i * stViParam.s32ViDevInterval; s32Ret = SAMPLE_COMM_VI_StartDev(ViDev, enViMode); if (HI_SUCCESS != s32Ret) { SAMPLE_PRT("SAMPLE_COMM_VI_StartDev failed with %#x\n", s32Ret); return HI_FAILURE; } } /*** Start VI Chn ***/ for(i=0; i<stViParam.s32ViChnCnt; i++) { ViChn = i * stViParam.s32ViChnInterval; s32Ret = SAMPLE_COMM_VI_StartChn(ViChn, &stCapRect, &stMainTargetSize, enViMode, VI_CHN_SET_NORMAL); if (HI_SUCCESS != s32Ret) { SAMPLE_PRT("call SAMPLE_COMM_VI_StarChn failed with %#x\n", s32Ret); return HI_FAILURE; } /* HD mode, we will start vi sub-chn */ if (HI_TRUE == SAMPLE_COMM_VI_IsHd(enViMode)) { ViChn_Sub = SUBCHN(ViChn); s32Ret = SAMPLE_COMM_VI_GetSubChnSize(ViChn_Sub, enNorm, &stSubTargetSize); if (HI_SUCCESS != s32Ret) { SAMPLE_PRT("SAMPLE_COMM_VI_GetSubChnSize(%d) failed!\n", ViChn_Sub); return HI_FAILURE; } s32Ret = SAMPLE_COMM_VI_StartChn(ViChn_Sub, &stCapRect, &stSubTargetSize,enViMode, VI_CHN_SET_NORMAL); if (HI_SUCCESS != s32Ret) { SAMPLE_PRT("SAMPLE_COMM_VI_StartChn (Sub_Chn-%d) failed!\n", ViChn_Sub); return HI_FAILURE; } } } return HI_SUCCESS; }
HI_S32 SAMPLE_COMM_VI_StartIsp(SAMPLE_VI_CONFIG_S* pstViConfig) { HI_S32 i, s32Ret = HI_SUCCESS; VI_DEV ViDev; VI_CHN ViChn; HI_U32 u32DevNum = 1; HI_U32 u32ChnNum = 1; SIZE_S stTargetSize; RECT_S stCapRect; SAMPLE_VI_MODE_E enViMode; ROTATE_E enRotate; SAMPLE_VI_CHN_SET_E enViChnSet; if (!pstViConfig) { SAMPLE_PRT("%s: null ptr\n", __FUNCTION__); return HI_FAILURE; } enViMode = pstViConfig->enViMode; enViChnSet = pstViConfig->enViChnSet; enRotate = pstViConfig->enRotate; /****************************************** step 1: configure sensor. note: you can jump over this step, if you do not use Hi3518 interal isp. ******************************************/ s32Ret = SAMPLE_COMM_ISP_SensorInit(); if (HI_SUCCESS != s32Ret) { SAMPLE_PRT("%s: Sensor init failed!\n", __FUNCTION__); return HI_FAILURE; } /****************************************************** step 2 : config & start vicap dev ******************************************************/ for (i = 0; i < u32DevNum; i++) { ViDev = i; s32Ret = SAMPLE_COMM_VI_StartDev(ViDev, enViMode); if (HI_SUCCESS != s32Ret) { SAMPLE_PRT("%s: start vi dev[%d] failed!\n", __FUNCTION__, i); return HI_FAILURE; } } /****************************************** step 3: configure & run isp thread note: you can jump over this step, if you do not use Hi3518 interal isp. note: isp run must at this step -- after vi dev enable, before vi chn enable ******************************************/ s32Ret = SAMPLE_COMM_ISP_Run(); if (HI_SUCCESS != s32Ret) { SAMPLE_PRT("%s: ISP init failed!\n", __FUNCTION__); /* disable videv */ return HI_FAILURE; } /****************************************************** * Step 4: config & start vicap chn (max 1) ******************************************************/ for (i = 0; i < u32ChnNum; i++) { ViChn = i; stCapRect.s32X = 0; stCapRect.s32Y = 0; switch (enViMode) { case APTINA_9M034_DC_720P_30FPS: case APTINA_AR0130_DC_720P_30FPS: case SONY_ICX692_DC_720P_30FPS: case SONY_IMX104_DC_720P_30FPS: case OMNI_OV9712_DC_720P_30FPS: stCapRect.u32Width = 1280; stCapRect.u32Height = 720; break; case SONY_IMX122_DC_1080P_30FPS: stCapRect.u32Width = 1920; stCapRect.u32Height = 1080; break; default: stCapRect.u32Width = 1280; stCapRect.u32Height = 720; break; } stTargetSize.u32Width = stCapRect.u32Width; stTargetSize.u32Height = stCapRect.u32Height; s32Ret = SAMPLE_COMM_VI_StartChn(ViChn, &stCapRect, &stTargetSize, pstViConfig); if (HI_SUCCESS != s32Ret) { SAMPLE_COMM_ISP_Stop(); return HI_FAILURE; } } return s32Ret; }
/***************************************************************************** * function : star vi according to product type * only for Hi3520D MixCap *****************************************************************************/ HI_S32 SAMPLE_COMM_VI_MixCap_Start(SAMPLE_VI_MODE_E enViMode, VIDEO_NORM_E enNorm) { VI_DEV ViDev; VI_CHN ViChn; HI_S32 i; HI_S32 s32Ret; SAMPLE_VI_PARAM_S stViParam; VI_CHN_ATTR_S stChnAttr,stChnMinorAttr; /*** get parameter from Sample_Vi_Mode ***/ s32Ret = SAMPLE_COMM_VI_Mode2Param(enViMode, &stViParam); if (HI_SUCCESS !=s32Ret) { SAMPLE_PRT("vi get param failed!\n"); return HI_FAILURE; } /*** Start AD ***/ s32Ret = SAMPLE_COMM_VI_ADStart(enViMode, enNorm); if (HI_SUCCESS !=s32Ret) { SAMPLE_PRT("Start AD failed!\n"); return HI_FAILURE; } /*** Start VI Dev ***/ for(i=0; i<stViParam.s32ViDevCnt; i++) { ViDev = i * stViParam.s32ViDevInterval; s32Ret = SAMPLE_COMM_VI_StartDev(ViDev, enViMode); if (HI_SUCCESS != s32Ret) { SAMPLE_PRT("SAMPLE_COMM_VI_StartDev failed with %#x\n", s32Ret); return HI_FAILURE; } } /*** Start VI Chn ***/ for(i=0; i<stViParam.s32ViChnCnt; i++) { ViChn = i * stViParam.s32ViChnInterval; stChnAttr.stCapRect.s32X = 0; stChnAttr.stCapRect.s32Y = 0; stChnAttr.enCapSel = VI_CAPSEL_BOTH; stChnAttr.enPixFormat = SAMPLE_PIXEL_FORMAT; /* sp420 or sp422 */ stChnAttr.bMirror = HI_FALSE; stChnAttr.bFlip = HI_FALSE; stChnAttr.bChromaResample = HI_FALSE; stChnAttr.s32SrcFrameRate = -1; stChnAttr.s32FrameRate = -1; stChnAttr.stCapRect.u32Width= D1_WIDTH; stChnAttr.stCapRect.u32Height= (VIDEO_ENCODING_MODE_PAL==enNorm)?576:480; stChnAttr.stDestSize.u32Width= D1_WIDTH; stChnAttr.stDestSize.u32Height= (VIDEO_ENCODING_MODE_PAL==enNorm)?576:480; memcpy(&stChnMinorAttr, &stChnAttr, sizeof(VI_CHN_ATTR_S)); stChnMinorAttr.stDestSize.u32Width= D1_WIDTH / 2; stChnMinorAttr.stDestSize.u32Height= (VIDEO_ENCODING_MODE_PAL==enNorm)?576:480; stChnAttr.s32SrcFrameRate = (VIDEO_ENCODING_MODE_PAL== enNorm)?25:30; stChnAttr.s32FrameRate = 6; s32Ret = HI_MPI_VI_SetChnAttr(ViChn, &stChnAttr); if (HI_SUCCESS != s32Ret) { SAMPLE_PRT("call HI_MPI_VI_SetChnAttr failed with %#x\n", s32Ret); return HI_FAILURE; } s32Ret = HI_MPI_VI_SetChnMinorAttr(ViChn, &stChnMinorAttr); if (HI_SUCCESS != s32Ret) { SAMPLE_PRT("call HI_MPI_VI_SetChnMinorAttr failed with %#x\n", s32Ret); return HI_FAILURE; } s32Ret = HI_MPI_VI_EnableChn(ViChn); if (s32Ret != HI_SUCCESS) { SAMPLE_PRT("HI_MPI_VI_EnableChn failed with %#x!\n", s32Ret); return HI_FAILURE; } } return HI_SUCCESS; }
/***************************************************************************** * function : star vi according to product type *****************************************************************************/ HI_S32 SAMPLE_COMM_VI_StartBT656(SAMPLE_VI_MODE_E enViMode, VIDEO_NORM_E enNorm) { VI_DEV ViDev; VI_CHN ViChn; HI_S32 i; HI_S32 s32Ret; SAMPLE_VI_PARAM_S stViParam; SIZE_S stTargetSize; RECT_S stCapRect; /*** get parameter from Sample_Vi_Mode ***/ s32Ret = SAMPLE_COMM_VI_Mode2Param(enViMode, &stViParam); if (HI_SUCCESS != s32Ret) { SAMPLE_PRT("vi get param failed!\n"); return HI_FAILURE; } s32Ret = SAMPLE_COMM_VI_Mode2Size(enViMode, enNorm, &stTargetSize); if (HI_SUCCESS != s32Ret) { SAMPLE_PRT("vi get size failed!\n"); return HI_FAILURE; } /*** Start AD ***/ s32Ret = SAMPLE_COMM_VI_ADStart(enViMode, enNorm); if (HI_SUCCESS != s32Ret) { SAMPLE_PRT("Start AD failed!\n"); return HI_FAILURE; } /*** Start VI Dev ***/ for (i = 0; i < stViParam.s32ViDevCnt; i++) { ViDev = i * stViParam.s32ViDevInterval; s32Ret = SAMPLE_COMM_VI_StartDev(ViDev, enViMode); if (HI_SUCCESS != s32Ret) { SAMPLE_PRT("SAMPLE_COMM_VI_StartDev failed with %#x\n", s32Ret); return HI_FAILURE; } } /*** Start VI Chn ***/ for (i = 0; i < stViParam.s32ViChnCnt; i++) { ViChn = i * stViParam.s32ViChnInterval; stCapRect.s32X = 0; stCapRect.s32Y = 0; switch (enViMode) { case SAMPLE_VI_MODE_1_D1: stCapRect.u32Width = 720; stCapRect.u32Height = (VIDEO_ENCODING_MODE_PAL == enNorm) ? 576 : 480; break; default: SAMPLE_PRT("vi mode invaild!\n"); return HI_FAILURE; } s32Ret = SAMPLE_COMM_VI_StartChn(ViChn, &stCapRect, &stTargetSize, NULL); if (HI_SUCCESS != s32Ret) { SAMPLE_PRT("call SAMPLE_COMM_VI_StarChn failed with %#x\n", s32Ret); return HI_FAILURE; } } return HI_SUCCESS; }