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.

How to encode 4ch D1 and 1ch HD(1080P) at the same time

Other Parts Discussed in Thread: TVP5158

 We use dvr_rdk_3.0.1 SDK  TI_816x platform,  the 3.0 Release notes said "resolution streams. For example: D1 & HD video streams can be
capture simultaneously on different VIP ports".

And now we need to capture & encode 4ch D1 and  1ch HD(1080P) at the same time, on different VIP ports.

How to do?  I didn't find a usecase  usefull in all DM816x Usecases, and what is "DEMO_VCAP_VENC_VDEC_VDIS_PROGRESSIVE_8CH_NRT" mode? This usecase can be used directly?

  • There is no ready made usecase for this configuration.You will have to create a new usecase my connecting links to achieve the required data flow. Can you explain more about your usecase.

    - Do you require only encoding ?

    - DO you require display ?

    - Will there be decoding ?

    I have created a initial data flow at http://www.asciiflow.com/#972603666854054974/449290217

    Can you review it and update it as per your requirement so that we can comment on which usecase you can start with and modify to realise your requirement

  • I need capture and encoding.

    If have file save function or display fuction to test will be best. The decoding function is not necessary.

     

    tks for the drawing of architecture.

    I try to write the new usecase for under this drawing , meet some questions such as:

    1. under the usecase 4ch Or HD looks like the capture frame size not agree.

    2. the HD capture IC is not TVP5158 but ADV7441,not agree with the first device.So under device detect,the second device will commit to err :

    VCAP: TVP5158-0 (0x58):  NO Video Detected !!!
     VCAP: TVP5158-1 (0x00): Device not found !!!

    So there need to changed the init.sh?

     

  • I am sorry I didnt understand your comment. Can you share your usecase file. I can review it and comment better.

    Regarding configuration of HD capture IC, you will have to write the code for configuring the external video decoder IC. The captureLink needs to be configured with the correct VIP parameters such as embedded synch/discrete synch, capture width, capture height etc. You do not require any change in init.sh.

  • /*******************************************************************************
     *                                                                             *
     * Copyright (c) 2009 Texas Instruments Incorporated - http://www.ti.com/      *
     *                        ALL RIGHTS RESERVED                                  *
     *                                                                             *
     * Notice  : Away modified it for Talent corp's 1HD +4D1 environment 
     * Version : V0.1
     * Date    : 2012-12-10
     ******************************************************************************/
    
    /* This usecase assumes that all 3 outputs - D1 <h.264> + CIF <h.264> + D1 <MJPEG> are enabled */
    /*------------------------------ D1 <h.264> + CIF <h.264> + D1 <MJPEG> -------------------------------------
    
                     +-----------------+  +--------------------+
                     | Capture  1HD         |   | Capture 4D1           	 |
                     |                    		  |  |                    				|
                     | (Vin0_PortAB 16bit) |  |  (Vin1_PortA 8bit) 		|
                     +-----------------+   +--------------------+
                                +                              +
                                +                              |
                                |VIP0                  VIP1    |
                                |1ch HD                4ch SD  |
                                | @                      @     |
                                |30 frames            60 fields|
                                |                              |
                                |                              |
                                |                              |
                                |                              v
                                |                         +---------+
                                |                         |         		 |
                                |                         | DEI(need?)|
                                |                         |         		 |
                                |                         +----+----+
                                |                               |
                                v                               |
                  +-----------+                          |
                  |   Merge       | +--------------+
                  |                  |
                  +-----------+
                            |
                            |
                            |    +----------+             +------------+
                            -+>| H264 enc   |+--- --> | IpcBitsOut    |
                                 |  5 ch    		|             |           			|
                                 +----------+              +------------+
    																						|
    																						|
    																				+---------------+ 
    																				|Dispaly choice		|
    																				|File save choice   |
    																				+---------------+ 
    */		
    
    /*for TI_816X_BUILD  platform */
    #ifndef  TI_816X_BUILD
    #define TI_816X_BUILD
    #endif
    
    #include "mcfw/src_linux/mcfw_api/usecases/multich_common.h"
    #include "mcfw/src_linux/mcfw_api/usecases/multich_ipcbits.h"
    
    // Keeping TILER disabled for 4D1+1HD usecase
    #define TILER_ENABLE    TRUE
    
    
    /* =============================================================================
     * Externs
     * =============================================================================
     */
    
    static UInt8 SCDChannelMonitor[4] = {4, 5, 6, 7};  //scd is disabled
    
    /* =============================================================================
     * Use case code
     * =============================================================================
     */
    static SystemVideo_Ivahd2ChMap_Tbl systemVid_encDecIvaChMapTbl =
    {	
        .isPopulated = 1,
        .ivaMap[0] =
        {
            .EncNumCh  = 1,
            .EncChList = {0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 , 0, 0},  //0=HD   
            .DecNumCh  = 0,
            .DecChList = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, //not decoding  temporary
        },
      
        .ivaMap[1] =
        {
            .EncNumCh  = 4,
            .EncChList = {1, 2, 3, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 , 0, 0}, //1-2-3-4=4D1
            .DecNumCh  = 0,
            .DecChList = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, //temporary no decoding
        },
    };
    
    #define     ADD_NSF_AFTER_CAPTURE
    #define     NUM_MERGE_LINK                          2
    #define     D1_CIF_MERGE_LINK_IDX                0
    #define     LIVE_DECODE_MERGE_LINK_IDX        1
    
    #define     NUM_DUP_LINK                             2
    #define     D1_DUP_LINK_IDX                          0
    #define     LIVE_DECODE_DUP_LINK_IDX            1
    
    /*Buffers num define*/
    #define     NUM_CAPTURE_BUFFERS          8
    #define     NUM_NSF_BUFFERS              6
    #define     NUM_ENCODE_D1_BUFFERS       6
    #define     NUM_ENCODE_CIF_BUFFERS       6
    #define     NUM_DECODE_BUFFERS           6
    #define     NUM_IPC_OUT_BUFFERS          6
    #define     NUM_SWMS_MAX_BUFFERS         8
    
    /* Capture devices define :1HD + 4D1=2 capture devices*/
    #define     NUM_CAPTURE_DEVICES          2 
    
    /*Hd_VcaVencVdisObj  struct param define*/
    typedef struct {
    
        UInt32 mergeId[5];
        UInt32 dupId[3];
        UInt32 ipcOutVpssId;
        UInt32 ipcInVideoId;
        UInt32 ipcFrameOutVpssId[2];
        UInt32 ipcFramesInDspId[2];
    } MultiChHd_VcapVencVdisObj;
    
    MultiChHd_VcapVencVdisObj gMultiChHd_VcapVencVdisObj;
    
    
    /* This usecase assumes CIF <secondary out>, MJPEG are enabled */
    Void MultiCh_createProgressive4D1And1HDVcapVencVdecVdis()
    {
        CaptureLink_CreateParams    capturePrm;
        NsfLink_CreateParams        nsfPrm;
        DeiLink_CreateParams        deiPrm;
        MergeLink_CreateParams      mergePrm[NUM_MERGE_LINK];
        DupLink_CreateParams        dupPrm[NUM_DUP_LINK];
        static SwMsLink_CreateParams       swMsPrm[VDIS_DEV_MAX];
        DisplayLink_CreateParams    displayPrm[VDIS_DEV_MAX];
        IpcLink_CreateParams        ipcOutVpssPrm;
        IpcLink_CreateParams        ipcInVpssPrm;
        IpcLink_CreateParams        ipcOutVideoPrm;
        IpcLink_CreateParams        ipcInVideoPrm;
        EncLink_CreateParams        encPrm;
        DecLink_CreateParams        decPrm;
        IpcBitsOutLinkHLOS_CreateParams   ipcBitsOutHostPrm;
        IpcBitsOutLinkRTOS_CreateParams   ipcBitsOutVideoPrm;
        IpcBitsInLinkHLOS_CreateParams    ipcBitsInHostPrm[2];
    
        IpcBitsInLinkRTOS_CreateParams    ipcBitsInVideoPrm;
        CaptureLink_VipInstParams         *pCaptureInstPrm;
        CaptureLink_OutParams             *pCaptureOutPrm;
        IpcFramesInLinkRTOS_CreateParams  ipcFramesInDspPrm;
        IpcFramesOutLinkRTOS_CreateParams ipcFramesOutVpssPrm;
        AlgLink_CreateParams              dspAlgPrm;
    
        System_LinkInfo                   bitsProducerLinkInfo;
        UInt32 mergeId[NUM_MERGE_LINK];
        UInt32 dupId[NUM_DUP_LINK];
        UInt32 ipcOutVpssId, ipcInVpssId;
        UInt32 ipcOutVideoId, ipcInVideoId;
    
        VCAP_VIDDEC_PARAMS_S vidDecVideoModeArgs[NUM_CAPTURE_DEVICES];
    
        IpcBitsOutLinkRTOS_CreateParams   ipcBitsOutDspPrm;
        UInt32 ipcBitsOutDSPId;
    
        UInt32 vipInstId;
        UInt32 i, j;
        Bool   enableOsdAlgLink = gVsysModuleContext.vsysConfig.enableOsd;
        Bool   enableScdAlgLink = gVsysModuleContext.vsysConfig.enableScd;
    #ifdef     ADD_NSF_AFTER_CAPTURE
        NsfLink_CreateParams        nsfPrm2;
    #endif
    
        MULTICH_INIT_STRUCT(IpcLink_CreateParams,ipcOutVpssPrm);
        MULTICH_INIT_STRUCT(IpcLink_CreateParams,ipcInVpssPrm);
        MULTICH_INIT_STRUCT(IpcLink_CreateParams,ipcOutVideoPrm);
        MULTICH_INIT_STRUCT(IpcLink_CreateParams,ipcInVideoPrm);
        MULTICH_INIT_STRUCT(IpcBitsOutLinkHLOS_CreateParams,ipcBitsOutHostPrm);
        MULTICH_INIT_STRUCT(IpcBitsOutLinkRTOS_CreateParams,ipcBitsOutVideoPrm);
        MULTICH_INIT_STRUCT(IpcBitsOutLinkRTOS_CreateParams,ipcBitsOutDspPrm);
    
        MULTICH_INIT_STRUCT(IpcBitsInLinkHLOS_CreateParams,ipcBitsInHostPrm[0]);
        MULTICH_INIT_STRUCT(IpcBitsInLinkHLOS_CreateParams,ipcBitsInHostPrm[1]);
        MULTICH_INIT_STRUCT(IpcBitsInLinkRTOS_CreateParams,ipcBitsInVideoPrm);
        MULTICH_INIT_STRUCT(DecLink_CreateParams, decPrm);
        MULTICH_INIT_STRUCT(IpcFramesInLinkRTOS_CreateParams,ipcFramesInDspPrm);
        MULTICH_INIT_STRUCT(IpcFramesOutLinkRTOS_CreateParams,ipcFramesOutVpssPrm);
        MULTICH_INIT_STRUCT(EncLink_CreateParams, encPrm);
        MULTICH_INIT_STRUCT(AlgLink_CreateParams, dspAlgPrm);
    
    	 /*
    		for (i = 0; i < VDIS_DEV_MAX;i++)
        {
            MULTICH_INIT_STRUCT(DisplayLink_CreateParams,
                                displayPrm[i]);
            MULTICH_INIT_STRUCT(SwMsLink_CreateParams ,swMsPrm[i]);
        }
    	*/
        MULTICH_INIT_STRUCT(NsfLink_CreateParams, nsfPrm);
        MULTICH_INIT_STRUCT(DeiLink_CreateParams, deiPrm);
    		
    	 /********* Entered usecase 4CH <814x> Enc/Dec OSD Enabled SCD Enabled ***
     		*****Away modify it to TI_816x 4ch mod****************************/
        printf("\n********* Entered usecase 4CH <814x> Enc/Dec OSD %s SCD %s \
        					********Talent_company modify it to TI_816x 4ch + 1HD mod\n\n",
                enableOsdAlgLink == TRUE ? "Enabled" : "Disabled",
                enableScdAlgLink == TRUE ? "Enabled" : "Disabled"
                );
    
    	/* */
    	 printf("get in funcion Multich_detectBoard \n");
        MultiCh_detectBoard();
    	 printf(" System_linkControl 0000000000\n");
        System_linkControl(
            SYSTEM_LINK_ID_M3VPSS,
            SYSTEM_M3VPSS_CMD_RESET_VIDEO_DEVICES,
            NULL,
            0,
            TRUE
            );
    	 printf(" System_linkControl 11111111\n");
        System_linkControl(
            SYSTEM_LINK_ID_M3VIDEO,
            SYSTEM_COMMON_CMD_SET_CH2IVAHD_MAP_TBL,
            &systemVid_encDecIvaChMapTbl,
            sizeof(SystemVideo_Ivahd2ChMap_Tbl),
            TRUE
        );
    
        vipInstId = 0; /*Notice: HD --->Vip0_PortA 16bit vipInstId = 0; 
        									       4D1--->vip1_PortA 8bit  vipInstId = 2;*/
    
        gVcapModuleContext.captureId    = SYSTEM_LINK_ID_CAPTURE;
    
        if(enableOsdAlgLink || enableScdAlgLink)
        {
            gVcapModuleContext.dspAlgId[0] = SYSTEM_LINK_ID_ALG_0  ;
            gVcapModuleContext.ipcFramesOutVpssId[0] = SYSTEM_VPSS_LINK_ID_IPC_FRAMES_OUT_0;
            gVcapModuleContext.ipcFramesInDspId[0] = SYSTEM_DSP_LINK_ID_IPC_FRAMES_IN_0;
            if(enableScdAlgLink)
            {
              ipcBitsOutDSPId = SYSTEM_DSP_LINK_ID_IPC_BITS_OUT_0;
              gVcapModuleContext.ipcBitsInHLOSId = SYSTEM_HOST_LINK_ID_IPC_BITS_IN_0;
            }
        }
    
        gVcapModuleContext.nsfId[0]     = SYSTEM_LINK_ID_NSF_0;
    #ifdef     ADD_NSF_AFTER_CAPTURE
        gVcapModuleContext.nsfId[1]     =SYSTEM_LINK_ID_NSF_1;
    #endif
        gVcapModuleContext.deiId[0]     = SYSTEM_LINK_ID_DEI_0;
        gVencModuleContext.encId        = SYSTEM_LINK_ID_VENC_0;
        gVdecModuleContext.decId        = SYSTEM_LINK_ID_VDEC_0;
    
        gVdisModuleContext.swMsId[0]      = SYSTEM_LINK_ID_SW_MS_MULTI_INST_0;
        gVdisModuleContext.swMsId[1]      = SYSTEM_LINK_ID_SW_MS_MULTI_INST_1;
    
        swMsPrm[0].numSwMsInst = 1;
        swMsPrm[1].numSwMsInst = 1;
    
        #if defined(TI_814X_BUILD) || defined(TI_8107_BUILD)
        /* use AUX scaler (SC2), since SC1 is used for DEI */
        swMsPrm[0].swMsInstId[0] = SYSTEM_SW_MS_SC_INST_DEI_SC_NO_DEI;
        #else
        /* use MAIN scaler (SC1), since SC2 is used for DEI */
        swMsPrm[0].swMsInstId[0] = SYSTEM_SW_MS_SC_INST_DEIHQ_SC_NO_DEI;
        #endif
    
        swMsPrm[1].swMsInstId[0] = SYSTEM_SW_MS_SC_INST_SC5;
    
        gVdisModuleContext.displayId[0] = SYSTEM_LINK_ID_DISPLAY_0; /* ON AND OFF CHIP HDMI */
        gVdisModuleContext.displayId[2] = SYSTEM_LINK_ID_DISPLAY_2; /* SDTV */
    
        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;
    
        gVencModuleContext.ipcBitsOutRTOSId  = SYSTEM_VIDEO_LINK_ID_IPC_BITS_OUT_0;
        if(enableScdAlgLink)
           gVencModuleContext.ipcBitsInHLOSId   = SYSTEM_HOST_LINK_ID_IPC_BITS_IN_1;
        else
           gVencModuleContext.ipcBitsInHLOSId   = SYSTEM_HOST_LINK_ID_IPC_BITS_IN_0;
    
        gVdecModuleContext.ipcBitsOutHLOSId  = SYSTEM_HOST_LINK_ID_IPC_BITS_OUT_0;
        gVdecModuleContext.ipcBitsInRTOSId  = SYSTEM_VIDEO_LINK_ID_IPC_BITS_IN_0;
    
    	 printf(" CaptureLink_CreateParams_Init 0000000000\n");
        CaptureLink_CreateParams_Init(&capturePrm);
    #ifdef     ADD_NSF_AFTER_CAPTURE
        capturePrm.outQueParams[0].nextLink   = gVcapModuleContext.nsfId[1];
    #else
        capturePrm.outQueParams[0].nextLink   = gVcapModuleContext.deiId[0];
    #endif
        capturePrm.numVipInst                 = 1;
        capturePrm.tilerEnable                = FALSE;
        capturePrm.numBufsPerCh               = NUM_CAPTURE_BUFFERS;
    
        pCaptureInstPrm                     = &capturePrm.vipInst[0];
        pCaptureInstPrm->vipInstId          = (SYSTEM_CAPTURE_INST_VIP0_PORTA+
                                              vipInstId)%SYSTEM_CAPTURE_INST_MAX;
        pCaptureInstPrm->videoDecoderId     = SYSTEM_DEVICE_VID_DEC_TVP5158_DRV;
        pCaptureInstPrm->inDataFormat       = SYSTEM_DF_YUV422P;
        pCaptureInstPrm->standard           = SYSTEM_STD_MUX_4CH_D1;
        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;
    
        for(i = 0; i < NUM_CAPTURE_DEVICES; i++)
        {
        	if (i==0)
        	{
        	 vidDecVideoModeArgs[i].videoIfMode        = DEVICE_CAPT_VIDEO_IF_MODE_16BIT;
            vidDecVideoModeArgs[i].videoDataFormat    = SYSTEM_DF_YUV422P;
            vidDecVideoModeArgs[i].standard           = SYSTEM_STD_MUX_4CH_D1;
            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;
        	}
    		else{
            vidDecVideoModeArgs[i].videoIfMode        = DEVICE_CAPT_VIDEO_IF_MODE_8BIT;
            vidDecVideoModeArgs[i].videoDataFormat    = SYSTEM_DF_YUV422P;
            vidDecVideoModeArgs[i].standard           = SYSTEM_STD_MUX_4CH_D1;
            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);
    
    
    #ifdef     ADD_NSF_AFTER_CAPTURE
        nsfPrm2.bypassNsf                          = TRUE;
        nsfPrm2.tilerEnable                          = FALSE;
        nsfPrm2.inQueParams.prevLinkId          = gVcapModuleContext.captureId;
        nsfPrm2.inQueParams.prevLinkQueId     = 0;
        nsfPrm2.numOutQue                        = 1;
        nsfPrm2.outQueParams[0].nextLink      = gVcapModuleContext.deiId[0];
        nsfPrm2.numBufsPerCh                     = NUM_NSF_BUFFERS;
        nsfPrm2.inputFrameRate                    = 30;
        nsfPrm2.outputFrameRate                  = 30;
    
        deiPrm.inQueParams.prevLinkId = gVcapModuleContext.nsfId[1];
    #else
        deiPrm.inQueParams.prevLinkId = gVcapModuleContext.captureId;
    #endif
        deiPrm.inQueParams.prevLinkQueId  = 0;
    
        /* Set Output Scaling at DEI based on ratio */
        deiPrm.outScaleFactor[DEI_LINK_OUT_QUE_DEI_SC][0].scaleMode = DEI_SCALE_MODE_RATIO;
        deiPrm.outScaleFactor[DEI_LINK_OUT_QUE_DEI_SC][0].ratio.widthRatio.numerator = 1;
        deiPrm.outScaleFactor[DEI_LINK_OUT_QUE_DEI_SC][0].ratio.widthRatio.denominator = 1;
        deiPrm.outScaleFactor[DEI_LINK_OUT_QUE_DEI_SC][0].ratio.heightRatio.numerator = 1;
        deiPrm.outScaleFactor[DEI_LINK_OUT_QUE_DEI_SC][0].ratio.heightRatio.denominator = 1;
        for (i=1; i < DEI_LINK_MAX_CH; i++)
            deiPrm.outScaleFactor[DEI_LINK_OUT_QUE_DEI_SC][i] = deiPrm.outScaleFactor[DEI_LINK_OUT_QUE_DEI_SC][0];
    
        deiPrm.outScaleFactor[DEI_LINK_OUT_QUE_VIP_SC][0].scaleMode = DEI_SCALE_MODE_RATIO;
        deiPrm.outScaleFactor[DEI_LINK_OUT_QUE_VIP_SC][0].ratio.heightRatio.numerator = 1;
        deiPrm.outScaleFactor[DEI_LINK_OUT_QUE_VIP_SC][0].ratio.heightRatio.denominator = 1;
        deiPrm.outScaleFactor[DEI_LINK_OUT_QUE_VIP_SC][0].ratio.widthRatio.numerator = 1;
        deiPrm.outScaleFactor[DEI_LINK_OUT_QUE_VIP_SC][0].ratio.widthRatio.denominator = 1;
        for (i=1; i < DEI_LINK_MAX_CH; i++)
            deiPrm.outScaleFactor[DEI_LINK_OUT_QUE_VIP_SC][i] = deiPrm.outScaleFactor[DEI_LINK_OUT_QUE_VIP_SC][0];
    
        deiPrm.outScaleFactor[DEI_LINK_OUT_QUE_VIP_SC_SECONDARY_OUT][0].scaleMode = DEI_SCALE_MODE_RATIO;
        deiPrm.outScaleFactor[DEI_LINK_OUT_QUE_VIP_SC_SECONDARY_OUT][0].scaleMode = DEI_SCALE_MODE_RATIO;
        deiPrm.outScaleFactor[DEI_LINK_OUT_QUE_VIP_SC_SECONDARY_OUT][0].ratio.heightRatio.numerator = 1;
        deiPrm.outScaleFactor[DEI_LINK_OUT_QUE_VIP_SC_SECONDARY_OUT][0].ratio.heightRatio.denominator = 2;
        deiPrm.outScaleFactor[DEI_LINK_OUT_QUE_VIP_SC_SECONDARY_OUT][0].ratio.widthRatio.numerator = 1;
        deiPrm.outScaleFactor[DEI_LINK_OUT_QUE_VIP_SC_SECONDARY_OUT][0].ratio.widthRatio.denominator = 2;
        for (i=1; i < DEI_LINK_MAX_CH; i++)
            deiPrm.outScaleFactor[DEI_LINK_OUT_QUE_VIP_SC_SECONDARY_OUT][i] = deiPrm.outScaleFactor[DEI_LINK_OUT_QUE_VIP_SC_SECONDARY_OUT][0];
    
        deiPrm.enableOut[DEI_LINK_OUT_QUE_DEI_SC]                        = TRUE;
        deiPrm.enableOut[DEI_LINK_OUT_QUE_VIP_SC]                        = TRUE;
        deiPrm.enableOut[DEI_LINK_OUT_QUE_VIP_SC_SECONDARY_OUT]          = TRUE;
    
        deiPrm.outQueParams[DEI_LINK_OUT_QUE_DEI_SC].nextLink                   = dupId[D1_DUP_LINK_IDX];
        deiPrm.outQueParams[DEI_LINK_OUT_QUE_VIP_SC].nextLink                   = mergeId[D1_CIF_MERGE_LINK_IDX];
        deiPrm.outQueParams[DEI_LINK_OUT_QUE_VIP_SC_SECONDARY_OUT].nextLink     = mergeId[D1_CIF_MERGE_LINK_IDX];
    
        deiPrm.tilerEnable[DEI_LINK_OUT_QUE_VIP_SC]          = TILER_ENABLE;
        deiPrm.comprEnable                                   = FALSE;
        deiPrm.setVipScYuv422Format                          = FALSE;
    
        dupPrm[D1_DUP_LINK_IDX].inQueParams.prevLinkId         = gVcapModuleContext.deiId[0];
        dupPrm[D1_DUP_LINK_IDX].inQueParams.prevLinkQueId      = DEI_LINK_OUT_QUE_DEI_SC;
        dupPrm[D1_DUP_LINK_IDX].numOutQue                      = 2;
        dupPrm[D1_DUP_LINK_IDX].outQueParams[0].nextLink       = mergeId[LIVE_DECODE_MERGE_LINK_IDX];
        dupPrm[D1_DUP_LINK_IDX].outQueParams[1].nextLink       = gVcapModuleContext.nsfId[0];
        dupPrm[D1_DUP_LINK_IDX].notifyNextLink                 = TRUE;
    
        nsfPrm.bypassNsf                        = TRUE;
        nsfPrm.tilerEnable                      = TILER_ENABLE;
        nsfPrm.inQueParams.prevLinkId           = dupId[D1_DUP_LINK_IDX];
        nsfPrm.inQueParams.prevLinkQueId        = 1;
        nsfPrm.numOutQue                        = 1;
        nsfPrm.outQueParams[0].nextLink         = mergeId[D1_CIF_MERGE_LINK_IDX];
        nsfPrm.numBufsPerCh                     = NUM_NSF_BUFFERS;
        nsfPrm.inputFrameRate = 30;
        nsfPrm.outputFrameRate = 1;
    
        /* Merge Q0 - D1 <from VIP-SC>, Q1 - CIF <from VIP-SC_SECONDARY>, Q2 -D1 for MJPEG <from DEI-SC>  */
        mergePrm[D1_CIF_MERGE_LINK_IDX].inQueParams[0].prevLinkId       = gVcapModuleContext.deiId[0];
        mergePrm[D1_CIF_MERGE_LINK_IDX].inQueParams[0].prevLinkQueId    = DEI_LINK_OUT_QUE_VIP_SC;
        mergePrm[D1_CIF_MERGE_LINK_IDX].inQueParams[1].prevLinkId       = gVcapModuleContext.deiId[0];
        mergePrm[D1_CIF_MERGE_LINK_IDX].inQueParams[1].prevLinkQueId    = DEI_LINK_OUT_QUE_VIP_SC_SECONDARY_OUT;
        mergePrm[D1_CIF_MERGE_LINK_IDX].inQueParams[2].prevLinkId       = gVcapModuleContext.nsfId[0];
        mergePrm[D1_CIF_MERGE_LINK_IDX].inQueParams[2].prevLinkQueId    = 0;
    
        mergePrm[D1_CIF_MERGE_LINK_IDX].notifyNextLink                  = TRUE;
        mergePrm[D1_CIF_MERGE_LINK_IDX].numInQue = 3;
    
        if (enableOsdAlgLink || enableScdAlgLink)
        {
            mergePrm[D1_CIF_MERGE_LINK_IDX].outQueParams.nextLink  = gVcapModuleContext.ipcFramesOutVpssId[0];
            ipcOutVpssPrm.inQueParams.prevLinkId                   = gVcapModuleContext.ipcFramesOutVpssId[0];
    
            /* Redirect to DSP for OSD / SCD */
            ipcFramesOutVpssPrm .baseCreateParams.inQueParams.prevLinkId   = mergeId[D1_CIF_MERGE_LINK_IDX];
            ipcFramesOutVpssPrm.baseCreateParams.inQueParams.prevLinkQueId = 0;
            ipcFramesOutVpssPrm.baseCreateParams.outQueParams[0].nextLink  = ipcOutVpssId;
            ipcFramesOutVpssPrm.baseCreateParams.processLink               = gVcapModuleContext.ipcFramesInDspId[0];
            ipcFramesOutVpssPrm.baseCreateParams.notifyPrevLink            = TRUE;
            ipcFramesOutVpssPrm.baseCreateParams.notifyNextLink            = TRUE;
            ipcFramesOutVpssPrm.baseCreateParams.notifyProcessLink         = TRUE;
            ipcFramesOutVpssPrm.baseCreateParams.noNotifyMode              = FALSE;
            ipcFramesOutVpssPrm.baseCreateParams.numOutQue                 = 1;
    
            ipcFramesInDspPrm.baseCreateParams.inQueParams.prevLinkId      = gVcapModuleContext.ipcFramesOutVpssId[0];
            ipcFramesInDspPrm.baseCreateParams.inQueParams.prevLinkQueId   = 0;
            ipcFramesInDspPrm.baseCreateParams.outQueParams[0].nextLink    = gVcapModuleContext.dspAlgId[0];
            ipcFramesInDspPrm.baseCreateParams.notifyPrevLink              = TRUE;
            ipcFramesInDspPrm.baseCreateParams.notifyNextLink              = TRUE;
            ipcFramesInDspPrm.baseCreateParams.noNotifyMode                = FALSE;
            ipcFramesInDspPrm.baseCreateParams.numOutQue                   = 1;
    
            dspAlgPrm.inQueParams.prevLinkId = gVcapModuleContext.ipcFramesInDspId[0];
            dspAlgPrm.inQueParams.prevLinkQueId = 0;
        }
        else
        {
            mergePrm[D1_CIF_MERGE_LINK_IDX].outQueParams.nextLink  = ipcOutVpssId;
            ipcOutVpssPrm.inQueParams.prevLinkId                   = mergeId[D1_CIF_MERGE_LINK_IDX];
        }
    
        ipcOutVpssPrm.inQueParams.prevLinkQueId    = 0;
        ipcOutVpssPrm.numOutQue = 1;
        ipcOutVpssPrm.outQueParams[0].nextLink     = ipcInVideoId;
        ipcOutVpssPrm.notifyNextLink               = TRUE;
        ipcOutVpssPrm.notifyPrevLink               = TRUE;
        ipcOutVpssPrm.noNotifyMode                 = FALSE;
    
        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;
    
        {
            EncLink_ChCreateParams *pLinkChPrm;
            EncLink_ChDynamicParams *pLinkDynPrm;
            VENC_CHN_DYNAMIC_PARAM_S *pDynPrm;
            VENC_CHN_PARAMS_S *pChPrm;
    
            EncLink_CreateParams_Init(&encPrm);
    
            encPrm.numBufPerCh[0] = NUM_ENCODE_D1_BUFFERS;
            encPrm.numBufPerCh[1] = NUM_ENCODE_CIF_BUFFERS;
    
            /* Primary Stream Params - D1 */
            for (i=0; i<gVencModuleContext.vencConfig.numPrimaryChn; i++)
            {
                pLinkChPrm  = &encPrm.chCreateParams[i];
                pLinkDynPrm = &pLinkChPrm->defaultDynamicParams;
    
                pChPrm      = &gVencModuleContext.vencConfig.encChannelParams[i];
                pDynPrm     = &pChPrm->dynamicParam;
    
                pLinkChPrm->format                  = IVIDEO_H264HP;
                pLinkChPrm->profile                 = gVencModuleContext.vencConfig.h264Profile[i];
                pLinkChPrm->dataLayout              = IVIDEO_FIELD_SEPARATED;
                pLinkChPrm->fieldMergeEncodeEnable  = FALSE;
                pLinkChPrm->enableAnalyticinfo      = pChPrm->enableAnalyticinfo;
                pLinkChPrm->enableWaterMarking      = pChPrm->enableWaterMarking;
                pLinkChPrm->maxBitRate              = pChPrm->maxBitRate;
                pLinkChPrm->encodingPreset          = pChPrm->encodingPreset;
                pLinkChPrm->rateControlPreset       = pChPrm->rcType;
                pLinkChPrm->enableSVCExtensionFlag  = pChPrm->enableSVCExtensionFlag;
                pLinkChPrm->numTemporalLayer        = pChPrm->numTemporalLayer;
    
                pLinkDynPrm->intraFrameInterval     = pDynPrm->intraFrameInterval;
                pLinkDynPrm->targetBitRate          = pDynPrm->targetBitRate;
                pLinkDynPrm->interFrameInterval     = 1;
                pLinkDynPrm->mvAccuracy             = IVIDENC2_MOTIONVECTOR_QUARTERPEL;
                pLinkDynPrm->inputFrameRate         = pDynPrm->inputFrameRate;
                pLinkDynPrm->rcAlg                  = pDynPrm->rcAlg;
                pLinkDynPrm->qpMin                  = pDynPrm->qpMin;
                pLinkDynPrm->qpMax                  = pDynPrm->qpMax;
                pLinkDynPrm->qpInit                 = pDynPrm->qpInit;
                pLinkDynPrm->vbrDuration            = pDynPrm->vbrDuration;
                pLinkDynPrm->vbrSensitivity         = pDynPrm->vbrSensitivity;
            }
            /* Secondary Out <CIF> Params */
            for (i=gVencModuleContext.vencConfig.numPrimaryChn, j=VENC_PRIMARY_CHANNELS;
                  i<(gVencModuleContext.vencConfig.numPrimaryChn
                           + gVencModuleContext.vencConfig.numSecondaryChn);
                    i++, j++)
            {
                pLinkChPrm  = &encPrm.chCreateParams[i];
                pLinkDynPrm = &pLinkChPrm->defaultDynamicParams;
    
                pChPrm      = &gVencModuleContext.vencConfig.encChannelParams[j];
                pDynPrm     = &pChPrm->dynamicParam;
    
                pLinkChPrm->format                  = IVIDEO_H264HP;
                pLinkChPrm->profile                 = gVencModuleContext.vencConfig.h264Profile[i];
                pLinkChPrm->dataLayout              = IVIDEO_FIELD_SEPARATED;
                pLinkChPrm->fieldMergeEncodeEnable  = FALSE;
                pLinkChPrm->enableAnalyticinfo      = pChPrm->enableAnalyticinfo;
                pLinkChPrm->enableWaterMarking      = pChPrm->enableWaterMarking;
                pLinkChPrm->maxBitRate              = pChPrm->maxBitRate;
                pLinkChPrm->encodingPreset          = pChPrm->encodingPreset;
                pLinkChPrm->rateControlPreset       = pChPrm->rcType;
                pLinkChPrm->enableSVCExtensionFlag  = pChPrm->enableSVCExtensionFlag;
                pLinkChPrm->numTemporalLayer        = pChPrm->numTemporalLayer;
    
                pLinkDynPrm->intraFrameInterval     = pDynPrm->intraFrameInterval;
                pLinkDynPrm->targetBitRate          = pDynPrm->targetBitRate;
                pLinkDynPrm->interFrameInterval     = 1;
                pLinkDynPrm->mvAccuracy             = IVIDENC2_MOTIONVECTOR_QUARTERPEL;
                pLinkDynPrm->inputFrameRate         = pDynPrm->inputFrameRate;
                pLinkDynPrm->qpMin                  = pDynPrm->qpMin;
                pLinkDynPrm->qpMax                  = pDynPrm->qpMax;
                pLinkDynPrm->qpInit                 = pDynPrm->qpInit;
                pLinkDynPrm->vbrDuration            = pDynPrm->vbrDuration;
                pLinkDynPrm->vbrSensitivity         = pDynPrm->vbrSensitivity;
            }
    
            /* MJPEG  Params */
            for (i=gVencModuleContext.vencConfig.numPrimaryChn + gVencModuleContext.vencConfig.numSecondaryChn;
                      i<(VENC_CHN_MAX); i++)
            {
                 pLinkChPrm  = &encPrm.chCreateParams[i];
                 pLinkDynPrm = &pLinkChPrm->defaultDynamicParams;
    
                 pChPrm      = &gVencModuleContext.vencConfig.encChannelParams[i];
                 pDynPrm     = &pChPrm->dynamicParam;
    
                 pLinkChPrm->format                 = IVIDEO_MJPEG;
                 pLinkChPrm->profile                = 0;
                 pLinkChPrm->dataLayout             = IVIDEO_FIELD_SEPARATED;
                 pLinkChPrm->fieldMergeEncodeEnable = FALSE;
                 pLinkChPrm->enableAnalyticinfo     = 0;
                 pLinkChPrm->enableWaterMarking     = 0;
                 pLinkChPrm->maxBitRate             = 0;
                 pLinkChPrm->encodingPreset         = 0;
                 pLinkChPrm->rateControlPreset      = 0;
                 pLinkChPrm->enableSVCExtensionFlag = 0;
                 pLinkChPrm->numTemporalLayer       = 0;
    
                 pLinkDynPrm->intraFrameInterval    = 0;
                 pLinkDynPrm->targetBitRate         = 100*1000;
                 pLinkDynPrm->interFrameInterval    = 0;
                 pLinkDynPrm->mvAccuracy            = 0;
                 pLinkDynPrm->inputFrameRate        = pDynPrm->inputFrameRate;
                 pLinkDynPrm->qpMin                 = 0;
                 pLinkDynPrm->qpMax                 = 0;
                 pLinkDynPrm->qpInit                = -1;
                 pLinkDynPrm->vbrDuration           = 0;
                 pLinkDynPrm->vbrSensitivity        = 0;
            }
    
            encPrm.inQueParams.prevLinkId    = ipcInVideoId;
            encPrm.inQueParams.prevLinkQueId = 0;
            encPrm.outQueParams.nextLink     = gVencModuleContext.ipcBitsOutRTOSId;
        }
    
        ipcBitsOutVideoPrm.baseCreateParams.inQueParams.prevLinkId = gVencModuleContext.encId;
        ipcBitsOutVideoPrm.baseCreateParams.inQueParams.prevLinkQueId = 0;
        ipcBitsOutVideoPrm.baseCreateParams.numOutQue                 = 1;
        ipcBitsOutVideoPrm.baseCreateParams.outQueParams[0].nextLink = gVencModuleContext.ipcBitsInHLOSId;
        MultiCh_ipcBitsInitCreateParams_BitsOutRTOS(&ipcBitsOutVideoPrm,
                                                   TRUE);
    
        ipcBitsInHostPrm[0].baseCreateParams.inQueParams.prevLinkId = gVencModuleContext.ipcBitsOutRTOSId;
        ipcBitsInHostPrm[0].baseCreateParams.inQueParams.prevLinkQueId = 0;
        MultiCh_ipcBitsInitCreateParams_BitsInHLOS(&ipcBitsInHostPrm[0]);
    
        if(enableOsdAlgLink)
        {
            int chId;
           // dspAlgPrm.enableOSDAlg = TRUE; //this means have a texas log in vedio Away:10-16
           dspAlgPrm.enableOSDAlg = FALSE;
    
            for(chId = 0; chId < ALG_LINK_OSD_MAX_CH; chId++)
            {
                AlgLink_OsdChWinParams * chWinPrm = &dspAlgPrm.osdChCreateParams[chId].chDefaultParams;
    
                /* set osd window max width and height */
                dspAlgPrm.osdChCreateParams[chId].maxWidth  = EXAMPLE_OSD_WIN_MAX_WIDTH;
                dspAlgPrm.osdChCreateParams[chId].maxHeight = EXAMPLE_OSD_WIN_MAX_HEIGHT;
    
                chWinPrm->chId = chId;
                chWinPrm->numWindows = 0;
            }
        }
    
        if (enableScdAlgLink)
        {
            Int32   numBlksInFrame;
            Int32   numHorzBlks, numVertBlks, chIdx;
            Uint32  x, y, i;
            //AlgLink_ScdblkChngConfig  blkConfig[ALG_LINK_SCD_MAX_BLOCKS_IN_FRAME];
    
            dspAlgPrm.enableSCDAlg              = TRUE;
            dspAlgPrm.outQueParams[ALG_LINK_SCD_OUT_QUE].nextLink     = ipcBitsOutDSPId;
    
            dspAlgPrm.scdCreateParams.maxWidth               = 352;
            if(Vcap_isPalMode())
               dspAlgPrm.scdCreateParams.maxHeight              = 288;
            else
               dspAlgPrm.scdCreateParams.maxHeight              = 240;
            dspAlgPrm.scdCreateParams.maxStride              = 352;
            dspAlgPrm.scdCreateParams.numValidChForSCD       = 4;
            dspAlgPrm.scdCreateParams.numSecs2WaitB4Init     = 3;
            dspAlgPrm.scdCreateParams.numSecs2WaitB4FrmAlert = 1;
            dspAlgPrm.scdCreateParams.inputFrameRate         = 30;
            dspAlgPrm.scdCreateParams.outputFrameRate        = 5;
            dspAlgPrm.scdCreateParams.numSecs2WaitAfterFrmAlert = 2;
    
            /* Should be applied on CIF channels whose ch numbers are 4~7 */
            //dspAlgPrm.scdCreateParams.startChNoForSCD = 4;
           // 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;
    /*
       i = 0;
       for(y = 0; y < numVertBlks; y++)
       {
         for(x = 0; x < numHorzBlks; x++)
         {
           blkConfig[i].sensitivity = ALG_LINK_SCD_SENSITIVITY_MID;
           blkConfig[i].monitored    = 1;
           i++;
         }
       }
    */
            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_HIGH;
                    chPrm->frmEdgeThreshold   = 100;
         //     chPrm->blkConfig            = NULL; //blkConfig;
               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     = 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);
            ipcBitsInHostPrm[1].baseCreateParams.inQueParams.prevLinkId = ipcBitsOutDSPId;
            ipcBitsInHostPrm[1].baseCreateParams.inQueParams.prevLinkQueId = 0;
            MultiCh_ipcBitsInitCreateParams_BitsInHLOSVcap(&ipcBitsInHostPrm[1]);
        }
        else
        {
            dspAlgPrm.outQueParams[ALG_LINK_SCD_OUT_QUE].nextLink     = SYSTEM_LINK_ID_INVALID;
        }
    #ifndef SYSTEM_USE_VIDEO_DECODER
        capturePrm.isPalMode = Vcap_isPalMode();
    #endif
    #if 0
        {
            CaptureLink_BlindInfo blindInfo[2];
    
            blindInfo[0].streamId = 0;
            blindInfo[0].channelId = 1;
            blindInfo[0].fillColorYUYV= 0x80108010;
            blindInfo[0].numBlindArea = 4;
            blindInfo[0].win[0].startX = 30;
            blindInfo[0].win[0].startY = 10;
            blindInfo[0].win[0].width = 30;
            blindInfo[0].win[0].height = 50;
    
            blindInfo[0].win[1].startX = 70;
            blindInfo[0].win[1].startY = 60;
            blindInfo[0].win[1].width = 30;
            blindInfo[0].win[1].height = 50;
            blindInfo[0].win[2].startX = 110;
            blindInfo[0].win[2].startY = 110;
            blindInfo[0].win[2].width = 30;
            blindInfo[0].win[2].height = 50;
            blindInfo[0].win[3].startX = 150;
            blindInfo[0].win[3].startY = 160;
            blindInfo[0].win[3].width = 30;
            blindInfo[0].win[3].height = 50;
    
            blindInfo[1] = blindInfo[0];
    
            blindInfo[1].channelId = 15;
    
            capturePrm.blindInfo[0] = blindInfo[0];
            capturePrm.blindInfo[1] = blindInfo[1];
        }
    #endif
        System_linkCreate (gVcapModuleContext.captureId, &capturePrm, sizeof(capturePrm));
    
    #ifdef     ADD_NSF_AFTER_CAPTURE
        System_linkCreate(gVcapModuleContext.nsfId[1], &nsfPrm2, sizeof(nsfPrm2));
    #endif
        System_linkCreate(gVcapModuleContext.deiId[0], &deiPrm, sizeof(deiPrm));
    
        System_linkCreate(dupId[D1_DUP_LINK_IDX], &dupPrm[D1_DUP_LINK_IDX], sizeof(dupPrm[D1_DUP_LINK_IDX]));
        System_linkCreate(gVcapModuleContext.nsfId[0] , &nsfPrm, sizeof(nsfPrm));
        System_linkCreate(mergeId[D1_CIF_MERGE_LINK_IDX], &mergePrm[D1_CIF_MERGE_LINK_IDX], sizeof(mergePrm[D1_CIF_MERGE_LINK_IDX]));
    
        if(enableOsdAlgLink || 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));
            if(enableScdAlgLink)
            {
              System_linkCreate(ipcBitsOutDSPId, &ipcBitsOutDspPrm, sizeof(ipcBitsOutDspPrm));
              System_linkCreate(gVcapModuleContext.ipcBitsInHLOSId, &ipcBitsInHostPrm[1], sizeof(ipcBitsInHostPrm[1]));
            }
        }
        System_linkCreate(ipcOutVpssId , &ipcOutVpssPrm , sizeof(ipcOutVpssPrm) );
        System_linkCreate(ipcInVideoId , &ipcInVideoPrm , sizeof(ipcInVideoPrm) );
    
        System_linkCreate(gVencModuleContext.encId, &encPrm, sizeof(encPrm));
    
        System_linkCreate(gVencModuleContext.ipcBitsOutRTOSId, &ipcBitsOutVideoPrm, sizeof(ipcBitsOutVideoPrm));
        System_linkCreate(gVencModuleContext.ipcBitsInHLOSId, &ipcBitsInHostPrm[0], sizeof(ipcBitsInHostPrm[0]));
    
        System_linkGetInfo(gVencModuleContext.ipcBitsInHLOSId,&bitsProducerLinkInfo);
        OSA_assert(bitsProducerLinkInfo.numQue == 1);
        ipcBitsOutHostPrm.baseCreateParams.outQueParams[0].nextLink = gVdecModuleContext.ipcBitsInRTOSId;
    
        printf ("\n\n========bitsProducerLinkInfo============\n");
        printf ("numQ %d, numCh %d\n",
                        bitsProducerLinkInfo.numQue,
                        bitsProducerLinkInfo.queInfo[0].numCh);
        {
            int i;
            for (i=0; i<bitsProducerLinkInfo.queInfo[0].numCh; i++)
            {
                printf ("Ch [%d] Width %d, Height %d\n",
                    i,
                    bitsProducerLinkInfo.queInfo[0].chInfo[i].width,
                    bitsProducerLinkInfo.queInfo[0].chInfo[i].height
                    );
            }
        }
        printf ("\n====================\n\n");
    
        if (bitsProducerLinkInfo.queInfo[0].numCh > gVencModuleContext.vencConfig.numPrimaryChn)
            bitsProducerLinkInfo.queInfo[0].numCh = gVencModuleContext.vencConfig.numPrimaryChn;
    
        printf ("Reducing bitsProducerLinkInfo.numCh to %d\n", bitsProducerLinkInfo.queInfo[0].numCh);
    
        MultiCh_ipcBitsInitCreateParams_BitsOutHLOS(&ipcBitsOutHostPrm,
                                                   &bitsProducerLinkInfo.queInfo[0]);
        ipcBitsOutHostPrm.numBufPerCh[0]  = NUM_IPC_OUT_BUFFERS;
        if(gVdecModuleContext.vdecConfig.forceUseDecChannelParams)
        {
            /* use channel info provided by user instead of from encoder */
            UInt32 chId;
            System_LinkChInfo *pChInfo;
    
            ipcBitsOutHostPrm.inQueInfo.numCh = gVdecModuleContext.vdecConfig.numChn;
    
            for(chId=0; chId<ipcBitsOutHostPrm.inQueInfo.numCh; chId++)
            {
                pChInfo = &ipcBitsOutHostPrm.inQueInfo.chInfo[chId];
    
                /* Not Used - Start */
                pChInfo->bufType        = 0;
                pChInfo->codingformat   = 0;
                pChInfo->dataFormat     = 0;
                pChInfo->memType        = 0;
                pChInfo->startX         = 0;
                pChInfo->startY         = 0;
                pChInfo->pitch[0]       = 0;
                pChInfo->pitch[1]       = 0;
                pChInfo->pitch[2]       = 0;
                /* Not Used - End */
    
                pChInfo->width          = gVdecModuleContext.vdecConfig.decChannelParams[chId].maxVideoWidth;
                pChInfo->height         = gVdecModuleContext.vdecConfig.decChannelParams[chId].maxVideoHeight;
                pChInfo->scanFormat     = SYSTEM_SF_PROGRESSIVE;
            }
        }
        ipcBitsInVideoPrm.baseCreateParams.inQueParams.prevLinkId       = gVdecModuleContext.ipcBitsOutHLOSId;
        ipcBitsInVideoPrm.baseCreateParams.inQueParams.prevLinkQueId    = 0;
        ipcBitsInVideoPrm.baseCreateParams.numOutQue                    = 1;
        ipcBitsInVideoPrm.baseCreateParams.outQueParams[0].nextLink     = gVdecModuleContext.decId;
        MultiCh_ipcBitsInitCreateParams_BitsInRTOS(&ipcBitsInVideoPrm, TRUE);
    
        for (i=0; i<gVdecModuleContext.vdecConfig.numChn; i++) {
            decPrm.chCreateParams[i].format                 = IVIDEO_H264HP;
            decPrm.chCreateParams[i].profile                = IH264VDEC_PROFILE_ANY;
            decPrm.chCreateParams[i].fieldMergeDecodeEnable = FALSE;
            decPrm.chCreateParams[i].targetMaxWidth         = ipcBitsOutHostPrm.inQueInfo.chInfo[i].width;
            decPrm.chCreateParams[i].targetMaxHeight        = ipcBitsOutHostPrm.inQueInfo.chInfo[i].height;
            decPrm.chCreateParams[i].defaultDynamicParams.targetFrameRate = gVdecModuleContext.vdecConfig.decChannelParams[i].dynamicParam.frameRate;
            decPrm.chCreateParams[i].defaultDynamicParams.targetBitRate   = gVdecModuleContext.vdecConfig.decChannelParams[i].dynamicParam.targetBitRate;
            /* Max ref frames is only 2 as this is closed loop decoder */
            decPrm.chCreateParams[i].dpbBufSizeInFrames                   = 2;
            decPrm.chCreateParams[i].numBufPerCh = NUM_DECODE_BUFFERS;
        }
        decPrm.inQueParams.prevLinkId    = gVdecModuleContext.ipcBitsInRTOSId;
        decPrm.inQueParams.prevLinkQueId = 0;
        decPrm.outQueParams.nextLink  = ipcOutVideoId;
        decPrm.tilerEnable = TILER_ENABLE;
    
        ipcOutVideoPrm.inQueParams.prevLinkId    = gVdecModuleContext.decId;
        ipcOutVideoPrm.inQueParams.prevLinkQueId = 0;
        ipcOutVideoPrm.numOutQue                 = 1;
        ipcOutVideoPrm.outQueParams[0].nextLink  = ipcInVpssId;
        ipcOutVideoPrm.notifyNextLink            = TRUE;
        ipcOutVideoPrm.notifyPrevLink            = TRUE;
        ipcOutVideoPrm.noNotifyMode              = FALSE;
    
        ipcInVpssPrm.inQueParams.prevLinkId    = ipcOutVideoId;
        ipcInVpssPrm.inQueParams.prevLinkQueId = 0;
        ipcInVpssPrm.numOutQue                 = 1;
        ipcInVpssPrm.outQueParams[0].nextLink  = mergeId[LIVE_DECODE_MERGE_LINK_IDX];
        ipcInVpssPrm.notifyNextLink            = TRUE;
        ipcInVpssPrm.notifyPrevLink            = TRUE;
        ipcInVpssPrm.noNotifyMode              = FALSE;
    
        mergePrm[LIVE_DECODE_MERGE_LINK_IDX].numInQue                     = 2;
        mergePrm[LIVE_DECODE_MERGE_LINK_IDX].inQueParams[0].prevLinkId    = dupId[D1_DUP_LINK_IDX];
        mergePrm[LIVE_DECODE_MERGE_LINK_IDX].inQueParams[0].prevLinkQueId = 0;
        mergePrm[LIVE_DECODE_MERGE_LINK_IDX].inQueParams[1].prevLinkId    = ipcInVpssId;
        mergePrm[LIVE_DECODE_MERGE_LINK_IDX].inQueParams[1].prevLinkQueId = 0;
        mergePrm[LIVE_DECODE_MERGE_LINK_IDX].outQueParams.nextLink        = dupId[LIVE_DECODE_DUP_LINK_IDX];
        mergePrm[LIVE_DECODE_MERGE_LINK_IDX].notifyNextLink               = TRUE;
    
        dupPrm[LIVE_DECODE_DUP_LINK_IDX].inQueParams.prevLinkId         = mergeId[LIVE_DECODE_MERGE_LINK_IDX];
        dupPrm[LIVE_DECODE_DUP_LINK_IDX].inQueParams.prevLinkQueId      = 0;
        dupPrm[LIVE_DECODE_DUP_LINK_IDX].numOutQue                      = 2;
        dupPrm[LIVE_DECODE_DUP_LINK_IDX].outQueParams[0].nextLink       = gVdisModuleContext.swMsId[0];
        dupPrm[LIVE_DECODE_DUP_LINK_IDX].outQueParams[1].nextLink       = gVdisModuleContext.swMsId[1];
        dupPrm[LIVE_DECODE_DUP_LINK_IDX].notifyNextLink                 = TRUE;
    
        for(i=0; i<2; i++)
        {
            swMsPrm[i].inQueParams.prevLinkId    = dupId[LIVE_DECODE_DUP_LINK_IDX];
            swMsPrm[i].inQueParams.prevLinkQueId = i;
            if (i == 1)
            {
                swMsPrm[i].outQueParams.nextLink     = gVdisModuleContext.displayId[2];
            }
            else
            {
                swMsPrm[i].outQueParams.nextLink     = gVdisModuleContext.displayId[i];
            }
            swMsPrm[i].maxInputQueLen            = 4; // KC: changed to 4 to make the display smooth
            swMsPrm[i].maxOutRes                 = VSYS_STD_1080P_60;
            swMsPrm[i].initOutRes                = gVdisModuleContext.vdisConfig.deviceParams[i].resolution;
            swMsPrm[i].numOutBuf                 = 8;
            if (i == 1)
    		{
                swMsPrm[i].maxOutRes  = VSYS_STD_PAL;
                swMsPrm[i].initOutRes = gVdisModuleContext.vdisConfig.deviceParams[VDIS_DEV_SD].resolution;
    		}
    
    #ifdef  SYSTEM_USE_TILER
            swMsPrm[i].lineSkipMode = FALSE; // Double pitch not possible in tiler mode; so Line skip not possible
    #else
            swMsPrm[i].lineSkipMode = TRUE; // Set to TRUE for Enable low cost scaling
    #endif
            swMsPrm[i].enableLayoutGridDraw = gVdisModuleContext.vdisConfig.enableLayoutGridDraw;
    
            MultiCh_swMsGetDefaultLayoutPrm(i, &swMsPrm[i], TRUE);
    
            displayPrm[i].inQueParams[0].prevLinkId    = gVdisModuleContext.swMsId[i];
            displayPrm[i].inQueParams[0].prevLinkQueId = 0;
            displayPrm[i].displayRes                = swMsPrm[i].initOutRes;
            if (i == 1)
            {
                displayPrm[i].displayRes            = gVdisModuleContext.vdisConfig.deviceParams[VDIS_DEV_SD].resolution;
                displayPrm[i].forceFieldSeparatedInputMode = TRUE;
            }
        }
    
        System_linkCreate(gVdecModuleContext.ipcBitsOutHLOSId,&ipcBitsOutHostPrm,sizeof(ipcBitsOutHostPrm));
        System_linkCreate(gVdecModuleContext.ipcBitsInRTOSId,&ipcBitsInVideoPrm,sizeof(ipcBitsInVideoPrm));
        System_linkCreate(gVdecModuleContext.decId, &decPrm, sizeof(decPrm));
    
        System_linkCreate(ipcOutVideoId, &ipcOutVideoPrm, sizeof(ipcOutVideoPrm));
        System_linkCreate(ipcInVpssId  , &ipcInVpssPrm  , sizeof(ipcInVpssPrm)  );
        System_linkCreate(mergeId[LIVE_DECODE_MERGE_LINK_IDX], &mergePrm[LIVE_DECODE_MERGE_LINK_IDX], sizeof(mergePrm[LIVE_DECODE_MERGE_LINK_IDX]));
        System_linkCreate(dupId[LIVE_DECODE_DUP_LINK_IDX], &dupPrm[LIVE_DECODE_DUP_LINK_IDX], sizeof(dupPrm[LIVE_DECODE_DUP_LINK_IDX]));
    
        for(i=0; i<2; i++)
            System_linkCreate(gVdisModuleContext.swMsId[i]  , &swMsPrm[i], sizeof(swMsPrm[i]));
    
        for(i=0; i<2; i++)  /* Both tied VENCs HDMI and DVO2 are handled by single link instance */
        {
            if (i == 1)
            {
                System_linkCreate(gVdisModuleContext.displayId[2],
                &displayPrm[i], sizeof(displayPrm[i]));
            }
            else
            {
                System_linkCreate(gVdisModuleContext.displayId[i],
                &displayPrm[i], sizeof(displayPrm[i]));
            }
        }
        {
            MergeLink_InLinkChInfo inChInfo;
    
            MergeLink_InLinkChInfo_Init(&inChInfo);
            inChInfo.inLinkID = ipcInVpssId;
            System_linkControl(mergeId[LIVE_DECODE_MERGE_LINK_IDX],
                               MERGE_LINK_CMD_GET_INPUT_LINK_CHINFO,
                               &inChInfo,
                               sizeof(inChInfo),
                               TRUE);
            OSA_assert(inChInfo.numCh == gVdecModuleContext.vdecConfig.numChn);
            MultiCh_setDec2DispMap(VDIS_DEV_HDMI,gVdecModuleContext.vdecConfig.numChn,0,inChInfo.startChNum);
            MultiCh_setDec2DispMap(VDIS_DEV_SD,gVdecModuleContext.vdecConfig.numChn,0,inChInfo.startChNum);
       }
    
    }
    
    Void MultiCh_deleteProgressive4D1And1HDVcapVencVdecVdis()
    {
        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++)
        {
            if (i == 1)
            {
                System_linkDelete(gVdisModuleContext.displayId[2]);
            }
            else
            {
                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);
    
    }
    
    
    
    
    
    Sorry for my poor language.

    After modified some codes,there are still many errs and link cann't be finish:

     [m3video]  14828: DECODE: Create in progress ... !!!
     [m3video]  14829: Assertion @ Line: 700 in links_m3video/iva_dec/decLink_common.c: retVal == DEC_LINK_S_SUCCESS : failed !!!

    My usecase doc as attachment is. It is so disorder and bad that cann't run any thread...

     

  • Attached is the usecase file that does 1HD + 4D1 capture. Pls use attached as reference for your usecase. You may get compilation errors if you directly replace the attached file as the code is based on latest RDK codebase that you will not have.

    Apart from the usecase the main thing is correct configuration of external HD video decoder IC. You will havew to write the code for configuration of the IC based on its data sheet.

    You will then have to set correct parameters to VIP for HD channel capture such as embedded sync or discrete synch etc.

    /*******************************************************************************
     *                                                                             *
     * Copyright (c) 2009 Texas Instruments Incorporated - http://www.ti.com/      *
     *                        ALL RIGHTS RESERVED                                  *
     *                                                                             *
     ******************************************************************************/
    
    
    #include "mcfw/src_linux/mcfw_api/usecases/multich_common.h"
    #include "mcfw/src_linux/mcfw_api/usecases/multich_ipcbits.h"
    #include "mcfw/src_linux/mcfw_api/ti_vdis_priv.h"
    #include "mcfw/src_linux/devices/tw2968/src/tw2968_priv.h"
    #include "mcfw/src_linux/devices/tvp5158/src/tvp5158_priv.h"
    #include "mcfw/interfaces/link_api/system_tiler.h"
    #include "mcfw/interfaces/link_api/avsync_hlos.h"
    #include "mcfw/interfaces/ti_vdis_timings.h"
    
    /* =============================================================================
     * Externs
     * =============================================================================
     */
    
    /* =============================================================================
     * Use case code
     * =============================================================================
     */
    
    /**
    
    
                   +--------------+
                   |              |
                   |              |
                   |   Capture    |
                   |              |
                   |              |
                   +--------------+
                      +         +
                      |         +
              VIP0    |         |VIP1
              4ch SD  |         |1ch HD
                @     |         | @
             60 fields|         |30 frames
                      |         |
                      |         |
                      |         |
                      v         |
                 +---------+    |
                 |         |    |
                 | DEI     |    |
                 |         |    |
                 +---------+    |
                      +         |
             4ch SD   |         v
               @  +-----------------+                      +----------+             +------------+
             30   |   Merge         |+-------------------->| H264 enc |+----------->|IpcBitsOut  |
          frames  |                 |                      |  5 ch    |             |            |
                  +-----------------+                      +----------+             +------------+
    */
    
    #define     MAX_NUM_CAPTURE_DEVICES     (4)
    
    #define     NUM_SD_DECODE_CHANNELS      (4)
    #define     NUM_HD_DECODE_CHANNELS      (1)
    #define     SD_DECODE_CHANNEL_WIDTH     (720)
    #define     SD_DECODE_CHANNEL_HEIGHT     (576)
    #define     HD_DECODE_CHANNEL_WIDTH     (1920)
    #define     HD_DECODE_CHANNEL_HEIGHT     (1080)
    
    #define     MULTICH_HDSDI_DVR_USECASE_MAX_NUM_LINKS       (64)
    
    #define     MULTICH_DSP_ALG_LINK_OSD_IDX  (0)
    #define     MULTICH_DSP_ALG_LINK_SCD_IDX  (1)
    
    #define     OSD_VID_PLANE_FMT_420         (0)
    #define     OSD_VID_PLANE_FMT_422         (1)
    
    #define     NUM_BUFS_PER_CH_CAPTURE              (8)
    #define     NUM_BUFS_PER_CH_DEI_VIP_SC_PRIQ      (6)
    #define     NUM_BUFS_PER_CH_DEC_SD               (6)
    #define     NUM_BUFS_PER_CH_DEC_HD               (4)
    #define     NUM_BUFS_PER_CH_SWMS_HD              (4)
    #define     NUM_BUFS_PER_CH_SWMS_SD              (4)
    #define     NUM_BUFS_PER_CH_ENC_PRI              (5)
    #define     NUM_BUFS_PER_CH_ENC_SEC              (5)
    #define     NUM_BUFS_PER_CH_ENC_TER              (3)
    #define     NUM_BUFS_PER_CH_BITSOUT_SD           (5)
    #define     NUM_BUFS_PER_CH_BITSOUT_HD           (4)
    #define     NUM_BUFS_PER_CH_SCLR                 (3)
    #define     NUM_BUFS_PER_CH_BITSOUT_SCD          (2)
    #define     NUM_BUFS_PER_CH_NSF                  (3)
    
    
    
    #define     ENC_LINK_PRIMARY_STREAM_POOL_ID      (0)
    
    #define     IPCBITSOUT_LINK_SD_STREAM_POOL_ID    (0)
    #define     IPCBITSOUT_LINK_HD_STREAM_POOL_ID    (1)
    
    #define     TILER_ENABLE_ENCODE                  (TRUE)
    #define     TILER_ENABLE_DECODE_SD               (TRUE)
    #define     TILER_ENABLE_DECODE_HD               (FALSE)
    
    #define     HDSDIDVR_960H_LAYOUT_WIDTH          (960)
    #define     HDSDIDVR_960H_LAYOUT_HEIGHT         (720)
    /* =============================================================================
     * Externs
     * =============================================================================
     */
    
    
    /* =============================================================================
     * Use case code
     * =============================================================================
     */
    
    static SystemVideo_Ivahd2ChMap_Tbl systemVid_encDecIvaChMapTbl =
    {
        .isPopulated = 1,
        .ivaMap[0] =
        {
            .EncNumCh  = 4,
            .EncChList = {0, 1, 2, 3, 12, 15, 18, 21, 24, 27, 30, 33, 36, 39, 42, 45, 48, 51, 54, 57, 60, 63},
            .DecNumCh  = 0,
            .DecChList = {0, 3, 6, 9, 12, 15, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
        },
        .ivaMap[1] =
        {
            .EncNumCh  = 1,
            .EncChList = {5, 4, 7, 10, 13, 16, 19, 22, 25, 28, 31, 34, 37, 40, 43, 46, 49, 52, 55, 58, 61 },
            .DecNumCh  = 0,
            .DecChList = {1, 4, 7, 10, 13, 16, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
        },
        .ivaMap[2] =
        {
            .EncNumCh  = 0,
            .EncChList = {2, 5, 8, 11, 14, 17, 20, 23, 26, 29, 32, 35, 38, 41, 44, 47, 50, 53, 56, 59, 62 },
            .DecNumCh  = 0,
            .DecChList = {2, 5, 8, 11, 14, 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
        },
    };
    
    /** Merge Link Info */
    #define     NUM_MERGE_LINK                         (1)
    
    
    /**  D1 HD Merge
     *   DEI0 ------DEI_VIP_SC_PRI_Q-->Q0--|
     *                                     |-PRE_ENCODE_MERGE_LINK_IDX
     *   CAPTURE ---HD---------------->Q1--|
     *
     */
    #define     PRE_ENCODE_MERGE_LINK_IDX              0
    #define     PRE_ENCODE_MERGE_LINK_NUM_INQUE       (2)
    #define     PRE_ENCODE_MERGE_LINK_DEI0_D1_QIDX    (0)
    #define     PRE_ENCODE_MERGE_LINK_HDCAPTURE_QIDX    (1)
    
    
    #define     NUM_DUP_LINK                           1
    #define     DECODE_DUP_LINK_IDX                    0
    
    
    
    
    #define     MULTICH_HDSDIDVR_MAPDEILINKID2INDEX(linkID)   (((linkID) == SYSTEM_LINK_ID_DEI_HQ_0) ? 0 : 1)
    
    typedef struct MultichHDSDIDVR_Context
    {
        UInt32 mergeId[NUM_MERGE_LINK];
        UInt32 dupId[NUM_DUP_LINK];
        UInt32 ipcOutVpssId, ipcInVpssId;
        UInt32 ipcOutVideoId, ipcInVideoId;
        UInt32 createdLinkCount;
        UInt32 createdLinks[MULTICH_HDSDI_DVR_USECASE_MAX_NUM_LINKS];
        CaptureLink_CreateParams    capturePrm;
        DeiLink_CreateParams        deiPrm[MAX_DEI_LINK];
        MergeLink_CreateParams      mergePrm[NUM_MERGE_LINK];
        DupLink_CreateParams        dupPrm[NUM_DUP_LINK];
        SwMsLink_CreateParams       swMsPrm[VDIS_DEV_MAX];
        DisplayLink_CreateParams    displayPrm[VDIS_DEV_MAX];
        IpcLink_CreateParams        ipcOutVpssPrm;
        IpcLink_CreateParams        ipcInVpssPrm;
        IpcLink_CreateParams        ipcOutVideoPrm;
        IpcLink_CreateParams        ipcInVideoPrm;
        EncLink_CreateParams        encPrm;
        DecLink_CreateParams        decPrm;
        IpcBitsOutLinkHLOS_CreateParams   ipcBitsOutHostPrm;
        IpcBitsOutLinkRTOS_CreateParams   ipcBitsOutVideoPrm;
        IpcBitsInLinkHLOS_CreateParams    ipcBitsInHostPrm[1];
        IpcBitsInLinkRTOS_CreateParams    ipcBitsInVideoPrm;
        VCAP_DEVICE_CREATE_PARAM_S vidDecVideoModeArgs[MAX_NUM_CAPTURE_DEVICES];
        AvsyncLink_LinkSynchConfigParams       avsyncCfg[2];
        UInt32                                 captureFps;
        MergeLink_InLinkChInfo                 mergeChMap[2];
        SwMsLink_LayoutPrm                     swmsLayoutPrm[VDIS_DEV_MAX];
        System_LinkInfo                        deiLinkInfo[2];
        VDIS_MOSAIC_S                          vdisMosaicPrms[VDIS_DEV_MAX];
        UInt32                                 invisbleDecChannelList[DEC_LINK_MAX_CH];
        UInt32                                 visbleDecChannelList[DEC_LINK_MAX_CH];
    }  MultichHDSDIDVR_Context;
    
    MultichHDSDIDVR_Context gHDSDIDVRUsecaseContext =
    {
        .createdLinkCount           = 0
    };
    
    #ifdef MAX
    #undef MAX
    #endif
    
    #define MAX(a,b) ((a) > (b) ? (a) : (b))
    
    #define MULTICH_HDSDIDVR_GET_CAPTURE_FIELDS_PER_SEC()           (gHDSDIDVRUsecaseContext.captureFps)
    #define MULTICH_HDSDIDVR_GET_CAPTURE_FRAMES_PER_SEC()           (gHDSDIDVRUsecaseContext.captureFps/2)
    
    static
    Int32 MultiCh_hdsdiDVRSetMosaicParams(VDIS_DEV vdDevId, VDIS_MOSAIC_S *psVdMosaicParam );
    
    static Void multich_hdsdidvr_register_created_link(MultichHDSDIDVR_Context *pContext,
                                                        UInt32 linkID)
    {
        OSA_assert(pContext->createdLinkCount < OSA_ARRAYSIZE(pContext->createdLinks));
        pContext->createdLinks[pContext->createdLinkCount] = linkID;
        pContext->createdLinkCount++;
    }
    
    #define MULTICH_HDSDIDVR_CREATE_LINK(linkID,createPrm,createPrmSize)           \
        do                                                                          \
        {                                                                           \
            System_linkCreate(linkID,createPrm,createPrmSize);                      \
            multich_hdsdidvr_register_created_link(&gHDSDIDVRUsecaseContext,      \
                                                    linkID);                        \
        } while (0)
    
    static
    Void multich_hdsdidvr_reset_link_prms()
    {
        int i;
    
        MULTICH_INIT_STRUCT(IpcLink_CreateParams,gHDSDIDVRUsecaseContext.ipcOutVpssPrm);
        MULTICH_INIT_STRUCT(IpcLink_CreateParams,gHDSDIDVRUsecaseContext.ipcInVpssPrm);
        MULTICH_INIT_STRUCT(IpcLink_CreateParams,gHDSDIDVRUsecaseContext.ipcOutVideoPrm);
        MULTICH_INIT_STRUCT(IpcLink_CreateParams,gHDSDIDVRUsecaseContext.ipcInVideoPrm);
        MULTICH_INIT_STRUCT(IpcBitsOutLinkRTOS_CreateParams,gHDSDIDVRUsecaseContext.ipcBitsOutVideoPrm);
        MULTICH_INIT_STRUCT(IpcBitsInLinkHLOS_CreateParams,gHDSDIDVRUsecaseContext.ipcBitsInHostPrm[0]);
        MULTICH_INIT_STRUCT(IpcBitsInLinkHLOS_CreateParams,gHDSDIDVRUsecaseContext.ipcBitsInHostPrm[1]);
        MULTICH_INIT_STRUCT(IpcBitsInLinkRTOS_CreateParams,gHDSDIDVRUsecaseContext.ipcBitsInVideoPrm);
        IpcBitsOutLinkHLOS_CreateParams_Init(&gHDSDIDVRUsecaseContext.ipcBitsOutHostPrm);
        DecLink_CreateParams_Init(&gHDSDIDVRUsecaseContext.decPrm);
        EncLink_CreateParams_Init(&gHDSDIDVRUsecaseContext.encPrm);
        CaptureLink_CreateParams_Init(&gHDSDIDVRUsecaseContext.capturePrm);
        for (i = 0; i < OSA_ARRAYSIZE(gHDSDIDVRUsecaseContext.displayPrm);i++)
        {
            DisplayLink_CreateParams_Init(&gHDSDIDVRUsecaseContext.displayPrm[i]);
        }
        for (i = 0; i < OSA_ARRAYSIZE(gHDSDIDVRUsecaseContext.swMsPrm);i++)
        {
            SwMsLink_CreateParams_Init(&gHDSDIDVRUsecaseContext.swMsPrm[i]);
        }
    
         for (i = 0; i < OSA_ARRAYSIZE(gHDSDIDVRUsecaseContext.deiPrm);i++)
         {
             DeiLink_CreateParams_Init(&gHDSDIDVRUsecaseContext.deiPrm[i]);
         }
         for (i = 0; i < OSA_ARRAYSIZE(gHDSDIDVRUsecaseContext.avsyncCfg);i++)
         {
             AvsyncLink_LinkSynchConfigParams_Init(&gHDSDIDVRUsecaseContext.avsyncCfg[i]);
         }
    }
    
    static
    Void multich_hdsdidvr_set_capture_prm(CaptureLink_CreateParams *capturePrm)
    {
        CaptureLink_VipInstParams         *pCaptureInstPrm;
        CaptureLink_OutParams             *pCaptureOutPrm;
        UInt32 vipInstId;
    
        /* This is for TVP5158 Audio Channels - Change it to 16 if there are 16 audio channels connected in cascade */
        capturePrm->numVipInst                 = 2;
    
        capturePrm->tilerEnable                = FALSE;
        capturePrm->numBufsPerCh               = NUM_BUFS_PER_CH_CAPTURE;
        capturePrm->numExtraBufs               = 0;
        capturePrm->fakeHdMode                 = TRUE;
        capturePrm->enableSdCrop               = FALSE;
        capturePrm->doCropInCapture            = FALSE;
    #ifndef SYSTEM_USE_VIDEO_DECODER
        capturePrm->isPalMode = Vcap_isPalMode();
    #endif
    
        vipInstId = 0;
        pCaptureInstPrm                     = &capturePrm->vipInst[vipInstId];
        pCaptureInstPrm->vipInstId          = (SYSTEM_CAPTURE_INST_VIP0_PORTA+
                                              vipInstId)%SYSTEM_CAPTURE_INST_MAX;
        pCaptureInstPrm->videoDecoderId     = SYSTEM_DEVICE_VID_DEC_TVP5158_DRV;
        pCaptureInstPrm->inDataFormat       = SYSTEM_DF_YUV422P;
        pCaptureInstPrm->standard           = SYSTEM_STD_MUX_4CH_D1;
        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;
    
        vipInstId = 1;
        pCaptureInstPrm                     = &capturePrm->vipInst[vipInstId];
        pCaptureInstPrm->vipInstId          = (SYSTEM_CAPTURE_INST_VIP0_PORTA+
                                              vipInstId)%SYSTEM_CAPTURE_INST_MAX;
        pCaptureInstPrm->videoDecoderId     = SYSTEM_DEVICE_VID_DEC_SII9135_DRV;
        pCaptureInstPrm->inDataFormat       = SYSTEM_DF_YUV422P;
        pCaptureInstPrm->standard           = SYSTEM_STD_1080P_60;
        pCaptureInstPrm->numOutput          = 1;
    
        pCaptureOutPrm                      = &pCaptureInstPrm->outParams[0];
        pCaptureOutPrm->dataFormat          = SYSTEM_DF_YUV420SP_UV;
        pCaptureOutPrm->scEnable            = FALSE;
        pCaptureOutPrm->scOutWidth          = 0;
        pCaptureOutPrm->scOutHeight         = 0;
        pCaptureOutPrm->outQueId          = 1;
    
    }
    
    
    static
    Void multich_hdsdidvr_configure_extvideodecoder_prm()
    {
        int i;
        VCAP_VIDEO_SOURCE_STATUS_S vidSourceStatus;
        UInt32 numCaptureDevices;
    
        numCaptureDevices = 2;
    
        for(i = 0; i < numCaptureDevices; i++)
        {
            if (0 == i)
            {
                gHDSDIDVRUsecaseContext.vidDecVideoModeArgs[i].deviceId         = DEVICE_VID_DEC_TVP5158_DRV;
                gHDSDIDVRUsecaseContext.vidDecVideoModeArgs[i].vipInstId        = SYSTEM_CAPTURE_INST_VIP0_PORTA+i;
                gHDSDIDVRUsecaseContext.vidDecVideoModeArgs[i].numChInDevice    = 4;
                gHDSDIDVRUsecaseContext.vidDecVideoModeArgs[i].modeParams.videoIfMode        = DEVICE_CAPT_VIDEO_IF_MODE_8BIT;
                gHDSDIDVRUsecaseContext.vidDecVideoModeArgs[i].modeParams.videoDataFormat    = SYSTEM_DF_YUV422P;
                gHDSDIDVRUsecaseContext.vidDecVideoModeArgs[i].modeParams.standard           = SYSTEM_STD_MUX_4CH_D1;
                gHDSDIDVRUsecaseContext.vidDecVideoModeArgs[i].modeParams.videoCaptureMode   =
                            DEVICE_CAPT_VIDEO_CAPTURE_MODE_MULTI_CH_PIXEL_MUX_EMBEDDED_SYNC;
                gHDSDIDVRUsecaseContext.vidDecVideoModeArgs[i].modeParams.videoSystem        =
                                              DEVICE_VIDEO_DECODER_VIDEO_SYSTEM_AUTO_DETECT;
                gHDSDIDVRUsecaseContext.vidDecVideoModeArgs[i].modeParams.videoCropEnable    = FALSE;
                gHDSDIDVRUsecaseContext.vidDecVideoModeArgs[i].modeParams.videoAutoDetectTimeout = -1;
            }
            else
            {
                gHDSDIDVRUsecaseContext.vidDecVideoModeArgs[i].deviceId         = SYSTEM_DEVICE_VID_DEC_SII9135_DRV;
                gHDSDIDVRUsecaseContext.vidDecVideoModeArgs[i].vipInstId        = SYSTEM_CAPTURE_INST_VIP0_PORTA+i;
                gHDSDIDVRUsecaseContext.vidDecVideoModeArgs[i].numChInDevice    = 1;
                gHDSDIDVRUsecaseContext.vidDecVideoModeArgs[i].modeParams.videoIfMode        = DEVICE_CAPT_VIDEO_IF_MODE_16BIT;
                gHDSDIDVRUsecaseContext.vidDecVideoModeArgs[i].modeParams.videoDataFormat    = SYSTEM_DF_YUV422P;
                gHDSDIDVRUsecaseContext.vidDecVideoModeArgs[i].modeParams.standard           = SYSTEM_STD_1080P_60;
                gHDSDIDVRUsecaseContext.vidDecVideoModeArgs[i].modeParams.videoCaptureMode   =
                                        DEVICE_CAPT_VIDEO_CAPTURE_MODE_SINGLE_CH_NON_MUX_DISCRETE_SYNC_HSYNC_VSYNC;
                gHDSDIDVRUsecaseContext.vidDecVideoModeArgs[i].modeParams.videoSystem        =
                                        DEVICE_VIDEO_DECODER_VIDEO_SYSTEM_AUTO_DETECT;
                gHDSDIDVRUsecaseContext.vidDecVideoModeArgs[i].modeParams.videoCropEnable    = FALSE;
                gHDSDIDVRUsecaseContext.vidDecVideoModeArgs[i].modeParams.videoAutoDetectTimeout = -1;
            }
        }
        Vcap_configVideoDecoder(&gHDSDIDVRUsecaseContext.vidDecVideoModeArgs[0],
                                numCaptureDevices);
        Vcap_getVideoSourceStatus(&vidSourceStatus);
        Vcap_setVideoSourceStatus(&vidSourceStatus);
    }
    
    
    static
    Void multich_hdsdidvr_set_dei_prm(DeiLink_CreateParams *deiPrm)
    {
        int deiChIdx;
    
        deiPrm->numBufsPerCh[DEI_LINK_OUT_QUE_VIP_SC] = NUM_BUFS_PER_CH_DEI_VIP_SC_PRIQ;
    
        deiPrm->outScaleFactor[DEI_LINK_OUT_QUE_VIP_SC][0].scaleMode = DEI_SCALE_MODE_RATIO;
        deiPrm->outScaleFactor[DEI_LINK_OUT_QUE_VIP_SC][0].ratio.heightRatio.numerator = 1;
        deiPrm->outScaleFactor[DEI_LINK_OUT_QUE_VIP_SC][0].ratio.heightRatio.denominator = 1;
        deiPrm->outScaleFactor[DEI_LINK_OUT_QUE_VIP_SC][0].ratio.widthRatio.numerator = 1;
        deiPrm->outScaleFactor[DEI_LINK_OUT_QUE_VIP_SC][0].ratio.widthRatio.denominator = 1;
        for (deiChIdx = 1; deiChIdx < DEI_LINK_MAX_CH; deiChIdx++)
        {
            deiPrm->outScaleFactor[DEI_LINK_OUT_QUE_VIP_SC][deiChIdx] =
                deiPrm->outScaleFactor[DEI_LINK_OUT_QUE_VIP_SC][0];
        }
        deiPrm->enableOut[DEI_LINK_OUT_QUE_DEI_SC]                        = FALSE;
        deiPrm->enableOut[DEI_LINK_OUT_QUE_VIP_SC]                        = TRUE;
        deiPrm->enableOut[DEI_LINK_OUT_QUE_VIP_SC_SECONDARY_OUT]          = FALSE;
        deiPrm->enableOut[DEI_LINK_OUT_QUE_DEI_SC_SECONDARY_OUT]          = FALSE;
        deiPrm->enableOut[DEI_LINK_OUT_QUE_DEI_SC_TERTIARY_OUT]           = FALSE;
        deiPrm->tilerEnable[DEI_LINK_OUT_QUE_VIP_SC]          = TILER_ENABLE_ENCODE;
        deiPrm->comprEnable                                   = FALSE;
        deiPrm->setVipScYuv422Format                          = FALSE;
        deiPrm->enableInputFrameRateUpscale                   = FALSE;
    }
    
    static
    Void multich_hdsdidvr_set_enclink_prm(EncLink_CreateParams *encPrm)
    {
        int i;
        EncLink_ChCreateParams *pLinkChPrm;
        EncLink_ChDynamicParams *pLinkDynPrm;
        VENC_CHN_DYNAMIC_PARAM_S *pDynPrm;
        VENC_CHN_PARAMS_S *pChPrm;
    
        encPrm->numBufPerCh[ENC_LINK_PRIMARY_STREAM_POOL_ID] = NUM_BUFS_PER_CH_ENC_PRI;
        /* Primary Stream Params - D1 */
        for (i=0; i < gVencModuleContext.vencConfig.numPrimaryChn; i++)
        {
            pLinkChPrm  = &encPrm->chCreateParams[i];
            pLinkDynPrm = &pLinkChPrm->defaultDynamicParams;
    
            pChPrm      = &gVencModuleContext.vencConfig.encChannelParams[i];
            pDynPrm     = &pChPrm->dynamicParam;
    
            pLinkChPrm->format                  = IVIDEO_H264HP;
            pLinkChPrm->profile                 = gVencModuleContext.vencConfig.h264Profile[i];
            pLinkChPrm->dataLayout              = IVIDEO_FIELD_SEPARATED;
            pLinkChPrm->fieldMergeEncodeEnable  = FALSE;
            pLinkChPrm->enableAnalyticinfo      = pChPrm->enableAnalyticinfo;
            pLinkChPrm->maxBitRate              = pChPrm->maxBitRate;
            pLinkChPrm->encodingPreset          = pChPrm->encodingPreset;
            pLinkChPrm->rateControlPreset       = pChPrm->rcType;
            pLinkChPrm->enableHighSpeed         = FALSE;
            pLinkChPrm->numTemporalLayer        = VENC_TEMPORAL_LAYERS_1;
            pLinkChPrm->enableSVCExtensionFlag  = pChPrm->enableSVCExtensionFlag;
    
            pLinkDynPrm->intraFrameInterval     = pDynPrm->intraFrameInterval;
            pLinkDynPrm->targetBitRate          = pDynPrm->targetBitRate;
            pLinkDynPrm->interFrameInterval     = 1;
            pLinkDynPrm->mvAccuracy             = IVIDENC2_MOTIONVECTOR_QUARTERPEL;
            pLinkDynPrm->inputFrameRate         = pDynPrm->inputFrameRate;
            pLinkDynPrm->rcAlg                  = pDynPrm->rcAlg;
            pLinkDynPrm->qpMin                  = pDynPrm->qpMin;
            pLinkDynPrm->qpMax                  = pDynPrm->qpMax;
            pLinkDynPrm->qpInit                 = pDynPrm->qpInit;
            pLinkDynPrm->vbrDuration            = pDynPrm->vbrDuration;
            pLinkDynPrm->vbrSensitivity         = pDynPrm->vbrSensitivity;
        }
    
    }
    
    
    static
    Void multich_hdsdidvr_set_swms_prm(SwMsLink_CreateParams *swMsPrm,
                                        UInt32 swMsIdx)
    {
        UInt32 devId;
    
        swMsPrm->numSwMsInst = 1;
        swMsPrm->swMsInstId[0] = SYSTEM_SW_MS_SC_INST_SC5;
        swMsPrm->maxInputQueLen            = SYSTEM_SW_MS_DEFAULT_INPUT_QUE_LEN + 6;
        swMsPrm->numOutBuf = NUM_BUFS_PER_CH_SWMS_HD;
        swMsPrm->enableProcessTieWithDisplay = TRUE;
        swMsPrm->enableOuputDup = TRUE;
        swMsPrm->outDataFormat  = SYSTEM_DF_YUV422I_YUYV;
        swMsPrm->maxOutRes  = VSYS_STD_1080P_60;
        if (0 == swMsIdx)
        {
            devId               = VDIS_DEV_HDMI;
        }
        else
        {
            devId               = VDIS_DEV_DVO2;
        }
        swMsPrm->initOutRes = gVdisModuleContext.vdisConfig.deviceParams[VDIS_DEV_HDMI].resolution;
        swMsPrm->numOutBuf  = NUM_BUFS_PER_CH_SWMS_HD;
        swMsPrm->lineSkipMode = FALSE;
        swMsPrm->enableLayoutGridDraw = gVdisModuleContext.vdisConfig.enableLayoutGridDraw;
    }
    
    static
    Void mulich_hdsdidvr_set_avsync_vidque_prm(Avsync_SynchConfigParams *queCfg,
                                                Int chnum,
                                                UInt32 avsStartChNum,
                                                UInt32 avsEndChNum)
    {
        queCfg->chNum = chnum;
        queCfg->audioPresent = FALSE;
        if ((queCfg->chNum >= avsStartChNum)
            &&
            (queCfg->chNum <= avsEndChNum)
            &&
            (gVsysModuleContext.vsysConfig.enableAVsync))
        {
            queCfg->avsyncEnable = FALSE;
        }
        else
        {
            queCfg->avsyncEnable = FALSE;
        }
        queCfg->clkAdjustPolicy.refClkType = AVSYNC_REFCLKADJUST_NONE;
        queCfg->playTimerStartTimeout = 0;
        queCfg->playStartMode = AVSYNC_PLAYBACK_START_MODE_WAITSYNCH;
        queCfg->ptsInitMode   = AVSYNC_PTS_INIT_MODE_APP;
        queCfg->clkAdjustPolicy.clkAdjustLead = AVSYNC_VIDEO_TIMEBASESHIFT_MAX_LEAD_MS;
        queCfg->clkAdjustPolicy.clkAdjustLag = AVSYNC_VIDEO_TIMEBASESHIFT_MAX_LAG_MS;
        queCfg->vidSynchPolicy.playMaxLag    = 200;
    }
    
    static
    Void mulich_hdsdidvr_set_avsync_prm(AvsyncLink_LinkSynchConfigParams *avsyncPrm,
                                         UInt32 swMsIdx,
                                         UInt32 prevLinkID,
                                         UInt32 prevLinkQueId)
    {
        System_LinkInfo                   swmsInLinkInfo;
        Int i;
        Int32 status;
    
        if (0 == swMsIdx)
        {
            Vdis_getAvsyncConfig(VDIS_DEV_HDMI,avsyncPrm);
            avsyncPrm->displayLinkID        = Vdis_getDisplayId(VDIS_DEV_HDMI);
            avsyncPrm->videoSynchLinkID = gVdisModuleContext.swMsId[Vdis_getDisplayContextIndex(VDIS_DEV_HDMI)];
        }
        else
        {
            Vdis_getAvsyncConfig(VDIS_DEV_SD,avsyncPrm);
            avsyncPrm->displayLinkID        = Vdis_getDisplayId(VDIS_DEV_SD);
            avsyncPrm->videoSynchLinkID = gVdisModuleContext.swMsId[Vdis_getDisplayContextIndex(VDIS_DEV_SD)];
        }
        System_linkGetInfo(prevLinkID,&swmsInLinkInfo);
        OSA_assert(swmsInLinkInfo.numQue > prevLinkQueId);
    
        avsyncPrm->numCh            = swmsInLinkInfo.queInfo[prevLinkQueId].numCh;
        avsyncPrm->syncMasterChnum = AVSYNC_INVALID_CHNUM;
        for (i = 0; i < avsyncPrm->numCh;i++)
        {
            mulich_hdsdidvr_set_avsync_vidque_prm(&avsyncPrm->queCfg[i],
                                                   i,
                                                   gVcapModuleContext.vcapConfig.numChn,
                                                   (gVcapModuleContext.vcapConfig.numChn + (gVdecModuleContext.vdecConfig.numChn - 1)));
        }
        if (0 == swMsIdx)
        {
            Vdis_setAvsyncConfig(VDIS_DEV_HDMI,avsyncPrm);
        }
        else
        {
            Vdis_setAvsyncConfig(VDIS_DEV_DVO2,avsyncPrm);
        }
    
        status = Avsync_configSyncConfigInfo(avsyncPrm);
        OSA_assert(status == 0);
    
    }
    
    
    static
    Void multich_hdsdidvr_set_declink_prms(DecLink_CreateParams *decPrm)
    {
        int i;
    
    
        gVdecModuleContext.vdecConfig.numChn = (NUM_SD_DECODE_CHANNELS + NUM_HD_DECODE_CHANNELS);
        for (i=0; i<gVdecModuleContext.vdecConfig.numChn; i++)
        {
            decPrm->chCreateParams[i].format                 = IVIDEO_H264HP;
            decPrm->chCreateParams[i].profile                = IH264VDEC_PROFILE_ANY;
            decPrm->chCreateParams[i].processCallLevel       = VDEC_FRAMELEVELPROCESSCALL;
            if (i < NUM_SD_DECODE_CHANNELS)
            {
                decPrm->chCreateParams[i].targetMaxWidth         = SD_DECODE_CHANNEL_WIDTH;
                decPrm->chCreateParams[i].targetMaxHeight        = SD_DECODE_CHANNEL_HEIGHT;
                decPrm->chCreateParams[i].numBufPerCh            = NUM_BUFS_PER_CH_DEC_SD;
                decPrm->chCreateParams[i].tilerEnable = TILER_ENABLE_DECODE_SD;
            }
            else
            {
                decPrm->chCreateParams[i].targetMaxWidth         = HD_DECODE_CHANNEL_WIDTH;
                decPrm->chCreateParams[i].targetMaxHeight        = HD_DECODE_CHANNEL_HEIGHT;
                decPrm->chCreateParams[i].numBufPerCh            = NUM_BUFS_PER_CH_DEC_HD;
                decPrm->chCreateParams[i].tilerEnable = TILER_ENABLE_DECODE_HD;
            }
            decPrm->chCreateParams[i].defaultDynamicParams.targetFrameRate = gVdecModuleContext.vdecConfig.decChannelParams[i].dynamicParam.frameRate;
            decPrm->chCreateParams[i].defaultDynamicParams.targetBitRate   = gVdecModuleContext.vdecConfig.decChannelParams[i].dynamicParam.targetBitRate;
        }
    }
    
    static
    Void multich_hdsdidvr_set_ipcbitsout_hlos_prms(IpcBitsOutLinkHLOS_CreateParams * ipcBitsOutHostPrm)
    {
        int i;
    
        for (i = 0;
             i < (NUM_SD_DECODE_CHANNELS + NUM_HD_DECODE_CHANNELS);
             i++)
        {
            System_LinkChInfo *pChInfo;
    
            pChInfo = &ipcBitsOutHostPrm->inQueInfo.chInfo[i];
    
            pChInfo->bufType        = 0; // NOT USED
            pChInfo->codingformat   = 0; // NOT USED
            pChInfo->dataFormat     = 0; // NOT USED
            pChInfo->memType        = 0; // NOT USED
            pChInfo->startX         = 0; // NOT USED
            pChInfo->startY         = 0; // NOT USED
            if (i < NUM_SD_DECODE_CHANNELS)
            {
                pChInfo->width          = SD_DECODE_CHANNEL_WIDTH;
                pChInfo->height         = SD_DECODE_CHANNEL_HEIGHT;
            }
            else
            {
                pChInfo->width          = HD_DECODE_CHANNEL_WIDTH;
                pChInfo->height         = HD_DECODE_CHANNEL_HEIGHT;
            }
            pChInfo->pitch[0]       = 0; // NOT USED
            pChInfo->pitch[1]       = 0; // NOT USED
            pChInfo->pitch[2]       = 0; // NOT USED
            pChInfo->scanFormat     = SYSTEM_SF_PROGRESSIVE;
        }
        ipcBitsOutHostPrm->baseCreateParams.noNotifyMode = FALSE;
        ipcBitsOutHostPrm->baseCreateParams.notifyNextLink = TRUE;
        ipcBitsOutHostPrm->baseCreateParams.numOutQue = 1;
        ipcBitsOutHostPrm->numBufPerCh[IPCBITSOUT_LINK_SD_STREAM_POOL_ID] =
            NUM_BUFS_PER_CH_BITSOUT_SD;
        ipcBitsOutHostPrm->numBufPerCh[IPCBITSOUT_LINK_HD_STREAM_POOL_ID] =
            NUM_BUFS_PER_CH_BITSOUT_HD;
        ipcBitsOutHostPrm->inQueInfo.numCh =
            (NUM_SD_DECODE_CHANNELS + NUM_HD_DECODE_CHANNELS);
    }
    
    static
    Void multich_hdsdidvr_set_display_prms(DisplayLink_CreateParams *displayPrm,
                                            UInt32 maxOutRes)
    {
        displayPrm->displayRes = maxOutRes;
    }
    
    static
    Void multich_hdsdidvr_set_link_ids()
    {
        int    i;
    
        gVcapModuleContext.captureId    = SYSTEM_LINK_ID_CAPTURE;
    
        gVcapModuleContext.deiId[0]     = SYSTEM_LINK_ID_DEI_HQ_0;
        for (i = 0; i < NUM_MERGE_LINK;i++)
        {
            gHDSDIDVRUsecaseContext.mergeId[i] = SYSTEM_VPSS_LINK_ID_MERGE_0 + i;
        }
        for (i = 0; i < NUM_DUP_LINK;i++)
        {
            gHDSDIDVRUsecaseContext.dupId[i] = SYSTEM_VPSS_LINK_ID_DUP_0 + i;
        }
    
        gVencModuleContext.encId        = SYSTEM_LINK_ID_VENC_0;
        gVdecModuleContext.decId        = SYSTEM_LINK_ID_VDEC_0;
    
        gVdisModuleContext.swMsId[Vdis_getDisplayContextIndex(VDIS_DEV_HDMI)]      = SYSTEM_LINK_ID_SW_MS_MULTI_INST_0;
        gVdisModuleContext.swMsId[Vdis_getDisplayContextIndex(VDIS_DEV_DVO2)]      = SYSTEM_LINK_ID_SW_MS_MULTI_INST_1;
    
        gVdisModuleContext.displayId[Vdis_getDisplayContextIndex(VDIS_DEV_HDMI)] = SYSTEM_LINK_ID_DISPLAY_0; /* ON CHIP HDMI */
        gVdisModuleContext.displayId[Vdis_getDisplayContextIndex(VDIS_DEV_DVO2)] = SYSTEM_LINK_ID_DISPLAY_1; /* SD HDMI */
    
        gHDSDIDVRUsecaseContext.ipcOutVpssId = SYSTEM_VPSS_LINK_ID_IPC_OUT_M3_0;
        gHDSDIDVRUsecaseContext.ipcInVideoId = SYSTEM_VIDEO_LINK_ID_IPC_IN_M3_0;
        gHDSDIDVRUsecaseContext.ipcOutVideoId= SYSTEM_VIDEO_LINK_ID_IPC_OUT_M3_0;
        gHDSDIDVRUsecaseContext.ipcInVpssId  = SYSTEM_VPSS_LINK_ID_IPC_IN_M3_0;
    
        gVencModuleContext.ipcBitsOutRTOSId  = SYSTEM_VIDEO_LINK_ID_IPC_BITS_OUT_0;
        gVencModuleContext.ipcBitsInHLOSId   = SYSTEM_HOST_LINK_ID_IPC_BITS_IN_0;
        gVdecModuleContext.ipcBitsOutHLOSId  = SYSTEM_HOST_LINK_ID_IPC_BITS_OUT_0;
        gVdecModuleContext.ipcBitsInRTOSId  = SYSTEM_VIDEO_LINK_ID_IPC_BITS_IN_0;
        gVdisModuleContext.setMosaicFxn     = MultiCh_hdsdiDVRSetMosaicParams;
    }
    
    static
    Void multich_hdsdidvr_reset_link_ids()
    {
        int    i;
    
        gVcapModuleContext.captureId    = SYSTEM_LINK_ID_INVALID;
    
        gVcapModuleContext.deiId[0]     = SYSTEM_LINK_ID_INVALID;
        for (i = 0; i < NUM_MERGE_LINK;i++)
        {
            gHDSDIDVRUsecaseContext.mergeId[i] = SYSTEM_LINK_ID_INVALID;
        }
        for (i = 0; i < NUM_DUP_LINK;i++)
        {
            gHDSDIDVRUsecaseContext.dupId[i] = SYSTEM_LINK_ID_INVALID;
        }
    
        gVencModuleContext.encId        = SYSTEM_LINK_ID_INVALID;
        gVdecModuleContext.decId        = SYSTEM_LINK_ID_INVALID;
    
        gVdisModuleContext.swMsId[Vdis_getDisplayContextIndex(VDIS_DEV_HDMI)]      = SYSTEM_LINK_ID_INVALID;
        gVdisModuleContext.swMsId[Vdis_getDisplayContextIndex(VDIS_DEV_DVO2)]      = SYSTEM_LINK_ID_INVALID;
    
        gVdisModuleContext.displayId[Vdis_getDisplayContextIndex(VDIS_DEV_HDMI)] = SYSTEM_LINK_ID_INVALID; /* ON CHIP HDMI */
        gVdisModuleContext.displayId[Vdis_getDisplayContextIndex(VDIS_DEV_DVO2)] = SYSTEM_LINK_ID_INVALID; /* SD HDMI */
    
        gHDSDIDVRUsecaseContext.ipcOutVpssId = SYSTEM_LINK_ID_INVALID;
        gHDSDIDVRUsecaseContext.ipcInVideoId = SYSTEM_LINK_ID_INVALID;
        gHDSDIDVRUsecaseContext.ipcOutVideoId= SYSTEM_LINK_ID_INVALID;
        gHDSDIDVRUsecaseContext.ipcInVpssId  = SYSTEM_LINK_ID_INVALID;
    
        gVencModuleContext.ipcBitsOutRTOSId  = SYSTEM_LINK_ID_INVALID;
        gVencModuleContext.ipcBitsInHLOSId   = SYSTEM_LINK_ID_INVALID;
        gVdecModuleContext.ipcBitsOutHLOSId  = SYSTEM_LINK_ID_INVALID;
        gVdecModuleContext.ipcBitsInRTOSId  = SYSTEM_LINK_ID_INVALID;
        gVdisModuleContext.setMosaicFxn     = NULL;
    }
    
    static
    Void multich_hdsdidvr_set_capture_fps(UInt32 *captureFps)
    {
        Bool isPal = Vcap_isPalMode();
    
        if (isPal)
        {
            *captureFps = 50;
        }
        else
        {
            *captureFps = 60;
        }
    }
    
    
    static
    Void multich_hdsdidvr_set_links_framerate()
    {
        Int32 status;
        DeiLink_ChFpsParams params;
        UInt32 chId;
        Bool isPAL = Vcap_isPalMode();
        Bool fieldRateUpscale = FALSE;
    
        for (chId = 0; chId < gVcapModuleContext.vcapConfig.numChn;chId++)
        {
            /* Capture -> Dei */
            params.chId = chId;
    
            /* Stream 0 -VIP_SC_OUT_PRIMARY is inputfps/2 */
            params.streamId = DEI_LINK_OUT_QUE_VIP_SC;
            if (isPAL && fieldRateUpscale)
            {
                /* Input is 30 even for PAL because we do field repeat at DEI input */
                params.inputFrameRate  = 30;
            }
            else
            {
                params.inputFrameRate  = MULTICH_HDSDIDVR_GET_CAPTURE_FRAMES_PER_SEC();
            }
    
            params.outputFrameRate = MULTICH_HDSDIDVR_GET_CAPTURE_FRAMES_PER_SEC();
            status = System_linkControl(gVcapModuleContext.deiId[0], DEI_LINK_CMD_SET_FRAME_RATE,
                                        &params, sizeof(params), TRUE);
        }
    }
    
    static
    Void multich_hdsdidvr_connect_links()
    {
         multich_hdsdidvr_configure_extvideodecoder_prm();
          /**Capture Link**/
         multich_hdsdidvr_set_capture_prm(&gHDSDIDVRUsecaseContext.capturePrm);
         /* Capture ---Q0---> Dei */
         gHDSDIDVRUsecaseContext.capturePrm.outQueParams[0].nextLink   = gVcapModuleContext.deiId[0];
         gHDSDIDVRUsecaseContext.deiPrm[0].inQueParams.prevLinkId      = gVcapModuleContext.captureId;
         gHDSDIDVRUsecaseContext.deiPrm[0].inQueParams.prevLinkQueId   = 0;
         /* Capture ---Q1---> Merge */
         gHDSDIDVRUsecaseContext.capturePrm.outQueParams[1].nextLink   = gHDSDIDVRUsecaseContext.mergeId[PRE_ENCODE_MERGE_LINK_IDX];
         gHDSDIDVRUsecaseContext.mergePrm[PRE_ENCODE_MERGE_LINK_IDX].numInQue                      = PRE_ENCODE_MERGE_LINK_NUM_INQUE;
         gHDSDIDVRUsecaseContext.mergePrm[PRE_ENCODE_MERGE_LINK_IDX].inQueParams[PRE_ENCODE_MERGE_LINK_HDCAPTURE_QIDX].prevLinkId      = gVcapModuleContext.captureId;
         gHDSDIDVRUsecaseContext.mergePrm[PRE_ENCODE_MERGE_LINK_IDX].inQueParams[PRE_ENCODE_MERGE_LINK_HDCAPTURE_QIDX].prevLinkQueId   = 1;
         MULTICH_HDSDIDVR_CREATE_LINK(gVcapModuleContext.captureId,&gHDSDIDVRUsecaseContext.capturePrm,sizeof(gHDSDIDVRUsecaseContext.capturePrm));
         /**After Capture is created set capture fps */
         multich_hdsdidvr_set_capture_fps(&gHDSDIDVRUsecaseContext.captureFps);
    
         /**Dei0 Link**/
         multich_hdsdidvr_set_dei_prm(&gHDSDIDVRUsecaseContext.deiPrm[0]);
         /* DEI(0) ---DEI_VIP_SC_D1_MERGE_LINK_IDX--- mergeId[PRE_ENCODE_MERGE_LINK_IDX] */
         gHDSDIDVRUsecaseContext.deiPrm[0].outQueParams[DEI_LINK_OUT_QUE_VIP_SC].nextLink  =  gHDSDIDVRUsecaseContext.mergeId[PRE_ENCODE_MERGE_LINK_IDX];
         gHDSDIDVRUsecaseContext.mergePrm[PRE_ENCODE_MERGE_LINK_IDX].numInQue                      = PRE_ENCODE_MERGE_LINK_NUM_INQUE;
         gHDSDIDVRUsecaseContext.mergePrm[PRE_ENCODE_MERGE_LINK_IDX].inQueParams[PRE_ENCODE_MERGE_LINK_DEI0_D1_QIDX].prevLinkId     = gVcapModuleContext.deiId[0];
         gHDSDIDVRUsecaseContext.mergePrm[PRE_ENCODE_MERGE_LINK_IDX].inQueParams[PRE_ENCODE_MERGE_LINK_DEI0_D1_QIDX].prevLinkQueId  = 0;
         MULTICH_HDSDIDVR_CREATE_LINK(gVcapModuleContext.deiId[0],&gHDSDIDVRUsecaseContext.deiPrm[0],sizeof(gHDSDIDVRUsecaseContext.deiPrm[0]));
    
        /** mergeId[PRE_ENCODE_MERGE_LINK_IDX] **/
        gHDSDIDVRUsecaseContext.mergePrm[PRE_ENCODE_MERGE_LINK_IDX].numInQue   = PRE_ENCODE_MERGE_LINK_NUM_INQUE;
        /* mergeId[PRE_ENCODE_MERGE_LINK_IDX] ---Q0---> ipcOutVpssM3 */
        gHDSDIDVRUsecaseContext.mergePrm[PRE_ENCODE_MERGE_LINK_IDX].outQueParams.nextLink    = gHDSDIDVRUsecaseContext.ipcOutVpssId;
        gHDSDIDVRUsecaseContext.mergePrm[PRE_ENCODE_MERGE_LINK_IDX].notifyNextLink           = TRUE;
        gHDSDIDVRUsecaseContext.ipcOutVpssPrm.inQueParams.prevLinkId         = gHDSDIDVRUsecaseContext.mergeId[PRE_ENCODE_MERGE_LINK_IDX];
        gHDSDIDVRUsecaseContext.ipcOutVpssPrm.inQueParams.prevLinkQueId      = 0;
        MULTICH_HDSDIDVR_CREATE_LINK(gHDSDIDVRUsecaseContext.mergeId[PRE_ENCODE_MERGE_LINK_IDX],
                                      &gHDSDIDVRUsecaseContext.mergePrm[PRE_ENCODE_MERGE_LINK_IDX],
                                      sizeof(gHDSDIDVRUsecaseContext.mergePrm[PRE_ENCODE_MERGE_LINK_IDX]));
    
        /* ipcOutVpssIdisOutVpssId ---Q0---> ipcInVideoId */
        gHDSDIDVRUsecaseContext.ipcOutVpssPrm.outQueParams[0].nextLink  = gHDSDIDVRUsecaseContext.ipcInVideoId;
        gHDSDIDVRUsecaseContext.ipcOutVpssPrm.notifyNextLink            = FALSE;
        gHDSDIDVRUsecaseContext.ipcOutVpssPrm.notifyPrevLink            = TRUE;
        gHDSDIDVRUsecaseContext.ipcOutVpssPrm.noNotifyMode              = TRUE;
        gHDSDIDVRUsecaseContext.ipcInVideoPrm.inQueParams.prevLinkId    = gHDSDIDVRUsecaseContext.ipcOutVpssId;
        gHDSDIDVRUsecaseContext.ipcInVideoPrm.inQueParams.prevLinkQueId = 0;
        MULTICH_HDSDIDVR_CREATE_LINK(gHDSDIDVRUsecaseContext.ipcOutVpssId,
                                      &gHDSDIDVRUsecaseContext.ipcOutVpssPrm,
                                      sizeof(gHDSDIDVRUsecaseContext.ipcOutVpssPrm));
    
    
        /* ipcInVideoId ---Q0---> encId */
        gHDSDIDVRUsecaseContext.ipcInVideoPrm.numOutQue                 = 1;
        gHDSDIDVRUsecaseContext.ipcInVideoPrm.outQueParams[0].nextLink  = gVencModuleContext.encId;
        gHDSDIDVRUsecaseContext.ipcInVideoPrm.notifyNextLink            = TRUE;
        gHDSDIDVRUsecaseContext.ipcInVideoPrm.notifyPrevLink            = FALSE;
        gHDSDIDVRUsecaseContext.ipcInVideoPrm.noNotifyMode              = TRUE;
        gHDSDIDVRUsecaseContext.encPrm.inQueParams.prevLinkId    = gHDSDIDVRUsecaseContext.ipcInVideoId;
        gHDSDIDVRUsecaseContext.encPrm.inQueParams.prevLinkQueId = 0;
        MULTICH_HDSDIDVR_CREATE_LINK(gHDSDIDVRUsecaseContext.ipcInVideoId,
                                      &gHDSDIDVRUsecaseContext.ipcInVideoPrm,
                                      sizeof(gHDSDIDVRUsecaseContext.ipcInVideoPrm));
    
    
        /* encId ---Q0---> ipcBitsOutRTOSId */
        multich_hdsdidvr_set_enclink_prm(&gHDSDIDVRUsecaseContext.encPrm);
        gHDSDIDVRUsecaseContext.encPrm.outQueParams.nextLink     = gVencModuleContext.ipcBitsOutRTOSId;
        gHDSDIDVRUsecaseContext.ipcBitsOutVideoPrm.baseCreateParams.inQueParams.prevLinkId = gVencModuleContext.encId;
        gHDSDIDVRUsecaseContext.ipcBitsOutVideoPrm.baseCreateParams.inQueParams.prevLinkQueId = 0;
        MULTICH_HDSDIDVR_CREATE_LINK(gVencModuleContext.encId,
                                      &gHDSDIDVRUsecaseContext.encPrm,
                                      sizeof(gHDSDIDVRUsecaseContext.encPrm));
    
        /* ipcBitsOutVideoId ---Q0---> ipcBitsInHostId */
        gHDSDIDVRUsecaseContext.ipcBitsOutVideoPrm.baseCreateParams.numOutQue                 = 1;
        gHDSDIDVRUsecaseContext.ipcBitsOutVideoPrm.baseCreateParams.outQueParams[0].nextLink = gVencModuleContext.ipcBitsInHLOSId;
        MultiCh_ipcBitsInitCreateParams_BitsOutRTOS(&gHDSDIDVRUsecaseContext.ipcBitsOutVideoPrm,
                                                   TRUE);
        gHDSDIDVRUsecaseContext.ipcBitsInHostPrm[0].baseCreateParams.inQueParams.prevLinkId = gVencModuleContext.ipcBitsOutRTOSId;
        gHDSDIDVRUsecaseContext.ipcBitsInHostPrm[0].baseCreateParams.inQueParams.prevLinkQueId = 0;
        MULTICH_HDSDIDVR_CREATE_LINK(gVencModuleContext.ipcBitsOutRTOSId,
                                      &gHDSDIDVRUsecaseContext.ipcBitsOutVideoPrm,
                                      sizeof(gHDSDIDVRUsecaseContext.ipcBitsOutVideoPrm));
        MultiCh_ipcBitsInitCreateParams_BitsInHLOS(&gHDSDIDVRUsecaseContext.ipcBitsInHostPrm[0]);
        MULTICH_HDSDIDVR_CREATE_LINK(gVencModuleContext.ipcBitsInHLOSId,
                                      &gHDSDIDVRUsecaseContext.ipcBitsInHostPrm[0],
                                      sizeof(gHDSDIDVRUsecaseContext.ipcBitsInHostPrm[0]));
    
        /* ipcBitsOutHostId ---Q0---> ipcBitsInRtosId */
        multich_hdsdidvr_set_ipcbitsout_hlos_prms(&gHDSDIDVRUsecaseContext.ipcBitsOutHostPrm);
        gHDSDIDVRUsecaseContext.ipcBitsOutHostPrm.baseCreateParams.outQueParams[0].nextLink = gVdecModuleContext.ipcBitsInRTOSId;
        gHDSDIDVRUsecaseContext.ipcBitsInVideoPrm.baseCreateParams.inQueParams.prevLinkId       = gVdecModuleContext.ipcBitsOutHLOSId;
        gHDSDIDVRUsecaseContext.ipcBitsInVideoPrm.baseCreateParams.inQueParams.prevLinkQueId    = 0;
        MULTICH_HDSDIDVR_CREATE_LINK(gVdecModuleContext.ipcBitsOutHLOSId,
                                      &gHDSDIDVRUsecaseContext.ipcBitsOutHostPrm,
                                      sizeof(gHDSDIDVRUsecaseContext.ipcBitsOutHostPrm));
    
        /* ipcBitsInRtosId ---Q0---> decId */
        gHDSDIDVRUsecaseContext.ipcBitsInVideoPrm.baseCreateParams.numOutQue                    = 1;
        gHDSDIDVRUsecaseContext.ipcBitsInVideoPrm.baseCreateParams.outQueParams[0].nextLink     = gVdecModuleContext.decId;
        MultiCh_ipcBitsInitCreateParams_BitsInRTOS(&gHDSDIDVRUsecaseContext.ipcBitsInVideoPrm, TRUE);
        gHDSDIDVRUsecaseContext.decPrm.inQueParams.prevLinkId    = gVdecModuleContext.ipcBitsInRTOSId;
        gHDSDIDVRUsecaseContext.decPrm.inQueParams.prevLinkQueId = 0;
        MULTICH_HDSDIDVR_CREATE_LINK(gVdecModuleContext.ipcBitsInRTOSId,
                                      &gHDSDIDVRUsecaseContext.ipcBitsInVideoPrm,
                                      sizeof(gHDSDIDVRUsecaseContext.ipcBitsInVideoPrm));
    
        /* decId---Q0--->ipcOutVideoId*/
        multich_hdsdidvr_set_declink_prms(&gHDSDIDVRUsecaseContext.decPrm);
        gHDSDIDVRUsecaseContext.decPrm.outQueParams.nextLink  = gHDSDIDVRUsecaseContext.ipcOutVideoId;
        gHDSDIDVRUsecaseContext.ipcOutVideoPrm.inQueParams.prevLinkId    = gVdecModuleContext.decId;
        gHDSDIDVRUsecaseContext.ipcOutVideoPrm.inQueParams.prevLinkQueId = 0;
        MULTICH_HDSDIDVR_CREATE_LINK(gVdecModuleContext.decId,
                                      &gHDSDIDVRUsecaseContext.decPrm,
                                      sizeof(gHDSDIDVRUsecaseContext.decPrm));
    
        /*ipcOutVideoId---Q0-->ipcInVpssId*/
        gHDSDIDVRUsecaseContext.ipcOutVideoPrm.numOutQue                 = 1;
        gHDSDIDVRUsecaseContext.ipcOutVideoPrm.outQueParams[0].nextLink  = gHDSDIDVRUsecaseContext.ipcInVpssId;
        gHDSDIDVRUsecaseContext.ipcOutVideoPrm.notifyNextLink            = FALSE;
        gHDSDIDVRUsecaseContext.ipcOutVideoPrm.notifyPrevLink            = TRUE;
        gHDSDIDVRUsecaseContext.ipcOutVideoPrm.noNotifyMode              = TRUE;
        gHDSDIDVRUsecaseContext.ipcInVpssPrm.inQueParams.prevLinkId    = gHDSDIDVRUsecaseContext.ipcOutVideoId;
        gHDSDIDVRUsecaseContext.ipcInVpssPrm.inQueParams.prevLinkQueId = 0;
        MULTICH_HDSDIDVR_CREATE_LINK(gHDSDIDVRUsecaseContext.ipcOutVideoId,
                                      &gHDSDIDVRUsecaseContext.ipcOutVideoPrm,
                                      sizeof(gHDSDIDVRUsecaseContext.ipcOutVideoPrm));
    
        /*ipcInVpssId---Q0--> mergeId[LIVE_DECODE_MERGE_LINK_IDX] */
        gHDSDIDVRUsecaseContext.ipcInVpssPrm.numOutQue                 = 1;
        gHDSDIDVRUsecaseContext.ipcInVpssPrm.outQueParams[0].nextLink  = gHDSDIDVRUsecaseContext.dupId[DECODE_DUP_LINK_IDX];
        gHDSDIDVRUsecaseContext.ipcInVpssPrm.notifyNextLink            = TRUE;
        gHDSDIDVRUsecaseContext.ipcInVpssPrm.notifyPrevLink            = FALSE;
        gHDSDIDVRUsecaseContext.ipcInVpssPrm.noNotifyMode              = TRUE;
        gHDSDIDVRUsecaseContext.dupPrm[DECODE_DUP_LINK_IDX].inQueParams.prevLinkId = gHDSDIDVRUsecaseContext.ipcInVpssId;
        gHDSDIDVRUsecaseContext.dupPrm[DECODE_DUP_LINK_IDX].inQueParams.prevLinkQueId = 0;
        MULTICH_HDSDIDVR_CREATE_LINK(gHDSDIDVRUsecaseContext.ipcInVpssId,
                                      &gHDSDIDVRUsecaseContext.ipcInVpssPrm,
                                      sizeof(gHDSDIDVRUsecaseContext.ipcInVpssPrm));
    
        /*dupId[DECODE_DUP_LINK_IDX]---Q0--> swMsId[0] */
        gHDSDIDVRUsecaseContext.dupPrm[DECODE_DUP_LINK_IDX].numOutQue                      = 2;
        gHDSDIDVRUsecaseContext.dupPrm[DECODE_DUP_LINK_IDX].outQueParams[0].nextLink       = gVdisModuleContext.swMsId[Vdis_getDisplayContextIndex(VDIS_DEV_HDMI)];
        gHDSDIDVRUsecaseContext.swMsPrm[0].inQueParams.prevLinkId    = gHDSDIDVRUsecaseContext.dupId[DECODE_DUP_LINK_IDX];
        gHDSDIDVRUsecaseContext.swMsPrm[0].inQueParams.prevLinkQueId = 0;
    
        /*dupId[LIVE_DECODE_DUP_LINK_IDX]---Q1--> swMsId[1] */
        gHDSDIDVRUsecaseContext.dupPrm[DECODE_DUP_LINK_IDX].numOutQue                      = 2;
        gHDSDIDVRUsecaseContext.dupPrm[DECODE_DUP_LINK_IDX].outQueParams[1].nextLink       = gVdisModuleContext.swMsId[Vdis_getDisplayContextIndex(VDIS_DEV_DVO2)];
        gHDSDIDVRUsecaseContext.dupPrm[DECODE_DUP_LINK_IDX].notifyNextLink                 = TRUE;
        gHDSDIDVRUsecaseContext.swMsPrm[1].inQueParams.prevLinkId    = gHDSDIDVRUsecaseContext.dupId[DECODE_DUP_LINK_IDX];
        gHDSDIDVRUsecaseContext.swMsPrm[1].inQueParams.prevLinkQueId = 1;
        MULTICH_HDSDIDVR_CREATE_LINK(gHDSDIDVRUsecaseContext.dupId[DECODE_DUP_LINK_IDX],
                                      &gHDSDIDVRUsecaseContext.dupPrm[DECODE_DUP_LINK_IDX],
                                      sizeof(gHDSDIDVRUsecaseContext.dupPrm[DECODE_DUP_LINK_IDX]));
    
        /* Avsync configuration for SwMs[0] */
        mulich_hdsdidvr_set_avsync_prm(&gHDSDIDVRUsecaseContext.avsyncCfg[0],
                                        0,
                                        gHDSDIDVRUsecaseContext.dupId[DECODE_DUP_LINK_IDX],
                                        0);
        /*swMsId[0]---Q0--> displayId[VDIS_DEV_HDMI] */
        gHDSDIDVRUsecaseContext.swMsPrm[0].outQueParams.nextLink     = Vdis_getDisplayId(VDIS_DEV_HDMI);
        gHDSDIDVRUsecaseContext.displayPrm[Vdis_getDisplayContextIndex(VDIS_DEV_HDMI)].numInputQueues = 1;
        gHDSDIDVRUsecaseContext.displayPrm[Vdis_getDisplayContextIndex(VDIS_DEV_HDMI)].inQueParams[0].prevLinkId    = gVdisModuleContext.swMsId[Vdis_getDisplayContextIndex(VDIS_DEV_HDMI)];
        gHDSDIDVRUsecaseContext.displayPrm[Vdis_getDisplayContextIndex(VDIS_DEV_HDMI)].inQueParams[0].prevLinkQueId = 0;
        multich_hdsdidvr_set_swms_prm(&gHDSDIDVRUsecaseContext.swMsPrm[0],
                                        0);
        gHDSDIDVRUsecaseContext.swmsLayoutPrm[Vdis_getDisplayContextIndex(VDIS_DEV_HDMI)] = gHDSDIDVRUsecaseContext.swMsPrm[0].layoutPrm;
        MULTICH_HDSDIDVR_CREATE_LINK(gVdisModuleContext.swMsId[Vdis_getDisplayContextIndex(VDIS_DEV_HDMI)],
                                     &gHDSDIDVRUsecaseContext.swMsPrm[0],
                                     sizeof(gHDSDIDVRUsecaseContext.swMsPrm[0]));
    
        /* Avsync configuration for SwMs[1] */
        mulich_hdsdidvr_set_avsync_prm(&gHDSDIDVRUsecaseContext.avsyncCfg[1],
                                        1,
                                        gHDSDIDVRUsecaseContext.dupId[DECODE_DUP_LINK_IDX],
                                        1);
        /*swMsId[1]---Q1--> displayId[VDIS_DEV_SD] */
        gHDSDIDVRUsecaseContext.swMsPrm[1].outQueParams.nextLink     = Vdis_getDisplayId(VDIS_DEV_DVO2);
        gHDSDIDVRUsecaseContext.displayPrm[Vdis_getDisplayContextIndex(VDIS_DEV_DVO2)].numInputQueues = 1;
        gHDSDIDVRUsecaseContext.displayPrm[Vdis_getDisplayContextIndex(VDIS_DEV_DVO2)].inQueParams[0].prevLinkId    = gVdisModuleContext.swMsId[Vdis_getDisplayContextIndex(VDIS_DEV_DVO2)];
        gHDSDIDVRUsecaseContext.displayPrm[Vdis_getDisplayContextIndex(VDIS_DEV_DVO2)].inQueParams[0].prevLinkQueId = 0;
        multich_hdsdidvr_set_swms_prm(&gHDSDIDVRUsecaseContext.swMsPrm[1],
                                        1);
        gHDSDIDVRUsecaseContext.swmsLayoutPrm[Vdis_getDisplayContextIndex(VDIS_DEV_DVO2)] = gHDSDIDVRUsecaseContext.swMsPrm[1].layoutPrm;
        MULTICH_HDSDIDVR_CREATE_LINK(gVdisModuleContext.swMsId[Vdis_getDisplayContextIndex(VDIS_DEV_DVO2)],
                                      &gHDSDIDVRUsecaseContext.swMsPrm[1],
                                      sizeof(gHDSDIDVRUsecaseContext.swMsPrm[1]));
    
        multich_hdsdidvr_set_display_prms(&gHDSDIDVRUsecaseContext.displayPrm[Vdis_getDisplayContextIndex(VDIS_DEV_HDMI)],
                                            gHDSDIDVRUsecaseContext.swMsPrm[0].initOutRes);
        MULTICH_HDSDIDVR_CREATE_LINK(Vdis_getDisplayId(VDIS_DEV_HDMI),
                                      &gHDSDIDVRUsecaseContext.displayPrm[Vdis_getDisplayContextIndex(VDIS_DEV_HDMI)],
                                      sizeof(gHDSDIDVRUsecaseContext.displayPrm[Vdis_getDisplayContextIndex(VDIS_DEV_HDMI)]));
        multich_hdsdidvr_set_display_prms(&gHDSDIDVRUsecaseContext.displayPrm[Vdis_getDisplayContextIndex(VDIS_DEV_DVO2)],
                                            gHDSDIDVRUsecaseContext.swMsPrm[1].initOutRes);
        MULTICH_HDSDIDVR_CREATE_LINK(Vdis_getDisplayId(VDIS_DEV_DVO2),
                                      &gHDSDIDVRUsecaseContext.displayPrm[Vdis_getDisplayContextIndex(VDIS_DEV_DVO2)],
                                      sizeof(gHDSDIDVRUsecaseContext.displayPrm[Vdis_getDisplayContextIndex(VDIS_DEV_DVO2)]));
    }
    
    static
    void multich_hdsdidvr_set_dec2disp_chmap()
    {
    
        MultiCh_setDec2DispMap(VDIS_DEV_HDMI,gVdecModuleContext.vdecConfig.numChn,0,0);
        MultiCh_setDec2DispMap(VDIS_DEV_DVO2,gVdecModuleContext.vdecConfig.numChn,0,0);
    }
    
    
    Void MultiCh_createHDSDIDVR()
    {
    
        multich_hdsdidvr_reset_link_prms();
        multich_hdsdidvr_set_link_ids();
        printf("\n********* Entered usecase HDSDIDVR <816x> Cap/Enc/Dec/Dis \n\n");
    
        MultiCh_detectBoard();
    
        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
        );
    
        if ((FALSE == TILER_ENABLE_ENCODE) && (FALSE == TILER_ENABLE_DECODE_SD) && (FALSE == TILER_ENABLE_DECODE_HD))
        {
            SystemTiler_disableAllocator();
        }
        multich_hdsdidvr_connect_links();
        multich_hdsdidvr_set_links_framerate();
        multich_hdsdidvr_set_dec2disp_chmap();
        Vdis_getMosaicParams(VDIS_DEV_HDMI,&gHDSDIDVRUsecaseContext.vdisMosaicPrms[VDIS_DEV_HDMI]);
        Vdis_getMosaicParams(VDIS_DEV_DVO2,&gHDSDIDVRUsecaseContext.vdisMosaicPrms[VDIS_DEV_DVO2]);
        Vdis_setMosaicParams(VDIS_DEV_HDMI,&gHDSDIDVRUsecaseContext.vdisMosaicPrms[VDIS_DEV_HDMI]);
        Vdis_setMosaicParams(VDIS_DEV_DVO2,&gHDSDIDVRUsecaseContext.vdisMosaicPrms[VDIS_DEV_DVO2]);
    
    }
    
    Void MultiCh_deleteHDSDIDVR()
    {
        UInt32 i;
    
        for (i = 0; i < gHDSDIDVRUsecaseContext.createdLinkCount; i++)
        {
            System_linkDelete (gHDSDIDVRUsecaseContext.createdLinks[i]);
        }
        gHDSDIDVRUsecaseContext.createdLinkCount = 0;
        multich_hdsdidvr_reset_link_ids();
    
        Vcap_deleteVideoDecoder();
        /* Print the HWI, SWI and all tasks load */
        /* Reset the accumulated timer ticks */
        MultiCh_prfLoadCalcEnable(FALSE, TRUE, FALSE);
    
        if ((FALSE == TILER_ENABLE_ENCODE) && (FALSE == TILER_ENABLE_DECODE_SD) && (FALSE == TILER_ENABLE_DECODE_HD))
        {
            SystemTiler_enableAllocator();
        }
    }
    
    static
    UInt32 multich_hdsdidvr_map_swms_channel2win(VDIS_DEV devId,UInt32 swMsChNum)
    {
        UInt32 winNum = SYSTEM_SW_MS_INVALID_ID;
        Int i;
    
        for (i = 0; i < gHDSDIDVRUsecaseContext.swmsLayoutPrm[Vdis_getDisplayContextIndex(devId)].numWin;i++)
        {
            if (swMsChNum == gHDSDIDVRUsecaseContext.swmsLayoutPrm[Vdis_getDisplayContextIndex(devId)].winInfo[i].channelNum)
            {
                winNum = i;
                break;
            }
        }
        return winNum;
    }
    
    static
    Bool  multich_hdsdidvr_is_invisible_channel(VDIS_DEV devId,UInt32 swMsChNum)
    {
        if (multich_hdsdidvr_map_swms_channel2win(devId, swMsChNum) == SYSTEM_SW_MS_INVALID_ID)
        {
            return TRUE;
        }
        else
        {
            return FALSE;
        }
    }
    
    
    
    static
    Void  multich_hdsdidvr_get_decode_visibility_channels_list(UInt32 *invisbleChannelList,
                                                               UInt32 *numInvisibleCh,UInt32 maxInvisibleCh,
                                                               UInt32 *visbleChannelList,
                                                               UInt32 *numVisibleCh,UInt32 maxVisibleCh)
    {
        Int i;
        UInt32 swmsChNum;
        UInt32 swmsChNumSD;
    
        *numInvisibleCh = 0;
    
        for (i = 0; i < gVdecModuleContext.vdecConfig.numChn ;i++)
        {
            Vdec_mapDec2DisplayChId(VDIS_DEV_HDMI,i,&swmsChNum);
            Vdec_mapDec2DisplayChId(VDIS_DEV_SD,i,&swmsChNumSD);
            OSA_assert(swmsChNum == swmsChNumSD);
            if (multich_hdsdidvr_is_invisible_channel(VDIS_DEV_HDMI,swmsChNum)
                &&
                multich_hdsdidvr_is_invisible_channel(VDIS_DEV_SD,swmsChNum))
            {
                OSA_assert(*numInvisibleCh < maxInvisibleCh);
                invisbleChannelList[*numInvisibleCh] = i;
                *numInvisibleCh += 1;
            }
            else
            {
                OSA_assert(*numVisibleCh < maxVisibleCh);
                visbleChannelList[*numVisibleCh] = i;
                *numVisibleCh += 1;
            }
        }
    }
    
    static
    Void  multich_hdsdidvr_enable_visible_decode_channels()
    {
        Int i;
        UInt32 numInvisibleCh = 0;
        UInt32 numVisibleCh = 0;
        DecLink_ChannelInfo decChInfo;
        Int32 status;
    
        multich_hdsdidvr_get_decode_visibility_channels_list(gHDSDIDVRUsecaseContext.invisbleDecChannelList,
                                                              &numInvisibleCh,
                                                              OSA_ARRAYSIZE(gHDSDIDVRUsecaseContext.invisbleDecChannelList),
                                                              gHDSDIDVRUsecaseContext.visbleDecChannelList,
                                                              &numVisibleCh,
                                                              OSA_ARRAYSIZE(gHDSDIDVRUsecaseContext.visbleDecChannelList));
        for (i =0; i < numVisibleCh;i++)
        {
            decChInfo.chId     = gHDSDIDVRUsecaseContext.visbleDecChannelList[i];
            printf("MULTICH_HDSDI_DVR:Decode enable visible channel.DEC_LINKID[0x%X],CHNUM[%d]\n",
                    gVdecModuleContext.decId,decChInfo.chId);
            status =
            System_linkControl(gVdecModuleContext.decId,DEC_LINK_CMD_ENABLE_CHANNEL,
                                &decChInfo,sizeof(decChInfo),TRUE);
            OSA_assert(status == 0);
        }
    
        for (i =0; i < numInvisibleCh;i++)
        {
            decChInfo.chId     = gHDSDIDVRUsecaseContext.invisbleDecChannelList[i];
            printf("MULTICH_HDSDI_DVR:Decode disable invisible channel.DEC_LINKID[0x%X],CHNUM[%d]\n",
                    gVdecModuleContext.decId,decChInfo.chId);
            status =
            System_linkControl(gVdecModuleContext.decId,DEC_LINK_CMD_DISABLE_CHANNEL,
                                &decChInfo,sizeof(decChInfo),TRUE);
            OSA_assert(status == 0);
        }
    }
    
    static
    Int32 MultiCh_hdsdiDVRSetMosaicParams(VDIS_DEV vdDevId, VDIS_MOSAIC_S *psVdMosaicParam )
    {
        UInt32 winId, chId;
        UInt32 swMsId = SYSTEM_LINK_ID_INVALID;
        SwMsLink_LayoutPrm *vdisLayoutPrm;
    
        swMsId = gVdisModuleContext.swMsId[Vdis_getDisplayContextIndex(vdDevId)];
        if(swMsId==SYSTEM_LINK_ID_INVALID)
            return -1;
    
        vdisLayoutPrm = &gHDSDIDVRUsecaseContext.swmsLayoutPrm[Vdis_getDisplayContextIndex(vdDevId)];
    
        /* Get display resolution and coordinates */
        vdisLayoutPrm->numWin = psVdMosaicParam->numberOfWindows;
        vdisLayoutPrm->onlyCh2WinMapChanged = psVdMosaicParam->onlyCh2WinMapChanged;
        vdisLayoutPrm->outputFPS = psVdMosaicParam->outputFPS;
    
        /* Assign each windows coordinates, size and mapping */
        for(winId=0; winId<vdisLayoutPrm->numWin; winId++)
        {
            vdisLayoutPrm->winInfo[winId].channelNum         = psVdMosaicParam->chnMap[winId];
            vdisLayoutPrm->winInfo[winId].bufAddrOffset[0u]      = -1;
            vdisLayoutPrm->winInfo[winId].bufAddrOffset[1u]      = -1;
            vdisLayoutPrm->winInfo[winId].width              = psVdMosaicParam->winList[winId].width;
            vdisLayoutPrm->winInfo[winId].height             = psVdMosaicParam->winList[winId].height;
            vdisLayoutPrm->winInfo[winId].startX             = psVdMosaicParam->winList[winId].start_X;
            vdisLayoutPrm->winInfo[winId].startY             = psVdMosaicParam->winList[winId].start_Y;
            vdisLayoutPrm->winInfo[winId].bypass             = FALSE;
            chId = psVdMosaicParam->chnMap[winId];
    
            if(chId < gVdisModuleContext.vdisConfig.numChannels)
            {
                Vdis_setChn2WinMap(vdDevId, chId,winId);
    
                if(Vdis_isEnableChn(vdDevId,chId) == FALSE)
                {
                    vdisLayoutPrm->winInfo[winId].channelNum = SYSTEM_SW_MS_INVALID_ID;
                }
            }
        }
    
        Vdis_swMs_PrintLayoutParams(vdDevId, vdisLayoutPrm);
        System_linkControl(swMsId, SYSTEM_SW_MS_LINK_CMD_SWITCH_LAYOUT, (vdisLayoutPrm), sizeof(*vdisLayoutPrm), TRUE);
    
        multich_hdsdidvr_enable_visible_decode_channels();
        return 0;
    }
    
    
    

  • Hi:

     Did the usecase of "multich_5F00_hd_5F00_sdi_5F00_dvr.c. "  use 8bit data interface with vip_port? or 16 bit mod?