/** * @file vendor_dis_sample.c * @brief start dis sample. * @author ALG1-CV * @date in the year 2018 */ #include #include #include #include #include #include #include "nvt_dis.h" // platform dependent #if defined(__LINUX) #include //for pthread API #define MAIN(argc, argv) int main(int argc, char** argv) #define GETCHAR() getchar() #else #include #include //for pthread API #include //for sleep API #define sleep(x) vos_util_delay_ms(1000*(x)) #define msleep(x) vos_util_delay_ms(x) #define usleep(x) vos_util_delay_us(x) #include //for MAIN(), GETCHAR() API #define MAIN(argc, argv) EXAMFUNC_ENTRY(alg_lme_sample, argc, argv) #define GETCHAR() NVT_EXAMSYS_GETCHAR() #endif typedef struct _MEM_RANGE { UINT32 va; ///< Memory buffer starting address UINT32 addr; ///< Memory buffer starting address UINT32 size; ///< Memory buffer size HD_COMMON_MEM_VB_BLK blk; } MEM_RANGE, *PMEM_RANGE; static INT32 g_mem_init = 0; static INT32 g_mem_blk = -1; static MEM_RANGE g_mem = {0}; static DIS_IPC_INIT g_cur_egmap_addr, g_ref_egmap_addr; static DIS_IPC_INIT g_dis_outbuf_addr; static DIS_IPC_INIT g_ix_addr, g_iy_addr, g_valid_addr, g_availbuf_addr; static UINT32 g_ipe_out_hsize_hw = 1920, g_ipe_out_vsize_hw = 1080; static UINT32 g_Ipe_lineofs_hw = 480; static UINT32 g_egmap_size = (1920 * 1080)>>2; static DIS_MDS_DIM g_mds_dim; static HD_RESULT share_memory_exit(void) { HD_RESULT ret = HD_OK; if (g_mem_init == 1) { ret = hd_common_mem_release_block(g_mem_blk); if (ret != HD_OK) { printf("mem_uninit : hd_common_mem_release_block fail.\r\n"); return ret; } g_mem_init = 0; } return HD_OK; } static UINT32 alg_dis_calcbuffsize(void) { UINT32 buffersize; buffersize = dis_get_prvmaxBuffer(); buffersize += g_egmap_size*2; //input img; buffersize += DIS_MVNUMMAX*12; //output img; buffersize += 0x10000; //output ; return buffersize; } static int alg_dis_mem_init(void) { HD_RESULT ret; HD_COMMON_MEM_INIT_CONFIG mem_cfg = {0}; HD_COMMON_MEM_VB_BLK blk; UINT32 pa, va; HD_COMMON_MEM_DDR_ID ddr_id = DDR_ID0; UINT32 buffer_size; buffer_size = alg_dis_calcbuffsize(); mem_cfg.pool_info[0].type = HD_COMMON_MEM_COMMON_POOL; mem_cfg.pool_info[0].blk_size = buffer_size; mem_cfg.pool_info[0].blk_cnt = 1; mem_cfg.pool_info[0].ddr_id = DDR_ID0; ret = hd_common_mem_init(&mem_cfg); if (HD_OK != ret) { printf("err:hd_common_mem_init err: %d\r\n", ret); } if (g_mem_init != 0) { printf("err: mem has already been inited\r\n"); return -1; } blk = hd_common_mem_get_block(HD_COMMON_MEM_COMMON_POOL, buffer_size, ddr_id); if (blk == HD_COMMON_MEM_VB_INVALID_BLK) { printf("err:get block fail\r\n"); return -1; } printf("blk = 0x%x\r\n",blk); pa = hd_common_mem_blk2pa(blk); if (pa == 0) { printf("err:blk2pa fail, blk = 0x%x\r\n", blk); return -1; } printf("pa = 0x%x\r\n", pa); if (pa > 0) { va = (UINT32)hd_common_mem_mmap(HD_COMMON_MEM_MEM_TYPE_CACHE, pa, buffer_size); if (va == 0) { ret = hd_common_mem_release_block(blk); if (HD_OK != ret) { printf("err:release blk fail %d\r\n", ret); return ret; } } } g_mem.addr = pa; g_mem.va = va; g_mem.size = buffer_size; printf("input pa = 0x%x, va=0x%x, size =0x%x\r\n", g_mem.addr, g_mem.va, g_mem.size); g_dis_outbuf_addr.addr = g_mem.va; g_dis_outbuf_addr.size = dis_get_prvmaxBuffer(); printf("g_dis_outbuf_addr va=0x%x, size ==0x%x\r\n", g_dis_outbuf_addr.addr, g_dis_outbuf_addr.size); g_cur_egmap_addr.addr = g_dis_outbuf_addr.addr + dis_get_prvmaxBuffer(); g_cur_egmap_addr.size = g_egmap_size; g_ref_egmap_addr.addr = g_cur_egmap_addr.addr + g_egmap_size; g_ref_egmap_addr.size = g_egmap_size; printf("g_cur_egmap_addr va=0x%x, size =0x%x\r\n", g_cur_egmap_addr.addr, g_cur_egmap_addr.size); printf("g_ref_egmap_addr va=0x%x, size ==0x%x\r\n", g_ref_egmap_addr.addr, g_ref_egmap_addr.size); g_ix_addr.addr = g_ref_egmap_addr.addr + g_egmap_size; g_ix_addr.size = DIS_MVNUMMAX*4; g_iy_addr.addr = g_ix_addr.addr + DIS_MVNUMMAX*4; g_iy_addr.size = DIS_MVNUMMAX*4; g_valid_addr.addr = g_iy_addr.addr + DIS_MVNUMMAX*4; g_valid_addr.size = DIS_MVNUMMAX*4; printf("g_ix_addr va=0x%x, size =0x%x\r\n", g_ix_addr.addr, g_ix_addr.size); printf("g_iy_addr va=0x%x, size ==0x%x\r\n", g_iy_addr.addr, g_iy_addr.size); printf("g_valid_addr va=0x%x, size ==0x%x\r\n", g_valid_addr.addr, g_valid_addr.size); g_availbuf_addr.addr = g_valid_addr.addr + DIS_MVNUMMAX*4; g_availbuf_addr.size = 0x10000; if ((g_valid_addr.addr+g_valid_addr.size - va)>buffer_size) { printf("err:memmory 0x%x not enough for 0x%x \r\n", buffer_size, (g_valid_addr.addr+g_valid_addr.size - va)); return -1; } g_mem_init = 1; g_mem_blk = blk; return ret; } static HD_RESULT alg_dis_mem_exit(void) { HD_RESULT ret = HD_OK; ret = share_memory_exit(); if (ret != HD_OK) { printf("mem_uninit : share_memory_exit fail.\r\n"); return ret; } ret = hd_common_mem_uninit(); if (ret != HD_OK) { printf("mem_uninit : hd_common_mem_uninit fail.\r\n"); return ret; } return ret; } static BOOL dis_load_input_test(char* p_filepath, UINT32 ADDR) { INT32 fd; INT32 flags = O_RDWR; INT32 ret = 0; /****open CurEgMap****/ fd = open(p_filepath, flags, 0777); if (fd < 0) { printf("err:open file %s\r\n",p_filepath); return FALSE; } if (lseek(fd, 0, SEEK_SET) == -1) { printf("err:seek fail\r\n"); close(fd); return FALSE; } ret = read(fd, (void *)ADDR, g_egmap_size); if (ret < (int)g_egmap_size) { printf("err:read header =%d\r\n", ret); close(fd); return FALSE; } hd_common_mem_flush_cache((void *)ADDR, g_egmap_size); close(fd); return TRUE; } static BOOL dis_save_result_test(char* p_folder_name,UINT32 frameIdx) { static CHAR filepath[128]; static CHAR filepath2[128]; static CHAR filepath3[128]; FILE *p_fsave=NULL; UINT32 save_size = g_mds_dim.ui_blknum_h* g_mds_dim.ui_mdsnum*g_mds_dim.ui_blknum_v*sizeof(UINT32); sprintf(filepath ,"/mnt/sd/DIS/outBin/%s/alg_%ld_iX_test.raw" ,p_folder_name, frameIdx); /****SAVE p_ix****/ p_fsave = fopen(filepath, "w"); if (p_fsave == NULL) { printf("fopen fail\n"); return FALSE; } fwrite((UINT8*)g_ix_addr.addr, save_size, 1, p_fsave); fclose(p_fsave); sprintf(filepath2 ,"/mnt/sd/DIS/outBin/%s/alg_%ld_iY_test.raw" ,p_folder_name, frameIdx); /****SAVE p_iy****/ p_fsave = fopen(filepath2, "w"); if (p_fsave == NULL) { printf("fopen fail\n"); return FALSE; } fwrite((UINT8*)g_iy_addr.addr, save_size, 1, p_fsave); fclose(p_fsave); sprintf(filepath3 ,"/mnt/sd/DIS/outBin/%s/alg_%ld_valid_test.raw" ,p_folder_name, frameIdx); /****SAVE p_valid****/ p_fsave = fopen(filepath3, "w"); if (p_fsave == NULL) { printf("fopen fail\n"); return FALSE; } fwrite((UINT8*)g_valid_addr.addr, save_size, 1, p_fsave); fclose(p_fsave); return TRUE; } static UINT32 dis_disdebug_writedatatodram(UINT32 frmcnt, UINT32 bufstart, DIS_MOTION_INFOR motresult[]) { UINT32 blknumh, blknumv, ix, iy; UINT32 uiidx; UINT32 uicurbufptr; uicurbufptr = bufstart; blknumh = g_mds_dim.ui_blknum_h* g_mds_dim.ui_mdsnum; blknumv = g_mds_dim.ui_blknum_v; uicurbufptr += sprintf((char *)uicurbufptr, "[ frame %ld ]\t", frmcnt); uicurbufptr += sprintf((char *)uicurbufptr, "\r\n"); uicurbufptr += sprintf((char *)uicurbufptr, "MV_X\r\n"); for (iy=0; iy