#define OSD_BUF_HEAP_SR_ID (0) AlgLink_OsdChWinParams g_osdChParam[ALG_LINK_OSD_MAX_CH]; AlgLink_OsdChBlindWinParams g_osdChBlindParam[ALG_LINK_OSD_MAX_CH]; CaptureLink_BlindInfo g_blindAreaChParam[CAPTURE_LINK_MAX_CH_PER_OUT_QUE]; static UInt8 *osdBufBaseVirtAddr = NULL; static UInt32 osdTotalBufSize = 0; static OSA_ThrHndl osd_task; static int osd_thread_exit_flag = FALSE; static void *osd_capture_process(void); static Vsys_AllocBufInfo bufInfo; static UInt32 osdBufSize, osdBufSizeY, bufAlign; static Bool camera_info; int osd_capture_Init(int numCh) { int chId; int winId; int status; UInt32 bufOffset; FUNCTION_ENTRY_LOG(); if( vsysParams.enableOsd == FALSE ) /* OSD in VCAP subsystem enabled ? */ { LOG(LOG_ERR, "%s: Capture OSD not enabled!",__FUNCTION__); return(-1); } if( (numCh <= 0) || (numCh > ALG_LINK_OSD_MAX_CH) ) /* Valid number of channels ? Note: We only use 16 channels */ { LOG(LOG_ERR, "%s: Invalid channel number!",__FUNCTION__); return(-1); } osdBufSizeY = OSD_WIN_PITCH * OSD_WIN_HEIGHT; osdBufSize = osdBufSizeY * 2 ; osdTotalBufSize = osdBufSize * numCh * OSD_NUM_WINDOWS; bufAlign = 128; status = Vsys_allocBuf(OSD_BUF_HEAP_SR_ID, osdTotalBufSize, bufAlign, &bufInfo); if( status != OSA_SOK ) { LOG(LOG_ERR, "%s: Allocate buffer failed!",__FUNCTION__); return(-1); } osdBufBaseVirtAddr = bufInfo.virtAddr; for(chId = 0; chId < numCh; chId++) { AlgLink_OsdChWinParams* chWinPrm = &g_osdChParam[chId]; // AlgLink_OsdChBlindWinParams* chBlindWinPrm = &g_osdChBlindParam[chId]; chWinPrm->chId = chId; chWinPrm->numWindows = OSD_NUM_WINDOWS; chWinPrm->colorKey[0] = 0xfa; /* Y */ chWinPrm->colorKey[1] = 0x7d; /* U */ chWinPrm->colorKey[2] = 0x7e; /* V */ // chBlindWinPrm->chId = chId; // chBlindWinPrm->numWindows = OSD_NUM_WINDOWS; for(winId=0; winId < chWinPrm->numWindows; winId++) { /* Setup constant position of capture side OSD window */ chWinPrm->winPrm[winId].startX = OSD_WIN0_STARTX; chWinPrm->winPrm[winId].startY = OSD_WIN0_STARTY; chWinPrm->winPrm[winId].width = OSD_WIN_WIDTH; chWinPrm->winPrm[winId].height = OSD_WIN_HEIGHT; chWinPrm->winPrm[winId].lineOffset = OSD_WIN_PITCH; chWinPrm->winPrm[winId].globalAlpha = 30; chWinPrm->winPrm[winId].transperencyEnable = OSD_TRANSPARENCY; chWinPrm->winPrm[winId].enableWin = OSD_ENABLE_WIN; chWinPrm->winPrm[winId].format = SYSTEM_DF_YUV422I_YUYV; chWinPrm->winPrm[winId].addr[0][1] = NULL; bufOffset = osdBufSize * chId; chWinPrm->winPrm[winId].addr[0][0] = (bufInfo.physAddr + bufOffset); /* Setup constant position of blind area */ // chBlindWinPrm->winPrm[winId].startX = OSD_WIN0_STARTX; // chBlindWinPrm->winPrm[winId].startY = OSD_WIN0_STARTY; // chBlindWinPrm->winPrm[winId].width = OSD_WIN_WIDTH; // chBlindWinPrm->winPrm[winId].height = OSD_WIN_HEIGHT; // chBlindWinPrm->winPrm[winId].fillColorYUYV = 0x80008000; // chBlindWinPrm->winPrm[winId].enableWin = OSD_ENABLE_WIN; } } CFONT_Initalize(); OSA_thrCreate(&osd_task, (OSA_ThrEntryFunc)osd_capture_process, OSA_THR_PRI_DEFAULT, OSA_THR_STACK_SIZE_DEFAULT, NULL); camera_info = TRUE; FUNCTION_EXIT_LOG(); return(status); } void osd_capture_Deinit(void) { FUNCTION_ENTRY_LOG(); osd_thread_exit_flag = TRUE; OSA_thrDelete(&osd_task); if(osdBufBaseVirtAddr != NULL) { Vsys_freeBuf(OSD_BUF_HEAP_SR_ID, osdBufBaseVirtAddr, osdTotalBufSize); } FUNCTION_EXIT_LOG(); } static void *osd_capture_process(void) { UInt8 *curVirtAddr = NULL; char string_buffer[CFONT_MAX_STRING_LENGTH]; int chId; int winId; UInt32 bufOffset; unsigned short string_width; #define LEFT 36 FUNCTION_ENTRY_LOG(); memset((char*)&string_buffer,0,sizeof(string_buffer)); while (osd_thread_exit_flag != TRUE) { time_t now = time(NULL); struct tm *time = localtime(&now); for(chId = 0; chId < VCAP_CHN_MAX; chId++) { AlgLink_OsdChWinParams * chWinPrm = &g_osdChParam[chId]; chWinPrm->chId = chId; chWinPrm->numWindows = OSD_NUM_WINDOWS; winId = 0; /* We use only one window per channel */ bufOffset = osdBufSize * chId; chWinPrm->winPrm[winId].addr[0][0] = (bufInfo.physAddr + bufOffset); curVirtAddr = bufInfo.virtAddr + bufOffset; if(camera_info) { YUV_SetupBackground(C_OSD_WIDTH, C_OSD_HEIGHT, YUV422_COLOR_WHITE); YUV_DrawBitmap((unsigned char*) &camera_32x32_yuv, 0, 0, 32, 32); /* Draw channel # */ sprintf((char*)&string_buffer,"#%d", chId + 1); string_width = CFONT_GetStringWidth((char*)&string_buffer, CFONT_SIZE_NORMAL); CFONT_DrawString((char*)&string_buffer, LEFT, 2, YUV422_COLOR_BLACK, CFONT_SIZE_NORMAL); /* Draw date and time */ sprintf((char*)&string_buffer,"%02d.%02d.%d %02d:%02d:%02d", time->tm_mday, time->tm_mon + 1, time->tm_year - 100, time->tm_hour, time->tm_min, time->tm_sec); CFONT_DrawString((char*)&string_buffer, LEFT + 8 + string_width, 2, YUV422_COLOR_BLACK, CFONT_SIZE_NORMAL); } memcpy(curVirtAddr, &osd_capture_buffer, OSD_WIN_WIDTH * OSD_WIN_HEIGHT * sizeof(unsigned short)); } OSA_waitMsecs(1000); /* Refresh capture side OSD windows every second */ } FUNCTION_EXIT_LOG(); return(NULL); } int osd_capture_show_camera_info(Bool enable) { camera_info = enable; /* Flush last content */ OSA_waitMsecs(100); YUV_SetupBackground(C_OSD_WIDTH, C_OSD_HEIGHT, YUV422_COLOR_WHITE); return(0); }