大家好!
我在multich_tristream_fullfeature.c文件中新增了DSP算法,在Syslink中的处理流程如下,标红的link是我在源码的基础上新加的link:
merge link -> swosd link -> sclr link -> ipcm3out link -> dsp in link -> helloworld (dsp algorithm) -> dsp out link -> ipcm3 in link
另外,我在ti_vcam.c文件Vcam_start()函数中,添加了这些link的System_linkStart()代码。
程序运行起来,通过log可以看到link初始化都是成功的,就是运行到Init_StreamEnv->WaitStreamReady中报错,提示错误
"Error: WaitStreamReady Fail.
Error: SemWait: Invalid Semaphore handler",
比较正常的运行的log发现正常情况下可以获得stream的码流60帧,添加了link后获得stream的码流为0。 烦请工程师提示一下解决思路,谢谢!
multich_tristream_fullfeature.c文件中的修改
Void MultiCh_createTriStreamFullFtr()
{
#ifdef HELLO_DSP_ON
gVcamModuleContext.ipcFramesInDspId = SYSTEM_DSP_LINK_ID_IPC_FRAMES_IN_0;
gVcamModuleContext.ipcFramesOutDspId = SYSTEM_DSP_LINK_ID_IPC_FRAMES_OUT_0;
gVcamModuleContext.ipcHelloWorldId = SYSTEM_LINK_ID_HELLOWORLD_0;
IpcFramesInLinkRTOS_CreateParams ipcInHWDspPrm;
IpcFramesOutLinkRTOS_CreateParams ipcOutHWDspPrm;
HelloWorldLink_CreateParams hwPrm;
MULTICH_INIT_STRUCT(IpcFramesInLinkRTOS_CreateParams, ipcInHWDspPrm);
MULTICH_INIT_STRUCT(IpcFramesOutLinkRTOS_CreateParams, ipcOutHWDspPrm);
#endif
.....
#ifdef HELLO_DSP_ON
/* Scaler Link Params */
SclrLink_CreateParams_Init(&sclrPrm);
sclrPrm.inQueParams.prevLinkId = dupId[DIS_DUP_IDX];
sclrPrm.inQueParams.prevLinkQueId = 0;
sclrPrm.outQueParams.nextLink = ipcOutVpssId;
sclrPrm.tilerEnable = FALSE;
sclrPrm.enableLineSkipSc = FALSE;
sclrPrm.inputFrameRate = 30;
sclrPrm.outputFrameRate = 30;
sclrPrm.scaleMode = DEI_SCALE_MODE_ABSOLUTE;
sclrPrm.outScaleFactor.absoluteResolution.outWidth = 320;
sclrPrm.outScaleFactor.absoluteResolution.outHeight = 192;
sclrPrm.outDataFormat = VF_YUV420SP_UV;
sclrPrm.pathId = SCLR_LINK_SEC0_SC3;
#endif
/* IPC Out VPSS link params */
#ifdef HELLO_DSP_ON
ipcOutVpssPrm.inQueParams.prevLinkId = gVcamModuleContext.sclrId[0];
#else
ipcOutVpssPrm.inQueParams.prevLinkId = dupId[DIS_DUP_IDX];
#endif
ipcOutVpssPrm.inQueParams.prevLinkQueId = 0;
ipcOutVpssPrm.numOutQue = 1;
ipcOutVpssPrm.outQueParams[0].nextLink = ipcInVideoId;
ipcOutVpssPrm.notifyNextLink = TRUE;
ipcOutVpssPrm.notifyPrevLink = TRUE;
ipcOutVpssPrm.noNotifyMode = FALSE;
/* IPC In VIDEO params */
ipcInVideoPrm.inQueParams.prevLinkId = ipcOutVpssId;
ipcInVideoPrm.inQueParams.prevLinkQueId = 0;
ipcInVideoPrm.numOutQue = 1;
ipcInVideoPrm.outQueParams[0].nextLink = gVencModuleContext.encId;
ipcInVideoPrm.notifyNextLink = TRUE;
ipcInVideoPrm.notifyPrevLink = TRUE;
ipcInVideoPrm.noNotifyMode = FALSE;
#ifdef HELLO_DSP_ON
ipcOutVpssPrm.outQueParams[0].nextLink = gVcamModuleContext.ipcFramesInDspId;
/* IPC Frames In Link */
ipcInHWDspPrm.baseCreateParams.inQueParams.prevLinkId = ipcOutVpssId;
ipcInHWDspPrm.baseCreateParams.inQueParams.prevLinkQueId = 0;
ipcInHWDspPrm.baseCreateParams.numOutQue = 1;
ipcInHWDspPrm.baseCreateParams.outQueParams[0].nextLink = gVcamModuleContext.ipcHelloWorldId;
ipcInHWDspPrm.baseCreateParams.notifyNextLink = TRUE;
ipcInHWDspPrm.baseCreateParams.notifyPrevLink = TRUE;
ipcInHWDspPrm.baseCreateParams.notifyProcessLink = FALSE;
ipcInHWDspPrm.baseCreateParams.noNotifyMode = FALSE;
ipcInHWDspPrm.baseCreateParams.inputFrameRate = 20;
ipcInHWDspPrm.baseCreateParams.outputFrameRate = 20;
/* HelloWorld DSP Algorithm for test*/
HelloWorldLink_CreateParams_Init(&hwPrm);
hwPrm.inQueParams.prevLinkId = gVcamModuleContext.ipcFramesInDspId;
hwPrm.inQueParams.prevLinkQueId = 0;
hwPrm.outQueParams.nextLink = gVcamModuleContext.ipcFramesOutDspId;
/* IPC Frames Out Link */
ipcOutHWDspPrm.baseCreateParams.inQueParams.prevLinkId = gVcamModuleContext.ipcHelloWorldId;
ipcOutHWDspPrm.baseCreateParams.inQueParams.prevLinkQueId = 0;
ipcOutHWDspPrm.baseCreateParams.numOutQue = 1;
ipcOutHWDspPrm.baseCreateParams.outQueParams[0].nextLink = ipcInVideoId;
ipcOutHWDspPrm.baseCreateParams.notifyNextLink = TRUE;
ipcOutHWDspPrm.baseCreateParams.notifyPrevLink = TRUE;
ipcOutHWDspPrm.baseCreateParams.noNotifyMode = FALSE;
ipcInVideoPrm.inQueParams.prevLinkId = gVcamModuleContext.ipcFramesOutDspId;
#endif
.......
#ifdef HELLO_DSP_ON
System_linkCreate(gVcamModuleContext.sclrId[0], &sclrPrm, sizeof(sclrPrm));
System_linkCreate(gVcamModuleContext.ipcFramesInDspId, &ipcInHWDspPrm, sizeof(ipcInHWDspPrm));
System_linkCreate(gVcamModuleContext.ipcHelloWorldId, &hwPrm, sizeof(hwPrm));
System_linkCreate(gVcamModuleContext.ipcFramesOutDspId, &ipcOutHWDspPrm, sizeof(ipcOutHWDspPrm));
#endif
ti_vcam.c文件中的修改
Int32 Vcam_start()
{
#ifdef HELLO_DSP_ON
/* start can happen in any order, except its recommended to start camera
* Link the last */
if (gVcamModuleContext.ipcHelloWorldId != SYSTEM_LINK_ID_INVALID)
{
if (gVcamModuleContext.sclrId[0] != SYSTEM_LINK_ID_INVALID)
{
System_linkStart(gVcamModuleContext.sclrId[0]);
}
if (gVcamModuleContext.ipcFramesInDspId != SYSTEM_LINK_ID_INVALID)
{
System_linkStart(gVcamModuleContext.ipcFramesInDspId);
}
System_linkStart(gVcamModuleContext.ipcHelloWorldId);
if (gVcamModuleContext.ipcFramesOutDspId != SYSTEM_LINK_ID_INVALID)
{
System_linkStart(gVcamModuleContext.ipcFramesOutDspId);
}
}
#endif
....
}