TI中文支持网
TI专业的中文技术问题搜集分享网站

DM8127下usecase中加入swMslink拼接出2*2布局,运行后通道0显示异常,其他通道正常

各位好,

我将8127前端从sensor替换成了模拟摄像头输入,link连接方式为capturelink->deilink->nsflink->……!目标顺利完成。

接下来,我希望用马赛克link将四路画面拼接为一副画面,link连接方式为:capturelink->deilink->swmslink->nsflink->……。

但是按照上述目标,我在usecase中修改了代码,但是运行之后窗口1,2,3分别显示通道1,2,3的视频画面正常,但是窗口0显示通道0数据是异常:具体异常如下:1、画面前端有密集的黄色雪花遮挡。2、通道0的视频画面并未经过缩放,画面尺寸明显与其他通道不同。具体显示图像如附件中所示。麻烦各位帮忙分析下问题.

usecase中link连接具体代码如下所示:

//config 5158
numCaptureDevices = 1;
for(i = 0; i < numCaptureDevices; i++)
{

vidDecVideoModeArgs[i].videoIfMode = DEVICE_CAPT_VIDEO_IF_MODE_8BIT;
vidDecVideoModeArgs[i].videoDataFormat = SYSTEM_DF_YUV422P;
vidDecVideoModeArgs[i].standard = SYSTEM_STD_MUX_4CH_D1;
vidDecVideoModeArgs[i].videoCaptureMode =
DEVICE_CAPT_VIDEO_CAPTURE_MODE_MULTI_CH_PIXEL_MUX_EMBEDDED_SYNC;
vidDecVideoModeArgs[i].videoSystem =
DEVICE_VIDEO_DECODER_VIDEO_SYSTEM_AUTO_DETECT;
vidDecVideoModeArgs[i].videoCropEnable = TRUE;//FALSE;
vidDecVideoModeArgs[i].videoAutoDetectTimeout = -1;
} //added ydp
OSA_printf("\n********* —————-Config Tvp5158—————- ********\n\n");
Vcap_configVideoDecoder(vidDecVideoModeArgs, numCaptureDevices);//added ydp

//Links
CaptureLink_CreateParams_Init(&capturePrm);
capturePrm.numVipInst = 1;
capturePrm.outQueParams[0].nextLink = gVcapModuleContext.deiId[0];//ipcFramesOutVpssId; dei
capturePrm.tilerEnable = FALSE;
capturePrm.enableSdCrop = FALSE;
for(vipInstId=0; vipInstId<capturePrm.numVipInst; vipInstId++)
{

pCaptureInstPrm = &capturePrm.vipInst[vipInstId];
pCaptureInstPrm->vipInstId = (SYSTEM_CAPTURE_INST_VIP0_PORTA+vipInstId)%SYSTEM_CAPTURE_INST_MAX;
pCaptureInstPrm->videoDecoderId = SYSTEM_DEVICE_VID_DEC_TVP5158_DRV;
pCaptureInstPrm->inDataFormat = SYSTEM_DF_YUV422P;
pCaptureInstPrm->standard = SYSTEM_STD_MUX_4CH_D1;
pCaptureInstPrm->numOutput = 1;

pCaptureOutPrm = &pCaptureInstPrm->outParams[0];
pCaptureOutPrm->dataFormat = SYSTEM_DF_YUV422I_YUYV;
pCaptureOutPrm->scEnable = FALSE;
pCaptureOutPrm->scOutWidth = 0;
pCaptureOutPrm->scOutHeight = 0;
pCaptureOutPrm->outQueId = 0;

}

/* Dei link params *///dei
DeiLink_CreateParams_Init(&deiPrm);

deiPrm.inQueParams.prevLinkId = gVcapModuleContext.captureId;//gVcapModuleContext.nsfId[0];
deiPrm.inQueParams.prevLinkQueId = 0;
deiPrm.outQueParams[0].nextLink = gVdisModuleContext.swMsId[0];//0626
deiPrm.enableOut[0] = TRUE;
deiPrm.tilerEnable = FALSE;//FALSE->TRUE 0630
deiPrm.comprEnable = FALSE;
deiPrm.setVipScYuv422Format = FALSE;
deiPrm.outScaleFactor[0][0].scaleMode = DEI_SCALE_MODE_RATIO;
deiPrm.outScaleFactor[0][0].ratio.widthRatio.numerator = 1;
deiPrm.outScaleFactor[0][0].ratio.widthRatio.denominator = 1;
deiPrm.outScaleFactor[0][0].ratio.heightRatio.numerator = 1;
deiPrm.outScaleFactor[0][0].ratio.heightRatio.denominator = 1; Int32 chId;
for (chId=1; chId < DEI_LINK_MAX_CH; chId++)
deiPrm.outScaleFactor[0][chId] = deiPrm.outScaleFactor[0][0];

/* Software mosaic link params */

swMsPrm.numSwMsInst = 1; //number of scaler instance in one sw mosaic
swMsPrm.swMsInstId[0] = SYSTEM_SW_MS_SC_INST_VIP0_SC;//scaler ID of each scaler instance swMsPrm.swMsInstStartWin[0] = 0;//0 start win ID for each scaler instance
//swMsPrm.swMsInstStartWin[1] = 4;//
swMsPrm.inQueParams.prevLinkId = gVcapModuleContext.deiId[0];//
swMsPrm.inQueParams.prevLinkQueId = 0;//
swMsPrm.outQueParams.nextLink = gVcapModuleContext.nsfId[0];// swMsPrm.numOutBuf = MULTICH_NUM_SWMS_MAX_BUFFERS;//0626
swMsPrm.maxOutRes = VSYS_STD_1080P_60;//
swMsPrm.lineSkipMode = TRUE;//
swMsPrm.enableLayoutGridDraw = gVdisModuleContext.vdisConfig.enableLayoutGridDraw;//
swMsPrm.maxInputQueLen = SYSTEM_SW_MS_INVALID_INPUT_QUE_LEN; // swMsPrm.enableOuputDup = TRUE;
swMsPrm.enableProcessTieWithDisplay = TRUE;//

Cap_swMsGetDefaultLayoutPrm(0, &swMsPrm, FALSE);

以上是swmslink之前的配置代码,另外在马赛克link最后调用的函数Cap_swMsGetDefaultLayoutPrm是我根据ti提供的相应函数自定义的,具体内容如下:

Void Cap_swMsGetDefaultLayoutPrm(int devId, SwMsLink_CreateParams *swMsCreateArgs, Bool forceLowCostScaling)
{
SwMsLink_LayoutPrm *layoutInfo;
SwMsLink_LayoutWinInfo *winInfo;
VDIS_MOSAIC_S *mosaicParam;

if(devId>=VDIS_DEV_MAX)
devId = VDIS_DEV_HDMI;

layoutInfo = &swMsCreateArgs->layoutPrm;

/* init to known default */
memset(layoutInfo, 0, sizeof(*layoutInfo));

mosaicParam = &(gVdisModuleContext.vdisConfig.mosaicParams[devId]);

layoutInfo->onlyCh2WinMapChanged = FALSE;
layoutInfo->outputFPS = 30;
layoutInfo->numWin = 4;

winInfo = &layoutInfo->winInfo[0];
winInfo->width = 960;
winInfo->height = 540;
winInfo->startX = 0;
winInfo->startY = 0;
winInfo->channelNum = 0;
winInfo->bypass = FALSE;

winInfo = &layoutInfo->winInfo[1];
winInfo->width = 960;
winInfo->height = 540;
winInfo->startX = 960;
winInfo->startY = 0;
winInfo->channelNum = 1;
winInfo->bypass = FALSE;

winInfo = &layoutInfo->winInfo[2];
winInfo->width = 960;
winInfo->height = 540;
winInfo->startX = 0;
winInfo->startY = 540;
winInfo->channelNum = 2;
winInfo->bypass = FALSE;

winInfo = &layoutInfo->winInfo[3];
winInfo->width = 960;
winInfo->height = 540;
winInfo->startX = 960;
winInfo->startY = 540;
winInfo->channelNum = 3;
winInfo->bypass = FALSE;

}

Ternence_Hsu:

你好;

看了一下你的代码,没有看出问题;

你可以修改一个swms的布局吗?

只显示通道0,不修改Usecase的结构,测试通道0是否正常,通道1也这样测试一下;

Yang Elroy:

回复 Ternence_Hsu:

谢谢您的回答。与您想的一样,我也尝试着修改了不同布局下的马赛克显示。用窗口0单独显示通道0的话,问题和现在相同。我尝试着分别单独将通道1,2,3显示在窗口0显示的话,运行后在deilink那里会报assert。而用两个窗口分别显示通道0和通道1,ze还是最原始的显示问题。不知道你看到附件中的截图没有?

我在想会不会是内存的问题?

Ternence_Hsu:

回复 Yang Elroy:

在附件中的截图,显示应当是色彩空间的问题,y正常显示,但是sc不对,uv异常

Ternence_Hsu:

回复 Yang Elroy:

通过你的描述,发现有几个问题,不能理解;为什么单独将通道1显示到窗口0的时候,dei 会报 assert的错误呢? (是配置只显示一个通道吗 1 x 1)

Yang Elroy

我将8127前端从sensor替换成了模拟摄像头输入,link连接方式为capturelink->deilink->nsflink->……!目标顺利完成。

我想这里可以确认数据是正常的,通道0画面异常是某个link导致或者参数配置错误导致的我们需要定位是哪个link导致的问题

你刚才的测试swms单独显示通道0 的时候(1 x 1布局显示),画面还是异常,应当不是swms 的问题,更像前端link导致的问题;因为你数据有一个正常的,所以应当是可以找到导致异常出现的link的位置

Yang Elroy:

回复 Ternence_Hsu:

上周四的时候这个问题解决了。解决方法是在原来link连接的基础上,在dei和swmslink之间又添加了一个nsf,也就是link连接如下:capture->dei->nsf0-swms->nsf1->……。

问题解决了,但是我心里还有几个疑问没有解决。

1、我在dm8168上配置link时,相同的link连接方式,各个link的具体参数配置也基本一致,为什么到8127上就不可以了?

2、我在解决问题之前尝试过将swms后的nsf放到swms前,运行后后面报格式错误(后面必须要yuv420sp),我将swms的输出视频格式参数设置为yuv420sp后重新运行,后面仍然会报错。但是我另外在swmslink后加了一个nsf(输出yuv420sp)问题就解决了。swmslink的输出视频格式参数配置后并不生效吗?另外,根据以前的经验,好像很多link的数据格式参数设置后也并不生效。

3、回到问题之初,原来link连接为capture->dei->swms->nsf1->……,swms前的几个link输出格式我都设置为了yuv420sp,但是通道1的显示存在问题。而在swms增加了一个nsf后问题解决,这个同样说明了很多link的数据格式参数配置后并未生效。

好疑惑,因为不止数据格式参数,如分辨率,帧率等很多参数在之前的调试过程中都存在不生效的问题,真搞不懂!

Ternence_Hsu:

回复 Yang Elroy:

Yang Elroy

1、我在dm8168上配置link时,相同的link连接方式,各个link的具体参数配置也基本一致,为什么到8127上就不可以了?

这个不好说,sdk 版本不一样也会有问题,只能单个link模块来分析

Yang Elroy

2、我在解决问题之前尝试过将swms后的nsf放到swms前,运行后后面报格式错误(后面必须要yuv420sp),我将swms的输出视频格式参数设置为yuv420sp后重新运行,后面仍然会报错。但是我另外在swmslink后加了一个nsf(输出yuv420sp)问题就解决了。swmslink的输出视频格式参数配置后并不生效吗?另外,根据以前的经验,好像很多link的数据格式参数设置后也并不生效。

swms link的输出视频格式是有效的,如果设置无效,你可以到 DVRRDK_04.01.00.02/dvr_rdk/mcfw/src_bios6/links_m3vpss/swMs

跟一下代码 (之前遇到过配置输出无效,不记得是版本问题,还是什么,现在在4.0的rdk中是有效的)

Yang Elroy

3、回到问题之初,原来link连接为capture->dei->swms->nsf1->……,swms前的几个link输出格式我都设置为了yuv420sp,但是通道1的显示存在问题。而在swms增加了一个nsf后问题解决,这个同样说明了很多link的数据格式参数配置后并未生效。

这个需要单个link 的具体参数来分析,建议最好是看参数的实现过程,跟一下里面的代码,和参数Usecases中的调用demo

Ternence_Hsu:

回复 Yang Elroy:

你好;

你可以把具体的问题贴出来,哪个link 的哪个参数无效,你使用的sdk 版本,大家一起来分析;

赞(0)
未经允许不得转载:TI中文支持网 » DM8127下usecase中加入swMslink拼接出2*2布局,运行后通道0显示异常,其他通道正常
分享到: 更多 (0)