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.

关于DM8168 VPSS-M3 swMsLink断言错误的



    我们的项目采用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;

}