Example #1
0
Void MultiCh_deleteVcapVdis()
{
    UInt32 grpxId[VDIS_DEV_MAX];
    UInt32 nullId;
    UInt32 mergeId, dupId;
    UInt32 i;
    UInt32 numSubChains;
    UInt32 enableSdtv   = FALSE;

    numSubChains = 2;

    gVcapModuleContext.captureId    = SYSTEM_LINK_ID_CAPTURE;
    gVcapModuleContext.nsfId[0]     = SYSTEM_LINK_ID_NSF_0;
    gVcapModuleContext.deiId[0]     = SYSTEM_LINK_ID_DEI_HQ_0;
    gVcapModuleContext.deiId[1]     = SYSTEM_LINK_ID_DEI_0;
    gVcapModuleContext.nullSrcId    = SYSTEM_VPSS_LINK_ID_NULL_SRC_0;
    mergeId      = SYSTEM_VPSS_LINK_ID_MERGE_0;
    dupId        = SYSTEM_VPSS_LINK_ID_DUP_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
    grpxId[0]    = SYSTEM_LINK_ID_GRPX_0;
    grpxId[1]    = SYSTEM_LINK_ID_GRPX_1;
#if 0    /* Enabling graphics only for ON CHIP HDMI an OFF CHIP HDMI*/
    grpxId[2]    = SYSTEM_LINK_ID_GRPX_2;
#endif
    nullId       = SYSTEM_VPSS_LINK_ID_NULL_0;

    System_linkDelete(gVcapModuleContext.captureId);
    System_linkDelete(gVcapModuleContext.nsfId[0]);

    for(i=0; i<numSubChains; i++)
        System_linkDelete(gVcapModuleContext.deiId[i] );

    System_linkDelete(gVcapModuleContext.nullSrcId);
    System_linkDelete(mergeId);
    System_linkDelete(dupId);

    for(i=0; i<numSubChains; i++)
        System_linkDelete(gVdisModuleContext.swMsId[i] );

    for(i=0; i<numSubChains; i++)
        System_linkDelete(gVdisModuleContext.displayId[i]);

    if(enableSdtv)
    {
        System_linkDelete(gVdisModuleContext.displayId[2]);
    }

    /* Print the HWI, SWI and all tasks load */
    /* Reset the accumulated timer ticks */
    MultiCh_prfLoadCalcEnable(FALSE, TRUE, FALSE);

}
Example #2
0
Int32 Vdec_delete()
{
    if(gVdecModuleContext.ipcM3InId!=SYSTEM_LINK_ID_INVALID)
        System_linkDelete(gVdecModuleContext.ipcM3InId);

    if(gVdecModuleContext.ipcM3OutId!=SYSTEM_LINK_ID_INVALID)
        System_linkDelete(gVdecModuleContext.ipcM3OutId);

    if(gVdecModuleContext.decId!=SYSTEM_LINK_ID_INVALID)
        System_linkDelete(gVdecModuleContext.decId);

    if(gVdecModuleContext.ipcBitsInRTOSId!=SYSTEM_LINK_ID_INVALID)
        System_linkDelete(gVdecModuleContext.ipcBitsInRTOSId);

    if(gVdecModuleContext.ipcBitsOutHLOSId!=SYSTEM_LINK_ID_INVALID)
        System_linkDelete(gVdecModuleContext.ipcBitsOutHLOSId);

    return 0;
}
Example #3
0
Void MultiCh_deleteVdecVdis()
{
    /* delete can be done in any order */

    MultiCh_displayCtrlDeInit(&gVdisModuleContext.vdisConfig);

    Vdec_delete();
    Vdis_delete();

    if (gMultiCh_VdecVdisObj.enableVideoFrameExport)
    {
        System_linkDelete(gMultiCh_VdecVdisObj.mergeId);
    }
    System_linkDelete(gMultiCh_VdecVdisObj.dupId);
    System_linkDelete(gMultiCh_VdecVdisObj.ipcOutVideoId );
    System_linkDelete(gMultiCh_VdecVdisObj.ipcInVpssId );

    /* Print the HWI, SWI and all tasks load */
    /* Reset the accumulated timer ticks */
    MultiCh_prfLoadCalcEnable(FALSE, TRUE, FALSE);

#if AVSYNC_COMP_ENABLE
    if (gVsysModuleContext.vsysConfig.enableAVsync == TRUE)
    {
        printf("AVSYNC_DeInit start\n");
    AVSYNC_DeInit();
        printf("AVSYNC_DeInit done\n");
    }
#endif

#if (tilerEnable == FALSE)
    {
        /* Disable tiler allocator for this usecase
         * for that tiler memory can be reused for
         * non-tiled allocation
         */
        SystemTiler_enableAllocator();
    }
#endif

    System_deInit();
}
Void MultiCh_deleteProgressive8D1VcapVencVdecVdis()
{
    UInt32 i;
    Bool enableOsdAlgLink = gVsysModuleContext.vsysConfig.enableOsd;
    Bool enableScdAlgLink = gVsysModuleContext.vsysConfig.enableScd;

    UInt32 mergeId[NUM_MERGE_LINK];
    UInt32 dupId[NUM_DUP_LINK];
    UInt32 ipcOutVpssId, ipcInVpssId;
    UInt32 ipcOutVideoId, ipcInVideoId;

    UInt32 ipcBitsOutDSPId;

    mergeId[LIVE_DECODE_MERGE_LINK_IDX]     = SYSTEM_VPSS_LINK_ID_MERGE_0;
    mergeId[D1_CIF_MERGE_LINK_IDX]          = SYSTEM_VPSS_LINK_ID_MERGE_1;

    dupId[CAP_DUP_LINK_IDX]             = SYSTEM_VPSS_LINK_ID_DUP_0;
    dupId[LIVE_DECODE_DUP_LINK_IDX]     = SYSTEM_VPSS_LINK_ID_DUP_1;

    ipcOutVpssId = SYSTEM_VPSS_LINK_ID_IPC_OUT_M3_0;
    ipcInVideoId = SYSTEM_VIDEO_LINK_ID_IPC_IN_M3_0;
    ipcOutVideoId= SYSTEM_VIDEO_LINK_ID_IPC_OUT_M3_0;
    ipcInVpssId  = SYSTEM_VPSS_LINK_ID_IPC_IN_M3_0;

    ipcBitsOutDSPId = SYSTEM_DSP_LINK_ID_IPC_BITS_OUT_0;

    gVdecModuleContext.ipcBitsOutHLOSId = SYSTEM_HOST_LINK_ID_IPC_BITS_OUT_0;
    gVdecModuleContext.ipcBitsInRTOSId = SYSTEM_VIDEO_LINK_ID_IPC_BITS_IN_0;

    System_linkDelete(gVcapModuleContext.captureId);
    System_linkDelete(gVcapModuleContext.sclrId[0]);
    System_linkDelete(gVcapModuleContext.deiId[0]);
    System_linkDelete(gVcapModuleContext.nsfId[0]);

    if(enableOsdAlgLink || enableScdAlgLink)
    {
        System_linkDelete(gVcapModuleContext.ipcFramesOutVpssId[0]);
        System_linkDelete(gVcapModuleContext.ipcFramesInDspId[0]);
        System_linkDelete(gVcapModuleContext.dspAlgId[0]);

        if(enableScdAlgLink)
        {
            System_linkDelete(ipcBitsOutDSPId);
            System_linkDelete(gVcapModuleContext.ipcBitsInHLOSId);
        }
    }
    System_linkDelete(ipcOutVpssId );
    System_linkDelete(ipcInVideoId );

    System_linkDelete(gVencModuleContext.encId);
    System_linkDelete(gVencModuleContext.ipcBitsOutRTOSId);
    System_linkDelete(gVencModuleContext.ipcBitsInHLOSId);
    System_linkDelete(gVdecModuleContext.ipcBitsOutHLOSId);
    System_linkDelete(gVdecModuleContext.ipcBitsInRTOSId);
    System_linkDelete(gVdecModuleContext.decId);

    System_linkDelete(ipcOutVideoId);
    System_linkDelete(ipcInVpssId  );

    for(i=0; i<2; i++)
        System_linkDelete(gVdisModuleContext.swMsId[i] );

    for(i=0; i<2; i++)
        System_linkDelete(gVdisModuleContext.displayId[i]);

    for(i=0; i<NUM_DUP_LINK; i++)
        System_linkDelete(dupId[i]);

    for(i=0; i<NUM_MERGE_LINK; i++)
    {
        if (mergeId[i] != SYSTEM_LINK_ID_INVALID )
           System_linkDelete(mergeId[i]);
    }

    /* Print the HWI, SWI and all tasks load */
    /* Reset the accumulated timer ticks */
    MultiCh_prfLoadCalcEnable(FALSE, TRUE, FALSE);


#if (TILER_ENABLE == FALSE)
    {
        /* Disable tiler allocator for this usecase
         * for that tiler memory can be reused for
         * non-tiled allocation
         */
        SystemTiler_enableAllocator();
    }
#endif

}
Void Chains_doubleChCapScEncSend(Chains_Ctrl *chainsCfg)
{
    CaptureLink_CreateParams            capturePrm;
    CaptureLink_VipInstParams           *pCaptureInstPrm;
    CaptureLink_OutParams               *pCaptureOutPrm;
    MergeLink_CreateParams              mergePrm;   
    DupLink_CreateParams                dupPrm;
    NsfLink_CreateParams       		 nsfPrm;
    DupLink_CreateParams                dup2Prm;			//for two display
    SwMsLink_CreateParams               swMsPrm[CHAINS_SW_MS_MAX_DISPLAYS];
    DisplayLink_CreateParams            displayPrm[CHAINS_SW_MS_MAX_DISPLAYS];
    IpcLink_CreateParams                ipcOutVpssPrm;
    IpcLink_CreateParams                ipcInVideoPrm;
    EncLink_CreateParams                encPrm;
    IpcBitsOutLinkRTOS_CreateParams     ipcBitsOutVideoPrm;
    IpcBitsInLinkHLOS_CreateParams      ipcBitsInHostPrm;

    UInt32 captureId, vipInstId;
    UInt32 mergeId;
    UInt32 dupId;
    UInt32 nsfId;
    UInt32 dup2Id;
    UInt32 swMsId[CHAINS_SW_MS_MAX_DISPLAYS];
    UInt32 displayId[CHAINS_SW_MS_MAX_DISPLAYS];
    UInt32 ipcOutVpssId;
    UInt32 ipcInVideoId;
    UInt32 encId;
    UInt32 ipcBitsOutVideoId;
    UInt32 ipcBitsInHostId;

    Bool enableOsdAlgLink=1;
    UInt32 enableDisplay = FALSE;
/****************msg between sys and chain*****/
#if 0
	int msgqid = 0;
	msgqid = Msg_Init(MSG_KEY);
#endif
/*************************************/
////////////////////////////OSD///////////////////////////////////
    AlgLink_CreateParams        	    DSPLinkPrm;//guo changed to global
    IpcFramesOutLinkRTOS_CreateParams  ipcFramesOutVpssPrm;
    IpcFramesInLinkHLOS_CreateParams   ipcFramesInDspPrm;
    UInt32 osdId;
    UInt32 ipcFramesOutVpssId, ipcFramesInDspId;	
    UInt8 osdFormat[ALG_LINK_OSD_MAX_CH];

    memset(osdFormat,  SYSTEM_DF_YUV422I_YUYV, ALG_LINK_OSD_MAX_CH);
    if (enableOsdAlgLink) 
    {
        Chains_ipcFramesInit();//This is likely no use.
    }
    CHAINS_INIT_STRUCT(IpcFramesOutLinkRTOS_CreateParams ,ipcFramesOutVpssPrm);
    CHAINS_INIT_STRUCT(IpcFramesInLinkHLOS_CreateParams  ,ipcFramesInDspPrm);
    CHAINS_INIT_STRUCT(AlgLink_CreateParams,DSPLinkPrm);
    ipcFramesOutVpssId  = SYSTEM_VPSS_LINK_ID_IPC_FRAMES_OUT_0;
    ipcFramesInDspId      = SYSTEM_DSP_LINK_ID_IPC_FRAMES_IN_0;
    osdId     = SYSTEM_LINK_ID_ALG_0;
//////////////////guo2014/11/21--added for scd////////////////////////
	//Scd CreateParams is contined in AlgLink_CreateParmas
	NsfLink_CreateParams       		 nsfPrm2;//SCD  only supports YUV420
	SclrLink_CreateParams           sclrPrm;
	AlgLink_CreateParams		scdPrm;
	IpcFramesOutLinkRTOS_CreateParams  ipcFramesOutVpssPrm2;	//outVpss
	IpcFramesInLinkRTOS_CreateParams  ipcFramesInDspPrm2;		//Into Dsp
	IpcBitsOutLinkRTOS_CreateParams   ipcBitsOutDspPrm2;
	IpcBitsInLinkHLOS_CreateParams  ipcBitsInHostPrm2;

	UInt32 nsfId2;
	UInt32 scdId;
	UInt32 sclrId;
	UInt32 ipcFramesOutVpssId2;
	UInt32 ipcFramesInDspId2;
	UInt32 ipcBitsOutDspId2;
	UInt32 ipcBitsInHostId2;
	
	Bool enableScdAlgLink = 1;

	nsfId2 = SYSTEM_LINK_ID_NSF_1;
	scdId = SYSTEM_LINK_ID_ALG_1;
	sclrId = SYSTEM_LINK_ID_SCLR_INST_0;
	ipcFramesOutVpssId2 =  SYSTEM_VPSS_LINK_ID_IPC_FRAMES_OUT_1; 
	ipcFramesInDspId2 = SYSTEM_DSP_LINK_ID_IPC_FRAMES_IN_1;
	ipcBitsOutDspId2 = SYSTEM_DSP_LINK_ID_IPC_BITS_OUT_0;
	ipcBitsInHostId2 = SYSTEM_HOST_LINK_ID_IPC_BITS_IN_1;
	CHAINS_INIT_STRUCT(NsfLink_CreateParams, nsfPrm2);
	CHAINS_INIT_STRUCT(SclrLink_CreateParams,sclrPrm);
	CHAINS_INIT_STRUCT(IpcFramesOutLinkRTOS_CreateParams,ipcFramesOutVpssPrm2);
   	CHAINS_INIT_STRUCT(IpcFramesInLinkHLOS_CreateParams,ipcFramesInDspPrm2);
	CHAINS_INIT_STRUCT(IpcBitsOutLinkRTOS_CreateParams,ipcBitsOutDspPrm2);
	CHAINS_INIT_STRUCT(IpcBitsInLinkHLOS_CreateParams,ipcBitsInHostPrm2);
	CHAINS_INIT_STRUCT(AlgLink_CreateParams,scdPrm);


	Scd_bitsWriteCreate(0,ipcBitsInHostId2);	//Init scd's ipcBitsInHost by:guo8113,this is ok, temporarily disabled!
	
//----------------end scd-----------------------------
    Chains_ipcBitsInit();		

    UInt32 i;
    char   ch;
   
    CHAINS_INIT_STRUCT(CaptureLink_CreateParams,capturePrm);
    for (i=0; i<CHAINS_SW_MS_MAX_DISPLAYS; i++) {
        CHAINS_INIT_STRUCT(SwMsLink_CreateParams,swMsPrm[i]);
        CHAINS_INIT_STRUCT(DisplayLink_CreateParams,displayPrm[i]);
    }
    CHAINS_INIT_STRUCT(IpcLink_CreateParams,ipcOutVpssPrm);
    CHAINS_INIT_STRUCT(IpcLink_CreateParams,ipcInVideoPrm);
    CHAINS_INIT_STRUCT(NsfLink_CreateParams, nsfPrm);
    CHAINS_INIT_STRUCT(EncLink_CreateParams,encPrm);
    CHAINS_INIT_STRUCT(IpcBitsOutLinkRTOS_CreateParams,ipcBitsOutVideoPrm);
    CHAINS_INIT_STRUCT(IpcBitsInLinkHLOS_CreateParams,ipcBitsInHostPrm);

    captureId     = SYSTEM_LINK_ID_CAPTURE;
    mergeId       = SYSTEM_VPSS_LINK_ID_MERGE_0;
    dupId         = SYSTEM_VPSS_LINK_ID_DUP_0;
    nsfId     = SYSTEM_LINK_ID_NSF_0;
    dup2Id        = SYSTEM_VPSS_LINK_ID_DUP_1;
    swMsId[0]     = SYSTEM_LINK_ID_SW_MS_MULTI_INST_0;
    swMsId[1]     = SYSTEM_LINK_ID_SW_MS_MULTI_INST_1;
    displayId[0]  = SYSTEM_LINK_ID_DISPLAY_0;
    displayId[1]  = SYSTEM_LINK_ID_DISPLAY_1;

    encId         = SYSTEM_LINK_ID_VENC_0;
    ipcOutVpssId  = SYSTEM_VPSS_LINK_ID_IPC_OUT_M3_0;
    ipcInVideoId  = SYSTEM_VIDEO_LINK_ID_IPC_IN_M3_0;
    ipcBitsOutVideoId   = SYSTEM_VIDEO_LINK_ID_IPC_BITS_OUT_0;
    ipcBitsInHostId     = SYSTEM_HOST_LINK_ID_IPC_BITS_IN_0;

    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
    );

    capturePrm.numVipInst               = 2;
    capturePrm.tilerEnable              = FALSE;
    capturePrm.numBufsPerCh             = 16;
    capturePrm.numExtraBufs             = 0;
    capturePrm.maxBlindAreasPerCh       = 0;
    capturePrm.isPalMode                = FALSE;
    capturePrm.enableSdCrop             = FALSE;
    capturePrm.doCropInCapture          = FALSE;

    for(i=0; i<capturePrm.numVipInst; i++)
    {
    	vipInstId = SYSTEM_CAPTURE_INST_VIP0_PORTA + 2*i;
        pCaptureInstPrm                     = &capturePrm.vipInst[i];
        pCaptureInstPrm->vipInstId          = vipInstId%SYSTEM_CAPTURE_INST_MAX;
        pCaptureInstPrm->videoDecoderId     = SYSTEM_DEVICE_VID_DEC_SII9233A_DRV;
        pCaptureInstPrm->inDataFormat       = SYSTEM_DF_YUV422P;
        pCaptureInstPrm->standard           = chainsCfg->displayRes[i];
        pCaptureInstPrm->numOutput          = 2;
        pCaptureInstPrm->numChPerOutput     = 1;
        pCaptureInstPrm->frameCaptureMode   = FALSE;
        pCaptureInstPrm->fieldsMerged       = FALSE;

        pCaptureOutPrm                      = &pCaptureInstPrm->outParams[0];
        pCaptureOutPrm->dataFormat          = SYSTEM_DF_YUV422I_YUYV;//nsf can change 422 to 420,because enc require 420
        pCaptureOutPrm->scEnable            = FALSE;
        pCaptureOutPrm->scOutWidth          = gChains_ctrl.channelConf[i].width;
        pCaptureOutPrm->scOutHeight         = gChains_ctrl.channelConf[i].height;
        pCaptureOutPrm->outQueId            = 0;

        pCaptureOutPrm                      = &pCaptureInstPrm->outParams[1];
        pCaptureOutPrm->dataFormat          = SYSTEM_DF_YUV422I_YUYV;
        pCaptureOutPrm->scEnable            = FALSE;
        pCaptureOutPrm->scOutWidth          = gChains_ctrl.channelConf[2+i].width;
        pCaptureOutPrm->scOutHeight         = gChains_ctrl.channelConf[2+i].height;
        pCaptureOutPrm->outQueId            = 1;
    }
    capturePrm.outQueParams[0].nextLink     = mergeId;
    capturePrm.outQueParams[1].nextLink     = mergeId;

    System_linkCreate(captureId, &capturePrm, sizeof(capturePrm));
    for (i=0; i<gChains_ctrl.channelNum; i++) {
        chainsCfg->displayRes[i] = capturePrm.vipInst[i].standard;
        Vsys_getResSize(chainsCfg->displayRes[i], &chainsCfg->channelConf[i].width, &chainsCfg->channelConf[i].height);
        Vsys_getResRate(chainsCfg->displayRes[i], &chainsCfg->channelConf[i].frameRate);
    }

    mergePrm.numInQue                       = 2;
    mergePrm.inQueParams[0].prevLinkId      = captureId;
    mergePrm.inQueParams[0].prevLinkQueId   = 0;
    mergePrm.inQueParams[1].prevLinkId      = captureId;
    mergePrm.inQueParams[1].prevLinkQueId   = 1;
//guo---------------------------------------------------------
     if (enableOsdAlgLink) 
    {
        mergePrm.outQueParams.nextLink=ipcFramesOutVpssId;  
	 ipcFramesOutVpssPrm.baseCreateParams.inQueParams.prevLinkId = mergeId;
        ipcFramesOutVpssPrm.baseCreateParams.noNotifyMode = FALSE;
        ipcFramesOutVpssPrm.baseCreateParams.notifyNextLink = TRUE;
        ipcFramesOutVpssPrm.baseCreateParams.notifyPrevLink = FALSE;
        ipcFramesOutVpssPrm.baseCreateParams.inQueParams.prevLinkQueId = 0;
        ipcFramesOutVpssPrm.baseCreateParams.outQueParams[0].nextLink = dupId;
        ipcFramesOutVpssPrm.baseCreateParams.inputFrameRate = chainsCfg->channelConf[0].frameRate;
        ipcFramesOutVpssPrm.baseCreateParams.outputFrameRate =chainsCfg->channelConf[0].frameRate;// 
        ipcFramesOutVpssPrm.baseCreateParams.processLink = ipcFramesInDspId;
        ipcFramesOutVpssPrm.baseCreateParams.notifyProcessLink = FALSE;
        ipcFramesInDspPrm.baseCreateParams.noNotifyMode = TRUE;
        ipcFramesInDspPrm.baseCreateParams.notifyNextLink = TRUE;
        ipcFramesInDspPrm.baseCreateParams.notifyPrevLink = FALSE;
        ipcFramesInDspPrm.baseCreateParams.inQueParams.prevLinkId = ipcFramesOutVpssId;
        ipcFramesInDspPrm.baseCreateParams.inQueParams.prevLinkQueId = 0;
        ipcFramesInDspPrm.baseCreateParams.outQueParams[0].nextLink = osdId;
        ipcFramesInDspPrm.exportOnlyPhyAddr = FALSE;
        ipcFramesInDspPrm.baseCreateParams.inputFrameRate = chainsCfg->channelConf[0].frameRate;
        ipcFramesInDspPrm.baseCreateParams.outputFrameRate = chainsCfg->channelConf[0].frameRate;
        ipcFramesInDspPrm.baseCreateParams.notifyProcessLink = FALSE;
        Chains_ipcFramesInSetCbInfo(&ipcFramesInDspPrm);	//This is likely no use.

	 DSPLinkPrm.inQueParams.prevLinkId=ipcFramesInDspId;
        DSPLinkPrm.inQueParams.prevLinkQueId = 0;
        DSPLinkPrm.enableOSDAlg=TRUE;
	 DSPLinkPrm.enableSCDAlg=FALSE;
//#define LOGOONLY  //this is reserved for original logo only osd ,for case you will test the logo.
#ifdef LOGOONLY

        Chains_OSDConfig(DSPLinkPrm);//origin logo osd is OK
 #else

 	Demo_osdInit(4, osdFormat);
       for(i=0;i< gChains_ctrl.channelNum; i++)
       	{
		       DSPLinkPrm.osdChCreateParams[i].maxWidth = CHAINS_OSD_WIN_MAX_WIDTH;
       			DSPLinkPrm.osdChCreateParams[i].maxHeight = CHAINS_OSD_WIN_MAX_HEIGHT;
			memcpy(&(DSPLinkPrm.osdChCreateParams[i].chDefaultParams),
				&g_osdChParam[i],sizeof(AlgLink_OsdChWinParams));//(dst,src,size)
       	}
 #endif
    }
    else
    {
	 mergePrm.outQueParams.nextLink = dupId;
    }
//------------------------------------------------------------
    mergePrm.notifyNextLink                 = TRUE;
    if (enableOsdAlgLink) 
    {
        dupPrm.inQueParams.prevLinkId    = ipcFramesOutVpssId;
    }
    else 
    {
        dupPrm.inQueParams.prevLinkId       = mergeId;
    }

    dupPrm.inQueParams.prevLinkQueId        = 0;
    dupPrm.numOutQue                        = 2;
//guo scd--------
    if(enableScdAlgLink)
    {
    	dupPrm.numOutQue	=	3;	//dup's third OutQue
	dupPrm.outQueParams[2].nextLink = sclrId;
	

    	sclrPrm.inQueParams.prevLinkId             = dupId;
    	sclrPrm.inQueParams.prevLinkQueId          = 2;
    	sclrPrm.outQueParams.nextLink              = nsfId2;

  	sclrPrm.tilerEnable                        = FALSE;
    	sclrPrm.enableLineSkipSc                   = TRUE;//FALSE;
    	sclrPrm.inputFrameRate                     = 60;
    	sclrPrm.outputFrameRate                    = 60;
    	sclrPrm.scaleMode                          = DEI_SCALE_MODE_ABSOLUTE;
	sclrPrm.outScaleFactor.absoluteResolution.outWidth = 352;
	sclrPrm.outScaleFactor.absoluteResolution.outHeight = 240;


   	nsfPrm2.inQueParams.prevLinkId    = sclrId;
    	nsfPrm2.inQueParams.prevLinkQueId = 0;
    	nsfPrm2.bypassNsf                 = TRUE;
    	nsfPrm2.tilerEnable               = FALSE;
    	nsfPrm2.numOutQue                 = 1;
    	nsfPrm2.outQueParams[0].nextLink  = ipcFramesOutVpssId2;
    	nsfPrm2.inputFrameRate            = 60;
    	nsfPrm2.outputFrameRate           = 60;
    	nsfPrm2.numBufsPerCh              = 8;

      	ipcFramesOutVpssPrm2.baseCreateParams.inQueParams.prevLinkId = nsfId2;
        ipcFramesOutVpssPrm2.baseCreateParams.inQueParams.prevLinkQueId = 0;
        ipcFramesOutVpssPrm2.baseCreateParams.notifyPrevLink = TRUE;

        ipcFramesOutVpssPrm2.baseCreateParams.numOutQue = 1;
        ipcFramesOutVpssPrm2.baseCreateParams.outQueParams[0].nextLink = ipcFramesInDspId2;
        ipcFramesOutVpssPrm2.baseCreateParams.notifyNextLink = TRUE;
	ipcFramesOutVpssPrm2.baseCreateParams.inputFrameRate = 60;
	ipcFramesOutVpssPrm2.baseCreateParams.outputFrameRate = 2;


        ipcFramesInDspPrm2.baseCreateParams.inQueParams.prevLinkId = ipcFramesOutVpssId2;
        ipcFramesInDspPrm2.baseCreateParams.inQueParams.prevLinkQueId = 0;
        ipcFramesInDspPrm2.baseCreateParams.numOutQue   = 1;
        ipcFramesInDspPrm2.baseCreateParams.outQueParams[0].nextLink = scdId;
        ipcFramesInDspPrm2.baseCreateParams.notifyPrevLink = TRUE;
        ipcFramesInDspPrm2.baseCreateParams.notifyNextLink = TRUE;
        ipcFramesInDspPrm2.baseCreateParams.noNotifyMode   = FALSE;


	Int32    numBlksInFrame;
       Int32    numHorzBlks, numVertBlks, chIdx;
       Uint32  x, y, i;
	scdPrm.inQueParams.prevLinkId = ipcFramesInDspId2;
	scdPrm.inQueParams.prevLinkQueId =0;
        scdPrm.enableSCDAlg              = TRUE;
	scdPrm.enableOSDAlg	= FALSE;
        scdPrm.outQueParams[ALG_LINK_SCD_OUT_QUE].nextLink     = ipcBitsOutDspId2;
        scdPrm.scdCreateParams.numBufPerCh            = 3;

        scdPrm.scdCreateParams.maxWidth               = 352;
           scdPrm.scdCreateParams.maxHeight           = 240;//288

        scdPrm.scdCreateParams.maxStride              = 352;
        scdPrm.scdCreateParams.numValidChForSCD       = 4;	//16

        scdPrm.scdCreateParams.numSecs2WaitB4Init     = 3;
        scdPrm.scdCreateParams.numSecs2WaitB4FrmAlert = 1;
        scdPrm.scdCreateParams.inputFrameRate         = 2;
        scdPrm.scdCreateParams.outputFrameRate        = 2;

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

        scdPrm.scdCreateParams.enableMotionNotify        = FALSE;
        scdPrm.scdCreateParams.enableTamperNotify        = FALSE;

        /* Should be applied on CIF channels whose ch numbers are 4~7 */
        //scdPrm.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     = scdPrm.scdCreateParams.maxWidth / 32;
        if(scdPrm.scdCreateParams.maxHeight == 240)
           numVertBlks    = scdPrm.scdCreateParams.maxHeight / 10;
        else   /* For 288 Block height becomes 12 */
           numVertBlks    = scdPrm.scdCreateParams.maxHeight / 12;

        numBlksInFrame  = numHorzBlks * numVertBlks;

        for(chIdx = 0; chIdx < scdPrm.scdCreateParams.numValidChForSCD; chIdx++)
        {
           AlgLink_ScdChParams * chPrm = &scdPrm.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_HIGH;//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_MID;
               chPrm->blkConfig[i].monitored     = 1;
               i++;
             }
           }
        }

        ipcBitsOutDspPrm2.baseCreateParams.inQueParams.prevLinkId    = scdId;
        ipcBitsOutDspPrm2.baseCreateParams.inQueParams.prevLinkQueId = 0;
        ipcBitsOutDspPrm2.baseCreateParams.numOutQue                 = 1;
	 ipcBitsOutDspPrm2.baseCreateParams.noNotifyMode	= FALSE;
	  ipcBitsOutDspPrm2.baseCreateParams.notifyNextLink              = TRUE;
        ipcBitsOutDspPrm2.baseCreateParams.outQueParams[0].nextLink  =  ipcBitsInHostId2;
        
        ipcBitsOutDspPrm2.baseCreateParams.notifyNextLink              = TRUE;
        ipcBitsOutDspPrm2.baseCreateParams.noNotifyMode                = FALSE;

        ipcBitsInHostPrm2.baseCreateParams.inQueParams.prevLinkId = ipcBitsOutDspId2;
        ipcBitsInHostPrm2.baseCreateParams.inQueParams.prevLinkQueId = 0;
        ipcBitsInHostPrm2.baseCreateParams.numOutQue                 = 1;
        ipcBitsInHostPrm2.baseCreateParams.outQueParams[0].nextLink   = SYSTEM_LINK_ID_INVALID;
  
	Chains_ipcBitsInitCreateParams_BitsInHLOSVcap(&ipcBitsInHostPrm2);
        ipcBitsInHostPrm2.baseCreateParams.notifyPrevLink         = TRUE;
        ipcBitsInHostPrm2.baseCreateParams.noNotifyMode              = FALSE;		
    }
    else
    {
        scdPrm.outQueParams[ALG_LINK_SCD_OUT_QUE].nextLink     = SYSTEM_LINK_ID_INVALID;//nullId;
    }
	  
    dupPrm.outQueParams[0].nextLink = nsfId;
    dupPrm.outQueParams[1].nextLink = dup2Id;//to display
    dupPrm.notifyNextLink                    = TRUE;


    nsfPrm.inQueParams.prevLinkId    = dupId;
    nsfPrm.inQueParams.prevLinkQueId = 0;
    nsfPrm.bypassNsf                 = FALSE;
    nsfPrm.tilerEnable               = TRUE;
    nsfPrm.numOutQue                 = 1;
    nsfPrm.outQueParams[0].nextLink  = ipcOutVpssId;
    nsfPrm.inputFrameRate            = chainsCfg->channelConf[0].frameRate;
    nsfPrm.outputFrameRate           = chainsCfg->channelConf[0].frameRate;
    nsfPrm.numBufsPerCh              = 8;

    ipcOutVpssPrm.inQueParams.prevLinkId    = nsfId;
    ipcOutVpssPrm.inQueParams.prevLinkQueId = 0;
    ipcOutVpssPrm.numOutQue                 = 1;
    ipcOutVpssPrm.numChPerOutQue[0]         = 1;
    ipcOutVpssPrm.outQueParams[0].nextLink  = ipcInVideoId;
    ipcOutVpssPrm.notifyNextLink            = TRUE;
    ipcOutVpssPrm.notifyPrevLink            = FALSE;
    ipcOutVpssPrm.noNotifyMode              = FALSE;
    ipcOutVpssPrm.numChPerOutQue[0]         = 0;
    ipcOutVpssPrm.equallyDivideChAcrossOutQues = FALSE;

    ipcInVideoPrm.inQueParams.prevLinkId    = ipcOutVpssId;
    ipcInVideoPrm.inQueParams.prevLinkQueId = 0;
    ipcInVideoPrm.numOutQue                 = 1;
    ipcInVideoPrm.numChPerOutQue[0]         = 1;
    ipcInVideoPrm.outQueParams[0].nextLink  = encId;
    ipcInVideoPrm.notifyNextLink            = TRUE;
    ipcInVideoPrm.notifyPrevLink            = FALSE;
    ipcInVideoPrm.noNotifyMode              = FALSE;
    ipcInVideoPrm.numChPerOutQue[0]         = 0;
    ipcInVideoPrm.equallyDivideChAcrossOutQues = FALSE;

    for (i=0; i<gChains_ctrl.channelNum; i++) {
        encPrm.chCreateParams[i].format                             = chainsCfg->channelConf[i].encFormat;
        encPrm.chCreateParams[i].profile                            = chainsCfg->channelConf[i].encProfile;
        encPrm.chCreateParams[i].dataLayout                         = IVIDEO_FIELD_SEPARATED;
        encPrm.chCreateParams[i].fieldMergeEncodeEnable             = FALSE;
        encPrm.chCreateParams[i].enableAnalyticinfo                 = FALSE;
        encPrm.chCreateParams[i].enableWaterMarking                 = FALSE;
        encPrm.chCreateParams[i].encodingPreset                     = XDM_USER_DEFINED;
        encPrm.chCreateParams[i].rateControlPreset                  = IVIDEO_USER_DEFINED;
        encPrm.chCreateParams[i].enableHighSpeed                    = FALSE;
        encPrm.chCreateParams[i].defaultDynamicParams.interFrameInterval  = 1;
        encPrm.chCreateParams[i].defaultDynamicParams.intraFrameInterval  = chainsCfg->channelConf[i].intraFrameInterval;
        encPrm.chCreateParams[i].defaultDynamicParams.inputFrameRate      = chainsCfg->channelConf[i].frameRate;
        encPrm.chCreateParams[i].defaultDynamicParams.targetFrameRate     = chainsCfg->channelConf[i].encFrameRate;
        encPrm.chCreateParams[i].defaultDynamicParams.targetBitRate       = chainsCfg->channelConf[i].bitRate;
        encPrm.chCreateParams[i].defaultDynamicParams.mvAccuracy          = IVIDENC2_MOTIONVECTOR_QUARTERPEL;
        encPrm.chCreateParams[i].defaultDynamicParams.rcAlg               = chainsCfg->channelConf[i].rateCtrl;
        encPrm.chCreateParams[i].defaultDynamicParams.qpMin               = 0;
        encPrm.chCreateParams[i].defaultDynamicParams.qpMax               = 51;
        encPrm.chCreateParams[i].defaultDynamicParams.qpInit              = -1;
        encPrm.chCreateParams[i].defaultDynamicParams.vbrDuration         = 8;
        encPrm.chCreateParams[i].defaultDynamicParams.vbrSensitivity      = 0;
    }
    encPrm.inQueParams.prevLinkId   = ipcInVideoId;
    encPrm.inQueParams.prevLinkQueId= 0;
    encPrm.outQueParams.nextLink    = ipcBitsOutVideoId;
    encPrm.numBufPerCh[0]           = 0;

    ipcBitsOutVideoPrm.baseCreateParams.inQueParams.prevLinkId      = encId;
    ipcBitsOutVideoPrm.baseCreateParams.inQueParams.prevLinkQueId   = 0;
    ipcBitsOutVideoPrm.baseCreateParams.numOutQue                   = 1;
    ipcBitsOutVideoPrm.baseCreateParams.numChPerOutQue[0]           = 1;
    ipcBitsOutVideoPrm.baseCreateParams.outQueParams[0].nextLink    = ipcBitsInHostId;
    ipcBitsOutVideoPrm.baseCreateParams.notifyNextLink              = FALSE;
    ipcBitsOutVideoPrm.baseCreateParams.notifyPrevLink              = FALSE;
    ipcBitsOutVideoPrm.baseCreateParams.noNotifyMode                = TRUE;
    Chains_ipcBitsInitCreateParams_BitsOutRTOS(&ipcBitsOutVideoPrm,FALSE);

    ipcBitsInHostPrm.baseCreateParams.inQueParams.prevLinkId        = ipcBitsOutVideoId;
    ipcBitsInHostPrm.baseCreateParams.inQueParams.prevLinkQueId     = 0;
    ipcBitsInHostPrm.baseCreateParams.numOutQue                     = 1;
    ipcBitsInHostPrm.baseCreateParams.numChPerOutQue[0]             = 1;
    ipcBitsInHostPrm.baseCreateParams.notifyNextLink                = FALSE;
    ipcBitsInHostPrm.baseCreateParams.notifyPrevLink                = FALSE;
    ipcBitsInHostPrm.baseCreateParams.noNotifyMode                  = TRUE;
    Chains_ipcBitsInitCreateParams_BitsInHLOS(&ipcBitsInHostPrm);

    Chains_displayCtrlInit(chainsCfg->displayRes);
    System_linkCreate(mergeId, &mergePrm, sizeof(mergePrm));
   

    dup2Prm.inQueParams.prevLinkId           = dupId;
    dup2Prm.inQueParams.prevLinkQueId        = 1;
    dup2Prm.numOutQue                        = 2;
    dup2Prm.outQueParams[0].nextLink         = swMsId[0];
    dup2Prm.outQueParams[1].nextLink         = swMsId[1];

    dup2Prm.notifyNextLink                   = TRUE;

    for (i=0; i<2; i++) {
		
        swMsPrm[i].numSwMsInst               = 1;
        swMsPrm[i].swMsInstId[0]             = SYSTEM_SW_MS_SC_INST_SC5;
        swMsPrm[i].inQueParams.prevLinkId    = dup2Id;
        swMsPrm[i].inQueParams.prevLinkQueId = i;
        swMsPrm[i].outQueParams.nextLink     = displayId[i];
        swMsPrm[i].lineSkipMode              = FALSE;
        swMsPrm[i].enableLayoutGridDraw      = FALSE;
        swMsPrm[i].layoutPrm.outputFPS       = chainsCfg->channelConf[i].frameRate;
        swMsPrm[i].maxInputQueLen            = SYSTEM_SW_MS_DEFAULT_INPUT_QUE_LEN;
        swMsPrm[i].maxOutRes                 = chainsCfg->displayRes[i];
        swMsPrm[i].numOutBuf                 = 0;
        Chains_swMsSetLayoutParams(i, &swMsPrm[i]);

        displayPrm[i].numInputQueues                = 1;
        displayPrm[i].activeQueue                   = 0;
       displayPrm[i].inQueParams[0].prevLinkId     = swMsId[i];
        displayPrm[i].inQueParams[0].prevLinkQueId  = 0;
        displayPrm[i].displayRes                    = chainsCfg->displayRes[i];
        displayPrm[i].forceFieldSeparatedInputMode  = FALSE;
    }

 	if(enableOsdAlgLink)
    {
        System_linkCreate(ipcFramesOutVpssId     , &ipcFramesOutVpssPrm    , sizeof(ipcFramesOutVpssPrm));
        System_linkCreate(ipcFramesInDspId     , &ipcFramesInDspPrm    , sizeof(ipcFramesInDspPrm));
        System_linkCreate(osdId,&DSPLinkPrm,sizeof(DSPLinkPrm));
    }


    System_linkCreate(dupId, &dupPrm, sizeof(dupPrm));
    System_linkCreate(nsfId , &nsfPrm, sizeof(nsfPrm));
    System_linkCreate(ipcOutVpssId, &ipcOutVpssPrm, sizeof(ipcOutVpssPrm));
    System_linkCreate(ipcInVideoId, &ipcInVideoPrm, sizeof(ipcInVideoPrm));
    System_linkCreate(encId, &encPrm, sizeof(encPrm));
    System_linkCreate(ipcBitsOutVideoId, &ipcBitsOutVideoPrm, sizeof(ipcBitsOutVideoPrm));
    System_linkCreate(ipcBitsInHostId, &ipcBitsInHostPrm, sizeof(ipcBitsInHostPrm));

		//guo
	if(enableScdAlgLink)
	{
		System_linkCreate(sclrId, &sclrPrm    , sizeof(sclrPrm ));
		System_linkCreate(nsfId2,&nsfPrm2,sizeof(nsfPrm2));
		System_linkCreate(ipcFramesOutVpssId2     , &ipcFramesOutVpssPrm2    , sizeof(ipcFramesOutVpssPrm2));
		System_linkCreate(ipcFramesInDspId2     , &ipcFramesInDspPrm2    , sizeof(ipcFramesInDspPrm2));
		System_linkCreate(scdId,&scdPrm,sizeof(scdPrm));
		System_linkCreate(ipcBitsOutDspId2, &ipcBitsOutDspPrm2, sizeof(ipcBitsOutDspPrm2));
   		System_linkCreate(ipcBitsInHostId2, &ipcBitsInHostPrm2, sizeof(ipcBitsInHostPrm2));
	
	}

    System_linkCreate(dup2Id, &dup2Prm, sizeof(dup2Prm));
    for (i=0; i<2; i++) {
       System_linkCreate(swMsId[i], &swMsPrm[i], sizeof(swMsPrm[i]));
       System_linkCreate(displayId[i], &displayPrm[i], sizeof(displayPrm[i]));
    }

    //Chains_memPrintHeapStatus();

   
    System_linkStart(encId);
    for (i=0; i<2; i++) {
          System_linkStart(displayId[i]);
          System_linkStart(swMsId[i]);
    }

  	grpx_init(GRPX_FORMAT_RGB888);
	
     System_linkStart(dup2Id);
     System_linkStart(nsfId);
     System_linkStart(dupId);
//guo scd
	System_linkStart(ipcBitsInHostId2);
	System_linkStart(ipcBitsOutDspId2);
	System_linkStart(scdId);
	System_linkStart(ipcFramesInDspId2);
	System_linkStart(ipcFramesOutVpssId2);
	System_linkStart(nsfId2);
	System_linkStart(sclrId);
//guo OSD
	if(enableOsdAlgLink)
        {
            System_linkStart(osdId);
            System_linkStart(ipcFramesInDspId);
            System_linkStart(ipcFramesOutVpssId);		
        }
	
        System_linkStart(mergeId);
        System_linkStart(captureId);
 	//grpx_fb_draw_demo();

	/***guo********poll thread  ***/
	pthread_t poll_t;
	int res;
	
	PollData poll={
		.encId = encId,
		.swMsId[0]=swMsId[0],
		.swMsId[1]=swMsId[1],
		.swMsPrm[0]=swMsPrm[0],
		.swMsPrm[1]=swMsPrm[1]		
		};
	
	res = pthread_create(&poll_t,NULL,poll_thread,(void*)&poll);
	if(res!=0)
	{
		perror("thread creation failed");
		exit(-1);
	}
	/************end*/

		//Chains_ScdPrint(scdId);//This is only for temp test!!!
//This is for user input args 
	
	Chains_ipcBitsLocSt();	//start RTP (or Local Storage)
    while(1)
    {
      printf("My menu:Input L to storage the video and E to stop\n"
				"Input P for statistic\n");
            ch = Chains_menuRunTime();
            if(ch=='0')
                break;
           
            if(ch=='p')
            {
 				MultiCh_prfLoadPrint(TRUE,TRUE);
				continue;
            }

	   		if(ch == 'd')//draw
	   		{
	   		 grpx_draw_box(500,500,500,500);//在HDMI2上画了出来
	   		 grpx_fb_draw_grid(300,300,200,100,11);
	   		 continue;
			
	   		}
	   		if(ch == 'x')
	   		{
	   		grpx_draw_box_exit(500,500,500,500);
			grpx_fb_draw_grid_exit(300,300,200,100,11);
	 		grpx_exit();
			continue;
	   		}

       
         Bool switchCh = FALSE;
         Bool switchLayout = FALSE;
		if(ch=='L')
		{
			Chains_ipcBitsLocSt();
			continue;
		}
		if(ch=='E')
		{
			Chains_ipcBitsLocStStop();
			continue;
		}
        if(ch=='s')
        {
            switchLayout = TRUE;
            Chains_swMsSwitchLayout(&swMsId, &swMsPrm, switchLayout, switchCh, 2);
			//when you changed layout ,scd is disabled
			gScd_ctrl.enableMotionTracking = 0;
			gScd_ctrl.exitWrThr = 1;
			grpx_exit();
            printf("switch layout\n");
			continue;

         }
		if(ch == 'c')
		{
			gScd_ctrl.enableMotionTracking = 0;
			gScd_ctrl.exitWrThr = 1;
			grpx_exit();
			continue;
		}
         if(ch == '1')
         {
            switchCh = TRUE;
            Chains_swMsSwitchLayout(&swMsId, &swMsPrm, switchLayout, switchCh, 0);
            continue;
         }
		 if(ch == 'o')
		 {
		 		char ch2=Chains_menuSettingOsd();
				if( (ch2 == '0')||(ch2 == '1')||(ch2 == '3'))
				{
					UInt32 winId = ch2-48;
					g_osdChParam[0].chId = 0;
					g_osdChParam[0].winPrm[winId].enableWin = 0;
					System_linkControl(osdId,ALG_LINK_OSD_CMD_SET_CHANNEL_WIN_PRM, 
						&g_osdChParam[0], 
						sizeof(AlgLink_OsdChWinParams),
						TRUE
					);
					continue;
				}
				if(ch2=='x')
				{
					int i=0;
					for(i=0;i<4;i++)
					{
						g_osdChParam[i].chId = i;
						g_osdChParam[i].winPrm[0].enableWin = 0;
						g_osdChParam[i].winPrm[1].enableWin = 0;
						g_osdChParam[i].winPrm[2].enableWin = 0;
						g_osdChParam[i].winPrm[3].enableWin = 0;
						System_linkControl(osdId,ALG_LINK_OSD_CMD_SET_CHANNEL_WIN_PRM, 
						&g_osdChParam[i], 
						sizeof(AlgLink_OsdChWinParams),
						TRUE
						);
					  continue;
					}
				}
				if(ch2=='s')
				{
					int i=0;
					for(i=0;i<4;i++)
					{
						g_osdChParam[i].chId = i;
						g_osdChParam[i].winPrm[0].enableWin = 1;
						g_osdChParam[i].winPrm[1].enableWin = 1;
						g_osdChParam[i].winPrm[2].enableWin = 1;
						g_osdChParam[i].winPrm[3].enableWin = 1;
						System_linkControl(osdId,ALG_LINK_OSD_CMD_SET_CHANNEL_WIN_PRM, 
						&g_osdChParam[i], 
						sizeof(AlgLink_OsdChWinParams),
						TRUE
						);
					  continue;
					}//end for
				}///end if
		 	}///end ch==o
		
      }//end while1


        System_linkStop(captureId);
        System_linkStop(mergeId);
//guo----------------------
	if(enableScdAlgLink)
	{
		Scd_bitsWriteStop();
		System_linkStop(sclrId);
		System_linkStop(nsfId2);	
		System_linkStop(ipcFramesOutVpssId2);
		System_linkStop(ipcFramesInDspId2);
		System_linkStop(scdId);
		System_linkStop(ipcBitsOutDspId2);
		System_linkStop(ipcBitsInHostId2);	
	}
	if(enableOsdAlgLink)
        {
            Chains_ipcFramesStop();
            System_linkStop(ipcFramesOutVpssId);
            System_linkStop(ipcFramesInDspId);
            System_linkStop(osdId);
        }
//-------------------------------
        System_linkStop(dupId);
        System_linkStop(nsfId);
        System_linkStop(dup2Id);
        for (i=0; i<2; i++) {
            System_linkStop(swMsId[i]);
            System_linkStop(displayId[i]);
        }
        System_linkStop(encId);
        Chains_ipcBitsStop();
        System_linkStop(ipcBitsOutVideoId);
        System_linkStop(ipcBitsInHostId);
    

    System_linkDelete(captureId);
    System_linkDelete(mergeId);
//guo-------------
	if(enableScdAlgLink)
	{
		Scd_bitsWriteDelete();
		System_linkDelete(sclrId);
		System_linkDelete(nsfId2);	
		System_linkDelete(ipcFramesOutVpssId2);
		System_linkDelete(ipcFramesInDspId2);
		System_linkDelete(scdId);
		System_linkDelete(ipcBitsOutDspId2);
		System_linkDelete(ipcBitsInHostId2);	
	}
    if(enableOsdAlgLink)
    {
        System_linkDelete(ipcFramesOutVpssId);
        System_linkDelete(ipcFramesInDspId);
        System_linkDelete(osdId);         
    }
//-----------------
    System_linkDelete(dupId);
    System_linkDelete(nsfId);
    System_linkDelete(dup2Id);
    for (i=0; i<2; i++) {
        System_linkDelete(swMsId[i]);
        System_linkDelete(displayId[i]);
    }
    System_linkDelete(ipcOutVpssId);
    System_linkDelete(ipcInVideoId);
    System_linkDelete(encId);
    System_linkDelete(ipcBitsOutVideoId);
    System_linkDelete(ipcBitsInHostId);
    Chains_ipcBitsExit();

    Chains_displayCtrlDeInit();
}
Void MultiCh_deleteProgressive4D1VcapVencVdecVdis()
{
    UInt32 i;
    Bool enableOsdAlgLink = gVsysModuleContext.vsysConfig.enableOsd;
    Bool enableScdAlgLink = gVsysModuleContext.vsysConfig.enableScd;

    UInt32 mergeId[NUM_MERGE_LINK];
    UInt32 dupId[NUM_DUP_LINK];
    UInt32 ipcOutVpssId, ipcInVpssId;
    UInt32 ipcOutVideoId, ipcInVideoId;

    UInt32 ipcBitsOutDSPId;

    mergeId[LIVE_DECODE_MERGE_LINK_IDX]     = SYSTEM_VPSS_LINK_ID_MERGE_0;
    mergeId[D1_CIF_MERGE_LINK_IDX]          = SYSTEM_VPSS_LINK_ID_MERGE_1;

    dupId[D1_DUP_LINK_IDX]              = SYSTEM_VPSS_LINK_ID_DUP_0;
    dupId[LIVE_DECODE_DUP_LINK_IDX]     = SYSTEM_VPSS_LINK_ID_DUP_1;

    ipcOutVpssId = SYSTEM_VPSS_LINK_ID_IPC_OUT_M3_0;
    ipcInVideoId = SYSTEM_VIDEO_LINK_ID_IPC_IN_M3_0;
    ipcOutVideoId= SYSTEM_VIDEO_LINK_ID_IPC_OUT_M3_0;
    ipcInVpssId  = SYSTEM_VPSS_LINK_ID_IPC_IN_M3_0;

    ipcBitsOutDSPId = SYSTEM_DSP_LINK_ID_IPC_BITS_OUT_0;

    gVdecModuleContext.ipcBitsOutHLOSId = SYSTEM_HOST_LINK_ID_IPC_BITS_OUT_0;
    gVdecModuleContext.ipcBitsInRTOSId = SYSTEM_VIDEO_LINK_ID_IPC_BITS_IN_0;

    System_linkDelete(gVcapModuleContext.captureId);
#ifdef     ADD_NSF_AFTER_CAPTURE
    System_linkDelete(gVcapModuleContext.nsfId[1]);
#endif
    System_linkDelete(gVcapModuleContext.deiId[0]);
    System_linkDelete(gVcapModuleContext.nsfId[0]);

    if(enableOsdAlgLink || enableScdAlgLink)
    {
        System_linkDelete(gVcapModuleContext.ipcFramesOutVpssId[0]);
        System_linkDelete(gVcapModuleContext.ipcFramesInDspId[0]);
        System_linkDelete(gVcapModuleContext.dspAlgId[0]);

        if(enableScdAlgLink)
        {
            System_linkDelete(ipcBitsOutDSPId);
            System_linkDelete(gVcapModuleContext.ipcBitsInHLOSId);
        }
    }
    System_linkDelete(ipcOutVpssId );
    System_linkDelete(ipcInVideoId );

    System_linkDelete(gVencModuleContext.encId);
    System_linkDelete(gVencModuleContext.ipcBitsOutRTOSId);
    System_linkDelete(gVencModuleContext.ipcBitsInHLOSId);
    System_linkDelete(gVdecModuleContext.ipcBitsOutHLOSId);
    System_linkDelete(gVdecModuleContext.ipcBitsInRTOSId);
    System_linkDelete(gVdecModuleContext.decId);

    System_linkDelete(ipcOutVideoId);
    System_linkDelete(ipcInVpssId  );

    for(i=0; i<2; i++)
        System_linkDelete(gVdisModuleContext.swMsId[i] );

    for(i=0; i<2; i++)
        System_linkDelete(gVdisModuleContext.displayId[i]);

    for(i=0; i<NUM_DUP_LINK; i++)
        System_linkDelete(dupId[i]);

    for(i=0; i<NUM_MERGE_LINK; i++)
    {
        if (mergeId[i] != SYSTEM_LINK_ID_INVALID )
           System_linkDelete(mergeId[i]);
    }

    MultiCh_displayCtrlDeInit(&gVdisModuleContext.vdisConfig);

    /* Print the HWI, SWI and all tasks load */
    /* Reset the accumulated timer ticks */
    MultiCh_prfLoadCalcEnable(FALSE, TRUE, FALSE);

#if AVSYNC_COMP_ENABLE
    if (gVsysModuleContext.vsysConfig.enableAVsync == TRUE)
    {
        printf("AVSYNC_DeInit start\n");
        AVSYNC_DeInit();
        printf("AVSYNC_DeInit done\n");
    }
#endif

    System_deInit();
}
Void Chains_singleChDucatiSystem(Chains_Ctrl *chainsCfg)
{
    CaptureLink_CreateParams    capturePrm;
    CaptureLink_VipInstParams   *pCaptureInstPrm;
    CaptureLink_OutParams       *pCaptureOutPrm;
    NsfLink_CreateParams        nsfPrm;
    SwMsLink_CreateParams       swMsPrm;
    DisplayLink_CreateParams    displayPrm;
    EncLink_CreateParams        encPrm;
    DecLink_CreateParams        decPrm;
    IpcLink_CreateParams        ipcOutVpssPrm;
    IpcLink_CreateParams        ipcInVpssPrm;
    IpcLink_CreateParams        ipcOutVideoPrm;
    IpcLink_CreateParams        ipcInVideoPrm;
    IpcBitsOutLinkHLOS_CreateParams   ipcBitsOutHostPrm;
    IpcBitsOutLinkRTOS_CreateParams   ipcBitsOutVideoPrm;
    IpcBitsInLinkHLOS_CreateParams    ipcBitsInHostPrm;
    IpcBitsInLinkRTOS_CreateParams    ipcBitsInVideoPrm;

    System_LinkInfo bitsProducerLinkInfo;

    UInt32 captureId, displayId;
    UInt32 nsfId, swMsId;
    UInt32 vipInstId;
    UInt32 encId, decId;
    UInt32 ipcOutVpssId, ipcInVpssId;
    UInt32 ipcOutVideoId, ipcInVideoId;
    UInt32 ipcBitsOutVideoId, ipcBitsInHostId;
    UInt32 ipcBitsInVideoId, ipcBitsOutHostId;

    UInt32 i;
    char   ch;

    Chains_ipcBitsInit();

    CHAINS_INIT_STRUCT(CaptureLink_CreateParams, capturePrm);
    CHAINS_INIT_STRUCT(NsfLink_CreateParams, nsfPrm);
    CHAINS_INIT_STRUCT(SwMsLink_CreateParams, swMsPrm);
    CHAINS_INIT_STRUCT(DisplayLink_CreateParams,displayPrm);
    CHAINS_INIT_STRUCT(IpcLink_CreateParams,ipcOutVpssPrm);
    CHAINS_INIT_STRUCT(IpcLink_CreateParams,ipcInVpssPrm);
    CHAINS_INIT_STRUCT(IpcLink_CreateParams,ipcOutVideoPrm);
    CHAINS_INIT_STRUCT(IpcLink_CreateParams,ipcInVideoPrm);
    CHAINS_INIT_STRUCT(IpcBitsOutLinkRTOS_CreateParams,ipcBitsOutVideoPrm);
    CHAINS_INIT_STRUCT(IpcBitsInLinkHLOS_CreateParams,ipcBitsInHostPrm);
    CHAINS_INIT_STRUCT(IpcBitsOutLinkHLOS_CreateParams,ipcBitsOutHostPrm);
    CHAINS_INIT_STRUCT(IpcBitsInLinkRTOS_CreateParams,ipcBitsInVideoPrm);
    CHAINS_INIT_STRUCT(EncLink_CreateParams, encPrm);
    CHAINS_INIT_STRUCT(DecLink_CreateParams, decPrm);

    captureId = SYSTEM_LINK_ID_CAPTURE;
    nsfId     = SYSTEM_LINK_ID_NSF_0;
    swMsId    = SYSTEM_LINK_ID_SW_MS_MULTI_INST_0;
    displayId = SYSTEM_LINK_ID_DISPLAY_1;

    encId        = SYSTEM_LINK_ID_VENC_0;
    decId        = SYSTEM_LINK_ID_VDEC_0;

    ipcOutVpssId = SYSTEM_VPSS_LINK_ID_IPC_OUT_M3_0;
    ipcInVideoId = SYSTEM_VIDEO_LINK_ID_IPC_IN_M3_0;
    ipcOutVideoId= SYSTEM_VIDEO_LINK_ID_IPC_OUT_M3_0;
    ipcInVpssId  = SYSTEM_VPSS_LINK_ID_IPC_IN_M3_0;

    ipcBitsOutVideoId = SYSTEM_VIDEO_LINK_ID_IPC_BITS_OUT_0;
    ipcBitsInHostId   = SYSTEM_HOST_LINK_ID_IPC_BITS_IN_0;
    ipcBitsOutHostId  = SYSTEM_HOST_LINK_ID_IPC_BITS_OUT_0;
    ipcBitsInVideoId  = SYSTEM_VIDEO_LINK_ID_IPC_BITS_IN_0;

    System_linkControl(
        SYSTEM_LINK_ID_M3VIDEO,
        SYSTEM_COMMON_CMD_SET_CH2IVAHD_MAP_TBL,
        &systemVid_encDecIvaChMapTbl,
        sizeof(SystemVideo_Ivahd2ChMap_Tbl),
        TRUE
    );

    capturePrm.numVipInst               = 1;
    capturePrm.tilerEnable              = FALSE;
    capturePrm.numBufsPerCh             = CAPTURE_LINK_NUM_BUFS_PER_CH_DEFAULT;
    capturePrm.numExtraBufs             = 8;
    capturePrm.maxBlindAreasPerCh       = 0;
    capturePrm.isPalMode                = FALSE;
    capturePrm.enableSdCrop             = FALSE;
    capturePrm.doCropInCapture          = FALSE;

    for(vipInstId=0; vipInstId<capturePrm.numVipInst; vipInstId++)
    {
        pCaptureInstPrm                     = &capturePrm.vipInst[vipInstId];
        pCaptureInstPrm->vipInstId          = (SYSTEM_CAPTURE_INST_VIP0_PORTA+vipInstId*2)%SYSTEM_CAPTURE_INST_MAX;
        pCaptureInstPrm->videoDecoderId     = SYSTEM_DEVICE_VID_DEC_SII9233A_DRV;
        pCaptureInstPrm->inDataFormat       = SYSTEM_DF_YUV422P;
        pCaptureInstPrm->standard           = chainsCfg->displayRes[0];
        pCaptureInstPrm->numOutput          = 1;
        pCaptureInstPrm->numChPerOutput     = 1;
        pCaptureInstPrm->frameCaptureMode   = FALSE;
        pCaptureInstPrm->fieldsMerged       = FALSE;
        if (Chains_IsInterlaced(chainsCfg->displayRes[0])) {
            pCaptureInstPrm->frameCaptureMode = TRUE;
            pCaptureInstPrm->fieldsMerged   = TRUE;
        }

        pCaptureOutPrm                      = &pCaptureInstPrm->outParams[0];
        pCaptureOutPrm->dataFormat          = SYSTEM_DF_YUV422I_YUYV;
        pCaptureOutPrm->scEnable            = FALSE;
        pCaptureOutPrm->scOutWidth          = chainsCfg->channelConf[0].width;
        pCaptureOutPrm->scOutHeight         = chainsCfg->channelConf[0].height;
        pCaptureOutPrm->outQueId            = 0;
    }
    capturePrm.outQueParams[0].nextLink = nsfId;

    System_linkCreate(captureId, &capturePrm, sizeof(capturePrm));
    chainsCfg->displayRes[0] = capturePrm.vipInst[0].standard;
    Vsys_getResSize(chainsCfg->displayRes[0], &chainsCfg->channelConf[0].width, &chainsCfg->channelConf[0].height);
    Vsys_getResRate(chainsCfg->displayRes[0], &chainsCfg->channelConf[0].frameRate);

    nsfPrm.inQueParams.prevLinkId    = captureId;
    nsfPrm.inQueParams.prevLinkQueId = 0;
    nsfPrm.bypassNsf                 = FALSE;
    nsfPrm.tilerEnable               = TRUE;
    nsfPrm.numOutQue                 = 1;
    nsfPrm.outQueParams[0].nextLink  = ipcOutVpssId;
    nsfPrm.inputFrameRate            = chainsCfg->channelConf[0].frameRate;
    nsfPrm.outputFrameRate           = chainsCfg->channelConf[0].frameRate;
    nsfPrm.numBufsPerCh              = 8;

    ipcOutVpssPrm.inQueParams.prevLinkId    = nsfId;
    ipcOutVpssPrm.inQueParams.prevLinkQueId = 0;
    ipcOutVpssPrm.numOutQue                 = 1;
    ipcOutVpssPrm.numChPerOutQue[0]         = 1;
    ipcOutVpssPrm.outQueParams[0].nextLink  = ipcInVideoId;
    ipcOutVpssPrm.notifyNextLink            = TRUE;
    ipcOutVpssPrm.notifyPrevLink            = FALSE;
    ipcOutVpssPrm.noNotifyMode              = FALSE;
    ipcOutVpssPrm.inputFrameRate            = chainsCfg->channelConf[0].frameRate;
    ipcOutVpssPrm.outputFrameRate           = chainsCfg->channelConf[0].frameRate;
    ipcOutVpssPrm.equallyDivideChAcrossOutQues = FALSE;
    ipcOutVpssPrm.numChPerOutQue[0]         = 0;

    ipcInVideoPrm.inQueParams.prevLinkId    = ipcOutVpssId;
    ipcInVideoPrm.inQueParams.prevLinkQueId = 0;
    ipcInVideoPrm.numOutQue                 = 1;
    ipcInVideoPrm.numChPerOutQue[0]         = 1;
    ipcInVideoPrm.outQueParams[0].nextLink  = encId;
    ipcInVideoPrm.notifyNextLink            = TRUE;
    ipcInVideoPrm.notifyPrevLink            = FALSE;
    ipcInVideoPrm.noNotifyMode              = FALSE;
    ipcInVideoPrm.inputFrameRate            = chainsCfg->channelConf[0].frameRate;
    ipcInVideoPrm.outputFrameRate           = chainsCfg->channelConf[0].frameRate;
    ipcInVideoPrm.equallyDivideChAcrossOutQues = FALSE;
    ipcInVideoPrm.numChPerOutQue[0]         = 0;

    for (i=0; i<1; i++) {
        encPrm.chCreateParams[i].format                             = chainsCfg->channelConf[i].encFormat;
        encPrm.chCreateParams[i].profile                            = chainsCfg->channelConf[i].encProfile;
        encPrm.chCreateParams[i].dataLayout                         = IVIDEO_FIELD_SEPARATED;
        encPrm.chCreateParams[i].fieldMergeEncodeEnable             = FALSE;
        encPrm.chCreateParams[i].enableAnalyticinfo                 = FALSE;
        encPrm.chCreateParams[i].enableWaterMarking                 = FALSE;
        encPrm.chCreateParams[i].maxBitRate                         = -1;
        encPrm.chCreateParams[i].encodingPreset                     = XDM_USER_DEFINED;
                                                                      //XDM_DEFAULT;
        encPrm.chCreateParams[i].rateControlPreset                  = IVIDEO_USER_DEFINED;
                                                                      //IVIDEO_STORAGE;
                                                                      //IVIDEO_LOW_DELAY;
        encPrm.chCreateParams[i].enableHighSpeed                    = FALSE;
        encPrm.chCreateParams[i].numTemporalLayer                   = 0;
        encPrm.chCreateParams[i].enableSVCExtensionFlag             = FALSE;

        encPrm.chCreateParams[i].defaultDynamicParams.intraFrameInterval = chainsCfg->channelConf[i].intraFrameInterval;
        encPrm.chCreateParams[i].defaultDynamicParams.interFrameInterval = 1;
        encPrm.chCreateParams[i].defaultDynamicParams.inputFrameRate     = chainsCfg->channelConf[i].frameRate;
        encPrm.chCreateParams[i].defaultDynamicParams.targetFrameRate    = chainsCfg->channelConf[i].encFrameRate;
        encPrm.chCreateParams[i].defaultDynamicParams.targetBitRate      = chainsCfg->channelConf[i].bitRate;
        encPrm.chCreateParams[i].defaultDynamicParams.mvAccuracy         = IVIDENC2_MOTIONVECTOR_QUARTERPEL;
        encPrm.chCreateParams[i].defaultDynamicParams.rcAlg              = chainsCfg->channelConf[i].rateCtrl;
        encPrm.chCreateParams[i].defaultDynamicParams.qpMin              = 0;
        encPrm.chCreateParams[i].defaultDynamicParams.qpMax              = 51;
        encPrm.chCreateParams[i].defaultDynamicParams.qpInit             = -1;
        encPrm.chCreateParams[i].defaultDynamicParams.vbrDuration        = 8;
        encPrm.chCreateParams[i].defaultDynamicParams.vbrSensitivity     = 0;
    }
    encPrm.inQueParams.prevLinkId   = ipcInVideoId;
    encPrm.inQueParams.prevLinkQueId= 0;
    encPrm.outQueParams.nextLink    = ipcBitsOutVideoId;
    encPrm.numBufPerCh[0]           = 8;

    ipcBitsOutVideoPrm.baseCreateParams.inQueParams.prevLinkId      = encId;
    ipcBitsOutVideoPrm.baseCreateParams.inQueParams.prevLinkQueId   = 0;
    ipcBitsOutVideoPrm.baseCreateParams.numOutQue                   = 1;
    ipcBitsOutVideoPrm.baseCreateParams.numChPerOutQue[0]           = 1;
    ipcBitsOutVideoPrm.baseCreateParams.outQueParams[0].nextLink    = ipcBitsInHostId;
    ipcBitsOutVideoPrm.baseCreateParams.inputFrameRate              = chainsCfg->channelConf[0].encFrameRate;
    ipcBitsOutVideoPrm.baseCreateParams.outputFrameRate             = chainsCfg->channelConf[0].encFrameRate;
    Chains_ipcBitsInitCreateParams_BitsOutRTOS(&ipcBitsOutVideoPrm,
                                               FALSE);

    ipcBitsInHostPrm.baseCreateParams.inQueParams.prevLinkId        = ipcBitsOutVideoId;
    ipcBitsInHostPrm.baseCreateParams.inQueParams.prevLinkQueId     = 0;
    ipcBitsInHostPrm.baseCreateParams.numOutQue                     = 1;
    ipcBitsInHostPrm.baseCreateParams.numChPerOutQue[0]             = 1;
    ipcBitsInHostPrm.baseCreateParams.inputFrameRate                = chainsCfg->channelConf[0].encFrameRate;
    ipcBitsInHostPrm.baseCreateParams.outputFrameRate               = chainsCfg->channelConf[0].encFrameRate;
    Chains_ipcBitsInitCreateParams_BitsInHLOS(&ipcBitsInHostPrm);

    Chains_displayCtrlInit(chainsCfg->displayRes);

    System_linkCreate(nsfId , &nsfPrm, sizeof(nsfPrm));
    System_linkCreate(ipcOutVpssId , &ipcOutVpssPrm , sizeof(ipcOutVpssPrm) );
    System_linkCreate(ipcInVideoId , &ipcInVideoPrm , sizeof(ipcInVideoPrm) );
    System_linkCreate(encId, &encPrm, sizeof(encPrm));
    System_linkCreate(ipcBitsOutVideoId, &ipcBitsOutVideoPrm, sizeof(ipcBitsOutVideoPrm));
    System_linkCreate(ipcBitsInHostId, &ipcBitsInHostPrm, sizeof(ipcBitsInHostPrm));

    System_linkGetInfo(ipcBitsInHostId,&bitsProducerLinkInfo);
    OSA_assert(bitsProducerLinkInfo.numQue = 1);

    System_LinkQueInfo queInfo;
    queInfo.numCh                       = 1;
    queInfo.chInfo[0].bufType           = SYSTEM_BUF_TYPE_VIDBITSTREAM;
    queInfo.chInfo[0].codingformat      = chainsCfg->channelConf[0].encFormat;
    queInfo.chInfo[0].memType           = SYSTEM_MT_TILEDMEM;
    queInfo.chInfo[0].width             = chainsCfg->channelConf[0].width;
    queInfo.chInfo[0].height            = chainsCfg->channelConf[0].height;
    queInfo.chInfo[0].scanFormat        = SYSTEM_SF_PROGRESSIVE;

    ipcBitsOutHostPrm.baseCreateParams.numOutQue                    = 1;
    ipcBitsOutHostPrm.baseCreateParams.numChPerOutQue[0]            = 1;
    ipcBitsOutHostPrm.baseCreateParams.outQueParams[0].nextLink     = ipcBitsInVideoId;
    ipcBitsOutHostPrm.bufPoolPerCh                                  = FALSE;
    ipcBitsOutHostPrm.numBufPerCh[0]                                = 0;
    //Chains_ipcBitsInitCreateParams_BitsOutHLOS(&ipcBitsOutHostPrm, &bitsProducerLinkInfo.queInfo[0]);
    Chains_ipcBitsInitCreateParams_BitsOutHLOS(&ipcBitsOutHostPrm, &queInfo);

    ipcBitsInVideoPrm.baseCreateParams.inQueParams.prevLinkId       = ipcBitsOutHostId;
    ipcBitsInVideoPrm.baseCreateParams.inQueParams.prevLinkQueId    = 0;
    ipcBitsInVideoPrm.baseCreateParams.numOutQue                    = 1;
    ipcBitsInVideoPrm.baseCreateParams.outQueParams[0].nextLink     = decId;
    Chains_ipcBitsInitCreateParams_BitsInRTOS(&ipcBitsInVideoPrm, TRUE);

    for (i=0; i<1; i++) {
        decPrm.chCreateParams[i].format                               = chainsCfg->channelConf[i].encFormat;
        decPrm.chCreateParams[i].profile                              = IH264VDEC_PROFILE_ANY;
        decPrm.chCreateParams[i].targetMaxWidth                       = chainsCfg->channelConf[i].width;
        decPrm.chCreateParams[i].targetMaxHeight                      = chainsCfg->channelConf[i].height;
        decPrm.chCreateParams[i].displayDelay                         = IVIDDEC3_DECODE_ORDER;
        decPrm.chCreateParams[i].fieldMergeDecodeEnable               = FALSE;
        decPrm.chCreateParams[i].numBufPerCh                          = 16;
        decPrm.chCreateParams[i].dpbBufSizeInFrames                   = //DEC_LINK_DPB_SIZE_IN_FRAMES_DEFAULT;
                                                                        IH264VDEC_DPB_NUMFRAMES_AUTO;
        decPrm.chCreateParams[i].algCreateStatus                      = DEC_LINK_ALG_CREATE_STATUS_CREATE;
        decPrm.chCreateParams[i].defaultDynamicParams.targetFrameRate = chainsCfg->channelConf[i].encFrameRate;
        decPrm.chCreateParams[i].defaultDynamicParams.targetBitRate   = chainsCfg->channelConf[i].bitRate;
    }
    decPrm.inQueParams.prevLinkId    = ipcBitsInVideoId;
    decPrm.inQueParams.prevLinkQueId = 0;
    decPrm.outQueParams.nextLink     = ipcOutVideoId;
    decPrm.tilerEnable               = TRUE;

    ipcOutVideoPrm.inQueParams.prevLinkId    = decId;
    ipcOutVideoPrm.inQueParams.prevLinkQueId = 0;
    ipcOutVideoPrm.numOutQue                 = 1;
    ipcOutVideoPrm.outQueParams[0].nextLink  = ipcInVpssId;
    ipcOutVideoPrm.notifyNextLink            = TRUE;
    ipcOutVideoPrm.notifyPrevLink            = FALSE;
    ipcOutVideoPrm.noNotifyMode              = FALSE;

    ipcInVpssPrm.inQueParams.prevLinkId    = ipcOutVideoId;
    ipcInVpssPrm.inQueParams.prevLinkQueId = 0;
    ipcInVpssPrm.numOutQue                 = 1;
    ipcInVpssPrm.outQueParams[0].nextLink  = swMsId;
    ipcInVpssPrm.notifyNextLink            = TRUE;
    ipcInVpssPrm.notifyPrevLink            = FALSE;
    ipcInVpssPrm.noNotifyMode              = FALSE;

    swMsPrm.numSwMsInst               = 1;
    swMsPrm.swMsInstId[0]             = SYSTEM_SW_MS_SC_INST_SC5;
    swMsPrm.inQueParams.prevLinkId    = ipcInVpssId;
    swMsPrm.inQueParams.prevLinkQueId = 0;
    swMsPrm.outQueParams.nextLink     = displayId;
    swMsPrm.layoutPrm.outputFPS       = chainsCfg->channelConf[0].frameRate;
    swMsPrm.maxOutRes                 = chainsCfg->displayRes[0];
    swMsPrm.lineSkipMode              = FALSE;
    swMsPrm.enableLayoutGridDraw      = FALSE;
    swMsPrm.maxInputQueLen            = SYSTEM_SW_MS_DEFAULT_INPUT_QUE_LEN;
    swMsPrm.numOutBuf                 = 0;

    Chains_swMsGenerateLayoutParams(0, 2, &swMsPrm);

    displayPrm.inQueParams[0].prevLinkId    = swMsId;
    displayPrm.inQueParams[0].prevLinkQueId = 0;
    displayPrm.displayRes                   = chainsCfg->displayRes[0];

    System_linkCreate(ipcBitsOutHostId,&ipcBitsOutHostPrm,sizeof(ipcBitsOutHostPrm));
    System_linkCreate(ipcBitsInVideoId,&ipcBitsInVideoPrm,sizeof(ipcBitsInVideoPrm));
    System_linkCreate(decId, &decPrm, sizeof(decPrm));
    System_linkCreate(ipcOutVideoId, &ipcOutVideoPrm, sizeof(ipcOutVideoPrm));
    System_linkCreate(ipcInVpssId  , &ipcInVpssPrm  , sizeof(ipcInVpssPrm)  );
    System_linkCreate(swMsId, &swMsPrm, sizeof(swMsPrm));
    System_linkCreate(displayId, &displayPrm, sizeof(displayPrm));

    Chains_memPrintHeapStatus();

    {
        System_linkStart(displayId);
        System_linkStart(swMsId);
        System_linkStart(decId);
        System_linkStart(ipcBitsInVideoId);
        System_linkStart(ipcBitsOutHostId);
        System_linkStart(ipcBitsInHostId);
        System_linkStart(ipcBitsOutVideoId);
        System_linkStart(encId);
        System_linkStart(nsfId);
        System_linkStart(captureId);

        while(1)
        {
            ch = Chains_menuRunTime();
            if(ch=='0')
                break;
            if(ch=='v')
                System_linkControl(captureId, CAPTURE_LINK_CMD_FORCE_RESET, NULL, 0, TRUE);
            if(ch=='p')
                System_linkControl(captureId, CAPTURE_LINK_CMD_PRINT_ADV_STATISTICS, NULL, 0, TRUE);
        }

        System_linkStop(captureId);
        System_linkStop(nsfId);
        System_linkStop(encId);
        Chains_ipcBitsStop();
        System_linkStop(ipcBitsInVideoId);
        System_linkStop(ipcBitsOutHostId);
        System_linkStop(ipcBitsInHostId);
        System_linkStop(ipcBitsOutVideoId);
        System_linkStop(decId);
        System_linkStop(swMsId);
        System_linkStop(displayId);
    }

    System_linkDelete(captureId);
    System_linkDelete(nsfId);
    System_linkDelete(ipcOutVpssId);
    System_linkDelete(ipcInVideoId);
    System_linkDelete(encId);
    System_linkDelete(ipcBitsOutVideoId);
    System_linkDelete(ipcBitsInHostId);
    System_linkDelete(ipcBitsOutHostId);
    System_linkDelete(ipcBitsInVideoId);
    System_linkDelete(decId);
    System_linkDelete(ipcOutVideoId);
    System_linkDelete(ipcInVpssId);
    System_linkDelete(swMsId);
    System_linkDelete(displayId);

    Chains_displayCtrlDeInit();
    Chains_ipcBitsExit();
}
Void MultiCh_delete_8CifProgressiveVcapVencVdecVdis()
{
    UInt32 dup1Id,merge1Id;
    UInt32 ipcOutVpssId, ipcInVpssId;
    UInt32 ipcOutVideoId, ipcInVideoId;

    int i;
    dup1Id      = SYSTEM_VPSS_LINK_ID_DUP_0;
    merge1Id    = SYSTEM_VPSS_LINK_ID_MERGE_0;

    ipcOutVpssId = SYSTEM_VPSS_LINK_ID_IPC_OUT_M3_0;
    ipcInVideoId = SYSTEM_VIDEO_LINK_ID_IPC_IN_M3_0;
    ipcOutVideoId= SYSTEM_VIDEO_LINK_ID_IPC_OUT_M3_0;
    ipcInVpssId  = SYSTEM_VPSS_LINK_ID_IPC_IN_M3_0;

    System_linkDelete(gVcapModuleContext.captureId);

    System_linkDelete(gVcapModuleContext.deiId[0] );
    System_linkDelete(gVcapModuleContext.nsfId[0]);
    System_linkDelete(ipcOutVpssId );
    System_linkDelete(ipcInVideoId );
    System_linkDelete(gVencModuleContext.encId);
    System_linkDelete(gVencModuleContext.ipcBitsOutRTOSId);
    System_linkDelete(gVencModuleContext.ipcBitsInHLOSId);
    System_linkDelete(gVdecModuleContext.ipcBitsOutHLOSId);
    System_linkDelete(gVdecModuleContext.ipcBitsInRTOSId);
    System_linkDelete(gVdecModuleContext.decId);
    System_linkDelete(ipcOutVideoId);
    System_linkDelete(ipcInVpssId  );

    System_linkDelete(merge1Id);
    System_linkDelete(dup1Id);
    for(i=0; i<2; i++)
        System_linkDelete(gVdisModuleContext.swMsId[i] );

    for(i=0; i<3; i++)
        System_linkDelete(gVdisModuleContext.displayId[i]);

    MultiCh_displayCtrlDeInit(&gVdisModuleContext.vdisConfig);

    /* Print the HWI, SWI and all tasks load */
    /* Reset the accumulated timer ticks */
    MultiCh_prfLoadCalcEnable(FALSE, TRUE, FALSE);
    //Utils_encdecHdvicpPrfPrint();

    System_deInit();
}