static void video_DisplayD1(int nVoDev, int nChn, unsigned char bDisplay) { int i = 0, ii = 0; static int s_nDispViDev = -1; static int s_nDispViChn = -1; VI_CHN_ATTR_S stViChnAttr; if(bDisplay){ for(i = 0; i < VIDEO_GetMaxDiv(); ++i){ DVR_ASSERT(HI_MPI_VO_ChnHide(nVoDev, i)); } } if(bDisplay){ // unbind last full channel first if(!(-1 == s_nDispViDev && -1 == s_nDispViChn)){ DVR_ASSERT(HI_MPI_VI_UnBindOutput(s_nDispViDev, s_nDispViChn, nVoDev, SPECIAL_D1_CH)); } DVR_ASSERT(HI_MPI_VO_ClearChnBuffer(nVoDev, SPECIAL_D1_CH, HI_TRUE)); if(nChn < 16){ int fd = open(VIDEO_DEV, O_RDWR); if(fd > 0){ // set ad configuration video_preview_t stPreview = {0}; stPreview.chn = nChn; // switch to this channel @ ad ioctl(fd, VIDEO_DRV_SET_LIVE_CHN, &stPreview); close(fd); fd = -1; } // redefine device s_nDispViDev = 1; s_nDispViChn = 0; }else if(nChn < 24){ // reset field to both not downscale if(0 == VIMAP_Get(nChn, &s_nDispViDev, &s_nDispViChn)){ } }else{ ; } if(s_stVideo.nLossStat & (1<<nChn)){ // VIDEO_TRACE("Send User Pic"); DVR_ASSERT(HI_MPI_VO_SENDFRAME(nVoDev, SPECIAL_D1_CH, VIDEO_GetUserPic(nChn))); }else{ DVR_ASSERT(HI_MPI_VI_GetChnAttr(s_nDispViDev, s_nDispViChn, &stViChnAttr)); VI_D1_ATTR_CONF(&stViChnAttr); DVR_ASSERT(HI_MPI_VI_SetChnAttr(s_nDispViDev, s_nDispViChn, &stViChnAttr)); DVR_ASSERT(HI_MPI_VI_BindOutput(s_nDispViDev, s_nDispViChn, nVoDev, SPECIAL_D1_CH)); usleep(40000); } DVR_ASSERT(HI_MPI_VO_ChnShow(nVoDev, SPECIAL_D1_CH)); }else{ if(!(-1 == s_nDispViDev && -1 == s_nDispViChn)){ DVR_ASSERT(HI_MPI_VI_GetChnAttr(s_nDispViDev, s_nDispViChn, &stViChnAttr)); VI_CIF_ATTR_CONF(&stViChnAttr); DVR_ASSERT(HI_MPI_VI_SetChnAttr(s_nDispViDev, s_nDispViChn, &stViChnAttr)); DVR_ASSERT(HI_MPI_VI_UnBindOutput(s_nDispViDev, s_nDispViChn, nVoDev, SPECIAL_D1_CH)); DVR_ASSERT(HI_MPI_VO_ChnHide(nVoDev, SPECIAL_D1_CH)); if(nVoDev > 0){ s_nDispViDev = -1; s_nDispViChn = -1; } } } }
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], -1, 0, FALSE); // enable vo channel for(ii = 0; ii < VIDEO_GetMaxDiv(); ++ii){ DVR_ASSERT(HI_MPI_VO_SetChnField(VO_DEV_ID[i], ii, VO_FIELD_BOTTOM)); 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{ DVR_ASSERT(HI_MPI_VO_SENDFRAME(VO_DEV_ID[i], ii, s_pstLogoPic)); } } } } s_stVideo.bOutput = TRUE; }