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;
|
|
}
|