static void video_ClearDigitalZoom(int nChn) { int i = 0; VO_ZOOM_ATTR_S stBaseZoom; VO_ZOOM_RATIO_S stZoomRatio; memset(&stZoomRatio, 0, sizeof(stZoomRatio)); for(i = 0; i < sizeof(VO_DEV_ID)/sizeof(VO_DEV_ID[0]); ++i){ DVR_ASSERT(HI_MPI_VO_SetZoomInRatio(VO_DEV_ID[i], nChn, &stZoomRatio)); // very important } video_GetZoom(nChn, &stBaseZoom, NULL); if(VIDEO_IsLiveMode()){ for(i = 0; i < sizeof(VO_DEV_ID)/sizeof(VO_DEV_ID[0]); ++i){ DVR_ASSERT(HI_MPI_VO_SetZoomInWindow(VO_DEV_ID[i], nChn, &stBaseZoom)); } // VIDEO_TRACE("clear zoom @ ch%d [%d,%d,%d,%d]", nChn, stBaseZoom.stZoomRect.s32X, stBaseZoom.stZoomRect.s32Y, stBaseZoom.stZoomRect.u32Width, stBaseZoom.stZoomRect.u32Height); }else{ memset(&stBaseZoom.stZoomRect, 0, sizeof(stBaseZoom.stZoomRect)); for(i = 0; i < sizeof(VO_DEV_ID)/sizeof(VO_DEV_ID[0]); ++i){ DVR_ASSERT(HI_MPI_VO_SetZoomInWindow(VO_DEV_ID[i], nChn, &stBaseZoom)); } } memset(&s_stVideo.astDigitalZoomRatio[nChn], 0, sizeof(s_stVideo.astDigitalZoomRatio[nChn])); s_stVideo.abDigitalZoom[nChn] = FALSE; }
HI_S32 SampleViVoClipD1to4Cif_SD(VI_DEV ViDev, VI_CHN ViChn, VO_DEV VoDev) { HI_S32 s32Ret, i; SAMPLE_StartVi_SD(4, PIC_D1); SAMPLE_StartVo_SD(4, VoDev); for(i=0; i<4; i++) { VO_ZOOM_ATTR_S stZoom; stZoom.enField = (i <= 1) ? VIDEO_FIELD_TOP : VIDEO_FIELD_BOTTOM; stZoom.stZoomRect.s32X = ( i & 1) ? 0 : 352; stZoom.stZoomRect.s32Y = 0; stZoom.stZoomRect.u32Height = 288; stZoom.stZoomRect.u32Width = 352; s32Ret = HI_MPI_VO_SetZoomInWindow(VoDev, i, &stZoom); if (s32Ret != HI_SUCCESS) { printf("HI_MPI_VO_SetZoomInWindow err 0x%x\n", s32Ret); return HI_FAILURE; } s32Ret = HI_MPI_VI_BindOutput(ViDev, ViChn, VoDev, i); if (s32Ret != HI_SUCCESS) { printf("HI_MPI_VI_BindOutput err 0x%x\n", s32Ret); return HI_FAILURE; } } return HI_SUCCESS; }
static void video_ClearDigitalZoom(int nChn) { int i = 0; VO_ZOOM_RATIO_S stZoomRatio; VO_ZOOM_ATTR_S stZoomRect; for(i = 0; i < sizeof(VO_DEV_ID)/sizeof(VO_DEV_ID[0]); ++i){ memset(&stZoomRatio, 0, sizeof(stZoomRatio)); DVR_ASSERT(HI_MPI_VO_SetZoomInRatio(VO_DEV_ID[i], nChn, &stZoomRatio)); DVR_ASSERT(HI_MPI_VO_GetZoomInWindow(VO_DEV_ID[i], nChn, &stZoomRect)); memset(&stZoomRect.stZoomRect, 0, sizeof(stZoomRect.stZoomRect)); DVR_ASSERT(HI_MPI_VO_SetZoomInWindow(VO_DEV_ID[i], nChn, &stZoomRect)); } memset(&s_stVideo.astDigitalZoomRatio[nChn], 0, sizeof(s_stVideo.astDigitalZoomRatio[nChn])); s_stVideo.abDigitalZoom[nChn] = FALSE; }
static int video_DigitalZoom(int nChn, int nRatioX, int nRatioY, int nRatioW, int nRatioH, unsigned char bLive) { int i, ii; VO_ZOOM_ATTR_S stBaseZoom; if(bLive){ int x, y, w, h; video_GetZoom(nChn, &stBaseZoom, NULL); x = stBaseZoom.stZoomRect.s32X; y = stBaseZoom.stZoomRect.s32Y; w = stBaseZoom.stZoomRect.u32Width; h = stBaseZoom.stZoomRect.u32Height; if(!s_stVideo.abDigitalZoom[nChn]){ if(0 == nRatioX && 0 == nRatioY && 1000 == nRatioW && 1000 == nRatioH){ // needless to zoom return 0; } s_stVideo.astDigitalZoomRatio[nChn].nRatioX = nRatioX; s_stVideo.astDigitalZoomRatio[nChn].nRatioY = nRatioY; s_stVideo.astDigitalZoomRatio[nChn].nRatioW = nRatioW; s_stVideo.astDigitalZoomRatio[nChn].nRatioH = nRatioH; stBaseZoom.stZoomRect.s32X = x + (nRatioX * w / 1000); stBaseZoom.stZoomRect.s32Y = y + (nRatioY * h / 1000); stBaseZoom.stZoomRect.u32Width = nRatioW * w / 1000; stBaseZoom.stZoomRect.u32Height = nRatioH * h / 1000; stBaseZoom.stZoomRect.s32X &= ~0xf; // aligned 16 pixels stBaseZoom.stZoomRect.s32Y &= ~0xf; // aligned 16 pixels stBaseZoom.stZoomRect.u32Width &= ~1; stBaseZoom.stZoomRect.u32Height &= ~1; VIDEO_TRACE("ch=%d zoom [%d,%d,%d,%d]", ii, stBaseZoom.stZoomRect.s32X,stBaseZoom.stZoomRect.s32Y, stBaseZoom.stZoomRect.u32Width, stBaseZoom.stZoomRect.u32Height); for(i = 0; i < sizeof(VO_DEV_ID)/sizeof(VO_DEV_ID[0]); ++i){ DVR_ASSERT(HI_MPI_VO_SetZoomInWindow(VO_DEV_ID[i], nChn, &stBaseZoom)); } if(1 == s_stVideo.nCurDivi && nChn == s_stVideo.nCurPage){ video_CheckDigitalZoomD1(nChn); } s_stVideo.abDigitalZoom[nChn] = TRUE; }else{ // all zeroes is recover memset(&s_stVideo.astDigitalZoomRatio[nChn], 0, sizeof(s_stVideo.astDigitalZoomRatio[nChn])); s_stVideo.abDigitalZoom[nChn] = FALSE; for(i = 0; i < sizeof(VO_DEV_ID)/sizeof(VO_DEV_ID[0]); ++i){ DVR_ASSERT(HI_MPI_VO_SetZoomInWindow(VO_DEV_ID[i], nChn, &stBaseZoom)); video_CheckDigitalZoomD1(nChn); } } }else{ // return 0; VO_ZOOM_RATIO_S stZoomRatio = {0}; if(!s_stVideo.abDigitalZoom[nChn]){ if(0 == nRatioX && 0 == nRatioY && 1000 == nRatioW && 1000 == nRatioH){ // needless to zoom return 0; } s_stVideo.astDigitalZoomRatio[nChn].nRatioX = stZoomRatio.u32XRatio = nRatioX; s_stVideo.astDigitalZoomRatio[nChn].nRatioY = stZoomRatio.u32YRatio = nRatioY; s_stVideo.astDigitalZoomRatio[nChn].nRatioW = stZoomRatio.u32WRatio = nRatioW; s_stVideo.astDigitalZoomRatio[nChn].nRatioH = stZoomRatio.u32HRatio = nRatioH; for(i = 0; i < sizeof(VO_DEV_ID)/sizeof(VO_DEV_ID[0]); ++i){ DVR_ASSERT(HI_MPI_VO_SetZoomInRatio(VO_DEV_ID[i], nChn, &stZoomRatio)); } s_stVideo.abDigitalZoom[nChn] = TRUE; }else{ // all zeroes is recover memset(&stZoomRatio, 0, sizeof(stZoomRatio)); for(i = 0; i < sizeof(VO_DEV_ID)/sizeof(VO_DEV_ID[0]); ++i){ DVR_ASSERT(HI_MPI_VO_SetZoomInRatio(VO_DEV_ID[i], nChn, &stZoomRatio)); } memset(&s_stVideo.astDigitalZoomRatio[nChn], 0, sizeof(s_stVideo.astDigitalZoomRatio[nChn])); s_stVideo.abDigitalZoom[nChn] = FALSE; } } return 0; }
static void video_OutputInit() { int i = 0, ii = 0; int const nMaxFps = MAX_D1_CNT ? MAX_D1_LIVE_FPS : MAX_CIF_LIVE_FPS; VO_VIDEO_LAYER_ATTR_S stVgaLayerAttr; VO_VIDEO_LAYER_ATTR_S stCvbsLayerAttr; // vga output { VGA_RESOLUTION const enRes = g_pstSysEnv->GetVGAResolution(g_pstSysEnv); stVgaLayerAttr.stImageSize.u32Width = VO_ORIGIN_WIDTH; stVgaLayerAttr.stImageSize.u32Height = VO_ORIGIN_HEIGHT; stVgaLayerAttr.stDispRect.s32X = 0; stVgaLayerAttr.stDispRect.s32Y = 0; switch(enRes) { case VGA_800x600: stVgaLayerAttr.stDispRect.u32Width = 800; stVgaLayerAttr.stDispRect.u32Height = 600; break; default: case VGA_1280x1024: case VGA_1024x768: stVgaLayerAttr.stDispRect.u32Width = 1024; stVgaLayerAttr.stDispRect.u32Height = 768; break; case VGA_1366x768: stVgaLayerAttr.stDispRect.u32Width = 1366; stVgaLayerAttr.stDispRect.u32Height = 768; break; case VGA_1440x900: stVgaLayerAttr.stDispRect.u32Width = 1440; stVgaLayerAttr.stDispRect.u32Height = 900; break; } stVgaLayerAttr.u32DispFrmRt = nMaxFps; stVgaLayerAttr.enPixFormat = PIXEL_FORMAT_YUV_SEMIPLANAR_420; stVgaLayerAttr.s32PiPChn = VO_DEFAULT_CHN; } // cvbs { stCvbsLayerAttr.stImageSize.u32Width = VO_ORIGIN_WIDTH; stCvbsLayerAttr.stImageSize.u32Height = VO_ORIGIN_HEIGHT; stCvbsLayerAttr.stDispRect.s32X = 0; stCvbsLayerAttr.stDispRect.s32Y = 0; stCvbsLayerAttr.stDispRect.u32Width = VO_ORIGIN_WIDTH; stCvbsLayerAttr.stDispRect.u32Height = VO_ORIGIN_HEIGHT; stCvbsLayerAttr.u32DispFrmRt = nMaxFps; stCvbsLayerAttr.enPixFormat = PIXEL_FORMAT_YUV_SEMIPLANAR_420; stCvbsLayerAttr.s32PiPChn = VO_DEFAULT_CHN; } { // configuration active const VO_VIDEO_LAYER_ATTR_S astVideoLayerAttr[] = {stVgaLayerAttr, stCvbsLayerAttr}; video_ScreenInit(); for(i = 0; i < sizeof(VO_DEV_ID) / sizeof(VO_DEV_ID[0]); ++i){ //DVR_ASSERT(HI_MPI_VO_SetDispBufLen(nDev, MAX_CAM_CH)); DVR_ASSERT(HI_MPI_VO_SetVideoLayerAttr(VO_DEV_ID[i], &astVideoLayerAttr[i])); DVR_ASSERT(HI_MPI_VO_EnableVideoLayer(VO_DEV_ID[i])); // setup division video_Division(VO_DEV_ID[i], s_stVideo.nScrWidth[i], s_stVideo.nScrHeight[i], VIDEO_GetMaxDiv(), 0, FALSE); // enable vo channel for(ii = 0; ii < MAX_CAM_CH + 1; ++ii){ // 1 - 16 digital zoom if(ii < 16){ // for vi0 1-16 // digital zoom VO_ZOOM_ATTR_S stZoomAttr; VO_DISPLAY_FIELD_E enDisplayField; video_GetZoom(ii, &stZoomAttr, &enDisplayField); DVR_ASSERT(HI_MPI_VO_SetZoomInWindow(VO_DEV_ID[i], ii, &stZoomAttr)); DVR_ASSERT(HI_MPI_VO_SetChnField(VO_DEV_ID[i], ii, enDisplayField)); DVR_ASSERT(HI_MPI_VO_EnableChn(VO_DEV_ID[i], ii)); }else if(16 == ii){ // for ch1-16 d1 live DVR_ASSERT(HI_MPI_VO_SetChnField(VO_DEV_ID[i], ii, VO_FIELD_BOTH)); DVR_ASSERT(HI_MPI_VO_EnableChn(VO_DEV_ID[i], ii)); }else{ ; } video_BindOutput(VO_DEV_ID[i], ii, TRUE); } } } s_stVideo.bOutput = TRUE; }
static void video_OutputInit() { int i = 0, ii = 0; int const nMaxFps = MAX_D1_CNT ? MAX_D1_LIVE_FPS : MAX_CIF_LIVE_FPS; VO_VIDEO_LAYER_ATTR_S stVgaLayerAttr; VO_VIDEO_LAYER_ATTR_S stCvbsLayerAttr; // vga output { VGA_RESOLUTION const enRes = g_pstSysEnv->GetVGAResolution(g_pstSysEnv); stVgaLayerAttr.stImageSize.u32Width = VO_ORIGIN_WIDTH; stVgaLayerAttr.stImageSize.u32Height = VO_ORIGIN_HEIGHT; stVgaLayerAttr.stDispRect.s32X = 0; stVgaLayerAttr.stDispRect.s32Y = 0; switch(enRes) { case VGA_800x600: stVgaLayerAttr.stDispRect.u32Width = 800; stVgaLayerAttr.stDispRect.u32Height = 600; break; default: case VGA_1024x768: stVgaLayerAttr.stDispRect.u32Width = 1024; stVgaLayerAttr.stDispRect.u32Height = 768; break; case VGA_1280x1024: stVgaLayerAttr.stDispRect.u32Width = 1280; stVgaLayerAttr.stDispRect.u32Height = 1024; break; case VGA_1366x768: stVgaLayerAttr.stDispRect.u32Width = 1366; stVgaLayerAttr.stDispRect.u32Height = 768; break; case VGA_1440x900: stVgaLayerAttr.stDispRect.u32Width = 1440; stVgaLayerAttr.stDispRect.u32Height = 900; break; } stVgaLayerAttr.u32DispFrmRt = nMaxFps; stVgaLayerAttr.enPixFormat = PIXEL_FORMAT_YUV_SEMIPLANAR_420; stVgaLayerAttr.s32PiPChn = VO_DEFAULT_CHN; } // cvbs { stCvbsLayerAttr.stImageSize.u32Width = VO_ORIGIN_WIDTH; stCvbsLayerAttr.stImageSize.u32Height = VO_ORIGIN_HEIGHT; stCvbsLayerAttr.stDispRect.s32X = 0; stCvbsLayerAttr.stDispRect.s32Y = 0; stCvbsLayerAttr.stDispRect.u32Width = VO_ORIGIN_WIDTH; stCvbsLayerAttr.stDispRect.u32Height = VO_ORIGIN_HEIGHT; stCvbsLayerAttr.u32DispFrmRt = nMaxFps; stCvbsLayerAttr.enPixFormat = PIXEL_FORMAT_YUV_SEMIPLANAR_420; stCvbsLayerAttr.s32PiPChn = VO_DEFAULT_CHN; } { // configuration active const VO_VIDEO_LAYER_ATTR_S astVideoLayerAttr[] = {stVgaLayerAttr, stCvbsLayerAttr}; video_ScreenInit(); for(i = 0; i < sizeof(VO_DEV_ID) / sizeof(VO_DEV_ID[0]); ++i){ //DVR_ASSERT(HI_MPI_VO_SetDispBufLen(nDev, MAX_CAM_CH)); DVR_ASSERT(HI_MPI_VO_SetVideoLayerAttr(VO_DEV_ID[i], &astVideoLayerAttr[i])); DVR_ASSERT(HI_MPI_VO_EnableVideoLayer(VO_DEV_ID[i])); // setup division video_Division(VO_DEV_ID[i], s_stVideo.nScrWidth[i], s_stVideo.nScrHeight[i], VIDEO_GetMaxDiv(), 0, FALSE); // 1 - 16 digital zoom // 17 - 20 bind directly // 21 - 24 bind directly VO_DISPLAY_FIELD_E enDisplayField; // enable vo channel for(ii = 0; ii < VIDEO_GetMaxDiv() + 1; ++ii){ if(ii < 16){ // for vi0 1-16 // digital zoom VO_ZOOM_ATTR_S stZoomAttr; memset(&stZoomAttr, 0, sizeof(stZoomAttr)); stZoomAttr.enField = VIDEO_FIELD_FRAME; stZoomAttr.stZoomRect.u32Width = VI_CIF_WIDTH; stZoomAttr.stZoomRect.u32Height = VI_CIF_HEIGHT; stZoomAttr.stZoomRect.s32X = 0; stZoomAttr.stZoomRect.s32Y = (ii % 8) * (stZoomAttr.stZoomRect.u32Height + 2); VIDEO_TRACE("ch=%d zoom [%d,%d,%d,%d]", ii, stZoomAttr.stZoomRect.s32X, stZoomAttr.stZoomRect.s32Y, stZoomAttr.stZoomRect.u32Width, stZoomAttr.stZoomRect.u32Height); DVR_ASSERT(HI_MPI_VO_SetZoomInWindow(VO_DEV_ID[i], ii, &stZoomAttr)); enDisplayField = (ii >= 8) ? VO_FIELD_TOP : VO_FIELD_BOTTOM; }else if(ii < 20){ // for vi2 ch1-4 enDisplayField = VO_FIELD_BOTTOM; }else if(ii < 24){ // for vi3 ch1-4 enDisplayField = VO_FIELD_BOTTOM; }else if(24 == ii){ enDisplayField = VO_FIELD_BOTH; }else if(25 == ii){ // for ch1-16 d1 live enDisplayField = VO_FIELD_BOTH; } DVR_ASSERT(HI_MPI_VO_SetChnField(VO_DEV_ID[i], ii, enDisplayField)); DVR_ASSERT(HI_MPI_VO_EnableChn(VO_DEV_ID[i], ii)); if(ii < MAX_CAM_CH){ video_BindOutput(VO_DEV_ID[i], ii, TRUE); }else if(ii < SPECIAL_D1_CH){ DVR_ASSERT(HI_MPI_VO_SENDFRAME(VO_DEV_ID[i], ii, s_pstLogoPic)); } } } } s_stVideo.bOutput = TRUE; }