445 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			C
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			445 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			C
		
	
	
		
			Executable File
		
	
	
	
	
| /**
 | |
|  * @file vendor_dis_sample.c
 | |
|  * @brief start dis sample.
 | |
|  * @author ALG1-CV
 | |
|  * @date in the year 2018
 | |
|  */
 | |
| #include <stdio.h>
 | |
| #include <unistd.h>
 | |
| #include <stdlib.h>
 | |
| #include <string.h>
 | |
| #include <signal.h>
 | |
| #include <pthread.h>
 | |
| 
 | |
| #include "nvt_dis.h"
 | |
| 
 | |
| // platform dependent
 | |
| #if defined(__LINUX)
 | |
| #include <pthread.h>			//for pthread API
 | |
| #define MAIN(argc, argv) 		int main(int argc, char** argv)
 | |
| #define GETCHAR()				getchar()
 | |
| #else
 | |
| #include <FreeRTOS_POSIX.h>	
 | |
| #include <FreeRTOS_POSIX/pthread.h> //for pthread API
 | |
| #include <kwrap/util.h>		//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 <kwrap/examsys.h> 	//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<blknumv; iy++) {
 | |
|         uicurbufptr += sprintf((char *)uicurbufptr, "\t");
 | |
|         for (ix=0; ix<blknumh; ix++) {
 | |
|             uiidx = iy*blknumh + ix;
 | |
|             uicurbufptr += sprintf((char *)uicurbufptr, "%ld\t", motresult[uiidx].ix);
 | |
|         }
 | |
|         uicurbufptr += sprintf((char *)uicurbufptr, "\r\n");
 | |
|     }
 | |
|     uicurbufptr += sprintf((char *)uicurbufptr, "MV_Y\r\n");
 | |
|     for (iy=0; iy<blknumv; iy++) {
 | |
|         uicurbufptr += sprintf((char *)uicurbufptr, "\t");
 | |
|         for (ix=0; ix<blknumh; ix++) {
 | |
|             uiidx = iy*blknumh + ix;
 | |
|             uicurbufptr += sprintf((char *)uicurbufptr, "%ld\t", motresult[uiidx].iy);
 | |
|         }
 | |
|         uicurbufptr += sprintf((char *)uicurbufptr, "\r\n");
 | |
|     }
 | |
|     uicurbufptr += sprintf((char *)uicurbufptr, "bValid\r\n");
 | |
|     for (iy=0; iy<blknumv; iy++) {
 | |
|         uicurbufptr += sprintf((char *)uicurbufptr, "\t");
 | |
|         for (ix=0; ix<blknumh; ix++) {
 | |
|             uiidx = iy*blknumh + ix;
 | |
|             uicurbufptr += sprintf((char *)uicurbufptr, "%d\t", motresult[uiidx].bvalid);
 | |
|         }
 | |
|         uicurbufptr += sprintf((char *)uicurbufptr, "\r\n");
 | |
|     }
 | |
|     uicurbufptr += sprintf((char *)uicurbufptr, "\r\n");
 | |
|     return uicurbufptr;
 | |
| }
 | |
| 
 | |
| MAIN(argc, argv)
 | |
| {
 | |
|     HD_RESULT                          ret;
 | |
|     DIS_PARAM                          disinfo;
 | |
| 	DIS_MV_INFO_SIZE                   motresult;
 | |
| 	static DIS_MOTION_INFOR            mvresult[DIS_MVNUMMAX];	
 | |
| 	
 | |
| 	UINT32	blkpMds;	
 | |
| 	UINT32	i,j;
 | |
| 	UINT32 *p_ix, *p_iy, *p_valid;
 | |
| 
 | |
| 	UINT32 frm;
 | |
| 	UINT32 idxSt = 131;
 | |
| 	UINT32 idxEd = 570; 
 | |
| 	static char filename[100];
 | |
| 
 | |
| 	static UINT64 time_stamp  = 123456;
 | |
| 	static UINT32 frame_count = 1;
 | |
| 
 | |
| 	CHAR *p_folder = "alg_dis";
 | |
| 
 | |
| 	// init common module
 | |
| 	ret = hd_common_init(0);
 | |
|     if(ret != HD_OK) {
 | |
|         printf("init fail=%d\n", ret);
 | |
|         goto exit;
 | |
|     }
 | |
| 	// init memory
 | |
| 	ret = alg_dis_mem_init();
 | |
|     if(ret != HD_OK) {
 | |
|         printf("init fail=%d\n", ret);
 | |
|         goto exit;
 | |
|     }
 | |
| 
 | |
| 	// init dis infor
 | |
| 	dis_initialize(&g_dis_outbuf_addr);	
 | |
| 
 | |
| 	// set dis infor
 | |
| 	disinfo.in_add0    = g_cur_egmap_addr.addr;
 | |
| 	disinfo.in_add1    = g_ref_egmap_addr.addr;
 | |
| 	disinfo.in_add2    = g_ref_egmap_addr.addr;
 | |
| 	disinfo.in_size_h  = g_ipe_out_hsize_hw;
 | |
| 	disinfo.in_size_v  = g_ipe_out_vsize_hw;
 | |
| 	disinfo.in_lineofs = g_Ipe_lineofs_hw;
 | |
| 			
 | |
|     for ( frm= idxSt; frm <= idxEd; frm++ ) {
 | |
| 		sprintf(filename  ,"/mnt/sd/DIS/IN/img_5m/frame%ld_rawData.bin" , frm);
 | |
| 		printf("\r\nimage: %s................................\r\n", filename);
 | |
| 		// load input
 | |
| 		dis_load_input_test(filename, g_ref_egmap_addr.addr);
 | |
| 
 | |
| 		if (frm == idxSt) {
 | |
| 			memcpy((UINT8 *)g_cur_egmap_addr.addr, (UINT8 *)g_ref_egmap_addr.addr, g_egmap_size*sizeof(UINT8));
 | |
| 			frame_count++;
 | |
| 			continue;
 | |
| 		}
 | |
| 		
 | |
| 		dis_push_time_stamp(time_stamp++, frame_count);
 | |
| 
 | |
| 		disinfo.frame_cnt = frame_count;
 | |
| 
 | |
| 		dis_set_disinfor(&disinfo);
 | |
| 	
 | |
| 		// dis process
 | |
| 		dis_process_no_compen_info();
 | |
| 		
 | |
| 		g_mds_dim = dis_get_mds_dim();
 | |
| 
 | |
| 		motresult.motvec = mvresult;
 | |
| 		dis_get_ready_motionvec(&motresult);
 | |
| 
 | |
| 		memcpy((UINT8 *)g_cur_egmap_addr.addr, (UINT8 *)g_ref_egmap_addr.addr, g_egmap_size*sizeof(UINT8));
 | |
| 
 | |
| 		blkpMds = g_mds_dim.ui_blknum_h* g_mds_dim.ui_mdsnum;
 | |
| 
 | |
| 		p_ix = (UINT32*)g_ix_addr.addr;
 | |
| 		p_iy = (UINT32*)g_iy_addr.addr;
 | |
| 		p_valid = (UINT32*)g_valid_addr.addr;	
 | |
| 
 | |
| 		for (j = 0; j < g_mds_dim.ui_blknum_v; j++) {
 | |
| 			for (i = 0; i < blkpMds; i++){			
 | |
| 				p_ix[j*blkpMds+i] = motresult.motvec[j*blkpMds+i].ix;
 | |
| 				p_iy[j*blkpMds+i] = motresult.motvec[j*blkpMds+i].iy;
 | |
| 				p_valid[j*blkpMds+i]= motresult.motvec[j*blkpMds+i].bvalid;
 | |
| 				}
 | |
| 			}
 | |
| 		
 | |
| 		if (!dis_save_result_test(p_folder,frame_count++))
 | |
| 			printf("err: dis save result fail\n");
 | |
| 		printf("[dis sample] write result done!\n");
 | |
| 
 | |
| 		static UINT32 frmcnt = 2;
 | |
| 		UINT32 uiEndBuffer = 0;
 | |
| 		UINT32 out_length = 0;
 | |
| 		char filename[200] = {0};
 | |
| 		FILE *p_fsave=NULL;
 | |
| 		static UINT32 saveMvInit = 1;
 | |
| 		uiEndBuffer = dis_disdebug_writedatatodram(frmcnt, g_availbuf_addr.addr, motresult.motvec);
 | |
| 		out_length = uiEndBuffer - g_availbuf_addr.addr;
 | |
| 		sprintf(filename, "/mnt/sd/DIS/alg/motResult_bin_alg_dis.txt");
 | |
| 
 | |
| 		if ( 1 == saveMvInit ) {
 | |
| 		    p_fsave = fopen(filename, "w+");
 | |
| 			if(p_fsave == NULL) {
 | |
| 				printf("fopen fail\n");
 | |
| 				return FALSE;
 | |
| 			}
 | |
| 			saveMvInit = 0;
 | |
| 		} else {
 | |
| 		    p_fsave = fopen(filename, "a+");	
 | |
| 			if(p_fsave == NULL) {
 | |
| 				printf("fopen fail\n");
 | |
| 				return FALSE;
 | |
| 			}
 | |
| 			fseek(p_fsave,0,SEEK_END);
 | |
| 		}
 | |
| 		fwrite((UINT8*)g_availbuf_addr.addr, out_length, 1, p_fsave);
 | |
| 		fclose(p_fsave);
 | |
| 
 | |
| 		frmcnt++;
 | |
|     }
 | |
| 
 | |
| exit:
 | |
| 	dis_end();
 | |
| 	ret = alg_dis_mem_exit();
 | |
|     if(ret != HD_OK) {
 | |
|         printf("alg_dis_mem_exit fail=%d\n", ret);
 | |
|         goto exit;
 | |
|     }	
 | |
| 	ret = hd_common_uninit();
 | |
|     if(ret != HD_OK) {
 | |
|         printf("uninit fail=%d\n", ret);
 | |
|         goto exit;
 | |
|     }
 | |
| 	return 0;
 | |
| }
 | 
