DSP

DM8168 DVRRDK DSP算法开发(OSD)

2019-07-13 10:28发布

1 系统编译

① Linux端(A8)编译命令:

make –s dvr_rdk_linux 在文件夹 DVRRDK_04.01.00.02/dvr_rdk/bin/ti816x/bin/
生成
dvr_rdk_demo_mcfw_api.out
linux可执行程序,需要将该应用程序移动到下列目录并覆盖:
DVRRDK_04.01.00.02/target/rfs_816x/home/root/ti816x/

② Bios6端(DSP)编译命令:

make –s dvr_rdk_bios6 在文件夹 DVRRDK_04.01.00.02/dvr_rdk/bin/ti816x/firmware/
生成
dvr_rdk_fw_c6xdsp_1024M_256M.xe674
dvr_rdk_fw_m3video_1024M_256M.xem3
dvr_rdk_fw_m3vpss_1024M_256M.xem3
将这三个文件移动到下列文件夹并覆盖:
DVRRDK_04.01.00.02/target/rfs_816x/home/root/ti816x/firmware/

2 运行程序

① 加载驱动

./init.sh : 加载程序运行需要的linux内核模块
./init.sh will load the kernel modules (.ko) needed for the SDK demo

② 加载M3固件

./load.sh : 加载Video-M3和VPSS-M3的固件
./load.sh will load the executable on the Video-M3 and VPSS-M3 processor and wait until these processor’s have finished their initialization

③ 运行程序

./run.sh : 运行A8端的linux应用程序
./run.sh will run the A8 side application. After running the application you will be presented with a menu of options.

④ 卸载固件

./unload.sh : 卸载Video-M3和VPSS-M3的固件
./unload.sh will send a stop command to both processors and wait until they finish their shutdown sequence. Then the executable will be “unloaded”.

3 Sys Link

① 软件框架Link


② Cap–Dis Link demo


CaptureLink_CreateParams_Init(&capturePrm); capturePrm.numVipInst = 1; capturePrm.outQueParams[0].nextLink = gVdisModuleContext.displayId[0]; capturePrm.tilerEnable = FALSE; capturePrm.enableSdCrop = FALSE; pCaptureInstPrm = &capturePrm.vipInst[0]; pCaptureInstPrm->vipInstId = SYSTEM_CAPTURE_INST_VIP0_PORTA; pCaptureInstPrm->videoDecoderId = 0; pCaptureInstPrm->inDataFormat = SYSTEM_DF_YUV422P; pCaptureInstPrm->standard = SYSTEM_STD_1080P_60; pCaptureInstPrm->numOutput = 1; pCaptureInstPrm->inScanFormat = SYSTEM_SF_PROGRESSIVE; pCaptureOutPrm = &pCaptureInstPrm->outParams[0]; pCaptureOutPrm->dataFormat =SYSTEM_DF_YUV422I_YUYV; pCaptureOutPrm->scEnable = FALSE; pCaptureOutPrm->scOutWidth = 0; pCaptureOutPrm->scOutHeight = 0; pCaptureOutPrm->outQueId = 0; displayPrm.inQueParams[0].prevLinkId = gVcapModuleContext.captureId; displayPrm.inQueParams[0].prevLinkQueId = 0; displayPrm.displayRes = VSYS_STD_1080P_60;

③ Cap–OSD–Dis Link (DSP核处理图像)


CaptureLink_CreateParams_Init(&capturePrm); capturePrm.numVipInst = 1; capturePrm.outQueParams[0].nextLink = ipcFramesOutVpssId; capturePrm.tilerEnable = FALSE; capturePrm.enableSdCrop = FALSE; pCaptureInstPrm = &capturePrm.vipInst[0]; pCaptureInstPrm->vipInstId = SYSTEM_CAPTURE_INST_VIP0_PORTA; pCaptureInstPrm->videoDecoderId = 0; pCaptureInstPrm->inDataFormat = SYSTEM_DF_YUV422P; pCaptureInstPrm->standard = SYSTEM_STD_1080P_60; pCaptureInstPrm->numOutput = 1; pCaptureInstPrm->inScanFormat= SYSTEM_SF_PROGRESSIVE; pCaptureOutPrm = &pCaptureInstPrm->outParams[0]; pCaptureOutPrm->dataFormat =SYSTEM_DF_YUV422I_YUYV; pCaptureOutPrm->scEnable = FALSE; pCaptureOutPrm->scOutWidth = 0; pCaptureOutPrm->scOutHeight = 0; pCaptureOutPrm->outQueId = 0; IpcFramesOutLinkRTOS_CreateParams_Init(&ipcFramesOutVpssPrm); ipcFramesOutVpssPrm.baseCreateParams.inQueParams.prevLinkId = gVcapModuleContext.captureId; ipcFramesOutVpssPrm.baseCreateParams.inQueParams.prevLinkQueId = 0; ipcFramesOutVpssPrm.baseCreateParams.inputFrameRate = 25; ipcFramesOutVpssPrm.baseCreateParams.outputFrameRate = 25; ipcFramesOutVpssPrm.baseCreateParams.notifyPrevLink = TRUE; ipcFramesOutVpssPrm.baseCreateParams.equallyDivideChAcrossOutQues = TRUE; ipcFramesOutVpssPrm.baseCreateParams.numOutQue =1; ipcFramesOutVpssPrm.baseCreateParams.outQueParams[0].nextLink= gVdisModuleContext.displayId[0]; ipcFramesOutVpssPrm.baseCreateParams.processLink = ipcFramesInDspId; ipcFramesOutVpssPrm.baseCreateParams.notifyProcessLink = TRUE; ipcFramesOutVpssPrm.baseCreateParams.notifyNextLink = TRUE; ipcFramesOutVpssPrm.baseCreateParams.noNotifyMode = FALSE;//TRUE; IpcFramesInLinkRTOS_CreateParams_Init(&ipcFramesInDspPrm); ipcFramesInDspPrm.baseCreateParams.inQueParams.prevLinkId =ipcFramesOutVpssId; ipcFramesInDspPrm.baseCreateParams.inQueParams.prevLinkQueId = 0; ipcFramesInDspPrm.baseCreateParams.numOutQue = 1; ipcFramesInDspPrm.baseCreateParams.outQueParams[0].nextLink = osdId; ipcFramesInDspPrm.baseCreateParams.inputFrameRate = 25; ipcFramesInDspPrm.baseCreateParams.outputFrameRate = 25; ipcFramesInDspPrm.baseCreateParams.notifyNextLink =TRUE; ipcFramesInDspPrm.baseCreateParams.notifyPrevLink = TRUE; ipcFramesInDspPrm.baseCreateParams.noNotifyMode = FALSE; AlgLink_CreateParams_Init(&osdPrm); osdPrm.inQueParams.prevLinkId = ipcFramesInDspId; osdPrm.inQueParams.prevLinkQueId = 0; osdPrm.enableOSDAlg = TRUE; osdPrm.enableSCDAlg = FALSE; AlgLink_OsdChWinParams *chWinPrm=&osdPrm.osdChCreateParams[0].chDefaultParams; osdPrm.osdChCreateParams[0].maxHeight =64; osdPrm.osdChCreateParams[0].maxWidth =320; chWinPrm->chId =0 ; chWinPrm->numWindows =1; chWinPrm->colorKey[0] = 0xfa; /* Y */ chWinPrm->colorKey[1] = 0x7e; /* U */ chWinPrm->colorKey[2] = 0x7d; /* V */ chWinPrm->winPrm[0].startX = CHAINS_OSD_WIN0_STARTX; chWinPrm->winPrm[0].startY = CHAINS_OSD_WIN0_STARTY; chWinPrm->winPrm[0].format = SYSTEM_DF_YUV422I_YUYV; chWinPrm->winPrm[0].width = CHAINS_OSD_WIN_WIDTH; chWinPrm->winPrm[0].height = CHAINS_OSD_WIN_HEIGHT; chWinPrm->winPrm[0].lineOffset = CHAINS_OSD_WIN_PITCH; chWinPrm->winPrm[0].globalAlpha= CHAINS_OSD_GLOBAL_ALPHA; chWinPrm->winPrm[0].transperencyEnable = CHAINS_OSD_TRANSPARENCY; chWinPrm->winPrm[0].enableWin=CHAINS_OSD_ENABLE_WIN; displayPrm.inQueParams[0].prevLinkId = ipcFramesOutVpssId; displayPrm.inQueParams[0].prevLinkQueId = 0; displayPrm.displayRes = VSYS_STD_1080P_60;

4 DSP 图像算法

① 算法添写位置:

打开mcfw/src_bios6/links_c6xdsp/alg_link/swosd/osdLink_alg.c:
第266行:
pSwOsdObj->videoWindowAddr = pFrame->addr[0][0];
pFrame->addr[0][0]指针即为图像的存储位置
使用方法:
Uint8 *buff=pFrame->addr[0][0]; for(i=0;i<1080;i++) { for(j=0;j<1920;j++) { *(buff+2*j)=128; } buff=buff+1920*2; }该例子简单的修改了每个像素点的Y值。

② 效果测试: