DM8168 DVRRDK DSP算法开发(OSD)

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值。

② 效果测试:


猜你喜欢

转载自blog.csdn.net/wu20093346/article/details/50454149
dm
dsp