From baefeb41c0f1732ae4ab636e19a9bab87ce1d87c Mon Sep 17 00:00:00 2001 From: payton Date: Tue, 31 Oct 2023 17:56:27 +0800 Subject: [PATCH] =?UTF-8?q?1.Linux=E4=B8=8B=E6=B0=B4=E5=8D=B0=E4=BF=AE?= =?UTF-8?q?=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cardv/SrcCode/PrjCfg_HUNTING_S550.h | 1 + .../cardv/SrcCode/UIApp/Photo/UIAppPhoto.h | 34 +- .../SrcCode/UIApp/Photo/UIAppPhoto_Exe.c | 530 ++++++++++++++---- .../cardv/SrcCode/UIApp/Photo/UIDateImprint.c | 2 +- 4 files changed, 432 insertions(+), 135 deletions(-) diff --git a/code/application/source/cardv/SrcCode/PrjCfg_HUNTING_S550.h b/code/application/source/cardv/SrcCode/PrjCfg_HUNTING_S550.h index bd02a19ee..2618bdd26 100755 --- a/code/application/source/cardv/SrcCode/PrjCfg_HUNTING_S550.h +++ b/code/application/source/cardv/SrcCode/PrjCfg_HUNTING_S550.h @@ -918,6 +918,7 @@ #define HUNTING_CAMERA_4G ENABLE//DISABLE #define PHOTO_PREVIEW_SLICE_ENC_FUNC ENABLE #define PHOTO_PREVIEW_SLICE_ENC_VER2_FUNC ENABLE +#define PHOTO_PREVIEW_SLICE_ENC_SRC_STAMP ENABLE #define DZOOM_FUNC ENABLE #define HUNTING_MCU_I2C DISABLE #define HUNTING_MCU_UART ENABLE diff --git a/code/application/source/cardv/SrcCode/UIApp/Photo/UIAppPhoto.h b/code/application/source/cardv/SrcCode/UIApp/Photo/UIAppPhoto.h index 0717d5ef0..765bf8335 100755 --- a/code/application/source/cardv/SrcCode/UIApp/Photo/UIAppPhoto.h +++ b/code/application/source/cardv/SrcCode/UIApp/Photo/UIAppPhoto.h @@ -73,12 +73,29 @@ #else #if PHOTO_PREVIEW_SLICE_ENC_FUNC #define PHOTO_MAX_CAP_SIZE UIAPP_PHOTO_SIZE_40M /* Max slice encode size */ - #define PHOTO_SLICE_ENC_MIN_CAP_SIZE UIAPP_PHOTO_SIZE_2M /* UI Menu only display options which size is larger than PHOTO_SLICE_ENC_MIN_CAP_SIZE */ + #define PHOTO_MIN_CAP_SIZE UIAPP_PHOTO_SIZE_2M /* UI Menu only display options which size is larger than PHOTO_SLICE_ENC_MIN_CAP_SIZE */ #else #define PHOTO_MAX_CAP_SIZE UIAPP_PHOTO_SIZE_12M #endif #endif +#if PHOTO_PREVIEW_SLICE_ENC_FUNC == ENABLE +#define CFG_JPG_PREVIEW_SLICE_ENC_PRIMARY_BUF_WIDTH 1920 +#define CFG_JPG_PREVIEW_SLICE_ENC_PRIMARY_BUF_HEIGHT 1080 +#define CFG_JPG_PREVIEW_SLICE_ENC_PRIMARY_BUF_SIZE VDO_YUV_BUFSIZE(CFG_JPG_PREVIEW_SLICE_ENC_PRIMARY_BUF_WIDTH, CFG_JPG_PREVIEW_SLICE_ENC_PRIMARY_BUF_HEIGHT, HD_VIDEO_PXLFMT_YUV420) +#define CFG_JPG_PREVIEW_SLICE_ENC_BS_BUF_RATIO JPG_COMERESSED_RATIO_8 /* (yuv size / ratio) + header = bs buf size */ +#define CFG_JPG_PREVIEW_SLICE_ENC_INIT_QUALITY_PRIMARY 90 +#define CFG_JPG_PREVIEW_SLICE_ENC_INIT_QUALITY_THUMBNAIL 70 +#define CFG_JPG_PREVIEW_SLICE_ENC_INIT_QUALITY_SCREENNAIL 70 +#define CFG_JPG_PREVIEW_SLICE_ENC_QUALITY_STEP 10 + +#define CFG_JPG_PREVIEW_SLICE_ENC_RC_SCREENNAIL 1 /* rate control */ +#define CFG_JPG_PREVIEW_SLICE_ENC_RC_SCREENNAIL_UBOUND (SCREENNAIL_TARGETBYTERATE + (SCREENNAIL_TARGETBYTERATE * 20 / 100)) +#define CFG_JPG_PREVIEW_SLICE_ENC_RC_SCREENNAIL_LBOUND (SCREENNAIL_TARGETBYTERATE - (SCREENNAIL_TARGETBYTERATE * 20 / 100)) +#define CFG_JPG_PREVIEW_SLICE_ENC_RC_SCREENNAIL_QUALITY_STEP 2 + +#endif + #define JPG_COMERESSED_RATIO_5 (5) #define JPG_COMERESSED_RATIO_6 (6) #define JPG_COMERESSED_RATIO_7 (7) @@ -105,22 +122,7 @@ #define PRIMARY_TARGETBYTERATE_LBOUND(TBR) (TBR - (TBR * 15 / 100)) #define JPG_FILE_BUFFER_SIZE(primary, screenail, thumbnail, exif) (primary + screenail + thumbnail + exif*6) -#if PHOTO_PREVIEW_SLICE_ENC_FUNC == ENABLE -#define CFG_JPG_PREVIEW_SLICE_ENC_PRIMARY_BUF_WIDTH 1920 -#define CFG_JPG_PREVIEW_SLICE_ENC_PRIMARY_BUF_HEIGHT 1080 -#define CFG_JPG_PREVIEW_SLICE_ENC_PRIMARY_BUF_SIZE VDO_YUV_BUFSIZE(CFG_JPG_PREVIEW_SLICE_ENC_PRIMARY_BUF_WIDTH, CFG_JPG_PREVIEW_SLICE_ENC_PRIMARY_BUF_HEIGHT, HD_VIDEO_PXLFMT_YUV420) -#define CFG_JPG_PREVIEW_SLICE_ENC_BS_BUF_RATIO 8 /* (yuv size / ratio) + header = bs buf size */ -#define CFG_JPG_PREVIEW_SLICE_ENC_INIT_QUALITY_PRIMARY 90 -#define CFG_JPG_PREVIEW_SLICE_ENC_INIT_QUALITY_THUMBNAIL 70 -#define CFG_JPG_PREVIEW_SLICE_ENC_INIT_QUALITY_SCREENNAIL 70 -#define CFG_JPG_PREVIEW_SLICE_ENC_QUALITY_STEP 3 -#define CFG_JPG_PREVIEW_SLICE_ENC_RC_SCREENNAIL 1 /* rate control */ -#define CFG_JPG_PREVIEW_SLICE_ENC_RC_SCREENNAIL_UBOUND (SCREENNAIL_TARGETBYTERATE + (SCREENNAIL_TARGETBYTERATE * 20 / 100)) -#define CFG_JPG_PREVIEW_SLICE_ENC_RC_SCREENNAIL_LBOUND (SCREENNAIL_TARGETBYTERATE - (SCREENNAIL_TARGETBYTERATE * 20 / 100)) -#define CFG_JPG_PREVIEW_SLICE_ENC_RC_SCREENNAIL_QUALITY_STEP 2 - -#endif extern UINT32 gPhotoFrameBuf; diff --git a/code/application/source/cardv/SrcCode/UIApp/Photo/UIAppPhoto_Exe.c b/code/application/source/cardv/SrcCode/UIApp/Photo/UIAppPhoto_Exe.c index d7df8b1a3..0470dc728 100755 --- a/code/application/source/cardv/SrcCode/UIApp/Photo/UIAppPhoto_Exe.c +++ b/code/application/source/cardv/SrcCode/UIApp/Photo/UIAppPhoto_Exe.c @@ -35,6 +35,11 @@ #if HUNTING_CAMERA_MCU == ENABLE #include #endif + +#if (USE_DCF == ENABLE) +#include "DCF.h" +#endif + #define THIS_DBGLVL 2 // 0=FATAL, 1=ERR, 2=WRN, 3=UNIT, 4=FUNC, 5=IND, 6=MSG, 7=VALUE, 8=USER #if 1//_TODO @@ -133,7 +138,8 @@ PHOTO_STRM_CBR_INFO g_tStrmCbrInfo[SENSOR_MAX_NUM] = { #define PHOTO_SLICE_ENC_DBG_PERF 0 #define PHOTO_SLICE_ENC_DBG_DUMP 0 #define PHOTO_SLICE_ENC_DBG_PRIMARY_YUV 0 -#define PHOTO_SLICE_ENC_DBG_SLICE_YUV 0 +#define PHOTO_SLICE_ENC_DBG_SRC_SLICE_YUV 0 +#define PHOTO_SLICE_ENC_DBG_DST_SLICE_YUV 0 #define PHOTO_SLICE_ENC_DBG_PRIMARY_JPG 0 #define PHOTO_SLICE_ENC_DBG_SCREENNAIL_JPG 0 @@ -219,7 +225,7 @@ static PhotoExe_SliceEncode_Info* PhotoExe_Preview_SliceEncode_Get_Info(const PH static INT32 PhotoExe_Preview_SliceEncode_Open(void); static INT32 PhotoExe_Preview_SliceEncode_Close(void); static INT32 PhotoExe_Preview_SliceEncode_Get_Dst_Slice_Info(PhotoExe_SliceSize_Info *info, UINT32 cap_size_w, UINT32 cap_size_h, UINT32 slice_num); -static INT32 PhotoExe_Preview_SliceEncode_Get_Curr_Dst_Slice_Info(PhotoExe_SliceSize_Info *info); +static INT32 PhotoExe_Preview_SliceEncode_Get_Curr_Dst_Slice_Info(PhotoExe_SliceSize_Info *info, const HD_VIDEO_FRAME src_frame); static INT32 PhotoExe_Preview_SliceEncode_Get_Max_Dst_Slice_Info(PhotoExe_SliceSize_Info *info); static UINT32 PhotoExe_Preview_SliceEncode_Get_Max_Dst_Slice_Buffer_Size(HD_VIDEO_PXLFMT pxl_fmt); static HD_DIM PhotoExe_Preview_SliceEncode_Get_Encode_Max_Size(void); @@ -695,12 +701,12 @@ UINT32 PhotoExe_GetFreePicNum(void) #endif uiFreeSpace = FileSys_GetDiskInfo(FST_INFO_FREE_SPACE); - DBG_IND("[cap]Free Space = %d KB\r\n", uiFreeSpace / 1024); + //DBG_IND("[cap]Free Space = %d KB\r\n", uiFreeSpace / 1024); size = UI_GetData(FL_PHOTO_SIZE); CaptureSize = PhotoExe_GetExpectSize_RhoBRCrtl(size, TRUE); - DBG_IND("[cap]CaptureSize = %d K \r\n", CaptureSize / 1024); + //DBG_IND("[cap]CaptureSize = %d K \r\n", CaptureSize / 1024); if (uiFreeSpace < reserveSize) { freeImgNum = 0; @@ -708,7 +714,7 @@ UINT32 PhotoExe_GetFreePicNum(void) freeImgNum = (uiFreeSpace - reserveSize) / CaptureSize; } - DBG_IND("[cap]Free ImgNum = %d\r\n", freeImgNum); + //DBG_IND("[cap]Free ImgNum = %d\r\n", freeImgNum); uiMaxImageSize = CaptureSize + reserveSize; //uiMaxImageSize = CaptureSize ; @@ -717,7 +723,7 @@ UINT32 PhotoExe_GetFreePicNum(void) localInfo->uiMaxImageSize = uiMaxImageSize; //NA51055-1333 localInfo->uiMaxImageSize = ALIGN_CEIL_4(localInfo->uiMaxImageSize); - DBG_IND("[cap]uiMaxImageSize = %ld KB\r\n", uiMaxImageSize / 1024); + //DBG_IND("[cap]uiMaxImageSize = %ld KB\r\n", uiMaxImageSize / 1024); //#NT#store in info localInfo->FreePicNum = freeImgNum; @@ -737,16 +743,16 @@ UINT32 PhotoExe_GetTotalPicNum(void) UINT32 size; uiSpace = FileSys_GetDiskInfo(FST_INFO_DISK_SIZE); - DBG_IND("[cap]Free Space = %d KB\r\n", uiSpace / 1024); + //DBG_IND("[cap]Free Space = %d KB\r\n", uiSpace / 1024); size = UI_GetData(FL_PHOTO_SIZE); CaptureSize = PhotoExe_GetExpectSize_RhoBRCrtl(size, TRUE); - DBG_IND("[cap]CaptureSize = %d K \r\n", CaptureSize / 1024); + //DBG_IND("[cap]CaptureSize = %d K \r\n", CaptureSize / 1024); totalImgNum = (uiSpace - reserveSize) / CaptureSize; - DBG_IND("[cap]Free ImgNum = %d\r\n", totalImgNum); + //DBG_IND("[cap]Free ImgNum = %d\r\n", totalImgNum); return totalImgNum; } @@ -4258,6 +4264,10 @@ static INT32 PhotoExe_Preview_SliceEncode_Open(void) in = HD_VIDEOENC_IN(0, first_out_port); out = HD_VIDEOENC_OUT(0, first_out_port); ret = hd_videoenc_open(in, out, &venc_path_id); + if (ret != HD_OK ){ + DBG_ERR("hd_videoenc_open(%lx, %lx) failed(%d)!\r\n", in, out, ret); + goto EXIT; + } if (ret != HD_OK ){ DBG_ERR("hd_videoenc_open(%lx, %lx) failed(%d)!\r\n", in, out, ret); @@ -4349,7 +4359,7 @@ EXIT: static INT32 PhotoExe_Preview_SliceEncode_Close(void) { - HD_RESULT ret; + HD_RESULT ret = HD_OK; HD_PATH_ID path_id = 0; for(int i=0 ; iheight = video_frame.dim.h; if(src_info->slice_num > 1){ - src_info->slice_height = ALIGN_CEIL((src_info->width * dst_info->slice_height) / dst_info->width, 2); + src_info->slice_height = ALIGN_CEIL((src_info->height) / src_info->slice_num, 2); src_info->last_slice_height = ALIGN_CEIL(src_info->height - src_info->slice_height * (src_info->slice_num - 1), 2); } else{ @@ -4393,6 +4403,14 @@ static void PhotoExe_Preview_SliceEncode_Get_Src_Slice_Info( src_info->last_slice_height = src_info->slice_height; } + if(src_info->slice_height * (src_info->slice_num - 1) >= src_info->height){ + DBG_ERR("aligned total slice height(%lu * %lu + %lu = %lu) exceed photo height(%lu)!\n", + src_info->slice_height, + src_info->slice_num - 1, + src_info->last_slice_height, + src_info->height); + } + PHOTO_SLICE_ENC_DUMP("Src Slice Info: size = {%lu,%lu} slice num = {%lu} slice height = {%lu} last slice height = {%lu}\r\n", src_info->width, src_info->height, src_info->slice_num, src_info->slice_height, src_info->last_slice_height); } @@ -4409,11 +4427,17 @@ static INT32 PhotoExe_Preview_SliceEncode_Get_Dst_Slice_Info(PhotoExe_SliceSize_ info->width = cap_size_w; info->height = cap_size_h; info->slice_num = slice_num; + + if(info->height == 1080 && slice_num == 1){ + info->slice_height = info->height; + } + else{ info->slice_height = ALIGN_CEIL_16(info->height / info->slice_num); + } if(info->slice_height * (info->slice_num - 1) > info->height){ - DBG_ERR("calculate last slice height error! \n"); + DBG_ERR("calculate last slice height error! (slice height = %lu , slice num = %lu , photo height = %lu)\n", info->slice_height, info->slice_num, info->height); return E_SYS; } @@ -4425,23 +4449,52 @@ static INT32 PhotoExe_Preview_SliceEncode_Get_Dst_Slice_Info(PhotoExe_SliceSize_ return E_OK; } -static INT32 PhotoExe_Preview_SliceEncode_Get_Curr_Dst_Slice_Info(PhotoExe_SliceSize_Info *info) +static INT32 PhotoExe_Preview_SliceEncode_Get_Curr_Dst_Slice_Info(PhotoExe_SliceSize_Info *info, const HD_VIDEO_FRAME src_frame) { UINT32 cap_size_w = GetPhotoSizeWidth(SysGetFlag(FL_PHOTO_SIZE)); UINT32 cap_size_h = GetPhotoSizeHeight(SysGetFlag(FL_PHOTO_SIZE)); + UINT32 max_slice_num; UINT32 slice_num; unsigned int cap_size = cap_size_w * cap_size_h; unsigned int buf_size = CFG_JPG_PREVIEW_SLICE_ENC_PRIMARY_BUF_WIDTH * CFG_JPG_PREVIEW_SLICE_ENC_PRIMARY_BUF_HEIGHT; if(buf_size > cap_size){ + max_slice_num = 1; slice_num = 1; } else{ PHOTO_SLICE_ENC_DUMP("cap_size = %lu buf_size = %lu\n", cap_size, buf_size); UINT32 lines = (buf_size / cap_size_w); - slice_num = cap_size_h / lines + (cap_size_h % lines ? 1 : 0); + max_slice_num = cap_size_h / lines + (cap_size_h % lines ? 1 : 0); + + UINT32 tmp_src_h = src_frame.dim.h / 2; + UINT32 tmp_dst_h = cap_size_h / 16; + UINT32 found_common_factor = 0; + UINT32 i; + + for (i = 1; i <= (tmp_src_h > tmp_dst_h ? tmp_dst_h : tmp_src_h) ; ++i) + { + if (tmp_src_h % i == 0 && tmp_dst_h % i == 0) + { + PHOTO_SLICE_ENC_DUMP("common factor = %d\n", i); + + if(max_slice_num < i){ + found_common_factor = i; + break; + } + } + } + + if(found_common_factor){ + slice_num = found_common_factor; + PHOTO_SLICE_ENC_DUMP("use common factor %d\n ", slice_num); + } + else{ + slice_num = max_slice_num; + PHOTO_SLICE_ENC_DUMP("use max slice num %d\n ", slice_num); + } } return PhotoExe_Preview_SliceEncode_Get_Dst_Slice_Info(info, cap_size_w, cap_size_h, slice_num); @@ -4451,31 +4504,83 @@ static UINT32 PhotoExe_Preview_SliceEncode_Get_Max_Dst_Slice_Buffer_Size(HD_VIDE { HD_DIM dim = PhotoExe_Preview_SliceEncode_Get_Encode_Max_Size(); UINT32 reserved_buffer = 0; - UINT32 max_buffer_size = VDO_YUV_BUFSIZE(dim.w, dim.h, pxl_fmt) + reserved_buffer; + UINT32 max_buffer_size = VDO_YUV_BUFSIZE(ALIGN_CEIL(dim.w, 16), ALIGN_CEIL(dim.h, 16), pxl_fmt) + reserved_buffer; return max_buffer_size; } static INT32 PhotoExe_Preview_SliceEncode_Get_Max_Dst_Slice_Info(PhotoExe_SliceSize_Info *info) { - UINT32 cap_size_w = GetPhotoSizeWidth(PHOTO_MAX_CAP_SIZE); - UINT32 cap_size_h = GetPhotoSizeHeight(PHOTO_MAX_CAP_SIZE); + static PhotoExe_SliceSize_Info max_slice_info = {0}; + UINT32 max_slice_num; UINT32 slice_num; - - unsigned int cap_size = cap_size_w * cap_size_h; + INT32 ret = E_OK; + UIAPP_PHOTO_SENSOR_INFO *sensor_info = UIAppPhoto_get_SensorInfo(0); unsigned int buf_size = CFG_JPG_PREVIEW_SLICE_ENC_PRIMARY_BUF_WIDTH * CFG_JPG_PREVIEW_SLICE_ENC_PRIMARY_BUF_HEIGHT; - if(buf_size > cap_size){ + /* search max slice (slice height * slice width) */ + if(!max_slice_info.slice_height || !max_slice_info.width){ + + UINT8 cap_idx = 0; + + for(cap_idx = PHOTO_MAX_CAP_SIZE ; cap_idx <= PHOTO_MIN_CAP_SIZE ; cap_idx++) + { + HD_DIM tmp_cap_size = {0}; + PhotoExe_SliceSize_Info tmp_slice_info = {0}; + + tmp_cap_size = (HD_DIM){GetPhotoSizeWidth(cap_idx), GetPhotoSizeHeight(cap_idx)}; + + if(buf_size > (tmp_cap_size.w * tmp_cap_size.h)){ + max_slice_num = 1; slice_num = 1; } else{ - PHOTO_SLICE_ENC_DUMP("cap_size = %lu buf_size = %lu\n", cap_size, buf_size); + PHOTO_SLICE_ENC_DUMP("cap_size = %lu buf_size = %lu\n", tmp_cap_size.w * tmp_cap_size.h, buf_size); - UINT32 lines = (buf_size / cap_size_w); - slice_num = cap_size_h / lines + (cap_size_h % lines ? 1 : 0); + UINT32 lines = (buf_size / tmp_cap_size.w); + max_slice_num = tmp_cap_size.h / lines + (tmp_cap_size.h % lines ? 1 : 0); + + UINT32 tmp_src_h = sensor_info->sSize.h / 2; + UINT32 tmp_dst_h = tmp_cap_size.h / 16; + UINT32 found_common_factor = 0; + UINT32 i; + + for (i = 1; i <= (tmp_src_h > tmp_dst_h ? tmp_dst_h : tmp_src_h) ; ++i) + { + if (tmp_src_h % i == 0 && tmp_dst_h % i == 0) + { + PHOTO_SLICE_ENC_DUMP("common factor = %d\n", i); + + if(max_slice_num < i){ + found_common_factor = i; + break; + } + } + } + + if(found_common_factor){ + slice_num = found_common_factor; + PHOTO_SLICE_ENC_DUMP("use common factor %d\n ", slice_num); + } + else{ + slice_num = max_slice_num; + PHOTO_SLICE_ENC_DUMP("use max slice num %d\n ", slice_num); + } + } + + ret = PhotoExe_Preview_SliceEncode_Get_Dst_Slice_Info(&tmp_slice_info, tmp_cap_size.w, tmp_cap_size.h, slice_num); + + if((tmp_slice_info.slice_height * tmp_slice_info.width) > (max_slice_info.slice_height * max_slice_info.width)){ + max_slice_info = tmp_slice_info; + } + } + + PHOTO_SLICE_ENC_DUMP("max dst slice = {%lu, %lu}, cap idx = %lu\n", max_slice_info.width, max_slice_info.slice_height, cap_idx); } - return PhotoExe_Preview_SliceEncode_Get_Dst_Slice_Info(info, cap_size_w, cap_size_h, slice_num); + *info = max_slice_info; + + return ret; } static HD_DIM PhotoExe_Preview_SliceEncode_Get_Encode_Max_Size() @@ -4492,7 +4597,7 @@ static HD_DIM PhotoExe_Preview_SliceEncode_Get_Encode_Max_Size() static UINT32 PhotoExe_Preview_SliceEncode_Get_Encode_Max_Bitrate(HD_VIDEO_PXLFMT vproc_out_pxlfmt) { - const UINT32 ratio = JPG_COMERESSED_RATIO_5; + const UINT32 ratio = CFG_JPG_PREVIEW_SLICE_ENC_BS_BUF_RATIO; UINT32 bitrate; HD_DIM dim = PhotoExe_Preview_SliceEncode_Get_Encode_Max_Size(); @@ -4798,7 +4903,9 @@ static INT32 PhotoExe_Preview_SliceEncode_Init_VF_GFX_Slice( addr_dst[0], addr_dst[1] ); - if(slice_idx == (dst_slice_info.slice_num - 1)){ + if(slice_idx == (dst_slice_info.slice_num - 1) && + dst_scale_slice_height < dst_slice_info.last_slice_height + ){ HD_GFX_DRAW_RECT draw_rect = {0}; @@ -4816,6 +4923,7 @@ static INT32 PhotoExe_Preview_SliceEncode_Init_VF_GFX_Slice( hd_gfx_draw_rect(&draw_rect); } + return E_OK; } @@ -4849,8 +4957,52 @@ static INT32 PhotoExe_Preview_SliceEncode_Dump_Frame(const HD_VIDEO_FRAME video_ #endif -#if PHOTO_SLICE_ENC_DBG_SLICE_YUV -static INT32 PhotoExe_Preview_SliceEncode_Dump_Slice( +#if PHOTO_SLICE_ENC_DBG_SRC_SLICE_YUV +static INT32 PhotoExe_Preview_SliceEncode_Dump_Src_Slice( + const HD_VIDEO_FRAME* video_frame, + const PhotoExe_SliceSize_Info src_slice_info, + const UINT8 slice_idx, + const UINT32 pa_y, + const UINT32 pa_uv +) +{ + char fileName[128] = {0}; + UINT32 src_slice_height = (slice_idx == (src_slice_info.slice_num - 1)) ? src_slice_info.last_slice_height : src_slice_info.slice_height; + UINT32 va; + UINT32 size; + FST_FILE fp = NULL; + + size = VDO_YUV_BUFSIZE(src_slice_info.width, src_slice_height, video_frame->pxlfmt); + + va = (UINT32)hd_common_mem_mmap(HD_COMMON_MEM_MEM_TYPE_CACHE, pa_y, size); + if (va == 0) { + DBG_ERR("hd_common_mem_mmap error!r\n"); + return E_SYS; + } + + sprintf(fileName, "A:\\src_slice%u_%lux%lu_fmt%lx.dat", slice_idx, src_slice_info.width, src_slice_height, video_frame->pxlfmt); + + fp = FileSys_OpenFile(fileName, FST_CREATE_ALWAYS | FST_OPEN_WRITE); + + size = src_slice_info.width * src_slice_height; + FileSys_WriteFile(fp, (UINT8*)va, &size, 0, NULL); + + size = (src_slice_info.width * src_slice_height) / 2; + FileSys_WriteFile(fp, (UINT8*)va + (pa_uv - pa_y), &size, 0, NULL); + + FileSys_FlushFile(fp); + FileSys_CloseFile(fp); + + hd_common_mem_munmap((void*) va, size); + + return E_OK; +} + +#endif + +#if PHOTO_SLICE_ENC_DBG_DST_SLICE_YUV + +static INT32 PhotoExe_Preview_SliceEncode_Dump_Dst_Slice( const HD_VIDEO_FRAME* video_frame, const PhotoExe_SliceSize_Info dst_slice_info, const UINT8 slice_idx, @@ -4870,7 +5022,7 @@ static INT32 PhotoExe_Preview_SliceEncode_Dump_Slice( return E_SYS; } - sprintf(fileName, "A:\\slice%u_%lux%lu_fmt%lx.dat", slice_idx, dst_slice_info.width, dst_slice_height, video_frame->pxlfmt); + sprintf(fileName, "A:\\dst_slice%u_%lux%lu_fmt%lx.dat", slice_idx, dst_slice_info.width, dst_slice_height, video_frame->pxlfmt); fp = FileSys_OpenFile(fileName, FST_CREATE_ALWAYS | FST_OPEN_WRITE); FileSys_WriteFile(fp, (UINT8*)va, &size, 0, NULL); @@ -4881,6 +5033,7 @@ static INT32 PhotoExe_Preview_SliceEncode_Dump_Slice( return E_OK; } + #endif @@ -5129,7 +5282,7 @@ static INT32 PhotoExe_Preview_SliceEncode_Scale_Screennail( } #if CFG_JPG_PREVIEW_SLICE_ENC_RC_SCREENNAIL -static INT32 PhotoExe_Preview_SliceEncode_Encode_Screennail_RC(HD_VIDEO_FRAME* video_frame_in) +static INT32 PhotoExe_Preview_SliceEncode_Encode_Screennail_RC(HD_VIDEO_FRAME* video_frame_in, UINT8* screennail_quality) { static UINT32 quality = CFG_JPG_PREVIEW_SLICE_ENC_INIT_QUALITY_SCREENNAIL; INT8 direction = 0; @@ -5211,6 +5364,7 @@ static INT32 PhotoExe_Preview_SliceEncode_Encode_Screennail_RC(HD_VIDEO_FRAME* v } while(1); + ret = E_OK; EXIT: return ret; @@ -5281,7 +5435,7 @@ EXIT: DBG_ERR("hd_videoenc_stop failed(%d)\r\n", ret); } - return (ret == HD_OK) ? E_OK : E_SYS; + return (ret == HD_OK) ? E_OK : ret; } @@ -5314,11 +5468,78 @@ static INT32 PhotoExe_Preview_SliceEncode_DateStamp( return E_OK; } +#if PHOTO_PREVIEW_SLICE_ENC_SRC_STAMP == ENABLE +static INT32 PhotoExe_Preview_SliceEncode_Src_DateStamp( + const HD_VIDEO_FRAME* video_frame, + const PhotoExe_SliceSize_Info* src_slice_info, + const PhotoExe_SliceSize_Info* dst_slice_info) +{ + + HD_VIDEO_FRAME video_frame_src_stamp = *video_frame; + UINT32 dst_last_slice_scale_height = (src_slice_info->last_slice_height * dst_slice_info->slice_height) / src_slice_info->slice_height; + + if(dst_last_slice_scale_height > dst_slice_info->last_slice_height) + { + video_frame_src_stamp.dim.h = video_frame_src_stamp.dim.h - ((src_slice_info->last_slice_height * (dst_last_slice_scale_height - dst_slice_info->last_slice_height)) / dst_last_slice_scale_height); + video_frame_src_stamp.ph[0] = video_frame_src_stamp.dim.h; + video_frame_src_stamp.ph[1] = video_frame_src_stamp.dim.h; + } + + return PhotoExe_Preview_SliceEncode_DateStamp(&video_frame_src_stamp, CAP_DS_EVENT_PRI); +} +#endif + +static INT32 PhotoExe_Preview_SliceEncode_QView(HD_VIDEO_FRAME* video_frame) +{ + HD_PATH_ID vout_path = 0; + IMG_CAP_YCC_IMG_INFO QvImgInfo = {0}; + IMG_CAP_QV_DATA QVInfor = {0}; + UINT8 retry_timeout = 10 , cnt = 0; + HD_RESULT ret; + + QvImgInfo.ch[IMG_CAP_YUV_Y].width = video_frame->pw[IMG_CAP_YUV_Y]; + QvImgInfo.ch[IMG_CAP_YUV_Y].height = video_frame->ph[IMG_CAP_YUV_Y]; + QvImgInfo.ch[IMG_CAP_YUV_Y].line_ofs = video_frame->loff[IMG_CAP_YUV_Y]; + QvImgInfo.ch[IMG_CAP_YUV_U].width = video_frame->pw[IMG_CAP_YUV_U]; + QvImgInfo.ch[IMG_CAP_YUV_U].height = video_frame->ph[IMG_CAP_YUV_U]; + QvImgInfo.ch[IMG_CAP_YUV_U].line_ofs = video_frame->loff[IMG_CAP_YUV_U]; + QvImgInfo.ch[IMG_CAP_YUV_V].width = video_frame->pw[IMG_CAP_YUV_V]; + QvImgInfo.ch[IMG_CAP_YUV_V].height = video_frame->ph[IMG_CAP_YUV_V]; + QvImgInfo.pixel_addr[0] = video_frame->phy_addr[0]; + QvImgInfo.pixel_addr[1] = video_frame->phy_addr[1]; + QvImgInfo.pixel_addr[2] = video_frame->phy_addr[2]; + QVInfor.ImgInfo = QvImgInfo; + + if(PhotoCapMsgCb){ + PhotoCapMsgCb(IMG_CAP_CBMSG_QUICKVIEW, &QVInfor); + } + + vout_path = GxVideo_GetDeviceCtrl(DOUT1, DISPLAY_DEVCTRL_PATH); + + do{ + if ((ret = hd_videoout_push_in_buf(vout_path, video_frame, NULL, -1)) != HD_OK) { + DBG_WRN("QV push_in error(%d), retrying ...\n", ret); + vos_util_delay_ms(1); + continue; + } + + break; + } while(cnt++ < retry_timeout); + + if(ret != HD_OK){ + DBG_ERR("QV push_in error(%d)\n", ret); + return E_SYS; + } + + return E_OK; +} + static INT32 PhotoExe_Preview_SliceEncode_Encode_Primary( const HD_VIDEO_FRAME* video_frame, const PhotoExe_SliceSize_Info src_slice_info, const PhotoExe_SliceSize_Info dst_slice_info, - UINT32* enc_bs_accum_size + UINT32* enc_bs_accum_size, + UINT8* primary_quality ) { PhotoExe_SliceEncode_Info* slice_enc_info = PhotoExe_Preview_SliceEncode_Get_Info(PHOTO_ENC_JPG_PRIMARY); @@ -5330,9 +5551,11 @@ static INT32 PhotoExe_Preview_SliceEncode_Encode_Primary( UINT32 enc_jpg_va = 0; UINT32 enc_bs_buf_ptr = 0; BOOL restart = FALSE; - const UINT8 slice_idx_of_date_stamp = dst_slice_info.slice_num - 1; - HD_VIDEOENC_BS bs_data_pull; + HD_VIDEOENC_BS bs_data_pull; +#if PHOTO_PREVIEW_SLICE_ENC_SRC_STAMP == DISABLE + const UINT8 slice_idx_of_date_stamp = dst_slice_info.slice_num - 1; +#endif do { restart = FALSE; @@ -5366,6 +5589,7 @@ static INT32 PhotoExe_Preview_SliceEncode_Encode_Primary( slice_idx); if((ret = vf_gfx_scale(&vf_gfx_scale_param, 1)) != HD_OK){ + DBG_ERR("vf_gfx_scale failed!\n"); goto EXIT; } @@ -5374,6 +5598,7 @@ static INT32 PhotoExe_Preview_SliceEncode_Encode_Primary( } /* attach the date stamp to a slice */ +#if PHOTO_PREVIEW_SLICE_ENC_SRC_STAMP == DISABLE if(slice_idx == slice_idx_of_date_stamp){ SLICE_ENC_VOS_TICK_TRIG(SLICE_ENC_VOS_TICK_PRI_STAMP_S); @@ -5392,6 +5617,7 @@ static INT32 PhotoExe_Preview_SliceEncode_Encode_Primary( SLICE_ENC_VOS_TICK_TRIG(SLICE_ENC_VOS_TICK_PRI_STAMP_E); } +#endif vf_gfx_scale_param.dst_img.count = 0; vf_gfx_scale_param.dst_img.timestamp = hd_gettime_us(); @@ -5405,11 +5631,21 @@ static INT32 PhotoExe_Preview_SliceEncode_Encode_Primary( vf_gfx_scale_param.dst_img.reserved[2] = 0; } - /* src img */ +#if PHOTO_SLICE_ENC_DBG_SRC_SLICE_YUV -#if PHOTO_SLICE_ENC_DBG_SLICE_YUV + PhotoExe_Preview_SliceEncode_Dump_Src_Slice( + video_frame, + src_slice_info, + slice_idx, + vf_gfx_scale_param.src_img.phy_addr[0], + vf_gfx_scale_param.src_img.phy_addr[1] + ); - PhotoExe_Preview_SliceEncode_Dump_Slice( +#endif + +#if PHOTO_SLICE_ENC_DBG_DST_SLICE_YUV + + PhotoExe_Preview_SliceEncode_Dump_Dst_Slice( video_frame, dst_slice_info, slice_idx, @@ -5498,6 +5734,7 @@ static INT32 PhotoExe_Preview_SliceEncode_Encode_Primary( /* check restart */ if(restart == FALSE){ + CHKPNT; ret = HD_ERR_SYS; goto EXIT; } @@ -5509,6 +5746,7 @@ static INT32 PhotoExe_Preview_SliceEncode_Encode_Primary( goto EXIT; } + *primary_quality = quality_new; if((ret = PhotoExe_Preview_SliceEncode_Encode_Set_Out(slice_enc_info->enc_path_id, quality_new) != HD_OK)) goto EXIT; @@ -5629,7 +5867,11 @@ INT32 PhotoExe_Preview_SliceEncode(VControl *pCtrl, UINT32 paramNum, UINT32 *par HD_VIDEOPROC_OUT vproc_out = {0}; HD_VIDEO_PXLFMT vproc_out_pxlfmt = 0; PhotoExe_MEM_Info exif_mem_info = {0}; + BOOL last_shot = TRUE; UINT32 enc_accum_size = 0; + static UINT8 primary_quality = CFG_JPG_PREVIEW_SLICE_ENC_INIT_QUALITY_PRIMARY; + static UINT8 screennail_quality = CFG_JPG_PREVIEW_SLICE_ENC_INIT_QUALITY_SCREENNAIL; + #if HUNTING_CAMERA_MCU == ENABLE UIMenuStoreInfo *puiPara = sf_ui_para_get(); #endif @@ -5641,7 +5883,11 @@ INT32 PhotoExe_Preview_SliceEncode(VControl *pCtrl, UINT32 paramNum, UINT32 *par vid_in = (PHOTO_VID_IN) paramArray[0]; /* sensor id */ } - DBG_DUMP("slice encode vid_in = %lu\r\n", vid_in); + if(paramNum >= 2){ + last_shot = (BOOL) paramArray[1]; /* for cont shot */ + } + + DBG_DUMP("slice encode vid_in = %lu last_shot = %lu\r\n", vid_in, last_shot); /******************************************************************* * Get vproc info @@ -5659,13 +5905,6 @@ INT32 PhotoExe_Preview_SliceEncode(VControl *pCtrl, UINT32 paramNum, UINT32 *par vproc_out_pxlfmt = vproc_out.pxlfmt; - /******************************************************************* - * Calculate dst slice info - ******************************************************************/ - if(PhotoExe_Preview_SliceEncode_Get_Curr_Dst_Slice_Info(&dst_slice_info) != E_OK){ - return NVTEVT_CONSUME; - } - /******************************************************************* * Pull out preview video frame, size should equal to sensor size ******************************************************************/ @@ -5675,11 +5914,17 @@ INT32 PhotoExe_Preview_SliceEncode(VControl *pCtrl, UINT32 paramNum, UINT32 *par goto EXIT; } -#if PHOTO_SLICE_ENC_DBG_PRIMARY_YUV +/******************************************************************* + * Calculate dst slice info + ******************************************************************/ + if(PhotoExe_Preview_SliceEncode_Get_Curr_Dst_Slice_Info(&dst_slice_info, video_frame) != E_OK){ + return NVTEVT_CONSUME; + } - PhotoExe_Preview_SliceEncode_Dump_Frame(video_frame); - -#endif + /******************************************************************* + * Calculate src slice info + ******************************************************************/ + PhotoExe_Preview_SliceEncode_Get_Src_Slice_Info(&dst_slice_info, &src_slice_info, video_frame); /******************************************************************* * Init Date Buffer @@ -5688,10 +5933,20 @@ INT32 PhotoExe_Preview_SliceEncode(VControl *pCtrl, UINT32 paramNum, UINT32 *par Ux_SendEvent(&CustomPhotoObjCtrl, NVTEVT_EXE_INIT_DATE_BUF, 0); } +#if PHOTO_PREVIEW_SLICE_ENC_SRC_STAMP == ENABLE /******************************************************************* - * Calculate src slice info + * Stamp on the src frame ******************************************************************/ - PhotoExe_Preview_SliceEncode_Get_Src_Slice_Info(&dst_slice_info, &src_slice_info, video_frame); + if(PhotoExe_Preview_SliceEncode_Src_DateStamp(&video_frame, &src_slice_info, &dst_slice_info) != E_OK){ + goto EXIT; + } +#endif + +#if PHOTO_SLICE_ENC_DBG_PRIMARY_YUV + + PhotoExe_Preview_SliceEncode_Dump_Frame(video_frame); + +#endif /******************************************************************* * Allocate slice buffer @@ -5746,12 +6001,23 @@ INT32 PhotoExe_Preview_SliceEncode(VControl *pCtrl, UINT32 paramNum, UINT32 *par /* screennail date stamp */ SLICE_ENC_VOS_TICK_TRIG(SLICE_ENC_VOS_TICK_THUMB_STAMP_S); +#if PHOTO_PREVIEW_SLICE_ENC_SRC_STAMP == DISABLE if(PhotoExe_Preview_SliceEncode_DateStamp(&video_frame_out_screennail, CAP_DS_EVENT_SCR) != E_OK){ goto EXIT; } +#endif SLICE_ENC_VOS_TICK_TRIG(SLICE_ENC_VOS_TICK_THUMB_STAMP_E); + /******************************************************************* + * Quick View (screennail) + ******************************************************************/ + SLICE_ENC_VOS_TICK_TRIG(SLICE_ENC_VOS_TICK_QVIEW_S); + + PhotoExe_Preview_SliceEncode_QView(&video_frame_out_screennail); + + SLICE_ENC_VOS_TICK_TRIG(SLICE_ENC_VOS_TICK_QVIEW_E); + /******************************************************************* * Primary ******************************************************************/ @@ -5760,9 +6026,9 @@ INT32 PhotoExe_Preview_SliceEncode(VControl *pCtrl, UINT32 paramNum, UINT32 *par SLICE_ENC_VOS_TICK_TRIG(SLICE_ENC_VOS_TICK_PRI_ENC_S); PhotoExe_Preview_SliceEncode_Encode_Set_In(slice_encode_primary_info->enc_path_id, vproc_out_pxlfmt, (HD_DIM) {dst_slice_info.width, dst_slice_info.height}); - PhotoExe_Preview_SliceEncode_Encode_Set_Out(slice_encode_primary_info->enc_path_id, CFG_JPG_PREVIEW_SLICE_ENC_INIT_QUALITY_PRIMARY); + PhotoExe_Preview_SliceEncode_Encode_Set_Out(slice_encode_primary_info->enc_path_id, primary_quality); - if(PhotoExe_Preview_SliceEncode_Encode_Primary(&video_frame, src_slice_info, dst_slice_info, &enc_accum_size) != E_OK){ + if(PhotoExe_Preview_SliceEncode_Encode_Primary(&video_frame, src_slice_info, dst_slice_info, &enc_accum_size, &primary_quality) != E_OK){ goto EXIT; } @@ -5794,11 +6060,12 @@ INT32 PhotoExe_Preview_SliceEncode(VControl *pCtrl, UINT32 paramNum, UINT32 *par #endif #if CFG_JPG_PREVIEW_SLICE_ENC_RC_SCREENNAIL - if(PhotoExe_Preview_SliceEncode_Encode_Screennail_RC(&video_frame_out_screennail) != E_OK){ + if(PhotoExe_Preview_SliceEncode_Encode_Screennail_RC(&video_frame_out_screennail, &screennail_quality) != E_OK){ goto EXIT; } #else PhotoExe_Preview_SliceEncode_Encode_Set_Out(slice_encode_screennail_info->enc_path_id, CFG_JPG_PREVIEW_SLICE_ENC_INIT_QUALITY_SCREENNAIL); + if(PhotoExe_Preview_SliceEncode_Encode_Screennail(&video_frame_out_screennail) != E_OK){ goto EXIT; } @@ -5936,7 +6203,7 @@ EXIT: } } - if(PhotoCapMsgCb){ + if(PhotoCapMsgCb && (last_shot == TRUE)){ PhotoCapMsgCb(IMG_CAP_CBMSG_RET_PRV, NULL); PhotoCapMsgCb(IMG_CAP_CBMSG_CAPEND, NULL); } @@ -6067,7 +6334,7 @@ INT32 PhotoExe_Preview_SliceEncode_CB1(void* user_data) PHOTO_VID_IN vid_in = PHOTO_VID_IN_1; HD_PATH_ID vproc_path_id; PhotoExe_Preview_SliceEncode_Queue12_Param* queue_ele_out = NULL; - VOS_TICK tick1; + VOS_TICK tick = 0; UINT32 err_cnt = 0, err_timeout = 30; if(!user_data){ @@ -6104,9 +6371,9 @@ INT32 PhotoExe_Preview_SliceEncode_CB1(void* user_data) } } - vos_perf_mark(&tick1); + vos_perf_mark(&tick); - DBG_DUMP("frame%lu : %lu ms\n", param->cnt, tick1 / 1000); + DBG_DUMP("pic%lu = %lu\n", param->cnt, tick); queue_ele_out = (PhotoExe_Preview_SliceEncode_Queue12_Param*) malloc(sizeof(PhotoExe_Preview_SliceEncode_Queue12_Param)); memset(queue_ele_out, 0, sizeof(PhotoExe_Preview_SliceEncode_Queue12_Param)); @@ -6123,7 +6390,7 @@ INT32 PhotoExe_Preview_SliceEncode_CB1(void* user_data) } while(1); - DBG_IND("task1 job finished\n"); + DBG_DUMP("task1 job finished\n"); exit: return ret; @@ -6148,7 +6415,8 @@ INT32 PhotoExe_Preview_SliceEncode_CB2(void* user_data) HD_VIDEO_PXLFMT vproc_out_pxlfmt = 0; PhotoExe_MEM_Info exif_mem_info = {0}; UINT32 enc_accum_size = 0; - PHOTO_CAP_CBMSG_FP PhotoCapMsgCb = (PHOTO_CAP_CBMSG_FP)Photo_CaptureCB; + static UINT8 primary_quality = CFG_JPG_PREVIEW_SLICE_ENC_INIT_QUALITY_PRIMARY; + static UINT8 screennail_quality = CFG_JPG_PREVIEW_SLICE_ENC_INIT_QUALITY_SCREENNAIL; if(!user_data){ DBG_ERR("user_data can't be null!\n"); @@ -6159,8 +6427,6 @@ INT32 PhotoExe_Preview_SliceEncode_CB2(void* user_data) param = (PhotoExe_Preview_SliceEncode_CB2_Param*) user_data; param->cnt = 0; - DBG_IND("enter cb2 loop\n"); - /******************************************************************* * Get vproc info ******************************************************************/ @@ -6177,13 +6443,6 @@ INT32 PhotoExe_Preview_SliceEncode_CB2(void* user_data) vproc_out_pxlfmt = vproc_out.pxlfmt; - /******************************************************************* - * Calculate dst slice info - ******************************************************************/ - if(PhotoExe_Preview_SliceEncode_Get_Curr_Dst_Slice_Info(&dst_slice_info) != E_OK){ - return NVTEVT_CONSUME; - } - /* pull out vprc frame is in the CB1 */ /******************************************************************* @@ -6198,6 +6457,7 @@ INT32 PhotoExe_Preview_SliceEncode_CB2(void* user_data) ******************************************************************/ slice_encode_thumbnail_info->bs_buf_mem_info.blk_size = (CFG_THUMBNAIL_W * CFG_THUMBNAIL_H) / 2; if(PhotoExe_Preview_SliceEncode_Alloc_Buffer(&slice_encode_thumbnail_info->bs_buf_mem_info, "slice_enc_thumbnail") != E_OK){ + CHKPNT; goto EXIT; } @@ -6207,8 +6467,11 @@ INT32 PhotoExe_Preview_SliceEncode_CB2(void* user_data) // } exif_mem_info.blk_size = CFG_JPG_HEADER_SIZE; - if(PhotoExe_Preview_SliceEncode_Alloc_Buffer(&exif_mem_info, "slice_enc_exif") != E_OK) + if(PhotoExe_Preview_SliceEncode_Alloc_Buffer(&exif_mem_info, "slice_enc_exif") != E_OK){ + CHKPNT; goto EXIT; + } + do{ @@ -6219,24 +6482,41 @@ INT32 PhotoExe_Preview_SliceEncode_CB2(void* user_data) } if(queue_ele_in->comm.terminate){ - DBG_ERR("force terminate\n"); + DBG_ERR("abort CB2\n"); free(queue_ele_in); queue_ele_in = NULL; goto EXIT; } - DBG_IND("process frame %lu\n", param->cnt); + /******************************************************************* + * Calculate dst slice info + ******************************************************************/ + if(PhotoExe_Preview_SliceEncode_Get_Curr_Dst_Slice_Info(&dst_slice_info, queue_ele_in->frame) != E_OK){ + CHKPNT; + goto EXIT; + } /******************************************************************* * Calculate src slice info ******************************************************************/ PhotoExe_Preview_SliceEncode_Get_Src_Slice_Info(&dst_slice_info, &src_slice_info, queue_ele_in->frame); - slice_encode_primary_info->bs_buf_mem_info.blk_size = (VDO_YUV_BUFSIZE(dst_slice_info.width, dst_slice_info.height, queue_ele_in->frame.pxlfmt) / (CFG_JPG_PREVIEW_SLICE_ENC_BS_BUF_RATIO)) + CFG_JPG_HEADER_SIZE + PhotoExe_GetScreenNailSize() ; -// if(PhotoExe_Preview_SliceEncode_Alloc_Buffer(&slice_encode_primary_info->bs_buf_mem_info, "slice_enc_primary") != E_OK){ -// goto EXIT; -// } +#if PHOTO_PREVIEW_SLICE_ENC_SRC_STAMP == ENABLE + /******************************************************************* + * Stamp on the src frame + ******************************************************************/ + if(PhotoExe_Preview_SliceEncode_Src_DateStamp(&queue_ele_in->frame, &src_slice_info, &dst_slice_info) != E_OK){ + goto EXIT; + } +#endif +#if PHOTO_SLICE_ENC_DBG_PRIMARY_YUV + + PhotoExe_Preview_SliceEncode_Dump_Frame(queue_ele_in->frame); + +#endif + + slice_encode_primary_info->bs_buf_mem_info.blk_size = (VDO_YUV_BUFSIZE(dst_slice_info.width, dst_slice_info.height, queue_ele_in->frame.pxlfmt) / (CFG_JPG_PREVIEW_SLICE_ENC_BS_BUF_RATIO)) + CFG_JPG_HEADER_SIZE + PhotoExe_GetScreenNailSize() ; if(PhotoExe_Preview_SliceEncode_Alloc_Buffer_Retry( &slice_encode_primary_info->bs_buf_mem_info, "slice_enc_primary", @@ -6247,10 +6527,6 @@ INT32 PhotoExe_Preview_SliceEncode_CB2(void* user_data) } slice_encode_screennail_info->bs_buf_mem_info.blk_size = PhotoExe_GetScreenNailSize(); -// if(PhotoExe_Preview_SliceEncode_Alloc_Buffer(&slice_encode_screennail_info->bs_buf_mem_info, "slice_enc_screennail") != E_OK){ -// goto EXIT; -// } - if(PhotoExe_Preview_SliceEncode_Alloc_Buffer_Retry( &slice_encode_screennail_info->bs_buf_mem_info, "slice_enc_screennail", @@ -6274,25 +6550,27 @@ INT32 PhotoExe_Preview_SliceEncode_CB2(void* user_data) goto EXIT; } +#if PHOTO_PREVIEW_SLICE_ENC_SRC_STAMP == DISABLE /* screennail date stamp */ if(PhotoExe_Preview_SliceEncode_DateStamp(&video_frame_out_screennail, CAP_DS_EVENT_SCR) != E_OK){ goto EXIT; } /* thumbnail date stamp */ - if(PhotoExe_Preview_SliceEncode_DateStamp(&video_frame_out_thumbnail, CAP_DS_EVENT_QV) != E_OK){ - goto EXIT; - } - + // if(PhotoExe_Preview_SliceEncode_DateStamp(&video_frame_out_thumbnail, CAP_DS_EVENT_QV) != E_OK){ + // goto EXIT; + // } +#endif /******************************************************************* * Primary ******************************************************************/ /* slice encode */ PhotoExe_Preview_SliceEncode_Encode_Set_In(slice_encode_primary_info->enc_path_id, vproc_out_pxlfmt, (HD_DIM) {dst_slice_info.width, dst_slice_info.height}); - PhotoExe_Preview_SliceEncode_Encode_Set_Out(slice_encode_primary_info->enc_path_id, CFG_JPG_PREVIEW_SLICE_ENC_INIT_QUALITY_PRIMARY); + PhotoExe_Preview_SliceEncode_Encode_Set_Out(slice_encode_primary_info->enc_path_id, primary_quality); - if(PhotoExe_Preview_SliceEncode_Encode_Primary(&queue_ele_in->frame, src_slice_info, dst_slice_info, &enc_accum_size) != E_OK){ + if(PhotoExe_Preview_SliceEncode_Encode_Primary(&queue_ele_in->frame, src_slice_info, dst_slice_info, &enc_accum_size, &primary_quality) != E_OK){ + CHKPNT; goto EXIT; } @@ -6313,12 +6591,15 @@ INT32 PhotoExe_Preview_SliceEncode_CB2(void* user_data) #if CFG_JPG_PREVIEW_SLICE_ENC_RC_SCREENNAIL - if(PhotoExe_Preview_SliceEncode_Encode_Screennail_RC(&video_frame_out_screennail) != E_OK){ + if(PhotoExe_Preview_SliceEncode_Encode_Screennail_RC(&video_frame_out_screennail, &screennail_quality) != E_OK){ + CHKPNT; goto EXIT; } #else PhotoExe_Preview_SliceEncode_Encode_Set_Out(slice_encode_screennail_info->enc_path_id, CFG_JPG_PREVIEW_SLICE_ENC_INIT_QUALITY_SCREENNAIL); + if(PhotoExe_Preview_SliceEncode_Encode_Screennail(&video_frame_out_screennail) != E_OK){ + CHKPNT; goto EXIT; } #endif @@ -6328,17 +6609,13 @@ INT32 PhotoExe_Preview_SliceEncode_CB2(void* user_data) PhotoExe_Preview_SliceEncode_Encode_Set_Out(slice_encode_thumbnail_info->enc_path_id, CFG_JPG_PREVIEW_SLICE_ENC_INIT_QUALITY_THUMBNAIL); if(PhotoExe_Preview_SliceEncode_Encode_Thumbnail(&video_frame_out_thumbnail) != E_OK){ + CHKPNT; goto EXIT; } /******************************************************************* * Combine All Images ******************************************************************/ - -// exif_mem_info.blk_size = CFG_JPG_HEADER_SIZE; -// if(PhotoExe_Preview_SliceEncode_Alloc_Buffer(&exif_mem_info, "slice_enc_exif") != E_OK) -// goto EXIT; - MEM_RANGE exif_data = {.addr = exif_mem_info.va, .size = exif_mem_info.blk_size}; MEM_RANGE thumb_jpg = {.addr = slice_encode_thumbnail_info->bs_buf_mem_info.va, .size = slice_encode_thumbnail_info->bs_buf_mem_info.used_size}; MEM_RANGE pri_jpg = {.addr = slice_encode_primary_info->bs_buf_mem_info.va + CFG_JPG_HEADER_SIZE, .size = slice_encode_primary_info->bs_buf_mem_info.used_size}; @@ -6420,11 +6697,12 @@ EXIT: if(param->cnt < param->max_cnt){ queue_ele_out = (PhotoExe_Preview_SliceEncode_Queue23_Param*) malloc(sizeof(PhotoExe_Preview_SliceEncode_Queue23_Param)); + memset(queue_ele_out, 0, sizeof(PhotoExe_Preview_SliceEncode_Queue23_Param)); queue_ele_out->comm.terminate = 1; lfqueue_enq(param->queue23, (void*) queue_ele_out); } - DBG_IND("task2 job finished\n"); + DBG_DUMP("task2 job finished\n"); return ret; } @@ -6434,8 +6712,7 @@ INT32 PhotoExe_Preview_SliceEncode_CB3(void* user_data) INT32 ret = E_OK; PhotoExe_Preview_SliceEncode_CB3_Param* param = NULL; PhotoExe_Preview_SliceEncode_Queue23_Param* queue_ele_in = NULL; - PHOTO_CAP_CBMSG_FP PhotoCapMsgCb = (PHOTO_CAP_CBMSG_FP)Photo_CaptureCB; - + if(!user_data){ DBG_ERR("user_data can't be null!\n"); ret = E_SYS; @@ -6453,8 +6730,10 @@ INT32 PhotoExe_Preview_SliceEncode_CB3(void* user_data) continue; } + DBG_DUMP("CB3 deq cnt = %lu , termi = %lu\n", param->cnt, queue_ele_in->comm.terminate); + if(queue_ele_in->comm.terminate){ - DBG_ERR("force terminate\n"); + DBG_ERR("abort CB3\n"); free(queue_ele_in); queue_ele_in = NULL; goto EXIT; @@ -6551,13 +6830,7 @@ EXIT: PhotoCapMsgCb(IMG_CAP_CBMSG_CAPEND, NULL); } - PhotoExe_Preview_SliceEncode2_Close(); - - if(param->cnt < param->max_cnt){ - DBG_ERR("force terminate\n"); - } - - DBG_IND("task3 job finished\n"); + DBG_DUMP("task3 job finished\n"); return ret; } @@ -6614,23 +6887,45 @@ static VOID PhotoExe_Preview_SliceEncode2_Close(VOID) FLGPTN flag = 0; /* stop cmd */ - set_flg(task1_param.flag_id, FLG_PHOTO_SLICE_ENC_CMD_STOP); - set_flg(task2_param.flag_id, FLG_PHOTO_SLICE_ENC_CMD_STOP); - set_flg(task3_param.flag_id, FLG_PHOTO_SLICE_ENC_CMD_STOP); + if(task1_param.flag_id) + set_flg(task1_param.flag_id, FLG_PHOTO_SLICE_ENC_CMD_STOP); + + if(task2_param.flag_id) + set_flg(task2_param.flag_id, FLG_PHOTO_SLICE_ENC_CMD_STOP); + + if(task3_param.flag_id) + set_flg(task3_param.flag_id, FLG_PHOTO_SLICE_ENC_CMD_STOP); /* check stopped */ - wai_flg(&flag, task1_param.flag_id, FLG_PHOTO_SLICE_ENC_STA_STOPPED, TWF_ORW); - wai_flg(&flag, task2_param.flag_id, FLG_PHOTO_SLICE_ENC_STA_STOPPED, TWF_ORW); - wai_flg(&flag, task3_param.flag_id, FLG_PHOTO_SLICE_ENC_STA_STOPPED, TWF_ORW); + if(task1_param.flag_id) + wai_flg(&flag, task1_param.flag_id, FLG_PHOTO_SLICE_ENC_STA_STOPPED, TWF_ORW); + + if(task2_param.flag_id) + wai_flg(&flag, task2_param.flag_id, FLG_PHOTO_SLICE_ENC_STA_STOPPED, TWF_ORW); + + if(task3_param.flag_id) + wai_flg(&flag, task3_param.flag_id, FLG_PHOTO_SLICE_ENC_STA_STOPPED, TWF_ORW); DBG_DUMP("slice encode finished\n"); - lfqueue_destroy(&queue12); - lfqueue_destroy(&queue23); + if(queue12.head){ + lfqueue_destroy(&queue12); + memset(&queue12, 0, sizeof(queue12)); + } - PhotoExe_Preview_SliceEncode_Uninit_Flag(&task1_param.flag_id); - PhotoExe_Preview_SliceEncode_Uninit_Flag(&task2_param.flag_id); - PhotoExe_Preview_SliceEncode_Uninit_Flag(&task3_param.flag_id); + if(queue23.head){ + lfqueue_destroy(&queue23); + memset(&queue23, 0, sizeof(queue23)); + } + + if(task1_param.flag_id) + PhotoExe_Preview_SliceEncode_Uninit_Flag(&task1_param.flag_id); + + if(task2_param.flag_id) + PhotoExe_Preview_SliceEncode_Uninit_Flag(&task2_param.flag_id); + + if(task3_param.flag_id) + PhotoExe_Preview_SliceEncode_Uninit_Flag(&task3_param.flag_id); } INT32 PhotoExe_Preview_SliceEncode2(VControl *pCtrl, UINT32 paramNum, UINT32 *paramArray) @@ -6641,6 +6936,9 @@ INT32 PhotoExe_Preview_SliceEncode2(VControl *pCtrl, UINT32 paramNum, UINT32 *pa INT32 ret = E_OK; FLGPTN flag = 0; + /* make sure last execution is finished */ + PhotoExe_Preview_SliceEncode2_Close(); + if(lfqueue_init(&queue12)){ DBG_ERR("init lfqueue12 failed\n"); goto EXIT; @@ -6698,10 +6996,8 @@ INT32 PhotoExe_Preview_SliceEncode2(VControl *pCtrl, UINT32 paramNum, UINT32 *pa cb1_param.max_cnt = max_cnt; cb1_param.cnt = 0; cb1_param.queue12 = &queue12; - cb1_param.period = 1000 / max_cnt; /* average ms in one second */ - DBG_IND("resume task1\n"); task1_param.run = 1; vos_task_resume(task1_param.task_id); @@ -6731,7 +7027,6 @@ INT32 PhotoExe_Preview_SliceEncode2(VControl *pCtrl, UINT32 paramNum, UINT32 *pa cb2_param.queue12 = &queue12; cb2_param.queue23 = &queue23; - DBG_IND("resume task2\n"); task2_param.run = 1; vos_task_resume(task2_param.task_id); @@ -6761,7 +7056,6 @@ INT32 PhotoExe_Preview_SliceEncode2(VControl *pCtrl, UINT32 paramNum, UINT32 *pa cb3_param.cnt = 0; cb3_param.queue23 = &queue23; - DBG_IND("resume task3\n"); task3_param.run = 1; vos_task_resume(task3_param.task_id); diff --git a/code/application/source/cardv/SrcCode/UIApp/Photo/UIDateImprint.c b/code/application/source/cardv/SrcCode/UIApp/Photo/UIDateImprint.c index 176567a13..6b11ba6c8 100755 --- a/code/application/source/cardv/SrcCode/UIApp/Photo/UIDateImprint.c +++ b/code/application/source/cardv/SrcCode/UIApp/Photo/UIDateImprint.c @@ -853,7 +853,7 @@ void UiDateImprint_ChkUpdateData(DATE_IMPRINT_INFO *pInfo) 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 (pInfo->pCapInfo->event == CAP_DS_EVENT_PRI) { #if HUNTING_CAMERA_MCU == ENABLE pInfo->isStrDirty = UiDateImprint_UpdateDate(pInfo->StrBuf,sizeof(pInfo->StrBuf)); #else