#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)