//////////////////////////////////////////////////////////////////////////////// #include "PrjInc.h" #include "System/SysCommon.h" #include "WiFiIpc/nvtwifi.h" #include "UIWnd/UIFlow.h" //#include "UIWnd/SPORTCAM/UIInfo/UIInfo.h" //#include "UIWnd/SPORTCAM/UIInfo/UIPhotoInfo.h" //#include "DateTimeInfo.h" #include "UIDateImprint.h" #include "UIDateImprintID.h" //#include "UIWnd/SPORTCAM/Resource/UIResource.h" //#include "Utility.h" #include "FontConv/FontConv.h" #include "Mode/UIMode.h" #include "gximage/gximage.h" //#include "UIWnd/SPORTCAM/UIInfo/UIPhotoMapping.h" //#include "nvtmpp.h" #include "UIAppPhoto.h" #include "GxVideoFile.h" #include #include "kwrap/type.h" #include "UIApp/MovieStamp/MovieStamp.h" //#include "UIWnd/SPORTCAM/UIInfo/DateTimeInfo.h" #include "vf_gfx.h" #if HUNTING_CAMERA_MCU == ENABLE #include #endif #define THIS_DBGLVL 2 // 0=FATAL, 1=ERR, 2=WRN, 3=UNIT, 4=FUNC, 5=IND, 6=MSG, 7=VALUE, 8=USER /////////////////////////////////////////////////////////////////////////////// #define __MODULE__ UIDateImprint #define __DBGLVL__ ((THIS_DBGLVL>=PRJ_DBG_LVL)?THIS_DBGLVL:PRJ_DBG_LVL) #define __DBGFLT__ "*" //*=All, [mark]=CustomClass #include #include "UIInfo/UIInfo.h" #include "sf_battery.h" #define USE_DBG_STAMP DISABLE /**************************************************** * IMPORTANT!! * * LVGL UI style only accept RGB color * ****************************************************/ #if defined(_UI_STYLE_LVGL_) #include "UIApp/lv_user_font_conv/lv_user_font_conv.h" #define DATE_COLOR_TRANSPARENT lv_color_to32(LV_COLOR_OLIVE) /* it will be converted into yuv as color key */ #define DATE_COLOR_WHITE lv_color_to32(LV_COLOR_WHITE) #define DATE_COLOR_BLACK lv_color_to32(LV_COLOR_BLACK) #define DATE_COLOR_ORANGED lv_color_to32(LV_COLOR_ORANGE) #define DATE_COLOR_RED lv_color_to32(LV_COLOR_RED) #define LV_USER_FONT_CONV_ALIGN_W 8 #define LV_USER_FONT_CONV_ALIGN_H 2 lv_user_font_conv_draw_cfg draw_cfg = {0}; 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->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 UINT32 UIDateImprint_GetStampMemSize_LVGL(const lv_font_t *pFont, char* text) { //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 = text; DBG_IND("[%s:%d]draw_cfg.string.text=%s\n", __FUNCTION__, __LINE__, draw_cfg.string.text); draw_cfg.align_w = LV_USER_FONT_CONV_ALIGN_W; draw_cfg.align_h = LV_USER_FONT_CONV_ALIGN_H; if(PhotoExe_GetCapYUV420En()){ draw_cfg.fmt = HD_VIDEO_PXLFMT_YUV420;//GX_IMAGE_PIXEL_FMT_YUV420_PACKED; }else{ draw_cfg.fmt = HD_VIDEO_PXLFMT_YUV422;//GX_IMAGE_PIXEL_FMT_YUV422_PACKED; } lv_user_font_conv_calc_buffer_size(&draw_cfg, &result); DBG_IND("[%s:%d]result.output_buffer_size=%d\n", __FUNCTION__, __LINE__, result.output_buffer_size); return result.output_buffer_size; } 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_color32_t color32; _movie_stamp_lv_cfg_init(&draw_cfg); draw_cfg.fmt = pIn->Format; draw_cfg.string.font = (lv_font_t *) pIn->pFont; draw_cfg.string.text = pIn->pStr; draw_cfg.string.align = LV_USER_CFG_STAMP_TEXT_ALIGN; draw_cfg.align_w = LV_USER_FONT_CONV_ALIGN_W; draw_cfg.align_h = LV_USER_FONT_CONV_ALIGN_H; /* text color */ color32.full = pIn->ciSolid; 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 */ color32.full = pIn->ciTransparet; 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 */ color32.full = pIn->ciFrame; 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; /**************************************************************************** * IMPORTANT!! * * do not set color key to zero because engine may ignore zero value. ****************************************************************************/ draw_cfg.key_y = 255; draw_cfg.key_u = 255; draw_cfg.key_v = 255; mem_cfg.output_buffer = (void*)pIn->MemAddr; mem_cfg.output_buffer_size = pIn->MemSize; DBG_IND("[%s:%d]mem_cfg.output_buffer_size=%d\n", __FUNCTION__, __LINE__, mem_cfg.output_buffer_size); lv_user_font_conv_calc_buffer_size(&draw_cfg, &result); lv_user_font_conv(&draw_cfg, &mem_cfg); UINT32 LineOffs[2]; UINT32 PxlAddrs[2]; HD_COMMON_MEM_VIRT_INFO vir_meminfo = {0}; vir_meminfo.va = (void *)(mem_cfg.output_buffer); if ( hd_common_mem_get(HD_COMMON_MEM_PARAM_VIRT_INFO, &vir_meminfo) != HD_OK) { DBG_ERR("convert output_buffer to pa failed!\n"); return -1; } LineOffs[0] = (float)result.width * (float)(result.bpp / 8); LineOffs[1] = LineOffs[0]; PxlAddrs[0] = (UINT32) vir_meminfo.pa; PxlAddrs[1] = PxlAddrs[0] + (result.width * result.height); /* y plane is w * h for yuv420 & 422 */ 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); } pOut->ColorKeyY = draw_cfg.key_y; pOut->ColorKeyCb = draw_cfg.key_u; pOut->ColorKeyCr = draw_cfg.key_v; return 0; } #else #include "UIApp/MovieStamp/DateStampFontTbl56x96.h" #include "UIApp/MovieStamp/DateStampFontTbl42x72.h" #include "UIApp/MovieStamp/DateStampFontTbl36x60.h" #include "UIApp/MovieStamp/DateStampFontTbl26x44.h" #include "UIApp/MovieStamp/DateStampFontTbl20x44.h" #include "UIApp/MovieStamp/DateStampFontTbl18x30.h" #include "UIApp/MovieStamp/DateStampFontTbl12x20.h" #include "UIApp/MovieStamp/DateStampFontTbl10x16.h" /**************************************************** * YUV ****************************************************/ #define DATE_COLOR_TRANSPARENT 0x00808000 #define DATE_COLOR_WHITE 0x008080FF #define DATE_COLOR_BLACK 0x00818101 #define DATE_COLOR_ORANGED 0x00D4328A #define DATE_COLOR_RED 0x00FF554E #endif #define FONT_BUF_RATIO (450) typedef enum { DATE_IMPRINT_EVENT_QV = 0, ///info[i]; if ( i == DATE_IMPRINT_EVENT_QV && g_DateImprintPool[i].pool_va == 0) { ISIZE size = GxVideo_GetDeviceSize(DOUT1); UiDateImprint_GetStampFont(size.w,(char**)&pFont); #if defined(_UI_STYLE_LVGL_) pInfo->MemSize = UIDateImprint_GetStampMemSize_LVGL((const lv_font_t *)pFont, UiDateImprint_InitStrBuf()); pInfo->MemSize = pInfo->MemSize/4*5; #else GxGfx_SetTextStroke((const FONT *)pFont, FONTSTYLE_NORMAL, SCALE_1X); GxGfx_Text(0, 0, 0, UiDateImprint_InitStrBuf()); //not really draw szStamp = GxGfx_GetTextLastSize(); //just get text size FontWidth=ALIGN_CEIL(szStamp.w ,8); FontHight=ALIGN_CEIL(szStamp.h, 2); pInfo->MemSize = (FontWidth*FontHight*FONT_BUF_RATIO)/100;//0x5000;//0x80000; #endif DBG_IND("QV w=%d, %d, MemSize=0x%x\r\n", FontWidth,FontHight,pInfo->MemSize); sprintf(pool_name,"DateImprint_QV"); ret = hd_common_mem_alloc(pool_name, &pa, (void **)&va, pInfo->MemSize, ddr_id); if (ret != HD_OK) { DBG_ERR("QV alloc fail size 0x%x, ddr %d\r\n", pInfo->MemSize, ddr_id); return; } DBG_IND("pa = 0x%x, va = 0x%x\r\n", (unsigned int)(pa), (unsigned int)(va)); g_DateImprintPool[i].pool_va=(UINT32)va; g_DateImprintPool[i].pool_pa=(UINT32)pa; memset(va, 0, pInfo->MemSize); pInfo->MemAddr = g_DateImprintPool[i].pool_va; pInfo->copyEngine = GXIMG_CP_ENG1; pInfo->lockptn = FLGPTN_BIT(i); //i } else if ( i == DATE_IMPRINT_EVENT_SCR && g_DateImprintPool[i].pool_va == 0) { pInfo->MemSize = 0x80000; #if HUNTING_CAMERA_MCU == ENABLE UIMenuStoreInfo *puiPara = sf_ui_para_get(); UiDateImprint_GetStampFont(sf_get_screen_nail_width(puiPara->SendPicSize),(char**)&pFont); #else UiDateImprint_GetStampFont(CFG_SCREENNAIL_W,(char**)&pFont); #endif #if defined(_UI_STYLE_LVGL_) pInfo->MemSize = UIDateImprint_GetStampMemSize_LVGL((const lv_font_t *)pFont, UiDateImprint_InitStrBuf()); pInfo->MemSize = pInfo->MemSize/4*5; #else GxGfx_SetTextStroke((const FONT *)pFont, FONTSTYLE_NORMAL, SCALE_1X); GxGfx_Text(0, 0, 0, UiDateImprint_InitStrBuf()); //not really draw szStamp = GxGfx_GetTextLastSize(); //just get text size FontWidth=ALIGN_CEIL(szStamp.w ,8); FontHight=ALIGN_CEIL(szStamp.h, 2); pInfo->MemSize = (FontWidth*FontHight*FONT_BUF_RATIO)/100;//0x5000;//0x80000; #endif DBG_IND("SRC w=%d, %d, MemSize=0x%x\r\n", FontWidth,FontHight,pInfo->MemSize); sprintf(pool_name,"DateImprint_SCR"); ret = hd_common_mem_alloc(pool_name, &pa, (void **)&va, pInfo->MemSize, ddr_id); if (ret != HD_OK) { DBG_ERR("QV alloc fail size 0x%x, ddr %d\r\n", pInfo->MemSize, ddr_id); return; } DBG_IND("pa = 0x%x, va = 0x%x\r\n", (unsigned int)(pa), (unsigned int)(va)); g_DateImprintPool[i].pool_va=(UINT32)va; g_DateImprintPool[i].pool_pa=(UINT32)pa; memset(va, 0, pInfo->MemSize); pInfo->MemAddr = g_DateImprintPool[i].pool_va; pInfo->copyEngine = GXIMG_CP_ENG2; pInfo->lockptn = FLGPTN_BIT(i); //i } else if ( i == DATE_IMPRINT_EVENT_PRI && g_DateImprintPool[i].pool_va == 0) { pInfo->MemSize = 0x80000; UiDateImprint_GetStampFont(GetPhotoSizeWidth(PHOTO_MAX_CAP_SIZE),(char**)&pFont); #if defined(_UI_STYLE_LVGL_) pInfo->MemSize = UIDateImprint_GetStampMemSize_LVGL((const lv_font_t *)pFont, UiDateImprint_InitStrBuf()); pInfo->MemSize = pInfo->MemSize/4*5; #else GxGfx_SetTextStroke((const FONT *)pFont, FONTSTYLE_NORMAL, SCALE_1X); GxGfx_Text(0, 0, 0, UiDateImprint_InitStrBuf()); //not really draw szStamp = GxGfx_GetTextLastSize(); //just get text size FontWidth=ALIGN_CEIL(szStamp.w ,8); FontHight=ALIGN_CEIL(szStamp.h, 2); pInfo->MemSize = (FontWidth*FontHight*FONT_BUF_RATIO)/100;//0x80000; #endif DBG_IND("PRI w=%d, %d, MemSize=0x%x\r\n", FontWidth,FontHight,pInfo->MemSize); sprintf(pool_name,"DateImprint_PRI"); ret = hd_common_mem_alloc(pool_name, &pa, (void **)&va, pInfo->MemSize, ddr_id); if (ret != HD_OK) { DBG_ERR("QV alloc fail size 0x%x, ddr %d\r\n", pInfo->MemSize, ddr_id); return; } DBG_IND("pa = 0x%x, va = 0x%x\r\n", (unsigned int)(pa), (unsigned int)(va)); g_DateImprintPool[i].pool_va=(UINT32)va; g_DateImprintPool[i].pool_pa=(UINT32)pa; memset(va, 0, pInfo->MemSize); pInfo->MemAddr = g_DateImprintPool[i].pool_va; pInfo->copyEngine = GXIMG_CP_ENG2; pInfo->lockptn =FLGPTN_BIT(i); //i } pInfo->isStrDirty = TRUE; pInfo->StrBuf[0] = 0; pInfo->pic_cnt = 0; genMaxw = GetPhotoSizeWidth(0) / 2; genMaxh = GetPhotoSizeHeight(0) * 0.04; pInfo->StampInfo.Img.loff[0] = genMaxw; pInfo->StampInfo.Img.loff[1] = genMaxw; pInfo->StampInfo.Img.pw[0] = genMaxw; pInfo->StampInfo.Img.ph[0] = genMaxh; if(PhotoExe_GetCapYUV420En()){ pInfo->StampInfo.Img.pxlfmt = HD_VIDEO_PXLFMT_YUV420;//GX_IMAGE_PIXEL_FMT_YUV420_PACKED; }else{ pInfo->StampInfo.Img.pxlfmt = HD_VIDEO_PXLFMT_YUV422;//GX_IMAGE_PIXEL_FMT_YUV422_PACKED; } } set_flg(UI_DATEIMPRINT_FLG_ID, FLGPTN_BIT_ALL); } void UiDateImprint_DestroyBuff(void) { UINT32 i, ret; for (i=0;iImg.pw[0],stampInfo->Img.pw[0],stampInfo->Img.pxlfmt,stampInfo->Img.loff[0]); } void UiDateImprint_SelStampFont(UINT32 uiImageWidth, char **font, UINT32 *ScaleFactor) { #if defined(_UI_STYLE_LVGL_) *ScaleFactor = 65536; lv_plugin_res_id red_id; if(uiImageWidth >= 5632) { red_id = LV_USER_CFG_STAMP_FONT_ID_24M; } else 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; } DBG_IND("[%s:%d]uiImageWidth=%d,stamp font id=%d\n", __FUNCTION__, __LINE__, uiImageWidth, red_id); *font = (char *) lv_plugin_get_font(red_id)->font; #else if (uiImageWidth >= 3840) { *font = (char *)gDateStampFontTbl56x96; *ScaleFactor = 65536; } else if(uiImageWidth >=3600) { *font = (char *)&gDateStampFontTbl56x96; *ScaleFactor = 65536*95/100; } else if(uiImageWidth >=3200) { *font = (char *)&gDateStampFontTbl56x96; *ScaleFactor = 65536*90/100; } else if(uiImageWidth >=2880) { *font = (char *)&gDateStampFontTbl42x72; *ScaleFactor = 65536; } else if(uiImageWidth >=1920) { *font = (char *)&gDateStampFontTbl36x60; *ScaleFactor = 65536; } else if(uiImageWidth >=1080) { *font = (char *)&gDateStampFontTbl26x44; *ScaleFactor = 65536; } else if(uiImageWidth >=640) { *font = (char *)&gDateStampFontTbl12x20; *ScaleFactor = 65536; } else if(uiImageWidth >=320) { *font = (char *)&gDateStampFontTbl10x16; *ScaleFactor = 65536; } else { *font = (char *)&gDateStampFontTbl10x16; *ScaleFactor = 65536/3; } #endif } void UiDateImprint_GetStampFont(UINT32 uiImageWidth, char **font) { #if defined(_UI_STYLE_LVGL_) lv_plugin_res_id red_id; if(uiImageWidth >= 5632) { red_id = LV_USER_CFG_STAMP_FONT_ID_24M; } else 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; } DBG_IND("[%s:%d]uiImageWidth=%d,stamp font id=%d\n", __FUNCTION__, __LINE__, uiImageWidth, red_id); *font = (char *) lv_plugin_get_font(red_id)->font; #else if (uiImageWidth >= 3840) { *font = (char *)&gDateStampFontTbl56x96; } else if(uiImageWidth >=3600) { *font = (char *)&gDateStampFontTbl56x96; } else if(uiImageWidth >=3200) { *font = (char *)&gDateStampFontTbl56x96; } else if(uiImageWidth >=2880) { *font = (char *)&gDateStampFontTbl42x72; } else if(uiImageWidth >=1920) { *font = (char *)&gDateStampFontTbl36x60; } else if(uiImageWidth >=1080) { *font = (char *)&gDateStampFontTbl26x44; } else if(uiImageWidth >=640) { *font = (char *)&gDateStampFontTbl12x20; } else if(uiImageWidth >=320) { *font = (char *)&gDateStampFontTbl10x16; } else { *font = (char *)&gDateStampFontTbl10x16; } #endif } DATE_IMPRINT_INFO *UiDateImprint_Event2Info(IMG_CAP_DATASTAMP_EVENT event) { DATE_IMPRINT_INFO *pInfo; if (event == CAP_DS_EVENT_QV) pInfo = &pCtrl->info[DATE_IMPRINT_EVENT_QV]; else if (event == CAP_DS_EVENT_SCR) pInfo = &pCtrl->info[DATE_IMPRINT_EVENT_SCR]; else if (event == CAP_DS_EVENT_PRI) pInfo = &pCtrl->info[DATE_IMPRINT_EVENT_PRI]; else pInfo = NULL; return pInfo; } INT32 UiDateImprint_GenYuvData(DATE_IMPRINT_INFO *pInfo) { #if 1 FONT_CONV_IN *pIn = &pInfo->tYuvDesc; FONT_CONV_OUT *pOut = &pInfo->tYuvInfo; UINT32 photo_w = pInfo->pCapInfo->ImgInfo.ch[0].width; // UINT32 photo_h = pInfo->pCapInfo->ImgInfo.ch[0].height; DBG_IND("\r\n"); pIn->MemAddr = pInfo->MemAddr; pIn->MemSize = pInfo->MemSize; pIn->pStr = pInfo->StrBuf; #if defined(_UI_STYLE_LVGL_) pIn->ciSolid = LV_USER_CFG_STAMP_COLOR_TEXT; pIn->ciFrame = LV_USER_CFG_STAMP_COLOR_FRAME; pIn->ciTransparet = LV_USER_CFG_STAMP_COLOR_BACKGROUND; #else pIn->ciSolid = DATE_COLOR_RED; pIn->ciFrame = DATE_COLOR_TRANSPARENT; pIn->ciTransparet = DATE_COLOR_TRANSPARENT; #endif if(PhotoExe_GetCapYUV420En()){ pIn->Format = HD_VIDEO_PXLFMT_YUV420;//GX_IMAGE_PIXEL_FMT_YUV420_PACKED; }else{ pIn->Format = HD_VIDEO_PXLFMT_YUV422;//GX_IMAGE_PIXEL_FMT_YUV422_PACKED; } pIn->bEnableSmooth = FALSE; //ImgSize = photo_w*photo_h; #if 0 if (photo_w * photo_h <= 160 * 120) { //thumbnail Size pIn->pFont = (FONT *)gDemo_SmallFont; pIn->ScaleFactor = 65536 / 3; //0.33x } else if (photo_w * photo_h <= 640 * 480) { //VGA Size pIn->pFont = (FONT *)gDemo_SmallFont; pIn->ScaleFactor = 65536; //1.0x } else { UINT32 font_h, stamp_ratio; pIn->pFont = (FONT *)gDemo_BigFont; font_h = 190; stamp_ratio = 0x00000A00; //0.04x pIn->ScaleFactor = photo_h * stamp_ratio / font_h; } #else DBG_IND("photo_w=%d\r\n",photo_w); UiDateImprint_SelStampFont(photo_w, (char**)&pIn->pFont, &pIn->ScaleFactor); #endif #if defined(_UI_STYLE_LVGL_) if (FontConv_LVGL(pIn, pOut) != E_OK) { DBG_ERR("FontConv err\r\n"); return -1; } #else if (FontConv(pIn, pOut) != E_OK) { DBG_ERR("FontConv err\r\n"); return -1; } #endif #endif return 0; } INT32 UiDateImprint_CalcPosition(DATE_IMPRINT_INFO *pInfo, UPOINT *pos) { #if 1 IMG_CAP_DATASTAMP_INFO *pCapInfo = pInfo->pCapInfo; FONT_CONV_OUT *pYuvInfo = &pInfo->tYuvInfo; UINT32 ofs = 0; UINT32 photo_w = pCapInfo->ImgInfo.ch[0].width; UINT32 photo_h = pCapInfo->ImgInfo.ch[0].height; if ((pYuvInfo->GenImg.pw[0]) > photo_w) { DBG_ERR("event=%d, GenImg w %d> photo_w %d\r\n",pCapInfo->event,(pYuvInfo->GenImg.pw[0]),photo_w); return -1; } if (pYuvInfo->GenImg.ph[0] > photo_h) { DBG_ERR("GenImg h %d> photo_h %d\r\n",pYuvInfo->GenImg.ph[0],photo_h); return -1; } DBG_IND("photo_w =%d, photo_h=%d, gen w=%d, h=%d\r\n",photo_w,photo_h,(pYuvInfo->GenImg.pw[0]),pYuvInfo->GenImg.ph[0]); //Leave blank to the right of the date watermark ofs = pYuvInfo->GenImg.ph[0]/2; if(photo_w >= (pYuvInfo->GenImg.pw[0] + ofs)){ pos->x = ALIGN_ROUND_4(photo_w - pYuvInfo->GenImg.pw[0] - ofs); } else if(photo_w >= pYuvInfo->GenImg.pw[0]){ pos->x = ALIGN_ROUND_4(photo_w - pYuvInfo->GenImg.pw[0]); } else{ DBG_ERR("stamp width overflow!\n"); } if(photo_w >= pYuvInfo->GenImg.pw[0]){ pos->y = ALIGN_ROUND_4(photo_h - pYuvInfo->GenImg.ph[0]); } else{ DBG_ERR("stamp height overflow!\n"); } DBG_IND("pos->x =%d, pos->y=%d\r\n",pos->x, pos->y); #endif return 0; } ER UiDateImprint_UpdateData(DATE_IMPRINT_INFO *pInfo) { #if 1 DS_STAMP_INFOR *pStampInfo = &pInfo->StampInfo; FONT_CONV_OUT *pYuvInfo = &pInfo->tYuvInfo; UPOINT pos = {0}; if (UiDateImprint_GenYuvData(pInfo)< 0){ DBG_ERR("GenYuvData fail\r\n"); return E_SYS; } if (UiDateImprint_CalcPosition(pInfo,&pos) < 0){ DBG_ERR("CalcPosition fail\r\n"); return E_SYS; } pStampInfo->PosX = pos.x; pStampInfo->PosY = pos.y; DBG_IND("[%s:%d]pStampInfo->PosX=%d,pStampInfo->PosY=%d\n", __FUNCTION__, __LINE__, pStampInfo->PosX, pStampInfo->PosY); pStampInfo->Img = pYuvInfo->GenImg; //memcpy(&pStampInfo->Img, &pYuvInfo->GenImg, sizeof(VDO_FRAME)); pStampInfo->ColorKey = COLOR_MAKE_YUVD(pYuvInfo->ColorKeyY, pYuvInfo->ColorKeyCb, pYuvInfo->ColorKeyCr); pStampInfo->StampWeight = 255; DBG_IND("MemMax Use = %d bytes, MemMin Use=%d bytes\r\n", pYuvInfo->UsedMaxMemSize, pYuvInfo->UsedMemSize); #endif return E_OK; } void UiDateImprint_ChkUpdateData(DATE_IMPRINT_INFO *pInfo) { #if 1 UINT32 uiImageSize, ScreenNailSize; UINT32 bScreenNailEn=0; UINT32 bGenEn=0; ScreenNailSize = CFG_SCREENNAIL_SIZE; uiImageSize = UI_GetData(FL_PHOTO_SIZE); if (uiImageSize < ScreenNailSize) { bScreenNailEn=1; } if(pInfo->pCapInfo->event == CAP_DS_EVENT_SCR && bScreenNailEn){ bGenEn=1; }else if(pInfo->pCapInfo->event == CAP_DS_EVENT_PRI && bScreenNailEn==0){ bGenEn=1; } DBG_IND("event=%d, bScreenNailEn=%d, bGenEn=%d\r\n",pInfo->pCapInfo->event,bScreenNailEn,bGenEn); //if (pInfo->pCapInfo->event == CAP_DS_EVENT_QV || pInfo->pCapInfo->event == CAP_DS_EVENT_SCR) { if (pInfo->pCapInfo->event == CAP_DS_EVENT_QV || bGenEn) { #if HUNTING_CAMERA_MCU == ENABLE pInfo->isStrDirty = UiDateImprint_UpdateDate(pInfo->StrBuf,sizeof(pInfo->StrBuf)); #else if ((UI_GetData(FL_CONTINUE_SHOT) == CONTINUE_SHOT_BURST_3)) { if (pInfo->pic_cnt == 0) pInfo->isStrDirty = UiDateImprint_UpdateDate(pInfo->StrBuf,sizeof(pInfo->StrBuf)); else pInfo->isStrDirty = FALSE; } else { pInfo->isStrDirty = UiDateImprint_UpdateDate(pInfo->StrBuf,sizeof(pInfo->StrBuf)); } #endif } #if 0 // need to update primary info to screenail if (pInfo->pCapInfo->event == CAP_DS_EVENT_PRI) { DATE_IMPRINT_INFO *pScrInfo; pScrInfo= UiDateImprint_Event2Info(CAP_DS_EVENT_SCR); pScrInfo->isStrDirty = pInfo->isStrDirty; if (pInfo->isStrDirty == TRUE){ strncpy(pScrInfo->StrBuf,pInfo->StrBuf,sizeof(pScrInfo->StrBuf)); } } #else // need to update primary info to screenail //if (pInfo->pCapInfo->event == CAP_DS_EVENT_SCR) if (bGenEn && pInfo->pCapInfo->event == CAP_DS_EVENT_SCR) { DATE_IMPRINT_INFO *pScrInfo; pScrInfo= UiDateImprint_Event2Info(CAP_DS_EVENT_PRI); pScrInfo->isStrDirty = pInfo->isStrDirty; if (pInfo->isStrDirty == TRUE){ strncpy(pScrInfo->StrBuf,pInfo->StrBuf,sizeof(pScrInfo->StrBuf)); } } #endif pInfo->pic_cnt++; #endif } void UiDateImprint_DrawBG(DS_STAMP_INFOR *stampInfo, HD_VIDEO_FRAME* Img) { HD_GFX_DRAW_RECT param = {0}; param.dst_img.dim = Img->dim; param.dst_img.ddr_id = Img->ddr_id; param.dst_img.format = Img->pxlfmt; param.dst_img.lineoffset[0] = Img->loff[0]; param.dst_img.lineoffset[1] = Img->loff[1]; param.dst_img.p_phy_addr[0] = Img->phy_addr[0]; param.dst_img.p_phy_addr[1] = Img->phy_addr[1]; param.color = LV_USER_CFG_STAMP_COLOR_BACKGROUND; /* ARGB format */ param.thickness = 10; param.rect.w = Img->dim.w; param.rect.h = stampInfo->Img.dim.h*11/10; /*add heigt*/ param.rect.x = 0; //param.rect.y = stampInfo->PosY; param.rect.y = Img->dim.h - param.rect.h; param.type = HD_GFX_RECT_SOLID; DBG_IND("[%s:%d]Img->dim.h=%d,param.rect.h=%d,stampInfo->PosY=%d\n", __FUNCTION__, __LINE__, Img->dim.h, param.rect.h, stampInfo->PosY); hd_gfx_draw_rect(¶m); } void UiDateImprint_AttachString(DS_STAMP_INFOR *stampInfo, HD_VIDEO_FRAME* Img, UINT8* name, bool enable_ckey, UINT32 padding, UINT32* x_curr_ofs) { //lv_user_font_conv_draw_cfg draw_cfg = {0}; lv_user_font_conv_calc_buffer_size_result buff_size = {0}; lv_user_font_conv_mem_cfg mem_cfg = {0}; VF_GFX_SCALE param_img = {0}; HD_VIDEO_FRAME src_img; void *va; UINT32 pa; HD_RESULT ret; HD_COMMON_MEM_DDR_ID ddr_id = DDR_ID0; //_movie_stamp_lv_cfg_init(&draw_cfg); draw_cfg.string.text = (char*)name; /*draw_cfg.string.align = LV_USER_CFG_STAMP_TEXT_ALIGN; draw_cfg.align_w = LV_USER_FONT_CONV_ALIGN_W; draw_cfg.align_h = LV_USER_FONT_CONV_ALIGN_H; draw_cfg.mode = LV_USER_FONT_CONV_DRAW_TEXT; if(PhotoExe_GetCapYUV420En()) { draw_cfg.fmt = HD_VIDEO_PXLFMT_YUV420; }else { draw_cfg.fmt = HD_VIDEO_PXLFMT_YUV422; } UiDateImprint_GetStampFont(src_img.dim.w, (char**)&draw_cfg.string.font);*/ lv_user_font_conv_calc_buffer_size(&draw_cfg, &buff_size); ret = hd_common_mem_alloc("stamp_font", &pa, (void **)&va, buff_size.output_buffer_size, ddr_id); if (ret != HD_OK) { DBG_ERR("custom_stamp_buffer allocate failed\n\r"); } else { mem_cfg.output_buffer = va; mem_cfg.output_buffer_size = buff_size.output_buffer_size; } lv_user_font_conv(&draw_cfg, &mem_cfg); lv_user_font_conv_cfg_to_hd_frame( &draw_cfg, &mem_cfg, buff_size.width, buff_size.height, &src_img ); memset(¶m_img, 0, sizeof(param_img)); param_img.quality = HD_GFX_SCALE_QUALITY_NULL; param_img.src_img = src_img; param_img.src_region.x = 0; param_img.src_region.y = 0; param_img.src_region.w = src_img.dim.w; param_img.src_region.h = src_img.dim.h; param_img.engine = 0; param_img.dst_img = *Img; param_img.dst_region.w = (src_img.dim.w / src_img.dim.h) * stampInfo->Img.ph[0]; param_img.dst_region.h = stampInfo->Img.ph[0]; param_img.dst_region.x = (*x_curr_ofs - padding - param_img.dst_region.w); param_img.dst_region.y = param_img.dst_img.dim.h - param_img.dst_region.h; vf_gfx_scale(¶m_img, 1); hd_common_mem_free(pa, va); *x_curr_ofs = param_img.dst_region.x; } #define LV_USER_FONT_CONV_ALIGN_W 8 #define LV_USER_FONT_CONV_ALIGN_H 2 /* YUV color key */ #define CKEY_Y 0x0 #define CKEY_U 0x80 #define CKEY_V 0x80 void UiDateImprint_AttachICON(DS_STAMP_INFOR *stampInfo, HD_VIDEO_FRAME* Img, lv_plugin_res_id res_id, bool enable_ckey, UINT32 padding, UINT32* x_curr_ofs) { HD_VIDEO_PXLFMT out_fmt = HD_VIDEO_PXLFMT_YUV420; HD_VIDEO_FRAME src_img; void *va; UINT32 pa; HD_RESULT ret; HD_COMMON_MEM_DDR_ID ddr_id = DDR_ID0; /****************************************************************************** * Stamp image ******************************************************************************/ lv_user_font_conv_draw_cfg draw_cfg = {0}; lv_user_font_conv_calc_buffer_size_result buff_size = {0}; lv_user_font_conv_mem_cfg mem_cfg = {0}; lv_user_font_conv_draw_cfg_init(&draw_cfg); draw_cfg.align_w = LV_USER_FONT_CONV_ALIGN_W; draw_cfg.align_h = LV_USER_FONT_CONV_ALIGN_H; draw_cfg.fmt = out_fmt; draw_cfg.mode = LV_USER_FONT_CONV_DRAW_IMG; #if LV_COLOR_DEPTH == 8 extern uint32_t palette_define[]; draw_cfg.img.palette = palette_define; #else draw_cfg.img.palette = NULL; #endif draw_cfg.img.id = res_id; draw_cfg.enable_ckey = enable_ckey; draw_cfg.key_y = CKEY_Y; draw_cfg.key_u = CKEY_U; draw_cfg.key_v = CKEY_V; lv_user_font_conv_calc_buffer_size(&draw_cfg, &buff_size); ret = hd_common_mem_alloc("stamp_icon", &pa, (void **)&va, buff_size.output_buffer_size, ddr_id); if (ret != HD_OK) { DBG_ERR("custom_stamp_buffer allocate failed\n\r"); } else { mem_cfg.output_buffer = va; mem_cfg.output_buffer_size = buff_size.output_buffer_size; } /*********************************************************** * draw image **********************************************************/ VF_GFX_SCALE param_img = {0}; lv_user_font_conv(&draw_cfg, &mem_cfg); lv_user_font_conv_cfg_to_hd_frame( &draw_cfg, &mem_cfg, buff_size.width, buff_size.height, &src_img ); memset(¶m_img, 0, sizeof(param_img)); param_img.quality = HD_GFX_SCALE_QUALITY_NULL; param_img.src_img = src_img; param_img.src_region.x = 0; param_img.src_region.y = 0; param_img.src_region.w = src_img.dim.w; param_img.src_region.h = src_img.dim.h; param_img.engine = 0; param_img.dst_img = *Img; param_img.dst_region.w = (src_img.dim.w / src_img.dim.h) * stampInfo->Img.ph[0]; param_img.dst_region.h = stampInfo->Img.ph[0]; DBG_IND("[%s:%d]padding=%d,param_img.dst_region.w=%d,stampInfo->PosY=%d\n", __FUNCTION__, __LINE__, padding, param_img.dst_region.w, stampInfo->PosY); if(res_id == LV_PLUGIN_IMG_ID_ICON_10234_GPS) { param_img.dst_region.x = ALIGN_FLOOR_8(*x_curr_ofs - param_img.dst_region.w); } else { param_img.dst_region.x = (*x_curr_ofs - padding - param_img.dst_region.w); } param_img.dst_region.y = stampInfo->PosY; vf_gfx_scale(¶m_img, 1); hd_common_mem_free(pa, va); *x_curr_ofs = param_img.dst_region.x; } void UiDateImprint_AttachLogo(DS_STAMP_INFOR *stampInfo, HD_VIDEO_FRAME* Img) { extern const WATERLOGO_BUFFER g_WaterLogo_yuv420_486; HD_RESULT ret; VF_GFX_SCALE param = {0}; UINT32 pa; void* va; UINT32 blk_size = 0; UINT8 ddr_id = DDR_ID0; HD_VIDEO_FRAME logo = {0}; UINT32 lineoff[HD_VIDEO_MAX_PLANE] = {0}; UINT32 addr[HD_VIDEO_MAX_PLANE] = {0}; blk_size = (g_WaterLogo_yuv420_486.uiWidth * g_WaterLogo_yuv420_486.uiHeight * 3) / 2; ret = hd_common_mem_alloc("jack", &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; } memcpy(va,(void*) g_WaterLogo_yuv420_486.uiWaterLogoAddr, blk_size); lineoff[0] = g_WaterLogo_yuv420_486.uiWidth; lineoff[1] = g_WaterLogo_yuv420_486.uiWidth; addr[0] = pa; addr[1] = addr[0] + (lineoff[0] * g_WaterLogo_yuv420_486.uiHeight); vf_init_ex(&logo, g_WaterLogo_yuv420_486.uiWidth, g_WaterLogo_yuv420_486.uiHeight, Img->pxlfmt, lineoff, addr); DBG_IND("[%s:%d]Img->dim.w=%d, Img->dim.h=%d\n", __FUNCTION__, __LINE__, Img->dim.w, Img->dim.h); param.quality = HD_GFX_SCALE_QUALITY_NULL; param.src_img = logo; param.src_region.x = 0; param.src_region.y = 0; param.src_region.w = g_WaterLogo_yuv420_486.uiWidth; param.src_region.h = g_WaterLogo_yuv420_486.uiHeight; param.engine = 0; param.dst_img = *Img; param.dst_region.x = 0; param.dst_region.y = Img->dim.h - stampInfo->Img.ph[0]*3; param.dst_region.w = (g_WaterLogo_yuv420_486.uiWidth / g_WaterLogo_yuv420_486.uiHeight) * stampInfo->Img.ph[0]*3; param.dst_region.h = stampInfo->Img.ph[0]*3; DBG_IND("[%s:%d]param.dst_region:%d %d %d %d\n", __FUNCTION__, __LINE__, param.dst_region.x, param.dst_region.y, param.dst_region.w, param.dst_region.h); vf_gfx_scale(¶m, 1); hd_common_mem_free(pa, va); } #if HUNTING_CAMERA_MCU == ENABLE unsigned long DayCode[12]= {0,31,59,90,120,151,181,212,243,273,304,334}; unsigned long DayCode_Leap[12]= {0,31,60,91,121,152,182,213,244,274,305,335}; UINT8 sf_solar_to_Lunar(UINT16 Year,UINT8 Month, UINT8 Day) { float temp = 0,Tempnum = 0; UINT32 tempn = 0,tempQ = 0,tempR = 0,LunarDay = 0; UINT32 LunarDaytemp = 0; if(Year>=2000) Year=Year-2000; if (Year<21) { UINT16 wMonthAdd[12] = {0,31,59,90,120,151,181,212,243,273,304,334}; UINT32 wNongliData[100] = { 2635,333387,1701,1748,267701,694,2391,133423,1175,396438 ,3402,3749,331177,1453,694,201326,2350,465197,3221,3402 ,400202,2901,1386,267611,605,2349,137515,2709,464533,1738 ,2901,330421,1242,2651,199255,1323,529706,3733,1706,398762 ,2741,1206,267438,2647,1318,204070,3477,461653,1386,2413 ,330077,1197,2637,268877,3365,531109,2900,2922,398042,2395 ,1179,267415,2635,661067,1701,1748,398772,2742,2391,330031 ,1175,1611,200010,3749,527717,1452,2742,332397,2350,3222 ,268949,3402,3493,133973,1386,464219,605,2349,334123,2709 ,2890,267946,2773,592565,1210,2651,395863,1323,2707,265877 }; UINT16 wCurYear; UINT8 wCurMonth,wCurDay; int nIsEnd,m,k,n,i; UINT16 nTheDate,nBit; //static int wCurYear,wCurMonth,wCurDay; //static int nTheDate,nIsEnd,m,k,n,i,nBit; wCurYear = Year+2000; wCurMonth = Month; wCurDay = Day; nTheDate = (wCurYear - 1921) * 365 + (wCurYear - 1921) / 4 + wCurDay + wMonthAdd[wCurMonth - 1] - 38; if((!(wCurYear % 4)) && (wCurMonth > 2)) nTheDate = nTheDate + 1; nIsEnd = 0; m = 0; while(nIsEnd != 1) { if(wNongliData[m] < 4095) k = 11; else k = 12; n = k; while(n>=0) { nBit = wNongliData[m]; for(i=1; i=5) LunarDay=(Tempnum-tempn*29.5)+1; else if (LunarDaytemp%1000<10) LunarDay=30; else if (LunarDaytemp%1000>300) LunarDay=1; else LunarDay=Tempnum-tempn*29.5; // UI_PrintOSDNumber(LunarDay, 2, 6, 4); } return LunarDay; } void sf_get_gps_info_str(UINT8 *str, UINT8 type) { UINT32 i = 0; UIMenuStoreInfo *puiPara = sf_ui_para_get(); DBG_IND("[%s:%d]puiPara->GpsSwitch=%d,puiPara->Latitude:%s,puiPara->Longitude:%s\n", __FUNCTION__, __LINE__, puiPara->GpsSwitch, puiPara->Latitude, puiPara->Longitude); if(puiPara->GpsSwitch == SF_ON) { if((puiPara->Latitude[0] == '\0') || (puiPara->Longitude[0] == '\0')) { str[0] = '\0'; } else if(type == 1) { str[i++] = puiPara->Latitude[9]; str[i++] = puiPara->Latitude[0]; str[i++] = puiPara->Latitude[1]; str[i++] = 0xC2; str[i++] = 0xB0; str[i++] = puiPara->Latitude[2]; str[i++] = puiPara->Latitude[3]; str[i++] = 0x27; // ' str[i++] = puiPara->Latitude[5]; str[i++] = puiPara->Latitude[6]; str[i++] = 0x22; // " str[i++] = ' '; str[i++] = puiPara->Longitude[10]; str[i++] = puiPara->Longitude[0]; str[i++] = puiPara->Longitude[1]; str[i++] = puiPara->Longitude[2]; str[i++] = 0xC2; str[i++] = 0xB0; str[i++] = puiPara->Longitude[3]; str[i++] = puiPara->Longitude[4]; str[i++] = 0x27; // ' str[i++] = puiPara->Longitude[6]; str[i++] = puiPara->Longitude[7]; str[i++] = 0x22; // " str[i++] = '\0'; } else if(type == 2) { str[i++] = puiPara->Latitude[9]; str[i++] = puiPara->Latitude[0]; str[i++] = puiPara->Latitude[1]; str[i++] = 0x2A; str[i++] = puiPara->Latitude[2]; str[i++] = puiPara->Latitude[3]; str[i++] = 0x27; // ' str[i++] = puiPara->Latitude[5]; str[i++] = puiPara->Latitude[6]; str[i++] = 0x22; // " str[i++] = ' '; str[i++] = puiPara->Longitude[10]; str[i++] = puiPara->Longitude[0]; str[i++] = puiPara->Longitude[1]; str[i++] = puiPara->Longitude[2]; str[i++] = 0x2A; str[i++] = puiPara->Longitude[3]; str[i++] = puiPara->Longitude[4]; str[i++] = 0x27; // ' str[i++] = puiPara->Longitude[6]; str[i++] = puiPara->Longitude[7]; str[i++] = 0x22; // " str[i++] = '\0'; } else if(type == 3) { str[i++] = puiPara->Latitude[9]; str[i++] = puiPara->Latitude[0]; str[i++] = puiPara->Latitude[1]; str[i++] = '.'; str[i++] = puiPara->Latitude[2]; str[i++] = puiPara->Latitude[3]; str[i++] = '.'; str[i++] = puiPara->Latitude[5]; str[i++] = puiPara->Latitude[6]; str[i++] = '-'; str[i++] = puiPara->Longitude[10]; str[i++] = puiPara->Longitude[0]; str[i++] = puiPara->Longitude[1]; str[i++] = puiPara->Longitude[2]; str[i++] = '.'; str[i++] = puiPara->Longitude[3]; str[i++] = puiPara->Longitude[4]; str[i++] = '.'; str[i++] = puiPara->Longitude[6]; str[i++] = puiPara->Longitude[7]; str[i++] = '\0'; } } else { str[0] = '\0'; } DBG_IND("[%s:%d]str:%s\n", __FUNCTION__, __LINE__, str); return; } #endif ER UiDateImprint_CopyData(DS_STAMP_INFOR *stampInfo,HD_VIDEO_FRAME* Img, UINT32 copyEngine) { ER ret =E_OK; VF_GFX_COPY param ={0}; UINT8 customString[32] = {0}; INT32 year = 0, month = 0, day = 0; UINT8 moonday = 0; UINT8 batValue = 0; UIMenuStoreInfo *puiPara = sf_ui_para_get(); if (stampInfo->StampWeight == 255) { VOS_TICK t1, t2; UINT32 padding = stampInfo->Img.ph[0]; UINT32 x_curr_ofs = stampInfo->PosX; /* start from date stamp */ DBG_IND("[%s:%d]padding=%d\n", __FUNCTION__, __LINE__, padding); vos_perf_mark(&t1); //draw stamp background. UiDateImprint_DrawBG(stampInfo, Img); //moon stamp year = DateTime_Get(DATETIME_YEAR); month = DateTime_Get(DATETIME_MONTH); day = DateTime_Get(DATETIME_DAY); DBG_IND("[%s:%d]get date time:%04d %02d %02d\n", __FUNCTION__, __LINE__, year, month, day); moonday = (sf_solar_to_Lunar(year, month, day)) - 1; UiDateImprint_AttachICON(stampInfo, Img, (LV_PLUGIN_IMG_ID_ICON_10200_MOON + moonday), true, padding, &x_curr_ofs); //battery stamp batValue = sf_cardv_battery_level_get(); if(batValue < SF_BATT_LEVEL_1) { batValue = 1; } batValue -= 1; UiDateImprint_AttachICON(stampInfo, Img, (LV_PLUGIN_IMG_ID_ICON_10230_BATTERT + batValue), true, padding, &x_curr_ofs); DBG_IND("[%s:%d]moon id=%d,battery id=%d\n", __FUNCTION__, __LINE__, (LV_PLUGIN_IMG_ID_ICON_10200_MOON + moonday), (LV_PLUGIN_IMG_ID_ICON_10230_BATTERT + batValue)); //camid stamp if((puiPara->CamNameSwitch == SF_CAMID_ON) && (puiPara->CamNameStr[0] != '\0')) { snprintf((char *)customString, sizeof(customString), "%s", puiPara->CamNameStr); DBG_IND("[%s:%d]customString=%s\n", __FUNCTION__, __LINE__, customString); UiDateImprint_AttachString(stampInfo, Img, customString, true, padding, &x_curr_ofs); } //gps stamp //sprintf((char *)puiPara->Latitude, "3458.3100N"); //sprintf((char *)puiPara->Longitude, "12294.4200E"); sf_get_gps_info_str(customString, 1); if(0/*(puiPara->GpsSwitch == SF_ON) && (customString[0] != '\0')*/) { if(customString[0] != '\0') { //snprintf((char *)customString, sizeof(customString), "N22%c%c34'57\" E113%c%c55'19\"", 0xC2, 0xB0, 0xC2, 0xB0); DBG_IND("[%s:%d]customString=%s\n", __FUNCTION__, __LINE__, customString); UiDateImprint_AttachString(stampInfo, Img, customString, true, padding, &x_curr_ofs); } UiDateImprint_AttachICON(stampInfo, Img, LV_PLUGIN_IMG_ID_ICON_10234_GPS, true, padding, &x_curr_ofs); } //logo stamp UiDateImprint_AttachLogo(stampInfo, Img); vos_perf_mark(&t2); DBG_DUMP("*** dur = %lu ms ***\n", vos_perf_duration(t1, t2)); param.src_img = stampInfo->Img; param.src_region.x = 0; param.src_region.y = 0; param.src_region.w = stampInfo->Img.loff[0]; param.src_region.h = stampInfo->Img.ph[0]; param.dst_img = *Img; param.dst_pos.x=stampInfo->PosX; param.dst_pos.y=stampInfo->PosY; param.colorkey=stampInfo->ColorKey; param.engine=copyEngine; param.alpha = 255; ret = vf_gfx_copy(¶m); } else { DBG_ERR("Not support StampWeight = %d\r\n",stampInfo->StampWeight); } return ret; } BOOL UiDateImprint_GenData(IMG_CAP_DATASTAMP_INFO *pCapInfo) { DATE_IMPRINT_INFO *pInfo; //IMG_BUF Img = {0}; HD_VIDEO_FRAME Img = {0}; UINT32 LineOff[MAX_PLANE_NUM]; UINT32 PxlAddr[MAX_PLANE_NUM]; #if USE_DBG_STAMP UINT32 time_start,time_end; #endif HD_RESULT hd_ret; DBG_IND("event %d, width =%d, height =%d, line_ofs[0]=%d, line_ofs[1]=%d\r\n",pCapInfo->event,pCapInfo->ImgInfo.ch[0].width,pCapInfo->ImgInfo.ch[0].height,pCapInfo->ImgInfo.ch[0].line_ofs,pCapInfo->ImgInfo.ch[1].line_ofs); pInfo = UiDateImprint_Event2Info(pCapInfo->event); if (pInfo == NULL){ DBG_ERR("Unknown event %d\r\n",pCapInfo->event); return FALSE; } UiDateImprint_Lock(pInfo->lockptn); pInfo->pCapInfo = pCapInfo; UiDateImprint_ChkUpdateData(pInfo); DBG_IND("isStrDirty %d\r\n",pInfo->isStrDirty); #if USE_DBG_STAMP time_start = Perf_GetCurrent(); #endif if (pInfo->isStrDirty) { if (UiDateImprint_UpdateData(pInfo)!=E_OK){ return FALSE; } } #if 0 GxImg_DumpBuf(&pYuvInfo->GenImg, TRUE); #endif PxlAddr[0] = pCapInfo->ImgInfo.pixel_addr[0]; PxlAddr[1] = pCapInfo->ImgInfo.pixel_addr[1]; LineOff[0] = pCapInfo->ImgInfo.ch[0].line_ofs; LineOff[1] = pCapInfo->ImgInfo.ch[1].line_ofs; if(PhotoExe_GetCapYUV420En()){ //gximg_init_buf_ex(&Img, pCapInfo->ImgInfo.ch[0].width, pCapInfo->ImgInfo.ch[0].height, GX_IMAGE_PIXEL_FMT_YUV420_PACKED, LineOff, PxlAddr); if ((hd_ret = vf_init_ex(&Img, pCapInfo->ImgInfo.ch[0].width, pCapInfo->ImgInfo.ch[0].height, HD_VIDEO_PXLFMT_YUV420, LineOff, PxlAddr)) != HD_OK) { DBG_ERR("vf_init_ex 420 failed(%d)\r\n", hd_ret); } }else{ //gximg_init_buf_ex(&Img, pCapInfo->ImgInfo.ch[0].width, pCapInfo->ImgInfo.ch[0].height, GX_IMAGE_PIXEL_FMT_YUV422_PACKED, LineOff, PxlAddr); if ((hd_ret = vf_init_ex(&Img, pCapInfo->ImgInfo.ch[0].width, pCapInfo->ImgInfo.ch[0].height, HD_VIDEO_PXLFMT_YUV422, LineOff, PxlAddr)) != HD_OK) { DBG_ERR("vf_init_ex 422 failed(%d)\r\n", hd_ret); } } //DBG_ERR("Img.phy_addr=0x%x,0x%x,0x%x\r\n",Img.phy_addr[0],Img.phy_addr[1],Img.phy_addr[2]); #if 1 UiDateImprint_CopyData(&pInfo->StampInfo,&Img,pInfo->copyEngine); #else IRECT srcRegion; srcRegion.x = pInfo->StampInfo.PosX; srcRegion.y = pInfo->StampInfo.PosY; srcRegion.w = pInfo->StampInfo.Img.loff[0]; srcRegion.h = pInfo->StampInfo.Img.ph[0]; VF_GFX_COPY param ={0}; #if 0 param.src_img=Img; param.src_region.x=srcRegion.x; param.src_region.y=srcRegion.y; param.src_region.w=srcRegion.w; param.src_region.h=srcRegion.h; param.dst_img=pInfo->StampInfo.Img; param.dst_pos.x=0; param.dst_pos.y=0; #else param.src_img=pInfo->StampInfo.Img; param.src_region.x=0; param.src_region.y=0; param.src_region.w=srcRegion.w; param.src_region.h=srcRegion.h; param.dst_img=Img; param.dst_pos.x=pInfo->StampInfo.PosX; param.dst_pos.y=pInfo->StampInfo.PosY; #endif param.colorkey=pInfo->StampInfo.ColorKey; param.engine=pInfo->copyEngine; //DBG_ERR("param.src_img.phy_addr=0x%x,0x%x,0x%x\r\n",param.src_img.phy_addr[0],param.src_img.phy_addr[1],param.src_img.phy_addr[2]); #if 0 { FST_FILE hFile = NULL; UINT32 filesize; char filenamey[32]={0}; static UINT32 count=0; sprintf(filenamey,"A:\\test_STASY_%d.RAW",count); count++; DBG_DUMP("wxh=%dx%d,loff=%d, %s...\r\n", param.dst_img.pw[0], param.dst_img.ph[0],param.dst_img.loff[0],filenamey); filesize = param.dst_img.loff[0]*param.dst_img.ph[0]; hFile = FileSys_OpenFile(filenamey, FST_CREATE_ALWAYS | FST_OPEN_WRITE); FileSys_WriteFile(hFile, (UINT8 *)param.dst_img.phy_addr[0], &filesize, 0, NULL); FileSys_CloseFile(hFile); } #endif //IRECT dst_region={388,440,240,20}; //gximg_fill_data((VDO_FRAME *)&(Img), GXIMG_REGION_MATCH_IMG, COLOR_YUV_RED); //gximg_fill_data((VDO_FRAME *)&(param.dst_img), GXIMG_REGION_MATCH_IMG, COLOR_YUV_RED); //ret = GxImg_CopyColorkeyData(Img,&srcRegion,&stampInfo->Img,REGION_MATCH_IMG,stampInfo->ColorKey,FALSE, copyEngine); //ret = gximg_copy_color_key_data(Img,&srcRegion,&stampInfo->Img,GXIMG_REGION_MATCH_IMG,stampInfo->ColorKey,FALSE, copyEngine); //vf_gfx_copy(¶m); vf_gfx_I8_colorkey(¶m); #endif #if USE_DBG_STAMP time_end = Perf_GetCurrent(); DBG_DUMP("Time Use = %d ms\r\n", (time_end-time_start) / 1000); #endif UiDateImprint_UnLock(pInfo->lockptn); return TRUE; }