大家好,我目前用的平台是DM8168 开发包DVRRDK_02.00.00.23 仿照multich_vcap_vdis.c修改的link参数,想要做到不用编解码,在osd添加图像算法,直接通过HDMI显示出来。链路如下:
/*
Capture (YUV422I) 16CH D1 60fps
|
|
|
IpcFramesOutvpss Link ———IpcFramesIndsp Link———-algosd link
| | | SW Mosaic (SC5 YUV422I) | | |
|
display link Off-Chip HDMI 1080p60*/
出现的问题:屏幕一片黑,没有视频,只是一闪一闪
修改的各个link参数如下:
Void MultiCh_createVcapVdis()
{
CaptureLink_CreateParams capturePrm; SwMsLink_CreateParams swMsPrm;
DisplayLink_CreateParams displayPrm;
AlgLink_CreateParams dspAlgPrm;
IpcFramesInLinkRTOS_CreateParams ipcFramesInDspPrm;
IpcFramesOutLinkRTOS_CreateParams ipcFramesOutVpssPrm;
CaptureLink_VipInstParams *pCaptureInstPrm;
CaptureLink_OutParams *pCaptureOutPrm;
VCAP_VIDDEC_PARAMS_S vidDecVideoModeArgs[NUM_CAPTURE_DEVICES];
//UInt32 deiOutQue;
UInt32 vipInstId;
UInt32 i;
//UInt32 numSubChains;
//Bool enableSdtv;
MULTICH_INIT_STRUCT(CaptureLink_CreateParams,capturePrm); MULTICH_INIT_STRUCT(IpcFramesOutLinkRTOS_CreateParams,ipcFramesOutVpssPrm);
MULTICH_INIT_STRUCT(IpcFramesInLinkRTOS_CreateParams,ipcFramesInDspPrm); MULTICH_INIT_STRUCT(AlgLink_CreateParams,dspAlgPrm);
MULTICH_INIT_STRUCT(SwMsLink_CreateParams ,swMsPrm);
MULTICH_INIT_STRUCT(DisplayLink_CreateParams,displayPrm);
System_init();
MultiCh_detectBoard();
System_linkControl(SYSTEM_LINK_ID_M3VPSS , SYSTEM_M3VPSS_CMD_RESET_VIDEO_DEVICES , NULL , 0 , TRUE);
gVcapModuleContext.captureId = SYSTEM_LINK_ID_CAPTURE;
gVcapModuleContext.ipcFramesOutVpssId[0] = SYSTEM_VPSS_LINK_ID_IPC_FRAMES_OUT_0;
gVcapModuleContext.ipcFramesInDspId[0] = SYSTEM_DSP_LINK_ID_IPC_FRAMES_IN_0;
gVcapModuleContext.dspAlgId[0] = SYSTEM_LINK_ID_ALG_0;
gVdisModuleContext.swMsId[0] = SYSTEM_LINK_ID_SW_MS_MULTI_INST_0; gVdisModuleContext.swMsId[1] = SYSTEM_LINK_ID_SW_MS_MULTI_INST_1;
gVdisModuleContext.displayId[0] = SYSTEM_LINK_ID_DISPLAY_0; // ON CHIP HDMI
gVdisModuleContext.displayId[1] = SYSTEM_LINK_ID_DISPLAY_1; // OFF CHIP HDMI
gVdisModuleContext.displayId[2] = SYSTEM_LINK_ID_DISPLAY_2; // OFF CHIP HDMI#if 0 /* Enabling graphics only for ON CHIP HDMI an OFF CHIP HDMI*/
//grpxId[2] = SYSTEM_LINK_ID_GRPX_2;
#endif
//numSubChains = 2;
//deiOutQue = DEI_LINK_OUT_QUE_VIP_SC;
//enableSdtv = FALSE;
CaptureLink_CreateParams_Init(&capturePrm);
capturePrm.numVipInst = 1;
capturePrm.outQueParams[0].nextLink = gVcapModuleContext.ipcFramesOutVpssId[0];
capturePrm.tilerEnable = FALSE;
capturePrm.enableSdCrop = FALSE;
for(vipInstId=0; vipInstId<capturePrm.numVipInst; vipInstId++)
{
pCaptureInstPrm = &capturePrm.vipInst[vipInstId];
pCaptureInstPrm->vipInstId = SYSTEM_CAPTURE_INST_VIP0_PORTA;
pCaptureInstPrm->videoDecoderId = SYSTEM_DEVICE_VID_DEC_TVP5158_DRV; pCaptureInstPrm->inDataFormat = SYSTEM_DF_YUV422P;
pCaptureInstPrm->standard = SYSTEM_STD_1080P_60; pCaptureInstPrm->numOutput = 1;
pCaptureOutPrm = &pCaptureInstPrm->outParams[0];
pCaptureOutPrm->dataFormat = SYSTEM_DF_YUV422I_YUYV;
pCaptureOutPrm->scEnable = FALSE;
pCaptureOutPrm->scOutWidth = 0;
pCaptureOutPrm->scOutHeight = 0;
pCaptureOutPrm->outQueId = 0;
}
IpcFramesOutLinkRTOS_CreateParams_Init(&ipcFramesOutVpssPrm); ipcFramesOutVpssPrm.baseCreateParams.inQueParams.prevLinkId = gVcapModuleContext.captureId; ipcFramesOutVpssPrm.baseCreateParams.inQueParams.prevLinkQueId = 0; ipcFramesOutVpssPrm.baseCreateParams.inputFrameRate = 25; ipcFramesOutVpssPrm.baseCreateParams.outputFrameRate = 25; ipcFramesOutVpssPrm.baseCreateParams.notifyPrevLink = TRUE; //ipcFramesOutVpssPrm.baseCreateParams.equallyDivideChAcrossOutQues = TRUE; //DVRRDK_02.00.00.23
ipcFramesOutVpssPrm.baseCreateParams.numOutQue =1; ipcFramesOutVpssPrm.baseCreateParams.outQueParams[0].nextLink= gVdisModuleContext.swMsId[0]; ipcFramesOutVpssPrm.baseCreateParams.processLink = gVcapModuleContext.ipcFramesInDspId[0]; ipcFramesOutVpssPrm.baseCreateParams.notifyProcessLink = TRUE; ipcFramesOutVpssPrm.baseCreateParams.notifyNextLink = TRUE; ipcFramesOutVpssPrm.baseCreateParams.noNotifyMode = FALSE;//TRUE; IpcFramesInLinkRTOS_CreateParams_Init(&ipcFramesInDspPrm); ipcFramesInDspPrm.baseCreateParams.inQueParams.prevLinkId =gVcapModuleContext.ipcFramesOutVpssId[0]; ipcFramesInDspPrm.baseCreateParams.inQueParams.prevLinkQueId = 0; ipcFramesInDspPrm.baseCreateParams.numOutQue = 1; ipcFramesInDspPrm.baseCreateParams.outQueParams[0].nextLink = gVcapModuleContext.dspAlgId[0]; ipcFramesInDspPrm.baseCreateParams.inputFrameRate = 25; ipcFramesInDspPrm.baseCreateParams.outputFrameRate = 25; ipcFramesInDspPrm.baseCreateParams.notifyNextLink =TRUE; ipcFramesInDspPrm.baseCreateParams.notifyPrevLink = TRUE; ipcFramesInDspPrm.baseCreateParams.noNotifyMode = FALSE;
AlgLink_CreateParams_Init(&dspAlgPrm); dspAlgPrm.inQueParams.prevLinkId = gVcapModuleContext.ipcFramesInDspId[0]; dspAlgPrm.inQueParams.prevLinkQueId = 0; dspAlgPrm.enableOSDAlg = TRUE; dspAlgPrm.enableSCDAlg = FALSE; dspAlgPrm.osdChCreateParams[0].maxHeight =64; dspAlgPrm.osdChCreateParams[0].maxWidth =320; AlgLink_OsdChWinParams *chWinPrm=&dspAlgPrm.osdChCreateParams[0].chDefaultParams; chWinPrm->chId =0 ; chWinPrm->numWindows =1; //chWinPrm->colorKey[0] = 0xfa; /* Y */ //chWinPrm->colorKey[1] = 0x7e; /* U */ //chWinPrm->colorKey[2] = 0x7d; /* V */ chWinPrm->winPrm[0].startX = EXAMPLE_OSD_WIN0_STARTX; chWinPrm->winPrm[0].startY = EXAMPLE_OSD_WIN0_STARTY; chWinPrm->winPrm[0].format = SYSTEM_DF_YUV422I_YUYV; chWinPrm->winPrm[0].width = EXAMPLE_OSD_WIN_MAX_WIDTH; chWinPrm->winPrm[0].height = EXAMPLE_OSD_WIN_MAX_HEIGHT; chWinPrm->winPrm[0].lineOffset = EXAMPLE_OSD_WIN_PITCH; chWinPrm->winPrm[0].globalAlpha= EXAMPLE_OSD_GLOBAL_ALPHA; chWinPrm->winPrm[0].transperencyEnable = EXAMPLE_OSD_TRANSPARENCY; chWinPrm->winPrm[0].enableWin= EXAMPLE_OSD_ENABLE_WIN;
//??????????
for(i = 0; i < NUM_CAPTURE_DEVICES; i++) //NUM_CAPTURE_DEVICES=4 –>0
{
vidDecVideoModeArgs[i].videoIfMode = DEVICE_CAPT_VIDEO_IF_MODE_8BIT;
vidDecVideoModeArgs[i].videoDataFormat = SYSTEM_DF_YUV422P;
vidDecVideoModeArgs[i].standard = SYSTEM_STD_1080P_60; //1080p60
vidDecVideoModeArgs[i].videoCaptureMode =
DEVICE_CAPT_VIDEO_CAPTURE_MODE_MULTI_CH_PIXEL_MUX_EMBEDDED_SYNC;
vidDecVideoModeArgs[i].videoSystem =
DEVICE_VIDEO_DECODER_VIDEO_SYSTEM_AUTO_DETECT;
vidDecVideoModeArgs[i].videoCropEnable = FALSE;
vidDecVideoModeArgs[i].videoAutoDetectTimeout = -1;
}
Vcap_configVideoDecoder(vidDecVideoModeArgs, NUM_CAPTURE_DEVICES);
MultiCh_displayCtrlInit(&gVdisModuleContext.vdisConfig);
swMsPrm.numSwMsInst = 1;
swMsPrm.swMsInstId[0] = SYSTEM_SW_MS_SC_INST_SC5; //swMsPrm.swMsInstId[1] = SYSTEM_SW_MS_SC_INST_SC5;
swMsPrm.inQueParams.prevLinkId = gVcapModuleContext.ipcFramesOutVpssId[0];
swMsPrm.inQueParams.prevLinkQueId = 0;
swMsPrm.outQueParams.nextLink = gVdisModuleContext.displayId[0];
swMsPrm.maxInputQueLen = SYSTEM_SW_MS_DEFAULT_INPUT_QUE_LEN;
swMsPrm.maxOutRes = VSYS_STD_1080P_60;
swMsPrm.lineSkipMode = TRUE;
swMsPrm.enableLayoutGridDraw = gVdisModuleContext.vdisConfig.enableLayoutGridDraw;
MultiCh_swMsGetDefaultLayoutPrm(0, &swMsPrm, FALSE);
displayPrm.inQueParams[0].prevLinkId = gVdisModuleContext.swMsId[0];
displayPrm.inQueParams[0].prevLinkQueId = 0;
displayPrm.displayRes = VSYS_STD_1080P_60;#ifndef SYSTEM_USE_VIDEO_DECODER
//capturePrm.isPalMode = Vcap_isPalMode();
#endif
System_linkCreate(gVcapModuleContext.captureId, &capturePrm, sizeof(capturePrm)); System_linkCreate(gVcapModuleContext.ipcFramesOutVpssId[0], &ipcFramesOutVpssPrm, sizeof(ipcFramesOutVpssPrm));
System_linkCreate(gVcapModuleContext.ipcFramesInDspId[0], &ipcFramesInDspPrm, sizeof(ipcFramesInDspPrm));
System_linkCreate(gVcapModuleContext.dspAlgId[0] , &dspAlgPrm, sizeof(dspAlgPrm));
System_linkCreate(gVdisModuleContext.swMsId[0] , &swMsPrm, sizeof(swMsPrm));
System_linkCreate(gVdisModuleContext.displayId[0], &displayPrm, sizeof(displayPrm));
System_linkStart(gVdisModuleContext.displayId[0]); System_linkStart(gVdisModuleContext.swMsId[0]); System_linkStart(gVcapModuleContext.dspAlgId[0]); System_linkStart(gVcapModuleContext.ipcFramesInDspId[0]); System_linkStart(gVcapModuleContext.ipcFramesOutVpssId[0]); System_linkStart(gVcapModuleContext.captureId);
MultiCh_memPrintHeapStatus();
}
串口打印的日志:
[m3vpss ] 38793: CAPTURE: Create in progress !!!
[m3vpss ] 38821: CAPTURE: VIP0 PortA capture mode is [ 8-bit, Pixel-mux Embedd
ed Sync] !!!
[c6xdsp ] 35406: IPC_FRAMES_IN : Create in progress !!!
[c6xdsp ] 35406: SYSTEM: Opening ListMP [VPSS-M3_IPC_OUT_23] …
[c6xdsp ] 35406: SYSTEM: Opening ListMP [VPSS-M3_IPC_IN_23] …
[m3vpss ] CAPTURE::HEAPID:0 USED:192
[c6xdsp ] 35407: SYSTEM: Opening MsgQ [VPSS-M3_MSGQ] …
[m3vpss ] 38915: CAPTURE: Create Done !!!
[m3vpss ] 38915: IPC_FRAMES_OUT : Create in progress !!!
[m3vpss ] 38917: IPC_FRAMES_OUT : Create Done !!!
[c6xdsp ] IPC_FRAMES_IN:HEAPID:0 USED:240
[m3vpss ] 38930: SWMS: Create in progress !!!
[c6xdsp ] 35408: IPC_FRAMES_IN : Create Done !!!
[c6xdsp ] 35410: ALG : Create in progress !!!
[c6xdsp ] ALGLINK:HEAPID:0 USED:2968
[c6xdsp ] ALGLINK:HEAPID:1 USED:5584
[c6xdsp ] 35416: ALG : Create Done !!!
[m3vpss ] UTILS: DMA: Allocated CH (TCC) = 58 (58)
[m3vpss ] SWMS: instance 0, sc id 5, start win 0 end win 17
[m3vpss ] 39050: SWMS : Loading Up-scaling Co-effs …
[m3vpss ] 39050: SWMS : Co-effs Loading … DONE !!!
[m3vpss ] 39050: SWMS : ******* Configuring clock 30 secs…
[m3vpss ]
[m3vpss ] *** [SWMS0] Mosaic Parameters ***
[m3vpss ]
[m3vpss ] Output FPS: 30
[m3vpss ]
[m3vpss ] Win | Ch | Input | Input | Input | Input
| Output | Output | Output | Output | Low Cost | SWMS
| Data |
[m3vpss ] Num | Num | Start X, Y | Width x Height | Pitch Y / C | Memory Typ
e | Start X, Y | Width x Height | Pitch Y / C | Memory Type | ON / OFF | Inst
| Format|
[m3vpss ] ——————————————————————–
——————————————————————————–
———-
[m3vpss ] 0 | 0 | 0, 0 | 720 x 240 | 1472 / 1472 | NON-TILED
| 0, 0 | 1920 x 1080 | 3840 / 0 | NON-TILED | OFF | 0
| 422I |
[m3vpss ]
[m3vpss ] 39051: SWMS: Create Done !!!
[m3vpss ] 39051: DISPLAY: Create in progress !!!
[m3vpss ] 39052: DISPLAY: Create Done !!!
[m3vpss ] 39052: DISPLAY: Start in progress !!!
[m3vpss ]
[m3vpss ] *** UTILS: DM_TIMER[2] KHz = 27000 Khz ***
[m3vpss ]
[m3vpss ] 39117: DISPLAY: Start Done !!!
[m3vpss ] 39117: DISPLAY: HDDAC(BP0) : 30 fps, Latency (Min / Max) = ( 255 / 0
), Callback Interval (Min / Max) = ( 255 / 0 ) !!!
[m3vpss ] 39117: DISPLAY: UNDERFLOW COUNT: HDMI(BP0) 1, HDDAC(BP0) 1, DVO2(BP1
) 0, SDDAC(SEC1) 0
[m3vpss ] 39117: SYSTEM : Heap Free Space (System = 21504 bytes, SR0 = 143973
12 bytes, FrmBuf = 459064192 bytes,
[m3vpss ] BitBuf = 101711744 bytes, Mbx = 10238 msgs)
[m3vpss ] 39118: SWMS: Start in Progress !!!
[m3vpss ] 39118: SWMS: Start Done !!!
[m3vpss ] 39119: CAPTURE: Start in progress !!!
[m3vpss ] 39119: CAPTURE: Start Done !!!
=============
Run-Time Menu
=============
1: Capture Settings
2: Encode Settings
3: Decode Settings
4: Display Settings
5: Audio Settings
i: Print detailed system information
e: Stop Demo
Enter Choice: [m3vpss ] 39243: CAPTURE: Fields = 0 (fps = 0), Total Resets =
0 (Avg 0 ms per reset)
[m3vpss ] DMTIMER_TEST:TotElapsed:29978:NumUpdates:999
请教各位前辈哪里有问题?谢谢
Chris Meng:
你好,
你使用的软件版本过旧,建议升级到最新4.01。
你如果就采集加显示能正常么?下面的分辨率设置不对啊。
pCaptureInstPrm->standard = SYSTEM_STD_1080P_60;
weiliang huang:
回复 Chris Meng:
Chris Meng,你好
首先,感谢你的回答,如果只做cap+dis link分辨率是1080p60fps时确实会报运行错误,日志:
[m3vpss ] 15763: DISPLAY: 39: Field Separate Mode ENABLED for Que 0 !!!
[m3vpss ] 15764: Assertion @ Line: 771 in links_m3vpss/display/displayLink_drv.c: pObj->displayHndl != NULL : failed !!!
加了swms后,运行通过,日志如上。
你所说的分辨率是像usecase里的那样吗?pCaptureInstPrm->standard= SYSTEM_STD_MUX_4CH_D1;
另外官方例程里的VCAP+VENC+VDEC+VDIS – Progressive SD Encode + Decode的usecase是DVRRDK_02.00.00.23\dvr_rdk\mcfw\src_linux\mcfw_api\usecases\ti816x下的multich_progressive_vcap_venc_vdec_vdis.c吗?
我目前是想仿照usecase写个不带编解码的chain,在osd端加算法。
最后感谢你在百忙之中解答我的问题,感谢!
TI中文支持网

