我们的项目采用DM8168和DVRRDK4.0.1开发多路视频采集、编码和本地显示,其中VPSS-M3在进行采集和本地显示时,在程序正常退出时,会出现在调用SwMsLink_drvDelete函数出现下面的断言错误:
[m3vpss]55318:ERR::linkID:20000030::channelID:-1::errorCode:-9::FileName:links_m3vpss/swMs/swMsLink_drv.c::linuNum:448::errorCondition:(Utils_queIsFull(&pObj->dupObj.dupQue) == TRUE)
具体表现为swMsLink_drv.c中,SwMsLink_drvDelete函数调用SwMsLink_drvDeleteDupObj函数时出现断言失败:
UTILS_assertError((Utils_queIsFull(&pObj->dupObj.dupQue) == TRUE),
status, SWMS_LINK_E_DUPOBJ_DELETE_FAILED, pObj->linkId, -1);
虽然以上错误没导致退出失败,但是还是需要确认一下这个断言错误的原因。我们想知道,一般什么原因会导致SwMsLink_drvDelete时出现上述错误,有什么潜在的问题,并希望能提供一些解决思路。
下面是我们的chain图
另外在我们建立的另一个解码显示的chain中(IPC->DEC->IPC->SWMS LINK->DISPLAY LINK),也有这样的问题。
SWMS link的配置如下:
swMsPrm->numSwMsInst = 1;
swMsPrm->swMsInstId[0] = SYSTEM_SW_MS_SC_INST_SC5;
swMsPrm->swMsInstStartWin[0] = 0; /* start win ID for each scaler instance */
swMsPrm->maxInputQueLen= SYSTEM_SW_MS_DEFAULT_INPUT_QUE_LEN+2;
swMsPrm->maxOutRes = VSYS_STD_720P_60;
swMsPrm->outDataFormat = SYSTEM_DF_YUV422I_YUYV;
swMsPrm->initOutRes= gVdisModuleContext.vdisConfig.deviceParams[VDIS_DEV_HDMI].resolution;
swMsPrm->lineSkipMode = TRUE;
swMsPrm->numOutBuf = NUM_BUFS_PER_CH_SWMS; // =4
swMsPrm->enableOuputDup = TRUE;
swMsPrm->enableProcessTieWithDisplay = TRUE;
swMsPrm->outputBufModified = FALSE;
swMsPrm->enableLayoutGridDraw = gVdisModuleContext.vdisConfig.enableLayoutGridDraw;
LayoutPrm的参数设置函数如下:
static
Int32 VcapVencVdis_getLayoutPrm(UInt32 devId, SwMsLink_CreateParams *swMsCreateArgs
,BoolforceLowCostScaling, UInt8 singleOrDouble)
{
SwMsLink_LayoutPrm *layoutInfo;
SwMsLink_LayoutWinInfo *winInfo;
UInt32 outWidth, outHeight, winId, widthAlign, heightAlign;
MT_Input_Pointer_assert(swMsCreateArgs != NULL);
MultiCh_swMsGetOutSize(swMsCreateArgs->maxOutRes, &outWidth, &outHeight);
widthAlign = 8;
heightAlign = 1;
if(devId>=VDIS_DEV_MAX)
devId = VDIS_DEV_HDMI;
layoutInfo = &swMsCreateArgs->layoutPrm;
/* init to known default */
memset(layoutInfo, 0, sizeof(*layoutInfo));
layoutInfo->onlyCh2WinMapChanged = FALSE;
layoutInfo->outputFPS = 30;
if(singleOrDouble == SYS_SINGLE) //单画面
{
/* get default layout info from user define */
layoutInfo->numWin = 1;//图层就一个窗口
winId = 0;//图层中窗口序号
winInfo = &layoutInfo->winInfo[winId];
winInfo->width = SystemUtils_floor(outWidth, widthAlign); //宽
winInfo->height = SystemUtils_floor(outHeight, heightAlign); //高
winInfo->startX = 0; //起点X
winInfo->startY = 0; //起点Y
winInfo->channelNum = 0 + winId; //通道编号
if (forceLowCostScaling == TRUE)
winInfo->bypass = TRUE; //和缩放方法有关
else
winInfo->bypass = FALSE;
}
else if(singleOrDouble == SYS_DOUBLE) //双画面
{
layoutInfo->numWin = MT_VDIS_CHN_MAX;
for(winId = 0;winId < MT_VDIS_CHN_MAX; winId++)
{
winInfo = &layoutInfo->winInfo[winId];
winInfo->width = SystemUtils_floor(outWidth/2, widthAlign);
winInfo->height = SystemUtils_floor(outHeight/2, heightAlign);
if(winId == 0)
winInfo->startX = 0;
else if(winId == 1)
winInfo->startX = SystemUtils_floor(outWidth/2 , widthAlign );
winInfo->startY = SystemUtils_floor(outHeight/4, heightAlign);
if (forceLowCostScaling == TRUE)
winInfo->bypass = TRUE;
else
winInfo->bypass = FALSE;
winInfo->channelNum = winId;
}
}
else
{
printf(" %s:%s:%d failed!!!please check the input parameter!\n", __FILE__, __func__, __LINE__);
}
return MT_OK;
}
