开发包DVRRDK3.5,DM8168.
我在3.5的包里面实现了单路、双路采集,然后添加osd并且显示的link,这个可以成功运行。但是同样的link放到4.0的开发包后就没有效果。
link流程是 :
cap->merge->ipcFrameOutVpss->sclr->swms->disply
|->ipcFrameinDsp->osdprocess
两次的区别是,3.5的采集后输出的是420sp,osdlogo是 gMCFW_swosdTiLogoYuv420sp然后进入osd处理。
4.0的包是采集4路,然后输出422i送人osd处理,osdlogo是gMCFW_swosdTiLogoYuv422i。
我在4.0的包osdlink里面了打印信息,显示到已经执行了SWOSD_blendWindow(pSwOsdObj);函数。下面是一部分算法里面的打印信息:
[c6xdsp ] AlgLink_algProcessData | 178, enter alg process! [c6xdsp ] AlgLink_algProcessData | 198, enter osd! [c6xdsp ] AlgLink_OsdalgProcessFrame | 211, format is 0! [c6xdsp ] SWOSD: CH0: VID: addr=0x973EE480 start=0,0 1920x1080, pitch=3840 For mat 0; GRPX: start=32,16 448x30, pitch=448 Format 0 [c6xdsp ] AlgLink_OsdalgProcessFrame | 296, blend window! [c6xdsp ] AlgLink_algProcessData | 178, enter alg process! [c6xdsp ] AlgLink_algProcessData | 198, enter osd! [c6xdsp ] AlgLink_OsdalgProcessFrame | 211, format is 0! [c6xdsp ] SWOSD: CH0: VID: addr=0x977E2C80 start=0,0 1920x1080, pitch=3840 For mat 0; GRPX: start=32,16 448x30, pitch=448 Format 0 [c6xdsp ] AlgLink_OsdalgProcessFrame | 296, blend window!
打印信息里面有个奇怪的地方是 pitch=448,这个值恰好是logo图像宽度的两倍,不知道是不是这个问题。
下面是link的创建代码:
gHdLsUsecaseContext.capturePrm.outQueParams[0].nextLink = gHdLsUsecaseContext.ipcFramesOutVpssOsdId; gHdLsUsecaseContext.ipcFramesOutVpssPrmOsd.baseCreateParams.inQueParams.prevLinkId = gVcapModuleContext.captureId; gHdLsUsecaseContext.ipcFramesOutVpssPrmOsd.baseCreateParams.inQueParams.prevLinkQueId = 0; gHdLsUsecaseContext.ipcFramesOutVpssPrmOsd.baseCreateParams.notifyPrevLink = TRUE; gHdLsUsecaseContext.ipcFramesOutVpssPrmOsd.baseCreateParams.equallyDivideChAcrossOutQues = TRUE; gHdLsUsecaseContext.ipcFramesOutVpssPrmOsd.baseCreateParams.numOutQue = 1; gHdLsUsecaseContext.ipcFramesOutVpssPrmOsd.baseCreateParams.outQueParams[0].nextLink = gHdLsUsecaseContext.selectId[SELECT_FULL_RES_CAPTURE]; gHdLsUsecaseContext.ipcFramesOutVpssPrmOsd.baseCreateParams.notifyNextLink = TRUE; gHdLsUsecaseContext.ipcFramesOutVpssPrmOsd.baseCreateParams.processLink = gHdLsUsecaseContext.ipcFramesInDspOsdId; gHdLsUsecaseContext.ipcFramesOutVpssPrmOsd.baseCreateParams.notifyProcessLink = TRUE; gHdLsUsecaseContext.ipcFramesOutVpssPrmOsd.baseCreateParams.noNotifyMode = FALSE; gHdLsUsecaseContext.ipcFramesInDspPrmOsd.baseCreateParams.inQueParams.prevLinkId = gHdLsUsecaseContext.ipcFramesOutVpssOsdId; gHdLsUsecaseContext.ipcFramesInDspPrmOsd.baseCreateParams.inQueParams.prevLinkQueId = 0; gHdLsUsecaseContext.ipcFramesInDspPrmOsd.baseCreateParams.numOutQue = 1; gHdLsUsecaseContext.ipcFramesInDspPrmOsd.baseCreateParams.outQueParams[0].nextLink = gHdLsUsecaseContext.dspAlgOsdId; gHdLsUsecaseContext.ipcFramesInDspPrmOsd.baseCreateParams.notifyNextLink = TRUE; gHdLsUsecaseContext.ipcFramesInDspPrmOsd.baseCreateParams.notifyPrevLink = TRUE; gHdLsUsecaseContext.ipcFramesInDspPrmOsd.baseCreateParams.noNotifyMode = FALSE; gHdLsUsecaseContext.dspAlgPrmOsd.inQueParams.prevLinkId = gHdLsUsecaseContext.ipcFramesInDspOsdId; gHdLsUsecaseContext.dspAlgPrmOsd.inQueParams.prevLinkQueId = 0; gHdLsUsecaseContext.dspAlgPrmOsd.enableOSDAlg = TRUE; gHdLsUsecaseContext.dspAlgPrmOsd.enableSCDAlg = FALSE; gHdLsUsecaseContext.dspAlgPrmOsd.outQueParams[0].nextLink = SYSTEM_LINK_ID_INVALID;
int chId;
Ptr osdWinSrAddr[4][1];
Ptr osdWinBuPtr[4][1];
int i, j;
#define OSD_W 224 //
#define OSD_H 30 //
for(i = 0; i < 4; i++)
{
AlgLink_OsdChWinParams * chWinPrm = &gHdLsUsecaseContext.dspAlgPrmOsd.osdChCreateParams[i].chDefaultParams;
/* set osd window max width and height */
gHdLsUsecaseContext.dspAlgPrmOsd.osdChCreateParams[i].maxWidth = OSD_W;
gHdLsUsecaseContext.dspAlgPrmOsd.osdChCreateParams[i].maxHeight = OSD_H;
chWinPrm->chId = i;
chWinPrm->colorKey[0] = 0xfa;
chWinPrm->colorKey[1] = 0x7e;
chWinPrm->colorKey[2] = 0x7d;
chWinPrm->numWindows = 1;//EXAMPLE_OSD_NUM_WINDOWS;
chWinPrm->winPrm[0].startX = EXAMPLE_OSD_WIN0_STARTX;
chWinPrm->winPrm[0].startY = EXAMPLE_OSD_WIN0_STARTY;
for(j=0; j < chWinPrm->numWindows; j++)
{
Chains_createBuf(&chWinPrm->winPrm[j].addr[0][0],
&osdWinBuPtr[i][j], &osdWinSrAddr[i][j], OSD_H *
OSD_W*2, SYSTEM_IPC_SR_NON_CACHED_DEFAULT);
//gMCFW_swosdTiLogoYuv420sp : osd logo buffer
memcpy(osdWinBuPtr[i][j], gMCFW_swosdTiLogoYuv422i, sizeof(gMCFW_swosdTiLogoYuv422i));
chWinPrm->winPrm[j].format = SYSTEM_DF_YUV422I_YUYV;//SYSTEM_DF_YUV420SP_UV;
chWinPrm->winPrm[j].width = OSD_W;
chWinPrm->winPrm[j].height = OSD_H;
chWinPrm->winPrm[j].lineOffset = OSD_W;
chWinPrm->winPrm[j].globalAlpha = 0x80;
chWinPrm->winPrm[j].transperencyEnable = EXAMPLE_OSD_TRANSPARENCY;
chWinPrm->winPrm[j].enableWin = EXAMPLE_OSD_ENABLE_WIN;
}
请专家看一下,给点建议。谢谢了。

