#include #include #include "PrjInc.h" #include "MovieStamp.h" #include "MovieStampAPI.h" #include "Utility/SwTimer.h" #include "kwrap/type.h" #include #include "FontConv/FontConv.h" //#include "DateStampFontTbl36x60.h" //#include "DateStampFontTbl10x16.h" //#include "DateStampFontTbl12x20.h" //#include "DateStampFontTbl18x30.h" //#include "DateStampFontTbl20x44.h" //#include "DateStampFontTbl26x44.h" #include "ImageApp/ImageApp_MovieMulti.h" #include "vf_gfx.h" #include "GxTime.h" #if MOVIE_ISP_LOG #include "vendor_isp.h" #if HUNTING_CAMERA_MCU == ENABLE #include "sf_mcu.h" #endif #endif //#NT#2016/10/17#Bin Xiao -end #define __MODULE__ MovieStamp #define __DBGLVL__ 2 // 0=FATAL, 1=ERR, 2=WRN, 3=UNIT, 4=FUNC, 5=IND, 6=MSG, 7=VALUE, 8=USER #define __DBGFLT__ "*" //*=All, [mark]=CustomClass #include #define COLOR_ID_BG 0 #define COLOR_ID_FR 1 #define COLOR_ID_FG 2 #define STAMP_WIDTH_TOLERANCE 8 // total font width error tolerance #define STAMP_LOGO_GAP 8 // date stamp and water logo position gap #define VIDEO_IN_MAX 12//8//13//5 #define MOVIE_STAMP_MAX_LEN 256 #define VSFONT_BUF_RATIO (550) #define OSG_BUF_RATIO (400) #define VENC_OUT_PORTID_MAX (SENSOR_CAPS_COUNT*(2+1)+1) //variable declare static STAMP_POS g_MovieStampPos[VIDEO_IN_MAX] = {0}; #if defined (MOVIE_MULTISTAMP_FUNC) && (MOVIE_MULTISTAMP_FUNC == ENABLE) static UPOINT g_MovieGpsStampPos[VIDEO_IN_MAX] = {0}; #endif char g_cMovieStampStr[VIDEO_IN_MAX][MOVIE_STAMP_MAX_LEN]={0}; static UINT32 g_uiMovieStampSetup[VIDEO_IN_MAX] = { STAMP_OFF, STAMP_OFF, STAMP_OFF, STAMP_OFF, STAMP_OFF, STAMP_OFF, STAMP_OFF, STAMP_OFF, STAMP_OFF, STAMP_OFF, STAMP_OFF, STAMP_OFF, }; static STAMP_INFO g_MovieStampInfo[VIDEO_IN_MAX]; static struct tm g_CurDateTime; static UINT32 g_uiMovieStampYAddr[VIDEO_IN_MAX][2] = {0}; // movie stamp Y address (2 means double buffer) static UINT32 g_uiWaterLogoYAddr[VIDEO_IN_MAX] = {0}, g_uiWaterLogoUVAddr[VIDEO_IN_MAX] = {0}; static WATERLOGO_BUFFER g_MovieWaterInfo[VIDEO_IN_MAX] = {0}; static BOOL g_bWaterLogoEnable[VIDEO_IN_MAX] = {0}; static STAMP_ADDR_INFO g_MovieStampPoolAddr[VIDEO_IN_MAX]={0}; static UINT32 g_uiVsStampAddr[VIDEO_IN_MAX] = {0}; static UINT32 g_uiVsFontAddr[VIDEO_IN_MAX] = {0}; static UINT32 g_VsStampEn=FALSE; UINT32 g_VsOsdWidth[VIDEO_IN_MAX] = {0}; UINT32 g_VsOsdHight[VIDEO_IN_MAX] = {0}; static UINT32 g_uiVsStampSize[VIDEO_IN_MAX] = {0}; static UINT32 g_uiVsStampPa[VIDEO_IN_MAX] = {0}; static UINT32 g_uiVsFontSize[VIDEO_IN_MAX] = {0}; FONT_CONV_IN g_VsFontIn[VIDEO_IN_MAX]={0}; FONT_CONV_OUT g_VsFontOut[VIDEO_IN_MAX]={0}; UINT32 g_pVsFontDataAddr[VIDEO_IN_MAX]; static UINT32 g_VEncHDPathId[VENC_OUT_PORTID_MAX]={0}; //hd_videoenc_open(HD_STAMP_0), Encport diff--> date stamp: main , clone, rawenc, wifi, 0, 1, 2, 3. sen1:main/clone 0,1, rawenc 5; sen2:main/clone 2,3 , rawenc 5, wifi 4 #if defined (WATERLOGO_FUNCTION) && (WATERLOGO_FUNCTION == ENABLE) static UINT32 g_WaterlogoVEncHDPathId[VENC_OUT_PORTID_MAX]={0}; //hd_videoenc_open(HD_STAMP_1), Encport diff--> waterlogo: main , clone, rawenc, wifi, 0, 1, 2, 3 #endif static HD_DIM g_ImageSize[VIDEO_IN_MAX] = {0}; static STAMP_ADDR_INFO combined_stamp_addr[VIDEO_IN_MAX] = {0}; static STAMP_ADDR_INFO water_logo_addr[VIDEO_IN_MAX] = {0}; //date(HD_STAMP_0) //waterlogo(HD_STAMP_1) //multistamp1(HD_STAMP_2), multistamp2 (HD_STAMP_3), multistamp3 (HD_STAMP_4), multistamp4 (HD_STAMP_5), multistamp5 (HD_STAMP_6) //multiewaterlogo1(HD_STAMP_7), multiwaterlogo2 (HD_STAMP_8), multiwaterlogo3 (HD_STAMP_9), multiwaterlogo4 (HD_STAMP_10), multiwaterlogo5 (HD_STAMP_11) #define VSSTAMP_MAX_VIDEOENC_PATH 12// 4 #define VSSTAMP_DATE_HD_STAMP_ID (HD_STAMP_0) #define VSSTAMP_WATERLOGO_HD_STAMP_ID (HD_STAMP_1) #define VSSTAMP_MULTISTAMP_HD_STAMP_ID (HD_STAMP_2) #define VSSTAMP_MULTIWATERLOGO_HD_STAMP_ID (HD_STAMP_6) static UINT32 g_VsStampStart[VENC_OUT_PORTID_MAX][VSSTAMP_MAX_VIDEOENC_PATH]={0}; //date stamp, main , clone, rawenc , wifi , 0, 1, 2, 3 static UINT32 isUI_GfxInitLiteOpened = FALSE; static STAMP_ADDR_INFO g_GfxInitPoolAddr={0}; //static BOOL g_bMovieStampSwTimerOpen = FALSE; //static SWTIMER_ID g_MovieStampSwTimerID; //IC HW limitation #if defined(_BSP_NA51055_) #define MOVIE_STAMP_MAX_REGION_PER_LAYER 16 #define MOVIE_STAMP_MAX_LAYER 2 #define MOVIE_STAMP_LAYER1 0 #define MOVIE_STAMP_LAYER2 1 #elif defined(_BSP_NA51089_) #define MOVIE_STAMP_MAX_REGION_PER_LAYER 10 #define MOVIE_STAMP_MAX_LAYER 1 #define MOVIE_STAMP_LAYER1 0 #define MOVIE_STAMP_LAYER2 0 #endif #define MOVIE_MULTI_STAMP_CNT_MAX 3 #define MOVIE_MULTI_WATERLOGO_CNT_MAX 5 #if((2+MOVIE_MULTI_STAMP_CNT_MAX + MOVIE_MULTI_WATERLOGO_CNT_MAX) >(MOVIE_STAMP_MAX_REGION_PER_LAYER*MOVIE_STAMP_MAX_LAYER)) // 2 = date + normal waterlogo #error "total stamp count is overflow" #endif #if defined (MOVIE_MULTIWATERLOGO_FUNC) && (MOVIE_MULTIWATERLOGO_FUNC == ENABLE) static WATERLOGO_BUFFER g_sMultiWaterLogo[VIDEO_IN_MAX][MOVIE_MULTI_WATERLOGO_CNT_MAX]; #endif #define VS_DATESTAMP_REGION (MOVIE_STAMP_MAX_REGION_PER_LAYER -1 ) #define VS_WATERLOGO_REGION (VS_DATESTAMP_REGION -1) #define VS_MULTISTAMP_REGION (VS_WATERLOGO_REGION- MOVIE_MULTI_STAMP_CNT_MAX) #define VS_MULTIWATERLOGO_REGION (VS_MULTISTAMP_REGION- MOVIE_MULTI_WATERLOGO_CNT_MAX) #if defined(_UI_STYLE_LVGL_) #include "UIApp/lv_user_font_conv/lv_user_font_conv.h" #define LV_USER_FONT_CONV_ALIGN_W 8 #define LV_USER_FONT_CONV_ALIGN_H 2 static inline uint32_t lv_color4444_to32(lv_user_color4444_t color) { lv_color32_t ret; LV_COLOR_SET_R32(ret, LV_USER_COLOR_GET_R16(color) * 17); /*(2^8 - 1)/(2^4 - 1) = 255/15 = 17*/ LV_COLOR_SET_G32(ret, LV_USER_COLOR_GET_G16(color) * 17); /*(2^8 - 1)/(2^4 - 1) = 255/15 = 17*/ LV_COLOR_SET_B32(ret, LV_USER_COLOR_GET_B16(color) * 17); /*(2^8 - 1)/(2^4 - 1) = 255/15 = 17*/ LV_COLOR_SET_A32(ret, LV_USER_COLOR_GET_A16(color) * 17); /*(2^8 - 1)/(2^4 - 1) = 255/15 = 17*/ return ret.full; } static ISIZE MovieStamp_GetStampDataWidth_LVGL(PSTAMP_INFO pStampInfo, const lv_font_t *pFont); static void _movie_stamp_lv_cfg_init(lv_user_font_conv_draw_cfg *draw_cfg) { lv_user_font_conv_draw_cfg_init(draw_cfg); draw_cfg->fmt = HD_VIDEO_PXLFMT_ARGB4444; draw_cfg->radius = LV_USER_CFG_STAMP_RADIUS; draw_cfg->string.align = LV_USER_CFG_STAMP_TEXT_ALIGN; draw_cfg->string.letter_space = LV_USER_CFG_STAMP_LETTER_SPACE; draw_cfg->ext_w = LV_USER_CFG_STAMP_EXT_WIDTH; draw_cfg->ext_h = LV_USER_CFG_STAMP_EXT_HEIGHT; draw_cfg->border.width = LV_USER_CFG_STAMP_BORDER_WIDTH; } static ER FontConv_LVGL(FONT_CONV_IN *pIn, FONT_CONV_OUT *pOut) { HD_RESULT r; lv_user_font_conv_draw_cfg draw_cfg = {0}; lv_user_font_conv_mem_cfg mem_cfg = {0}; lv_user_font_conv_calc_buffer_size_result result = {0}; lv_user_color4444_t color4444; lv_color32_t color32; _movie_stamp_lv_cfg_init(&draw_cfg); if(draw_cfg.fmt != pIn->Format){ DBG_ERR("Unexpected pIn->Format(%lx), it's supposed to be %lx\r\n", pIn->Format, draw_cfg.fmt); return -1; } draw_cfg.fmt = pIn->Format; draw_cfg.string.font = (lv_font_t *) pIn->pFont; draw_cfg.string.text = pIn->pStr; draw_cfg.align_w = LV_USER_FONT_CONV_ALIGN_W; draw_cfg.align_h = LV_USER_FONT_CONV_ALIGN_H; draw_cfg.string.align = LV_USER_CFG_STAMP_TEXT_ALIGN; /************************************************ * Color setting convertion flow * lv user format argb4444 -> lv format 8888 -> lv format by LV_COLOR_DEPTH (332 or 8888) ************************************************/ /* text color */ color4444.full = pIn->ciSolid; color32.full = lv_color4444_to32(color4444); draw_cfg.string.color = LV_COLOR_MAKE(color32.ch.red, color32.ch.green, color32.ch.blue); draw_cfg.string.opa = LV_COLOR_GET_A32(color32); /* bg color */ color4444.full = pIn->ciTransparet; color32.full = lv_color4444_to32(color4444); draw_cfg.bg.color = LV_COLOR_MAKE(color32.ch.red, color32.ch.green, color32.ch.blue); draw_cfg.bg.opa = LV_COLOR_GET_A32(color32); /* border color */ color4444.full = pIn->ciFrame; color32.full = lv_color4444_to32(color4444); draw_cfg.border.color = LV_COLOR_MAKE(color32.ch.red, color32.ch.green, color32.ch.blue); draw_cfg.border.opa = LV_COLOR_GET_A32(color32); draw_cfg.border.width = LV_USER_CFG_STAMP_BORDER_WIDTH; mem_cfg.output_buffer = (void*)pIn->MemAddr; mem_cfg.output_buffer_size = pIn->MemSize; lv_user_font_conv_calc_buffer_size(&draw_cfg, &result); lv_user_font_conv(&draw_cfg, &mem_cfg); UINT32 LineOffs = result.width * (float)(result.bpp / 8); UINT32 PxlAddrs = (UINT32) mem_cfg.output_buffer; /* osg needs virtual address not physical address */ r = vf_init_ex(&pOut->GenImg, result.width, result.height, pIn->Format, &LineOffs, &PxlAddrs); if (r != HD_OK) { DBG_ERR("vf_init_ex failed %d\r\n",r); } return 0; } static ISIZE MovieStamp_GetStampDataWidth_LVGL(PSTAMP_INFO pStampInfo, const lv_font_t *pFont) { ISIZE FontSize={0}; lv_user_font_conv_draw_cfg draw_cfg = {0}; lv_user_font_conv_calc_buffer_size_result result = {0}; _movie_stamp_lv_cfg_init(&draw_cfg); draw_cfg.string.font = (lv_font_t *)pFont; draw_cfg.string.text = pStampInfo->pi8Str; draw_cfg.align_w = LV_USER_FONT_CONV_ALIGN_W; draw_cfg.align_h = LV_USER_FONT_CONV_ALIGN_H; lv_user_font_conv_calc_buffer_size(&draw_cfg, &result); FontSize.w = result.width; FontSize.h = result.height; return FontSize;//uiDataWidth; } #else #include "DateStampFontTbl36x60.h" #include "DateStampFontTbl10x16.h" #include "DateStampFontTbl12x20.h" #include "DateStampFontTbl18x30.h" #include "DateStampFontTbl20x44.h" #include "DateStampFontTbl26x44.h" static ISIZE MovieStamp_GetStampDataWidth(PSTAMP_INFO pStampInfo, const IMAGE_TABLE *pTable); ISIZE MovieStamp_GetStampDataWidth(PSTAMP_INFO pStampInfo, const IMAGE_TABLE *pTable) { UINT32 i; UINT32 uiStrLen; UINT32 uiDataWidth; UINT32 uiIconID; ISIZE FontSize={0}; uiStrLen = strlen(pStampInfo->pi8Str); uiDataWidth = 0; for (i = 0; i < uiStrLen; i++) { //get icon database uiIconID = pStampInfo->pi8Str[i]; IMAGE_GetSizeFromTable(pTable, uiIconID, &FontSize); uiDataWidth += FontSize.w; } FontSize.w=uiDataWidth; return FontSize;//uiDataWidth; } #endif #if MOVIE_ISP_LOG static void MovieStamp_get_isp_status(UINT32 id, char* Buf, UINT32 BufLen) { AET_STATUS_INFO ae_status = {0}; AWBT_STATUS awb_status = {0}; IQT_WDR_PARAM wdr = {0}; //sf_mcu_power_on_para_get(SF_MCU_POWERON); UINT16 AD_Value; #if HUNTING_CAMERA_MCU == ENABLE AD_Value = sf_get_irshtter(); #else AD_Value = 0; #endif id = 0; ae_status.id = id; vendor_isp_get_ae(AET_ITEM_STATUS, &ae_status); awb_status.id = id; vendor_isp_get_awb(AWBT_ITEM_STATUS, &awb_status); wdr.id = id; vendor_isp_get_iq(IQT_ITEM_WDR_PARAM, &wdr); snprintf(Buf, BufLen, "%d %3d %3d %3d %6d %6d %3d %3d %d %3d %3d %4d %d\0", ae_status.status_info.state_adj, ae_status.status_info.lv/100000, ae_status.status_info.lum, ae_status.status_info.expect_lum, ae_status.status_info.expotime[0], ae_status.status_info.iso_gain[0], ae_status.status_info.overexp_adj, ae_status.status_info.overexp_cnt, wdr.wdr.enable, awb_status.status.cur_r_gain, awb_status.status.cur_b_gain, awb_status.status.cur_ct, AD_Value ); //DBG_DUMP("isp Buf=%s\r\n",Buf); return; } #endif UINT32 MovieStamp_TriggerUpdateChk(void) { struct tm CurDateTime; GxTime_GetTime(&CurDateTime); // check time varying if ((g_CurDateTime.tm_sec != CurDateTime.tm_sec) || (g_CurDateTime.tm_min != CurDateTime.tm_min) || (g_CurDateTime.tm_hour != CurDateTime.tm_hour) || (g_CurDateTime.tm_mday != CurDateTime.tm_mday) || (g_CurDateTime.tm_mon != CurDateTime.tm_mon) || (g_CurDateTime.tm_year != CurDateTime.tm_year)) { g_CurDateTime = CurDateTime; // time varied, update stamp database return 1; } return 0; } #if 0 void MovieStamp_SwTimerHdl(UINT32 uiEvent) { MovieStampTsk_TrigUpdate(); } static void MovieStamp_SwTimerOpen(void) { if (g_bMovieStampSwTimerOpen == FALSE) { if (SwTimer_Open(&g_MovieStampSwTimerID, MovieStamp_SwTimerHdl) != E_OK) { DBG_ERR("Sw timer open failed!\r\n"); return; } SwTimer_Cfg(g_MovieStampSwTimerID, MOVIE_STAMP_CHK_TIME, SWTIMER_MODE_FREE_RUN); SwTimer_Start(g_MovieStampSwTimerID); g_bMovieStampSwTimerOpen = TRUE; } } static void MovieStamp_SwTimerClose(void) { if (g_bMovieStampSwTimerOpen) { SwTimer_Stop(g_MovieStampSwTimerID); SwTimer_Close(g_MovieStampSwTimerID); g_bMovieStampSwTimerOpen = FALSE; } } #else static void MovieStamp_TimerOpen(void) { SxTimer_SetFuncActive(SX_TIMER_DET_MOVIESTAMP_ID, TRUE); } static void MovieStamp_TimerClose(void) { SxTimer_SetFuncActive(SX_TIMER_DET_MOVIESTAMP_ID, FALSE); } #endif void MovieStamp_Enable(void) { struct tm CurDateTime; GxTime_GetTime(&CurDateTime); g_CurDateTime = CurDateTime; MovieStamp_UpdateData(); // register movie stamp update callback MovieStampTsk_RegUpdateCB(MovieStamp_UpdateData); MovieStampTsk_RegTrigUpdateChkCB(MovieStamp_TriggerUpdateChk); // open movie stamp task to wait for stamp update flag MovieStampTsk_Open(); // use SW timer to check current time MovieStamp_TimerOpen(); } void MovieStamp_Disable(void) { UINT32 i; // close SW timer MovieStamp_TimerClose(); // close movie stamp task #if defined(_UI_STYLE_LVGL_) /***************************************************************************** * MovieStampTsk_Close might cause deadlock if invoked by ui task * * UI task: * 1. lock -> ui flow * 2. wait movie stamp task idle (stuck in here) * 3. unlock * * MovieStamp task: * 1. busy * 2. lock (stuck in here) * 3. idle * * lv_user_task_handler_temp_release will unlock temporarily until MovieStampTsk_Close finished ****************************************************************************/ lv_user_task_handler_temp_release(MovieStampTsk_Close); #else MovieStampTsk_Close(); #endif MovieStamp_VsClose(); for (i = 0; i < VIDEO_IN_MAX; i++) { MovieStamp_Setup( i, STAMP_OFF, 0, 0, NULL); } } //------------------------------------------------------------------------------------------------- void MovieStamp_Setup(UINT32 uiVEncOutPortId, UINT32 uiFlag, UINT32 uiImageWidth, UINT32 uiImageHeight, WATERLOGO_BUFFER *pWaterLogoBuf) { PSTAMP_INFO pStampInfo; UINT32 uiIconID; ISIZE FontSize; #if MOVIE_ISP_LOG UINT16 i=0; for(i=0;ivedio[%d*%d] logo w*h [%d*%d]\n",__func__,__LINE__,uiImageWidth,uiImageHeight,pWaterLogoBuf->uiWidth,pWaterLogoBuf->uiHeight); #endif pStampInfo = &g_MovieStampInfo[uiVEncOutPortId]; pStampInfo->pi8Str = &g_cMovieStampStr[uiVEncOutPortId][0]; /************************************** 1.choice front data source; 2.scale water logo width and height ***************************************/ // set date stamp font data base #if defined(_UI_STYLE_LVGL_) lv_plugin_res_id red_id; // switch (uiImageWidth) { // case 3840: // 3840x2160 // case 2880: // 2880x2160 (DAR 16:9) // red_id = LV_USER_CFG_STAMP_FONT_ID_XXL; // break; // // // case 2592: // 2592x1944 // case 2560: // 2560x1440 // case 2304: // 2304x1296 // red_id = LV_USER_CFG_STAMP_FONT_ID_XL; // break; // // case 1920: // 1920x1080 // case 1536: // 1536x1536 // case 1728: // 1728x1296 (DAR 16:9) // case 1440: // 1440x1080 (DAR 16:9) // case 1280: // 1280x720 // red_id = LV_USER_CFG_STAMP_FONT_ID_LARGE; // break; // // case 848: //848*480 wifi // case 640: // VGA & others // red_id = LV_USER_CFG_STAMP_FONT_ID_MEDIUM; // break; // // case 320: // QVGA // red_id = LV_USER_CFG_STAMP_FONT_ID_SMALL; // break; // // default: // VGA & others // red_id = LV_USER_CFG_STAMP_FONT_ID_MEDIUM; // break; // } if (uiImageWidth >= 4608) { red_id = LV_USER_CFG_STAMP_FONT_ID_16M; } else if(uiImageWidth >= 4032) { red_id = LV_USER_CFG_STAMP_FONT_ID_12M; } else if(uiImageWidth >= 3264) { red_id = LV_USER_CFG_STAMP_FONT_ID_8M; } else if(uiImageWidth >= 1920) { red_id = LV_USER_CFG_STAMP_FONT_ID_LARGE; } else if(uiImageWidth >= 1080) { red_id = LV_USER_CFG_STAMP_FONT_ID_MEDIUM; } else if(uiImageWidth >= 1024) { red_id = LV_USER_CFG_STAMP_FONT_ID_SMALL_PIC; } else if(uiImageWidth >= 640) { red_id = LV_USER_CFG_STAMP_FONT_ID_SMALL; } else { red_id = LV_USER_CFG_STAMP_FONT_ID_XS; } #if MOVIE_ISP_LOG red_id = LV_USER_CFG_STAMP_FONT_ID_MEDIUM; #endif g_VsFontIn[uiVEncOutPortId].pFont=(FONT *) lv_plugin_get_font(red_id)->font; #else switch (uiImageWidth) { case 3840: // 3840x2160 g_VsFontIn[uiVEncOutPortId].pFont=(FONT *)gDateStampFontTbl26x44; break; case 2592: // 2592x1944 case 2560: // 2560x1440 case 2304: // 2304x1296 case 1920: // 1920x1080 case 1536: // 1536x1536 g_VsFontIn[uiVEncOutPortId].pFont=(FONT *)gDateStampFontTbl26x44; break; case 2880: // 2880x2160 (DAR 16:9) case 1728: // 1728x1296 (DAR 16:9) case 1440: // 1440x1080 (DAR 16:9) g_VsFontIn[uiVEncOutPortId].pFont=(FONT *)gDateStampFontTbl20x44; break; case 1280: // 1280x720 g_VsFontIn[uiVEncOutPortId].pFont=(FONT *)gDateStampFontTbl18x30; break; case 848: //848*480 wifi case 640: // VGA & others g_VsFontIn[uiVEncOutPortId].pFont=(FONT *)gDateStampFontTbl12x20; break; case 320: // QVGA g_VsFontIn[uiVEncOutPortId].pFont=(FONT *)gDateStampFontTbl10x16; break; default: // VGA & others g_VsFontIn[uiVEncOutPortId].pFont=(FONT *)gDateStampFontTbl12x20; break; } #if MOVIE_ISP_LOG g_VsFontIn[uiVEncOutPortId].pFont=(FONT *)gDateStampFontTbl12x20; #endif #endif /* do water logo scaling*/ #if defined (WATERLOGO_FUNCTION) && (WATERLOGO_FUNCTION == ENABLE) { if (g_bWaterLogoEnable[uiVEncOutPortId]) { g_MovieWaterInfo[uiVEncOutPortId].uiWidth = ALIGN_CEIL_8(pWaterLogoBuf->uiWidth); g_MovieWaterInfo[uiVEncOutPortId].uiHeight = ALIGN_CEIL_4(pWaterLogoBuf->uiHeight); } } #endif // set stamp string (for calculating stamp position) switch (uiFlag & STAMP_DATE_TIME_MASK) { case STAMP_DATE_TIME_AMPM: //sprintf(pStampInfo->pi8Str, "0000/00/00 00:00:00 AM"); snprintf(pStampInfo->pi8Str, MOVIE_STAMP_MAX_LEN, "0000/00/00 00:00:00 AM"); break; case STAMP_DATE: // date only is not suitable for movie stamp (it's suitable for still image stamp) case STAMP_TIME: //sprintf(pStampInfo->pi8Str, "00:00:00"); snprintf(pStampInfo->pi8Str, MOVIE_STAMP_MAX_LEN, "00:00:00"); break; case STAMP_DATE_TIME: default: snprintf(pStampInfo->pi8Str, MOVIE_STAMP_MAX_LEN, "0000/00/00 00:00:00"); break; } #if MOVIE_ISP_LOG UINT16 Ipl_id=0; UINT16 log_id=0; vendor_isp_init(); Ipl_id=ImageApp_MovieMulti_VePort2Imglink(uiVEncOutPortId); //DBG_DUMP("setup Ipl_id=%d\r\n",Ipl_id); if(Ipl_id<0xff){ if(Ipl_id==1){ log_id=1; }else{ log_id=0; } MovieStamp_get_isp_status(log_id, &g_cMovieStampStr[uiVEncOutPortId][0], 256); } #endif #if defined(_UI_STYLE_LVGL_) LV_UNUSED(FontSize); LV_UNUSED(uiIconID); ISIZE sz = MovieStamp_GetStampDataWidth_LVGL(pStampInfo, (const lv_font_t *)g_VsFontIn[uiVEncOutPortId].pFont); pStampInfo->ui32FontWidth = sz.w / strlen(pStampInfo->pi8Str); pStampInfo->ui32FontHeight = sz.h; DBG_DUMP("pStampInfo = {%u, %u}\r\n", pStampInfo->ui32FontWidth, pStampInfo->ui32FontHeight); #else uiIconID = pStampInfo->pi8Str[0]; // 1st font DBG_DUMP("[%d]##############uiIconID=%d, pi8Str=%s\n",uiVEncOutPortId,uiIconID,pStampInfo->pi8Str); RESULT ret; if((ret=IMAGE_GetSizeFromTable((const IMAGE_TABLE *)g_VsFontIn[uiVEncOutPortId].pFont, uiIconID, &FontSize))==0){ pStampInfo->ui32FontWidth = FontSize.w; pStampInfo->ui32FontHeight = FontSize.h; }else{ DBG_ERR("IMAGE_GetSizeFromTable ,ret=%d\n",ret); return; } #endif pStampInfo->ui32DstHeight = pStampInfo->ui32FontHeight; // no scaling //printf("%s[%d]----------------> w*h[%d*%d]\n",__func__,__LINE__,FontSize.w,FontSize.h); UINT32 uiStampWidth=0;// = (pStampInfo->ui32DstHeight * pStampInfo->ui32FontWidth) / pStampInfo->ui32FontHeight; // Set date stamp position if ((uiFlag & STAMP_OPERATION_MASK) == STAMP_AUTO) { //UINT32 uiStampWidth=0;// = (pStampInfo->ui32DstHeight * pStampInfo->ui32FontWidth) / pStampInfo->ui32FontHeight; if(pStampInfo->ui32FontHeight){ uiStampWidth = (pStampInfo->ui32DstHeight * pStampInfo->ui32FontWidth) / pStampInfo->ui32FontHeight; }else{ DBG_ERR("ui32FontHeight zero!\n"); return; } switch (uiFlag & STAMP_POSITION_MASK) { case STAMP_TOP_LEFT: if ((uiFlag & STAMP_POS_END_MASK) == STAMP_POS_END) { g_MovieStampPos[uiVEncOutPortId].uiX = 0; g_MovieStampPos[uiVEncOutPortId].uiY = 0; } else { g_MovieStampPos[uiVEncOutPortId].uiX = uiStampWidth; // 1 font width gap g_MovieStampPos[uiVEncOutPortId].uiY = pStampInfo->ui32DstHeight / 2; // 1/2 font height gap } #if defined (WATERLOGO_FUNCTION) && (WATERLOGO_FUNCTION == ENABLE) if (g_bWaterLogoEnable[uiVEncOutPortId]) { if (g_MovieWaterInfo[uiVEncOutPortId].uiXPos == WATERLOGO_AUTO_POS && g_MovieWaterInfo[uiVEncOutPortId].uiYPos == WATERLOGO_AUTO_POS) { g_MovieWaterInfo[uiVEncOutPortId].uiXPos = g_MovieStampPos[uiVEncOutPortId].uiX; g_MovieWaterInfo[uiVEncOutPortId].uiYPos = g_MovieStampPos[uiVEncOutPortId].uiY; g_MovieStampPos[uiVEncOutPortId].uiX += (g_MovieWaterInfo[uiVEncOutPortId].uiWidth + STAMP_LOGO_GAP); } } #endif break; case STAMP_TOP_RIGHT: if ((uiFlag & STAMP_POS_END_MASK) == STAMP_POS_END) { g_MovieStampPos[uiVEncOutPortId].uiX = uiImageWidth - uiStampWidth * strlen(pStampInfo->pi8Str) - STAMP_WIDTH_TOLERANCE; g_MovieStampPos[uiVEncOutPortId].uiY = 0; } else { g_MovieStampPos[uiVEncOutPortId].uiX = uiImageWidth - uiStampWidth * (strlen(pStampInfo->pi8Str) + 1); // 1 font width gap g_MovieStampPos[uiVEncOutPortId].uiY = pStampInfo->ui32DstHeight / 2; // 1/2 font height gap } #if defined (WATERLOGO_FUNCTION) && (WATERLOGO_FUNCTION == ENABLE) if (g_bWaterLogoEnable[uiVEncOutPortId]) { if (g_MovieWaterInfo[uiVEncOutPortId].uiXPos == WATERLOGO_AUTO_POS && g_MovieWaterInfo[uiVEncOutPortId].uiYPos == WATERLOGO_AUTO_POS) { g_MovieWaterInfo[uiVEncOutPortId].uiXPos = g_MovieStampPos[uiVEncOutPortId].uiX - g_MovieWaterInfo[uiVEncOutPortId].uiWidth - STAMP_LOGO_GAP; g_MovieWaterInfo[uiVEncOutPortId].uiYPos = g_MovieStampPos[uiVEncOutPortId].uiY; } } #endif break; case STAMP_BOTTOM_LEFT: if ((uiFlag & STAMP_POS_END_MASK) == STAMP_POS_END) { g_MovieStampPos[uiVEncOutPortId].uiX = 0; g_MovieStampPos[uiVEncOutPortId].uiY = uiImageHeight - pStampInfo->ui32DstHeight; } else { g_MovieStampPos[uiVEncOutPortId].uiX = uiStampWidth; // 1 font width gap g_MovieStampPos[uiVEncOutPortId].uiY = uiImageHeight - (pStampInfo->ui32DstHeight * 3) / 2; // 1/2 font height gap } #if defined (WATERLOGO_FUNCTION) && (WATERLOGO_FUNCTION == ENABLE) if (g_bWaterLogoEnable[uiVEncOutPortId]) { if (g_MovieWaterInfo[uiVEncOutPortId].uiXPos == WATERLOGO_AUTO_POS && g_MovieWaterInfo[uiVEncOutPortId].uiYPos == WATERLOGO_AUTO_POS) { g_MovieWaterInfo[uiVEncOutPortId].uiXPos = g_MovieStampPos[uiVEncOutPortId].uiX; g_MovieWaterInfo[uiVEncOutPortId].uiYPos = g_MovieStampPos[uiVEncOutPortId].uiY + pStampInfo->ui32DstHeight - g_MovieWaterInfo[uiVEncOutPortId].uiHeight; g_MovieStampPos[uiVEncOutPortId].uiX += (g_MovieWaterInfo[uiVEncOutPortId].uiWidth + STAMP_LOGO_GAP); } } #endif break; case STAMP_BOTTOM_RIGHT: default: if ((uiFlag & STAMP_POS_END_MASK) == STAMP_POS_END) { g_MovieStampPos[uiVEncOutPortId].uiX = uiImageWidth - uiStampWidth * strlen(pStampInfo->pi8Str) - STAMP_WIDTH_TOLERANCE; g_MovieStampPos[uiVEncOutPortId].uiY = uiImageHeight - pStampInfo->ui32DstHeight; } else { g_MovieStampPos[uiVEncOutPortId].uiX = uiImageWidth - uiStampWidth * (strlen(pStampInfo->pi8Str) + 1); // 1 font width gap g_MovieStampPos[uiVEncOutPortId].uiY = uiImageHeight - (pStampInfo->ui32DstHeight * 3) / 2; // 1/2 font height gap } #if defined (WATERLOGO_FUNCTION) && (WATERLOGO_FUNCTION == ENABLE) if (g_bWaterLogoEnable[uiVEncOutPortId]) { if (g_MovieWaterInfo[uiVEncOutPortId].uiXPos == WATERLOGO_AUTO_POS && g_MovieWaterInfo[uiVEncOutPortId].uiYPos == WATERLOGO_AUTO_POS) { g_MovieWaterInfo[uiVEncOutPortId].uiXPos = g_MovieStampPos[uiVEncOutPortId].uiX - g_MovieWaterInfo[uiVEncOutPortId].uiWidth - STAMP_LOGO_GAP; g_MovieWaterInfo[uiVEncOutPortId].uiYPos = g_MovieStampPos[uiVEncOutPortId].uiY + pStampInfo->ui32DstHeight - g_MovieWaterInfo[uiVEncOutPortId].uiHeight; } } //g_MovieWaterInfo[uiVEncOutPortId].uiYPos = g_MovieStampPos[uiVEncOutPortId].uiY + pStampInfo->ui32DstHeight - g_MovieWaterInfo[uiVEncOutPortId].uiHeight; #endif break; } } g_MovieStampPos[uiVEncOutPortId].uiX = ALIGN_FLOOR_4(g_MovieStampPos[uiVEncOutPortId].uiX); g_MovieStampPos[uiVEncOutPortId].uiY = ALIGN_FLOOR_4(g_MovieStampPos[uiVEncOutPortId].uiY); #if defined (WATERLOGO_FUNCTION) && (WATERLOGO_FUNCTION == ENABLE) if (g_bWaterLogoEnable[uiVEncOutPortId]) { g_MovieWaterInfo[uiVEncOutPortId].uiXPos = ALIGN_FLOOR_4(g_MovieWaterInfo[uiVEncOutPortId].uiXPos); g_MovieWaterInfo[uiVEncOutPortId].uiYPos = ALIGN_FLOOR_4(g_MovieWaterInfo[uiVEncOutPortId].uiYPos); } #endif //printf("%s[%d]---------------->font x*y[%d*%d]\n",__func__,__LINE__,g_MovieStampPos[uiVEncOutPortId].uiX,g_MovieStampPos[uiVEncOutPortId].uiY); //printf("%s[%d]---------------->logo x*y[%d*%d]\n",__func__,__LINE__,g_MovieWaterInfo[uiVEncOutPortId].uiXPos,g_MovieWaterInfo[uiVEncOutPortId].uiYPos); // Reset reference time g_CurDateTime.tm_sec = 0;//61; ISIZE szStamp; #if defined(_UI_STYLE_LVGL_) szStamp=MovieStamp_GetStampDataWidth_LVGL(pStampInfo, (const lv_font_t *)g_VsFontIn[uiVEncOutPortId].pFont); g_VsOsdWidth[uiVEncOutPortId] = szStamp.w; g_VsOsdHight[uiVEncOutPortId] = szStamp.h; #else szStamp=MovieStamp_GetStampDataWidth(pStampInfo, (const IMAGE_TABLE *)g_VsFontIn[uiVEncOutPortId].pFont); g_VsOsdWidth[uiVEncOutPortId]=ALIGN_CEIL(szStamp.w ,8); g_VsOsdHight[uiVEncOutPortId]=ALIGN_CEIL(szStamp.h, 2); #endif //DBG_ERR("VsOsdWidth[%d]=%d, %d\r\n",uiVEncOutPortId, g_VsOsdWidth[uiVEncOutPortId], g_VsOsdHight[uiVEncOutPortId] ); #if (_BOARD_DRAM_SIZE_ == 0x04000000) MovieStamp_VsConfig(uiVEncOutPortId, uiImageWidth, g_VsOsdHight[uiVEncOutPortId],pWaterLogoBuf); //from MovieStamp_CalcBufSize(), uiImageWidth may be 2560 #else MovieStamp_VsConfig(uiVEncOutPortId, uiImageWidth, STAMP_HEIGHT_MAX,pWaterLogoBuf); //from MovieStamp_CalcBufSize(), uiImageWidth may be 2560 #endif MovieStamp_VsAllocWaterLogoOsgBuf(uiVEncOutPortId, g_MovieWaterInfo[uiVEncOutPortId].uiWidth, g_MovieWaterInfo[uiVEncOutPortId].uiHeight); MovieStamp_VsFontConfig(uiVEncOutPortId); #if (_BOARD_DRAM_SIZE_ == 0x04000000) MovieStamp_VsAllocFontBuf(uiVEncOutPortId, uiImageWidth, g_VsOsdHight[uiVEncOutPortId]); #else MovieStamp_VsAllocFontBuf(uiVEncOutPortId, uiImageWidth, STAMP_HEIGHT_MAX); #endif #if defined (MOVIE_MULTISTAMP_FUNC) && (MOVIE_MULTISTAMP_FUNC == ENABLE) // set main path 2nd movie stamp { g_MovieGpsStampPos[uiVEncOutPortId].x = uiStampWidth; // 1 font width gap g_MovieGpsStampPos[uiVEncOutPortId].y = uiImageHeight - (pStampInfo->ui32DstHeight * 3) / 2; // 1/2 font height gap char Name[32] = {"120 121.0000 30.0000"}; MovieStamp_DrawMultiStamp(uiVEncOutPortId, 0, &g_MovieGpsStampPos[uiVEncOutPortId], Name, TRUE); } #endif #if defined (MOVIE_MULTIWATERLOGO_FUNC) && (MOVIE_MULTIWATERLOGO_FUNC == ENABLE) { UINT32 j; for(j=0;jucY; g_MovieStampInfo[uiVEncOutPortId].Color[COLOR_ID_BG].ucU = pStampColorBg->ucU; g_MovieStampInfo[uiVEncOutPortId].Color[COLOR_ID_BG].ucV = pStampColorBg->ucV; // Stamp frame color g_MovieStampInfo[uiVEncOutPortId].Color[COLOR_ID_FR].ucY = pStampColorFr->ucY; g_MovieStampInfo[uiVEncOutPortId].Color[COLOR_ID_FR].ucU = pStampColorFr->ucU; g_MovieStampInfo[uiVEncOutPortId].Color[COLOR_ID_FR].ucV = pStampColorFr->ucV; // Stamp foreground color (text body) g_MovieStampInfo[uiVEncOutPortId].Color[COLOR_ID_FG].ucY = pStampColorFg->ucY; g_MovieStampInfo[uiVEncOutPortId].Color[COLOR_ID_FG].ucU = pStampColorFg->ucU; g_MovieStampInfo[uiVEncOutPortId].Color[COLOR_ID_FG].ucV = pStampColorFg->ucV; } UINT32 MovieStamp_GetBufAddr(UINT32 uiVEncOutPortId, UINT32 blk_size) { void *va; UINT32 pa; ER ret; HD_COMMON_MEM_DDR_ID ddr_id = DDR_ID0; CHAR pool_name[20] ={0}; UINT32 path_id=uiVEncOutPortId; if(g_MovieStampPoolAddr[path_id].pool_va == 0) { sprintf(pool_name,"MovieStamp_%d",(int)path_id); ret = hd_common_mem_alloc(pool_name, &pa, (void **)&va, blk_size, ddr_id); if (ret != HD_OK) { DBG_ERR("alloc fail size 0x%x, ddr %d\r\n", blk_size, ddr_id); return 0; } DBG_IND("pa = 0x%x, va = 0x%x\r\n", (unsigned int)(pa), (unsigned int)(va)); g_MovieStampPoolAddr[path_id].pool_va=(UINT32)va; g_MovieStampPoolAddr[path_id].pool_pa=(UINT32)pa; memset(va, 0, blk_size); } if(g_MovieStampPoolAddr[path_id].pool_va == 0) DBG_ERR("get buf addr err\r\n"); return g_MovieStampPoolAddr[path_id].pool_va; } void MovieStamp_DestroyBuff(void) { UINT32 i, ret; for (i=0;iuiWidth*pWaterLogoBuf->uiHeight*4); #if (_BOARD_DRAM_SIZE_ == 0x04000000) FontHeight=44; #else FontHeight =STAMP_HEIGHT_MAX; #endif BufSize = waterLogoBufSize + MovieStamp_OsgQueryBufSize(Width, FontHeight) + Width*FontHeight*VSFONT_BUF_RATIO/100; //DBG_DUMP("Width=%d, FontHeight=%d, BufSize=%d\n",Width,FontHeight,BufSize); return BufSize; } void MovieStamp_CombineStamp(UINT32 vid_in, UINT32 bg_color) { UINT32 size; UINT32 combined_stamp_w = g_ImageSize[vid_in].w; UINT32 combined_stamp_h = g_VsOsdHight[vid_in]; size = combined_stamp_w * combined_stamp_h * 2; /* ARGB4444 */ HD_COMMON_MEM_VIRT_INFO vir_info = {0}; char name[16]; sprintf(name, "mov_stamp%lu", vid_in); if(combined_stamp_addr[vid_in].pool_va == 0){ hd_common_mem_alloc(name, &combined_stamp_addr[vid_in].pool_pa, (void **)&combined_stamp_addr[vid_in].pool_va, size, DDR_ID0); if(combined_stamp_addr[vid_in].pool_va == 0){ DBG_ERR("out of mem for combined stamp!\n"); return; } } memset((void *)combined_stamp_addr[vid_in].pool_va, 0, size); /* draw bg */ HD_GFX_DRAW_RECT rect = {0}; rect.color = bg_color; rect.rect = (HD_IRECT){0, combined_stamp_h - g_VsOsdHight[vid_in], combined_stamp_w, g_VsOsdHight[vid_in]}; /* draw stamp region, from bottom to top */ rect.type = HD_GFX_RECT_SOLID; rect.thickness = 1; rect.dst_img.dim = (HD_DIM) {combined_stamp_w, combined_stamp_h}; rect.dst_img.ddr_id = DDR_ID0; rect.dst_img.format = HD_VIDEO_PXLFMT_ARGB4444; rect.dst_img.lineoffset[0] = combined_stamp_w * 2; rect.dst_img.p_phy_addr[0] = combined_stamp_addr[vid_in].pool_pa; /* argb4444 accept virtual address */ hd_gfx_draw_rect(&rect); /* copy date stamp to bg */ HD_GFX_COPY copy = {0}; copy.alpha = 255; copy.colorkey = 0; copy.dst_pos = (HD_IPOINT) {combined_stamp_w - g_VsOsdWidth[vid_in] , combined_stamp_h - g_VsOsdHight[vid_in]}; /* copy to bottom right */ copy.dst_img.dim = (HD_DIM) {combined_stamp_w, combined_stamp_h}; copy.dst_img.ddr_id = DDR_ID0; copy.dst_img.format = HD_VIDEO_PXLFMT_ARGB4444; copy.dst_img.lineoffset[0] = combined_stamp_w * 2; copy.dst_img.p_phy_addr[0] = combined_stamp_addr[vid_in].pool_pa; copy.src_img.ddr_id = DDR_ID0; copy.src_img.format = HD_VIDEO_PXLFMT_ARGB4444; /* font conv output va as phy_addr for hdal venc stamp interface, convert it to pa for gfx */ vir_info.va = (void*) g_VsFontOut[vid_in].GenImg.phy_addr[0]; hd_common_mem_get(HD_COMMON_MEM_PARAM_VIRT_INFO, &vir_info); copy.src_img.lineoffset[0] = g_VsFontOut[vid_in].GenImg.loff[0]; copy.src_img.p_phy_addr[0] = vir_info.pa; copy.src_img.dim = g_VsFontOut[vid_in].GenImg.dim; copy.src_region = (HD_IRECT) {0, 0, copy.src_img.dim.w, copy.src_img.dim.h}; hd_gfx_copy(©); /* copy water logo to bg */ UINT32 water_size = g_MovieWaterInfo[vid_in].uiWidth * g_MovieWaterInfo[vid_in].uiHeight * 2; if(water_logo_addr[vid_in].pool_va == 0){ hd_common_mem_alloc("water", &water_logo_addr[vid_in].pool_pa, (void **)&water_logo_addr[vid_in].pool_va, water_size, DDR_ID0); if(water_logo_addr[vid_in].pool_va == 0){ DBG_ERR("out of mem for water logo!\n"); } memset((void*)water_logo_addr[vid_in].pool_va, 0, water_size); memcpy((void*)water_logo_addr[vid_in].pool_va, (void*)g_MovieWaterInfo[vid_in].uiWaterLogoAddr, water_size); hd_common_mem_flush_cache((void*)water_logo_addr[vid_in].pool_va, water_size); } HD_GFX_SCALE scale = {0}; memset(&scale, 0, sizeof(HD_GFX_SCALE)); scale.src_img.ddr_id = DDR_ID0; scale.src_img.format = HD_VIDEO_PXLFMT_ARGB4444; scale.src_img.lineoffset[0] = g_MovieWaterInfo[vid_in].uiWidth * 2; scale.src_img.p_phy_addr[0] = water_logo_addr[vid_in].pool_pa; scale.src_img.dim = (HD_DIM) {g_MovieWaterInfo[vid_in].uiWidth, g_MovieWaterInfo[vid_in].uiHeight}; scale.src_region = (HD_IRECT) {0, 0, scale.src_img.dim.w, scale.src_img.dim.h}; scale.dst_img.ddr_id = DDR_ID0; scale.dst_img.format = HD_VIDEO_PXLFMT_ARGB4444; scale.dst_img.lineoffset[0] = combined_stamp_w * 2; scale.dst_img.p_phy_addr[0] = combined_stamp_addr[vid_in].pool_pa; scale.dst_img.dim = (HD_DIM) {combined_stamp_w, combined_stamp_h}; scale.dst_region.w = (scale.src_img.dim.w * scale.dst_img.dim.h) / scale.src_img.dim.h; scale.dst_region.h = scale.dst_img.dim.h; scale.dst_region.x = 0; scale.dst_region.y = 0; hd_gfx_scale(&scale); hd_common_mem_flush_cache((void *)combined_stamp_addr[vid_in].pool_va, size); } void MovieStamp_UpdateData(void) { UINT32 i; #if (MOVIE_ISP_LOG == 0) struct tm CurDateTime; CurDateTime = g_CurDateTime; #endif ER FontConvRet=0; for (i = 0; i < VIDEO_IN_MAX; i++) { if ((g_uiMovieStampSetup[i] & STAMP_SWITCH_MASK) == STAMP_ON) { #if (MOVIE_ISP_LOG == 0) // Prepare date-time string if ((g_uiMovieStampSetup[i] & STAMP_DATE_TIME_MASK) == STAMP_DATE_TIME) { switch (g_uiMovieStampSetup[i] & STAMP_DATE_FORMAT_MASK) { case STAMP_DD_MM_YY: //sprintf(&g_cMovieStampStr[i][0], "%02d/%02d/%04d %02d:%02d:%02d", CurDateTime.tm_mday, CurDateTime.tm_mon, CurDateTime.tm_year, CurDateTime.tm_hour, CurDateTime.tm_min, CurDateTime.tm_sec); snprintf(&g_cMovieStampStr[i][0], MOVIE_STAMP_MAX_LEN, "%02d/%02d/%04d %02d:%02d:%02d", CurDateTime.tm_mday, CurDateTime.tm_mon, CurDateTime.tm_year, CurDateTime.tm_hour, CurDateTime.tm_min, CurDateTime.tm_sec); break; case STAMP_MM_DD_YY: //sprintf(&g_cMovieStampStr[i][0], "%02d/%02d/%04d %02d:%02d:%02d", CurDateTime.tm_mon, CurDateTime.tm_mday, CurDateTime.tm_year, CurDateTime.tm_hour, CurDateTime.tm_min, CurDateTime.tm_sec); snprintf(&g_cMovieStampStr[i][0], MOVIE_STAMP_MAX_LEN, "%02d/%02d/%04d %02d:%02d:%02d", CurDateTime.tm_mon, CurDateTime.tm_mday, CurDateTime.tm_year, CurDateTime.tm_hour, CurDateTime.tm_min, CurDateTime.tm_sec); break; default: //sprintf(&g_cMovieStampStr[i][0], "%04d/%02d/%02d %02d:%02d:%02d", CurDateTime.tm_year, CurDateTime.tm_mon, CurDateTime.tm_mday, CurDateTime.tm_hour, CurDateTime.tm_min, CurDateTime.tm_sec); snprintf(&g_cMovieStampStr[i][0], MOVIE_STAMP_MAX_LEN, "%04d/%02d/%02d %02d:%02d:%02d", CurDateTime.tm_year, CurDateTime.tm_mon, CurDateTime.tm_mday, CurDateTime.tm_hour, CurDateTime.tm_min, CurDateTime.tm_sec); break; } } else if ((g_uiMovieStampSetup[i] & STAMP_DATE_TIME_MASK) == STAMP_DATE_TIME_AMPM) { if (CurDateTime.tm_hour >= 12) { if (CurDateTime.tm_hour > 12) { CurDateTime.tm_hour -= 12; } switch (g_uiMovieStampSetup[i] & STAMP_DATE_FORMAT_MASK) { case STAMP_DD_MM_YY: //sprintf(&g_cMovieStampStr[i][0], "%02d/%02d/%04d %02d:%02d:%02d PM", CurDateTime.tm_mday, CurDateTime.tm_mon, CurDateTime.tm_year, CurDateTime.tm_hour, CurDateTime.tm_min, CurDateTime.tm_sec); snprintf(&g_cMovieStampStr[i][0], MOVIE_STAMP_MAX_LEN, "%02d/%02d/%04d %02d:%02d:%02d PM", CurDateTime.tm_mday, CurDateTime.tm_mon, CurDateTime.tm_year, CurDateTime.tm_hour, CurDateTime.tm_min, CurDateTime.tm_sec); break; case STAMP_MM_DD_YY: //sprintf(&g_cMovieStampStr[i][0], "%02d/%02d/%04d %02d:%02d:%02d PM", CurDateTime.tm_mon, CurDateTime.tm_mday, CurDateTime.tm_year, CurDateTime.tm_hour, CurDateTime.tm_min, CurDateTime.tm_sec); snprintf(&g_cMovieStampStr[i][0], MOVIE_STAMP_MAX_LEN, "%02d/%02d/%04d %02d:%02d:%02d PM", CurDateTime.tm_mon, CurDateTime.tm_mday, CurDateTime.tm_year, CurDateTime.tm_hour, CurDateTime.tm_min, CurDateTime.tm_sec); break; default: //sprintf(&g_cMovieStampStr[i][0], "%04d/%02d/%02d %02d:%02d:%02d PM", CurDateTime.tm_year, CurDateTime.tm_mon, CurDateTime.tm_mday, CurDateTime.tm_hour, CurDateTime.tm_min, CurDateTime.tm_sec); snprintf(&g_cMovieStampStr[i][0], MOVIE_STAMP_MAX_LEN, "%04d/%02d/%02d %02d:%02d:%02d PM", CurDateTime.tm_year, CurDateTime.tm_mon, CurDateTime.tm_mday, CurDateTime.tm_hour, CurDateTime.tm_min, CurDateTime.tm_sec); break; } } else { switch (g_uiMovieStampSetup[i] & STAMP_DATE_FORMAT_MASK) { case STAMP_DD_MM_YY: //sprintf(&g_cMovieStampStr[i][0], "%02d/%02d/%04d %02d:%02d:%02d AM", CurDateTime.tm_mday, CurDateTime.tm_mon, CurDateTime.tm_year, CurDateTime.tm_hour, CurDateTime.tm_min, CurDateTime.tm_sec); snprintf(&g_cMovieStampStr[i][0], MOVIE_STAMP_MAX_LEN, "%02d/%02d/%04d %02d:%02d:%02d AM", CurDateTime.tm_mday, CurDateTime.tm_mon, CurDateTime.tm_year, CurDateTime.tm_hour, CurDateTime.tm_min, CurDateTime.tm_sec); break; case STAMP_MM_DD_YY: //sprintf(&g_cMovieStampStr[i][0], "%02d/%02d/%04d %02d:%02d:%02d AM", CurDateTime.tm_mon, CurDateTime.tm_mday, CurDateTime.tm_year, CurDateTime.tm_hour, CurDateTime.tm_min, CurDateTime.tm_sec); snprintf(&g_cMovieStampStr[i][0], MOVIE_STAMP_MAX_LEN, "%02d/%02d/%04d %02d:%02d:%02d AM", CurDateTime.tm_mon, CurDateTime.tm_mday, CurDateTime.tm_year, CurDateTime.tm_hour, CurDateTime.tm_min, CurDateTime.tm_sec); break; default: //sprintf(&g_cMovieStampStr[i][0], "%04d/%02d/%02d %02d:%02d:%02d AM", CurDateTime.tm_year, CurDateTime.tm_mon, CurDateTime.tm_mday, CurDateTime.tm_hour, CurDateTime.tm_min, CurDateTime.tm_sec); snprintf(&g_cMovieStampStr[i][0], MOVIE_STAMP_MAX_LEN, "%04d/%02d/%02d %02d:%02d:%02d AM", CurDateTime.tm_year, CurDateTime.tm_mon, CurDateTime.tm_mday, CurDateTime.tm_hour, CurDateTime.tm_min, CurDateTime.tm_sec); break; } } } else { //sprintf(&g_cMovieStampStr[i][0], "%02d:%02d:%02d", CurDateTime.tm_hour, CurDateTime.tm_min, CurDateTime.tm_sec); snprintf(&g_cMovieStampStr[i][0], MOVIE_STAMP_MAX_LEN, "%02d:%02d:%02d", CurDateTime.tm_hour, CurDateTime.tm_min, CurDateTime.tm_sec); } #endif #if MOVIE_ISP_LOG UINT16 Ipl_id=0; UINT16 log_id=0; Ipl_id=ImageApp_MovieMulti_VePort2Imglink(i); //DBG_DUMP("update Ipl_id=%d\r\n",Ipl_id); if(Ipl_id<0xff){ if(Ipl_id==1){ log_id=0; }else{ log_id=1; } MovieStamp_get_isp_status(log_id, &g_cMovieStampStr[i][0], 256); } #endif g_VsFontIn[i].pStr=g_MovieStampInfo[i].pi8Str; if(MovieStamp_IsRawEncVirPort(i) && g_VsStampStart[i][(VSSTAMP_DATE_HD_STAMP_ID-HD_STAMP_BASE)]){ //DBG_DUMP("Update i=%d, start=0x%x, return\r\n",i, g_VsStampStart[i][(HD_STAMP_0-HD_STAMP_BASE)]); continue; } #if defined(_UI_STYLE_LVGL_) if ((FontConvRet=FontConv_LVGL(&g_VsFontIn[i], &g_VsFontOut[i])) != E_OK) { DBG_ERR("FontConv_LVGL err, Ret=%d\r\n",FontConvRet); return; } #else if ((FontConvRet=FontConv(&g_VsFontIn[i], &g_VsFontOut[i])) != E_OK) { DBG_ERR("FontConv err, Ret=%d\r\n",FontConvRet); return; } #endif //hd_common_mem_flush_cache((void*)g_VsFontOut[i].GenImg.phy_addr[0], g_VsFontOut[i].GenImg.loff[0]* g_VsFontOut[i].GenImg.ph[0]); //g_pVsFontDataAddr[i]=(UINT16 *)g_VsFontOut[i].GenImg.PxlAddr[0]; g_pVsFontDataAddr[i]=g_VsFontOut[i].GenImg.phy_addr[0]; //DBG_ERR("update pi8Str[%d]=%s\r\n", i,g_MovieStampInfo[i].pi8Str); g_VsOsdWidth[i]=g_VsFontOut[i].GenImg.pw[0]/2; g_VsOsdHight[i]=g_VsFontOut[i].GenImg.ph[0]; //DBG_DUMP("i=%d, w=%d, %d, %d\r\n", i,g_VsOsdWidth[i], g_VsOsdHight[i],g_VsFontOut[i].GenImg.loff[0]); //MovieStamp_VsUpdateOsd(i, TRUE, 1, g_MovieStampPos[i].uiX, g_MovieStampPos[i].uiY, g_VsOsdWidth[i], g_VsOsdHight[i], (void*)g_pVsFontDataAddr[i]); MovieStamp_CombineStamp(i, 0x0); // update 1st stamp // if(MovieStamp_VsUpdateOsd(g_VEncHDPathId[i], TRUE, MOVIE_STAMP_LAYER1, VS_DATESTAMP_REGION, g_MovieStampPos[i].uiX, g_MovieStampPos[i].uiY, g_VsOsdWidth[i], g_VsOsdHight[i], (void*)g_pVsFontDataAddr[i])){ UINT32 combined_stamp_w = g_ImageSize[i].w; UINT32 combined_stamp_h = g_VsOsdHight[i]; if(MovieStamp_VsUpdateOsd(g_VEncHDPathId[i], TRUE, MOVIE_STAMP_LAYER1, VS_DATESTAMP_REGION, 0, g_ImageSize[i].h - combined_stamp_h, combined_stamp_w, combined_stamp_h, (void*)combined_stamp_addr[i].pool_va)){ MovieStamp_VsSwapOsd(i, (VSSTAMP_DATE_HD_STAMP_ID-HD_STAMP_BASE),g_VEncHDPathId[i]); }else{ MovieStamp_VsStop(i, (VSSTAMP_DATE_HD_STAMP_ID-HD_STAMP_BASE)); } // update waterlogo #if 0 /* defined (WATERLOGO_FUNCTION) && (WATERLOGO_FUNCTION == ENABLE) */ if (g_bWaterLogoEnable[i]) { DBG_IND("water Width=%dx%d\r\n",g_MovieWaterInfo[i].uiWidth, g_MovieWaterInfo[i].uiHeight); //MovieStamp_VsUpdateOsd(i, TRUE, 2, g_MovieWaterInfo[i].uiXPos, g_MovieWaterInfo[i].uiYPos, g_MovieWaterInfo[i].uiWidth, g_MovieWaterInfo[i].uiHeight, (void*)g_MovieWaterInfo[i].uiWaterLogoYAddr); if(MovieStamp_VsUpdateOsd(g_WaterlogoVEncHDPathId[i], TRUE, MOVIE_STAMP_LAYER1, VS_WATERLOGO_REGION, g_MovieWaterInfo[i].uiXPos, g_MovieWaterInfo[i].uiYPos, g_MovieWaterInfo[i].uiWidth, g_MovieWaterInfo[i].uiHeight, (void*)g_MovieWaterInfo[i].uiWaterLogoAddr)){ MovieStamp_VsSwapOsd(i, (VSSTAMP_WATERLOGO_HD_STAMP_ID-HD_STAMP_BASE),g_WaterlogoVEncHDPathId[i]); }else{ MovieStamp_VsStop(i, (VSSTAMP_WATERLOGO_HD_STAMP_ID-HD_STAMP_BASE)); } } #endif #if defined (MOVIE_MULTISTAMP_FUNC) && (MOVIE_MULTISTAMP_FUNC == ENABLE) // update 2nd stamp { // follows are test codes, please update them by your GPS data char Name[32] = {"120 121.0000 30.0000"}; MovieStamp_DrawMultiStamp(i, 0, &g_MovieGpsStampPos[i], Name , FALSE); } #endif #if defined (MOVIE_MULTIWATERLOGO_FUNC) && (MOVIE_MULTIWATERLOGO_FUNC == ENABLE) { UINT32 j; for(j=0;jfmt = HD_VIDEO_PXLFMT_ARGB4444; image->dim.w = w; image->dim.h = h; image->p_addr = (UINT32)data; Result=hd_videoenc_set(path_id, HD_VIDEOENC_PARAM_IN_STAMP_IMG, image); if(Result != HD_OK){ DBG_ERR("fail to set stamp image, Result=%d\n",Result); return; } memset(attr, 0, sizeof(HD_OSG_STAMP_ATTR)); attr->layer = layer; attr->region = region; attr->position.x = x; attr->position.y = y; attr->alpha = 255; Result=hd_videoenc_set(path_id, HD_VIDEOENC_PARAM_IN_STAMP_ATTR, attr); if(Result != HD_OK){ DBG_ERR("fail to set stamp attr, path_id=0x%x, Result=%d\n",path_id,Result); return; } } ER MovieStamp_VsAllocWaterLogoOsgBuf(UINT32 uiVEncOutPortId, UINT32 WaterLogoWidth, UINT32 WaterLogoHeight) { #if defined (WATERLOGO_FUNCTION) && (WATERLOGO_FUNCTION == ENABLE) UINT32 Result=0; HD_OSG_STAMP_BUF buf; UINT32 uiOsgSize; UINT32 uiOsgPa=0; if (g_bWaterLogoEnable[uiVEncOutPortId]) { DBG_IND("Water %d, height=%d\r\n", WaterLogoWidth, WaterLogoHeight); uiOsgSize = MovieStamp_OsgQueryBufSize(WaterLogoWidth, WaterLogoHeight); uiOsgPa=g_MovieStampPoolAddr[uiVEncOutPortId].pool_pa+g_uiWaterLogoYAddr[uiVEncOutPortId]-g_MovieStampPoolAddr[uiVEncOutPortId].pool_va; if(uiOsgPa==0){ DBG_ERR("uiVsStampPa fail\n"); return -1; } memset(&buf, 0, sizeof(HD_OSG_STAMP_BUF)); buf.type = HD_OSG_BUF_TYPE_PING_PONG; buf.p_addr = uiOsgPa; buf.size = uiOsgSize; Result=hd_videoenc_set(g_WaterlogoVEncHDPathId[uiVEncOutPortId], HD_VIDEOENC_PARAM_IN_STAMP_BUF, &buf); if(Result != HD_OK){ DBG_ERR("waterlogo fail to set stamp buffer, [%d]Result=%d\n",uiVEncOutPortId,Result); return -1; } } #endif return 0; } ER MovieStamp_VsAllocOsdBuf(UINT32 uiVEncOutPortId, UINT32 width, UINT32 height) { UINT32 Result=0; HD_OSG_STAMP_BUF buf; if(MovieStamp_IsRawEncVirPort(uiVEncOutPortId) && (uiVEncOutPortId!=(HD_GET_OUT(ImageApp_MovieMulti_GetRawEncPort(_CFG_REC_ID_1)) - 1))){ return Result; } //DBG_DUMP("path_id=0x%x, width=%d, height=%d\r\n",path_id, width, height); g_uiVsStampSize[uiVEncOutPortId] = MovieStamp_OsgQueryBufSize(width, height); //vir_meminfo.va = (void *)((UINT32)g_uiVsStampAddr[uiVidEncId]); //if (hd_common_mem_get(HD_COMMON_MEM_PARAM_VIRT_INFO, &vir_meminfo)== HD_OK) { // g_uiVsStampPa=vir_meminfo.pa; //} g_uiVsStampPa[uiVEncOutPortId]=g_MovieStampPoolAddr[uiVEncOutPortId].pool_pa+g_uiVsStampAddr[uiVEncOutPortId]-g_MovieStampPoolAddr[uiVEncOutPortId].pool_va; if(g_uiVsStampPa[uiVEncOutPortId]==0){ DBG_ERR("g_uiVsStampPa fail\n"); return -1; } memset(&buf, 0, sizeof(HD_OSG_STAMP_BUF)); buf.type = HD_OSG_BUF_TYPE_PING_PONG; buf.p_addr = g_uiVsStampPa[uiVEncOutPortId]; buf.size = g_uiVsStampSize[uiVEncOutPortId]; Result=hd_videoenc_set(g_VEncHDPathId[uiVEncOutPortId], HD_VIDEOENC_PARAM_IN_STAMP_BUF, &buf); if(Result != HD_OK){ DBG_ERR("fail to set stamp buffer, Result=%d, PortId=0x%x, HDPathId=0x%x\n",Result,uiVEncOutPortId,g_VEncHDPathId[uiVEncOutPortId]); return -1; } return Result; } ER MovieStamp_VsConfig(UINT32 uiVEncOutPortId, UINT32 uiOSDWidth, UINT32 uiOSDHeight,WATERLOGO_BUFFER *pWaterLogoBuf) { g_VsStampEn =TRUE; HD_RESULT ret; MOVIE_CFG_REC_ID rec_id=_CFG_REC_ID_1; UINT32 i; UINT32 is_normal_enc=0; UINT32 is_raw_enc=0; //_CFG_REC_ID_1, VencPort=1, main //date(HD_STAMP_0) //waterlogo(HD_STAMP_1) //multistamp1(HD_STAMP_2), multistamp2 (HD_STAMP_3), multistamp3 (HD_STAMP_4), multistamp4 (HD_STAMP_5), multistamp5 (HD_STAMP_6) //multiewaterlogo1(HD_STAMP_7), multiwaterlogo2 (HD_STAMP_8), multiwaterlogo3 (HD_STAMP_9), multiwaterlogo4 (HD_STAMP_10), multiwaterlogo5 (HD_STAMP_11) //_CFG_REC_ID_1, VencPort=4, raw enc //date(HD_STAMP_0) //waterlogo(HD_STAMP_1) //multistamp1(HD_STAMP_2), multistamp2 (HD_STAMP_3), multistamp3 (HD_STAMP_4), multistamp4 (HD_STAMP_5), multistamp5 (HD_STAMP_6) //multiewaterlogo1(HD_STAMP_7), multiwaterlogo2 (HD_STAMP_8), multiwaterlogo3 (HD_STAMP_9), multiwaterlogo4 (HD_STAMP_10), multiwaterlogo5 (HD_STAMP_11) //UINT32 path_id_exe;//=ImageApp_MovieMulti_GetVdoEncPort(0); //DBG_DUMP("MovieMulti_GetVdoEncPort=0x%x, 0x%x\r\n",ImageApp_MovieMulti_GetVdoEncPort(0),HD_VIDEOENC_0_IN_0); for(i=0;i> 4) << 12) | ((r>>4)<<8) | ((g>>4)<<4) | (b>>4); //0xFFFF; #else g_VsFontIn[uiVEncOutPortId].ciSolid = 0xF000 | ((r>>4)<<8) | ((g>>4)<<4) | (b>>4); //0xFFFF; #endif y = g_MovieStampInfo[uiVEncOutPortId].Color[COLOR_ID_FR].ucY; u = g_MovieStampInfo[uiVEncOutPortId].Color[COLOR_ID_FR].ucU; v = g_MovieStampInfo[uiVEncOutPortId].Color[COLOR_ID_FR].ucV; YUV_GET_RGB(y, u, v, r, g, b); #if defined(_UI_STYLE_LVGL_) g_VsFontIn[uiVEncOutPortId].ciFrame = ((LV_COLOR_GET_A32((lv_color32_t){.full = LV_USER_CFG_STAMP_COLOR_FRAME}) >> 4) << 12) | ((r>>4)<<8) | ((g>>4)<<4) | (b>>4); //0xF000; #else g_VsFontIn[uiVEncOutPortId].ciFrame = 0xF000 | ((r>>4)<<8) | ((g>>4)<<4) | (b>>4); //0xF000; #endif y = g_MovieStampInfo[uiVEncOutPortId].Color[COLOR_ID_BG].ucY; u = g_MovieStampInfo[uiVEncOutPortId].Color[COLOR_ID_BG].ucU; v = g_MovieStampInfo[uiVEncOutPortId].Color[COLOR_ID_BG].ucV; YUV_GET_RGB(y, u, v, r, g, b); #if defined(_UI_STYLE_LVGL_) g_VsFontIn[uiVEncOutPortId].ciTransparet = ((LV_COLOR_GET_A32((lv_color32_t){.full = LV_USER_CFG_MOVIE_DATESTAMP_COLOR_BACKGROUND}) >> 4) << 12) | ((g>>4)<<4) | (b>>4); //0x0000; #else g_VsFontIn[uiVEncOutPortId].ciTransparet = ((r>>4)<<8) | ((g>>4)<<4) | (b>>4); //0x0000; #endif g_VsFontIn[uiVEncOutPortId].Format = HD_VIDEO_PXLFMT_ARGB4444;//GX_IMAGE_PIXEL_FMT_ARGB4444_PACKED; g_VsFontIn[uiVEncOutPortId].bEnableSmooth = FALSE; g_VsFontIn[uiVEncOutPortId].ScaleFactor = 65536; //1.0x } void MovieStamp_VsAllocFontBuf(UINT32 uiVEncOutPortId, UINT32 width, UINT32 height) { g_uiVsFontSize[uiVEncOutPortId] = width*height*VSFONT_BUF_RATIO/100; //5.5xWxH //DBG_DUMP("font vid=%d, YAddr=0x%x, size=0x%x, end=0x%x\r\n",uiVidEncId,g_uiVsFontAddr[uiVidEncId],g_uiVsFontSize, (g_uiVsFontAddr[uiVidEncId]+g_uiVsFontSize)); g_VsFontIn[uiVEncOutPortId].MemAddr = g_uiVsFontAddr[uiVEncOutPortId]; g_VsFontIn[uiVEncOutPortId].MemSize = g_uiVsFontSize[uiVEncOutPortId]; } void MovieStamp_VsClose(void) { HD_RESULT ret; UINT32 i, j; for (i = 0; i < SENSOR_CAPS_COUNT*(2+1)+1; i++) { for (j = 0; j < VSSTAMP_MAX_VIDEOENC_PATH; j++) { if (g_VsStampStart[i][j]) { if (!(g_VsStampStart[i][j] & 0x80000000)) { ret = hd_videoenc_stop(g_VsStampStart[i][j]); } if ((ret = hd_videoenc_close(g_VsStampStart[i][j] & ~0x80000000)) != HD_OK) { DBG_ERR("[%d][%d]hd_videoenc_close fail ,ret=%d\r\n", i, j, ret); } g_VsStampStart[i][j] = 0; } } } g_VsStampEn = FALSE; } void MovieStamp_VsStop(UINT32 uiVEncOutPortId, UINT32 StampPath) { HD_RESULT ret; if (g_VsStampStart[uiVEncOutPortId][StampPath]) { if (!(g_VsStampStart[uiVEncOutPortId][StampPath] & 0x80000000)) { //never stop before if ((ret = hd_videoenc_stop(g_VsStampStart[uiVEncOutPortId][StampPath])) != HD_OK) { DBG_ERR("[%d][%d]hd_videoenc_stop fail ,ret=%d\r\n", uiVEncOutPortId, StampPath, ret); return; } g_VsStampStart[uiVEncOutPortId][StampPath] |= 0x80000000;//stop } } } void MovieStamp_EncodeStampEn(UINT32 uiVEncOutPortId, UINT32 mask, UINT32 Enable) { HD_RESULT ret; UINT32 j; UINT32 uiRecId =uiVEncOutPortId; UINT32 uiVirPortId =MovieStamp_GetRawEncVirtualPort(uiVEncOutPortId); uiVEncOutPortId=HD_GET_OUT(ImageApp_MovieMulti_GetRawEncPort(uiVEncOutPortId)) - 1; //DBG_DUMP("====>>>uiRecId=%d, uiVEncOutPortId=0x%x, mask=0x%x, en=%d, VirPortId=%d\r\n",uiRecId, uiVEncOutPortId, mask, Enable, uiVirPortId); for (j = 0; j < VSSTAMP_MAX_VIDEOENC_PATH; j++) { if (mask & 0x00000001) { if (g_VsStampStart[uiVEncOutPortId][j] && Enable == 0) { //DBG_DUMP("====>>>EncStamp disable: g_VsStampStart[%x][%d]=%x, en=%d\r\n", uiVEncOutPortId, j, g_VsStampStart[uiVEncOutPortId][j], Enable); ret = hd_videoenc_stop(g_VsStampStart[uiVEncOutPortId][j] & (~(0x80000000))); if (ret != HD_OK) { DBG_ERR("start enc stamp fail=%d\r\n", ret); return; } g_VsStampStart[uiVEncOutPortId][j] |= 0x80000000;//stop } else if(g_VsStampStart[uiVEncOutPortId][j] && Enable) { //DBG_DUMP("====>>>EncStamp enable: g_VsStampStart[%x][%d]=0x%x, en=%d ,mask=0x%x\r\n", uiVEncOutPortId, j, g_VsStampStart[uiVEncOutPortId][j], Enable, mask); ret = hd_videoenc_start(g_VsStampStart[uiVEncOutPortId][j] & (~(0x80000000))); if (ret != HD_OK) { DBG_ERR("start enc stamp fail=%d\r\n", ret); return; } ER FontConvRet=0; UINT32 i=uiVirPortId; FONT_CONV_IN VsFontIn={0}; memcpy(&VsFontIn, &g_VsFontIn[i], sizeof(FONT_CONV_IN)); UINT32 uiX=g_MovieStampPos[i].uiX; UINT32 uiY=g_MovieStampPos[i].uiY; USIZE thmub_size; thmub_size.w = MOVIE_THUMB_WIDTH; thmub_size.h = (thmub_size.w * gMovie_Rec_Info[uiRecId].size.h) / gMovie_Rec_Info[uiRecId].size.w; #if defined(_UI_STYLE_LVGL_) if(Enable==(MOVIE_IMGCAP_THUMB+1)){ VsFontIn.pFont=(FONT *) lv_plugin_get_font(LV_USER_CFG_STAMP_FONT_ID_SMALL)->font; }else if(Enable==(MOVIE_IMGCAP_EXIF_THUMB+1)){ VsFontIn.pFont=(FONT *) lv_plugin_get_font(LV_USER_CFG_STAMP_FONT_ID_SMALL)->font; thmub_size.w = 160; thmub_size.h = 120; } //if ((FontConvRet=FontConv_LVGL(&g_VsFontIn[i], &g_VsFontOut[i])) != E_OK) { if ((FontConvRet=FontConv_LVGL(&VsFontIn, &g_VsFontOut[i])) != E_OK) { DBG_ERR("FontConv err, Ret=%d\r\n",FontConvRet); return; } #else if(Enable==(MOVIE_IMGCAP_THUMB+1)){ VsFontIn.pFont=(FONT *)gDateStampFontTbl12x20; }else if(Enable==(MOVIE_IMGCAP_EXIF_THUMB+1)){ VsFontIn.pFont=(FONT *)gDateStampFontTbl10x16; thmub_size.w = 160; thmub_size.h = 120; } //if ((FontConvRet=FontConv(&g_VsFontIn[i], &g_VsFontOut[i])) != E_OK) { if ((FontConvRet=FontConv(&VsFontIn, &g_VsFontOut[i])) != E_OK) { DBG_ERR("FontConv err, Ret=%d\r\n",FontConvRet); return; } #endif g_pVsFontDataAddr[i]=g_VsFontOut[i].GenImg.phy_addr[0]; g_VsOsdWidth[i]=g_VsFontOut[i].GenImg.pw[0]/2; g_VsOsdHight[i]=g_VsFontOut[i].GenImg.ph[0]; if(Enable==(MOVIE_IMGCAP_THUMB+1) || Enable==(MOVIE_IMGCAP_EXIF_THUMB+1)){ uiX=g_MovieStampPos[i].uiX*thmub_size.w/gMovie_Rec_Info[uiRecId].size.w; if((uiX + g_VsOsdWidth[i]) > thmub_size.w){ if((g_VsOsdWidth[i] + STAMP_WIDTH_TOLERANCE) < thmub_size.w){ uiX =ALIGN_FLOOR_4((thmub_size.w -g_VsOsdWidth[i] -STAMP_WIDTH_TOLERANCE)); }else{uiX=0;} }else{uiX=ALIGN_FLOOR_4(uiX);} uiY=g_MovieStampPos[i].uiY*thmub_size.h/gMovie_Rec_Info[uiRecId].size.h; uiY = ((uiY + g_VsOsdHight[i]) > thmub_size.h) ? ALIGN_FLOOR_4((uiY -g_VsOsdHight[i])) :ALIGN_FLOOR_4(uiY); } DBG_IND("pStr=%s x=%d, %d, w=%d, %d\r\n",VsFontIn.pStr, uiX, uiY, g_VsOsdWidth[i], g_VsOsdHight[i]); //if(MovieStamp_VsUpdateOsd(g_VEncHDPathId[uiVEncOutPortId], TRUE, MOVIE_STAMP_LAYER1, VS_DATESTAMP_REGION, g_MovieStampPos[i].uiX, g_MovieStampPos[i].uiY, g_VsOsdWidth[i], g_VsOsdHight[i], (void*)g_pVsFontDataAddr[i])){ if(MovieStamp_VsUpdateOsd(g_VEncHDPathId[uiVEncOutPortId], TRUE, MOVIE_STAMP_LAYER1, VS_DATESTAMP_REGION, uiX, uiY, g_VsOsdWidth[i], g_VsOsdHight[i], (void*)g_pVsFontDataAddr[i])){ MovieStamp_VsSwapOsd(i, (VSSTAMP_DATE_HD_STAMP_ID-HD_STAMP_BASE),g_VEncHDPathId[uiVEncOutPortId]); }else{ MovieStamp_VsStop(i, (VSSTAMP_DATE_HD_STAMP_ID-HD_STAMP_BASE)); } #if defined (WATERLOGO_FUNCTION) && (WATERLOGO_FUNCTION == ENABLE) if (g_bWaterLogoEnable[i]) { DBG_IND("water Width=%dx%d\r\n",g_MovieWaterInfo[i].uiWidth, g_MovieWaterInfo[i].uiHeight); UINT32 uiXPos=g_MovieWaterInfo[i].uiXPos; UINT32 uiYPos=g_MovieWaterInfo[i].uiYPos; WATERLOGO_BUFFER MovieWaterlogoBuff={0}; memcpy(&MovieWaterlogoBuff,&g_MovieWaterInfo[i],sizeof(WATERLOGO_BUFFER)); if(Enable==(MOVIE_IMGCAP_THUMB+1) || Enable==(MOVIE_IMGCAP_EXIF_THUMB+1)){ uiXPos=g_MovieWaterInfo[i].uiXPos*thmub_size.w/gMovie_Rec_Info[uiRecId].size.w; uiXPos = ((uiXPos + g_MovieWaterInfo[i].uiWidth) > uiX) ? ALIGN_FLOOR_4((uiX -g_MovieWaterInfo[i].uiWidth -STAMP_LOGO_GAP)):ALIGN_FLOOR_4(uiXPos); uiYPos=g_MovieWaterInfo[i].uiYPos*thmub_size.h/gMovie_Rec_Info[uiRecId].size.h; uiYPos = ((uiYPos + g_MovieWaterInfo[i].uiHeight) > thmub_size.h) ? ALIGN_FLOOR_4((uiYPos -g_MovieWaterInfo[i].uiHeight)) :ALIGN_FLOOR_4(uiYPos); memcpy(&MovieWaterlogoBuff,&g_WaterLogo_Thumb,sizeof(WATERLOGO_BUFFER)); } DBG_IND("water x=%d, %d, uiWidth=%d, %d\r\n",uiXPos, uiYPos,g_MovieWaterInfo[i].uiWidth, g_MovieWaterInfo[i].uiHeight); //MovieStamp_VsUpdateOsd(i, TRUE, 2, g_MovieWaterInfo[i].uiXPos, g_MovieWaterInfo[i].uiYPos, g_MovieWaterInfo[i].uiWidth, g_MovieWaterInfo[i].uiHeight, (void*)g_MovieWaterInfo[i].uiWaterLogoYAddr); //if(MovieStamp_VsUpdateOsd(g_WaterlogoVEncHDPathId[uiVEncOutPortId], TRUE, MOVIE_STAMP_LAYER1, VS_WATERLOGO_REGION, g_MovieWaterInfo[i].uiXPos, g_MovieWaterInfo[i].uiYPos, g_MovieWaterInfo[i].uiWidth, g_MovieWaterInfo[i].uiHeight, (void*)g_MovieWaterInfo[i].uiWaterLogoAddr)){ //if(MovieStamp_VsUpdateOsd(g_WaterlogoVEncHDPathId[uiVEncOutPortId], TRUE, MOVIE_STAMP_LAYER1, VS_WATERLOGO_REGION, uiXPos, uiYPos, g_MovieWaterInfo[i].uiWidth, g_MovieWaterInfo[i].uiHeight, (void*)g_MovieWaterInfo[i].uiWaterLogoAddr)){ if(MovieStamp_VsUpdateOsd(g_WaterlogoVEncHDPathId[uiVEncOutPortId], TRUE, MOVIE_STAMP_LAYER1, VS_WATERLOGO_REGION, uiXPos, uiYPos, MovieWaterlogoBuff.uiWidth, MovieWaterlogoBuff.uiHeight, (void*)MovieWaterlogoBuff.uiWaterLogoAddr)){ MovieStamp_VsSwapOsd(i, (VSSTAMP_WATERLOGO_HD_STAMP_ID-HD_STAMP_BASE),g_WaterlogoVEncHDPathId[uiVEncOutPortId]); }else{ MovieStamp_VsStop(i, (VSSTAMP_WATERLOGO_HD_STAMP_ID-HD_STAMP_BASE)); } } #endif #if defined (MOVIE_MULTISTAMP_FUNC) && (MOVIE_MULTISTAMP_FUNC == ENABLE) // update 2nd stamp { // follows are test codes, please update them by your GPS data char Name[32] = {"120 121.0000 30.0000"}; MovieStamp_DrawMultiStamp(i, 0, &g_MovieGpsStampPos[i], Name, FALSE); } #endif #if defined (MOVIE_MULTIWATERLOGO_FUNC) && (MOVIE_MULTIWATERLOGO_FUNC == ENABLE) { UINT32 k; WATERLOGO_BUFFER MovieWaterlogoBuff={0}; for(k=0;kRawEncStamp out of range: g_VsStampStart[%x][%d]=%x, en=%d\r\n", uiVEncOutPortId, j, g_VsStampStart[uiVEncOutPortId][j], Enable); } } mask >>= 1; } } void MovieStamp_VsSwapOsd(UINT32 uiVEncOutPortId, UINT32 StampPath, UINT32 VsHDPathId) { HD_RESULT ret; //DBG_DUMP("VsSwapOs uiVEncOutPortId=0x%x, StampPath=0x%x, VsHDPathId=0x%x\r\n", uiVEncOutPortId, StampPath, VsHDPathId); //if(g_VsStampStart[uiVEncOutPortId][StampPath]==0){ if(g_VsStampStart[uiVEncOutPortId][StampPath]==0 || (g_VsStampStart[uiVEncOutPortId][StampPath] & 0x80000000)){ //DBG_ERR("uiVidEncId=%d\r\n", uiVidEncId); ret = hd_videoenc_start(VsHDPathId); if (ret != HD_OK) { DBG_ERR("start enc stamp fail=%d\r\n", ret); return; } //DBG_DUMP("VsSwapOs uiVEncOutPortId=0x%x, StampPath=0x%x, VsHDPathId=0x%x\r\n", uiVEncOutPortId, StampPath, VsHDPathId); g_VsStampStart[uiVEncOutPortId][StampPath]=VsHDPathId; } } //#NT#2018/03/22#Brain Yen -end BOOL MovieStamp_IsEnable(void) { return ((BOOL)g_VsStampEn); } static UINT32 g_MovieStampRawEncodeVirPort[(SENSOR_CAPS_COUNT*2)]={0}; static UINT32 g_MovieStampRawEncodeVirPortCont=0; UINT32 MovieStamp_GetRawEncVirtualPort(UINT32 RecId) { HD_PATH_ID uiVEncOutPortId = 0; uiVEncOutPortId = HD_GET_OUT(ImageApp_MovieMulti_GetRawEncPort(_CFG_REC_ID_1)) - 1; if(g_MovieStampRawEncodeVirPort[RecId]==0){ g_MovieStampRawEncodeVirPort[RecId]=uiVEncOutPortId + g_MovieStampRawEncodeVirPortCont; g_MovieStampRawEncodeVirPortCont++; } //DBG_DUMP("GetVirPort [%d]EncodeVirPort=%d, VEncOutPortId=%d, VirPortCont=%d\r\n", RecId, g_MovieStampRawEncodeVirPort[RecId],uiVEncOutPortId,g_MovieStampRawEncodeVirPortCont); //DBG_DUMP("SENSOR_CAPS_COUNT=%d ,%d,%d,%d\r\n", SENSOR_CAPS_COUNT,g_MovieStampRawEncodeVirPort[0],g_MovieStampRawEncodeVirPort[1],g_MovieStampRawEncodeVirPort[2]); return g_MovieStampRawEncodeVirPort[RecId]; } UINT32 MovieStamp_IsRawEncVirPort(UINT32 PortId) { HD_PATH_ID uiVEncOutPortId = 0; UINT32 i=0; UINT32 Result=0; uiVEncOutPortId = HD_GET_OUT(ImageApp_MovieMulti_GetRawEncPort(_CFG_REC_ID_1)) - 1; for(i=0;i MOVIE_MULTI_STAMP_MAX_NAMECHAR_CNT){ DBG_ERR("str len reach MAX %d\r\n",strlen(pStr) ); return; } if(CntId>=MOVIE_MULTI_STAMP_CNT_MAX){ DBG_ERR("CntId reach MAX %d\r\n",CntId); return; } if ((g_uiMovieStampSetup[uiVEncOutPortId] & STAMP_SWITCH_MASK) != STAMP_ON) { DBG_ERR("uiVidEncId(%d) is OFF\r\n",uiVEncOutPortId); return; } sMovieStampInfo.pi8Str=pStr; //sMovieStampInfo.pDataBase=g_MovieStampInfo[uiVidEncId].pDataBase; //icon width must be even FontSize=MovieStamp_GetStampDataWidth(&sMovieStampInfo, (const IMAGE_TABLE *)g_VsFontIn[uiVEncOutPortId].pFont); uiFontWidth=FontSize.w; uiFontWidth=ALIGN_CEIL_8(uiFontWidth); if(uiFontWidth > MULTISTAMP_WIDTH_MAX){ DBG_ERR("uiFontWidth reach MAX %d\r\n", uiFontWidth); return; } uiFontWidth=MULTISTAMP_WIDTH_MAX; uiFontHeight=STAMP_HEIGHT_MAX;//sMovieStampInfo.pDataBase->pIconHeader[0x20].uiHeight; //DBG_DUMP("FontWidth=%d, FontHeight=%d, x=%d, y=%d\r\n",uiFontWidth,uiFontHeight,Pos->x, Pos->y); if(bInitStart){ //MemSize =videosprite_query_size(VDS_PHASE_BTN, VDS_BUF_TYPE_PING_PONG, uiFontWidth, uiFontHeight)+ uiFontWidth*uiFontHeight*VSFONT_BUF_RATIO/100; //MovieStamp_OsgQueryBufSize(uiFontWidth, uiFontHeight); MemSize =MovieStamp_OsgQueryBufSize(uiFontWidth, uiFontHeight)+ uiFontWidth*uiFontHeight*VSFONT_BUF_RATIO/100; MemAddr[CntId]=MovieStamp_GetMultiBufAddr(uiVEncOutPortId, CntId, MemSize); memcpy(&g_MultiStampVsFontIn[uiVEncOutPortId][CntId], &g_VsFontIn[uiVEncOutPortId], sizeof(FONT_CONV_IN)); g_MultiStampVsFontIn[uiVEncOutPortId][CntId].MemAddr = MemAddr[CntId]+ MemSize*OSG_BUF_RATIO/(OSG_BUF_RATIO+VSFONT_BUF_RATIO); g_MultiStampVsFontIn[uiVEncOutPortId][CntId].MemSize = uiFontWidth*uiFontHeight*VSFONT_BUF_RATIO/100; //g_MultiStampVsFontIn[CntId].pStr = pStr; //if ((FontConvRet=FontConv(&g_MultiStampVsFontIn[CntId], &g_MultiStampVsFontOut[CntId])) != E_OK) { // DBG_ERR("FontConv err, ret=%d\r\n",FontConvRet); // return; //} //pVsMultiFontDataAddr[CntId]=(UINT16 *)VsFontOut[CntId].GenImg.phy_addr[0]; //VsMultiFontDataAddr[CntId]=g_MultiStampVsFontOut[CntId].GenImg.phy_addr[0]; //DBG_DUMP("Str=%s\r\n",pStr); //DBG_DUMP("CntId=%d, w=%d, %d\r\n", CntId,VsFontOut[CntId].GenImg.Width, VsFontOut[CntId].GenImg.Height); //uiVsStampSize = videosprite_query_size(VDS_PHASE_BTN, VDS_BUF_TYPE_PING_PONG, uiFontWidth, uiFontHeight); uiVsStampSize=MovieStamp_OsgQueryBufSize(uiFontWidth, uiFontHeight); //videosprite_config_ping_pong_buf(VDS_PHASE_BTN, (VS_MULTISTAMP_ID+CntId), MemAddr[CntId], uiVsStampSize); //DBG_DUMP("uiVsStampSize=%d\r\n",uiVsStampSize); //UINT32 VsHDPathId=0; //HD_RESULT ret; //UINT32 Result=0; //HD_OSG_STAMP_BUF buf; //static UINT32 uiVsMultiStampPa = 0; uiVsMultiStampPa=g_MovieMultiStampPoolAddr[uiVEncOutPortId][CntId].pool_pa; //DBG_DUMP("[%d]uiVsMultiStampPa=%d\r\n",CntId,uiVsMultiStampPa); if(uiVsMultiStampPa==0){ DBG_ERR("uiVsMultiStampPa fail\n"); return; } memset(&buf, 0, sizeof(HD_OSG_STAMP_BUF)); //UINT32 path_id_exe;//=ImageApp_MovieMulti_GetVdoEncPort(0); //DBG_DUMP("MovieMulti_GetVdoEncPort=0x%x, 0x%x\r\n",ImageApp_MovieMulti_GetVdoEncPort(0),HD_VIDEOENC_0_IN_0); for(i=0;ix, Pos->y, g_MultiStampVsFontOut[i][CntId].GenImg.pw[0]/2, g_MultiStampVsFontOut[i][CntId].GenImg.ph[0], (void*)VsMultiFontDataAddr[i][CntId])){ MovieStamp_VsSwapOsd(i, (VSSTAMP_MULTISTAMP_HD_STAMP_ID+CntId-HD_STAMP_BASE),g_MultiStampVEncHDPathId[uiVEncOutPortId][CntId]); }else{ MovieStamp_VsStop(i, (VSSTAMP_MULTISTAMP_HD_STAMP_ID+CntId-HD_STAMP_BASE)); } } #endif #if defined (MOVIE_MULTIWATERLOGO_FUNC) && (MOVIE_MULTIWATERLOGO_FUNC == ENABLE) static STAMP_ADDR_INFO g_MovieMultiWaterLogoPoolAddr[VENC_OUT_PORTID_MAX][MOVIE_MULTI_WATERLOGO_CNT_MAX]={0}; static UINT32 g_MultiWaterLogoVEncHDPathId[VENC_OUT_PORTID_MAX][MOVIE_MULTI_WATERLOGO_CNT_MAX]={0}; UINT32 MovieStamp_GetMultiWaterLogoBufAddr(UINT32 uiVEncOutPortId, UINT32 Id, UINT32 blk_size) { void *va; UINT32 pa; ER ret; HD_COMMON_MEM_DDR_ID ddr_id = DDR_ID0; CHAR pool_name[30] ={0}; if(g_MovieMultiWaterLogoPoolAddr[uiVEncOutPortId][Id].pool_va == 0) { sprintf(pool_name,"MovieMultiStamp_%d_%d",(int)uiVEncOutPortId,(int)Id); ret = hd_common_mem_alloc(pool_name, &pa, (void **)&va, blk_size, ddr_id); if (ret != HD_OK) { DBG_ERR("alloc fail size 0x%x, ddr %d\r\n", blk_size, ddr_id); return 0; } DBG_IND("pa = 0x%x, va = 0x%x\r\n", (unsigned int)(pa), (unsigned int)(va)); g_MovieMultiWaterLogoPoolAddr[uiVEncOutPortId][Id].pool_va=(UINT32)va; g_MovieMultiWaterLogoPoolAddr[uiVEncOutPortId][Id].pool_pa=(UINT32)pa; memset(va, 0, blk_size); } if(g_MovieMultiWaterLogoPoolAddr[uiVEncOutPortId][Id].pool_va == 0) DBG_ERR("get buf addr err\r\n"); return g_MovieMultiWaterLogoPoolAddr[uiVEncOutPortId][Id].pool_va; } void MovieStamp_DestroyMultiWaterLogoBuff(void) { UINT32 i, j, ret; for (i=0;i<(SENSOR_CAPS_COUNT*(2+1)+1);i++) { for (j=0;juiXPos=10; waterSrc->uiYPos=20; break; case 1: memcpy(waterSrc,&g_WaterLogo_640,sizeof(WATERLOGO_BUFFER)); waterSrc->uiXPos=200; waterSrc->uiYPos=200; break; case 2: memcpy(waterSrc,&g_WaterLogo_640,sizeof(WATERLOGO_BUFFER)); waterSrc->uiXPos=400; waterSrc->uiYPos=420; break; case 3: memcpy(waterSrc,&g_WaterLogo_640,sizeof(WATERLOGO_BUFFER)); waterSrc->uiXPos=600; waterSrc->uiYPos=620; break; case 4: memcpy(waterSrc,&g_WaterLogo_1440,sizeof(WATERLOGO_BUFFER)); waterSrc->uiXPos=800; waterSrc->uiYPos=820; break; } return E_OK; } //CntId: Stamp cnt, MAX is 5, from 0 to 4 void MovieStamp_DrawMultiWaterLogo(UINT32 uiVEncOutPortId, UINT32 CntId, WATERLOGO_BUFFER *sWaterLogo, UINT32 bInitStart) { UINT32 uiMultiWaterLogoSize = 0; MOVIE_CFG_REC_ID rec_id=_CFG_REC_ID_1; UINT32 i; UINT32 is_raw_enc=0; HD_RESULT ret; UINT32 Result=0; HD_OSG_STAMP_BUF buf; static UINT32 uiMultiWaterLogoPa = 0; if(sWaterLogo == NULL){ DBG_ERR("str NULL\r\n"); return; } if(sWaterLogo->uiWaterLogoAddr== 0){ DBG_ERR("data addr 0\r\n"); return; } if(CntId>=MOVIE_MULTI_WATERLOGO_CNT_MAX){ DBG_ERR("CntId reach MAX %d\r\n",CntId); return; } if ((g_uiMovieStampSetup[uiVEncOutPortId] & STAMP_SWITCH_MASK) != STAMP_ON) { DBG_ERR("uiVidEncId(%d) is OFF\r\n",uiVEncOutPortId); return; } //DBG_DUMP("MovieStamp_DrawMultiWaterLogo uiVEncOutPortId=0x%x, CntId=0x%x, bInitStart=%d\r\n",uiVEncOutPortId,CntId,bInitStart); if(bInitStart){ for(i=0;iuiWidth, sWaterLogo->uiHeight); MovieStamp_GetMultiWaterLogoBufAddr(uiVEncOutPortId, CntId, uiMultiWaterLogoSize); uiMultiWaterLogoPa=g_MovieMultiWaterLogoPoolAddr[uiVEncOutPortId][CntId].pool_pa; if(uiMultiWaterLogoPa==0){ DBG_ERR("uiMultiWaterLogoPa fail\n"); return; } memset(&buf, 0, sizeof(HD_OSG_STAMP_BUF)); buf.type = HD_OSG_BUF_TYPE_PING_PONG; buf.p_addr = uiMultiWaterLogoPa; buf.size = uiMultiWaterLogoSize; buf.ddr_id =0; Result=hd_videoenc_set(g_MultiWaterLogoVEncHDPathId[uiVEncOutPortId][CntId], HD_VIDEOENC_PARAM_IN_STAMP_BUF, &buf); if(Result != HD_OK){ DBG_ERR("fail to set stamp buffer, Result=0x%x, Pa=0x%x, Sz=0x%x\n",Result, uiMultiWaterLogoPa,uiMultiWaterLogoSize); return; } } i=uiVEncOutPortId; UINT32 RawEncVEncPort = 0; RawEncVEncPort = HD_GET_OUT(ImageApp_MovieMulti_GetRawEncPort(_CFG_REC_ID_1)) - 1; if(MovieStamp_IsRawEncVirPort(uiVEncOutPortId)){ uiVEncOutPortId=RawEncVEncPort; } //DBG_DUMP("multi water X=%d, Y=%d, Width=%dx%d\r\n",sWaterLogo->uiXPos,sWaterLogo->uiYPos,sWaterLogo->uiWidth, sWaterLogo->uiHeight); if(MovieStamp_VsUpdateOsd(g_MultiWaterLogoVEncHDPathId[uiVEncOutPortId][CntId], TRUE, MOVIE_STAMP_LAYER2, ( VS_MULTIWATERLOGO_REGION + CntId), sWaterLogo->uiXPos, sWaterLogo->uiYPos, sWaterLogo->uiWidth, sWaterLogo->uiHeight, (void*)sWaterLogo->uiWaterLogoAddr)){ MovieStamp_VsSwapOsd(i, (VSSTAMP_MULTIWATERLOGO_HD_STAMP_ID+CntId-HD_STAMP_BASE),g_MultiWaterLogoVEncHDPathId[uiVEncOutPortId][CntId]); }else{ MovieStamp_VsStop(i, (VSSTAMP_MULTIWATERLOGO_HD_STAMP_ID+CntId-HD_STAMP_BASE)); } } #endif UINT32 MovieStamp_GetGfxInitBufAddr(UINT32 blk_size) { void *va; UINT32 pa; ER ret; HD_COMMON_MEM_DDR_ID ddr_id = DDR_ID0; CHAR pool_name[20] ={0}; if(g_GfxInitPoolAddr.pool_va == 0) { sprintf(pool_name,"gxgfx_temp"); ret = hd_common_mem_alloc(pool_name, &pa, (void **)&va, blk_size, ddr_id); if (ret != HD_OK) { DBG_ERR("alloc fail size 0x%x, ddr %d\r\n", blk_size, ddr_id); return 0; } DBG_IND("pa = 0x%x, va = 0x%x\r\n", (unsigned int)(pa), (unsigned int)(va)); g_GfxInitPoolAddr.pool_va=(UINT32)va; g_GfxInitPoolAddr.pool_pa=(UINT32)pa; memset(va, 0, blk_size); } if(g_GfxInitPoolAddr.pool_va == 0) DBG_ERR("get buf addr err\r\n"); return g_GfxInitPoolAddr.pool_va; } //for UI_GfxInit, for FontConv function void UI_GfxInitLite(void) { UINT32 uiPoolAddr; DBG_FUNC_BEGIN("\r\n"); if(isUI_GfxInitLiteOpened==1){ return; } isUI_GfxInitLiteOpened=1; MovieStamp_GetGfxInitBufAddr(ALIGN_CEIL_64(4096)); uiPoolAddr = (UINT32)g_GfxInitPoolAddr.pool_va; //////////////////////////////////////////////////////////////// GxGfx_Config(CFG_STRING_BUF_SIZE, 256); //Init Gfx GxGfx_Init((UINT32 *)uiPoolAddr, ALIGN_CEIL_64(4096)); //initial Graphics //set default shape, text, image state for GxGfx GxGfx_SetAllDefault(); //set custom image state for GxGfx GxGfx_SetImageStroke(ROP_KEY, IMAGEPARAM_DEFAULT); GxGfx_SetImageColor(IMAGEPALETTE_DEFAULT, IMAGEPARAM_DEFAULT); GxGfx_SetTextColor(TEXTFORECOLOR1_DEFAULT, TEXTFORECOLOR2_DEFAULT, TEXTFORECOLOR3_DEFAULT); }