1868 lines
54 KiB
C
1868 lines
54 KiB
C
////////////////////////////////////////////////////////////////////////////////
|
|
#include "SysCommon.h"
|
|
//#include "AppCommon.h"
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
#include "vendor_isp.h"
|
|
#include "PhotoFast.h"
|
|
#include "MovieFast.h"
|
|
#include "SysSensor.h"
|
|
#include <kwrap/type.h>
|
|
|
|
#include "ImageApp/ImageApp_Photo.h"
|
|
#include "GxSound.h"
|
|
#include "sys_mempool.h"
|
|
#include "comm/hwclock.h"
|
|
#include "NamingRule/NameRule_Custom.h"
|
|
#include "FileDB.h"
|
|
#include "SizeConvert.h"
|
|
#include "UIApp/ExifVendor.h"
|
|
#include "sys_fastboot.h"
|
|
#include "flow_preview.h"
|
|
#include <FreeRTOS_POSIX.h>
|
|
#include <FreeRTOS_POSIX/pthread.h>
|
|
#include <comm/hwclock.h>
|
|
#include <comm/hwpower.h>
|
|
#include <plat/clock.h>
|
|
#include "GxTime.h"
|
|
#include "DxHunting.h"
|
|
#include "PrjInc.h"
|
|
#include "sys_fwload.h"
|
|
#include "plat/gpio.h"
|
|
#include "SizeConvert.h"
|
|
#include "exif/Exif.h"
|
|
#include "SizeConvert.h"
|
|
#include "vendor_videoenc.h"
|
|
#include "vendor_isp.h"
|
|
#include "GxImageFile.h"
|
|
#include "PhotoFastCapDateImprint.h"
|
|
#include "DCF.h"
|
|
#include "flow_boot_linux.h"
|
|
#if HUNTING_CAMERA_MCU == ENABLE
|
|
#include <sf_mcu.h>
|
|
#include "sf_led.h"
|
|
#endif
|
|
|
|
#if POWERON_FAST_SLICE_ENC == ENABLE
|
|
#include "PhotoFastSliceEncode.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
|
|
#define __MODULE__ PhotoFast
|
|
#define __DBGLVL__ 2 // 0=FATAL, 1=ERR, 2=WRN, 3=UNIT, 4=FUNC, 5=IND, 6=MSG, 7=VALUE, 8=USER
|
|
#define __DBGFLT__ "*" //*=All, [mark]=CustomClass
|
|
#include <kwrap/debug.h>
|
|
#include "kwrap/cmdsys.h"
|
|
#endif
|
|
|
|
#define VDO_YUV_BUFSIZE(w, h, pxlfmt) ALIGN_CEIL_4(((w) * (h) * HD_VIDEO_PXLFMT_BPP(pxlfmt)) / 8)
|
|
#define FILE_SN_MAX 99999
|
|
#define FILEDB_MAX_NUM 5000
|
|
#define _PHOTO_FDB_ROOT_MAX NMC_ROOT_MAX_LEN
|
|
#define PHY2VIRT_MAIN(pa_pos, pa_start, va) (va + (pa_pos - pa_start))
|
|
#define PRI_PHOTOFAST_CMDTSK 11
|
|
#define STKSIZE_PHOTOFAST_CMDTSK 4096
|
|
|
|
#define FASTCAPTURE_AE_DEBUG 1
|
|
#define VD_TICK_BUF_SIZE (PHOTOFAST_CAP_FRAME_CNT * 3)
|
|
//global variable
|
|
static _FDB_SN_FASTBOOT g_fdb_sn_fastboot={
|
|
FALSE,
|
|
"_",
|
|
1,
|
|
6
|
|
};
|
|
|
|
|
|
//local variable
|
|
static ID PHOTOFAST_FLG_ID = 0;
|
|
static THREAD_HANDLE g_photofast_tsk_id = 0;
|
|
static UINT32 g_photofast_tsk_run = 1;
|
|
static CHAR g_photo_fast_fdb_root_folder[_PHOTO_FDB_ROOT_MAX] = {0};
|
|
static BOOL g_photo_fast_is_fdb_root_folder = FALSE;
|
|
static MEM_RANGE g_photo_fast_fdb_pool = {0};
|
|
static CHAR g_photo_fast_write_file_Path[NMC_TOTALFILEPATH_MAX_LEN] = {0};
|
|
static INT32 g_photo_fast_id_mapping[PHOTO_CAP_ID_MAX] = {-1,-1};
|
|
static PHOTO_FILENAME_CB *g_fpPhotoFastFileNameCB = NULL;
|
|
static DCF_HANDLE g_dcf_hdl = 0;
|
|
static HD_PATH_ID g_video_enc_path[PHOTO_ENC_JPG_TYPE_MAX_ID] = {0};
|
|
static UINT32 g_bVideoEncPathStart[PHOTO_ENC_JPG_TYPE_MAX_ID] = {0};
|
|
static HD_VIDEOENC_BUFINFO g_enc_buf_info[PHOTO_ENC_JPG_TYPE_MAX_ID] = {0};
|
|
static PHOTOFAST_HD_COM_BUF g_exif_data_buf = {0};
|
|
static PHOTOFAST_HD_COM_BUF g_enc_yuv_buf[PHOTO_ENC_JPG_TYPE_MAX_ID] = {0};
|
|
HD_VIDEOENC_BS g_bs_data_pull[PHOTO_ENC_JPG_TYPE_MAX_ID] = {0};
|
|
static UINT32 g_enc_jpg_va[PHOTO_ENC_JPG_TYPE_MAX_ID] = {0}, g_enc_jpg_size[PHOTO_ENC_JPG_TYPE_MAX_ID] = {0};
|
|
static UINT32 g_enc_vir_addr[PHOTO_ENC_JPG_TYPE_MAX_ID] = {0};
|
|
static BOOL g_bPreViewPullFlag = TRUE;
|
|
static UINT32 g_bFrmCnt = 0;
|
|
static UINT32 g_exif_buf_pa = 0, g_exif_buf_va = 0;
|
|
static UINT32 g_u32PrvCapCnt = 0;
|
|
static VOS_TICK g_tickBuf[VD_TICK_BUF_SIZE] = {0};
|
|
static UINT32 g_vcap_trigger_frm_count = 0XFFFFFFFF; /* start from 0 */
|
|
|
|
//extern
|
|
extern const unsigned char gDemoKit_Font[];
|
|
extern const unsigned char gDemoKit_Image[];
|
|
|
|
//function
|
|
INT32 PhotoFast_FileNaming_MakePath(UINT32 filetype, CHAR *pPath, UINT32 uiPathId);
|
|
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);
|
|
static void PhotoFast_ShutDown(void);
|
|
void Set_NIGHTMODE(UINT32 id, UINT8 isSnapVideo);
|
|
void Set_AEMODE(UINT32 id);
|
|
void PhotoFast_TriggerFrm_Dump(void);
|
|
|
|
static HD_RESULT init_enc_module(void)
|
|
{
|
|
HD_RESULT hd_ret;
|
|
HD_PATH_ID video_enc_path = 0;
|
|
|
|
//init videoenc module
|
|
if ((hd_ret = hd_videoenc_init()) != HD_OK){
|
|
DBG_ERR("hd_videoenc_init failed (%d)\r\n", hd_ret);
|
|
return hd_ret;
|
|
}
|
|
|
|
if ((hd_ret = hd_videoenc_open(HD_VIDEOENC_0_IN_0, HD_VIDEOENC_0_OUT_0, &video_enc_path)) != HD_OK){
|
|
DBG_ERR("hd_videoenc_open HD_VIDEOENC_0_IN_0 failed (%d)\r\n", hd_ret);
|
|
return hd_ret;
|
|
}
|
|
g_video_enc_path[PHOTO_ENC_JPG_PRIMARY] = video_enc_path;
|
|
|
|
if ((hd_ret = hd_videoenc_open(HD_VIDEOENC_0_IN_1, HD_VIDEOENC_0_OUT_1, &video_enc_path)) != HD_OK){
|
|
DBG_ERR("hd_videoenc_open HD_VIDEOENC_0_IN_1 failed (%d)\r\n", hd_ret);
|
|
return hd_ret;
|
|
}
|
|
g_video_enc_path[PHOTO_ENC_JPG_SCREENNAIL] = video_enc_path;
|
|
|
|
if ((hd_ret = hd_videoenc_open(HD_VIDEOENC_0_IN_2, HD_VIDEOENC_0_OUT_2, &video_enc_path)) != HD_OK){
|
|
DBG_ERR("hd_videoenc_open HD_VIDEOENC_0_IN_2 failed (%d)\r\n", hd_ret);
|
|
return hd_ret;
|
|
}
|
|
g_video_enc_path[PHOTO_ENC_JPG_THUMBNAIL] = video_enc_path;
|
|
|
|
|
|
return HD_OK;
|
|
}
|
|
|
|
static HD_RESULT uninit_enc_module(void)
|
|
{
|
|
HD_RESULT hd_ret;
|
|
UINT32 i;
|
|
|
|
for (i=0; i < PHOTO_ENC_JPG_TYPE_MAX_ID; i++) {
|
|
if (g_bVideoEncPathStart[i]) {
|
|
hd_ret = hd_videoenc_stop(g_video_enc_path[i]);
|
|
if (hd_ret != HD_OK) {
|
|
DBG_ERR("vdoenc stop failed, hd_ret = %d\r\n", hd_ret);
|
|
return hd_ret;
|
|
}
|
|
}
|
|
|
|
hd_ret = hd_videoenc_close(g_video_enc_path[i]);
|
|
if (hd_ret != HD_OK) {
|
|
DBG_ERR("vdoencp close failed, hd_ret = %d\r\n", hd_ret);
|
|
return hd_ret;
|
|
}
|
|
|
|
if (g_enc_vir_addr[i]) {
|
|
hd_common_mem_munmap((void *)g_enc_vir_addr[i], g_enc_buf_info[i].buf_info.buf_size);
|
|
g_enc_vir_addr[i] = 0;
|
|
}
|
|
}
|
|
|
|
hd_ret = hd_videoenc_uninit();
|
|
if (hd_ret != HD_OK) {
|
|
DBG_ERR("vdoencp close failed, hd_ret = %d\r\n", hd_ret);
|
|
return hd_ret;
|
|
}
|
|
|
|
return HD_OK;
|
|
}
|
|
|
|
static HD_RESULT set_enc_cfg(void)
|
|
{
|
|
HD_VIDEOENC_PATH_CONFIG video_enc_path_config = {0};
|
|
HD_RESULT hd_ret;
|
|
UINT32 u32W, u32H;
|
|
UINT32 ThumbTargetBytes = THUMBNAIL_TARGETBYTERATE;
|
|
UINT32 ScrTargetBytes = SCREENNAIL_TARGETBYTERATE;
|
|
UINT32 PriTargetBytes = PhotoFast_GetExpectSize_RhoBRCrtl(UI_GetData(FL_PHOTO_SIZE), TRUE);
|
|
UINT32 PriTargetUBoundBytes = PRIMARY_TARGETBYTERATE_UBOUND(PriTargetBytes);
|
|
|
|
//primary image
|
|
u32W = GetPhotoSizeWidth(SysGetFlag(FL_PHOTO_SIZE));
|
|
u32H = GetPhotoSizeHeight(SysGetFlag(FL_PHOTO_SIZE));
|
|
video_enc_path_config.max_mem.codec_type = HD_CODEC_TYPE_JPEG;
|
|
video_enc_path_config.max_mem.max_dim.w = u32W;
|
|
video_enc_path_config.max_mem.max_dim.h = u32H;
|
|
video_enc_path_config.max_mem.bitrate = JPG_FILE_BUFFER_SIZE(PriTargetUBoundBytes, ScrTargetBytes, ThumbTargetBytes, CFG_JPG_HEADER_SIZE)*8;
|
|
video_enc_path_config.max_mem.enc_buf_ms = 1500;
|
|
video_enc_path_config.max_mem.svc_layer = HD_SVC_DISABLE;
|
|
video_enc_path_config.max_mem.ltr = FALSE;
|
|
video_enc_path_config.max_mem.rotate = FALSE;
|
|
video_enc_path_config.max_mem.source_output = FALSE;
|
|
video_enc_path_config.isp_id = 0;
|
|
hd_ret = hd_videoenc_set(g_video_enc_path[PHOTO_ENC_JPG_PRIMARY], HD_VIDEOENC_PARAM_PATH_CONFIG, &video_enc_path_config);
|
|
if (hd_ret != HD_OK) {
|
|
DBG_ERR("set the primary enc_path_config = %d\r\n", hd_ret);
|
|
}
|
|
|
|
//screennail image
|
|
u32W = CFG_SCREENNAIL_W;
|
|
u32H = CFG_SCREENNAIL_H;
|
|
video_enc_path_config.max_mem.codec_type = HD_CODEC_TYPE_JPEG;
|
|
video_enc_path_config.max_mem.max_dim.w = u32W;
|
|
video_enc_path_config.max_mem.max_dim.h = u32H;
|
|
video_enc_path_config.max_mem.bitrate = SCREENNAIL_TARGETBYTERATE*8;
|
|
video_enc_path_config.max_mem.enc_buf_ms = 1500;
|
|
video_enc_path_config.max_mem.svc_layer = HD_SVC_DISABLE;
|
|
video_enc_path_config.max_mem.ltr = FALSE;
|
|
video_enc_path_config.max_mem.rotate = FALSE;
|
|
video_enc_path_config.max_mem.source_output = FALSE;
|
|
video_enc_path_config.isp_id = 0;
|
|
hd_ret = hd_videoenc_set(g_video_enc_path[PHOTO_ENC_JPG_SCREENNAIL], HD_VIDEOENC_PARAM_PATH_CONFIG, &video_enc_path_config);
|
|
if (hd_ret != HD_OK) {
|
|
DBG_ERR("set the primary enc_path_config = %d\r\n", hd_ret);
|
|
}
|
|
|
|
//thumbnail image
|
|
u32W = CFG_THUMBNAIL_W;
|
|
u32H = CFG_THUMBNAIL_H;
|
|
video_enc_path_config.max_mem.codec_type = HD_CODEC_TYPE_JPEG;
|
|
video_enc_path_config.max_mem.max_dim.w = u32W;
|
|
video_enc_path_config.max_mem.max_dim.h = u32H;
|
|
video_enc_path_config.max_mem.bitrate = THUMBNAIL_TARGETBYTERATE*8;
|
|
video_enc_path_config.max_mem.enc_buf_ms = 1500;
|
|
video_enc_path_config.max_mem.svc_layer = HD_SVC_DISABLE;
|
|
video_enc_path_config.max_mem.ltr = FALSE;
|
|
video_enc_path_config.max_mem.rotate = FALSE;
|
|
video_enc_path_config.max_mem.source_output = FALSE;
|
|
video_enc_path_config.isp_id = 0;
|
|
hd_ret = hd_videoenc_set(g_video_enc_path[PHOTO_ENC_JPG_THUMBNAIL], HD_VIDEOENC_PARAM_PATH_CONFIG, &video_enc_path_config);
|
|
if (hd_ret != HD_OK) {
|
|
DBG_ERR("set the primary enc_path_config = %d\r\n", hd_ret);
|
|
}
|
|
|
|
return hd_ret;
|
|
}
|
|
|
|
static HD_RESULT set_enc_param(void *pParam, UINT32 ParamType, PHOTOFAST_ENC_INFO *pEncInfo)
|
|
{
|
|
HD_RESULT hd_ret = HD_OK;
|
|
HD_VIDEOENC_IN video_enc_in_param = {0};
|
|
HD_VIDEO_FRAME *p_video_frame = NULL;
|
|
|
|
if ((!pParam) || (!pEncInfo)) {
|
|
DBG_ERR("pParam or pEncInfo is NULL");
|
|
return HD_ERR_SYS;
|
|
}
|
|
|
|
switch (ParamType) {
|
|
case HD_VIDEOENC_PARAM_IN:
|
|
p_video_frame = (HD_VIDEO_FRAME *)pParam;;
|
|
video_enc_in_param.dir = HD_VIDEO_DIR_NONE;
|
|
video_enc_in_param.pxl_fmt = HD_VIDEO_PXLFMT_YUV420;
|
|
video_enc_in_param.dim.w = p_video_frame->dim.w;
|
|
video_enc_in_param.dim.h = p_video_frame->dim.h;
|
|
video_enc_in_param.frc = HD_VIDEO_FRC_RATIO(1,1);
|
|
hd_ret = hd_videoenc_set(g_video_enc_path[pEncInfo->EncJpgType], HD_VIDEOENC_PARAM_IN, &video_enc_in_param);
|
|
break;
|
|
|
|
case HD_VIDEOENC_PARAM_OUT_ENC_PARAM:
|
|
hd_ret = hd_videoenc_set(g_video_enc_path[pEncInfo->EncJpgType], HD_VIDEOENC_PARAM_OUT_ENC_PARAM, pParam);
|
|
break;
|
|
|
|
default:
|
|
DBG_ERR("No paramter type\r\n");
|
|
hd_ret = HD_ERR_SYS;
|
|
break;
|
|
}
|
|
|
|
return hd_ret;
|
|
}
|
|
|
|
static HD_RESULT set_enc_vendor(void *pParam, UINT32 ParamType, PHOTOFAST_ENC_INFO *pEncInfo)
|
|
{
|
|
HD_RESULT hd_ret = HD_OK;
|
|
|
|
if ((!pParam) || (!pEncInfo)) {
|
|
DBG_ERR("pParam or pEncInfo is NULL");
|
|
return HD_ERR_SYS;
|
|
}
|
|
|
|
switch (ParamType) {
|
|
case VENDOR_VIDEOENC_PARAM_OUT_BS_RESERVED_SIZE:
|
|
hd_ret = vendor_videoenc_set(g_video_enc_path[pEncInfo->EncJpgType], VENDOR_VIDEOENC_PARAM_OUT_BS_RESERVED_SIZE, pParam);
|
|
break;
|
|
|
|
case VENDOR_VIDEOENC_PARAM_OUT_JPG_BRC:
|
|
hd_ret = vendor_videoenc_set(g_video_enc_path[pEncInfo->EncJpgType], VENDOR_VIDEOENC_PARAM_OUT_JPG_BRC, pParam);
|
|
break;
|
|
|
|
default:
|
|
DBG_ERR("No paramter type\r\n");
|
|
hd_ret = HD_ERR_SYS;
|
|
break;
|
|
}
|
|
|
|
return hd_ret;
|
|
}
|
|
|
|
void PhotoFast_Cal_Jpg_Size(USIZE *psrc, USIZE *pdest , URECT *pdestwin)
|
|
{
|
|
SIZECONVERT_INFO scale_info = {0};
|
|
|
|
scale_info.uiSrcWidth = psrc->w;
|
|
scale_info.uiSrcHeight = psrc->h;
|
|
scale_info.uiDstWidth = pdest->w;
|
|
scale_info.uiDstHeight = pdest->h;
|
|
scale_info.uiDstWRatio = pdest->w;
|
|
scale_info.uiDstHRatio = pdest->h;
|
|
scale_info.alignType = SIZECONVERT_ALIGN_FLOOR_32;
|
|
DisplaySizeConvert(&scale_info);
|
|
pdestwin->x = scale_info.uiOutX;
|
|
pdestwin->y = scale_info.uiOutY;
|
|
pdestwin->w = scale_info.uiOutWidth;
|
|
pdestwin->h = scale_info.uiOutHeight;
|
|
//DBG_DUMP("Dst: x %d, y %d, w %d, h %d\r\n", pdestwin->x, pdestwin->y, pdestwin->w, pdestwin->h);
|
|
}
|
|
|
|
ER PhotoFast_Scale_YUV(VF_GFX_SCALE *pscale, HD_VIDEO_FRAME *psrc, PHOTOFAST_HD_COM_BUF *pComBufInfo, USIZE *pdest_sz, URECT *pdestwin, HD_VIDEO_PXLFMT pxl_fmt)
|
|
{
|
|
UINT32 blk_size;
|
|
UINT32 addr[HD_VIDEO_MAX_PLANE] = {0};
|
|
UINT32 loff[HD_VIDEO_MAX_PLANE] = {0};
|
|
VF_GFX_DRAW_RECT fill_rect = {0};
|
|
HD_RESULT hd_ret;
|
|
|
|
if (!pComBufInfo) {
|
|
DBG_ERR("pComBufInfo is NULL\r\n");
|
|
return E_SYS;
|
|
}
|
|
|
|
blk_size = VDO_YUV_BUFSIZE(pdest_sz->w, pdest_sz->h, pxl_fmt);
|
|
|
|
if (blk_size > pComBufInfo->blk_size) {
|
|
DBG_ERR("Request blk_size(%d) > pComBufInfo->blk_size(%d)\r\n", blk_size, pComBufInfo->blk_size);
|
|
return E_SYS;
|
|
}
|
|
|
|
// set src
|
|
#if 0
|
|
addr[0] = psrc->phy_addr[HD_VIDEO_PINDEX_Y];
|
|
loff[0] = psrc->loff[HD_VIDEO_PINDEX_Y];
|
|
if(pxl_fmt == HD_VIDEO_PXLFMT_YUV420 ){
|
|
addr[1] = psrc->phy_addr[HD_VIDEO_PINDEX_UV];
|
|
loff[1] = psrc->loff[HD_VIDEO_PINDEX_UV];
|
|
}else{
|
|
addr[1] = psrc->phy_addr[HD_VIDEO_PINDEX_U];
|
|
loff[1] = psrc->loff[HD_VIDEO_PINDEX_U];
|
|
addr[2] = psrc->phy_addr[HD_VIDEO_PINDEX_V];
|
|
loff[2] = psrc->loff[HD_VIDEO_PINDEX_V];
|
|
}
|
|
if ((hd_ret = vf_init_ex(&(pscale->src_img), psrc->dim.w, psrc->dim.h, psrc->pxlfmt, loff, addr)) != HD_OK) {
|
|
DBG_ERR("vf_init_ex src failed(%d)\r\n", hd_ret);
|
|
}
|
|
#else
|
|
memcpy(&pscale->src_img, psrc, sizeof(HD_VIDEO_FRAME));
|
|
#endif
|
|
|
|
|
|
// set dest
|
|
addr[0] = pComBufInfo->pa;
|
|
loff[0] = ALIGN_CEIL_4(pdest_sz->w);
|
|
if(pxl_fmt == HD_VIDEO_PXLFMT_YUV420 ){
|
|
addr[1] = addr[0] + loff[0] * pdest_sz->h;
|
|
loff[1] = ALIGN_CEIL_4(pdest_sz->w);
|
|
}else{
|
|
addr[1] = addr[0] + loff[0] * pdest_sz->h;
|
|
loff[1] = ALIGN_CEIL_4(pdest_sz->w);
|
|
addr[2] = addr[0] + loff[0] * pdest_sz->h + (loff[1] * pdest_sz->h)/2;
|
|
loff[2] = ALIGN_CEIL_4(pdest_sz->w);
|
|
}
|
|
if ((hd_ret = vf_init_ex(&(pscale->dst_img), pdest_sz->w, pdest_sz->h, pxl_fmt, loff, addr)) != HD_OK) {
|
|
DBG_ERR("vf_init_ex dst failed(%d)\r\n", hd_ret);
|
|
}
|
|
|
|
if ((pdest_sz->w != pdestwin->w ) || (pdest_sz->h != pdestwin->h)) {
|
|
// clear buffer by black
|
|
//gximg_fill_data((VDO_FRAME *)&(pscale->dst_img), GXIMG_REGION_MATCH_IMG, COLOR_YUV_BLACK);
|
|
memcpy((void *)&(fill_rect.dst_img), (void *)&(pscale->dst_img), sizeof(HD_VIDEO_FRAME));
|
|
fill_rect.color = COLOR_RGB_BLACK;
|
|
fill_rect.rect.x = 0;
|
|
fill_rect.rect.y = 0;
|
|
fill_rect.rect.w = pdest_sz->w;
|
|
fill_rect.rect.h = pdest_sz->h;
|
|
fill_rect.type = HD_GFX_RECT_SOLID;
|
|
fill_rect.thickness = 0;
|
|
fill_rect.engine = 0;
|
|
if ((hd_ret = vf_gfx_draw_rect(&fill_rect)) != HD_OK) {
|
|
DBG_ERR("vf_gfx_draw_rect failed(%d)\r\n", hd_ret);
|
|
}
|
|
}
|
|
|
|
// set config
|
|
pscale->engine = 0;
|
|
pscale->src_region.x = 0;
|
|
pscale->src_region.y = 0;
|
|
pscale->src_region.w = psrc->dim.w;
|
|
pscale->src_region.h = psrc->dim.h;
|
|
pscale->dst_region.x = pdestwin->x;
|
|
pscale->dst_region.y = pdestwin->y;
|
|
pscale->dst_region.w = pdestwin->w;
|
|
pscale->dst_region.h = pdestwin->h;
|
|
pscale->dst_img.blk = pComBufInfo->blk;
|
|
pscale->quality = HD_GFX_SCALE_QUALITY_BILINEAR;
|
|
vf_gfx_scale(pscale, 1);
|
|
|
|
pscale->dst_img.count = 0;
|
|
pscale->dst_img.timestamp = hd_gettime_us();
|
|
|
|
return E_OK;
|
|
|
|
}
|
|
|
|
static ER PhotoFast_InitExif(void)
|
|
{
|
|
ER ret = E_SYS;
|
|
HD_RESULT hd_ret;
|
|
UINT32 pa, blk_size;
|
|
void *va;
|
|
HD_COMMON_MEM_DDR_ID ddr_id = DDR_ID0;
|
|
MEM_RANGE buf;
|
|
|
|
EXIF_InstallID();
|
|
|
|
blk_size = 64 * 1024;
|
|
|
|
if(g_exif_buf_va == 0) {
|
|
if ((hd_ret = hd_common_mem_alloc("exifbuf", &pa, (void **)&va, blk_size, ddr_id)) != HD_OK) {
|
|
DBG_ERR("hd_common_mem_alloc failed(%d)\r\n", hd_ret);
|
|
return E_NOMEM;
|
|
}
|
|
g_exif_buf_va = (UINT32)va;
|
|
g_exif_buf_pa = (UINT32)pa;
|
|
|
|
buf.addr = g_exif_buf_va;
|
|
buf.size = 0x10000;
|
|
EXIF_Init(EXIF_HDL_ID_1, &buf, ExifCB);
|
|
|
|
ret = E_OK;
|
|
}
|
|
return ret;
|
|
}
|
|
|
|
static ER PhotoFast_UninitExif(void)
|
|
{
|
|
ER ret = E_OK;
|
|
HD_RESULT hd_ret;
|
|
|
|
if ((hd_ret = hd_common_mem_free(g_exif_buf_pa, (void *)g_exif_buf_va)) != HD_OK) {
|
|
DBG_ERR("hd_common_mem_free failed(%d)\r\n", hd_ret);
|
|
ret = E_SYS;
|
|
}
|
|
g_exif_buf_pa = 0;
|
|
g_exif_buf_va = 0;
|
|
|
|
if (g_exif_data_buf.blk != HD_COMMON_MEM_VB_INVALID_BLK && g_exif_data_buf.blk != 0) {
|
|
if (g_exif_data_buf.va) {
|
|
hd_common_mem_munmap((void *)g_exif_data_buf.va, g_exif_data_buf.blk_size);
|
|
g_exif_data_buf.va = 0;
|
|
}
|
|
hd_common_mem_release_block(g_exif_data_buf.blk);
|
|
g_exif_data_buf.blk = HD_COMMON_MEM_VB_INVALID_BLK;
|
|
}
|
|
|
|
EXIF_UninstallID();
|
|
|
|
return ret;
|
|
}
|
|
|
|
#if defined(_UI_STYLE_LVGL_)
|
|
#include "lvgl/lvgl.h"
|
|
#include "UIApp/lv_user_font_conv/lv_user_font_conv.h"
|
|
#include "flow_lvgl.h"
|
|
#else
|
|
static void PhotoFast_InitGxGfx(void)
|
|
{
|
|
UINT32 uiPoolAddr =0;
|
|
|
|
//Initial all states, all buffers
|
|
DBG_FUNC_BEGIN("\r\n");
|
|
|
|
uiPoolAddr = mempool_gxgfx_temp;
|
|
|
|
////////////////////////////////////////////////////////////////
|
|
|
|
GxGfx_Config(CFG_STRING_BUF_SIZE, 256);
|
|
//Init Gfx
|
|
GxGfx_Init((UINT32 *)uiPoolAddr, POOL_SIZE_GFX_TEMP); //initial Graphics
|
|
|
|
//set default shape, text, image state for GxGfx
|
|
GxGfx_SetAllDefault();
|
|
//set custom image state for GxGfx
|
|
GxGfx_SetImageStroke(ROP_KEY, IMAGEPARAM_DEFAULT);
|
|
GxGfx_SetImageColor(IMAGEPALETTE_DEFAULT, IMAGEPARAM_DEFAULT);
|
|
#if (DRAM_SIZE_64MB_DISP_OFF==ENABLE)
|
|
GxGfx_SetImageTable((const IMAGE_TABLE *)NULL);
|
|
GxGfx_SetTextStroke((const FONT *)NULL, FONTSTYLE_NORMAL, SCALE_1X);
|
|
#else
|
|
GxGfx_SetImageTable((const IMAGE_TABLE *)gDemoKit_Image);
|
|
GxGfx_SetTextStroke((const FONT *)gDemoKit_Font, FONTSTYLE_NORMAL, SCALE_1X);
|
|
#endif
|
|
//set custom text state for GxGfx
|
|
GxGfx_SetTextColor(TEXTFORECOLOR1_DEFAULT, TEXTFORECOLOR2_DEFAULT, TEXTFORECOLOR3_DEFAULT);
|
|
}
|
|
#endif
|
|
|
|
static UINT32 PhotoFast_GetScreenNailSize(void)
|
|
{
|
|
UINT32 uiImageSize, ScreenNailSize;
|
|
UINT32 BitStreamSize;
|
|
|
|
|
|
ScreenNailSize = CFG_SCREENNAIL_SIZE;
|
|
uiImageSize = UI_GetData(FL_PHOTO_SIZE);
|
|
if (uiImageSize < ScreenNailSize) {
|
|
BitStreamSize = CFG_SCREENNAIL_W * CFG_SCREENNAIL_H / 2;
|
|
} else {
|
|
BitStreamSize = 0;
|
|
}
|
|
|
|
DBG_IND("[cap]ScreenNail BitStreamSize =%d K\r\n", BitStreamSize / 1024);
|
|
return BitStreamSize;
|
|
}
|
|
|
|
UINT32 PhotoFast_GetExpectSize_RhoBRCrtl(UINT32 ImgIdx, BOOL bPrimaryOnly)
|
|
{
|
|
UINT32 BitstreamSize;
|
|
|
|
BitstreamSize = GetPhotoSizeWidth(ImgIdx)*GetPhotoSizeHeight(ImgIdx)*3/2;
|
|
|
|
switch (UI_GetData(FL_QUALITY)) {
|
|
case QUALITY_FINE:
|
|
BitstreamSize = (UINT32)(BitstreamSize / JPG_COMERESSED_RATIO_11);
|
|
break;
|
|
|
|
case QUALITY_NORMAL:
|
|
BitstreamSize = (UINT32)(BitstreamSize / JPG_COMERESSED_RATIO_14);
|
|
break;
|
|
|
|
case QUALITY_ECONOMY:
|
|
default:
|
|
BitstreamSize = (UINT32)(BitstreamSize / JPG_COMERESSED_RATIO_18);
|
|
break;
|
|
}
|
|
|
|
|
|
if (!bPrimaryOnly) {
|
|
BitstreamSize += CFG_JPG_HEADER_SIZE + PhotoFast_GetScreenNailSize();
|
|
}
|
|
|
|
return BitstreamSize;
|
|
|
|
|
|
}
|
|
|
|
static ER PhotoFast_InstallID(void)
|
|
{
|
|
ER ret = E_OK;
|
|
T_CFLG cflg;
|
|
|
|
memset(&cflg, 0, sizeof(T_CFLG));
|
|
if ((ret |= vos_flag_create(&PHOTOFAST_FLG_ID, &cflg, "PHOTOFAST_FLG")) != E_OK) {
|
|
DBG_ERR("PHOTOFAST_FLG_ID fail\r\n");
|
|
}
|
|
|
|
return ret;
|
|
}
|
|
|
|
static THREAD_RETTYPE PhotoFast_CmdTsk(void* arg)
|
|
{
|
|
FLGPTN uiFlag = 0, wait_flag = 0;
|
|
VK_TASK_HANDLE handle_movie_filenaming = 0;
|
|
VK_TASK_HANDLE handle_movie_moviemode = 0;
|
|
|
|
THREAD_ENTRY();
|
|
|
|
wait_flag = FLGPHOTOFAST_CHGMODE |
|
|
FLGPHOTOFAST_SHUTDOWN;
|
|
|
|
g_photofast_tsk_run = TRUE;
|
|
|
|
while (g_photofast_tsk_run) {
|
|
vos_flag_wait(&uiFlag, PHOTOFAST_FLG_ID, wait_flag, TWF_ORW | TWF_CLR);
|
|
|
|
if (uiFlag & FLGPHOTOFAST_SHUTDOWN) {
|
|
g_photofast_tsk_run = 0;
|
|
PhotoFast_ShutDown();
|
|
} else if (uiFlag & FLGPHOTOFAST_CHGMODE) {
|
|
g_photofast_tsk_run = 0;
|
|
switch (DrvGPIO_GetPhotoMovieModeFromMonitor()) {
|
|
case DX_HUNTING_MODE_PHOTO_MOVIE:
|
|
case DX_HUNTING_MODE_CAMERA_PHOTO_MOVIE:
|
|
|
|
fwload_wait_done(CODE_SECTION_10);
|
|
|
|
System_OnPowerPreInit();
|
|
System_OnVideoFastbootInit();
|
|
handle_movie_filenaming = vos_task_create(MovieFast_InitFileNamingThread, "init_fn", NULL, 10, 4096);
|
|
if(!handle_movie_filenaming){
|
|
DBG_ERR("create MovieFast_InitFileNamingThread failed\n");
|
|
}
|
|
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, 4096);
|
|
if(!handle_movie_moviemode){
|
|
DBG_ERR("create MovieFast_InitMovieModeThread failed\n");
|
|
}
|
|
else
|
|
vos_task_resume(handle_movie_moviemode);
|
|
break;
|
|
}
|
|
} else {
|
|
DBG_WRN("No flag for PhotoFast_CmdTsk\r\n");
|
|
}
|
|
|
|
}
|
|
|
|
THREAD_RETURN(0);
|
|
|
|
}
|
|
|
|
HD_RESULT PhotoFast_get_hd_common_buf(PPHOTOFAST_HD_COM_BUF p_hd_comm_buf)
|
|
{
|
|
// get memory
|
|
p_hd_comm_buf->blk = hd_common_mem_get_block(HD_COMMON_MEM_COMMON_POOL, p_hd_comm_buf->blk_size, DDR_ID0); // Get block from mem pool
|
|
if (p_hd_comm_buf->blk == HD_COMMON_MEM_VB_INVALID_BLK) {
|
|
DBG_ERR("config_vdo_frm: get blk fail, blk(0x%x)\n", p_hd_comm_buf->blk );
|
|
return HD_ERR_SYS;
|
|
}
|
|
|
|
p_hd_comm_buf->pa = hd_common_mem_blk2pa(p_hd_comm_buf->blk); // get physical addr
|
|
if (p_hd_comm_buf->pa == 0) {
|
|
DBG_ERR("config_vdo_frm: blk2pa fail, blk(0x%x)\n", p_hd_comm_buf->blk);
|
|
return HD_ERR_SYS;
|
|
}
|
|
|
|
p_hd_comm_buf->va = (UINT32)hd_common_mem_mmap(HD_COMMON_MEM_MEM_TYPE_CACHE, p_hd_comm_buf->pa, p_hd_comm_buf->blk_size);
|
|
if (p_hd_comm_buf->va == 0) {
|
|
DBG_ERR("Convert to VA failed for file buffer for decoded buffer!\r\n");
|
|
return HD_ERR_SYS;
|
|
}
|
|
|
|
return HD_OK;
|
|
}
|
|
|
|
INT32 PhotoFast_FileNaming_Open(void)
|
|
{
|
|
DCF_InstallID();
|
|
|
|
DCF_OPEN_PARM dcfParm = {
|
|
.Drive = 'A',
|
|
.WorkbuffAddr = mempool_dcf,
|
|
.WorkbuffSize = POOL_SIZE_DCF_BUFFER,
|
|
};
|
|
g_dcf_hdl = DCF_Open(&dcfParm);
|
|
|
|
DCF_SetParm(DCF_PRMID_REMOVE_DUPLICATE_FOLDER, TRUE);
|
|
DCF_SetParm(DCF_PRMID_REMOVE_DUPLICATE_FILE, TRUE);
|
|
DCF_SetParm(DCF_PRMID_SET_VALID_FILE_FMT, DCF_FILE_TYPE_JPG|DCF_FILE_TYPE_MP4|DCF_FILE_TYPE_MOV);
|
|
DCF_SetParm(DCF_PRMID_SET_DEP_FILE_FMT, DCF_FILE_TYPE_JPG|DCF_FILE_TYPE_WAV|DCF_FILE_TYPE_MPO);
|
|
DCF_SetDirFreeChars(DCF_DIR_NAME);
|
|
DCF_SetFileFreeChars(DCF_FILE_TYPE_ANYFORMAT, DCF_FILE_NAME);
|
|
DCF_ScanObj();
|
|
|
|
return 0;
|
|
}
|
|
|
|
INT32 PhotoFast_FileNaming_Close(void)
|
|
{
|
|
DCF_Close(g_dcf_hdl);
|
|
DCF_UnInstallID();
|
|
return 0;
|
|
}
|
|
|
|
INT32 PhotoFast_FileNaming_MakePath(UINT32 filetype, CHAR *pPath, UINT32 uiPathId)
|
|
{
|
|
//if (filetype == IMGCAP_FSYS_RAW)
|
|
if (filetype == HD_CODEC_TYPE_RAW)
|
|
NH_CustomUti_MakePhotoPath(uiPathId, NAMERULECUS_FILETYPE_RAW, pPath);
|
|
else
|
|
NH_CustomUti_MakePhotoPath(uiPathId, NAMERULECUS_FILETYPE_JPG, pPath);
|
|
return 0;
|
|
}
|
|
|
|
/*
|
|
Set the record root name
|
|
|
|
Set the folder name.
|
|
|
|
@param[in] config_id.
|
|
@param[in] value .
|
|
|
|
@return INT32
|
|
*/
|
|
INT32 PhotoFast_FileNaming_SetRootPath(CHAR *prootpath)
|
|
{
|
|
if (!prootpath) {
|
|
return -1;
|
|
}
|
|
memset(g_photo_fast_fdb_root_folder, 0, _PHOTO_FDB_ROOT_MAX);
|
|
memcpy(g_photo_fast_fdb_root_folder, prootpath, _PHOTO_FDB_ROOT_MAX);
|
|
g_photo_fast_is_fdb_root_folder = TRUE;
|
|
|
|
//NH_Custom_SetRootPathByPath(0, g_isf_photo_fdb_root_folder);
|
|
return 0;
|
|
}
|
|
|
|
/**
|
|
Set buffer for FileDB
|
|
|
|
Set buffer for FileDB
|
|
|
|
@param[in] PHOTO_CFG_MEM_RANGE
|
|
|
|
@return void
|
|
*/
|
|
INT32 PhotoFast_FileNaming_SetFileDBPool(MEM_RANGE *pPool)
|
|
{
|
|
if (!pPool) {
|
|
return -1;
|
|
}
|
|
memcpy(&g_photo_fast_fdb_pool, pPool, sizeof(MEM_RANGE));
|
|
return 0;
|
|
}
|
|
|
|
INT32 PhotoFast_FileNaming_SetFolder(PHOTO_CAP_FOLDER_NAMING *pfolder_naming)
|
|
{
|
|
NMC_FOLDER_INFO nmc_folder_info = {0};
|
|
|
|
if (!g_photo_fast_is_fdb_root_folder) {
|
|
DBG_ERR("PhotoFast_Root_Path is not set!!!!\r\n");
|
|
return -1;
|
|
}
|
|
if (pfolder_naming->cap_id >= PHOTO_CAP_ID_MAX) {
|
|
DBG_ERR("cap_id %d >= max %d\r\n",pfolder_naming->cap_id,PHOTO_CAP_ID_MAX);
|
|
return -1;
|
|
}
|
|
NH_Custom_SetRootPathByPath(pfolder_naming->cap_id, g_photo_fast_fdb_root_folder);
|
|
g_photo_fast_id_mapping[pfolder_naming->cap_id] = pfolder_naming->ipl_id;
|
|
nmc_folder_info.pathid = pfolder_naming->cap_id;
|
|
nmc_folder_info.pMovie = NULL;
|
|
nmc_folder_info.pEMR = NULL;
|
|
nmc_folder_info.pRO = NULL;
|
|
nmc_folder_info.pPhoto = pfolder_naming->folder_path;
|
|
nmc_folder_info.pEvent1 = NULL;
|
|
nmc_folder_info.pEvent2 = NULL;
|
|
nmc_folder_info.pEvent3 = NULL;
|
|
NH_Custom_SetFolderPath(&nmc_folder_info);
|
|
return 0;
|
|
}
|
|
|
|
void PhotoFast_FileNaming_SetFileNameCB(PHOTO_FILENAME_CB *pfFileNameCb)
|
|
{
|
|
|
|
if (pfFileNameCb) {
|
|
g_fpPhotoFastFileNameCB = (PHOTO_FILENAME_CB *) pfFileNameCb;
|
|
}
|
|
|
|
}
|
|
|
|
INT32 PhotoFast_Phy2LogID(UINT32 id)
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
CHAR* PhotoFast_GetLastWriteFilePath(void)
|
|
{
|
|
return g_photo_fast_write_file_Path;
|
|
}
|
|
|
|
void PhotoFast_FileNaming_SetSortBySN(CHAR *pDelimStr, UINT32 nDelimCount, UINT32 nNumOfSn)
|
|
{
|
|
if (pDelimStr)
|
|
{
|
|
g_fdb_sn_fastboot.SortSN_Delim = pDelimStr;
|
|
g_fdb_sn_fastboot.SortSN_DelimCount = nDelimCount;
|
|
g_fdb_sn_fastboot.SortSN_CharNumOfSN = nNumOfSn;
|
|
|
|
g_fdb_sn_fastboot.bIsSortBySn= TRUE;
|
|
}
|
|
else
|
|
DBG_ERR("No set Delim String!!\r\n");
|
|
}
|
|
|
|
INT32 PhotoFast_WriteFile(UINT32 Addr, UINT32 Size, UINT32 Fmt, UINT32 uiPathId)
|
|
{
|
|
FST_FILE fp;
|
|
INT32 rt;
|
|
UINT32 Length;
|
|
CHAR FilePath[NMC_TOTALFILEPATH_MAX_LEN];
|
|
UINT32 fileType;
|
|
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);
|
|
}
|
|
|
|
|
|
strncpy(g_photo_fast_write_file_Path, FilePath, sizeof(g_photo_fast_write_file_Path) - 1);
|
|
DBG_IND("Photo_WriteCB logical_id=%d, File=%s, Addr=0x%x, Size=0x%x, Fmt=%d\r\n",logical_id,FilePath, Addr, Size, Fmt);
|
|
|
|
open_flag = FST_CREATE_ALWAYS | FST_OPEN_WRITE;
|
|
|
|
if ((fp = FileSys_OpenFile(FilePath, open_flag)) != NULL) {
|
|
Length = Size;
|
|
|
|
rt = FileSys_WriteFile(fp, (UINT8 *)Addr, &Length, 0, NULL);
|
|
FileSys_CloseFile(fp);
|
|
if (rt == FST_STA_OK) {
|
|
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);
|
|
}
|
|
}else{
|
|
DBG_ERR("FileSys_OpenFile fail\r\n");
|
|
rt =FST_STA_ERROR;
|
|
}
|
|
|
|
return rt;
|
|
}
|
|
|
|
static ER PhotoFast_Encode(HD_VIDEO_FRAME *p_video_frame, PHOTOFAST_ENC_INFO *pEncInfo)
|
|
{
|
|
//HD_VIDEOENC_OUT2 video_enc_out_param = {0};
|
|
HD_VIDEOENC_OUT video_enc_out_param = {0};
|
|
//VENDOR_VIDEOENC_JPG_BRC_CFG jpg_brc_cfg = {0};
|
|
HD_RESULT hd_ret;
|
|
|
|
if ((!p_video_frame) || (!pEncInfo)) {
|
|
DBG_ERR("p_video_frame or pEncParam is NULL\r\n");
|
|
return E_SYS;
|
|
}
|
|
|
|
#if 0
|
|
//VENDOR_VIDEOENC_JPG_BRC_CFG
|
|
if (pEncInfo->EncJpgType == PHOTO_ENC_JPG_PRIMARY) {
|
|
jpg_brc_cfg.upper_bound = pEncInfo->rho_hboundsize;
|
|
jpg_brc_cfg.lower_bound = pEncInfo->rho_lboundsize;
|
|
jpg_brc_cfg.brc_retry_cnt = pEncInfo->rho_retrycnt;
|
|
jpg_brc_cfg.quality_step = pEncInfo->rho_retrycnt;
|
|
jpg_brc_cfg.init_quality = pEncInfo->rho_initqf;
|
|
hd_ret = set_enc_vendor((void *)&jpg_brc_cfg, VENDOR_VIDEOENC_PARAM_OUT_JPG_BRC, pEncInfo);
|
|
if (hd_ret != HD_OK) {
|
|
DBG_ERR("vendor_videoenc_set(VENDOR_VIDEOENC_PARAM_OUT_JPG_BRC) failed(%d)\r\n", hd_ret);
|
|
return E_SYS;
|
|
}
|
|
}
|
|
#endif
|
|
|
|
//HD_VIDEOENC_PARAM_IN
|
|
hd_ret = set_enc_param((void *)p_video_frame, HD_VIDEOENC_PARAM_IN, pEncInfo);
|
|
if (hd_ret != HD_OK) {
|
|
DBG_ERR("set_enc_param_in = %d\r\n", hd_ret);
|
|
return E_SYS;
|
|
}
|
|
|
|
//HD_VIDEOENC_PARAM_OUT_ENC_PARAM
|
|
#if 0
|
|
video_enc_out_param.codec_type = HD_CODEC_TYPE_JPEG;
|
|
video_enc_out_param.jpeg.image_quality = 0;
|
|
video_enc_out_param.jpeg.bitrate = pEncInfo->rho_targetbitrate;
|
|
video_enc_out_param.jpeg.frame_rate_base = 0;
|
|
video_enc_out_param.jpeg.frame_rate_incr = 1;
|
|
hd_ret = set_enc_param((void *)&video_enc_out_param, HD_VIDEOENC_PARAM_OUT_ENC_PARAM, pEncInfo);
|
|
if (hd_ret != HD_OK) {
|
|
DBG_ERR("set_enc_param_out = %d\r\n", hd_ret);
|
|
return E_SYS;
|
|
}
|
|
#else
|
|
video_enc_out_param.codec_type = HD_CODEC_TYPE_JPEG;
|
|
video_enc_out_param.jpeg.retstart_interval = 0;
|
|
video_enc_out_param.jpeg.image_quality = 60;
|
|
hd_ret = set_enc_param((void *)&video_enc_out_param, HD_VIDEOENC_PARAM_OUT_ENC_PARAM, pEncInfo);
|
|
if (hd_ret != HD_OK) {
|
|
DBG_ERR("set_enc_param_out = %d\r\n", hd_ret);
|
|
return E_SYS;
|
|
}
|
|
#endif
|
|
|
|
//Only take virtual address
|
|
if ((hd_ret = hd_videoenc_start(g_video_enc_path[pEncInfo->EncJpgType])) != HD_OK) {
|
|
DBG_ERR("hd_videoenc_start fail(%d)\n", hd_ret);
|
|
return E_SYS;
|
|
}
|
|
|
|
g_bVideoEncPathStart[pEncInfo->EncJpgType] = TRUE;
|
|
|
|
if ((hd_ret = hd_videoenc_get(g_video_enc_path[pEncInfo->EncJpgType], HD_VIDEOENC_PARAM_BUFINFO, &g_enc_buf_info[pEncInfo->EncJpgType])) != HD_OK) {
|
|
DBG_ERR("hd_videoenc_get fail(%d)\n", hd_ret);
|
|
return E_SYS;
|
|
}
|
|
|
|
// mmap for bs buffer (just mmap one time only, calculate offset to virtual address later)
|
|
g_enc_vir_addr[pEncInfo->EncJpgType] = (UINT32)hd_common_mem_mmap(HD_COMMON_MEM_MEM_TYPE_CACHE, g_enc_buf_info[pEncInfo->EncJpgType].buf_info.phy_addr, g_enc_buf_info[pEncInfo->EncJpgType].buf_info.buf_size);
|
|
if (g_enc_vir_addr[pEncInfo->EncJpgType] == 0) {
|
|
DBG_ERR("mmap error, EncJpgType = %d!!\r\n\r\n", pEncInfo->EncJpgType);
|
|
return E_SYS;
|
|
}
|
|
|
|
hd_ret = hd_videoenc_push_in_buf(g_video_enc_path[pEncInfo->EncJpgType], p_video_frame, NULL, -1); // -1 = blocking mode
|
|
if (hd_ret != HD_OK) {
|
|
DBG_ERR("enc_push error=%d, EncJpgType = %d !!\r\n\r\n", hd_ret, pEncInfo->EncJpgType);
|
|
return E_SYS;
|
|
}
|
|
|
|
hd_ret = hd_videoenc_pull_out_buf(g_video_enc_path[pEncInfo->EncJpgType], &g_bs_data_pull[pEncInfo->EncJpgType], -1); // -1 = blocking mode
|
|
if (hd_ret != HD_OK) {
|
|
DBG_ERR("enc_pull error=%d, EncJpgType = %d !!\r\n\r\n", hd_ret, pEncInfo->EncJpgType);
|
|
return E_SYS;
|
|
}
|
|
|
|
if ((hd_ret = hd_videoenc_stop(g_video_enc_path[pEncInfo->EncJpgType])) != HD_OK) {
|
|
DBG_ERR("hd_videoenc_stop fail(%d)\n", hd_ret);
|
|
return E_SYS;
|
|
}
|
|
|
|
g_bVideoEncPathStart[pEncInfo->EncJpgType] = FALSE;
|
|
|
|
return E_OK;
|
|
|
|
}
|
|
|
|
#if POWERON_FAST_SLICE_ENC == ENABLE
|
|
|
|
/* avoid compile warning */
|
|
static void _PhotoFast_Unused(void)
|
|
{
|
|
(void) PhotoFast_Encode;
|
|
(void) set_enc_vendor;
|
|
(void) set_enc_cfg;
|
|
(void) uninit_enc_module;
|
|
(void) init_enc_module;
|
|
(void) g_enc_jpg_va;
|
|
(void) g_enc_yuv_buf;
|
|
(void) g_enc_jpg_size;
|
|
}
|
|
|
|
static ER PhotoFast_CaptureInit(void)
|
|
{
|
|
|
|
PhotoFast_InstallID();
|
|
if ((g_photofast_tsk_id = vos_task_create(PhotoFast_CmdTsk, 0, "PhotoFastTsk", PRI_PHOTOFAST_CMDTSK, STKSIZE_PHOTOFAST_CMDTSK)) == 0) {
|
|
DBG_ERR("PhotoFastTsk create failed.\r\n");
|
|
} else {
|
|
vos_task_resume(g_photofast_tsk_id);
|
|
}
|
|
|
|
#if HUNTING_CAMERA_MCU != ENABLE// The time is controlled by the MCU. sf_get_mcu_rtc_set_sys
|
|
printf("[%s:%d] s \n",__FUNCTION__,__LINE__);
|
|
|
|
struct tm Curr_DateTime = {0};
|
|
//temp test
|
|
Curr_DateTime.tm_year = 2021;
|
|
Curr_DateTime.tm_mon = 12;
|
|
Curr_DateTime.tm_mday = 25;
|
|
Curr_DateTime.tm_hour = 12;
|
|
Curr_DateTime.tm_min = 12;
|
|
Curr_DateTime.tm_sec = 12;
|
|
|
|
hwclock_set_time(TIME_ID_CURRENT, *(struct tm*)&Curr_DateTime, 0);
|
|
#endif
|
|
_PhotoFast_Unused();
|
|
|
|
return E_OK;
|
|
}
|
|
#else
|
|
static ER PhotoFast_CaptureInit(void)
|
|
{
|
|
UINT32 u32W, u32H;
|
|
HD_RESULT hd_ret;
|
|
PHOTOFAST_ENC_INFO EncInfo = {0};
|
|
VENDOR_VIDEOENC_BS_RESERVED_SIZE_CFG bs_reserved_size = {0};
|
|
|
|
//init videoenc module
|
|
hd_ret = init_enc_module();
|
|
if (hd_ret != HD_OK){
|
|
DBG_ERR("init_enc_module failed (%d)\r\n", hd_ret);
|
|
return E_SYS;
|
|
}
|
|
|
|
//init enc cfg
|
|
hd_ret = set_enc_cfg();
|
|
if (hd_ret != HD_OK){
|
|
DBG_ERR("set_enc_cfg failed (%d)\r\n", hd_ret);
|
|
return E_SYS;
|
|
}
|
|
|
|
//init enc vendor
|
|
EncInfo.EncJpgType = PHOTO_ENC_JPG_PRIMARY;
|
|
bs_reserved_size.reserved_size = CFG_JPG_HEADER_SIZE*2; //EXIF size
|
|
hd_ret = set_enc_vendor((void *)&bs_reserved_size, VENDOR_VIDEOENC_PARAM_OUT_BS_RESERVED_SIZE, &EncInfo);
|
|
if (hd_ret != HD_OK){
|
|
DBG_ERR("set_enc_vendor failed (%d)\r\n", hd_ret);
|
|
return E_SYS;
|
|
}
|
|
|
|
PhotoFast_InstallID();
|
|
if ((g_photofast_tsk_id = vos_task_create(PhotoFast_CmdTsk, 0, "PhotoFastTsk", PRI_PHOTOFAST_CMDTSK, STKSIZE_PHOTOFAST_CMDTSK)) == 0) {
|
|
DBG_ERR("PhotoFastTsk create failed.\r\n");
|
|
} else {
|
|
vos_task_resume(g_photofast_tsk_id);
|
|
}
|
|
#if HUNTING_CAMERA_MCU != ENABLE// The time is controlled by the MCU. sf_get_mcu_rtc_set_sys
|
|
struct tm Curr_DateTime = {0};
|
|
printf("[%s:%d] s \n",__FUNCTION__,__LINE__);
|
|
|
|
//temp test
|
|
Curr_DateTime.tm_year = 2021;
|
|
Curr_DateTime.tm_mon = 12;
|
|
Curr_DateTime.tm_mday = 25;
|
|
Curr_DateTime.tm_hour = 12;
|
|
Curr_DateTime.tm_min = 12;
|
|
Curr_DateTime.tm_sec = 12;
|
|
|
|
hwclock_set_time(TIME_ID_CURRENT, *(struct tm*)&Curr_DateTime, 0);
|
|
#endif
|
|
// allocate primary captured resolution
|
|
u32W = GetPhotoSizeWidth(SysGetFlag(FL_PHOTO_SIZE));
|
|
u32H = GetPhotoSizeHeight(SysGetFlag(FL_PHOTO_SIZE));
|
|
g_enc_yuv_buf[PHOTO_ENC_JPG_PRIMARY].blk_size = u32W*u32H*3/2;
|
|
PhotoFast_get_hd_common_buf(&g_enc_yuv_buf[PHOTO_ENC_JPG_PRIMARY]);
|
|
|
|
// allocate screennail captured resolution
|
|
g_enc_yuv_buf[PHOTO_ENC_JPG_SCREENNAIL].blk_size = CFG_SCREENNAIL_W*CFG_SCREENNAIL_H*3/2;
|
|
PhotoFast_get_hd_common_buf(&g_enc_yuv_buf[PHOTO_ENC_JPG_SCREENNAIL]);
|
|
|
|
// allocate thumbnail captured resolution
|
|
g_enc_yuv_buf[PHOTO_ENC_JPG_THUMBNAIL].blk_size = CFG_THUMBNAIL_W*CFG_THUMBNAIL_H*3/2;
|
|
PhotoFast_get_hd_common_buf(&g_enc_yuv_buf[PHOTO_ENC_JPG_THUMBNAIL]);
|
|
|
|
// allocate exif data buffer
|
|
g_exif_data_buf.blk_size = CFG_JPG_HEADER_SIZE;
|
|
PhotoFast_get_hd_common_buf(&g_exif_data_buf);
|
|
|
|
|
|
return E_OK;
|
|
}
|
|
#endif
|
|
|
|
static BOOL bCaptureStartFirstEntry = TRUE;
|
|
|
|
#if POWERON_FAST_SLICE_ENC == ENABLE
|
|
|
|
static void PhotoFast_CaptureStart(HD_VIDEO_FRAME *p_video_frame)
|
|
{
|
|
HD_PATH_ID vprc_path;
|
|
|
|
flow_preview_get_path(&vprc_path, FLOW_PREIVEW_VPRC_PATH, 0);
|
|
|
|
if (bCaptureStartFirstEntry) {
|
|
bCaptureStartFirstEntry = FALSE;
|
|
fwload_wait_done(CODE_SECTION_05);
|
|
PhotoFast_CaptureInit();
|
|
PhotoFast_InitExif();
|
|
|
|
#if defined(_UI_STYLE_LVGL_)
|
|
flow_lv_init();
|
|
#endif
|
|
|
|
PhotoFastCapDateImprint_InitBuff();
|
|
|
|
#if !defined(_UI_STYLE_LVGL_)
|
|
PhotoFast_InitGxGfx();
|
|
#endif
|
|
|
|
hd_gfx_init();
|
|
|
|
PhotoFast_SliceEncode_Open(vprc_path);
|
|
}
|
|
|
|
#if POWERON_FAST_SLICE_ENC_VER2 == ENABLE
|
|
PhotoFast_Sliceencode2_Enq_Frame(p_video_frame);
|
|
#else
|
|
PhotoFast_SliceEncode(vprc_path, p_video_frame);
|
|
#endif
|
|
|
|
}
|
|
#else
|
|
static void PhotoFast_CaptureStart(HD_VIDEO_FRAME *p_video_frame)
|
|
{
|
|
HD_VIDEO_FRAME video_frame_screennail = {0};
|
|
VF_GFX_SCALE gfx_scale = {0};
|
|
URECT dest_win = {0};
|
|
USIZE src_size = {0}, dest_size = {0};
|
|
HD_COMMON_MEM_VB_BLK blk = 0;
|
|
UINT32 u32W = 0, u32H = 0;
|
|
PHOTOFAST_HD_COM_BUF *pComBufInfo = NULL;
|
|
ER ret = E_SYS;
|
|
HD_RESULT hd_ret;
|
|
PHOTOFAST_ENC_INFO EncInfo = {0};
|
|
UINT32 i;
|
|
MEM_RANGE exif_data={0}, thumb_jpg={0}, pri_jpg={0}, scr_jpg={0}, dst_jpg_file={0};
|
|
UINT32 TargetBytes = PhotoFast_GetExpectSize_RhoBRCrtl(SysGetFlag(FL_PHOTO_SIZE), TRUE);
|
|
UINT32 TargetUBoundBytes = PRIMARY_TARGETBYTERATE_UBOUND(TargetBytes);
|
|
UINT32 TargetLBoundBytes = PRIMARY_TARGETBYTERATE_LBOUND(TargetBytes);
|
|
|
|
if (bCaptureStartFirstEntry) {
|
|
bCaptureStartFirstEntry = FALSE;
|
|
fwload_wait_done(CODE_SECTION_05);
|
|
PhotoFast_CaptureInit();
|
|
PhotoFast_InitExif();
|
|
|
|
#if defined(_UI_STYLE_LVGL_)
|
|
flow_lv_init();
|
|
#endif
|
|
|
|
PhotoFastCapDateImprint_InitBuff();
|
|
|
|
#if !defined(_UI_STYLE_LVGL_)
|
|
PhotoFast_InitGxGfx();
|
|
#endif
|
|
|
|
hd_gfx_init();
|
|
}
|
|
|
|
/* --- The flow of encoded primary image. ---*/
|
|
//scale sensor original size to captured (primary) resolution
|
|
u32W = GetPhotoSizeWidth(SysGetFlag(FL_PHOTO_SIZE));
|
|
u32H = GetPhotoSizeHeight(SysGetFlag(FL_PHOTO_SIZE));
|
|
src_size.w = p_video_frame->dim.w;
|
|
src_size.h = p_video_frame->dim.h;
|
|
dest_size.w = u32W;
|
|
dest_size.h = u32H;
|
|
PhotoFast_Cal_Jpg_Size(&src_size, &dest_size , &dest_win);
|
|
pComBufInfo = &g_enc_yuv_buf[PHOTO_ENC_JPG_PRIMARY];
|
|
if ((blk = PhotoFast_Scale_YUV(&gfx_scale, p_video_frame, pComBufInfo, &dest_size, &dest_win, HD_VIDEO_PXLFMT_YUV420)) != E_OK) {
|
|
DBG_ERR("Scale_YUV fail\r\n");
|
|
return;
|
|
}
|
|
|
|
//custom stamp
|
|
ret = PhotoFastCapDateImprint_GenYuvData(&gfx_scale.dst_img);
|
|
|
|
//encode primary image
|
|
EncInfo.rho_targetbitrate = TargetBytes;
|
|
EncInfo.rho_hboundsize = TargetUBoundBytes;
|
|
EncInfo.rho_hboundsize = TargetLBoundBytes;
|
|
EncInfo.rho_retrycnt = JPG_BRC_RETRY_CNT;
|
|
EncInfo.rho_initqf_step = JPG_BRC_RETRY_CNT;
|
|
EncInfo.rho_initqf = JPG_BRC_INIT_Q;
|
|
EncInfo.EncJpgType = PHOTO_ENC_JPG_PRIMARY;
|
|
ret = PhotoFast_Encode(&gfx_scale.dst_img, &EncInfo);
|
|
|
|
if (ret != E_OK) {
|
|
DBG_ERR("Captured the primary image failed\r\n");
|
|
return;
|
|
}
|
|
|
|
//Take the primary bitstream
|
|
g_enc_jpg_va[PHOTO_ENC_JPG_PRIMARY] = PHY2VIRT_MAIN(g_bs_data_pull[PHOTO_ENC_JPG_PRIMARY].video_pack[0].phy_addr, g_enc_buf_info[PHOTO_ENC_JPG_PRIMARY].buf_info.phy_addr, g_enc_vir_addr[PHOTO_ENC_JPG_PRIMARY]);
|
|
g_enc_jpg_size[PHOTO_ENC_JPG_PRIMARY] = g_bs_data_pull[PHOTO_ENC_JPG_PRIMARY].video_pack[0].size;
|
|
|
|
|
|
/* --- The flow of encoded screenail image. ---*/
|
|
memset(&gfx_scale, 0, sizeof(VF_GFX_SCALE));
|
|
//scale to screennail resolution
|
|
u32W = CFG_SCREENNAIL_W;
|
|
u32H = CFG_SCREENNAIL_H;
|
|
src_size.w = p_video_frame->dim.w;
|
|
src_size.h = p_video_frame->dim.h;
|
|
dest_size.w = u32W;
|
|
dest_size.h = u32H;
|
|
PhotoFast_Cal_Jpg_Size(&src_size, &dest_size , &dest_win);
|
|
pComBufInfo = &g_enc_yuv_buf[PHOTO_ENC_JPG_SCREENNAIL];
|
|
if ((blk = PhotoFast_Scale_YUV(&gfx_scale, p_video_frame, pComBufInfo, &dest_size, &dest_win, HD_VIDEO_PXLFMT_YUV420)) != E_OK) {
|
|
DBG_ERR("Scale_YUV fail\r\n");
|
|
return;
|
|
}
|
|
|
|
//custom stamp
|
|
ret = PhotoFastCapDateImprint_GenYuvData(&gfx_scale.dst_img);
|
|
|
|
//encode screennail image
|
|
EncInfo.EncJpgType = PHOTO_ENC_JPG_SCREENNAIL;
|
|
ret = PhotoFast_Encode(&gfx_scale.dst_img, &EncInfo);
|
|
|
|
if (ret != E_OK) {
|
|
DBG_ERR("Captured the screennail image failed\r\n");
|
|
return;
|
|
}
|
|
|
|
//Take the screennail bitstream
|
|
g_enc_jpg_va[PHOTO_ENC_JPG_SCREENNAIL] = PHY2VIRT_MAIN(g_bs_data_pull[PHOTO_ENC_JPG_SCREENNAIL].video_pack[0].phy_addr, g_enc_buf_info[PHOTO_ENC_JPG_SCREENNAIL].buf_info.phy_addr, g_enc_vir_addr[PHOTO_ENC_JPG_SCREENNAIL]);
|
|
g_enc_jpg_size[PHOTO_ENC_JPG_SCREENNAIL] = g_bs_data_pull[PHOTO_ENC_JPG_SCREENNAIL].video_pack[0].size;
|
|
|
|
|
|
/* --- The flow of encoded thumbnail image. ---*/
|
|
//copy screenail info
|
|
memcpy(&video_frame_screennail, &gfx_scale.dst_img, sizeof(HD_VIDEO_FRAME));
|
|
memset(&gfx_scale, 0, sizeof(VF_GFX_SCALE));
|
|
//scale screennai to thumbnaill resolution
|
|
u32W = CFG_THUMBNAIL_W;
|
|
u32H = CFG_THUMBNAIL_H;
|
|
src_size.w = video_frame_screennail.dim.w;
|
|
src_size.h = video_frame_screennail.dim.h;
|
|
dest_size.w = u32W;
|
|
dest_size.h = u32H;
|
|
PhotoFast_Cal_Jpg_Size(&src_size, &dest_size , &dest_win);
|
|
pComBufInfo = &g_enc_yuv_buf[PHOTO_ENC_JPG_THUMBNAIL];
|
|
if ((blk = PhotoFast_Scale_YUV(&gfx_scale, &video_frame_screennail, pComBufInfo, &dest_size, &dest_win, HD_VIDEO_PXLFMT_YUV420)) != E_OK) {
|
|
DBG_ERR("Scale_YUV fail\r\n");
|
|
return;
|
|
}
|
|
|
|
//encode thumbnail image
|
|
EncInfo.EncJpgType = PHOTO_ENC_JPG_THUMBNAIL;
|
|
ret = PhotoFast_Encode(&gfx_scale.dst_img, &EncInfo);
|
|
|
|
if (ret != E_OK) {
|
|
DBG_ERR("Captured the screennail image failed\r\n");
|
|
return;
|
|
}
|
|
|
|
//Take the thumbnail bitstream
|
|
g_enc_jpg_va[PHOTO_ENC_JPG_THUMBNAIL] = PHY2VIRT_MAIN(g_bs_data_pull[PHOTO_ENC_JPG_THUMBNAIL].video_pack[0].phy_addr, g_enc_buf_info[PHOTO_ENC_JPG_THUMBNAIL].buf_info.phy_addr, g_enc_vir_addr[PHOTO_ENC_JPG_THUMBNAIL]);
|
|
g_enc_jpg_size[PHOTO_ENC_JPG_THUMBNAIL] = g_bs_data_pull[PHOTO_ENC_JPG_THUMBNAIL].video_pack[0].size;
|
|
|
|
|
|
//EXIF data.
|
|
ExifVendor_Write0thIFD(EXIF_HDL_ID_1);
|
|
ExifVendor_WriteExifIFD(EXIF_HDL_ID_1);
|
|
ExifVendor_Write0thIntIFD(EXIF_HDL_ID_1);
|
|
exif_data.addr = g_exif_data_buf.va;
|
|
exif_data.size = g_exif_data_buf.blk_size;
|
|
thumb_jpg.addr = g_enc_jpg_va[PHOTO_ENC_JPG_THUMBNAIL];
|
|
thumb_jpg.size = g_enc_jpg_size[PHOTO_ENC_JPG_THUMBNAIL];
|
|
if (EXIF_CreateExif(EXIF_HDL_ID_1, &exif_data, &thumb_jpg) != EXIF_ER_OK) {
|
|
DBG_ERR("Create Exif fail\r\n");
|
|
exif_data.size = 0;
|
|
}
|
|
|
|
//Combination
|
|
pri_jpg.addr = g_enc_jpg_va[PHOTO_ENC_JPG_PRIMARY];
|
|
pri_jpg.size = g_enc_jpg_size[PHOTO_ENC_JPG_PRIMARY];
|
|
scr_jpg.addr = g_enc_jpg_va[PHOTO_ENC_JPG_SCREENNAIL];
|
|
scr_jpg.size = g_enc_jpg_size[PHOTO_ENC_JPG_SCREENNAIL];
|
|
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);
|
|
|
|
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]);
|
|
if (hd_ret != HD_OK) {
|
|
DBG_ERR("release data_pull_pri error=%d, EncJpgType=%d !!\r\n", hd_ret, i);
|
|
}
|
|
|
|
if (g_enc_vir_addr[i]) {
|
|
hd_common_mem_munmap((void *)g_enc_vir_addr[i], g_enc_buf_info[i].buf_info.buf_size);
|
|
g_enc_vir_addr[i] = 0;
|
|
}
|
|
}
|
|
}
|
|
#endif
|
|
|
|
THREAD_RETTYPE PhotoFast_InitFileNamingThread(void *arg)
|
|
{
|
|
fastboot_wait_done(BOOT_INIT_FILESYSOK);
|
|
PhotoFast_FileNaming_Open();
|
|
fastboot_set_done(BOOT_INIT_FILENAMINGOK);
|
|
|
|
THREAD_RETURN(0);
|
|
}
|
|
#include "kwrap/util.h"
|
|
//extern void DrvGPIO_IRLed_Turn_Onoff(BOOL onoff);
|
|
extern void DrvGOIO_Turn_Onoff_IRCUT(UINT8 onoff);
|
|
extern void isp_dbg_set_dbg_mode(ISP_ID id, UINT32 cmd);
|
|
extern void setet_preset_param(void);
|
|
static UINT32 capturcnt = 0;
|
|
static BOOL captureflag = FALSE;
|
|
UINT32 Cap_cnt=0;
|
|
extern INT32 PhotoFast_SliceEncode_Dump_Frame(const HD_VIDEO_FRAME video_frame, UINT8 format);
|
|
|
|
THREAD_RETTYPE PhotoFast_FlowPreviewThread(void *arg)
|
|
{
|
|
HD_RESULT hd_ret;
|
|
HD_VIDEO_FRAME video_cap_frame = {0};
|
|
HD_VIDEO_FRAME video_frame = {0};
|
|
HD_PATH_ID vprc_path = 0, vout_path = 0, vcap_path = 0;
|
|
UINT32 max_cnt = 0;
|
|
BOOL start_cap = FALSE;
|
|
// IQT_SHARPNESS_LV sharpness_lv = {0};
|
|
IQT_NR_LV nr_lv = {0};
|
|
AET_STATUS_INFO ae_status = {0};
|
|
UIMenuStoreInfo *puiPara = sf_ui_para_get();
|
|
|
|
flow_preview_get_path(&vcap_path, FLOW_PREIVEW_VCAP_PATH, 0);
|
|
flow_preview_get_path(&vprc_path, FLOW_PREIVEW_VPRC_PATH, 0);
|
|
flow_preview_get_path(&vout_path, FLOW_PREIVEW_VOUT_PATH, 0);
|
|
|
|
// init variables
|
|
g_bPreViewPullFlag = TRUE;
|
|
bCaptureStartFirstEntry = TRUE;
|
|
|
|
switch (UI_GetData(FL_CONTINUE_SHOT))
|
|
{
|
|
case CONTINUE_SHOT_BURST_5:
|
|
max_cnt = 5;
|
|
break;
|
|
|
|
case CONTINUE_SHOT_BURST_4:
|
|
max_cnt = 4;
|
|
break;
|
|
|
|
case CONTINUE_SHOT_BURST_3:
|
|
max_cnt = 3;
|
|
break;
|
|
|
|
case CONTINUE_SHOT_BURST_2:
|
|
max_cnt = 2;
|
|
break;
|
|
|
|
case CONTINUE_SHOT_OFF:
|
|
default:
|
|
max_cnt = 1;
|
|
break;
|
|
}
|
|
|
|
#if POWERON_FAST_SLICE_ENC_VER2 == ENABLE
|
|
|
|
UINT32 period = 1000 / max_cnt;
|
|
|
|
PhotoFast_SliceEncode2_Open(vprc_path, max_cnt);
|
|
|
|
#endif
|
|
#if (FASTCAPTURE_AE_DEBUG == 1)
|
|
if (g_bFrmCnt == 0){
|
|
// Set_NIGHTMODE(0);
|
|
// nvt_cmdsys_runcmd("vcap info");
|
|
// nvt_cmdsys_runcmd("vprc info");
|
|
// nvt_cmdsys_runcmd("ctl_ipp dump_hdl_all");
|
|
//ISPT_TOTAL_GAIN total;
|
|
// nvt_cmdsys_runcmd("ae dbg 0 256 1 ");
|
|
// isp_dbg_set_dbg_mode(0, 0x0202002 );
|
|
nvt_cmdsys_runcmd("ae set_speed 0 128 600 600 100 ");
|
|
//nvt_cmdsys_runcmd("iq dbg 0 0 ");
|
|
//nvt_cmdsys_runcmd("iq dbg 0 8 ");
|
|
|
|
// nr_lv.id = 0;
|
|
// nr_lv.lv = 200;
|
|
// vendor_isp_set_iq(IQT_ITEM_NR_LV, &nr_lv); //50~200
|
|
// sharpness_lv.id = 0;
|
|
//// sharpness_lv.lv = 70;
|
|
// vendor_isp_set_iq(IQT_ITEM_SHARPNESS_LV, &sharpness_lv);
|
|
// total.id = 0;
|
|
// total.gain = 1600;
|
|
// vendor_isp_set_common(ISPT_ITEM_TOTAL_GAIN, &total);
|
|
// nvt_cmdsys_runcmd("iq set_dbg 16 0x200000 ");
|
|
}
|
|
#endif
|
|
while(g_bPreViewPullFlag) {
|
|
/*if (g_bFrmCnt == 6){;
|
|
Set_AEMODE(1);
|
|
setet_preset_param();
|
|
}*/
|
|
if ((g_bFrmCnt > 2)&&(captureflag == FALSE)){
|
|
vendor_isp_get_ae(AET_ITEM_STATUS, &ae_status);
|
|
if ((ae_status.status_info.state_adj ==0)|| (++g_bFrmCnt==6)){
|
|
Cap_cnt=g_bFrmCnt;
|
|
captureflag = TRUE;
|
|
capturcnt = 0;
|
|
Set_AEMODE(1);
|
|
setet_preset_param();
|
|
}
|
|
}
|
|
else
|
|
{
|
|
++g_bFrmCnt;
|
|
}
|
|
//DBG_ERR(">>>>>>> adj %d lum %d explum %d exp %d iso %d\r\n",ae_status.status_info.state_adj,ae_status.status_info.lum,ae_status.status_info.expect_lum,ae_status.status_info.iso_gain[0],ae_status.status_info.expotime[0]);
|
|
|
|
#if POWERON_FAST_SLICE_ENC_VER2 == ENABLE
|
|
|
|
if(start_cap == TRUE){
|
|
vos_util_delay_ms((((period-200) <= 0) ? 1 : (period-200)));
|
|
#if HUNTING_CAMERA_MCU == ENABLE
|
|
if(sf_is_night_mode(0) ==TRUE){
|
|
//DrvGPIO_IRLed_Turn_Onoff(1);
|
|
sf_ir_led_set(((2 == puiPara->NightMode) ? 2 : 1),puiPara->FlashLed, puiPara->NightMode,0);
|
|
}
|
|
#endif
|
|
vos_util_delay_ms(200);
|
|
}
|
|
#endif
|
|
|
|
|
|
|
|
#if HUNTING_PHOTO_FAST_AE_60_FPS == ENABLE
|
|
|
|
if((hd_ret = hd_videocap_pull_out_buf(vcap_path, &video_cap_frame, 3000)) != HD_OK){
|
|
DBG_ERR("failed to hd_videocap_pull_out_buf, er=%d\n", (int)hd_ret);
|
|
goto exit;
|
|
}
|
|
|
|
if((hd_ret = hd_videoproc_push_in_buf(vprc_path, &video_cap_frame, NULL, 3000)) != HD_OK){
|
|
DBG_ERR("failed to hd_videoproc_push_in_buf, er=%d\n", (int)hd_ret);
|
|
goto exit;
|
|
}
|
|
|
|
if((hd_ret = hd_videocap_release_out_buf(vcap_path, &video_cap_frame)) != HD_OK){
|
|
DBG_ERR("failed to hd_videocap_release_out_buf, er=%d\n", (int)hd_ret);
|
|
goto exit;
|
|
}
|
|
|
|
#else
|
|
(void) vcap_path;
|
|
(void) video_cap_frame;
|
|
#endif
|
|
|
|
if ((hd_ret = hd_videoproc_pull_out_buf(vprc_path, &video_frame, 3000)) != HD_OK) {
|
|
DBG_ERR("failed to hd_videoproc_pull_out_buf, er=%d\n", (int)hd_ret);
|
|
goto exit;
|
|
}
|
|
|
|
//if(g_bFrmCnt < PHOTOFAST_CAP_FRAME_CNT){
|
|
// vos_perf_list_mark("yuv", __LINE__, 0);
|
|
//}
|
|
|
|
// if (capturcnt == 4) {
|
|
// nvt_cmdsys_runcmd("iq info ");
|
|
// isp_dbg_set_dbg_mode(0, 0x0202002 );
|
|
// }
|
|
if (captureflag)
|
|
capturcnt++;
|
|
if(0){//(capturcnt==1){//++g_bFrmCnt >= 5){//PHOTOFAST_CAP_FRAME_CNT){
|
|
|
|
nr_lv.id = 0;
|
|
nr_lv.lv = 100;
|
|
vendor_isp_set_iq(IQT_ITEM_NR_LV, &nr_lv); //50~200
|
|
//sharpness_lv.id = 0;
|
|
//sharpness_lv.lv = 100;
|
|
//vendor_isp_set_iq(IQT_ITEM_SHARPNESS_LV, &sharpness_lv);
|
|
// nvt_cmdsys_runcmd("iq info ");
|
|
//nvt_cmdsys_runcmd("iq get_param 0 2 ");
|
|
|
|
}
|
|
if (capturcnt>3) {
|
|
// DBG_ERR(">>>>>>>>>>>>capture adj:%d capcnt:%d frmcnt:%d\r\n",ae_status.status_info.state_adj,capturcnt,g_bFrmCnt);
|
|
//if(++g_bFrmCnt >= 10){//PHOTOFAST_CAP_FRAME_CNT){
|
|
#if HUNTING_PHOTO_FAST_AE_60_FPS == ENABLE
|
|
PhotoFast_SetTriggerFrmCnt(video_cap_frame.count - 1); /* unbind mode , use vcap frame count */
|
|
#else
|
|
PhotoFast_SetTriggerFrmCnt(video_frame.count - 1); /* bind mode , vprc frame count = vcap frame count */
|
|
#endif
|
|
start_cap = TRUE;
|
|
//Set_AEMODE(1);
|
|
}
|
|
|
|
switch (DrvGPIO_GetPhotoMovieModeFromMonitor()) {
|
|
case DX_HUNTING_MODE_PHOTO:
|
|
case DX_HUNTING_MODE_PHOTO_MOVIE:
|
|
|
|
if (start_cap == TRUE) {
|
|
g_u32PrvCapCnt++;
|
|
#if HUNTING_CAMERA_MCU == ENABLE
|
|
if(sf_is_night_mode(0) ==TRUE){
|
|
//DrvGPIO_IRLed_Turn_Onoff(0);
|
|
sf_ir_led_set(0, 0, 0, 0);
|
|
}
|
|
#endif
|
|
|
|
PhotoFast_CaptureStart(&video_frame);
|
|
if (g_u32PrvCapCnt >= max_cnt) {
|
|
g_bPreViewPullFlag = FALSE;
|
|
}
|
|
}
|
|
|
|
break;
|
|
|
|
case DX_HUNTING_MODE_CAMERA_PHOTO:
|
|
case DX_HUNTING_MODE_CAMERA_PHOTO_MOVIE:
|
|
|
|
if (start_cap == TRUE) {
|
|
#if HUNTING_CAMERA_MCU == ENABLE
|
|
if(sf_is_night_mode(0) ==TRUE){
|
|
//DrvGPIO_IRLed_Turn_Onoff(0);
|
|
sf_ir_led_set(0, 0, 0, 0);
|
|
}
|
|
#endif
|
|
|
|
PhotoFast_CaptureStart(&video_frame);
|
|
g_bPreViewPullFlag = FALSE;
|
|
}
|
|
break;
|
|
default:
|
|
//fastboot_msg_en(ENABLE);
|
|
DBG_ERR(" DrvGPIO_GetPhotoMovieModeFromMonitor default\n");
|
|
break;
|
|
}
|
|
|
|
|
|
#if (_PACKAGE_DISPLAY_)
|
|
/* display */
|
|
if ((hd_ret = hd_videoout_push_in_buf(vout_path, &video_frame, NULL, 0)) != HD_OK) {
|
|
//printf("videoout drop one frame, er=%d\n", (int)ret);
|
|
}
|
|
|
|
#endif
|
|
|
|
#if POWERON_FAST_SLICE_ENC_VER2 == ENABLE
|
|
|
|
/* release */
|
|
if (start_cap == FALSE) {
|
|
if ((hd_ret = hd_videoproc_release_out_buf(vprc_path, &video_frame))!= HD_OK) {
|
|
DBG_ERR("failed to hd_videoproc_release_out_buf, er=%d\n", (int)hd_ret);
|
|
goto exit;
|
|
}
|
|
}
|
|
|
|
#else
|
|
/* release */
|
|
if ((hd_ret = hd_videoproc_release_out_buf(vprc_path, &video_frame))!= HD_OK) {
|
|
DBG_ERR("failed to hd_videoproc_release_out_buf, er=%d\n", (int)hd_ret);
|
|
goto exit;
|
|
}
|
|
#endif
|
|
|
|
if (g_bPreViewPullFlag == FALSE) {
|
|
// DrvGPIO_IRLed_Turn_Onoff(0);
|
|
|
|
g_bFrmCnt = 0;
|
|
PhotoFast_PhotoClose();
|
|
|
|
switch (DrvGPIO_GetPhotoMovieModeFromMonitor()) {
|
|
case DX_HUNTING_MODE_PHOTO:
|
|
vos_flag_set(PHOTOFAST_FLG_ID, FLGPHOTOFAST_SHUTDOWN);
|
|
break;
|
|
|
|
case DX_HUNTING_MODE_PHOTO_MOVIE:
|
|
case DX_HUNTING_MODE_CAMERA_PHOTO_MOVIE:
|
|
|
|
vos_perf_list_mark("sie_vd", __LINE__, 3);
|
|
|
|
vos_flag_set(PHOTOFAST_FLG_ID, FLGPHOTOFAST_CHGMODE);
|
|
break;
|
|
|
|
case DX_HUNTING_MODE_CAMERA_PHOTO:
|
|
vos_flag_set(PHOTOFAST_FLG_ID, FLGPHOTOFAST_SHUTDOWN);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
exit:
|
|
// vos_flag_destroy(PHOTOFAST_FLG_ID);
|
|
THREAD_RETURN(0);
|
|
}
|
|
|
|
#if POWERON_FAST_SLICE_ENC == ENABLE
|
|
void PhotoFast_PhotoClose(void)
|
|
{
|
|
|
|
#if POWERON_FAST_SLICE_ENC_VER2 == ENABLE
|
|
PhotoFast_SliceEncode2_Close();
|
|
#endif
|
|
PhotoFast_FileNaming_Close();
|
|
|
|
PhotoFast_SliceEncode_Close();
|
|
|
|
flow_preview_close_module();
|
|
|
|
flow_preview_uninit_module();
|
|
|
|
#if defined(_UI_STYLE_LVGL_)
|
|
#else
|
|
GxGfx_Exit();
|
|
#endif
|
|
|
|
PhotoFast_UninitExif();
|
|
|
|
PhotoFastCapDateImprint_UninitBuff();
|
|
}
|
|
#else
|
|
void PhotoFast_PhotoClose(void)
|
|
{
|
|
UINT32 i;
|
|
|
|
PhotoFast_FileNaming_Close();
|
|
|
|
uninit_enc_module();
|
|
|
|
flow_preview_close_module();
|
|
flow_preview_uninit_module();
|
|
|
|
for (i=0; i < PHOTO_ENC_JPG_TYPE_MAX_ID; i++) {
|
|
if (g_enc_yuv_buf[i].blk != 0) {
|
|
hd_common_mem_release_block(g_enc_yuv_buf[i].blk);
|
|
memset(&g_enc_yuv_buf[i], 0, sizeof(PHOTOFAST_HD_COM_BUF));
|
|
}
|
|
}
|
|
|
|
#if defined(_UI_STYLE_LVGL_)
|
|
|
|
#else
|
|
GxGfx_Exit();
|
|
#endif
|
|
|
|
PhotoFast_UninitExif();
|
|
|
|
PhotoFastCapDateImprint_UninitBuff();
|
|
}
|
|
#endif
|
|
|
|
static void PhotoFast_ShutDown(void)
|
|
{
|
|
|
|
#if (POWERON_FAST_BOOT_MSG == DISABLE)
|
|
fastboot_msg_en(ENABLE);
|
|
#endif
|
|
|
|
#if HUNTING_CAMERA_BOOT_LINUX /* Boot Linux */
|
|
|
|
#if POWERON_BOOT_REPORT == ENABLE
|
|
vos_perf_list_dump();
|
|
PhotoFast_TriggerFrm_Dump();
|
|
#endif
|
|
#if HUNTING_CAMERA_MCU == ENABLE
|
|
|
|
#if HUNTING_CAMERA_4G == ENABLE
|
|
fastboot_set_done(BOOT_FLOW_BOOT);
|
|
flow_wait_linux();
|
|
#else
|
|
sf_mcu_reg_set(SF_MCU_POWEROFF,0);
|
|
#endif
|
|
|
|
#else
|
|
fastboot_set_done(BOOT_FLOW_BOOT);
|
|
flow_wait_linux();
|
|
#endif
|
|
#else /* ShutDown */
|
|
vos_perf_list_mark("pwr off", __LINE__, 0);
|
|
#if POWERON_BOOT_REPORT == ENABLE
|
|
vos_perf_list_dump();
|
|
PhotoFast_TriggerFrm_Dump();
|
|
#endif
|
|
|
|
#if HUNTING_CAMERA_MCU == ENABLE
|
|
sf_mcu_reg_set(SF_MCU_POWEROFF,0);
|
|
#endif
|
|
hwpower_set_power_key(POWER_ID_PSW1, 0xFF);
|
|
|
|
#endif
|
|
|
|
}
|
|
|
|
#if 1
|
|
void Set_NIGHTMODE(UINT32 id, UINT8 isSnapVideo)
|
|
{
|
|
#if HUNTING_CAMERA_MCU == ENABLE
|
|
UIMenuStoreInfo *puiPara = sf_ui_para_get();
|
|
|
|
IQT_NIGHT_MODE night_mode = {0};
|
|
AWBT_MANUAL awb_manual = {0};
|
|
HD_RESULT hd_ret;
|
|
|
|
//IQT_EDGE_PARAM edge = {0};
|
|
|
|
if(sf_is_night_mode(0) ==TRUE)
|
|
{
|
|
if ((hd_ret = vendor_isp_init()) != HD_OK) {
|
|
DBG_ERR("vendor_isp_init() fail(%d)\r\n", hd_ret);
|
|
}
|
|
DrvGOIO_Turn_Onoff_IRCUT(0);
|
|
//DrvGPIO_IRLed_Turn_Onoff(1);
|
|
|
|
// printf("[%s:%d]s NightMode:%d FlashLed:%d\n",__FUNCTION__,__LINE__,((2 == SysGetFlag(NightMode)) ? 2 : 1), SysGetFlag(FlashLed));
|
|
sf_ir_led_set(((2 == puiPara->NightMode) ? 2 : 1),puiPara->FlashLed, puiPara->NightMode, isSnapVideo);
|
|
awb_manual.id = 0;
|
|
awb_manual.manual.en = 1;
|
|
awb_manual.manual.r_gain= 256;
|
|
awb_manual.manual.g_gain= 256;
|
|
awb_manual.manual.b_gain= 256;
|
|
vendor_isp_set_awb(AWBT_ITEM_MANUAL, &awb_manual);
|
|
|
|
night_mode.id = 0;
|
|
night_mode.mode = 1;
|
|
vendor_isp_set_iq(IQT_ITEM_NIGHT_MODE, &night_mode);
|
|
/*
|
|
edge.id =0;
|
|
vendor_isp_get_iq(IQT_ITEM_EDGE_PARAM, &edge);
|
|
edge.edge.es_map_lut[8] = 64;
|
|
edge.edge.es_map_lut[9] = 72;
|
|
edge.edge.es_map_lut[10] = 80;
|
|
edge.edge.es_map_lut[12] = 84;
|
|
edge.edge.es_map_lut[13] = 84;
|
|
edge.edge.es_map_lut[14] = 84;
|
|
edge.edge.es_map_lut[15] = 84;
|
|
vendor_isp_set_iq(IQT_ITEM_EDGE_PARAM, &edge);
|
|
*/
|
|
if ((hd_ret = vendor_isp_uninit()) != HD_OK) {
|
|
DBG_ERR("vendor_isp_uninit() fail(%d)\r\n", hd_ret);
|
|
}
|
|
|
|
}
|
|
#endif
|
|
|
|
|
|
/*
|
|
if (SysGetFlag(FL_CONTINUE_SHOT) == CONTINUE_SHOT_BURST_5)
|
|
{
|
|
ae_manual.id = 0;
|
|
vendor_isp_get_ae(AET_ITEM_MANUAL, &ae_manual);
|
|
ae_manual.manual.mode = LOCK_MODE;
|
|
vendor_isp_set_ae(AET_ITEM_MANUAL, &ae_manual);
|
|
|
|
awb_status.id = 0;
|
|
vendor_isp_get_awb(AWBT_ITEM_STATUS, &awb_status);
|
|
awb_manual.id = 0;
|
|
awb_manual.manual.en = 1;
|
|
awb_manual.manual.r_gain= awb_status.status.cur_r_gain;
|
|
awb_manual.manual.g_gain= awb_status.status.cur_g_gain;
|
|
awb_manual.manual.b_gain= awb_status.status.cur_b_gain;
|
|
vendor_isp_set_awb(AWBT_ITEM_MANUAL, &awb_manual);
|
|
}
|
|
*/
|
|
}
|
|
|
|
void Set_AEMODE(UINT32 id)
|
|
{
|
|
AET_MANUAL ae_manual = {0};
|
|
AET_STATUS_INFO ae_status_info = {0};
|
|
AWBT_STATUS status = {0};
|
|
ISPT_C_GAIN c_gain = {0};
|
|
|
|
HD_RESULT hd_ret;
|
|
|
|
if ((hd_ret = vendor_isp_init()) != HD_OK) {
|
|
DBG_ERR("vendor_isp_init() fail(%d)\r\n", hd_ret);
|
|
}
|
|
if (1)//SysGetFlag(FL_CONTINUE_SHOT) == CONTINUE_SHOT_BURST_5)
|
|
{
|
|
ae_status_info.id = 0;
|
|
vendor_isp_get_ae(AET_ITEM_STATUS, &ae_status_info);
|
|
//DBG_ERR(">> aet status exp %d iso %d\r\n",ae_status_info.status_info.expotime[0],ae_status_info.status_info.iso_gain[0]);
|
|
ae_manual.id = 0;
|
|
vendor_isp_get_ae(AET_ITEM_MANUAL, &ae_manual);
|
|
//DBG_ERR(">> aet manual exp %d iso %d\r\n",ae_manual.manual.expotime,ae_manual.manual.iso_gain);
|
|
if (id == 1){
|
|
ae_manual.manual.mode = 1;
|
|
ae_manual.manual.expotime = ae_status_info.status_info.expotime[0];
|
|
ae_manual.manual.iso_gain = ae_status_info.status_info.iso_gain[0];
|
|
ISPT_TOTAL_GAIN total;
|
|
|
|
total.id = 0;
|
|
total.gain = 1600;
|
|
vendor_isp_set_common(ISPT_ITEM_TOTAL_GAIN, &total);
|
|
nvt_cmdsys_runcmd("ae dbg 0 0 0 ");
|
|
}
|
|
else {
|
|
ae_manual.manual.mode = 0;
|
|
}
|
|
//DBG_ERR(">> >>>>>>>>>aet manual mode %d\r\n",ae_manual.manual.mode);
|
|
|
|
vendor_isp_set_ae(AET_ITEM_MANUAL, &ae_manual);
|
|
|
|
if(sf_is_night_mode(0) ==FALSE)
|
|
{
|
|
status.id = 0;
|
|
vendor_isp_get_awb(AWBT_ITEM_STATUS, &status);
|
|
|
|
c_gain.id = 0;
|
|
|
|
c_gain.gain[0] = status.status.cur_r_gain;
|
|
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);
|
|
}
|
|
}
|
|
if ((hd_ret = vendor_isp_uninit()) != HD_OK) {
|
|
DBG_ERR("vendor_isp_uninit() fail(%d)\r\n", hd_ret);
|
|
}
|
|
}
|
|
|
|
void PhotoFast_TriggerFrm_Dump(void)
|
|
{
|
|
if(g_vcap_trigger_frm_count < VD_TICK_BUF_SIZE){
|
|
|
|
DBG_DUMP("\n\n**********************************************************\n"
|
|
" Trigger Speed(vcap frame count = %lu) : %lu us\n"
|
|
"**********************************************************\n",
|
|
g_vcap_trigger_frm_count + 1, g_tickBuf[g_vcap_trigger_frm_count]);
|
|
}
|
|
else if(g_vcap_trigger_frm_count == 0xFFFFFFFF){
|
|
DBG_DUMP("\n\n**********************************************************\n"
|
|
" Trigger Speed : Unknown\n"
|
|
"**********************************************************\n");
|
|
}
|
|
else{
|
|
DBG_DUMP("\n\n**********************************************************\n"
|
|
" Trigger Speed : Err\n"
|
|
"**********************************************************\n");
|
|
}
|
|
}
|
|
|
|
BOOL PhotoFast_SetTriggerFrmCnt(UINT32 cnt)
|
|
{
|
|
g_vcap_trigger_frm_count = cnt;
|
|
return TRUE;
|
|
}
|
|
|
|
BOOL PhotoFast_SetTick(UINT32 cnt, VOS_TICK tick)
|
|
{
|
|
if(cnt > VD_TICK_BUF_SIZE){
|
|
DBG_WRN("%lu exceed tick buffer(%lu)\n", cnt, VD_TICK_BUF_SIZE);
|
|
return FALSE;
|
|
}
|
|
|
|
g_tickBuf[cnt] = tick;
|
|
return TRUE;
|
|
}
|
|
|
|
BOOL PhotoFast_GetTick(UINT32 cnt, VOS_TICK* tick)
|
|
{
|
|
if(tick == NULL){
|
|
DBG_WRN("tick is null!\n");
|
|
return FALSE;
|
|
}
|
|
|
|
if(cnt > VD_TICK_BUF_SIZE){
|
|
DBG_WRN("%lu exceed tick buffer(%lu)!\n", cnt, VD_TICK_BUF_SIZE);
|
|
return FALSE;
|
|
}
|
|
|
|
*tick = g_tickBuf[cnt];
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
UINT32 PhotoFast_GetTickBufSize(void)
|
|
{
|
|
return VD_TICK_BUF_SIZE;
|
|
}
|
|
|
|
#endif
|
|
|