专家好!我在使用DM385开发板上外挂了一个tvp5150片,用来接CVBS摄像头,
tvp5150输出8bit 内嵌同步的CVBS(NTSC或PAL)信号到DM385的VIP1 PORTA的D0~D7位上,软件版本使用的是dvr rdk 4.0;
当我使用数据流:
tvp5150(cvbs) -> capture -> encode -> send
程序可以正确运行,只不过得到的图像只有一半,所以我们认为应该加入DEI模块,
当加入DEI模块后数据流如下:
tvp5150(cvbs) -> capture ->DEI-> encode -> send
代码如下:
/** ============================================================================
*
* Chains_SelCapSelRecv.c
*
* Author :
*
* Date : June 7, 2015
*
* Description: Cap + Enc + Send
* Net + Dec + Display
*
* capture-|-vipInst0->|->dup->enc->send
*
*
* receive->dec->sel-|->swms0->display0
* ============================================================================
*/
#include <demos/link_api_demos/common/chains.h>
#include <mcfw/interfaces/ti_vcap.h>
//#include <>
static SystemVideo_Ivahd2ChMap_Tbl systemVid_encDecIvaChMapTbl =
{
.isPopulated = 1,
.ivaMap[0] =
{
.EncNumCh = 1,
.EncChList = {0},
.DecNumCh = 0,
.DecChList = {0},
},
.ivaMap[1] =
{
.EncNumCh = 0,
.EncChList = {0},
.DecNumCh = 1,
.DecChList = {0},
},
.ivaMap[2] =
{
.EncNumCh = 1,
.EncChList = {1},
.DecNumCh = 1,
.DecChList = {1},
},
};
Void Chains_SelCapSelRecv(Chains_Ctrl *chainsCfg)
{
CaptureLink_CreateParams capturePrm;
DeiLink_CreateParams deiPrm;//by ct
CaptureLink_VipInstParams *pCaptureInstPrm;
CaptureLink_OutParams *pCaptureOutPrm;
DupLink_CreateParams dupPrm;
IpcLink_CreateParams ipcOutVpssPrm;
IpcLink_CreateParams ipcInVideoPrm;
EncLink_CreateParams encPrm;
IpcBitsOutLinkRTOS_CreateParams ipcBitsOutVideoPrm;
IpcBitsInLinkHLOS_CreateParams ipcBitsInHostPrm;
UInt32 captureId, vipInstId;
UInt32 deiId;
UInt32 dupId;
UInt32 ipcOutVpssId;
UInt32 ipcInVideoId;
UInt32 encId;
UInt32 ipcBitsOutVideoId;
UInt32 ipcBitsInHostId;
IpcBitsOutLinkHLOS_CreateParams ipcBitsOutHostPrm;
IpcBitsInLinkRTOS_CreateParams ipcBitsInVideoPrm;
DecLink_CreateParams decPrm;
IpcLink_CreateParams ipcOutVideoEncPrm;
IpcLink_CreateParams ipcInVpssEncPrm;
SelectLink_CreateParams selPrm;
SwMsLink_CreateParams swMsPrm[CHAINS_SW_MS_MAX_DISPLAYS];
DisplayLink_CreateParams displayPrm[CHAINS_SW_MS_MAX_DISPLAYS];
UInt32 ipcBitsOutHostId;
UInt32 ipcBitsInVideoId;
UInt32 decId;
UInt32 ipcOutVideoEncId;
UInt32 ipcInVpssEncId;
UInt32 selId;
UInt32 swMsId[CHAINS_SW_MS_MAX_DISPLAYS];
UInt32 displayId[CHAINS_SW_MS_MAX_DISPLAYS];
int i;
for(i =0;i<gChains_ctrl.chRecNum;i++)
{
gChains_ctrl.chCfg[i+gChains_ctrl.chCapNum].channel = i;
}
Chains_ipcBitsInit();
System_linkControl(
SYSTEM_LINK_ID_M3VPSS,
SYSTEM_M3VPSS_CMD_RESET_VIDEO_DEVICES,
NULL,
0,
TRUE);
System_linkControl(
SYSTEM_LINK_ID_M3VIDEO,
SYSTEM_COMMON_CMD_SET_CH2IVAHD_MAP_TBL,
&systemVid_encDecIvaChMapTbl,
sizeof(SystemVideo_Ivahd2ChMap_Tbl),
TRUE
);
/*
* Local capture + Enc + send
*/
VCAP_PARAMS_S prm;
Vcap_params_init(&prm);
if(chainsCfg->chCapNum > 0)
{
CHAINS_INIT_STRUCT(CaptureLink_CreateParams,capturePrm);
CHAINS_INIT_STRUCT(DeiLink_CreateParams ,deiPrm);//by ct
CHAINS_INIT_STRUCT(IpcLink_CreateParams,ipcOutVpssPrm);
CHAINS_INIT_STRUCT(IpcLink_CreateParams,ipcInVideoPrm);
CHAINS_INIT_STRUCT(EncLink_CreateParams,encPrm);
CHAINS_INIT_STRUCT(IpcBitsOutLinkRTOS_CreateParams,ipcBitsOutVideoPrm);
CHAINS_INIT_STRUCT(IpcBitsInLinkHLOS_CreateParams,ipcBitsInHostPrm);
captureId = SYSTEM_LINK_ID_CAPTURE;
dupId =SYSTEM_VPSS_LINK_ID_DUP_0;
ipcOutVpssId = SYSTEM_VPSS_LINK_ID_IPC_OUT_M3_0;
ipcInVideoId = SYSTEM_VIDEO_LINK_ID_IPC_IN_M3_0;
encId = SYSTEM_LINK_ID_VENC_0;
ipcBitsOutVideoId = SYSTEM_VIDEO_LINK_ID_IPC_BITS_OUT_0;
ipcBitsInHostId = SYSTEM_HOST_LINK_ID_IPC_BITS_IN_0;
capturePrm.numVipInst = chainsCfg->chCapNum;
capturePrm.tilerEnable = TRUE;
capturePrm.numBufsPerCh = 16;
capturePrm.numExtraBufs = 0;
capturePrm.maxBlindAreasPerCh = 0;
capturePrm.isPalMode = TRUE;
capturePrm.enableSdCrop = FALSE;
capturePrm.doCropInCapture = FALSE;
//BY CT BEGIN
deiId=SYSTEM_LINK_ID_DEI_0;
deiPrm.inQueParams.prevLinkId = captureId;
deiPrm.inQueParams.prevLinkQueId = 0;
/* Set Output Scaling at DEI based on ratio */
//deiPrm.outScaleFactor[DEI_LINK_OUT_QUE_DEI_SC][0].scaleMode = DEI_SCALE_MODE_RATIO;
// deiPrm.outScaleFactor[DEI_LINK_OUT_QUE_DEI_SC][0].ratio.widthRatio.numerator = 1;
// deiPrm.outScaleFactor[DEI_LINK_OUT_QUE_DEI_SC][0].ratio.widthRatio.denominator = 1;
// deiPrm.outScaleFactor[DEI_LINK_OUT_QUE_DEI_SC][0].ratio.heightRatio.numerator = 1;
// deiPrm.outScaleFactor[DEI_LINK_OUT_QUE_DEI_SC][0].ratio.heightRatio.denominator = 1;
// for (i=1; i < DEI_LINK_MAX_CH; i++)
// deiPrm.outScaleFactor[DEI_LINK_OUT_QUE_DEI_SC][i] = deiPrm.outScaleFactor[DEI_LINK_OUT_QUE_DEI_SC][0];
deiPrm.outScaleFactor[DEI_LINK_OUT_QUE_VIP_SC][0].scaleMode = DEI_SCALE_MODE_RATIO;
deiPrm.outScaleFactor[DEI_LINK_OUT_QUE_VIP_SC][0].ratio.heightRatio.numerator = 1;
deiPrm.outScaleFactor[DEI_LINK_OUT_QUE_VIP_SC][0].ratio.heightRatio.denominator = 1;
deiPrm.outScaleFactor[DEI_LINK_OUT_QUE_VIP_SC][0].ratio.widthRatio.numerator = 1;
deiPrm.outScaleFactor[DEI_LINK_OUT_QUE_VIP_SC][0].ratio.widthRatio.denominator = 1;
for (i=1; i < DEI_LINK_MAX_CH; i++)
deiPrm.outScaleFactor[DEI_LINK_OUT_QUE_VIP_SC][i] = deiPrm.outScaleFactor[DEI_LINK_OUT_QUE_VIP_SC][0];
// deiPrm.outScaleFactor[DEI_LINK_OUT_QUE_VIP_SC_SECONDARY_OUT][0].scaleMode = DEI_SCALE_MODE_RATIO;
// deiPrm.outScaleFactor[DEI_LINK_OUT_QUE_VIP_SC_SECONDARY_OUT][0].ratio.heightRatio.numerator = 1;
// deiPrm.outScaleFactor[DEI_LINK_OUT_QUE_VIP_SC_SECONDARY_OUT][0].ratio.heightRatio.denominator = 2;
// deiPrm.outScaleFactor[DEI_LINK_OUT_QUE_VIP_SC_SECONDARY_OUT][0].ratio.widthRatio.numerator = 1;
// deiPrm.outScaleFactor[DEI_LINK_OUT_QUE_VIP_SC_SECONDARY_OUT][0].ratio.widthRatio.denominator = 2;
// for (i=1; i < DEI_LINK_MAX_CH; i++)
// deiPrm.outScaleFactor[DEI_LINK_OUT_QUE_VIP_SC_SECONDARY_OUT][i] = deiPrm.outScaleFactor[DEI_LINK_OUT_QUE_VIP_SC_SECONDARY_OUT][0];
deiPrm.enableOut[DEI_LINK_OUT_QUE_DEI_SC] = FALSE;
deiPrm.enableOut[DEI_LINK_OUT_QUE_VIP_SC] = TRUE;
deiPrm.enableDeiForceBypass =FALSE;
deiPrm.enableOut[DEI_LINK_OUT_QUE_VIP_SC_SECONDARY_OUT] = FALSE;
//deiPrm.outQueParams[DEI_LINK_OUT_QUE_DEI_SC].nextLink = dupId;
deiPrm.outQueParams[DEI_LINK_OUT_QUE_VIP_SC].nextLink = ipcOutVpssId;
//deiPrm.outQueParams[DEI_LINK_OUT_QUE_VIP_SC_SECONDARY_OUT].nextLink = dupId;
deiPrm.tilerEnable[DEI_LINK_OUT_QUE_VIP_SC] = FALSE;
deiPrm.comprEnable = FALSE;
deiPrm.setVipScYuv422Format = FALSE;
deiPrm.inputDeiFrameRate =25u;
deiPrm.outputDeiFrameRate =25u;
//END
for(i=0; i<capturePrm.numVipInst; i++)
{
#if defined(TI8107_INS)
vipInstId = SYSTEM_CAPTURE_INST_VIP0_PORTA + 2 * gChains_ctrl.chCfg[i].channel;
pCaptureInstPrm = &capturePrm.vipInst[i];
pCaptureInstPrm->videoIfMode = SYSTEM_CAPT_VIDEO_IF_MODE_8BIT;
#endif
prm.channelParams[i].deviceId = vipInstId;
prm.enableConfigExtVideoDecoder = TRUE;
prm.deviceParams[vipInstId].standard = chainsCfg->chCfg[i].inStd;
pCaptureInstPrm->vipInstId = vipInstId%SYSTEM_CAPTURE_INST_MAX;
pCaptureInstPrm->inDataFormat = SYSTEM_DF_YUV422P;
//pCaptureInstPrm->standard = chainsCfg->chCfg[i].inStd;
pCaptureInstPrm->standard =SYSTEM_STD_D1;
pCaptureInstPrm->numOutput = 1;
pCaptureInstPrm->numChPerOutput = 1;
pCaptureOutPrm = &pCaptureInstPrm->outParams[0];
pCaptureOutPrm->dataFormat = SYSTEM_DF_YUV420SP_UV;
pCaptureOutPrm->scEnable = FALSE;
pCaptureOutPrm->outQueId = 0;
}
capturePrm.outQueParams[0].nextLink = deiId; //by ct
dupPrm.inQueParams.prevLinkId = deiId; //by ct
dupPrm.inQueParams.prevLinkQueId = 0;
dupPrm.numOutQue = 1;
//dupPrm.outQueParams[0].nextLink = ipcOutVpssId;
dupPrm.notifyNextLink = TRUE;
ipcOutVpssPrm.inQueParams.prevLinkId = deiId;
ipcOutVpssPrm.inQueParams.prevLinkQueId = 0;
ipcOutVpssPrm.outQueParams[0].nextLink = ipcInVideoId;
ipcOutVpssPrm.numOutQue = 1;
ipcOutVpssPrm.numChPerOutQue[0] = 0;
ipcOutVpssPrm.notifyNextLink = TRUE;
ipcOutVpssPrm.notifyPrevLink = FALSE;
ipcOutVpssPrm.noNotifyMode = FALSE;
ipcOutVpssPrm.equallyDivideChAcrossOutQues = FALSE;
ipcInVideoPrm.inQueParams.prevLinkId = ipcOutVpssId;
ipcInVideoPrm.inQueParams.prevLinkQueId = 0;
ipcInVideoPrm.outQueParams[0].nextLink = encId;
ipcInVideoPrm.numOutQue = 1;
ipcInVideoPrm.numChPerOutQue[0] = 0;
ipcInVideoPrm.notifyNextLink = TRUE;
ipcInVideoPrm.notifyPrevLink = FALSE;
ipcInVideoPrm.noNotifyMode = FALSE;
ipcInVideoPrm.equallyDivideChAcrossOutQues = FALSE;
for (i=0; i<chainsCfg->chCapNum; i++) {
encPrm.chCreateParams[i].format = chainsCfg->chCfg[i].encFormat;
encPrm.chCreateParams[i].profile = chainsCfg->chCfg[i].encProfile;
encPrm.chCreateParams[i].dataLayout = IVIDEO_FIELD_SEPARATED;
encPrm.chCreateParams[i].fieldMergeEncodeEnable = FALSE;
encPrm.chCreateParams[i].enableAnalyticinfo = FALSE;
encPrm.chCreateParams[i].enableWaterMarking = FALSE;
encPrm.chCreateParams[i].encodingPreset = XDM_USER_DEFINED;
encPrm.chCreateParams[i].rateControlPreset = IVIDEO_USER_DEFINED;
encPrm.chCreateParams[i].enableHighSpeed = FALSE;
encPrm.chCreateParams[i].defaultDynamicParams.interFrameInterval = 1;
encPrm.chCreateParams[i].defaultDynamicParams.intraFrameInterval = chainsCfg->chCfg[i].intraFrameInterval;
encPrm.chCreateParams[i].defaultDynamicParams.inputFrameRate = chainsCfg->chCfg[i].inFrameRate;
encPrm.chCreateParams[i].defaultDynamicParams.targetFrameRate = chainsCfg->chCfg[i].encFrameRate;
encPrm.chCreateParams[i].defaultDynamicParams.targetBitRate = chainsCfg->chCfg[i].bitRate;
encPrm.chCreateParams[i].defaultDynamicParams.mvAccuracy = IVIDENC2_MOTIONVECTOR_QUARTERPEL;
encPrm.chCreateParams[i].defaultDynamicParams.rcAlg = chainsCfg->chCfg[i].rateCtrl;
encPrm.chCreateParams[i].defaultDynamicParams.qpMin = 0;
encPrm.chCreateParams[i].defaultDynamicParams.qpMax = 51;
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] = 0;
ipcBitsOutVideoPrm.baseCreateParams.inQueParams.prevLinkId = encId;
ipcBitsOutVideoPrm.baseCreateParams.inQueParams.prevLinkQueId = 0;
ipcBitsOutVideoPrm.baseCreateParams.outQueParams[0].nextLink = ipcBitsInHostId;
ipcBitsOutVideoPrm.baseCreateParams.numOutQue = 1;
ipcBitsOutVideoPrm.baseCreateParams.notifyNextLink = FALSE;
ipcBitsOutVideoPrm.baseCreateParams.notifyPrevLink = FALSE;
ipcBitsOutVideoPrm.baseCreateParams.noNotifyMode = TRUE;
Chains_ipcBitsInitCreateParams_BitsOutRTOS(&ipcBitsOutVideoPrm,FALSE);
ipcBitsInHostPrm.baseCreateParams.inQueParams.prevLinkId = ipcBitsOutVideoId;
ipcBitsInHostPrm.baseCreateParams.inQueParams.prevLinkQueId = 0;
ipcBitsInHostPrm.baseCreateParams.numOutQue = 1;
ipcBitsInHostPrm.baseCreateParams.numChPerOutQue[0] = 0;
ipcBitsInHostPrm.baseCreateParams.notifyNextLink = FALSE;
ipcBitsInHostPrm.baseCreateParams.notifyPrevLink = FALSE;
ipcBitsInHostPrm.baseCreateParams.noNotifyMode = TRUE;
Chains_ipcBitsInitCreateParams_BitsInHLOS(&ipcBitsInHostPrm);
}
//Network
if(chainsCfg->chRecNum > 0)
{
CHAINS_INIT_STRUCT(IpcBitsOutLinkHLOS_CreateParams,ipcBitsOutHostPrm);
CHAINS_INIT_STRUCT(IpcBitsInLinkRTOS_CreateParams,ipcBitsInVideoPrm);
CHAINS_INIT_STRUCT(DecLink_CreateParams,decPrm);
CHAINS_INIT_STRUCT(IpcLink_CreateParams,ipcOutVideoEncPrm);
CHAINS_INIT_STRUCT(IpcLink_CreateParams,ipcInVpssEncPrm);
CHAINS_INIT_STRUCT(SelectLink_CreateParams,selPrm);
for (i=0; i<CHAINS_SW_MS_MAX_DISPLAYS; i++) {
CHAINS_INIT_STRUCT(SwMsLink_CreateParams,swMsPrm[i]);
CHAINS_INIT_STRUCT(DisplayLink_CreateParams,displayPrm[i]);
}
ipcBitsOutHostId = SYSTEM_HOST_LINK_ID_IPC_BITS_OUT_0;
ipcBitsInVideoId = SYSTEM_VIDEO_LINK_ID_IPC_BITS_IN_0;
decId = SYSTEM_LINK_ID_VDEC_0;
ipcOutVideoEncId = SYSTEM_VIDEO_LINK_ID_IPC_OUT_M3_1;
ipcInVpssEncId = SYSTEM_VPSS_LINK_ID_IPC_IN_M3_1;
selId = SYSTEM_VPSS_LINK_ID_SELECT_0;
swMsId[0] = SYSTEM_LINK_ID_SW_MS_MULTI_INST_0;
swMsId[1] = SYSTEM_LINK_ID_SW_MS_MULTI_INST_1;
displayId[0] = SYSTEM_LINK_ID_DISPLAY_0;
displayId[1] = SYSTEM_LINK_ID_DISPLAY_1;
for(i=chainsCfg->chCapNum; i<chainsCfg->chNum; i++)
{
chainsCfg->displayRes[i-chainsCfg->chCapNum] = chainsCfg->displayRes[i];
}
Chains_displayCtrlInit(chainsCfg->displayRes);
System_LinkQueInfo queInfo;
queInfo.numCh = chainsCfg->chRecNum;
for (i=0; i<chainsCfg->chRecNum; i++) {
queInfo.chInfo[i].bufType = SYSTEM_BUF_TYPE_VIDBITSTREAM;
queInfo.chInfo[i].codingformat = chainsCfg->chCfg[i + chainsCfg->chCapNum].encFormat;
queInfo.chInfo[i].height = chainsCfg->chCfg[i + chainsCfg->chCapNum].outHeight;
queInfo.chInfo[i].width = chainsCfg->chCfg[i + chainsCfg->chCapNum].outWidth;
queInfo.chInfo[i].memType = SYSTEM_MT_TILEDMEM;
queInfo.chInfo[i].dataFormat = SYSTEM_DF_YUV420P;
queInfo.chInfo[i].scanFormat = SYSTEM_SF_PROGRESSIVE;
}
ipcBitsOutHostPrm.baseCreateParams.numOutQue = 1;
ipcBitsOutHostPrm.baseCreateParams.numChPerOutQue[0] = chainsCfg->chRecNum;
ipcBitsOutHostPrm.baseCreateParams.outQueParams[0].nextLink = ipcBitsInVideoId;
Chains_ipcBitsInitCreateParams_BitsOutHLOS(&ipcBitsOutHostPrm, &queInfo);
ipcBitsInVideoPrm.baseCreateParams.inQueParams.prevLinkId = ipcBitsOutHostId;
ipcBitsInVideoPrm.baseCreateParams.inQueParams.prevLinkQueId = 0;
ipcBitsInVideoPrm.baseCreateParams.numOutQue = 1;
ipcBitsInVideoPrm.baseCreateParams.numChPerOutQue[0] = chainsCfg->chRecNum;
ipcBitsInVideoPrm.baseCreateParams.outQueParams[0].nextLink = decId;
Chains_ipcBitsInitCreateParams_BitsInRTOS(&ipcBitsInVideoPrm, TRUE);
for (i=0; i<chainsCfg->chRecNum; i++) {
decPrm.chCreateParams[i].format = chainsCfg->chCfg[i + chainsCfg->chCapNum].encFormat;
decPrm.chCreateParams[i].profile = IH264VDEC_PROFILE_ANY;
decPrm.chCreateParams[i].targetMaxWidth = chainsCfg->chCfg[i + chainsCfg->chCapNum].outWidth;
decPrm.chCreateParams[i].targetMaxHeight = chainsCfg->chCfg[i + chainsCfg->chCapNum].outHeight;
decPrm.chCreateParams[i].fieldMergeDecodeEnable = FALSE;
decPrm.chCreateParams[i].algCreateStatus = DEC_LINK_ALG_CREATE_STATUS_CREATE;
decPrm.chCreateParams[i].defaultDynamicParams.targetFrameRate = chainsCfg->chCfg[i + chainsCfg->chCapNum].encFrameRate;
decPrm.chCreateParams[i].defaultDynamicParams.targetBitRate = chainsCfg->chCfg[i + chainsCfg->chCapNum].bitRate;
decPrm.chCreateParams[i].numBufPerCh = 0;
decPrm.chCreateParams[i].tilerEnable = TRUE;
}
decPrm.inQueParams.prevLinkId = ipcBitsInVideoId;
decPrm.inQueParams.prevLinkQueId = 0;
decPrm.outQueParams.nextLink = ipcOutVideoEncId;
ipcOutVideoEncPrm.inQueParams.prevLinkId = decId;
ipcOutVideoEncPrm.inQueParams.prevLinkQueId = 0;
ipcOutVideoEncPrm.numOutQue = 1;
ipcOutVideoEncPrm.outQueParams[0].nextLink = ipcInVpssEncId;
ipcOutVideoEncPrm.notifyNextLink = TRUE;
ipcOutVideoEncPrm.notifyPrevLink = FALSE;
ipcOutVideoEncPrm.noNotifyMode = FALSE;
ipcInVpssEncPrm.inQueParams.prevLinkId = ipcOutVideoEncId;
ipcInVpssEncPrm.inQueParams.prevLinkQueId = 0;
ipcInVpssEncPrm.numOutQue = 1;
ipcInVpssEncPrm.outQueParams[0].nextLink = selId;
ipcInVpssEncPrm.notifyNextLink = TRUE;
ipcInVpssEncPrm.notifyPrevLink = TRUE;//modify
ipcInVpssEncPrm.noNotifyMode = FALSE;
selPrm.inQueParams.prevLinkId = ipcInVpssEncId;
selPrm.inQueParams.prevLinkQueId = 0;
selPrm.numOutQue = chainsCfg->chRecNum;
selPrm.outQueParams[0].nextLink = swMsId[0];
selPrm.outQueChInfo[0].outQueId = 0;
selPrm.outQueChInfo[0].numOutCh = 1;
selPrm.outQueChInfo[0].inChNum[0] = 0;
selPrm.outQueParams[1].nextLink = swMsId[1];
selPrm.outQueChInfo[1].outQueId = 1;
selPrm.outQueChInfo[1].numOutCh = 1;
selPrm.outQueChInfo[1].inChNum[0] = 1;
for (i=0; i<chainsCfg->chRecNum; i++) {
swMsPrm[i].numSwMsInst = 1;
swMsPrm[i].swMsInstId[0] = (i!=0) ? SYSTEM_SW_MS_SC_INST_VIP1_SC : SYSTEM_SW_MS_SC_INST_DEI_SC_NO_DEI;
swMsPrm[i].inQueParams.prevLinkId = selId;
swMsPrm[i].inQueParams.prevLinkQueId = i;
swMsPrm[i].outQueParams.nextLink = displayId[i];
swMsPrm[i].lineSkipMode = FALSE;
swMsPrm[i].enableLayoutGridDraw = TRUE;
swMsPrm[i].layoutPrm.outputFPS = chainsCfg->chCfg[i + chainsCfg->chCapNum].encFrameRate;
swMsPrm[i].maxInputQueLen = SYSTEM_SW_MS_DEFAULT_INPUT_QUE_LEN;
swMsPrm[i].maxOutRes = chainsCfg->displayRes[i];
swMsPrm[i].numOutBuf = 0;
Chains_swMsGenerateLayoutParams(i, 2, &swMsPrm[i]);
displayPrm[i].numInputQueues = 1;
displayPrm[i].activeQueue = 0;
displayPrm[i].inQueParams[0].prevLinkId = swMsId[i];
displayPrm[i].inQueParams[0].prevLinkQueId = 0;
displayPrm[i].displayRes = chainsCfg->displayRes[i];
displayPrm[i].displayId = DISPLAY_LINK_DISPLAY_AUTO_SELECT;
displayPrm[i].forceFieldSeparatedInputMode = FALSE;
}
}
/*
* Create Links
*/
if (chainsCfg->chCapNum > 0)
{
System_linkCreate(captureId, &capturePrm, sizeof(capturePrm));
System_linkCreate(deiId, &deiPrm, sizeof(deiPrm));
//System_linkCreate(dupId, &dupPrm, sizeof(dupPrm));
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));
}
if (chainsCfg->chRecNum > 0)
{
System_linkCreate(ipcBitsOutHostId,&ipcBitsOutHostPrm,sizeof(ipcBitsOutHostPrm));
System_linkCreate(ipcBitsInVideoId,&ipcBitsInVideoPrm,sizeof(ipcBitsInVideoPrm));
System_linkCreate(decId, &decPrm, sizeof(decPrm));
System_linkCreate(ipcOutVideoEncId, &ipcOutVideoEncPrm, sizeof(ipcOutVideoEncPrm));
System_linkCreate(ipcInVpssEncId, &ipcInVpssEncPrm, sizeof(ipcInVpssEncPrm));
//System_linkCreate(dupEncId, &dupEncPrm, sizeof(dupEncPrm));
System_linkCreate(selId, &selPrm, sizeof(selPrm));
for(i=0; i<chainsCfg->chRecNum; i++)
{
System_linkCreate(swMsId[i], &swMsPrm[i], sizeof(swMsPrm[i]));
System_linkCreate(displayId[i], &displayPrm[i], sizeof(displayPrm[i]));
}
}
/*
* Start Links
*/
if (chainsCfg->chCapNum > 0)
{
System_linkStart(ipcBitsInHostId);
System_linkStart(ipcBitsOutVideoId);
System_linkStart(encId);
System_linkStart(ipcInVideoId);
System_linkStart(ipcOutVpssId);
//System_linkStart(dupId);
System_linkStart(deiId);//by ct
System_linkStart(captureId);
Vcap_init(&prm);
Vcap_start();
}
if (chainsCfg->chRecNum > 0)
{
for(i=0; i<chainsCfg->chRecNum; i++)
{
System_linkStart(displayId[i]);
}
Vdis_start();
for(i=0; i<chainsCfg->chRecNum; i++)
{
System_linkStart(swMsId[i]);
}
//System_linkStart(dupEncId);
System_linkStart(selId);
System_linkStart(ipcInVpssEncId);
System_linkStart(ipcOutVideoEncId);
System_linkStart(decId);
System_linkStart(ipcBitsInVideoId);
System_linkStart(ipcBitsOutHostId);
}
while(1)
{
char ch;
//ch = Chains_SelCapSelRecvmenu();
ch = Chains_menuRunTime();
if(ch=='0')
break;
}
Chains_ipcBitsStop();
if (chainsCfg->chCapNum > 0) {
System_linkStop(captureId);
Vcap_stop();
System_linkStop(deiId);
System_linkStop(dupId);
System_linkStop(ipcOutVpssId);
System_linkStop(ipcInVideoId);
System_linkStop(encId);
System_linkStop(ipcBitsOutVideoId);
System_linkStop(ipcBitsInHostId);
}
if (chainsCfg->chRecNum > 0) {
System_linkStop(ipcBitsOutHostId);
System_linkStop(ipcBitsInVideoId);
System_linkStop(decId);
System_linkStop(ipcOutVideoEncId);
System_linkStop(ipcInVpssEncId);
//System_linkStop(dupEncId);
System_linkStop(selId);
for(i=0; i<chainsCfg->chRecNum; i++){
System_linkStop(swMsId[i]);
System_linkStop(displayId[i]);
}
Vdis_stop();
}
if (chainsCfg->chCapNum > 0) {
System_linkDelete(captureId);
System_linkDelete(deiId); //by ct
System_linkDelete(dupId);
System_linkDelete(ipcOutVpssId);
System_linkDelete(ipcInVideoId);
System_linkDelete(encId);
System_linkDelete(ipcBitsOutVideoId);
System_linkDelete(ipcBitsInHostId);
}
if (chainsCfg->chRecNum > 0) {
System_linkDelete(ipcBitsOutHostId);
System_linkDelete(ipcBitsInVideoId);
System_linkDelete(decId);
System_linkDelete(ipcOutVideoEncId);
System_linkDelete(ipcInVpssEncId);
//System_linkDelete(dupEncId);
System_linkDelete(selId);
for(i=0; i<chainsCfg->chRecNum; i++){
System_linkDelete(swMsId[i]);
System_linkDelete(displayId[i]);
}
Chains_displayCtrlDeInit();
}
Chains_ipcBitsExit();
}
结果出现了错误:unhandle exception
追踪代码出现在deiLink_drc.c 中DeiLink_drvReleaseFrames()中的System_sendLinkCmd()中,
麻烦各位帮忙看一下上面的哪些配置是错误的,到底该怎么配置才能让视频通过dei模块? 谢谢!