Dear all:
I am using DVRRDK3.0 with DM8168EVM.
I create a chain, src->sclr->nsf->ipcOutVpss->ipcInVideo->enc->ipcBitsOutVideo->ipcBitsInHost.
When the chain is running, I invoke the folllowing API to change the resolution
System_linkControl(sclrId, SCLR_LINK_CMD_SET_OUTPUTRESOLUTION, &(prms), sizeof(prms), TRUE);
And then began to complain the error:
15678:!!!SLAVE CORE [VPSS-M3] DOWN!!!
SystemLink_copySlaveCoreExceptionContext:146
mmap of [0xbe9e0000:36864]
mmap virt addresss:0x2ab45000
munmap of [0x2ab45000:36864]
SystemLink_copySlaveCoreExceptionContext:153
[m3vpss ] 23374: Assertion @ Line: 1179 in links_m3vpss/sclr/sclrLink_drv.c: status == FVID2_SOK : failed !!!
In what reason is this ?
The following is my demo code:
Void Chains_multiChEncDecLoopBack(Chains_Ctrl *chainsCfg)
{
NullSrcLink_CreateParams srcPrm;
SclrLink_CreateParams sclrPrm;
NsfLink_CreateParams nsfPrm;
EncLink_CreateParams encPrm;
DecLink_CreateParams decPrm;
NullLink_CreateParams snkPrm;
IpcLink_CreateParams ipcOutVpssPrm;
IpcLink_CreateParams ipcInVpssPrm;
IpcLink_CreateParams ipcOutVideoPrm;
IpcLink_CreateParams ipcInVideoPrm;
IpcBitsOutLinkHLOS_CreateParams ipcBitsOutHostPrm;
IpcBitsOutLinkRTOS_CreateParams ipcBitsOutVideoPrm;
IpcBitsInLinkHLOS_CreateParams ipcBitsInHostPrm;
IpcBitsInLinkRTOS_CreateParams ipcBitsInVideoPrm;
Int i;
Bool isProgressive;
System_LinkInfo bitsProducerLinkInfo;
UInt32 sclrId, nsfId;
UInt32 srcId, encId, decId, snkId;
UInt32 ipcOutVpssId, ipcInVpssId;
UInt32 ipcOutVideoId, ipcInVideoId;
UInt32 ipcBitsOutVideoId, ipcBitsInHostId;
UInt32 ipcBitsInVideoId, ipcBitsOutHostId;
char ch;
gChains_ctrl.channelConf[0].enableServer = TRUE;
gChains_ctrl.channelConf[0].enableRtsp = TRUE;
Chains_ipcBitsInit();
CHAINS_INIT_STRUCT(IpcLink_CreateParams, ipcOutVpssPrm);
CHAINS_INIT_STRUCT(IpcLink_CreateParams, ipcInVpssPrm);
CHAINS_INIT_STRUCT(IpcLink_CreateParams, ipcOutVideoPrm);
CHAINS_INIT_STRUCT(IpcLink_CreateParams, ipcInVideoPrm);
CHAINS_INIT_STRUCT(IpcBitsOutLinkHLOS_CreateParams, ipcBitsOutHostPrm);
CHAINS_INIT_STRUCT(IpcBitsOutLinkRTOS_CreateParams, ipcBitsOutVideoPrm);
CHAINS_INIT_STRUCT(IpcBitsInLinkHLOS_CreateParams, ipcBitsInHostPrm);
CHAINS_INIT_STRUCT(IpcBitsInLinkRTOS_CreateParams, ipcBitsInVideoPrm);
CHAINS_INIT_STRUCT(DecLink_CreateParams, decPrm);
CHAINS_INIT_STRUCT(EncLink_CreateParams, encPrm);
srcId = SYSTEM_VPSS_LINK_ID_NULL_SRC_0;
sclrId = SYSTEM_LINK_ID_SCLR_INST_0;
nsfId = SYSTEM_LINK_ID_NSF_0;
encId = SYSTEM_LINK_ID_VENC_0;
decId = SYSTEM_LINK_ID_VDEC_0;
snkId = SYSTEM_VPSS_LINK_ID_NULL_0;
ipcOutVpssId = SYSTEM_VPSS_LINK_ID_IPC_OUT_M3_0;
ipcInVideoId = SYSTEM_VIDEO_LINK_ID_IPC_IN_M3_0;
ipcOutVideoId = SYSTEM_VIDEO_LINK_ID_IPC_OUT_M3_0;
ipcInVpssId = SYSTEM_VPSS_LINK_ID_IPC_IN_M3_0;
ipcBitsOutVideoId = SYSTEM_VIDEO_LINK_ID_IPC_BITS_OUT_0;
ipcBitsInHostId = SYSTEM_HOST_LINK_ID_IPC_BITS_IN_0;
ipcBitsOutHostId = SYSTEM_HOST_LINK_ID_IPC_BITS_OUT_0;
ipcBitsInVideoId = SYSTEM_VIDEO_LINK_ID_IPC_BITS_IN_0;
srcPrm.tilerEnable = TRUE;
decPrm.tilerEnable = TRUE;
isProgressive = TRUE;
System_linkControl(
SYSTEM_LINK_ID_M3VIDEO,
SYSTEM_COMMON_CMD_SET_CH2IVAHD_MAP_TBL,
&systemVid_encDecIvaChMapTbl,
sizeof(SystemVideo_Ivahd2ChMap_Tbl),
TRUE
);
srcPrm.outQueParams.nextLink = sclrId;
if (isProgressive)
{
srcPrm.timerPeriod = 16;
}
else
{
srcPrm.timerPeriod = 15;
}
srcPrm.inputInfo.numCh = SRC_NUM_CH;
for(i = 0; i < srcPrm.inputInfo.numCh; i++)
{
System_LinkChInfo *pChInfo;
pChInfo = &srcPrm.inputInfo.chInfo[i];
pChInfo->dataFormat = SYSTEM_DF_YUV420SP_UV;
pChInfo->memType = SYSTEM_MT_TILEDMEM;
pChInfo->width = 1920;
if (isProgressive)
{
pChInfo->height = 1080;
pChInfo->scanFormat = SYSTEM_SF_PROGRESSIVE;
}
else
{
pChInfo->height = 480/2;
pChInfo->scanFormat = SYSTEM_SF_INTERLACED;
}
pChInfo->pitch[0] = SystemUtils_align(pChInfo->width+pChInfo->startX,
SYSTEM_BUFFER_ALIGNMENT);
pChInfo->pitch[1] = pChInfo->pitch[0];
pChInfo->pitch[2] = 0;
}
SclrLink_CreateParams_Init(&sclrPrm);
sclrPrm.inQueParams.prevLinkId = srcId;
sclrPrm.inQueParams.prevLinkQueId = 0;
sclrPrm.outQueParams.nextLink = nsfId;
sclrPrm.tilerEnable = FALSE;
sclrPrm.enableLineSkipSc = FALSE;
sclrPrm.inputFrameRate = 60;
sclrPrm.outputFrameRate = 60;
sclrPrm.scaleMode = SCLR_SCALE_MODE_ABSOLUTE;
sclrPrm.outScaleFactor.absoluteResolution.outWidth = 1920;
sclrPrm.outScaleFactor.absoluteResolution.outHeight = 1080;
NsfLink_CreateParams_Init(&nsfPrm);
nsfPrm.bypassNsf = TRUE;
nsfPrm.tilerEnable = FALSE;
nsfPrm.inQueParams.prevLinkId = sclrId;
nsfPrm.inQueParams.prevLinkQueId = 0;
nsfPrm.numOutQue = 1;
nsfPrm.numBufsPerCh = 0;
nsfPrm.inputFrameRate = 60;
nsfPrm.outputFrameRate = 60;
nsfPrm.outQueParams[0].nextLink = ipcOutVpssId;
ipcOutVpssPrm.inQueParams.prevLinkId = nsfId;
ipcOutVpssPrm.inQueParams.prevLinkQueId = 0;
ipcOutVpssPrm.numOutQue = 1;
ipcOutVpssPrm.outQueParams[0].nextLink = ipcInVideoId;
ipcOutVpssPrm.notifyNextLink = TRUE;
ipcOutVpssPrm.notifyPrevLink = TRUE;
ipcOutVpssPrm.noNotifyMode = FALSE;
ipcInVideoPrm.inQueParams.prevLinkId = ipcOutVpssId;
ipcInVideoPrm.inQueParams.prevLinkQueId = 0;
ipcInVideoPrm.numOutQue = 1;
ipcInVideoPrm.outQueParams[0].nextLink = encId;
ipcInVideoPrm.notifyNextLink = TRUE;
ipcInVideoPrm.notifyPrevLink = TRUE;
ipcInVideoPrm.noNotifyMode = FALSE;
for (i = 0; i < SRC_NUM_CH; i++)
{
encPrm.chCreateParams[i].format = IVIDEO_H264HP;
encPrm.chCreateParams[i].profile = IH264_HIGH_PROFILE;
encPrm.chCreateParams[i].dataLayout = IVIDEO_FIELD_SEPARATED;
if (isProgressive)
encPrm.chCreateParams[i].fieldMergeEncodeEnable = FALSE;
else
encPrm.chCreateParams[i].fieldMergeEncodeEnable = TRUE;
encPrm.chCreateParams[i].maxBitRate = -1;
encPrm.chCreateParams[i].encodingPreset = XDM_USER_DEFINED;//XDM_DEFAULT;
encPrm.chCreateParams[i].rateControlPreset = IVIDEO_USER_DEFINED;//0;
encPrm.chCreateParams[i].enableHighSpeed = 0;
encPrm.chCreateParams[i].enableAnalyticinfo = 0;
encPrm.chCreateParams[i].enableWaterMarking = 0;
encPrm.chCreateParams[i].rateControlPreset = IVIDEO_STORAGE;
encPrm.chCreateParams[i].defaultDynamicParams.inputFrameRate = 60;
encPrm.chCreateParams[i].defaultDynamicParams.targetFrameRate = 60;
encPrm.chCreateParams[i].defaultDynamicParams.targetBitRate = (2 * 1000 * 1000);
encPrm.chCreateParams[i].defaultDynamicParams.intraFrameInterval = 60;
encPrm.chCreateParams[i].defaultDynamicParams.interFrameInterval = 1;
encPrm.chCreateParams[i].defaultDynamicParams.mvAccuracy = IVIDENC2_MOTIONVECTOR_QUARTERPEL;
encPrm.chCreateParams[i].defaultDynamicParams.rcAlg = 0 ;
encPrm.chCreateParams[i].defaultDynamicParams.qpMin = 10;
encPrm.chCreateParams[i].defaultDynamicParams.qpMax = 40;
encPrm.chCreateParams[i].defaultDynamicParams.qpInit = -1;
encPrm.chCreateParams[i].defaultDynamicParams.vbrDuration = 8;
encPrm.chCreateParams[i].defaultDynamicParams.vbrSensitivity = 0;
}
encPrm.inQueParams.prevLinkId = ipcInVideoId;
encPrm.inQueParams.prevLinkQueId = 0;
encPrm.outQueParams.nextLink = ipcBitsOutVideoId;
encPrm.numBufPerCh[0] = 6;
encPrm.numBufPerCh[1] = 6;
encPrm.numBufPerCh[2] = 6;
encPrm.numBufPerCh[3] = 6;
ipcBitsOutVideoPrm.baseCreateParams.inQueParams.prevLinkId = encId;
ipcBitsOutVideoPrm.baseCreateParams.inQueParams.prevLinkQueId = 0;
ipcBitsOutVideoPrm.baseCreateParams.numOutQue = 1;
ipcBitsOutVideoPrm.baseCreateParams.outQueParams[0].nextLink = ipcBitsInHostId;
Chains_ipcBitsInitCreateParams_BitsOutRTOS(&ipcBitsOutVideoPrm, TRUE);
ipcBitsInHostPrm.baseCreateParams.inQueParams.prevLinkId = ipcBitsOutVideoId;
ipcBitsInHostPrm.baseCreateParams.inQueParams.prevLinkQueId = 0;
ipcBitsInHostPrm.baseCreateParams.outQueParams[0].nextLink = SYSTEM_LINK_ID_INVALID;
Chains_ipcBitsInitCreateParams_BitsInHLOS(&ipcBitsInHostPrm);
System_linkCreate(srcId, &srcPrm, sizeof(srcPrm));
System_linkCreate(sclrId , &sclrPrm, sizeof(sclrPrm));
System_linkCreate(nsfId , &nsfPrm, sizeof(nsfPrm));
System_linkCreate(ipcOutVpssId , &ipcOutVpssPrm , sizeof(ipcOutVpssPrm) );
System_linkCreate(ipcInVideoId , &ipcInVideoPrm , sizeof(ipcInVideoPrm) );
System_linkCreate(encId, &encPrm, sizeof(encPrm));
System_linkCreate(ipcBitsOutVideoId, &ipcBitsOutVideoPrm, sizeof(ipcBitsOutVideoPrm));
System_linkCreate(ipcBitsInHostId, &ipcBitsInHostPrm, sizeof(ipcBitsInHostPrm));
Chains_memPrintHeapStatus();
// Utils_encdecHdvicpPrfInit();
{
System_linkStart(ipcBitsInHostId);
System_linkStart(ipcBitsOutVideoId);
System_linkStart(encId);
System_linkStart(ipcInVideoId);
System_linkStart(ipcOutVpssId);
System_linkStart(nsfId);
System_linkStart(sclrId);
System_linkStart(srcId);
/* Start taking CPU load just before starting of links */
Chains_prfLoadCalcEnable(TRUE, FALSE, FALSE);
while(1)
{
ch = Chains_menuRunTime();
if(ch == '0')
break;
if(ch == 'i')
{
System_linkControl(encId,
ENC_LINK_CMD_PRINT_IVAHD_STATISTICS, NULL, 0, TRUE);
}
if(ch == 's')
{
SclrLink_chDynamicSetOutRes prms = { 0 };
prms.chId = 0;
prms.width = 1280;
prms.height = 720;
System_linkControl(sclrId,
SCLR_LINK_CMD_SET_OUTPUTRESOLUTION, &(prms), sizeof(prms), TRUE);
}
}
Chains_ipcBitsStop();
System_linkStop(srcId);
System_linkStop(sclrId);
System_linkStop(nsfId);
System_linkStop(ipcOutVpssId);
System_linkStop(ipcInVideoId);
System_linkStop(encId);
System_linkStop(ipcBitsOutVideoId);
System_linkStop(ipcBitsInHostId);
}
System_linkDelete(srcId);
System_linkDelete(sclrId);
System_linkDelete(nsfId);
System_linkDelete(ipcOutVpssId );
System_linkDelete(ipcInVideoId );
System_linkDelete(encId);
System_linkDelete(ipcBitsOutVideoId);
System_linkDelete(ipcBitsInHostId);
/* Print the HWI, SWI and all tasks load */
/* Reset the accumulated timer ticks */
Chains_prfLoadCalcEnable(FALSE, TRUE, FALSE);
//Utils_encdecHdvicpPrfPrint();
Chains_ipcBitsExit();
}