This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

DVRRDK3.5的osd创建代码,放到4.0后就没有效果了。



开发包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;
		}

请专家看一下,给点建议。谢谢了。

  • 你好;

             你可以先测试一下RDK4.0的swosd的demo程序,先把这个运行起来;在RDK4.0里面有了一个正常的demo,其他就好实现了;

  • 你好,我在4.0里面写了个小程序,osd是可以正常运行的。但是放到工程里面就不行了。感到非常奇怪。从打印信息来看也没有问题,在算法里面打印信息表明已经运行到了 blend window函数。

     [c6xdsp ] AlgLink_algProcessData | 178, enter alg process!
     [c6xdsp ] AlgLink_algProcessData | 198, enter osd!
     [c6xdsp ] AlgLink_OsdalgProcessFrame | 211, format is 2!
     [c6xdsp ]  SWOSD: CH0: VID: addr=0x60010F00 start=0,0 1920x1080, pitch=16384 Fo
    rmat 2; GRPX: start=16,16 224x30, pitch=224 Format 2
     [c6xdsp ] AlgLink_OsdalgProcessFrame | 296, blend window!
     [c6xdsp ]  SWOSD: CH0: VID: addr=0x68000F00 start=0,0 1920x1080, pitch=32768 Fo
    rmat 2; GRPX: start=16,8 224x15, pitch=224 Format 2
     [c6xdsp ] AlgLink_OsdalgProcessFrame | 322, blend window!

    我发现现在的link流程里面只有deilink的 tilerenable 是true,其他link都是false。这个tiler 对osd应该没有影响吧。。

  • 刚刚试过吧nsf的tilerenable关掉还是不行。

  • 我又写了个4.0dvrrdk 的demo,四路nullsrc输出420sp,然后对每个通道添加osd,可以正常显示。

    然后我把osd部分的代码添加到工程里面,这次是把ipcFramesOutVpsslink 放到了enc之前,但是仍然没有出现osd。

    这个问题真的是困扰了好久了,不知道哪里出了问题,你能否再帮下忙看看,谢谢了。

    下面是demo运行时出现的图像:

  • 1、是否是格式的设置问题

    2、是否有到swosd的执行函数里面去进行调试

    3、可以贴出你的程序的设计框架图吗?

  • 1、是否是格式的设置问题

    2、是否有到swosd的执行函数里面去进行调试

    3、可以贴出你的程序的设计框架图吗?

  • 多谢回复,hsu。

    1,格式设置应该没有问题的。我现在在demo里面添加了dei,整体流程如下:

    nullsrc(1路输出)->dei->ipcframesOutVpss->swms->dup(1路输出)->display

                                                     |----->ipcFramesInDsp->dspAlg(osd)

    在这个demo里面,我把nullsrc的输出格式分别设置为SYSTEM_DF_YUV420SP_UV 以及 SYSTEM_DF_YUV422I_YUYV,这两种情况下都是有osd出现的。区别只是,yuv420sp 时,图像是黑色的,yuv422i时,图像是绿色的,osd都正常。下面是dei的配置参数:

    	deiPrm0.inQueParams.prevLinkId = id_set.nullsrcId;
    	deiPrm0.inQueParams.prevLinkQueId = 0;
    	deiPrm0.outQueParams[DEI_LINK_OUT_QUE_DEI_SC].nextLink = id_set.ipcFramesOutVpssId1;
    	deiPrm0.enableOut[DEI_LINK_OUT_QUE_DEI_SC] = TRUE;
    	//deiPrm0.enableOut[DEI_LINK_OUT_QUE_VIP_SC] = TRUE;
    	deiPrm0.enableOut[DEI_LINK_OUT_QUE_VIP_SC_SECONDARY_OUT] = FALSE;
    	deiPrm0.tilerEnable[DEI_LINK_OUT_QUE_DEI_SC] = FALSE;
    	deiPrm0.tilerEnable[DEI_LINK_OUT_QUE_VIP_SC] = FALSE;
    	deiPrm0.comprEnable = FALSE;
    	deiPrm0.setVipScYuv422Format = FALSE;
    	deiPrm0.enableDeiForceBypass = TRUE;//TRUE;//FALSE;
    	deiPrm0.enableLineSkipSc = TRUE;//TRUE;
    	deiPrm0.inputFrameRate[DEI_LINK_OUT_QUE_DEI_SC] = 30;
    	deiPrm0.outputFrameRate[DEI_LINK_OUT_QUE_DEI_SC] = 30;
    
    	deiPrm0.inputDeiFrameRate= 30;
    	deiPrm0.outputDeiFrameRate = 30;
    
    	deiPrm0.numBufsPerCh[DEI_LINK_OUT_QUE_DEI_SC] = 6;
    	//deiPrm0.numBufsPerCh[DEI_LINK_OUT_QUE_VIP_SC] = 6;

    2.我在dsp端,在osd运行时添加了打印信息,可以确定执行了 SWOSD_blendWindow(pSwOsdObj); 这个函数。打印信息里面,pitch看起来不太明白,另外格式为422i时,AlgLink_OsdalgPrintInfo(pSwOsdObj, pFrame); 函数的打印信息里面 GRPX 的起始坐标跟我预设的不一致。其他的看起来正常。

    另外,数据格式不一致,屏幕上总该出现点什么才对。

    3.程序设计框架如下:

    红色部分是osd相关的。第一次是添加到了cap之后。第二次是添加到了Merge(to Encoder) 之后,ipcOutVpss之前。

    下面是osd部分的代码:

    #ifdef _C_OSDADD_ //add osd after encoder
    	//gHdLsUsecaseContext.mergePrm[MERGE_ENCODE].outQueParams.nextLink        = gHdLsUsecaseContext.ipcFramesOutVpssOsdId;
    
    	gHdLsUsecaseContext.ipcFramesOutVpssPrmOsd.baseCreateParams.inQueParams.prevLinkId = gHdLsUsecaseContext.mergeId[MERGE_ENCODE];
    	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.ipcOutVpssId;
    	
    	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[5][2];
    	Ptr osdWinBuPtr[5][2];
    	int osdYSize, osdSize;
    	unsigned int osdFormat;
    	int i, j;
    #define OSD_W	224		//osd 瀹藉害
    #define OSD_H	30		//osd 楂樺害
    
    	osdYSize = OSD_W * OSD_H;
    	osdSize = osdYSize * 2;
    	osdFormat = SYSTEM_DF_YUV420SP_UV;
    	
    	for(i = 0; i < 5; 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;
    		gHdLsUsecaseContext.dspAlgPrmOsd.osdChCreateParams[i].osdFormat = osdFormat;
    		chWinPrm->chId = i;
    		chWinPrm->colorKey[0] = 0xfa;
    		chWinPrm->colorKey[1] = 0x7e;
    		chWinPrm->colorKey[2] = 0x7d;
    		chWinPrm->numWindows = 1;
    
    		for(j=0; j < chWinPrm->numWindows; j++)
    		{	
    		/* set osd window params. In this demo # of windows set to 2 */
    			chWinPrm->winPrm[j].format			   = osdFormat;
    			chWinPrm->winPrm[j].startX			   = EXAMPLE_OSD_WIN0_STARTX;//just for channel 0.
    			chWinPrm->winPrm[j].startY			   = EXAMPLE_OSD_WIN0_STARTY;
    			chWinPrm->winPrm[j].width			   = OSD_W;
    			chWinPrm->winPrm[j].height			   = OSD_H;
    			chWinPrm->winPrm[j].lineOffset		   = OSD_W;
    			chWinPrm->winPrm[j].globalAlpha 	   	   = 0x80;//閫氶€忕壒鏁堬紝0x00鍏ㄩ€?0x40鍗婇€忥紝0x80鍏ㄩ伄
    			chWinPrm->winPrm[j].transperencyEnable   = EXAMPLE_OSD_TRANSPARENCY;
    			chWinPrm->winPrm[j].enableWin		   = EXAMPLE_OSD_ENABLE_WIN;
    		
    			Chains_createBuf((void *)&chWinPrm->winPrm[j].addr[0][0], &osdWinBuPtr[i][0], &osdWinSrAddr[i][0],  osdSize, SYSTEM_IPC_SR_NON_CACHED_DEFAULT);	
    
    			//chWinPrm->winPrm[j].format			   = osdFormat;//SYSTEM_DF_YUV420SP_UV;SYSTEM_DF_YUV422I_YUYV
    			if(osdFormat == SYSTEM_DF_YUV420SP_UV){
    				chWinPrm->winPrm[j].addr[0][1] = chWinPrm->winPrm[j].addr[0][0] + osdYSize;
    				memcpy(osdWinBuPtr[i][0], gMCFW_swosdTiLogoYuv420sp, sizeof(gMCFW_swosdTiLogoYuv420sp));
    			}else if(osdFormat == SYSTEM_DF_YUV422I_YUYV){
    				chWinPrm->winPrm[j].addr[0][1] = NULL;
    				memcpy(osdWinBuPtr[i][0], gMCFW_swosdTiLogoYuv422i, sizeof(gMCFW_swosdTiLogoYuv422i));
    			}
    				//闇€瑕佹牴鎹噰闆嗗彛鐨勬暟鎹被鍨嬫潵璁剧疆
    		}
    	}
    
    
    	System_linkCreate(gHdLsUsecaseContext.ipcFramesOutVpssOsdId,
    		&gHdLsUsecaseContext.ipcFramesOutVpssPrmOsd,
    		sizeof(gHdLsUsecaseContext.ipcFramesOutVpssPrmOsd));
    	System_linkCreate(gHdLsUsecaseContext.ipcFramesInDspOsdId,
    		&gHdLsUsecaseContext.ipcFramesInDspPrmOsd,
    		sizeof(gHdLsUsecaseContext.ipcFramesInDspPrmOsd)
    		);
    	System_linkCreate(gHdLsUsecaseContext.dspAlgOsdId,
    		&gHdLsUsecaseContext.dspAlgPrmOsd,
    		sizeof(gHdLsUsecaseContext.dspAlgPrmOsd)
    		);
    
    #endif

    非常感谢你的回复。