DSP

scd-link移植的代码流程

2019-07-13 11:57发布

注意scd的最大支持cif(352x288) 图形的流程: IPC Frames Out----->----->IPC Frames In DSP ----->AlgLink(SCD----->IPCBitsIn(A8) 
代码流程:  if(enableScdAlgLink){
IpcFramesOutLinkRTOS_CreateParams ipcFramesOutVpssPrm;
IpcFramesInLinkRTOS_CreateParams  ipcFramesInDspPrm;
AlgLink_CreateParams                        dspAlgPrm;
IpcBitsOutLinkRTOS_CreateParams      ipcBitsOutDspPrm;
  }
  if(enableScdAlgLink){
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;
gVcapModuleContext.ipcBitsOutDSPId = SYSTEM_DSP_LINK_ID_IPC_BITS_OUT_0;
gVcapModuleContext.ipcBitsInHLOSId = SYSTEM_HOST_LINK_ID_IPC_BITS_IN_1;
}
      if(enableScdAlgLink){
ipcFramesOutVpssPrm.baseCreateParams.inQueParams.prevLinkId    =gVcapModuleContext.nsfId[0];
ipcFramesOutVpssPrm.baseCreateParams.inQueParams.prevLinkQueId = 0;
ipcFramesOutVpssPrm.baseCreateParams.inputFrameRate  = 30;
ipcFramesOutVpssPrm.baseCreateParams.outputFrameRate = 30;
ipcFramesOutVpssPrm.baseCreateParams.notifyPrevLink = TRUE;
ipcFramesOutVpssPrm.baseCreateParams.numOutQue = 1;
ipcFramesOutVpssPrm.baseCreateParams.outQueParams[0].nextLink =ipcOutVpssId;
ipcFramesOutVpssPrm.baseCreateParams.notifyNextLink = TRUE;
      
ipcFramesOutVpssPrm.baseCreateParams.processLink = gVcapModuleContext.ipcFramesInDspId[0];
ipcFramesOutVpssPrm.baseCreateParams.notifyProcessLink = TRUE;
ipcFramesOutVpssPrm.baseCreateParams.noNotifyMode = FALSE;


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.notifyPrevLink = TRUE;
ipcFramesInDspPrm.baseCreateParams.notifyNextLink = TRUE;
ipcFramesInDspPrm.baseCreateParams.noNotifyMode   = FALSE;


dspAlgPrm.inQueParams.prevLinkId = gVcapModuleContext.ipcFramesInDspId[0];
dspAlgPrm.inQueParams.prevLinkQueId = 0;
    }


    if (enableScdAlgLink)
    {
       Int32    numBlksInFrame;
       Int32    numHorzBlks, numVertBlks, chIdx;
       Uint32  x, y, i;


        dspAlgPrm.enableSCDAlg              = TRUE;
        dspAlgPrm.outQueParams[ALG_LINK_SCD_OUT_QUE].nextLink     = gVcapModuleContext.ipcBitsOutDSPId;
        dspAlgPrm.scdCreateParams.numBufPerCh            = 3;




        dspAlgPrm.scdCreateParams.maxWidth               =352;
        if(Vcap_isPalMode())
           dspAlgPrm.scdCreateParams.maxHeight           = 288;
        else
           dspAlgPrm.scdCreateParams.maxHeight           = 240;


        dspAlgPrm.scdCreateParams.maxStride              = 352;
        dspAlgPrm.scdCreateParams.numValidChForSCD       = 8;//16;///////////////////////////////////////////////////////这里是创建osd的个数


        dspAlgPrm.scdCreateParams.numSecs2WaitB4Init     = 3;
        dspAlgPrm.scdCreateParams.numSecs2WaitB4FrmAlert = 1;
        dspAlgPrm.scdCreateParams.inputFrameRate         = 30;
        dspAlgPrm.scdCreateParams.outputFrameRate        = 2;


        dspAlgPrm.scdCreateParams.numSecs2WaitAfterFrmAlert    = 2;
        dspAlgPrm.scdCreateParams.numSecs2Wait2MarkStableFrame = 5;


        dspAlgPrm.scdCreateParams.enableMotionNotify        = FALSE;
        dspAlgPrm.scdCreateParams.enableTamperNotify        = FALSE;


        /* Should be applied on CIF channels whose ch numbers are 4~7 */
        //dspAlgPrm.scdCreateParams.startChNoForSCD = 16;
        // Configure array to monitor scene changes in all frame blocks, i.e., motion detection.
        // Each block is fixed to be 32x10 in size,
        numHorzBlks     = dspAlgPrm.scdCreateParams.maxWidth / 32;
        if(dspAlgPrm.scdCreateParams.maxHeight == 240)
           numVertBlks    = dspAlgPrm.scdCreateParams.maxHeight / 10;
        else   /* For 288 Block height becomes 12 */
           numVertBlks    = dspAlgPrm.scdCreateParams.maxHeight / 12;


        numBlksInFrame  = numHorzBlks * numVertBlks;


        for(chIdx = 0; chIdx < dspAlgPrm.scdCreateParams.numValidChForSCD; chIdx++)
        {
           AlgLink_ScdChParams * chPrm = &dspAlgPrm.scdCreateParams.chDefaultParams[chIdx];


           chPrm->blkNumBlksInFrame  = numBlksInFrame;
           chPrm->chId               = SCDChannelMonitor[chIdx];
           chPrm->mode               = ALG_LINK_SCD_DETECTMODE_MONITOR_BLOCKS_AND_FRAME;
           chPrm->frmIgnoreLightsON  = FALSE;
           chPrm->frmIgnoreLightsOFF = FALSE;
           chPrm->frmSensitivity     = ALG_LINK_SCD_SENSITIVITY_VERYLOW;//ALG_LINK_SCD_SENSITIVITY_VERYHIGH;
           chPrm->frmEdgeThreshold   = 100;


           i = 0;
           for(y = 0; y < numVertBlks; y++)
           {
             for(x = 0; x < numHorzBlks; x++)
             {
               chPrm->blkConfig[i].sensitivity = ALG_LINK_SCD_SENSITIVITY_LOW;
               chPrm->blkConfig[i].monitored     = 0;
               i++;
             }
           }
        }


        ipcBitsOutDspPrm.baseCreateParams.inQueParams.prevLinkId    = gVcapModuleContext.dspAlgId[0];
        ipcBitsOutDspPrm.baseCreateParams.inQueParams.prevLinkQueId = 0;
        ipcBitsOutDspPrm.baseCreateParams.numOutQue                 = 1;
        ipcBitsOutDspPrm.baseCreateParams.outQueParams[0].nextLink  = gVcapModuleContext.ipcBitsInHLOSId;
        MultiCh_ipcBitsInitCreateParams_BitsOutRTOS(&ipcBitsOutDspPrm,
                                                   TRUE);
        ipcBitsOutDspPrm.baseCreateParams.notifyNextLink              = TRUE;
        ipcBitsOutDspPrm.baseCreateParams.noNotifyMode                = FALSE;


        ipcBitsInHostPrm[1].baseCreateParams.inQueParams.prevLinkId = gVcapModuleContext.ipcBitsOutDSPId;
        ipcBitsInHostPrm[1].baseCreateParams.inQueParams.prevLinkQueId = 0;
        ipcBitsInHostPrm[1].baseCreateParams.numOutQue                 = 1;
        ipcBitsInHostPrm[1].baseCreateParams.outQueParams[0].nextLink   = SYSTEM_LINK_ID_INVALID;
        MultiCh_ipcBitsInitCreateParams_BitsInHLOSVcap(&ipcBitsInHostPrm[1]);
        ipcBitsInHostPrm[1].baseCreateParams.notifyPrevLink         = TRUE;
        ipcBitsInHostPrm[1].baseCreateParams.noNotifyMode              = FALSE;
    }
    else
    {
        dspAlgPrm.outQueParams[ALG_LINK_SCD_OUT_QUE].nextLink     = SYSTEM_LINK_ID_INVALID;
    }

if( enableScdAlgLink)
{
        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(gVcapModuleContext.ipcBitsOutDSPId, &ipcBitsOutDspPrm, sizeof(ipcBitsOutDspPrm));
        System_linkCreate(gVcapModuleContext.ipcBitsInHLOSId, &ipcBitsInHostPrm[1], sizeof(ipcBitsInHostPrm[1]));  
 }
有什么不对,下面可以给我留言!!!技术需要交流