nt9856x/code/application/source/cardv/SrcCode/UIApp/Play/UIAppPlay_Exe.c
2023-03-28 15:07:53 +08:00

408 lines
12 KiB
C
Executable File

#include "PlaybackTsk.h"
#include "UIAppPlay.h"
#include "PrjInc.h"
#include "NVTUserCommand.h"
#include "FileDB.h"
#include "PrjCfg.h"
#include "PBXFileList/PBXFileList_DCF.h"
#include "PBXFileList/PBXFileList_FileDB.h"
#include "ImageApp/ImageApp_Play.h"
#include "SysMain.h"
#include "UIApp/AppDisp_PBView.h"
#include "sys_mempool.h"
#include "PlaybackTsk.h"
#include "UIApp/ExifVendor.h"
#include "UIApp/Network/UIAppWiFiCmd.h"
#include "GxStrg.h"
#include "GxVideoFile.h"
#define PB_FILE_FMT PBFMT_JPG | PBFMT_WAV | PBFMT_AVI | PBFMT_MOVMJPG | PBFMT_MP4 | PBFMT_TS
#define RTSP_PLAY_FUNC DISABLE
#if 0
PLAY_DISP_INFO UIAppPlayDispConfig[4] = {
//enable disp_id w h ratio rotate dir
{TRUE, PLAY_DISP_ID_1, 960, 240 , 4 , 3 , 0},
{TRUE, PLAY_DISP_ID_2, 960, 240 , 4 , 3 , 0},
{TRUE, PLAY_DISP_ID_3, 960, 240 , 4 , 3 , 0},
{TRUE, PLAY_DISP_ID_4, 960, 240 , 4 , 3 , 0},
};
#else
IMAGEAPP_PLAY_CFG_DISP_INFO gPlay_Disp_Info;
#endif
static HD_COMMON_MEM_INIT_CONFIG g_play_mem_cfg = {0};
static UINT32 g_PlayExifBufPa = 0, g_PlayExifBufVa = 0;
static ER PlayExe_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 * 1;
if(g_PlayExifBufVa == 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_PlayExifBufVa = (UINT32)va;
g_PlayExifBufPa = (UINT32)pa;
buf.addr = g_PlayExifBufVa;
buf.size = 0x10000;
EXIF_Init(EXIF_HDL_ID_1, &buf, ExifCB);
ret = E_OK;
}
return ret;
}
static ER PlayExe_UninitExif(void)
{
ER ret = E_OK;
HD_RESULT hd_ret;
if ((hd_ret = hd_common_mem_free(g_PlayExifBufPa, (void *)g_PlayExifBufVa)) != HD_OK) {
DBG_ERR("hd_common_mem_free failed(%d)\r\n", hd_ret);
ret = E_SYS;
}
g_PlayExifBufPa = 0;
g_PlayExifBufVa = 0;
EXIF_UninstallID();
return ret;
}
static INT32 PlayExe_InitCommonMem(void)
{
HD_VIDEOOUT_SYSCAPS video_out_syscaps;
HD_VIDEOOUT_SYSCAPS *p_video_out_syscaps = &video_out_syscaps;
HD_PATH_ID video_out_ctrl = (HD_PATH_ID)GxVideo_GetDeviceCtrl(DOUT1, DISPLAY_DEVCTRL_CTRLPATH);
USIZE device_size = {0};
HD_RESULT ret = HD_OK;
ret = hd_videoout_get(video_out_ctrl, HD_VIDEOOUT_PARAM_SYSCAPS, p_video_out_syscaps);
if (ret != HD_OK) {
DBG_ERR("get video_out_syscaps failed\r\n");
device_size.w = 960;
device_size.h = 240;
} else {
device_size.w = p_video_out_syscaps->output_dim.w;
device_size.h = p_video_out_syscaps->output_dim.h;
}
// config common pool (Decode)
g_play_mem_cfg.pool_info[0].type = HD_COMMON_MEM_COMMON_POOL;
g_play_mem_cfg.pool_info[0].blk_size = ALIGN_CEIL_64(PB_MAX_RAW_SIZE) + 1024; //0x1000 for address page alignment
g_play_mem_cfg.pool_info[0].blk_cnt = 1;
g_play_mem_cfg.pool_info[0].ddr_id = DDR_ID0;
// config common pool (Display for playback lib)
g_play_mem_cfg.pool_info[1].type = HD_COMMON_MEM_COMMON_POOL;
#if PLAY_THUMB_AND_MOVIE // fixed common pool size to PB_MAX_VIDEO for playing thumbnail and movie together
g_play_mem_cfg.pool_info[1].blk_size = ALIGN_CEIL_64(PB_MAX_VIDEO_W)*ALIGN_CEIL_64(PB_MAX_VIDEO_H)*3/2 + 1024; //Three YUV420 buffers and ALIGN_CEIL_64 for H.264/H.265
#else
g_play_mem_cfg.pool_info[1].blk_size = ALIGN_CEIL_64(1920)*ALIGN_CEIL_64(1080)*3/2 + 1024; //Three YUV420 buffers and ALIGN_CEIL_64 for H.264/H.265
#endif
g_play_mem_cfg.pool_info[1].blk_cnt = 4; //consider the playback library
g_play_mem_cfg.pool_info[1].ddr_id = DDR_ID0;
// config common pool (Display for Project)
g_play_mem_cfg.pool_info[2].type = HD_COMMON_MEM_COMMON_POOL;
g_play_mem_cfg.pool_info[2].blk_size = ALIGN_CEIL_64(device_size.w) *ALIGN_CEIL_64(device_size.h)*3/2 + 1024;
#if (_BOARD_DRAM_SIZE_ == 0x04000000)
g_play_mem_cfg.pool_info[2].blk_cnt = 4;//6; //consider the playback library
#else
g_play_mem_cfg.pool_info[2].blk_cnt = 6; //consider the playback library
#endif
g_play_mem_cfg.pool_info[2].ddr_id = DDR_ID0;
// config common pool for bs pushing in (file buffer)
g_play_mem_cfg.pool_info[3].type = HD_COMMON_MEM_COMMON_POOL;
g_play_mem_cfg.pool_info[3].blk_size = PB_MAX_FILE_SIZE + 1024;
g_play_mem_cfg.pool_info[3].blk_cnt = 2;
g_play_mem_cfg.pool_info[3].ddr_id = DDR_ID0;
// config common pool for exif parasing
g_play_mem_cfg.pool_info[4].type = HD_COMMON_MEM_COMMON_POOL;
g_play_mem_cfg.pool_info[4].blk_size = MAX_APP1_SIZE + 1024;
g_play_mem_cfg.pool_info[4].blk_cnt = 1;
g_play_mem_cfg.pool_info[4].ddr_id = DDR_ID0;
ImageApp_Play_SetParam(PLAY_PARAM_MEM_CFG, (UINT32)&g_play_mem_cfg);
return 0;
}
static void PlayExe_SetDispParam(void)
{
#if 0
PLAY_DISP_INFO* p_disp = NULL;
USIZE DeviceRatio;
if (System_GetEnableDisp() & DISPLAY_1) {
DeviceRatio = GxVideo_GetDeviceAspect(0);
p_disp = &UIAppPlayDispConfig[0];
p_disp->enable = TRUE;
p_disp->width = 0;
p_disp->height = 0;
p_disp->width_ratio = DeviceRatio.w;
p_disp->height_ratio = DeviceRatio.h;
p_disp->rotate_dir = SysVideo_GetDirbyID(DOUT1);
ImageApp_Play_Config(PLAY_CONFIG_DISP_INFO, (UINT32)p_disp);
}
if (System_GetEnableDisp() & DISPLAY_2) {
DeviceRatio = GxVideo_GetDeviceAspect(1);
p_disp = &UIAppPlayDispConfig[1];
p_disp->enable = TRUE;
p_disp->width = 0;
p_disp->height = 0;
p_disp->width_ratio = DeviceRatio.w;
p_disp->height_ratio = DeviceRatio.h;
p_disp->rotate_dir = SysVideo_GetDirbyID(DOUT2);
ImageApp_Play_Config(PLAY_CONFIG_DISP_INFO, (UINT32)p_disp);
}
#else
gPlay_Disp_Info.vout_ctrl = GxVideo_GetDeviceCtrl(DOUT1,DISPLAY_DEVCTRL_CTRLPATH);
gPlay_Disp_Info.vout_path = GxVideo_GetDeviceCtrl(DOUT1,DISPLAY_DEVCTRL_PATH);
ImageApp_Play_SetParam(PLAY_PARAM_DISP_INFO, (UINT32)&gPlay_Disp_Info);
#endif
}
static void PlayExe_SetPBParam(void)
{
USIZE video_size = {0};
ISIZE device_size = {0};
#if 0
USIZE device2_size = {0};
ISIZE tmp_size = {0};
if (System_GetEnableDisp() & DISPLAY_1) {
tmp_size = GxVideo_GetDeviceSize(0);
device_size.h = (UINT32)tmp_size.h;
device_size.w = (UINT32)tmp_size.w;
}
if (System_GetEnableDisp() & DISPLAY_2) {
tmp_size = GxVideo_GetDeviceSize(1);
device2_size.h = (UINT32)tmp_size.h;
device2_size.w = (UINT32)tmp_size.w;
}
if (device2_size.h > device_size.h && device2_size.w > device_size.w) {
device_size.h = device2_size.h;
device_size.w = device2_size.w;
}
#endif
device_size = GxVideo_GetDeviceSize(0);
ImageApp_Play_SetParam(PLAY_PARAM_PANELSZ, (UINT32)&device_size);
ImageApp_Play_SetParam(PLAY_PARAM_PLAY_FMT, PB_FILE_FMT);
ImageApp_Play_SetParam(PLAY_PARAM_MAX_FILE_SIZE, PB_MAX_FILE_SIZE);
ImageApp_Play_SetParam(PLAY_PARAM_MAX_DECODE_WIDTH, PB_MAX_DECODE_W);
ImageApp_Play_SetParam(PLAY_PARAM_MAX_DECODE_HEIGHT, PB_MAX_DECODE_H);
ImageApp_Play_SetParam(PLAY_PARAM_PIXEL_FORMAT, (UINT32)PB_PIXEL_FORMAT);
video_size.w = PB_MAX_VIDEO_W;
video_size.h = PB_MAX_VIDEO_H;
ImageApp_Play_SetParam(PLAY_PARAM_MAX_VIDEO_SIZE, (UINT32)&video_size);
}
BOOL PBDecVideoCB(UINT32 uiUserDataAddr, UINT32 uiUserDataSize)
{
//return MovieUdta_ParseVendorUserData(uiUserDataAddr, uiUserDataSize);
return 0;
}
/**
Initialize application for Playback mode
Initialize application for Playback mode.
@param void
@return void
*/
INT32 PlayExe_OnOpen(VControl *pCtrl, UINT32 paramNum, UINT32 *paramArray)
{
UINT32 useFileDB = 0;
UINT32 uiPoolAddr = (UINT32)mempool_filedb;
//call default
Ux_DefaultEvent(pCtrl, NVTEVT_EXE_OPEN, paramNum, paramArray);
if (PlayExe_InitCommonMem() < 0) {
return NVTEVT_CONSUME;
}
PlayExe_SetDispParam();
PlayExe_SetPBParam();
//#if (FS_FUNC == ENABLE)
// wait fs mount ready
// System_WaitFS();
//#endif
#if USE_FILEDB
UI_SetData(FL_IsUseFileDB, 1);
#else
UI_SetData(FL_IsUseFileDB, 0);
#endif
useFileDB = UI_GetData(FL_IsUseFileDB);
if (useFileDB) {
CHAR *rootPath = "A:\\";
//CHAR* defaultfolder="A:\\CarDV\\";
PPBX_FLIST_OBJ pFlist = PBXFList_FDB_getObject();
pFlist->Config(PBX_FLIST_CONFIG_MEM, uiPoolAddr, POOL_SIZE_FILEDB);
pFlist->Config(PBX_FLIST_CONFIG_MAX_FILENUM, 5000, 0);
pFlist->Config(PBX_FLIST_CONFIG_MAX_FILEPATH_LEN, 60, 0);
pFlist->Config(PBX_FLIST_CONFIG_VALID_FILETYPE, PBX_FLIST_FILE_TYPE_JPG | PBX_FLIST_FILE_TYPE_AVI | PBX_FLIST_FILE_TYPE_MOV | PBX_FLIST_FILE_TYPE_MP4 | PBX_FLIST_FILE_TYPE_TS, 0);
pFlist->Config(PBX_FLIST_CONFIG_DCF_ONLY, FALSE, 0);
pFlist->Config(PBX_FLIST_CONFIG_SORT_BYSN_DELIMSTR, (UINT32)"_", 0);
pFlist->Config(PBX_FLIST_CONFIG_SORT_BYSN_DELIMNUM, 1, 0);
pFlist->Config(PBX_FLIST_CONFIG_SORT_BYSN_NUMOFSN, 6, 0);
pFlist->Config(PBX_FLIST_CONFIG_SORT_TYPE,PBX_FLIST_SORT_BY_SN,0);
pFlist->Config(PBX_FLIST_CONFIG_ROOT_PATH, (UINT32)rootPath, 0);
pFlist->Config(PBX_FLIST_CONFIG_SUPPORT_LONGNAME, 1, 0);
PB_SetParam(PBPRMID_FILELIST_OBJ, (UINT32)pFlist);
} else {
PB_SetParam(PBPRMID_FILELIST_OBJ, (UINT32)PBXFList_DCF_getObject());
}
PB_SetParam(PBPRMID_DEC_VIDEO_CALLBACK, (UINT32)PBDecVideoCB);
PB_SetParam(PBPRMID_ONDRAW_CALLBACK, (UINT32)PBView_OnDrawCB);
#if 0 /* decrypt */
UINT8 key[] = {0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff, 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff};
PLAY_FILE_DECRYPT crypt_info = {
.type = PLAY_DECRYPT_TYPE_CONTAINER | PLAY_DECRYPT_TYPE_ALL_FRAME,
.mode = PLAY_DECRYPT_MODE_AES256,
.key = key,
.key_len = 32,
};
ImageApp_Play_SetParam(PLAY_PARAM_DECRYPT_INFO, (UINT32)&crypt_info);
#endif
//open
ImageApp_Play_Open();
//init EXIF
PlayExe_InitExif();
#if(WIFI_AP_FUNC==ENABLE)
if (System_GetState(SYS_STATE_CURRSUBMODE) == SYS_SUBMODE_WIFI) {
#if (RTSP_PLAY_FUNC==ENABLE)
/*RTSPNVT_OPEN Open = {0};
Open.uiApiVer = RTSPNVT_API_VERSION;
Open.Type = RTSPNVT_TYPE_PLAYBACK;
Open.uiPortNum = 554;
//#NT#2016/07/13#Charlie Chang -begin
//#NT# re-allocate rtsp addr and size
Open.uiWorkAddr = Pool.Addr;
Open.uiWorkSize = Pool.Size;
//#NT#2016/07/13#Charlie Chang -end
RtspNvt_Open(&Open);
//#NT#2016/07/20#Charlie Chang -begin
//#NT# for PlayExe_GetTmpBuf function to get buf
RtspNvt_GetWorkBuf(&g_stream_app_mem);
//#NT#2016/07/20#Charlie Chang -end
*/
#endif
//WifiCmd_Done(WIFIFLAG_MODE_DONE,E_OK);
Ux_PostEvent(NVTEVT_WIFI_EXE_MODE_DONE, 1, E_OK);
}
#endif
return NVTEVT_CONSUME;
}
INT32 PlayExe_OnVideoChange(VControl *pCtrl, UINT32 paramNum, UINT32 *paramArray)
{
// change to current UI mode again
Ux_SendEvent(0, NVTEVT_SYSTEM_MODE, 1, System_GetState(SYS_STATE_CURRMODE));
return NVTEVT_CONSUME;
//return NVTEVT_PASS; //PASS this event to UIWnd!
}
INT32 PlayExe_OnClose(VControl *pCtrl, UINT32 paramNum, UINT32 *paramArray)
{
#if _TODO //refer to NA51055-840 JIRA and using new method
PBView_KeepLastView();
#endif
PlayExe_UninitExif();
ImageApp_Play_Close();
//call default
Ux_DefaultEvent(pCtrl, NVTEVT_EXE_CLOSE, paramNum, paramArray);
return NVTEVT_CONSUME;
}
static HD_IPOINT curr_pos = {0, 0};
INT32 PlayExe_ZOOM(VControl *pCtrl, UINT32 paramNum, UINT32 *paramArray)
{
HD_VIDEO_FRAME frame;
UINT32 ratio = 10;
INT32 target_x_offset = 0, target_y_offset = 0;
PB_GetParam(PBPRMID_INFO_IMG, (UINT32 *)&frame);
if(paramNum > 0){
ratio = paramArray[0];
}
if(paramNum > 2){
target_x_offset = (INT32)paramArray[1];
target_y_offset = (INT32)paramArray[2];
DBG_DUMP("target_x_offset = %d target_x_offset = %d\n",
(INT32)paramArray[1],
(INT32)paramArray[2]
);
}
curr_pos.x += target_x_offset;
curr_pos.y += target_y_offset;
// if(curr_pos.x < 0)
// curr_pos.x = 0;
//
// if(curr_pos.y < 0)
// curr_pos.y = 0;
PBView_Zoom(
&frame,
&curr_pos,
ratio
);
return NVTEVT_CONSUME;
}
////////////////////////////////////////////////////////////
EVENT_ENTRY CustomPlayObjCmdMap[] = {
{NVTEVT_EXE_OPEN, PlayExe_OnOpen },
{NVTEVT_EXE_CLOSE, PlayExe_OnClose },
//#NT#2012/07/31#Hideo Lin -end
{NVTEVT_VIDEO_CHANGE, PlayExe_OnVideoChange },
{NVTEVT_EXE_PLAY_ZOOM, PlayExe_ZOOM },
{NVTEVT_NULL, 0}, //End of Command Map
};
CREATE_APP(CustomPlayObj, APP_SETUP)