From 537a6a1684cb06fd50304857896fb92c56ac82fc Mon Sep 17 00:00:00 2001 From: payton Date: Thu, 2 Nov 2023 09:35:48 +0800 Subject: [PATCH] =?UTF-8?q?1.=E8=87=AA=E5=8A=A8=E6=A8=A1=E5=BC=8Fp+v?= =?UTF-8?q?=E6=A8=A1=E5=BC=8F=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../565_HUNTING_EVB_LINUX_4G_S550/DxHunting.c | 4 + .../cardv/SrcCode/Dx/include/DxHunting.h | 9 +- .../cardv/SrcCode/FastFlow/flow_preview.c | 103 +++-- .../cardv/SrcCode/FastFlow/flow_preview.h | 1 + .../source/cardv/SrcCode/System/rtos-main.c | 17 +- .../source/cardv/SrcCode/System/sys_fwload.c | 17 +- .../UIApp/Movie/UIAppMovie_CommPoolInit.c | 92 +++- .../cardv/SrcCode/UIApp/MovieFast/MovieFast.c | 429 +++++++++++++++--- .../SrcCode/UIApp/MovieStamp/MovieStamp.c | 5 +- .../cardv/SrcCode/UIApp/Photo/UIAppPhoto.h | 2 +- .../cardv/SrcCode/UIApp/PhotoFast/PhotoFast.c | 135 ++++-- .../cardv/SrcCode/UIApp/PhotoFast/PhotoFast.h | 7 +- .../UIApp/PhotoFast/PhotoFastSliceEncode.c | 2 +- .../UIFlowMenuCommonItem/MenuPhoto.c | 16 +- .../UIWnd/LVGL_SPORTCAM/UIInfo/UIInfo.h | 1 + .../source/cardv/rtos-main-hunting_lvgl.lds | 53 ++- .../include/ImageApp/ImageApp_MovieMulti.h | 2 + rtos/code/lib/output/libimageapp_moviemulti.a | Bin 573836 -> 572656 bytes 18 files changed, 711 insertions(+), 184 deletions(-) diff --git a/rtos/code/application/source/cardv/SrcCode/Dx/565_HUNTING_EVB_LINUX_4G_S550/DxHunting.c b/rtos/code/application/source/cardv/SrcCode/Dx/565_HUNTING_EVB_LINUX_4G_S550/DxHunting.c index dbdb1ff24..14deda873 100755 --- a/rtos/code/application/source/cardv/SrcCode/Dx/565_HUNTING_EVB_LINUX_4G_S550/DxHunting.c +++ b/rtos/code/application/source/cardv/SrcCode/Dx/565_HUNTING_EVB_LINUX_4G_S550/DxHunting.c @@ -209,6 +209,10 @@ UINT32 DrvGPIO_GetPhotoMovieModeFromMonitor(void) { g_uiBootMode = DX_HUNTING_MODE_MOVIE; } + else if(SF_CAM_MODE_VIDEO2 == puiPara->CamMode) + { + g_uiBootMode = DX_HUNTING_MODE_MOVIE2; + } else { g_uiBootMode = DX_HUNTING_MODE_PHOTO_MOVIE; diff --git a/rtos/code/application/source/cardv/SrcCode/Dx/include/DxHunting.h b/rtos/code/application/source/cardv/SrcCode/Dx/include/DxHunting.h index a614d8616..d5a9079f7 100755 --- a/rtos/code/application/source/cardv/SrcCode/Dx/include/DxHunting.h +++ b/rtos/code/application/source/cardv/SrcCode/Dx/include/DxHunting.h @@ -33,10 +33,11 @@ enum _DX_HUNTING_MODE //Must match with _HUNTING_MODE in UIInfo.h { /* for hunting camera application */ - DX_HUNTING_MODE_PHOTO = 0, - DX_HUNTING_MODE_MOVIE, - DX_HUNTING_MODE_PHOTO_MOVIE, - DX_HUNTING_MODE_OTHER, + DX_HUNTING_MODE_PHOTO = 0, /* PhotoFast */ + DX_HUNTING_MODE_MOVIE, /* MovieFast */ + DX_HUNTING_MODE_PHOTO_MOVIE, /* PhotoFast -> MovieFast */ + DX_HUNTING_MODE_OTHER, /* for boot linux */ + DX_HUNTING_MODE_MOVIE2, /* MovieFast + sensor sized photo with slice encode */ /* for life camera application */ DX_HUNTING_MODE_CAMERA_PHOTO = 100, DX_HUNTING_MODE_CAMERA_MOVIE, diff --git a/rtos/code/application/source/cardv/SrcCode/FastFlow/flow_preview.c b/rtos/code/application/source/cardv/SrcCode/FastFlow/flow_preview.c index d3d5c6361..7fb72ae87 100755 --- a/rtos/code/application/source/cardv/SrcCode/FastFlow/flow_preview.c +++ b/rtos/code/application/source/cardv/SrcCode/FastFlow/flow_preview.c @@ -851,55 +851,13 @@ void flow_preview_get_path(HD_PATH_ID *pPath, FLOW_PREIVEW_PATH PathType, UINT32 extern void Set_NIGHTMODE(UINT32 id, UINT8 isSnapVideo); extern void DrvGOIO_Turn_Onoff_IRCUT(UINT8 onoff); -int flow_preview(void) + +INT32 flow_preview_load_sen_cfg(void) { - int ret; - // int join_ret; - VK_TASK_HANDLE handle_sensor = 0; - VK_TASK_HANDLE handle_cap_proc = 0; - VK_TASK_HANDLE handle_preview = 0; - // int policy; + INT32 ret = E_OK; + HD_RESULT hd_ret = HD_OK; PHOTO_SENSOR_INFO sen_cfg = {0}; PHOTO_SENSOR_INFO *pSenCfg = &sen_cfg; - HD_RESULT hd_ret; - // struct sched_param schedparam = {0}; - T_CFLG cflg = {0}; - FLGPTN flag_ptn; - -#if (_PACKAGE_DISPLAY_) - VK_TASK_HANDLE handle_videoout = 0; -#endif - - if(!flag_task){ - if ((ret = vos_flag_create(&flag_task, &cflg, "flow_preview")) != E_OK) { - DBG_ERR("create flag failed!(%d)\n", ret); - return -1; - } - } - - // quick sensor setup - vos_flag_clr(flag_task, FLAG_SENSOR_TASK_EXIT); - handle_sensor = vos_task_create(thread_sensor, NULL, "init_sensor", 10, DEFAULT_TASK_STACK_SIZE); - if(!handle_sensor){ - DBG_ERR("create thread_sensor failed\r\n"); - return -1; - } - else - vos_task_resume(handle_sensor); - - //hd_common_init(including vds), must wait until insmod_capture() - fastboot_wait_done(BOOT_INIT_CAPTURE); - - // init hdal - ret = fastflow_common_init(); - if (ret != HD_OK) { - DBG_ERR("init fail\r\n"); - } - ret = flowpreview_mem_relayout(); - if (ret != HD_OK) { - DBG_ERR("relayout fail\r\n"); - } - //load ae/awb/iq System_GetSensorInfo(0, SENSOR_AE_PATH, &(sen_cfg.ae_path)); System_GetSensorInfo(0, SENSOR_AWB_PATH, &(sen_cfg.awb_path)); @@ -988,8 +946,59 @@ int flow_preview(void) if ((hd_ret = vendor_isp_uninit()) != HD_OK) { DBG_ERR("vendor_isp_uninit fail(%d)\n", hd_ret); } - + return ret; +} +int flow_preview(void) +{ + int ret; + // int join_ret; + VK_TASK_HANDLE handle_sensor = 0; + VK_TASK_HANDLE handle_cap_proc = 0; + VK_TASK_HANDLE handle_preview = 0; + // int policy; +// PHOTO_SENSOR_INFO sen_cfg = {0}; +// PHOTO_SENSOR_INFO *pSenCfg = &sen_cfg; +// HD_RESULT hd_ret; + // struct sched_param schedparam = {0}; + T_CFLG cflg = {0}; + FLGPTN flag_ptn; + +#if (_PACKAGE_DISPLAY_) + VK_TASK_HANDLE handle_videoout = 0; +#endif + + if(!flag_task){ + if ((ret = vos_flag_create(&flag_task, &cflg, "flow_preview")) != E_OK) { + DBG_ERR("create flag failed!(%d)\n", ret); + return -1; + } + } + + // quick sensor setup + vos_flag_clr(flag_task, FLAG_SENSOR_TASK_EXIT); + handle_sensor = vos_task_create(thread_sensor, NULL, "init_sensor", 10, DEFAULT_TASK_STACK_SIZE); + if(!handle_sensor){ + DBG_ERR("create thread_sensor failed\r\n"); + return -1; + } + else + vos_task_resume(handle_sensor); + + //hd_common_init(including vds), must wait until insmod_capture() + fastboot_wait_done(BOOT_INIT_CAPTURE); + + // init hdal + ret = fastflow_common_init(); + if (ret != HD_OK) { + DBG_ERR("init fail\r\n"); + } + ret = flowpreview_mem_relayout(); + if (ret != HD_OK) { + DBG_ERR("relayout fail\r\n"); + } + + flow_preview_load_sen_cfg(); vos_flag_clr(flag_task, FLAG_CAP_PROC_TASK_EXIT); handle_cap_proc = vos_task_create(thread_cap_proc, NULL, "cap_proc", 10, DEFAULT_TASK_STACK_SIZE); if(!handle_cap_proc){ diff --git a/rtos/code/application/source/cardv/SrcCode/FastFlow/flow_preview.h b/rtos/code/application/source/cardv/SrcCode/FastFlow/flow_preview.h index 25c17de5d..1abf754a7 100644 --- a/rtos/code/application/source/cardv/SrcCode/FastFlow/flow_preview.h +++ b/rtos/code/application/source/cardv/SrcCode/FastFlow/flow_preview.h @@ -19,4 +19,5 @@ extern void flow_preview_close_module(void); extern void flow_preview_uninit_module(void); extern void flow_preview_set_stop_flag(BOOL flag); extern BOOL flow_preview_get_stop_flag(void); +extern INT32 flow_preview_load_sen_cfg(void); #endif \ No newline at end of file diff --git a/rtos/code/application/source/cardv/SrcCode/System/rtos-main.c b/rtos/code/application/source/cardv/SrcCode/System/rtos-main.c index 024ddad97..9a73ff6fd 100755 --- a/rtos/code/application/source/cardv/SrcCode/System/rtos-main.c +++ b/rtos/code/application/source/cardv/SrcCode/System/rtos-main.c @@ -634,7 +634,7 @@ static void insmod_encoder(void) vos_perf_list_mark(__func__, __LINE__, 1); } else { //fastboot - fwload_wait_done(CODE_SECTION_05); + fwload_wait_done(CODE_SECTION_06); /* media encoder */ #if (_PACKAGE_VIDEO_) @@ -967,7 +967,7 @@ static void fastboot(void) vos_task_resume(handle_photo_filenaming); break; - + case DX_HUNTING_MODE_MOVIE2: case DX_HUNTING_MODE_MOVIE: case DX_HUNTING_MODE_CAMERA_MOVIE: @@ -984,11 +984,7 @@ static void fastboot(void) // #endif #endif - // wait all text-code loaded - fwload_wait_done(CODE_SECTION_10); - - System_OnPowerPreInit(); - System_OnVideoFastbootInit(); + fwload_wait_done(CODE_SECTION_06); handle_movie_filenaming = vos_task_create(MovieFast_InitFileNamingThread, "init_fn", NULL, 10, 8192); if (!handle_movie_filenaming) { @@ -997,7 +993,6 @@ static void fastboot(void) else vos_task_resume(handle_movie_filenaming); - fastboot_wait_done(BOOT_INIT_FILENAMINGOK); handle_movie_moviemode = vos_task_create(MovieFast_InitMovieModeThread, "init_movie", NULL, 10, 8192); if (!handle_movie_moviemode) { @@ -1005,7 +1000,11 @@ static void fastboot(void) } else vos_task_resume(handle_movie_moviemode); - + + /* GxTime, for stamp */ + fwload_wait_done(CODE_SECTION_10); + System_OnPowerPreInit(); + System_OnVideoFastbootInit(); break; case DX_HUNTING_MODE_OTHER: /* boot linux only */ diff --git a/rtos/code/application/source/cardv/SrcCode/System/sys_fwload.c b/rtos/code/application/source/cardv/SrcCode/System/sys_fwload.c index a54553223..fa8011618 100755 --- a/rtos/code/application/source/cardv/SrcCode/System/sys_fwload.c +++ b/rtos/code/application/source/cardv/SrcCode/System/sys_fwload.c @@ -16,6 +16,7 @@ #include "PrjCfg.h" #include "sys_fwload.h" #include "sys_storage_partition.h" +#include "DxHunting.h" //#NT#PARTIAL_COMPRESS, we use rtos-main size + 1 block size #define FW_PARTIAL_COMPRESS_WORK_BUF_SIZE 0x320000 @@ -30,11 +31,16 @@ static ID fwload_flg_id = 0; static UINT32 UserSection_Load[10] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; //This array is sort by loading order -static UINT32 UserSection_Order_full[] = { +static UINT32 UserSection_Order_common[] = { CODE_SECTION_02, CODE_SECTION_03, CODE_SECTION_04, CODE_SECTION_05, CODE_SECTION_06, CODE_SECTION_07, CODE_SECTION_08, CODE_SECTION_09, CODE_SECTION_10, FWSRV_PL_BURST_END_TAG }; +static UINT32 UserSection_Order_movie_fast_mode2[] = { + CODE_SECTION_02, CODE_SECTION_03, CODE_SECTION_04, CODE_SECTION_06, CODE_SECTION_05, + CODE_SECTION_07, CODE_SECTION_08, CODE_SECTION_09, CODE_SECTION_10, FWSRV_PL_BURST_END_TAG +}; + int fwload_init(void) { vos_flag_create(&fwload_flg_id, NULL, "fwload_flg_id"); @@ -168,7 +174,14 @@ int fwload_partload(void) // start partial load void (*LoadCallback)(const UINT32 Idx) = UserSection_LoadCb; - UINT32 *SecOrderTable = UserSection_Order_full; + UINT32 *SecOrderTable = NULL; + + if(DrvGPIO_GetPhotoMovieModeFromMonitor() == DX_HUNTING_MODE_MOVIE2){ + SecOrderTable = UserSection_Order_movie_fast_mode2; + } + else{ + SecOrderTable = UserSection_Order_common; + } LoadCallback(CODE_SECTION_01); // 1st part has loaded by loader diff --git a/rtos/code/application/source/cardv/SrcCode/UIApp/Movie/UIAppMovie_CommPoolInit.c b/rtos/code/application/source/cardv/SrcCode/UIApp/Movie/UIAppMovie_CommPoolInit.c index 9a269f582..63b9ac121 100755 --- a/rtos/code/application/source/cardv/SrcCode/UIApp/Movie/UIAppMovie_CommPoolInit.c +++ b/rtos/code/application/source/cardv/SrcCode/UIApp/Movie/UIAppMovie_CommPoolInit.c @@ -6,9 +6,12 @@ #include "SysSensor.h" #include #include "flow_boot_logo.h" +#include "UIApp/PhotoFast/PhotoFastSliceEncode.h" +#include "UIAppPhoto_Param.h" #if HUNTING_CAMERA_MCU == ENABLE -#include "sf_mcu.h" +#include #endif +#include "DxHunting.h" //#define ENABLE 1 //#define DISABLE 0 @@ -106,7 +109,22 @@ static HD_COMMON_MEM_INIT_CONFIG mem_cfg = {0}; +static void Movie_CommPoolInit_Mode1(void); +static void Movie_CommPoolInit_Mode2(void); + void Movie_CommPoolInit(void) +{ + UINT32 mode = DrvGPIO_GetPhotoMovieModeFromMonitor(); + + if(mode == DX_HUNTING_MODE_MOVIE || mode == DX_HUNTING_MODE_PHOTO_MOVIE){ + Movie_CommPoolInit_Mode1(); + } + else{ /* DX_HUNTING_MODE_MOVIE2 */ + Movie_CommPoolInit_Mode2(); + } +} + +static void Movie_CommPoolInit_Mode1(void) { UINT32 id=0; UINT32 vcap_buf_size = 0; @@ -226,6 +244,78 @@ void Movie_CommPoolInit(void) ImageApp_MovieMulti_Config(MOVIE_CONFIG_MEM_POOL_INFO, (UINT32)&mem_cfg); } + +static void Movie_CommPoolInit_Mode2(void) +{ + UINT32 id=0; + UINT32 vcap_buf_size = 0; + HD_VIDEO_PXLFMT vcap_fmt = HD_VIDEO_PXLFMT_RAW12; + + const UINT32 vdo_size_w = 2592; + const UINT32 vdo_size_h = 1944; + + const UINT32 main_size_w = 1920; + const UINT32 main_size_h = 1080; + + const UINT32 clone_size_w = 640; + const UINT32 clone_size_h = 360; + + + /******************************************************************* + * VCap + Main + *******************************************************************/ + + System_GetSensorInfo(id, SENSOR_CAPOUT_FMT, &vcap_fmt); + + /* yuv */ + if (HD_VIDEO_PXLFMT_CLASS(vcap_fmt) == HD_VIDEO_PXLFMT_CLASS_YUV) { + vcap_buf_size = VDO_YUV_BUFSIZE(vdo_size_w, vdo_size_h, vcap_fmt); + } + /* raw */ + else { + vcap_buf_size = VDO_RAW_BUFSIZE(vdo_size_w, vdo_size_h, vcap_fmt); + } + + #if (MOVIE_DIRECT_FUNC == ENABLE) + if (id == 0) { + vcap_buf_size = 0; + } + #endif + + mem_cfg.pool_info[id].type = HD_COMMON_MEM_COMMON_POOL; + mem_cfg.pool_info[id].blk_size = DBGINFO_BUFSIZE() + + vcap_buf_size + + VDO_CA_BUF_SIZE(CA_WIN_NUM_W, CA_WIN_NUM_H) + + VDO_LA_BUF_SIZE(LA_WIN_NUM_W, LA_WIN_NUM_H); + mem_cfg.pool_info[id].blk_cnt = 6; + mem_cfg.pool_info[id].ddr_id = DDR_ID0; + + /******************************************************************* + * Main + *******************************************************************/ + id ++; + mem_cfg.pool_info[id].type = HD_COMMON_MEM_COMMON_POOL; + mem_cfg.pool_info[id].blk_size = DBGINFO_BUFSIZE() + VDO_YUV_BUFSIZE(main_size_w, main_size_h, HD_VIDEO_PXLFMT_YUV420); + mem_cfg.pool_info[id].blk_cnt = 4; + mem_cfg.pool_info[id].ddr_id = DDR_ID0; + + /******************************************************************* + * Clone + *******************************************************************/ + id ++; + mem_cfg.pool_info[id].type = HD_COMMON_MEM_COMMON_POOL; + mem_cfg.pool_info[id].blk_size = DBGINFO_BUFSIZE() + VDO_YUV_BUFSIZE(clone_size_w, clone_size_h, HD_VIDEO_PXLFMT_YUV420); + mem_cfg.pool_info[id].blk_cnt = 4; + mem_cfg.pool_info[id].ddr_id = DDR_ID0; + + + extern MOVIE_ALG_INFO gMovie_Alg_Info[]; + UIAPP_PHOTO_SENSOR_INFO *sensor_info = UIAppPhoto_get_SensorInfo(0); + gMovie_Alg_Info[0].path13.ImgSize = (USIZE) {sensor_info->sSize.w, sensor_info->sSize.h}; + + ImageApp_MovieMulti_Config(MOVIE_CONFIG_MEM_POOL_INFO, (UINT32)&mem_cfg); +} + void Movie_CommPool_AI2_Init(void) { #if (ALG_FUNC_AI2 == ENABLE) diff --git a/rtos/code/application/source/cardv/SrcCode/UIApp/MovieFast/MovieFast.c b/rtos/code/application/source/cardv/SrcCode/UIApp/MovieFast/MovieFast.c index d860296e1..482c8fe78 100644 --- a/rtos/code/application/source/cardv/SrcCode/UIApp/MovieFast/MovieFast.c +++ b/rtos/code/application/source/cardv/SrcCode/UIApp/MovieFast/MovieFast.c @@ -32,7 +32,12 @@ #include "DxHunting.h" #include "flow_preview.h" #include - +#include "UIApp/PhotoFast/PhotoFast.h" +#include "UIApp/PhotoFast/PhotoFastSliceEncode.h" +#include "UIApp/PhotoFast/PhotoFastCapDateImprint.h" +#include "UIAppPhoto_Param.h" +#include "sys_fwload.h" +#include "../lfqueue/lfqueue.h" #if defined(_UI_STYLE_LVGL_) #include "flow_lvgl.h" #endif @@ -57,14 +62,30 @@ #define FLG_EXE_MOVIE_RECSTART FLGPTN_BIT(1) ///< trigger display task #define FLG_EXE_MOVIE_RECSTOP FLGPTN_BIT(2) ///< stop task +#define VDO_YUV_BUFSIZE(w, h, pxlfmt) ALIGN_CEIL_4(((w) * (h) * HD_VIDEO_PXLFMT_BPP(pxlfmt)) / 8) + +typedef enum { + MOVIEFAST_IQ_VIDEO, + MOVIEFAST_IQ_PHOTO, +} MOVIEFAST_IQ_CFG; + +typedef struct { + void* va; + UINT32 size; + char path[256]; + HD_VIDEO_FRAME frame; + HD_PATH_ID vprc_path_id; +} MOVIEFAST_WRITE_QUEUE_PARAM; /********************************************************************************** * independent thumbnail *********************************************************************************/ static char thumb_current_path_main[256] = {'\0'}; static char thumb_current_path_clone[256] = {'\0'}; +static lfqueue_t write_queue = {0}; #define MOVIE_ROOT_PATH "A:\\Novatek\\" +#define MOIVE2_YUV_PATH "A:\\MOVIE2.yuv420" #define FILE_SN_MAX 99999 #define FILEDB_MAX_NUM 5000 #define MOVIE_THUMB_WIDTH 640 @@ -78,9 +99,13 @@ static UINT32 g_moviefast_tsk_run = 1; static UINT32 g_moviefast_poweroff_tsk_run = 1; static THREAD_HANDLE g_moviefast_tsk_id = 0; static THREAD_HANDLE g_moviefast_power_off_tsk_id = 0; +static THREAD_HANDLE g_moviefast_write_tsk_id = 0; static BOOL g_bIsRecStatus = FALSE; static VOS_TICK g_rec_start_tick = 0; - +static VOS_TICK g_alg_start_time= 0; +static VOS_TICK g_alg_end_time= 0; +static VOS_TICK g_vprc_trigger_frm_time= 0; +static UINT32 g_vprc_trigger_frm_count= 0; //local function static void MovieFast_OnRecStart(void); @@ -89,6 +114,7 @@ static void MovieFast_CmdTsk_Exit(void); static int MovieFast_GetWaterLogoSource(const UINT32 recWidth,WATERLOGO_BUFFER *waterSrc); static void MovieFast_ShutDown(void); static void MovieFast_Close(void); +static void MovieFast_Load_Sen_Cfg(MOVIEFAST_IQ_CFG cfg); static VOID MovieFast_Set_RecStartTick(VOS_TICK tick) { @@ -247,6 +273,14 @@ static void MovieFast_ShutDown(void) #if POWERON_BOOT_REPORT == ENABLE DBG_DUMP("PhotoMovie mode = %u\n", mode); + VOS_TICK tick; + + PhotoFast_GetTick(g_vprc_trigger_frm_count, &tick); + + DBG_DUMP("\n\n**********************************************************\n" + " Trigger Speed(vcap frame count = %lu) : %lu us alg_start_time = %lu g_alg_end_time = %lu, perf tick = %lu us\n" + "**********************************************************\n", + g_vprc_trigger_frm_count, g_vprc_trigger_frm_time, g_alg_start_time, g_alg_end_time, tick); vos_perf_list_dump(); @@ -284,6 +318,15 @@ static void MovieFast_ShutDown(void) #if POWERON_BOOT_REPORT == ENABLE + VOS_TICK tick; + + PhotoFast_GetTick(g_vprc_trigger_frm_count, &tick); + + DBG_DUMP("\n\n**********************************************************\n" + " Trigger Speed(vcap frame count = %lu) : %lu us alg_start_time = %lu g_alg_end_time = %lu, perf tick = %lu us\n" + "**********************************************************\n", + g_vprc_trigger_frm_count, g_vprc_trigger_frm_time, g_alg_start_time, g_alg_end_time, tick); + vos_perf_list_dump(); if(mode == DX_HUNTING_MODE_PHOTO_MOVIE){ MovieFast_PV_Info_Dump(); @@ -464,7 +507,7 @@ static void MovieFast_RecMovieStamp(void) NULL); #endif } -#if 1 +#if 0 // set rawenc path 1st movie stamp if (movie_rec_mask & mask) { Width = gMovie_Rec_Info[i].size.w; @@ -664,6 +707,7 @@ static void MovieFast_OnRecStart(void) } #if defined(_UI_STYLE_LVGL_) + fwload_wait_done(CODE_SECTION_05); flow_lv_init(); #endif @@ -821,6 +865,45 @@ static void MovieFast_FileNamingCB(MOVIE_CFG_REC_ID id, char *pFileName) } } +static void MovieFast_WriteFile_Task(void* arg) +{ + lfqueue_t* queue = (lfqueue_t*)arg; + MOVIEFAST_WRITE_QUEUE_PARAM* param; + + fastboot_wait_done(BOOT_INIT_FILESYSOK); + + while(1) + { + param = (MOVIEFAST_WRITE_QUEUE_PARAM*) lfqueue_deq(queue); + if(param == NULL){ + vos_util_delay_ms(5); + continue; + } + + if(param->va){ + DBG_DUMP("Write %s\n", param->path); + + FST_FILE fp = FileSys_OpenFile(param->path, FST_OPEN_ALWAYS | FST_OPEN_WRITE); + FileSys_WriteFile(fp, (UINT8*)param->va, ¶m->size, 0, NULL); + FileSys_CloseFile(fp); + + free(param->va); + } + else if(param->frame.phy_addr[0]){ + DBG_DUMP("Write %s\n", param->path); + + FST_FILE fp = FileSys_OpenFile(param->path, FST_OPEN_ALWAYS | FST_OPEN_WRITE); + FileSys_WriteFile(fp, (UINT8*)param->frame.phy_addr[0], ¶m->size, 0, NULL); + FileSys_CloseFile(fp); + + hd_videoproc_release_out_buf(param->vprc_path_id, ¶m->frame); + } + + if(param){ + free(param); + } + } +} static void MovieFast_UserEventCb(UINT32 id, MOVIE_USER_CB_EVENT event_id, UINT32 value) { //static UINT32 u32Cnt = 0; @@ -860,8 +943,6 @@ static void MovieFast_UserEventCb(UINT32 id, MOVIE_USER_CB_EVENT event_id, UINT3 case MOVIE_USER_CB_EVENT_JENC_DONE:{ - fastboot_wait_done(BOOT_INIT_FILESYSOK); - MOVIE_JPEG_INFO *ptr = (MOVIE_JPEG_INFO*)value; if(ptr->sign == MAKEFOURCC('T', 'H', 'U', 'M')){ @@ -892,11 +973,26 @@ static void MovieFast_UserEventCb(UINT32 id, MOVIE_USER_CB_EVENT event_id, UINT3 #endif DBG_DUMP("MOVIE_USER_CB_EVENT_JENC_DONE %s\n", tmp); - FST_FILE fp = FileSys_OpenFile(tmp, FST_CREATE_ALWAYS | FST_OPEN_WRITE); + MOVIEFAST_WRITE_QUEUE_PARAM* param = (MOVIEFAST_WRITE_QUEUE_PARAM*) malloc(sizeof(MOVIEFAST_WRITE_QUEUE_PARAM)); - FileSys_WriteFile(fp, (UINT8*)ptr->addr_va, &ptr->size, 0, NULL); - FileSys_FlushFile(fp); - FileSys_CloseFile(fp); + if(param){ + + memset(param, 0, sizeof(MOVIEFAST_WRITE_QUEUE_PARAM)); + param->size = ptr->size; + param->va = (void *)malloc(param->size); + snprintf(param->path, sizeof(param->path), tmp); + if(param->va){ + memcpy(param->va, (void*)ptr->addr_va, param->size); + while (lfqueue_enq(&write_queue, (void*) param) == -1) + { + DBG_ERR("ENQ Full ?\r\n"); + } + } + else{ + DBG_ERR("malloc thumb va err!\n"); + free(param); + } + } thumb_current_path[0] = '\0'; } } @@ -939,6 +1035,7 @@ int MovieFast_GetWaterLogoSource(const UINT32 recWidth,WATERLOGO_BUFFER *waterSr return E_OK; } + THREAD_RETTYPE MovieFast_InitFileNamingThread(void *arg) { if(DrvGPIO_GetPhotoMovieModeFromMonitor() != DX_HUNTING_MODE_PHOTO_MOVIE ){ @@ -979,21 +1076,62 @@ void MovieFast_Set_Shutdown_flag(void) vos_flag_set(MOVIEFAST_FLG_ID, FLGMOVIEFAST_SHUTDOWN); } +static void MovieFast_Load_Sen_Cfg(MOVIEFAST_IQ_CFG cfg) +{ + MOVIE_SENSOR_INFO sen_cfg = {0}; + MOVIE_SENSOR_INFO *pSenCfg = &sen_cfg; + UINT32 size = sizeof(pSenCfg->iq_path.path) - 1; + + for (int i = 0; i < SENSOR_CAPS_COUNT; i++) { + // get sensor info + sen_cfg.rec_id = _CFG_REC_ID_1 + i; + System_GetSensorInfo(i, SENSOR_DRV_CFG, &(sen_cfg.vcap_cfg)); + System_GetSensorInfo(i, SENSOR_SENOUT_FMT, &(sen_cfg.senout_pxlfmt)); + System_GetSensorInfo(i, SENSOR_CAPOUT_FMT, &(sen_cfg.capout_pxlfmt)); + System_GetSensorInfo(i, SENSOR_DATA_LANE, &(sen_cfg.data_lane)); + System_GetSensorInfo(i, SENSOR_AE_PATH, &(sen_cfg.ae_path)); + System_GetSensorInfo(i, SENSOR_AWB_PATH, &(sen_cfg.awb_path)); + System_GetSensorInfo(i, SENSOR_IQ_PATH, &(sen_cfg.iq_path)); + System_GetSensorInfo(i, SENSOR_IQ_SHADING_PATH, &(sen_cfg.iq_shading_path)); + System_GetSensorInfo(i, SENSOR_IQ_DPC_PATH, &(sen_cfg.iq_dpc_path)); + System_GetSensorInfo(i, SENSOR_IQ_LDC_PATH, &(sen_cfg.iq_ldc_path)); + + if(cfg == MOVIEFAST_IQ_VIDEO){ + strncpy(pSenCfg->iq_path.path, "/isp/iq/os05b10_iq_0_vid", size); + } + else{ /* MOVIEFAST_IQ_PHOTO */ + + if(sf_is_night_mode(0) ==TRUE) + strncpy(pSenCfg->iq_path.path, "/isp/iq/os05b10_iq_0", size); + else + strncpy(pSenCfg->iq_path.path, "/isp/iq/os05b10_iq_0_cap", size); + } + + ImageApp_MovieMulti_Config(MOVIE_CONFIG_SENSOR_INFO, (UINT32)&sen_cfg); + } +} + THREAD_RETTYPE MovieFast_InitMovieModeThread(void *arg) { UINT32 i; MOVIEMULTI_MAX_LINK_INFO MaxLinkInfo = {1, 0, 0, 1, 0}; //Img, Disp, Wifi, AudCap, EthCam - MOVIE_SENSOR_INFO sen_cfg = {0}; - MOVIE_SENSOR_INFO *pSenCfg = &sen_cfg; - HD_RESULT hd_ret; DBG_FUNC("\r\n"); + UINT32 rec_type = MovieMapping_GetRecType(UI_GetData(FL_MOVIE_SIZE)); Movie_CommPoolInit(); + if(DrvGPIO_GetPhotoMovieModeFromMonitor() == DX_HUNTING_MODE_MOVIE2){ + + //UI_SetData(FL_MOVIE_SIZE, MOVIE_SIZE_CLONE_1920x1080P30_1280x720P30); + Set_NIGHTMODE(0, 0); + } + else{ + Set_NIGHTMODE(0, 1); + Set_AEMODE(0); + } + MovieFast_SetRecInfoByUISetting(); - Set_NIGHTMODE(0, 1); - Set_AEMODE(0); #if (_PACKAGE_DISPLAY_) gMovie_Disp_Info.vout_ctrl = GxVideo_GetDeviceCtrl(DOUT1,DISPLAY_DEVCTRL_CTRLPATH); @@ -1007,49 +1145,16 @@ THREAD_RETTYPE MovieFast_InitMovieModeThread(void *arg) MaxLinkInfo.MaxDispLink = 1; #endif ImageApp_MovieMulti_Config(MOVIE_CONFIG_MAX_LINK_INFO, (UINT32) &MaxLinkInfo); - for (i = 0; i < SENSOR_CAPS_COUNT; i++) { - ImageApp_MovieMulti_Config(MOVIE_CONFIG_RECORD_INFO, (UINT32)&gMovie_Rec_Info[i]); - ImageApp_MovieMulti_Config(MOVIE_CONFIG_RECORD_INFO, (UINT32)&gMovie_Clone_Info[i]); - ImageApp_MovieMulti_Config(MOVIE_CONFIG_ALG_INFO, (UINT32)&gMovie_Alg_Info[0]); - // get sensor info - sen_cfg.rec_id = _CFG_REC_ID_1 + i; - System_GetSensorInfo(i, SENSOR_DRV_CFG, &(sen_cfg.vcap_cfg)); - System_GetSensorInfo(i, SENSOR_SENOUT_FMT, &(sen_cfg.senout_pxlfmt)); - System_GetSensorInfo(i, SENSOR_CAPOUT_FMT, &(sen_cfg.capout_pxlfmt)); - System_GetSensorInfo(i, SENSOR_DATA_LANE, &(sen_cfg.data_lane)); - System_GetSensorInfo(i, SENSOR_AE_PATH, &(sen_cfg.ae_path)); - System_GetSensorInfo(i, SENSOR_AWB_PATH, &(sen_cfg.awb_path)); - System_GetSensorInfo(i, SENSOR_IQ_PATH, &(sen_cfg.iq_path)); - System_GetSensorInfo(i, SENSOR_IQ_SHADING_PATH, &(sen_cfg.iq_shading_path)); - System_GetSensorInfo(i, SENSOR_IQ_DPC_PATH, &(sen_cfg.iq_dpc_path)); - System_GetSensorInfo(i, SENSOR_IQ_LDC_PATH, &(sen_cfg.iq_ldc_path)); - ImageApp_MovieMulti_Config(MOVIE_CONFIG_SENSOR_INFO, (UINT32)&sen_cfg); -#if (SENSOR_SIEPATGEN == ENABLE) - ImageApp_MovieMulti_SetParam(_CFG_REC_ID_1, MOVIEMULTI_PARAM_VCAP_PAT_GEN, HD_VIDEOCAP_SEN_PAT_COLORBAR); -#endif - } + ImageApp_MovieMulti_Config(MOVIE_CONFIG_RECORD_INFO, (UINT32)&gMovie_Rec_Info[0]); + ImageApp_MovieMulti_Config(MOVIE_CONFIG_RECORD_INFO, (UINT32)&gMovie_Clone_Info[0]); + ImageApp_MovieMulti_Config(MOVIE_CONFIG_ALG_INFO, (UINT32)&gMovie_Alg_Info[0]); - if ((hd_ret = vendor_isp_init()) != HD_OK) { - DBG_ERR("vendor_isp_init fail(%d)\n", hd_ret); + if(DrvGPIO_GetPhotoMovieModeFromMonitor() != DX_HUNTING_MODE_MOVIE2){ + MovieFast_Load_Sen_Cfg(MOVIEFAST_IQ_VIDEO); } - if (strlen(pSenCfg->iq_path.path) != 0) { - IQT_DTSI_INFO iq_dtsi_info; - iq_dtsi_info.id = pSenCfg->iq_path.id; - - strncpy(iq_dtsi_info.node_path, "/isp/iq/os05b10_iq_0_vid", 31); - strncpy(iq_dtsi_info.file_path, "null", DTSI_NAME_LENGTH); - - //DBG_ERR("vendor_isp_set_iq %s\r\n",iq_dtsi_info.node_path); - - iq_dtsi_info.buf_addr = (UINT8 *)pSenCfg->iq_path.addr; - if ((hd_ret = vendor_isp_set_iq(IQT_ITEM_RLD_DTSI, &iq_dtsi_info)) != HD_OK) { - DBG_ERR("vendor_isp_set_iq fail(%d)\r\n", hd_ret); - } - } - if ((hd_ret = vendor_isp_uninit()) != HD_OK) { - DBG_ERR("vendor_isp_uninit fail(%d)\n", hd_ret); - } - + else{ + MovieFast_Load_Sen_Cfg(MOVIEFAST_IQ_PHOTO); + } MovieMapping_GetStreamInfo(UI_GetData(FL_MOVIE_SIZE), (UINT32)&gMovie_Strm_Info); ImageApp_MovieMulti_Config(MOVIE_CONFIG_STREAM_INFO, (UINT32)&gMovie_Strm_Info); ImageApp_MovieMulti_Config(MOVIE_CONFIG_AUDIO_INFO, (UINT32)&gMovie_Audio_Info); @@ -1063,7 +1168,6 @@ THREAD_RETTYPE MovieFast_InitMovieModeThread(void *arg) // User Callback ImageApp_MovieMulti_RegUserCB(MovieFast_UserEventCb); - ImageApp_MovieMulti_SetParam(_CFG_CTRL_ID, MOVIEMULTI_PARAM_FILE_UTC_AUTO_EN, TRUE); #if (MOVIE_DIRECT_FUNC == ENABLE) ImageApp_MovieMulti_SetParam(_CFG_REC_ID_1, MOVIEMULTI_PARAM_VCAP_OUTFUNC, HD_VIDEOCAP_OUTFUNC_DIRECT); @@ -1071,10 +1175,34 @@ THREAD_RETTYPE MovieFast_InitMovieModeThread(void *arg) ImageApp_MovieMulti_SetParam(_CFG_REC_ID_1, MOVIEMULTI_PRARM_FILEDB_MAX_MUM, 5000); - MOVIEMULTI_IPL_SIZE_INFO ipl_size={{2560,1440}, 30}; + if(DrvGPIO_GetPhotoMovieModeFromMonitor() != DX_HUNTING_MODE_MOVIE2){ + MOVIEMULTI_IPL_SIZE_INFO ipl_size={{2560,1440}, 30}; + ImageApp_MovieMulti_SetParam(_CFG_REC_ID_1 , MOVIEMULTI_PARAM_IPL_USER_IMG_SIZE, (UINT32)&ipl_size); + ImageApp_MovieMulti_SetParam(_CFG_REC_ID_1 , MOVIEMULTI_PARAM_IPL_FORCED_IMG_SIZE, MOVIE_IPL_SIZE_USER); + ImageApp_MovieMulti_SetParam(_CFG_CTRL_ID, MOVIEMULTI_PARAM_FILE_UTC_AUTO_EN, TRUE); + } + else{ + UIAPP_PHOTO_SENSOR_INFO *sensor_info = UIAppPhoto_get_SensorInfo(0); + MOVIEMULTI_IPL_SIZE_INFO ipl_size={{sensor_info->sSize.w, sensor_info->sSize.h}, 60}; + ImageApp_MovieMulti_SetParam(_CFG_REC_ID_1 , MOVIEMULTI_PARAM_IPL_USER_IMG_SIZE, (UINT32)&ipl_size); + ImageApp_MovieMulti_SetParam(_CFG_REC_ID_1 , MOVIEMULTI_PARAM_IPL_FORCED_IMG_SIZE, MOVIE_IPL_SIZE_USER); - ImageApp_MovieMulti_SetParam(_CFG_REC_ID_1 , MOVIEMULTI_PARAM_IPL_USER_IMG_SIZE, (UINT32)&ipl_size); - ImageApp_MovieMulti_SetParam(_CFG_REC_ID_1 , MOVIEMULTI_PARAM_IPL_FORCED_IMG_SIZE, MOVIE_IPL_SIZE_USER); + + MOVIEMULTI_IME_CROP_INFO crop_info = {0}; + + /* 4:3 -> 16:9 */ + crop_info.IMESize = (USIZE){1920, 1440}; + crop_info.IMEWin = (URECT){0, 180, 1920, 1080}; + ImageApp_MovieMulti_SetParam(_CFG_REC_ID_1 , MOVIEMULTI_PARAM_MAIN_IME_CROP, (UINT32)&crop_info); + if(MOVIE_REC_TYPE_CLONE == rec_type) + { + /* 4:3 -> 16:9 */ + crop_info.IMESize = (USIZE){640, 480}; + crop_info.IMEWin = (URECT){0, 60, 640, 360}; + ImageApp_MovieMulti_SetParam(_CFG_REC_ID_1 , MOVIEMULTI_PARAM_CLONE_IME_CROP, (UINT32)&crop_info); + } + + } #if (ANR_FUNC == ENABLE) HD_AUDIOCAP_ANR audio_cfg_param = {0}; @@ -1098,8 +1226,42 @@ THREAD_RETTYPE MovieFast_InitMovieModeThread(void *arg) ImageApp_MovieMulti_SetParam(_CFG_REC_ID_1 + i, MOVIEMULTI_PARAM_FILE_FRONT_MOOV, TRUE); ImageApp_MovieMulti_SetParam(_CFG_REC_ID_1 + i, MOVIEMULTI_PARAM_FILE_FRONT_MOOV_FLUSH_SEC, 2); } + - if (1){//gMovie_Alg_Info[_CFG_REC_ID_1 + i].path13.ImgSize.w && gMovie_Alg_Info[_CFG_REC_ID_1 + i].path13.ImgSize.h) { + if(DrvGPIO_GetPhotoMovieModeFromMonitor() == DX_HUNTING_MODE_MOVIE2){ + + HD_PATH_ID vprc_in_id = ImageApp_MovieMulti_GetVprc3DNRPort(_CFG_REC_ID_1); + HD_PATH_ID vprc_main_id = ImageApp_MovieMulti_GetVprcPort(_CFG_REC_ID_1, IAMOVIE_VPRC_EX_MAIN); + HD_PATH_ID vprc_alg_id = ImageApp_MovieMulti_GetVprcPort(_CFG_REC_ID_1, IAMOVIE_VPRC_EX_ALG); + HD_PATH_ID vprc_clone_id = ImageApp_MovieMulti_GetVprcPort(_CFG_REC_ID_1, IAMOVIE_VPRC_EX_CLONE); + HD_VIDEOPROC_OUT_EX vprc_out = {0}; + HD_VIDEOPROC_IN vprc_in = {0}; + + hd_videoproc_get(vprc_in_id, HD_VIDEOPROC_PARAM_IN, &vprc_in); + vprc_in.frc = HD_VIDEO_FRC_RATIO(30, 60); + hd_videoproc_set(vprc_in_id, HD_VIDEOPROC_PARAM_IN, &vprc_in); + + /* alg */ + hd_videoproc_get(vprc_alg_id, HD_VIDEOPROC_PARAM_OUT_EX, &vprc_out); + vprc_out.frc = HD_VIDEO_FRC_RATIO(1, 1); + hd_videoproc_set(vprc_alg_id, HD_VIDEOPROC_PARAM_OUT_EX, &vprc_out); + + /* main */ + hd_videoproc_get(vprc_main_id, HD_VIDEOPROC_PARAM_OUT_EX, &vprc_out); + vprc_out.frc = HD_VIDEO_FRC_RATIO(1, 1); +// vprc_out.depth = 0; /* raw encode */ + hd_videoproc_set(vprc_main_id, HD_VIDEOPROC_PARAM_OUT_EX, &vprc_out); + if(MOVIE_REC_TYPE_CLONE == rec_type) + { + /* clone */ + hd_videoproc_get(vprc_clone_id, HD_VIDEOPROC_PARAM_OUT_EX, &vprc_out); + vprc_out.frc = HD_VIDEO_FRC_RATIO(1, 1); + // vprc_out.depth = 0; + hd_videoproc_set(vprc_clone_id, HD_VIDEOPROC_PARAM_OUT_EX, &vprc_out); + } + } + + if (1){//gMovie_Alg_Info[_CFG_REC_ID_1 + i].path13.ImgSize.w && gMovie_Alg_Info[_CFG_REC_ID_1 + i].path13.ImgSize.h) { ImageApp_MovieMulti_ImgLinkForAlg((_CFG_REC_ID_1 ), _CFG_ALG_PATH3, ENABLE, TRUE); } @@ -1114,9 +1276,95 @@ THREAD_RETTYPE MovieFast_InitMovieModeThread(void *arg) //ImageApp_MovieMulti_SetParam(_CFG_REC_ID_1, MOVIEMULTI_PARAM_IMGCAP_THUM_WITH_EXIF, TRUE); // enable if wants exif in mp4 thumbnail MovieExe_InitExif(); #endif + if(lfqueue_init(&write_queue)){ + DBG_ERR("init write_queue failed\n"); + } + else{ + if ((g_moviefast_write_tsk_id = vos_task_create(MovieFast_WriteFile_Task, &write_queue, "MovieFastThumTsk", PRI_MOVIEFAST_CMDTSK, STKSIZE_MOVIEFAST_CMDTSK)) == 0) { + DBG_ERR("MovieFast_Thumb_Task create failed.\r\n"); + } else { + vos_task_resume(g_moviefast_write_tsk_id); + } + } MovieFast_InstallID(); - vos_util_delay_ms(132); + + { + HD_VIDEO_FRAME frame; + HD_PATH_ID alg_path; + BOOL stop = FALSE; + UINT32 ae_cnt = 0; + UINT32 stop_cnt = 0; + BOOL ae_locked = FALSE; + + if(DrvGPIO_GetPhotoMovieModeFromMonitor() == DX_HUNTING_MODE_MOVIE2){ + ae_cnt = 6; + stop_cnt = 12; + } + else{ + ae_cnt = 9999; + stop_cnt = 12; + } + + alg_path = ImageApp_MovieMulti_GetAlgDataPort(_CFG_REC_ID_1, _CFG_ALG_PATH3); + + vos_perf_mark(&g_alg_start_time); + + do { + + hd_videoproc_pull_out_buf(alg_path, &frame, PHOTOFAST_HD_PUSH_PULL_TIMEOUT_MS); + + DBG_DUMP("count = %llu, timestamp = %llu\n", frame.count, frame.timestamp); + + if(frame.count >= ae_cnt && ae_locked == FALSE){ + DBG_DUMP("timestamp = %llu count = %llu\n", frame.timestamp, frame.count); + Set_AEMODE(1); + setet_preset_param(); + ae_locked = TRUE; + } + + if(frame.count >= stop_cnt){ + + UIAPP_PHOTO_SENSOR_INFO *sensor_info = UIAppPhoto_get_SensorInfo(0); + UINT32 buf_size = 0; + + buf_size = VDO_YUV_BUFSIZE(sensor_info->sSize.w, sensor_info->sSize.h , HD_VIDEO_PXLFMT_YUV420); +#if 0 + VOS_TICK t1, t2; + vos_perf_mark(&t1); + FST_FILE fp = FileSys_OpenFile(MOIVE2_YUV_PATH, FST_OPEN_ALWAYS | FST_OPEN_WRITE); + FileSys_WriteFile(fp, (UINT8*)frame.phy_addr[0], &buf_size, 0, NULL); + FileSys_CloseFile(fp); + vos_perf_mark(&t2); + DBG_DUMP("write = %lu us\n", vos_perf_duration(t1, t2)); +#endif + + MOVIEFAST_WRITE_QUEUE_PARAM* param = (MOVIEFAST_WRITE_QUEUE_PARAM*) malloc(sizeof(MOVIEFAST_WRITE_QUEUE_PARAM)); + if(param){ + memcpy((void*)¶m->frame, (void*)&frame, sizeof(HD_VIDEO_FRAME)); + param->va = NULL; + param->vprc_path_id = alg_path; + param->size = buf_size; + sprintf(param->path, MOIVE2_YUV_PATH); + } + + g_vprc_trigger_frm_time = (VOS_TICK)frame.timestamp; + g_vprc_trigger_frm_count = (UINT32)frame.count; + + while (lfqueue_enq(&write_queue, (void*) param) == -1) + { + DBG_ERR("ENQ Full ?\r\n"); + } + + stop = TRUE; + } + else{ + hd_videoproc_release_out_buf(alg_path, &frame); + } + } while(stop == FALSE); + + vos_perf_mark(&g_alg_end_time); + } if ((g_moviefast_power_off_tsk_id = vos_task_create(MovieFast_PowerOffTsk, 0, "MovieFastPwrTsk", PRI_MOVIEFAST_CMDTSK, STKSIZE_MOVIEFAST_CMDTSK)) == 0) { DBG_ERR("MovieFast_PowerOffTsk create failed.\r\n"); @@ -1147,6 +1395,65 @@ static void MovieFast_Close(void) ImageApp_MovieMulti_Close(); + if(DrvGPIO_GetPhotoMovieModeFromMonitor() == DX_HUNTING_MODE_MOVIE2){ + + HD_PATH_ID alg_path = ImageApp_MovieMulti_GetAlgDataPort(_CFG_REC_ID_1, _CFG_ALG_PATH3); + UIAPP_PHOTO_SENSOR_INFO *sensor_info = UIAppPhoto_get_SensorInfo(0); + UINT32 buf_pa = 0; + void* buf_va = 0; + + PhotoFast_Movie_Init(); + + PhotoFast_SliceEncode_Open(alg_path); + PhotoFast_SliceEncode2_Open(alg_path, 1); + + HD_VIDEO_FRAME frame = {0}; + UINT32 addr_dst[HD_VIDEO_MAX_PLANE] = {0}; + UINT32 loff_dst[HD_VIDEO_MAX_PLANE] = {0}; + UINT32 buf_size = 0; + + HD_COMMON_MEM_VB_BLK blk = 0; + buf_size = VDO_YUV_BUFSIZE(sensor_info->sSize.w, sensor_info->sSize.h , HD_VIDEO_PXLFMT_YUV420); + blk = hd_common_mem_get_block(HD_COMMON_MEM_COMMON_POOL, buf_size, DDR_ID0); // Get block from mem pool + if (blk == HD_COMMON_MEM_VB_INVALID_BLK) { + DBG_ERR("hd_common_mem_get_block failed!(size=%lx)\n", buf_size); + } + + buf_pa = hd_common_mem_blk2pa(blk); + if (buf_pa == 0) { + DBG_ERR("hd_common_mem_blk2pa failed!(blk=0x%x)\n", blk); + } + + buf_va = (void*)hd_common_mem_mmap(HD_COMMON_MEM_MEM_TYPE_CACHE, buf_pa, buf_size); + if (buf_va == 0) { + DBG_ERR("hd_common_mem_mmap failed!\r\n"); + } + + if(buf_pa){ + /* dst img */ + addr_dst[0] = buf_pa; + loff_dst[0] = sensor_info->sSize.w; + addr_dst[1] = addr_dst[0] + loff_dst[0] * sensor_info->sSize.h; + loff_dst[1] = sensor_info->sSize.w; + vf_init_ex(&frame, sensor_info->sSize.w, sensor_info->sSize.h, HD_VIDEO_PXLFMT_YUV420, loff_dst, addr_dst); + + FST_FILE fp = FileSys_OpenFile(MOIVE2_YUV_PATH, FST_OPEN_READ); + if(fp){ + FileSys_ReadFile(fp, (UINT8*)buf_va, &buf_size, 0, NULL); + FileSys_CloseFile(fp); + + PhotoFast_Sliceencode2_Enq_Frame(&frame); + PhotoFast_SliceEncode2_Close(); + } + else{ + DBG_ERR("%s not found!\n", MOIVE2_YUV_PATH); + } + } + else{ + DBG_ERR("allocate %lx failed!\n", buf_size); + } + } + DCF_Close(g_dcf_hdl); DCF_UnInstallID(); diff --git a/rtos/code/application/source/cardv/SrcCode/UIApp/MovieStamp/MovieStamp.c b/rtos/code/application/source/cardv/SrcCode/UIApp/MovieStamp/MovieStamp.c index 75ac4a4c7..4f9522038 100755 --- a/rtos/code/application/source/cardv/SrcCode/UIApp/MovieStamp/MovieStamp.c +++ b/rtos/code/application/source/cardv/SrcCode/UIApp/MovieStamp/MovieStamp.c @@ -19,6 +19,7 @@ #include "vf_gfx.h" #include "GxTime.h" #include "hd_type.h" +#include "sys_fwload.h" #if MOVIE_ISP_LOG #include "vendor_isp.h" @@ -328,6 +329,8 @@ static void MovieStamp_get_isp_status(UINT32 id, char* Buf, UINT32 BufLen) #endif UINT32 MovieStamp_TriggerUpdateChk(void) { + extern int fwload_wait_done(CODE_SECTION section); + fwload_wait_done(CODE_SECTION_10); struct tm CurDateTime; GxTime_GetTime(&CurDateTime); @@ -1490,7 +1493,7 @@ void MovieStamp_VsFontConfig(UINT32 uiVEncOutPortId) 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; + g_VsFontIn[uiVEncOutPortId].ciTransparet = ((LV_COLOR_GET_A32((lv_color32_t){.full = LV_USER_CFG_STAMP_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 diff --git a/rtos/code/application/source/cardv/SrcCode/UIApp/Photo/UIAppPhoto.h b/rtos/code/application/source/cardv/SrcCode/UIApp/Photo/UIAppPhoto.h index 6afd61124..fe9589bb3 100755 --- a/rtos/code/application/source/cardv/SrcCode/UIApp/Photo/UIAppPhoto.h +++ b/rtos/code/application/source/cardv/SrcCode/UIApp/Photo/UIAppPhoto.h @@ -72,7 +72,7 @@ #else #if PHOTO_PREVIEW_SLICE_ENC_FUNC || POWERON_FAST_SLICE_ENC #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 diff --git a/rtos/code/application/source/cardv/SrcCode/UIApp/PhotoFast/PhotoFast.c b/rtos/code/application/source/cardv/SrcCode/UIApp/PhotoFast/PhotoFast.c index 10324ce43..490b28d06 100755 --- a/rtos/code/application/source/cardv/SrcCode/UIApp/PhotoFast/PhotoFast.c +++ b/rtos/code/application/source/cardv/SrcCode/UIApp/PhotoFast/PhotoFast.c @@ -37,6 +37,7 @@ #include "PhotoFastCapDateImprint.h" #include "DCF.h" #include "flow_boot_linux.h" +#include "UIAppPhoto_Param.h" #if HUNTING_CAMERA_MCU == ENABLE #include #include "sf_led.h" @@ -116,7 +117,7 @@ INT32 PhotoFast_FileNaming_MakePath(UINT32 filetype, CHAR *pPath, UINT32 uiPathI INT32 PhotoFast_Phy2LogID(UINT32 id); THREAD_RETTYPE PhotoFast_EncodeBsPullThread(void *ptr); UINT32 PhotoFast_GetExpectSize_RhoBRCrtl(UINT32 ImgIdx, BOOL bPrimaryOnly); -INT32 PhotoFast_WriteFile(UINT32 Addr, UINT32 Size, UINT32 Fmt, UINT32 uiPathId); +INT32 PhotoFast_WriteFile(UINT32 Addr, UINT32 Size, UINT32 Fmt, UINT32 uiPathId, char* Path); static void PhotoFast_ShutDown(void); void Set_NIGHTMODE(UINT32 id, UINT8 isSnapVideo); void Set_AEMODE(UINT32 id); @@ -847,7 +848,7 @@ void PhotoFast_FileNaming_SetSortBySN(CHAR *pDelimStr, UINT32 nDelimCount, UINT3 DBG_ERR("No set Delim String!!\r\n"); } -INT32 PhotoFast_WriteFile(UINT32 Addr, UINT32 Size, UINT32 Fmt, UINT32 uiPathId) +INT32 PhotoFast_WriteFile(UINT32 Addr, UINT32 Size, UINT32 Fmt, UINT32 uiPathId, char* Path) { FST_FILE fp; INT32 rt; @@ -857,19 +858,26 @@ INT32 PhotoFast_WriteFile(UINT32 Addr, UINT32 Size, UINT32 Fmt, UINT32 uiPathId) UINT32 open_flag; UINT32 nextFolderID = 0, nextFileID = 0; - if (DCF_GetDBInfo(DCF_INFO_IS_9999)) { - DBG_ERR("Exceed max dcf file!\r\n"); - return FST_STA_NOFREE_SPACE; - } - else { - if (Fmt == HD_CODEC_TYPE_RAW){ - fileType = DCF_FILE_TYPE_RAW; - } - else{ - fileType = DCF_FILE_TYPE_JPG; - } - DCF_GetNextID(&nextFolderID,&nextFileID); - DCF_MakeObjPath(nextFolderID, nextFileID, fileType, FilePath); + if(Path == NULL){ + if (DCF_GetDBInfo(DCF_INFO_IS_9999)) { + DBG_ERR("Exceed max dcf file!\r\n"); + return FST_STA_NOFREE_SPACE; + } + else { + if (Fmt == HD_CODEC_TYPE_RAW){ + fileType = DCF_FILE_TYPE_RAW; + } + else{ + fileType = DCF_FILE_TYPE_JPG; + } + DCF_GetNextID(&nextFolderID,&nextFileID); + DCF_MakeObjPath(nextFolderID, nextFileID, fileType, FilePath); + DCF_AddDBfile(FilePath); + DBG_DUMP("%s added to DCF\r\n", FilePath); + } + } + else{ + strncpy(FilePath, Path, sizeof(FilePath)); } #if HUNTING_CAMERA_MCU == ENABLE @@ -897,8 +905,8 @@ INT32 PhotoFast_WriteFile(UINT32 Addr, UINT32 Size, UINT32 Fmt, UINT32 uiPathId) FileSys_FlushFile(fp); FileSys_CloseFile(fp); if (rt == FST_STA_OK) { - DCF_AddDBfile(FilePath); - DBG_DUMP("%s added to DCF\r\n", FilePath); + // DCF_AddDBfile(FilePath); + // DBG_DUMP("%s added to DCF\r\n", FilePath); } else { DBG_ERR("Addr=0x%x,Size=0x%x,Fmt=%d\r\n", Addr, Size, Fmt); } @@ -1343,7 +1351,7 @@ static void PhotoFast_CaptureStart(HD_VIDEO_FRAME *p_video_frame) GxImgFile_CombineJPG(&exif_data, &pri_jpg, &scr_jpg, &dst_jpg_file); fastboot_wait_done(BOOT_INIT_FILENAMINGOK); - PhotoFast_WriteFile(dst_jpg_file.addr, dst_jpg_file.size, NAMERULE_FMT_JPG, 0); + PhotoFast_WriteFile(dst_jpg_file.addr, dst_jpg_file.size, NAMERULE_FMT_JPG, 0, 0); for (i=0; i < PHOTO_ENC_JPG_TYPE_MAX_ID; i++) { hd_ret = hd_videoenc_release_out_buf(g_video_enc_path[i], &g_bs_data_pull[i]); @@ -1684,7 +1692,11 @@ THREAD_RETTYPE PhotoFast_FlowPreviewThread(void *arg) //#endif start_cap = TRUE; - DBG_DUMP("*** trigger frame count = %llu (start from 1)\n", video_cap_frame.count); /* UINT64, use %llu */ + VOS_TICK tick; + + PhotoFast_GetTick(video_cap_frame.count, &tick); + + DBG_DUMP("*** trigger frame count = %llu (start from 1) frame timestamp = %llu, tick=%lu ms , \n", video_cap_frame.count, video_cap_frame.timestamp, tick); /* UINT64, use %llu */ //Set_AEMODE(1); } @@ -2033,7 +2045,6 @@ void Set_NIGHTMODE(UINT32 id, UINT8 isSnapVideo) void Set_AEMODE(UINT32 id) { AET_MANUAL ae_manual = {0}; - AWBT_MANUAL manual = {0}; AWBT_STATUS status = {0}; ISPT_C_GAIN c_gain = {0}; HD_RESULT hd_ret; @@ -2102,20 +2113,6 @@ void Set_AEMODE(UINT32 id) c_gain.gain[1] = status.status.cur_g_gain; c_gain.gain[2] = status.status.cur_b_gain; vendor_isp_set_common(ISPT_ITEM_C_GAIN, &c_gain); - manual.id = 0; - if (id == 1) - { - manual.manual.en = 1; - manual.manual.r_gain = status.status.cur_r_gain; - manual.manual.g_gain = status.status.cur_g_gain; - manual.manual.b_gain = status.status.cur_b_gain; - - } - else - { - manual.manual.en = 0; - } - vendor_isp_set_awb(AWBT_ITEM_MANUAL, &manual); } } if ((hd_ret = vendor_isp_uninit()) != HD_OK) { @@ -2189,5 +2186,75 @@ UINT32 PhotoFast_GetTickBufSize(void) return VD_TICK_BUF_SIZE; } +#include "vendor_common.h" +#define DBGINFO_BUFSIZE() (0x200) + +ER PhotoFast_Movie_Init(void) +{ + PhotoFast_InitExif(); + PhotoFastCapDateImprint_InitBuff(); + hd_gfx_init(); + + + HD_COMMON_MEM_INIT_CONFIG mem_cfg = {0}; + UINT32 id = 0; + + /******************************************************************* + * Slice encode thumbnail + *******************************************************************/ + + +#if HUNTING_CAMERA_MCU == ENABLE + UIMenuStoreInfo *puiPara = sf_ui_para_get(); + UINT32 blk_size = DBGINFO_BUFSIZE() + VDO_YUV_BUFSIZE(sf_get_screen_nail_width(puiPara->SendPicSize), sf_get_screen_nail_height(puiPara->SendPicSize), HD_VIDEO_PXLFMT_YUV420); +#else + UINT32 blk_size = DBGINFO_BUFSIZE() + VDO_YUV_BUFSIZE(CFG_SCREENNAIL_W, CFG_SCREENNAIL_H, HD_VIDEO_PXLFMT_YUV420); +#endif + mem_cfg.pool_info[id].type = HD_COMMON_MEM_COMMON_POOL; + mem_cfg.pool_info[id].blk_size = blk_size; + mem_cfg.pool_info[id].blk_cnt = 1; + mem_cfg.pool_info[id].ddr_id = DDR_ID0; + + /******************************************************************* + * Slice encode slice yuv buffer + *******************************************************************/ + id ++; + mem_cfg.pool_info[id].type = HD_COMMON_MEM_COMMON_POOL; + mem_cfg.pool_info[id].blk_size = PhotoFast_SliceEncode_Get_Max_Dst_Slice_Buffer_Size(HD_VIDEO_PXLFMT_YUV420); + mem_cfg.pool_info[id].blk_cnt = 1; + mem_cfg.pool_info[id].ddr_id = DDR_ID0; + + + // config common pool (screennail image) + id ++; + mem_cfg.pool_info[id].type = HD_COMMON_MEM_COMMON_POOL; +#if HUNTING_CAMERA_MCU == ENABLE + mem_cfg.pool_info[id].blk_size = DBGINFO_BUFSIZE()+VDO_YUV_BUFSIZE(sf_get_screen_nail_width(puiPara->SendPicSize), sf_get_screen_nail_height(puiPara->SendPicSize), HD_VIDEO_PXLFMT_YUV420); + +#else + mem_cfg.pool_info[id].blk_size = DBGINFO_BUFSIZE()+VDO_YUV_BUFSIZE(CFG_SCREENNAIL_W, CFG_SCREENNAIL_H, HD_VIDEO_PXLFMT_YUV420); +#endif + mem_cfg.pool_info[id].blk_cnt = 1; + mem_cfg.pool_info[id].ddr_id = DDR_ID0; + + // config common pool (EXIF) + id++; + mem_cfg.pool_info[id].type = HD_COMMON_MEM_COMMON_POOL; + mem_cfg.pool_info[id].blk_size = DBGINFO_BUFSIZE()+CFG_JPG_HEADER_SIZE; + mem_cfg.pool_info[id].blk_cnt = 1; + mem_cfg.pool_info[id].ddr_id = DDR_ID0; + + UIAPP_PHOTO_SENSOR_INFO *sensor_info = UIAppPhoto_get_SensorInfo(0); + id++; + mem_cfg.pool_info[id].type = HD_COMMON_MEM_COMMON_POOL; + mem_cfg.pool_info[id].blk_size = DBGINFO_BUFSIZE()+VDO_YUV_BUFSIZE(sensor_info->sSize.w, sensor_info->sSize.h , HD_VIDEO_PXLFMT_YUV420); + mem_cfg.pool_info[id].blk_cnt = 1; + mem_cfg.pool_info[id].ddr_id = DDR_ID0; + + vendor_common_mem_relayout(&mem_cfg); + + return E_OK; +} + #endif diff --git a/rtos/code/application/source/cardv/SrcCode/UIApp/PhotoFast/PhotoFast.h b/rtos/code/application/source/cardv/SrcCode/UIApp/PhotoFast/PhotoFast.h index 20f56df13..a59955b9f 100755 --- a/rtos/code/application/source/cardv/SrcCode/UIApp/PhotoFast/PhotoFast.h +++ b/rtos/code/application/source/cardv/SrcCode/UIApp/PhotoFast/PhotoFast.h @@ -56,10 +56,11 @@ extern THREAD_RETTYPE PhotoFast_EncodeBsPullThread(void *arg); extern THREAD_RETTYPE PhotoFast_FlowPreviewThread(void *arg); extern void PhotoFast_PhotoClose(void); -extern BOOL PhotoFast_SetTick(UINT32 cnt, VOS_TICK tick); /* start from 0 */ -extern BOOL PhotoFast_GetTick(UINT32 cnt, VOS_TICK* tick); /* start from 0 */ +extern BOOL PhotoFast_SetTick(UINT32 cnt, VOS_TICK tick); /* start from 1 */ +extern BOOL PhotoFast_GetTick(UINT32 cnt, VOS_TICK* tick); /* start from 1 */ extern BOOL PhotoFast_SetTriggerFrmCnt(UINT32 cnt); /* trigger vcap frame count , get from HD_VIDEO_FRAME */ +UINT32 PhotoFast_GetTriggerFrmCnt(VOID); extern UINT32 PhotoFast_GetTickBufSize(void); - +ER PhotoFast_Movie_Init(void); #endif //_UIAPP_PHOTO_H_ diff --git a/rtos/code/application/source/cardv/SrcCode/UIApp/PhotoFast/PhotoFastSliceEncode.c b/rtos/code/application/source/cardv/SrcCode/UIApp/PhotoFast/PhotoFastSliceEncode.c index 5c4f17059..074ae7cfd 100755 --- a/rtos/code/application/source/cardv/SrcCode/UIApp/PhotoFast/PhotoFastSliceEncode.c +++ b/rtos/code/application/source/cardv/SrcCode/UIApp/PhotoFast/PhotoFastSliceEncode.c @@ -234,7 +234,7 @@ static UINT32 PhotoFast_SliceEncode_Get_Max_Dst_Slice_Info(PhotoFast_SliceSize_I UINT8 cap_idx = 0; - for(cap_idx = PHOTO_MAX_CAP_SIZE ; cap_idx <= PHOTO_SLICE_ENC_MIN_CAP_SIZE ; cap_idx++) + for(cap_idx = PHOTO_MAX_CAP_SIZE ; cap_idx <= PHOTO_MIN_CAP_SIZE ; cap_idx++) { HD_DIM tmp_cap_size = {0}; PhotoFast_SliceSize_Info tmp_slice_info = {0}; diff --git a/rtos/code/application/source/cardv/SrcCode/UIWnd/LVGL_SPORTCAM/UIFlowLVGL/UIFlowMenuCommonItem/MenuPhoto.c b/rtos/code/application/source/cardv/SrcCode/UIWnd/LVGL_SPORTCAM/UIFlowLVGL/UIFlowMenuCommonItem/MenuPhoto.c index 3405b5afd..2327e55da 100755 --- a/rtos/code/application/source/cardv/SrcCode/UIWnd/LVGL_SPORTCAM/UIFlowLVGL/UIFlowMenuCommonItem/MenuPhoto.c +++ b/rtos/code/application/source/cardv/SrcCode/UIWnd/LVGL_SPORTCAM/UIFlowLVGL/UIFlowMenuCommonItem/MenuPhoto.c @@ -19,43 +19,43 @@ TMDEF_BEGIN_OPTIONS(PHOTO_SIZE) #if PHOTO_PREVIEW_SLICE_ENC_FUNC || POWERON_FAST_SLICE_ENC - #if(PHOTO_MAX_CAP_SIZE > PHOTO_SLICE_ENC_MIN_CAP_SIZE) + #if(PHOTO_MAX_CAP_SIZE > PHOTO_MIN_CAP_SIZE) #error "please check PHOTO_MAX_CAP_SIZE in UIAppPhoto.h" #endif - #if (PHOTO_SLICE_ENC_MIN_CAP_SIZE < UIAPP_PHOTO_SIZE_40M)//PHOTO_SIZE_40M + #if (PHOTO_MIN_CAP_SIZE < UIAPP_PHOTO_SIZE_40M)//PHOTO_SIZE_40M TMDEF_OPTION_TEXT_S(PHOTO_SIZE_40M, TM_OPTION_DISABLE) #else TMDEF_OPTION_TEXT_S(PHOTO_SIZE_40M, TM_OPTION_ENABLE) #endif - #if (PHOTO_SLICE_ENC_MIN_CAP_SIZE < UIAPP_PHOTO_SIZE_12M)//PHOTO_SIZE_12M + #if (PHOTO_MIN_CAP_SIZE < UIAPP_PHOTO_SIZE_12M)//PHOTO_SIZE_12M TMDEF_OPTION_TEXT_S(PHOTO_SIZE_12M, TM_OPTION_DISABLE) #else TMDEF_OPTION_TEXT_S(PHOTO_SIZE_12M, TM_OPTION_ENABLE) #endif - #if (PHOTO_SLICE_ENC_MIN_CAP_SIZE < UIAPP_PHOTO_SIZE_10M)//PHOTO_SIZE_10M + #if (PHOTO_MIN_CAP_SIZE < UIAPP_PHOTO_SIZE_10M)//PHOTO_SIZE_10M TMDEF_OPTION_TEXT_S(PHOTO_SIZE_10M, TM_OPTION_DISABLE) #else TMDEF_OPTION_TEXT_S(PHOTO_SIZE_10M, TM_OPTION_ENABLE) #endif - #if (PHOTO_SLICE_ENC_MIN_CAP_SIZE < UIAPP_PHOTO_SIZE_8M)//PHOTO_SIZE_8M + #if (PHOTO_MIN_CAP_SIZE < UIAPP_PHOTO_SIZE_8M)//PHOTO_SIZE_8M TMDEF_OPTION_TEXT_S(PHOTO_SIZE_8M, TM_OPTION_DISABLE) #else TMDEF_OPTION_TEXT_S(PHOTO_SIZE_8M, TM_OPTION_ENABLE) #endif - #if (PHOTO_SLICE_ENC_MIN_CAP_SIZE < UIAPP_PHOTO_SIZE_5M)//PHOTO_SIZE_5M + #if (PHOTO_MIN_CAP_SIZE < UIAPP_PHOTO_SIZE_5M)//PHOTO_SIZE_5M TMDEF_OPTION_TEXT_S(PHOTO_SIZE_5M, TM_OPTION_DISABLE) #else TMDEF_OPTION_TEXT_S(PHOTO_SIZE_5M, TM_OPTION_ENABLE) #endif - #if (PHOTO_SLICE_ENC_MIN_CAP_SIZE < UIAPP_PHOTO_SIZE_3M)//PHOTO_SIZE_3M + #if (PHOTO_MIN_CAP_SIZE < UIAPP_PHOTO_SIZE_3M)//PHOTO_SIZE_3M TMDEF_OPTION_TEXT_S(PHOTO_SIZE_3M, TM_OPTION_DISABLE) #else TMDEF_OPTION_TEXT_S(PHOTO_SIZE_3M, TM_OPTION_ENABLE) #endif - #if (PHOTO_SLICE_ENC_MIN_CAP_SIZE < UIAPP_PHOTO_SIZE_VGA)//PHOTO_SIZE_VGA + #if (PHOTO_MIN_CAP_SIZE < UIAPP_PHOTO_SIZE_VGA)//PHOTO_SIZE_VGA TMDEF_OPTION_TEXT_S(PHOTO_SIZE_VGA, TM_OPTION_DISABLE) #else TMDEF_OPTION_TEXT_S(PHOTO_SIZE_VGA, TM_OPTION_ENABLE) diff --git a/rtos/code/application/source/cardv/SrcCode/UIWnd/LVGL_SPORTCAM/UIInfo/UIInfo.h b/rtos/code/application/source/cardv/SrcCode/UIWnd/LVGL_SPORTCAM/UIInfo/UIInfo.h index 57ec75684..f286ef726 100755 --- a/rtos/code/application/source/cardv/SrcCode/UIWnd/LVGL_SPORTCAM/UIInfo/UIInfo.h +++ b/rtos/code/application/source/cardv/SrcCode/UIWnd/LVGL_SPORTCAM/UIInfo/UIInfo.h @@ -1866,6 +1866,7 @@ typedef enum { SF_CAM_MODE_PHOTO = 0x00, SF_CAM_MODE_VIDEO, SF_CAM_MODE_PHOTO_VIDEO, + SF_CAM_MODE_VIDEO2, SF_CAM_MODE_MAX, }SF_BOOT_WORK_MODE; diff --git a/rtos/code/application/source/cardv/rtos-main-hunting_lvgl.lds b/rtos/code/application/source/cardv/rtos-main-hunting_lvgl.lds index 1a8cdf3e0..29b71bae3 100755 --- a/rtos/code/application/source/cardv/rtos-main-hunting_lvgl.lds +++ b/rtos/code/application/source/cardv/rtos-main-hunting_lvgl.lds @@ -164,6 +164,7 @@ SECTIONS libdrv_storage.a (.text* .data* .data1* .rodata* .rodata1* .reginfo* .init* .exit*) libsifar.a (.text* .data* .data1* .rodata* .rodata1* .reginfo* .init* .exit*) /* kdrv */ + libker_pkg.a (.text* .data* .data1* .rodata* .rodata1* .reginfo* .init* .exit*) libkdrv_comm.a (.text* .data* .data1* .rodata* .rodata1* .reginfo* .init* .exit*) libarb_protected.a (.text* .data* .data1* .rodata* .rodata1* .reginfo* .init* .exit*) libkdrv_cpu.a (.text* .data* .data1* .rodata* .rodata1* .reginfo* .init* .exit*) @@ -175,7 +176,7 @@ SECTIONS libkdrv_interrupt.a (.text* .data* .data1* .rodata* .rodata1* .reginfo* .init* .exit*) /* os */ ./SrcCode/Startup/bin_info.o(.got*) - libker_pkg.a (.text* .data* .data1* .rodata* .rodata1* .reginfo* .init* .exit*) + /*libker_pkg.a (.text* .data* .data1* .rodata* .rodata1* .reginfo* .init* .exit*)*/ libkwrap.a (.text* .data* .data1* .rodata* .rodata1* .reginfo* .init* .exit*) libvos.a (.text* .data* .data1* .rodata* .rodata1* .reginfo* .init* .exit*) /* freertos.a must be located after kwrap.a for linking text.xEventGroup* */ @@ -295,17 +296,6 @@ SECTIONS libexif.a (.text* .data* .data1* .rodata* .rodata1* .reginfo* .init* .exit*) libgximagefile.a (.text* .data* .data1* .rodata* .rodata1* .reginfo* .init* .exit*) - /* audio */ -#if (_PACKAGE_AUDIO_) - libkflow_audiocap.a(.text* .data* .data1* .rodata* .rodata1* .reginfo* .init* .exit*) - libkflow_audioenc.a(.text* .data* .data1* .rodata* .rodata1* .reginfo* .init* .exit*) - libnvt_audio.a(.text* .data* .data1* .rodata* .rodata1* .reginfo* .init* .exit*) - libnvt_kdrv_audio.a(.text* .data* .data1* .rodata* .rodata1* .reginfo* .init* .exit*) - libaud_aec.a(.text* .data* .data1* .rodata* .rodata1* .reginfo* .init* .exit*) - libaud_aace.a(.text* .data* .data1* .rodata* .rodata1* .reginfo* .init* .exit*) - libaudlib_IIR.a(.text* .data* .data1* .rodata* .rodata1* .reginfo* .init* .exit*) -#endif - liblvgl.a (.text* .data* .data1* .rodata* .rodata1* .reginfo* .init* .exit*) ./SrcCode/FastFlow/flow_lvgl.o (.text* .data* .data1* .rodata* .rodata1* .reginfo* .init* .exit*) ./SrcCode/UIApp/lv_user_font_conv/lv_user_font_conv.o (.text* .data* .data1* .rodata* .rodata1* .reginfo* .init* .exit*) @@ -324,6 +314,35 @@ SECTIONS { _section_05_size = ABSOLUTE(.) - _section_05_addr; _section_06_addr = ABSOLUTE(.); + + /* app */ + ./SrcCode/UIApp/MovieFast/MovieFast.o (.text* .data* .data1* .rodata* .rodata1* .reginfo* .init* .exit*) + ./SrcCode/UIApp/Movie/UIAppMovie_Exe.o (.text* .data* .data1* .rodata* .rodata1* .reginfo* .init* .exit*) + ./SrcCode/UIApp/Movie/UIAppMovie_CommPoolInit.o (.text* .data* .data1* .rodata* .rodata1* .reginfo* .init* .exit*) + ./SrcCode/UIApp/Movie/UIAppMovie_RecSetting.o (.text* .data* .data1* .rodata* .rodata1* .reginfo* .init* .exit*) + ./SrcCode/UIApp/MovieStamp/MovieStamp.o (.text* .data* .data1* .rodata* .rodata1* .reginfo* .init* .exit*) + ./SrcCode/UIApp/MovieStamp/MovieStampID.o (.text* .data* .data1* .rodata* .rodata1* .reginfo* .init* .exit*) + ./SrcCode/UIApp/MovieStamp/MovieStampTsk.o (.text* .data* .data1* .rodata* .rodata1* .reginfo* .init* .exit*) + ./SrcCode/UIApp/MovieStamp/BG_Watermark_640x480.o (.text* .data* .data1* .rodata* .rodata1* .reginfo* .init* .exit*) + ./SrcCode/UIWnd/LVGL_SPORTCAM/UIInfo/UIMovieMapping.o (.text* .data* .data1* .rodata* .rodata1* .reginfo* .init* .exit*) + + /* lib */ + libimageapp_moviemulti.a (.text* .data* .data1* .rodata* .rodata1* .reginfo* .init* .exit*) + libimageapp_common.a (.text* .data* .data1* .rodata* .rodata1* .reginfo* .init* .exit*) + libfileout.a (.text* .data* .data1* .rodata* .rodata1* .reginfo* .init* .exit*) + libbsmux.a (.text* .data* .data1* .rodata* .rodata1* .reginfo* .init* .exit*) + libavfile.a (.text* .data* .data1* .rodata* .rodata1* .reginfo* .init* .exit*) + + /* audio */ +#if (_PACKAGE_AUDIO_) + libkflow_audiocap.a(.text* .data* .data1* .rodata* .rodata1* .reginfo* .init* .exit*) + libkflow_audioenc.a(.text* .data* .data1* .rodata* .rodata1* .reginfo* .init* .exit*) + libnvt_audio.a(.text* .data* .data1* .rodata* .rodata1* .reginfo* .init* .exit*) + libnvt_kdrv_audio.a(.text* .data* .data1* .rodata* .rodata1* .reginfo* .init* .exit*) + libaud_aec.a(.text* .data* .data1* .rodata* .rodata1* .reginfo* .init* .exit*) + libaud_aace.a(.text* .data* .data1* .rodata* .rodata1* .reginfo* .init* .exit*) + libaudlib_IIR.a(.text* .data* .data1* .rodata* .rodata1* .reginfo* .init* .exit*) +#endif } . = ALIGN(4); @@ -484,3 +503,13 @@ GROUP(libgcc.a libc.a libdrv_portable.a libfreertos.a libkwrap.a libkdrv_comm.a EXTERN("_init") EXTERN("SwTimer_Open") +EXTERN("vendor_videoenc_set") +EXTERN("vendor_audiocap_set") +EXTERN("vendor_audioenc_set") +EXTERN("vendor_videoproc_set") +EXTERN("vendor_videodec_set") +EXTERN("eac_init") +EXTERN("dai_disableclk") +EXTERN("aud_open") +EXTERN("h264Enc_queryMemSize") +EXTERN("aud_set_default_setting") diff --git a/rtos/code/lib/include/ImageApp/ImageApp_MovieMulti.h b/rtos/code/lib/include/ImageApp/ImageApp_MovieMulti.h index 5bdeb1f9a..5242d6e07 100755 --- a/rtos/code/lib/include/ImageApp/ImageApp_MovieMulti.h +++ b/rtos/code/lib/include/ImageApp/ImageApp_MovieMulti.h @@ -101,6 +101,7 @@ typedef enum { IAMOVIE_VPRC_EX_ALG, IAMOVIE_VPRC_EX_DISP2, IAMOVIE_VPRC_EX_ALG2, + IAMOVIE_VPRC_EX_MAX, ENUM_DUMMY4WORD(IAMOVIE_VPRC_EX_PATH) } IAMOVIE_VPRC_EX_PATH; @@ -884,6 +885,7 @@ extern HD_PATH_ID ImageApp_MovieMulti_GetVprcInPort(MOVIE_CFG_REC_ID id); extern HD_PATH_ID ImageApp_MovieMulti_GetVprc3DNRPort(MOVIE_CFG_REC_ID id); extern HD_PATH_ID ImageApp_MovieMulti_GetVdoEncPort(MOVIE_CFG_REC_ID id); extern HD_PATH_ID ImageApp_MovieMulti_GetRawEncPort(MOVIE_CFG_REC_ID id); +extern HD_PATH_ID ImageApp_MovieMulti_GetVprcPort(MOVIE_CFG_REC_ID id, IAMOVIE_VPRC_EX_PATH path); extern HD_PATH_ID ImageApp_MovieMulti_GetAlgDataPort(MOVIE_CFG_REC_ID id, MOVIE_CFG_ALG_PATH path); extern HD_PATH_ID ImageApp_MovieMulti_GetAudEncPort(MOVIE_CFG_REC_ID id); extern void ImageApp_MovieMulti_Root_Path(CHAR *prootpath, UINT32 rec_id); diff --git a/rtos/code/lib/output/libimageapp_moviemulti.a b/rtos/code/lib/output/libimageapp_moviemulti.a index e98f1a4afdbc9718515101379bf078345b77cfca..02b0aa1a431c28931184a69c6fdc0fa915634303 100644 GIT binary patch delta 17281 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