This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

Does VpssFrameOut->DspFramesIn->DspFramesOut->VpssFramesIn link work?

Hello,

We are trying ro run an application on DSP. For that we have to get data from Vpss to DSP and then bacl to VPss. We have a VpssFramesOut->DspFramesIn->ALG->DspFramesOut->VpssFramesIn link setup. This is not working. So we removed ALG and connected the rest. Still not working. We then removed the DSP part and still it is not working. Now we have only VpssFrameOut->VpssFramesIn and it is not working and the error message is:

On M3VPSS side:

[m3vpss ] 62295: NOTIFY: Send Event to [VPSS-M3][22] failed !!! (status = -14)
[m3vpss ] 62295: Assertion @ Line: 69 in links_common/system/system_ipc_notify.c: status == Notify_S_SUCCESS : failed !!!

What could be the possible reason this error is coming?

Thanks

  • Pls attach the usecase file where you are creating and connecting links. The link connection ipcFramesOutVpss -> ipcFramesInDsp ->algLink is pretty standard and should work. AlgLink by default doesn't support frames output. So you will have to modify algLink to output frames.

  • Pls ignore the Alg link. The ipcFramesOutVpss->ipcFramesInVpss link connection alone is not working. It is giving the error i mentioned in the first post. What could be the reason?

  • Either linkId used are wrong or link connections are wrong. VPSS M3 is trying to send notify to VPSS_M3 itself. It si difficult to guess what the issue is until code is provided.

  • Could you please give us an example of the link connection of how to connect VpssFramesOut to VpssFramesIn directly? You can just focus on the important parts and therefore It should just be probably about 10-15 lines of code. Can you please give this?

  • Refer /dvr_rdk/mcfw/src_linux/mcfw_api/usecases/ti816x/multich_hybrid_dvr.c

    Below is the relevant code

        /* ipcFramesOutVpssId[1] ---Q2---> ipcFramesInDspId[1] */
        gHybridDVRUsecaseContext.ipcFramesOutVpssPrm[1].baseCreateParams.inputFrameRate = 2;
        gHybridDVRUsecaseContext.ipcFramesOutVpssPrm[1].baseCreateParams.outputFrameRate = 2;
        gHybridDVRUsecaseContext.ipcFramesOutVpssPrm[1].baseCreateParams.numOutQue = 1;
        gHybridDVRUsecaseContext.ipcFramesOutVpssPrm[1].baseCreateParams.outQueParams[0].nextLink = gVcapModuleContext.ipcFramesInDspId[1];
        gHybridDVRUsecaseContext.ipcFramesOutVpssPrm[1].baseCreateParams.notifyNextLink = TRUE;
        gHybridDVRUsecaseContext.ipcFramesInDspPrm[1].baseCreateParams.inQueParams.prevLinkId = gVcapModuleContext.ipcFramesOutVpssId[1];
        gHybridDVRUsecaseContext.ipcFramesInDspPrm[1].baseCreateParams.inQueParams.prevLinkQueId = 0;
        gHybridDVRUsecaseContext.ipcFramesInDspPrm[1].baseCreateParams.notifyPrevLink = TRUE;
        gHybridDVRUsecaseContext.ipcFramesOutVpssPrm[1].baseCreateParams.processLink = SYSTEM_LINK_ID_INVALID;
        gHybridDVRUsecaseContext.ipcFramesOutVpssPrm[1].baseCreateParams.notifyProcessLink = FALSE;
        gHybridDVRUsecaseContext.ipcFramesOutVpssPrm[1].baseCreateParams.noNotifyMode = FALSE;
        MULTICH_HYBRIDDVR_CREATE_LINK(gVcapModuleContext.ipcFramesOutVpssId[1],
                                      &gHybridDVRUsecaseContext.ipcFramesOutVpssPrm[1],
                                      sizeof(gHybridDVRUsecaseContext.ipcFramesOutVpssPrm[1]));
    
        gHybridDVRUsecaseContext.ipcFramesInDspPrm[1].baseCreateParams.numOutQue   = 1;
        gHybridDVRUsecaseContext.ipcFramesInDspPrm[1].baseCreateParams.outQueParams[0].nextLink = gVcapModuleContext.dspAlgId[MULTICH_DSP_ALG_LINK_SCD_IDX];
        gHybridDVRUsecaseContext.ipcFramesInDspPrm[1].baseCreateParams.notifyNextLink = TRUE;
        gHybridDVRUsecaseContext.ipcFramesInDspPrm[1].baseCreateParams.noNotifyMode   = FALSE;
        gHybridDVRUsecaseContext.dspAlgPrm[MULTICH_DSP_ALG_LINK_SCD_IDX].inQueParams.prevLinkId = gVcapModuleContext.ipcFramesInDspId[1];
        gHybridDVRUsecaseContext.dspAlgPrm[MULTICH_DSP_ALG_LINK_SCD_IDX].inQueParams.prevLinkQueId = 0;
        MULTICH_HYBRIDDVR_CREATE_LINK(gVcapModuleContext.ipcFramesInDspId[1],
                                      &gHybridDVRUsecaseContext.ipcFramesInDspPrm[1],
                                      sizeof(gHybridDVRUsecaseContext.ipcFramesInDspPrm[1]));
    
        /* dspAlgId[1] ---Q0---> ipcBitsOutDsp */
        multich_hybriddvr_set_scd_prm(&gHybridDVRUsecaseContext.dspAlgPrm[MULTICH_DSP_ALG_LINK_SCD_IDX]);
        gHybridDVRUsecaseContext.dspAlgPrm[MULTICH_DSP_ALG_LINK_SCD_IDX].outQueParams[ALG_LINK_SCD_OUT_QUE].nextLink     = gHybridDVRUsecaseContext.ipcBitsOutDSPId;
        gHybridDVRUsecaseContext.ipcBitsOutDspPrm.baseCreateParams.inQueParams.prevLinkId    = gVcapModuleContext.dspAlgId[1];
        gHybridDVRUsecaseContext.ipcBitsOutDspPrm.baseCreateParams.inQueParams.prevLinkQueId = 0;
        MULTICH_HYBRIDDVR_CREATE_LINK(gVcapModuleContext.dspAlgId[1],
                                      &gHybridDVRUsecaseContext.dspAlgPrm[MULTICH_DSP_ALG_LINK_SCD_IDX],
                                      sizeof(gHybridDVRUsecaseContext.dspAlgPrm[MULTICH_DSP_ALG_LINK_SCD_IDX]));
    
        /* ipcBitsOutDsp ---Q0---> ipcBitsInHlos */
        gHybridDVRUsecaseContext.ipcBitsOutDspPrm.baseCreateParams.numOutQue                 = 1;
        gHybridDVRUsecaseContext.ipcBitsOutDspPrm.baseCreateParams.outQueParams[0].nextLink  = gVcapModuleContext.ipcBitsInHLOSId;
        MultiCh_ipcBitsInitCreateParams_BitsOutRTOS(&gHybridDVRUsecaseContext.ipcBitsOutDspPrm,
                                                    TRUE);
        gHybridDVRUsecaseContext.ipcBitsInHostPrm[1].baseCreateParams.inQueParams.prevLinkId = gHybridDVRUsecaseContext.ipcBitsOutDSPId;
        gHybridDVRUsecaseContext.ipcBitsInHostPrm[1].baseCreateParams.inQueParams.prevLinkQueId = 0;
        MULTICH_HYBRIDDVR_CREATE_LINK(gHybridDVRUsecaseContext.ipcBitsOutDSPId,
                                      &gHybridDVRUsecaseContext.ipcBitsOutDspPrm,
                                      sizeof(gHybridDVRUsecaseContext.ipcBitsOutDspPrm));
    
        gHybridDVRUsecaseContext.ipcBitsInHostPrm[1].baseCreateParams.numOutQue                 = 1;
        gHybridDVRUsecaseContext.ipcBitsInHostPrm[1].baseCreateParams.outQueParams[0].nextLink   = SYSTEM_LINK_ID_INVALID;
        MultiCh_ipcBitsInitCreateParams_BitsInHLOSVcap(&gHybridDVRUsecaseContext.ipcBitsInHostPrm[1]);
        MULTICH_HYBRIDDVR_CREATE_LINK(gVcapModuleContext.ipcBitsInHLOSId,
                                      &gHybridDVRUsecaseContext.ipcBitsInHostPrm[1],
                                      sizeof(gHybridDVRUsecaseContext.ipcBitsInHostPrm[1]));
    

    Below is the linkId setting:

            gVcapModuleContext.ipcFramesOutVpssId[1] = SYSTEM_VPSS_LINK_ID_IPC_FRAMES_OUT_1;
            gVcapModuleContext.ipcFramesInDspId[1]   = SYSTEM_DSP_LINK_ID_IPC_FRAMES_IN_1;
            gVcapModuleContext.dspAlgId[1]           = SYSTEM_LINK_ID_ALG_1;
            gHybridDVRUsecaseContext.ipcBitsOutDSPId = SYSTEM_DSP_LINK_ID_IPC_BITS_OUT_0;
            gVcapModuleContext.ipcBitsInHLOSId       = SYSTEM_HOST_LINK_ID_IPC_BITS_IN_0;
    

  • Thanks!! You were right. One of our nextlinkIDs were wrong. But we must comment that the decision as to whether to set the variable notifyNextLink as True or False is very tricky. For FrameOut Logic is different and for FramesIn logic is different. One has to look inside the ipc source code to figure out the correct values.

    Thanks again.