我们现在的DM385开发板上外挂了一个tvp5151芯片,用来接CVBS摄像头,原理图如下:
tvp5151输出8bit 内嵌同步的CVBS(NTSC或PAL)信号到DM385的VIP1 PORTA的D0~D7位上,数据流如下:
tvp5151(cvbs) -> capture-> deinterlace -> encode -> send
软件版本使用的是dvr rdk 4.0,代码如下:
- void MultiCh_createVcapVencVdis()
- {
- CaptureLink_CreateParams capturePrm;
- DeiLink_CreateParams deiPrm;
- IpcFramesOutLinkRTOS_CreateParams ipcFramesOutVpssToHostPrm;
- IpcFramesInLinkRTOS_CreateParams ipcFramesInVideoFromHostPrm;
- EncLink_CreateParams encPrm;
- IpcBitsOutLinkRTOS_CreateParams ipcBitsOutVideoPrm;
- IpcBitsInLinkHLOS_CreateParams ipcBitsInHostPrm;
- CaptureLink_VipInstParams *pCaptureInstPrm;
- CaptureLink_OutParams *pCaptureOutPrm;
- VCAP_VIDEO_SOURCE_STATUS_S vidSourceStatus;
- int i;
- MULTICH_INIT_STRUCT(DeiLink_CreateParams, deiPrm);
- MULTICH_INIT_STRUCT(IpcFramesOutLinkRTOS_CreateParams, ipcFramesOutVpssToHostPrm);
- MULTICH_INIT_STRUCT(IpcFramesInLinkRTOS_CreateParams, ipcFramesInVideoFromHostPrm);
- MULTICH_INIT_STRUCT(EncLink_CreateParams, encPrm);
- MULTICH_INIT_STRUCT(IpcBitsOutLinkRTOS_CreateParams, ipcBitsOutVideoPrm);
- MULTICH_INIT_STRUCT(IpcBitsInLinkHLOS_CreateParams, ipcBitsInHostPrm);
- gVcapModuleContext.captureId = SYSTEM_LINK_ID_CAPTURE;
- gVcapModuleContext.deiId[0] = SYSTEM_LINK_ID_DEI_0;
- gVcapModuleContext.ipcFramesOutVpssToHostId = SYSTEM_VPSS_LINK_ID_IPC_OUT_M3_0;
- gVencModuleContext.ipcM3InId = SYSTEM_VIDEO_LINK_ID_IPC_IN_M3_0;
- gVencModuleContext.encId = SYSTEM_LINK_ID_VENC_0;
- gVencModuleContext.ipcBitsOutRTOSId = SYSTEM_VIDEO_LINK_ID_IPC_BITS_OUT_0;
- gVencModuleContext.ipcBitsInHLOSId = SYSTEM_HOST_LINK_ID_IPC_BITS_IN_0;
- MultiCh_detectBoard();
- 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
- );
- gVcapModuleContext.isWrbkCaptEnable = FALSE;
- CaptureLink_CreateParams_Init(&capturePrm);
- capturePrm.outQueParams[0].nextLink = gVcapModuleContext.deiId[0];
- capturePrm.isPalMode = TRUE;
- capturePrm.numVipInst = 1;
- capturePrm.enableSdCrop = FALSE;
- capturePrm.doCropInCapture = FALSE;
- capturePrm.tilerEnable = FALSE;
- capturePrm.numBufsPerCh = NUM_CAPTURE_BUFFERS;
- capturePrm.overrideNumBufsInInstPrms = 1u;
- pCaptureInstPrm = &capturePrm.vipInst[0];
- pCaptureInstPrm->inDataFormat = SYSTEM_DF_YUV422P;
- //pCaptureInstPrm->standard = SYSTEM_STD_D1;
- pCaptureInstPrm->standard = SYSTEM_STD_MUX_4CH_D1;
- pCaptureInstPrm->videoDecoderId = 0;
- pCaptureInstPrm->numOutput = 1;
- pCaptureInstPrm->numBufsPerCh = NUM_CAPTURE_BUFFERS;
- pCaptureInstPrm->vipInstId = SYSTEM_CAPTURE_INST_VIP1_PORTA;
- pCaptureInstPrm->videoIfMode = SYSTEM_CAPT_VIDEO_IF_MODE_8BIT;
- pCaptureInstPrm->inScanFormat = SYSTEM_SF_INTERLACED;
- pCaptureOutPrm = &pCaptureInstPrm->outParams[0];
- pCaptureOutPrm->dataFormat = SYSTEM_DF_YUV422I_YUYV;
- pCaptureOutPrm->scEnable = FALSE;
- pCaptureOutPrm->scOutWidth = 0;
- pCaptureOutPrm->scOutHeight = 0;
- pCaptureOutPrm->outQueId = 0;
- deiPrm.inQueParams.prevLinkId = gVcapModuleContext.captureId;
- deiPrm.inQueParams.prevLinkQueId = 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.widthRatio.numerator = 1;
- deiPrm.outScaleFactor[DEI_LINK_OUT_QUE_VIP_SC][0].ratio.widthRatio.denominator = 1;
- 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;
- 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.enableOut[DEI_LINK_OUT_QUE_DEI_SC] = FALSE;
- deiPrm.enableOut[DEI_LINK_OUT_QUE_VIP_SC] = TRUE;
- deiPrm.enableOut[DEI_LINK_OUT_QUE_VIP_SC_SECONDARY_OUT] = FALSE;
- deiPrm.enableOut[DEI_LINK_OUT_QUE_DEI_SC_SECONDARY_OUT] = FALSE;
- deiPrm.enableOut[DEI_LINK_OUT_QUE_DEI_SC_TERTIARY_OUT] = FALSE;
- deiPrm.outQueParams[DEI_LINK_OUT_QUE_VIP_SC].nextLink = gVcapModuleContext.ipcFramesOutVpssToHostId;
- deiPrm.tilerEnable[DEI_LINK_OUT_QUE_VIP_SC] = FALSE;
- deiPrm.comprEnable = FALSE;
- deiPrm.setVipScYuv422Format = FALSE;
- deiPrm.enableDeiForceBypass = FALSE;
- ipcFramesOutVpssToHostPrm.baseCreateParams.noNotifyMode = FALSE;
- ipcFramesOutVpssToHostPrm.baseCreateParams.notifyNextLink = TRUE;
- ipcFramesOutVpssToHostPrm.baseCreateParams.notifyPrevLink = TRUE;
- ipcFramesOutVpssToHostPrm.baseCreateParams.inQueParams.prevLinkQueId = 0;
- ipcFramesOutVpssToHostPrm.baseCreateParams.inQueParams.prevLinkId = gVcapModuleContext.deiId[0];
- ipcFramesOutVpssToHostPrm.baseCreateParams.outQueParams[0].nextLink = gVencModuleContext.ipcM3InId;
- ipcFramesInVideoFromHostPrm.baseCreateParams.noNotifyMode = FALSE;
- ipcFramesInVideoFromHostPrm.baseCreateParams.notifyNextLink = TRUE;
- ipcFramesInVideoFromHostPrm.baseCreateParams.notifyPrevLink = TRUE;
- ipcFramesInVideoFromHostPrm.baseCreateParams.inQueParams.prevLinkQueId = 0;
- ipcFramesInVideoFromHostPrm.baseCreateParams.inQueParams.prevLinkId = gVcapModuleContext.ipcFramesOutVpssToHostId;
- ipcFramesInVideoFromHostPrm.baseCreateParams.outQueParams[0].nextLink = gVencModuleContext.encId;
- {
- EncLink_ChCreateParams *pLinkChPrm;
- EncLink_ChDynamicParams *pLinkDynPrm;
- VENC_CHN_DYNAMIC_PARAM_S *pDynPrm;
- VENC_CHN_PARAMS_S *pChPrm;
- for (i = 0; i < gVencModuleContext.vencConfig.numPrimaryChn; i++) {
- pLinkChPrm = &encPrm.chCreateParams[i];
- pLinkDynPrm = &pLinkChPrm->defaultDynamicParams;
- pChPrm = &gVencModuleContext.vencConfig.encChannelParams[i];
- pDynPrm = &pChPrm->dynamicParam;
- pLinkChPrm->format = IVIDEO_H264HP;
- pLinkChPrm->profile = gVencModuleContext.vencConfig.h264Profile[i];
- pLinkChPrm->dataLayout = IVIDEO_PROGRESSIVE;
- pLinkChPrm->fieldMergeEncodeEnable = FALSE;
- pLinkChPrm->enableAnalyticinfo = pChPrm->enableAnalyticinfo;
- pLinkChPrm->enableWaterMarking = pChPrm->enableWaterMarking;
- pLinkChPrm->maxBitRate = pChPrm->maxBitRate;
- pLinkChPrm->encodingPreset = pChPrm->encodingPreset;
- pLinkChPrm->rateControlPreset = IVIDEO_USER_DEFINED;
- pLinkChPrm->enableSVCExtensionFlag = pChPrm->enableSVCExtensionFlag;
- pLinkChPrm->numTemporalLayer = pChPrm->numTemporalLayer;
- pLinkChPrm->enableHighSpeed = FALSE;
- pLinkDynPrm->intraFrameInterval = pDynPrm->intraFrameInterval;
- pLinkDynPrm->targetBitRate = pDynPrm->targetBitRate;
- pLinkDynPrm->interFrameInterval = 1;
- pLinkDynPrm->mvAccuracy = IVIDENC2_MOTIONVECTOR_QUARTERPEL;
- pLinkDynPrm->inputFrameRate = pDynPrm->inputFrameRate;
- pLinkDynPrm->rcAlg = pDynPrm->rcAlg;
- pLinkDynPrm->qpMin = pDynPrm->qpMin;
- pLinkDynPrm->qpMax = pDynPrm->qpMax;
- pLinkDynPrm->qpInit = pDynPrm->qpInit;
- pLinkDynPrm->vbrDuration = pDynPrm->vbrDuration;
- pLinkDynPrm->vbrSensitivity = pDynPrm->vbrSensitivity;
- encPrm.numBufPerCh[i] = 4;
- }
- }
- encPrm.chCreateParams[0].defaultDynamicParams.inputFrameRate = 30;
- encPrm.chCreateParams[1].defaultDynamicParams.inputFrameRate = 30;
- encPrm.inQueParams.prevLinkQueId = 0;
- encPrm.inQueParams.prevLinkId = gVencModuleContext.ipcM3InId;
- encPrm.outQueParams.nextLink = gVencModuleContext.ipcBitsOutRTOSId;
- ipcBitsOutVideoPrm.baseCreateParams.noNotifyMode = FALSE;
- ipcBitsOutVideoPrm.baseCreateParams.notifyNextLink = TRUE;
- ipcBitsOutVideoPrm.baseCreateParams.notifyPrevLink = TRUE;
- ipcBitsOutVideoPrm.baseCreateParams.numOutQue = 1;
- ipcBitsOutVideoPrm.baseCreateParams.inQueParams.prevLinkQueId = 0;
- ipcBitsOutVideoPrm.baseCreateParams.inQueParams.prevLinkId = gVencModuleContext.encId;
- ipcBitsOutVideoPrm.baseCreateParams.outQueParams[0].nextLink = gVencModuleContext.ipcBitsInHLOSId;
- ipcBitsInHostPrm.baseCreateParams.inQueParams.prevLinkQueId = 0;
- ipcBitsInHostPrm.baseCreateParams.inQueParams.prevLinkId = gVencModuleContext.ipcBitsOutRTOSId;
- MultiCh_ipcBitsInitCreateParams_BitsInHLOS(&ipcBitsInHostPrm);
- vidSourceStatus.numChannels = 1;
- vidSourceStatus.chStatus[0].chId = 0;
- vidSourceStatus.chStatus[0].frameWidth = 720;
- vidSourceStatus.chStatus[0].frameHeight = 288;
- vidSourceStatus.chStatus[0].vipInstId = SYSTEM_CAPTURE_INST_VIP1_PORTA;
- vidSourceStatus.chStatus[0].isInterlaced = TRUE;
- vidSourceStatus.chStatus[0].frameInterval = 20000;
- vidSourceStatus.chStatus[0].isVideoDetect = FALSE;
- Vcap_setVideoSourceStatus(&vidSourceStatus);
- System_linkCreate(gVcapModuleContext.captureId, &capturePrm, sizeof(capturePrm));
- System_linkCreate(gVcapModuleContext.deiId[0], &deiPrm, sizeof(deiPrm));
- System_linkCreate(gVcapModuleContext.ipcFramesOutVpssToHostId, &ipcFramesOutVpssToHostPrm, sizeof(ipcFramesOutVpssToHostPrm));
- System_linkCreate(gVencModuleContext.ipcM3InId, &ipcFramesInVideoFromHostPrm, sizeof(ipcFramesInVideoFromHostPrm));
- System_linkCreate(gVencModuleContext.encId, &encPrm, sizeof(encPrm));
- System_linkCreate(gVencModuleContext.ipcBitsOutRTOSId, &ipcBitsOutVideoPrm, sizeof(ipcBitsOutVideoPrm));
- System_linkCreate(gVencModuleContext.ipcBitsInHLOSId, &ipcBitsInHostPrm, sizeof(ipcBitsInHostPrm));
- }
测试结果如下:
1. 当“pCaptureInstPrm->standard = SYSTEM_STD_D1”时,capture采不到视频;
2. 当“pCaptureInstPrm->standard = SYSTEM_STD_MUX_4CH_D1”时,capture可以采到视频,但deinterlace会出错;
麻烦各位帮忙看一下上面的哪些配置是错误的,到底该怎么配置才能让视频出来? 谢谢!