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.

the empty QUE in encLink does not release

Hi,everyone:

       I created a usecase , it's structure is: read_local_file -> ipcBitsOutHost -> ipcBitsInVideo -> dec -> ipcFrameOutVideo ->IpcOutVideo ->IpcInVpss -> dup ->IpcOutVpss -> IpcInVideo -> enc -> ipcBitsOutRtos -> ipcBitsInHost -> write_to_local

this is one way , the other way is followed after dup: dup -> swMS -> display

the output on display looks normally. but there are only 6 frames can be writen to local. I traced the source codes, I found the empty buf in encLink does not release. Once the 6 buf be used ,it can not alloc any new empty que buf, so the encLink stops work. I also found the release of the empty buf is done by encLink's next link,ipcBitsOutRtos. 

the function is :IpcBitsOutLink_releaseBitBufs(IpcBitsOutLink_Obj * pObj) in /dvr_rdk/mcfw/src_bios6/links_common/ipcBitsOut/ipcBitsOutLink_tsk.c

in this function, it call ListMP_getHead, but it return NULL. the loop breaks, the empty does not be released.

I wonder the reason and how to reslove this problem

thanks!

shen

  • Does ipcBitsInHost receive any buffer at all?

    Can you disable notifyMode & check if it works?

  • Attach your usecase file where you are creating and connecting links and logs of Vsys_printDetailedStatistics and Vsys_printBufferStatistics invoked 3 times with 1 min interval.

  • Hi, Sivagamy

        thanks for your reply. IpcBitsInHost recieves data of 6 frames. But I am afraid that the 6 frames I received are not correct, because they are different with the first 6 frames of the source h264 file.

        And I don't understand how to disable notifyMode,do you mean something like "System_ipcSendNotify()"?

    Best regards!

    shen

  • Hi, Badri

        thanks for your reply!

        my usecase file:

    /*******************************************************************************
     *                                                                             *
     * Copyright (c) 2009 Texas Instruments Incorporated - http://www.ti.com/      *
     *                        ALL RIGHTS RESERVED                                  *
     *                                                                             *
     ******************************************************************************/
    /*  ========================= TI_816X_BUILD case ==============================
                              |
                            IPC_BITS_OUT_A8 (BitStream)
                              |
                            IPC_BITS_IN (Video)
                              |
                            DEC (YUV420SP)
                              |
                            IPC_OUT (Video)
                              |
                            IPC_IN (Vpss)
                              |   (32 D1 + 10 720P + 6 1080P)
                            MP_SCLR (Vpss)
                              |     (TI816x only)
                             DUP
                   (48CH)    | |    (48CH)
             +---------------+ +-------------+
             |                               |
             |                               |
          SW Mosaic                       SW Mosaic
         (SC5 SC1 YUV422I)                (SC4 SC2 YUV422I)
            |  |                             |  |
            |  |                             |  |
           (DDR)(422I)                      (DDR)(422I)
              |                               |
      GRPX0   |                      GRPX1    |
         |    |                          |    |
         On-Chip HDMI                    Off-Chip HDMI
           1080p60                        1080p60
    */
    
    /* ========================= TI_814X_BUILD case ==============================
                              |
                            IPC_BITS_OUT_A8 (BitStream)
                              |
                            IPC_BITS_IN (Video)
                              |
                            DEC (YUV420SP)
                              |
                            IPC_OUT (Video)
                              |
                            IPC_IN (Vpss)
                              |   (16 channels)
                             DUP
                   (16CH)    | |    (16CH)
             +---------------+ +-------------+
             |                               |
             |                               |
          SW Mosaic                       SW Mosaic
         (SC5 YUV422I)                (SC5 YUV422I)
            |  |                             |  |
            |  |                             |  |
           (DDR)(422I)                      (DDR)(422I)
              |                               |
      GRPX0   |----Tied---|                   |
         |    |           |                   |
         On-Chip HDMI  Off-Chip HDMI         SDTV
           1080p60       1080p60
    */
    
    #include "multich_common.h"
    #include "multich_ipcbits.h"
    #include "mcfw/interfaces/link_api/system_tiler.h"
    #include "mcfw/interfaces/link_api/avsync_hlos.h"
    
    /* =============================================================================
     * Externs
     * =============================================================================
     */
    
    
    /* =============================================================================
     * Use case code
     * =============================================================================
     */
    
    
    
    #define MAX_DEC_OUT_FRAMES_PER_CH                           (5)
    #define MULTICH_VDEC_VDIS_IPCFRAMEEXPORT_NUM_CHANNELS       (16)
    #define MULTICH_VDEC_VDIS_IPCFRAMEEXPORT_FRAME_WIDTH        (720)
    #define MULTICH_VDEC_VDIS_IPCFRAMEEXPORT_FRAME_HEIGHT       (480)
    #define MULTICH_NUM_SWMS_MAX_BUFFERS                        (7)
    
    
    
    #if defined(TI_814X_BUILD) || defined(TI_8107_BUILD)
    static SystemVideo_Ivahd2ChMap_Tbl systemVid_encDecIvaChMapTbl =
    {
        .isPopulated = 1,
        .ivaMap[0] =
        {
            .EncNumCh  = 0,
            .EncChList = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 , 0, 0},
    
            .DecNumCh  = 16,
            .DecChList = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15},
        },
    };
    #else
    /*
    Max channels per IVA-HD MUST be < 16,
    i.e total number of channels for decode can be 48.
    
    Example CH allocation for SD+HD,
    
    32CH SD    :  0 to 31
     6CH 1080P : 32 to 38
    10CH 720P  : 39 to 48
    
    */
    static SystemVideo_Ivahd2ChMap_Tbl systemVid_encDecIvaChMapTbl =
    {
        .isPopulated = 1,
        .ivaMap[0] =
        {
            .EncNumCh  = 0,
            .EncChList = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 , 0, 0},
    
            .DecNumCh  = 17,
            .DecChList = {   0,  3,  6,  9, 12, 15, 18, 21,
                            24, 27, 30, 33, 36, 39, 42, 45,
                            48
                         },
        },
        .ivaMap[1] =
        {
            .EncNumCh  = 0,
            .EncChList = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 , 0, 0},
    
            .DecNumCh  = 17,
            .DecChList = {   1,  4,  7, 10, 13, 16, 19, 22,
                            25, 28, 31, 34, 37, 40, 43, 46,
                            49
                         },
        },
        .ivaMap[2] =
        {
            .EncNumCh  = 0,
            .EncChList = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 , 0, 0},
    
            .DecNumCh  = 16,
            .DecChList = {   2,  5,  8, 11, 14, 17, 20, 23,
                            26, 29, 32, 35, 38, 41, 44, 47
                         },
        },
    };
    #endif
    
    typedef struct {
    
        UInt32 dupId;
        //UInt32 ipcOutVideoId[2];
        UInt32 ipcOutVpssId;
        UInt32 ipcInVpssId;
        UInt32 ipcInVideoId;
        UInt32 mergeId;
        Bool   enableVideoFrameExport;
        AvsyncLink_LinkSynchConfigParams   avsyncCfg[VDIS_DEV_MAX];
        UInt32 mpSclrId;
    
    } MultiCh_VdecVdisObj;
    
    MultiCh_VdecVdisObj gMultiCh_VdecVdisObj;
    /*
    static Void MultiCh_setIpcFramesOutInQueInfo(System_LinkQueInfo *inQueInfo)
    {
        Int i;
    
        inQueInfo->numCh = MULTICH_VDEC_VDIS_IPCFRAMEEXPORT_NUM_CHANNELS;
        for (i = 0; i < inQueInfo->numCh; i++)
        {
            inQueInfo->chInfo[i].bufType = SYSTEM_BUF_TYPE_VIDFRAME;
            inQueInfo->chInfo[i].dataFormat = SYSTEM_DF_YUV422I_YUYV;
            inQueInfo->chInfo[i].memType    = SYSTEM_MT_NONTILEDMEM;
            inQueInfo->chInfo[i].scanFormat = SYSTEM_SF_PROGRESSIVE;
            inQueInfo->chInfo[i].startX     = 0;
            inQueInfo->chInfo[i].startY     = 0;
            inQueInfo->chInfo[i].width      =
                       MULTICH_VDEC_VDIS_IPCFRAMEEXPORT_FRAME_WIDTH;
            inQueInfo->chInfo[i].height     =
                       MULTICH_VDEC_VDIS_IPCFRAMEEXPORT_FRAME_HEIGHT;
            inQueInfo->chInfo[i].pitch[0]   =
                       MULTICH_VDEC_VDIS_IPCFRAMEEXPORT_FRAME_WIDTH * 2;
            inQueInfo->chInfo[i].pitch[1]   = 0;
            inQueInfo->chInfo[i].pitch[2]   = 0;
        }
    }
    */
    static
    Void mulich_vdec_vdis_set_avsync_vidque_prm(Avsync_SynchConfigParams *queCfg,
                                                Int chnum,
                                                UInt32 avsStartChNum,
                                                UInt32 avsEndChNum,
                                                VDIS_DEV vdDevId)
    {
        queCfg->chNum = chnum;
        queCfg->audioPresent = FALSE;
        if ((queCfg->chNum >= avsStartChNum)
            &&
            (queCfg->chNum <= avsEndChNum)
            &&
            (gVsysModuleContext.vsysConfig.enableAVsync))
        {
            queCfg->avsyncEnable = TRUE;
        }
        else
        {
            queCfg->avsyncEnable = FALSE;
        }
        queCfg->clkAdjustPolicy.refClkType = AVSYNC_REFCLKADJUST_NONE;
        queCfg->clkAdjustPolicy.clkAdjustLead = AVSYNC_VIDEO_TIMEBASESHIFT_MAX_LEAD_MS;
        queCfg->clkAdjustPolicy.clkAdjustLag  = AVSYNC_VIDEO_TIMEBASESHIFT_MAX_LAG_MS;
        queCfg->vidSynchPolicy.maxReplayLead  = AVSYNC_VIDEO_FUTURE_FRAME_DROP_THRESHOLD_MS;
        queCfg->vidSynchPolicy.playMaxLag  = 180;
        queCfg->vidSynchPolicy.playMaxLead = 0;
        queCfg->vidSynchPolicy.doMarginScaling = FALSE;
        queCfg->playTimerStartTimeout = 0;
        queCfg->playStartMode = AVSYNC_PLAYBACK_START_MODE_WAITSYNCH;
        queCfg->ptsInitMode   = AVSYNC_PTS_INIT_MODE_APP;
    }
    
    static
    Void mulich_vdec_vdis_set_avsync_prm(AvsyncLink_LinkSynchConfigParams *avsyncPrm,
                                         UInt32 swMsIdx,
                                         VDIS_DEV vdDevId)
    {
        Int i;
        Int32 status;
    
        Vdis_getAvsyncConfig(vdDevId,avsyncPrm);
        avsyncPrm->displayLinkID        = Vdis_getDisplayId(vdDevId);
        avsyncPrm->videoSynchLinkID = gVdisModuleContext.swMsId[swMsIdx];
        avsyncPrm->numCh            = gVdecModuleContext.vdecConfig.numChn;
        avsyncPrm->syncMasterChnum =  AVSYNC_INVALID_CHNUM;
        for (i = 0; i < avsyncPrm->numCh;i++)
        {
            mulich_vdec_vdis_set_avsync_vidque_prm(&avsyncPrm->queCfg[i],
                                                   i,
                                                   0,
                                                   (0 + gVdecModuleContext.vdecConfig.numChn),
                                                   vdDevId);
        }
        if (0 == swMsIdx)
        {
            Vdis_setAvsyncConfig(VDIS_DEV_HDMI,avsyncPrm);
        }
        else
        {
            Vdis_setAvsyncConfig(VDIS_DEV_SD,avsyncPrm);
        }
    
        status = Avsync_configSyncConfigInfo(avsyncPrm);
        OSA_assert(status == 0);
    }
    
    Void MultiCh_createVdecVdis()
    {
        IpcBitsOutLinkHLOS_CreateParams   ipcBitsOutHostPrm;
        IpcBitsInLinkRTOS_CreateParams    ipcBitsInVideoPrm;  
        
        DecLink_CreateParams        decPrm;
        IpcLink_CreateParams        ipcOutVideoPrm;
        IpcLink_CreateParams        ipcInVpssPrm;  
        IpcLink_CreateParams        ipcOutVpssPrm;  
        IpcLink_CreateParams        ipcInVideoPrm;    
        DupLink_CreateParams        dupPrm;
        EncLink_CreateParams        encPrm;
        
        static SwMsLink_CreateParams       swMsPrm[VDIS_DEV_MAX];
        DisplayLink_CreateParams    displayPrm[VDIS_DEV_MAX];
    
        AlgLink_CreateParams              dspAlgPrm;
        IpcFramesInLinkRTOS_CreateParams  ipcFramesInDspPrm;
        IpcFramesOutLinkRTOS_CreateParams ipcFramesOutVideoPrm;
    
    
        IpcBitsOutLinkRTOS_CreateParams ipcBitsOutVideoPrm;
        IpcBitsInLinkHLOS_CreateParams  ipcBitsInHostPrm;
        
    
        UInt32 i, j;
        UInt32 enableGrpx;
        Bool tilerEnable;
    
    
        MULTICH_INIT_STRUCT(IpcLink_CreateParams,ipcInVpssPrm);
        MULTICH_INIT_STRUCT(IpcLink_CreateParams,ipcOutVideoPrm);
        MULTICH_INIT_STRUCT(IpcLink_CreateParams,ipcOutVpssPrm);
    
    
        MULTICH_INIT_STRUCT(IpcBitsOutLinkHLOS_CreateParams,ipcBitsOutHostPrm);
        MULTICH_INIT_STRUCT(IpcBitsInLinkRTOS_CreateParams,ipcBitsInVideoPrm);
        MULTICH_INIT_STRUCT(DecLink_CreateParams, decPrm);
    
        MULTICH_INIT_STRUCT(EncLink_CreateParams, encPrm);
        MULTICH_INIT_STRUCT(IpcFramesOutLinkRTOS_CreateParams,ipcFramesOutVideoPrm);
        MULTICH_INIT_STRUCT(AlgLink_CreateParams, dspAlgPrm);
        MULTICH_INIT_STRUCT(IpcFramesInLinkRTOS_CreateParams,ipcFramesInDspPrm);
        MULTICH_INIT_STRUCT(IpcBitsOutLinkRTOS_CreateParams,ipcBitsOutVideoPrm);
    
        MULTICH_INIT_STRUCT(IpcBitsInLinkHLOS_CreateParams,ipcBitsInHostPrm);
    
    
        dspAlgPrm.enableOSDAlg = TRUE;    
        
        for (i = 0; i < 1;i++)
        {
            MULTICH_INIT_STRUCT(DisplayLink_CreateParams,displayPrm[i]);
            MULTICH_INIT_STRUCT(SwMsLink_CreateParams ,swMsPrm[i]);
        }
    
        MultiCh_detectBoard();
    
        printf("SYSTEM_LINK_ID_M3VPSS id:%x\n",SYSTEM_LINK_ID_M3VPSS);
        System_linkControl(
            SYSTEM_LINK_ID_M3VPSS,
            SYSTEM_M3VPSS_CMD_RESET_VIDEO_DEVICES,
            NULL,
            0,
            TRUE
            );
    
        printf("SYSTEM_LINK_ID_M3VIDEO id:%x\n",SYSTEM_LINK_ID_M3VIDEO);
        System_linkControl(
            SYSTEM_LINK_ID_M3VIDEO,
            SYSTEM_COMMON_CMD_SET_CH2IVAHD_MAP_TBL,
            &systemVid_encDecIvaChMapTbl,
            sizeof(SystemVideo_Ivahd2ChMap_Tbl),
            TRUE
        );
    #if defined(TI_814X_BUILD) || defined(TI_8107_BUILD)
        tilerEnable  = FALSE;
        enableGrpx   = FALSE;
    #else
        tilerEnable  = FALSE;
        enableGrpx   = TRUE;
    #endif
    
    #if (tilerEnable == FALSE)
        {
            /* Disable tiler allocator for this usecase
             * for that tiler memory can be reused for
             * non-tiled allocation
             */
            SystemTiler_disableAllocator();
        }
    #endif
    
        gVdecModuleContext.ipcBitsOutHLOSId = SYSTEM_HOST_LINK_ID_IPC_BITS_OUT_0;
        gVdecModuleContext.ipcBitsInRTOSId  = SYSTEM_VIDEO_LINK_ID_IPC_BITS_IN_0;
        gVdecModuleContext.decId            = SYSTEM_LINK_ID_VDEC_0;
    
        gVcapModuleContext.ipcFramesOutVideoId  =  SYSTEM_VIDEO_LINK_ID_IPC_FRAMES_OUT_0;
        gVcapModuleContext.ipcFramesInDspId[0]   = SYSTEM_DSP_LINK_ID_IPC_FRAMES_IN_0;
        gVcapModuleContext.dspAlgId[0] = SYSTEM_LINK_ID_ALG_0;
    
    
        gVdisModuleContext.ipcOutVideoId  = SYSTEM_VIDEO_LINK_ID_IPC_OUT_M3_0;
        //gVdisModuleContext.ipcOutVideoId[1]  = SYSTEM_VIDEO_LINK_ID_IPC_OUT_M3_1;
        gMultiCh_VdecVdisObj.ipcInVpssId    = SYSTEM_VPSS_LINK_ID_IPC_IN_M3_0;
    
        gMultiCh_VdecVdisObj.dupId          = SYSTEM_VPSS_LINK_ID_DUP_0;
    
        gVencModuleContext.encId            = SYSTEM_LINK_ID_VENC_0;
    
        gVdisModuleContext.swMsId[0]        = SYSTEM_LINK_ID_SW_MS_MULTI_INST_0;
        gVdisModuleContext.displayId[0]     = SYSTEM_LINK_ID_DISPLAY_0;
    
    
        gMultiCh_VdecVdisObj.ipcOutVpssId    = SYSTEM_VPSS_LINK_ID_IPC_OUT_M3_0;
    
    
        gMultiCh_VdecVdisObj.ipcInVideoId  =  SYSTEM_VIDEO_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;
    
    
       
        if(enableGrpx)
        {
            // GRPX is enabled in Vdis_start() based on the link ID set here
            gVdisModuleContext.grpxId[0]    = SYSTEM_LINK_ID_GRPX_0;
    #if defined(TI_814X_BUILD) || defined(TI_8107_BUILD)
            gVdisModuleContext.grpxId[1]    = SYSTEM_LINK_ID_INVALID;
    #else
            gVdisModuleContext.grpxId[1]    = SYSTEM_LINK_ID_GRPX_1;
    #endif
        }
    
        ipcBitsOutHostPrm.baseCreateParams.outQueParams[0].nextLink= gVdecModuleContext.ipcBitsInRTOSId;
        ipcBitsOutHostPrm.baseCreateParams.notifyNextLink       = FALSE;
        ipcBitsOutHostPrm.baseCreateParams.notifyPrevLink       = FALSE;
        ipcBitsOutHostPrm.baseCreateParams.noNotifyMode         = TRUE;
        ipcBitsOutHostPrm.baseCreateParams.numOutQue            = 1;
        ipcBitsOutHostPrm.inQueInfo.numCh                       = gVdecModuleContext.vdecConfig.numChn;
        ipcBitsOutHostPrm.bufPoolPerCh                          = TRUE;
    
        for (i=0; i<ipcBitsOutHostPrm.inQueInfo.numCh; i++)
        {
            ipcBitsOutHostPrm.inQueInfo.chInfo[i].width =
                gVdecModuleContext.vdecConfig.decChannelParams[i].maxVideoWidth;
    
            ipcBitsOutHostPrm.inQueInfo.chInfo[i].height =
                gVdecModuleContext.vdecConfig.decChannelParams[i].maxVideoHeight;
    
            ipcBitsOutHostPrm.inQueInfo.chInfo[i].scanFormat =
                SYSTEM_SF_PROGRESSIVE;
    
            ipcBitsOutHostPrm.inQueInfo.chInfo[i].bufType        = 0; // NOT USED
            ipcBitsOutHostPrm.inQueInfo.chInfo[i].codingformat   = 0; // NOT USED
            ipcBitsOutHostPrm.inQueInfo.chInfo[i].dataFormat     = 0; // NOT USED
            ipcBitsOutHostPrm.inQueInfo.chInfo[i].memType        = 0; // NOT USED
            ipcBitsOutHostPrm.inQueInfo.chInfo[i].startX         = 0; // NOT USED
            ipcBitsOutHostPrm.inQueInfo.chInfo[i].startY         = 0; // NOT USED
            ipcBitsOutHostPrm.inQueInfo.chInfo[i].pitch[0]       = 0; // NOT USED
            ipcBitsOutHostPrm.inQueInfo.chInfo[i].pitch[1]       = 0; // NOT USED
            ipcBitsOutHostPrm.inQueInfo.chInfo[i].pitch[2]       = 0; // NOT USED
            ipcBitsOutHostPrm.numBufPerCh[i] = 6;
        }
    
        ipcBitsInVideoPrm.baseCreateParams.inQueParams.prevLinkId    = gVdecModuleContext.ipcBitsOutHLOSId;
        ipcBitsInVideoPrm.baseCreateParams.inQueParams.prevLinkQueId = 0;
        ipcBitsInVideoPrm.baseCreateParams.outQueParams[0].nextLink  = gVdecModuleContext.decId;
        ipcBitsInVideoPrm.baseCreateParams.noNotifyMode              = TRUE;
        ipcBitsInVideoPrm.baseCreateParams.notifyNextLink            = TRUE;
        ipcBitsInVideoPrm.baseCreateParams.notifyPrevLink            = FALSE;
        ipcBitsInVideoPrm.baseCreateParams.numOutQue                 = 1;
    
        for (i=0; i<ipcBitsOutHostPrm.inQueInfo.numCh; i++)
        {
            if(gVdecModuleContext.vdecConfig.decChannelParams[i].isCodec == VDEC_CHN_H264)
                decPrm.chCreateParams[i].format                 = IVIDEO_H264HP;
            else if(gVdecModuleContext.vdecConfig.decChannelParams[i].isCodec == VDEC_CHN_MPEG4)
                decPrm.chCreateParams[i].format                 = IVIDEO_MPEG4ASP;
            else if(gVdecModuleContext.vdecConfig.decChannelParams[i].isCodec == VDEC_CHN_MJPEG)
                decPrm.chCreateParams[i].format                 = IVIDEO_MJPEG;
    
            decPrm.chCreateParams[i].numBufPerCh 
                             = gVdecModuleContext.vdecConfig.decChannelParams[i].numBufPerCh;
            decPrm.chCreateParams[i].profile                = IH264VDEC_PROFILE_ANY;
            decPrm.chCreateParams[i].displayDelay
                             = gVdecModuleContext.vdecConfig.decChannelParams[i].displayDelay;
            decPrm.chCreateParams[i].dpbBufSizeInFrames = IH264VDEC_DPB_NUMFRAMES_AUTO;
            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;
    
        }
    
        decPrm.inQueParams.prevLinkId       = gVdecModuleContext.ipcBitsInRTOSId;
        decPrm.inQueParams.prevLinkQueId    = 0;
        decPrm.outQueParams.nextLink        = gVcapModuleContext.ipcFramesOutVideoId;
        decPrm.tilerEnable                  = tilerEnable;
    
        ipcFramesOutVideoPrm.baseCreateParams.inQueParams.prevLinkId    = gVdecModuleContext.decId;
        ipcFramesOutVideoPrm.baseCreateParams.inQueParams.prevLinkQueId = 0;
        ipcFramesOutVideoPrm.baseCreateParams.notifyPrevLink = FALSE;
    
        ipcFramesOutVideoPrm.baseCreateParams.numOutQue                 = 1;    
        ipcFramesOutVideoPrm.baseCreateParams.outQueParams[0].nextLink     = gVdisModuleContext.ipcOutVideoId;
        ipcFramesOutVideoPrm.baseCreateParams.notifyNextLink            = TRUE;
    
        ipcFramesOutVideoPrm.baseCreateParams.processLink = gVcapModuleContext.ipcFramesInDspId[0];
        ipcFramesOutVideoPrm.baseCreateParams.notifyProcessLink = TRUE;
        ipcFramesOutVideoPrm.baseCreateParams.noNotifyMode = FALSE;
    
        ipcFramesInDspPrm.baseCreateParams.inQueParams.prevLinkId = gVcapModuleContext.ipcFramesOutVideoId;
        ipcFramesInDspPrm.baseCreateParams.inQueParams.prevLinkQueId = 0;
        ipcFramesInDspPrm.baseCreateParams.numOutQue   = 1;
        ipcFramesInDspPrm.baseCreateParams.outQueParams[0].nextLink = gVcapModuleContext.dspAlgId[0];
        ipcFramesInDspPrm.baseCreateParams.notifyPrevLink = TRUE;
        ipcFramesInDspPrm.baseCreateParams.notifyNextLink = TRUE;
        ipcFramesInDspPrm.baseCreateParams.noNotifyMode   = FALSE;
    
        dspAlgPrm.inQueParams.prevLinkId = gVcapModuleContext.ipcFramesInDspId[0];
        dspAlgPrm.inQueParams.prevLinkQueId = 0;
    
    
        ipcOutVideoPrm.inQueParams.prevLinkId    = gVcapModuleContext.ipcFramesOutVideoId;
        ipcOutVideoPrm.inQueParams.prevLinkQueId = 0;
        ipcOutVideoPrm.outQueParams[0].nextLink     = gMultiCh_VdecVdisObj.ipcInVpssId;
        ipcOutVideoPrm.notifyNextLink            = TRUE;
        ipcOutVideoPrm.notifyPrevLink            = TRUE;
        ipcOutVideoPrm.numOutQue                 = 1;    
    
    
        ipcInVpssPrm.inQueParams.prevLinkId    = gVdisModuleContext.ipcOutVideoId;
        ipcInVpssPrm.inQueParams.prevLinkQueId = 0;
        ipcInVpssPrm.outQueParams[0].nextLink      = gMultiCh_VdecVdisObj.dupId;
        ipcInVpssPrm.notifyNextLink            = TRUE;
        ipcInVpssPrm.notifyPrevLink            = TRUE;
        ipcInVpssPrm.numOutQue                 = 1;
    
        dupPrm.inQueParams.prevLinkId         = gMultiCh_VdecVdisObj.ipcInVpssId;
        dupPrm.inQueParams.prevLinkQueId      = 0;
        dupPrm.numOutQue                      = 2;
        dupPrm.outQueParams[0].nextLink       = gVdisModuleContext.swMsId[0];
        dupPrm.outQueParams[1].nextLink       = gMultiCh_VdecVdisObj.ipcOutVpssId;   
        dupPrm.notifyNextLink                 = TRUE;
    
        ipcOutVpssPrm.inQueParams.prevLinkId    = gMultiCh_VdecVdisObj.dupId;
        ipcOutVpssPrm.inQueParams.prevLinkQueId = 1;   
        ipcOutVpssPrm.numOutQue                 = 1;
        ipcOutVpssPrm.outQueParams[0].nextLink  = gMultiCh_VdecVdisObj.ipcInVideoId;
        ipcOutVpssPrm.notifyNextLink            = FALSE;
        ipcOutVpssPrm.notifyPrevLink            = TRUE;
        ipcOutVpssPrm.noNotifyMode              = TRUE;
    
    
        ipcInVideoPrm.inQueParams.prevLinkId    = gMultiCh_VdecVdisObj.ipcOutVpssId;
        ipcInVideoPrm.inQueParams.prevLinkQueId = 0;
        ipcInVideoPrm.numOutQue                 = 1;
        ipcInVideoPrm.outQueParams[0].nextLink     = gVencModuleContext.encId;
        ipcInVideoPrm.notifyNextLink            = TRUE;
        ipcInVideoPrm.notifyPrevLink            = FALSE;
        ipcInVideoPrm.noNotifyMode              = TRUE;
    
    
        encPrm.numBufPerCh[0] = 6; //D1
     //   encPrm.numBufPerCh[1] = 4; //CIF
    
    
    
        {
            EncLink_ChCreateParams *pLinkChPrm;
            EncLink_ChDynamicParams *pLinkDynPrm;
            VENC_CHN_DYNAMIC_PARAM_S *pDynPrm;
            VENC_CHN_PARAMS_S *pChPrm;
    
            //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;
            }
    
            if (gVsysModuleContext.vsysConfig.enableSecondaryOut == TRUE)
            {
                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;
                }
            }
        }
        
        encPrm.inQueParams.prevLinkId   = gMultiCh_VdecVdisObj.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;
    
    
        ipcBitsInHostPrm.baseCreateParams.inQueParams.prevLinkId    = gVencModuleContext.ipcBitsOutRTOSId;
        ipcBitsInHostPrm.baseCreateParams.inQueParams.prevLinkQueId = 0;
        ipcBitsInHostPrm.baseCreateParams.numOutQue                 = 1;
        ipcBitsInHostPrm.baseCreateParams.outQueParams[0].nextLink   = SYSTEM_LINK_ID_INVALID;
        MultiCh_ipcBitsInitCreateParams_BitsInHLOS(&ipcBitsInHostPrm);
        
        
    
    
        swMsPrm[0].swMsInstId[0]        = SYSTEM_SW_MS_SC_INST_VIP1_SC;
        swMsPrm[0].swMsInstId[1]        = SYSTEM_SW_MS_SC_INST_DEI_SC_NO_DEI;
    
        swMsPrm[0].numSwMsInst          = 2;
    
        swMsPrm[0].swMsInstStartWin[0]  = 0;
        swMsPrm[0].swMsInstStartWin[1]  = 16;
    
        swMsPrm[0].enableProcessTieWithDisplay = TRUE;
    
    
        for(i=0; i<1; i++)
        {
            VDIS_DEV vdDevId = VDIS_DEV_HDMI;
    
            swMsPrm[i].inQueParams.prevLinkId     = gMultiCh_VdecVdisObj.dupId;
            swMsPrm[i].inQueParams.prevLinkQueId  = i;
            swMsPrm[i].outQueParams.nextLink      = gVdisModuleContext.displayId[i];
            swMsPrm[i].numOutBuf                 = MULTICH_NUM_SWMS_MAX_BUFFERS;
    
            
            swMsPrm[i].maxInputQueLen             = SYSTEM_SW_MS_INVALID_INPUT_QUE_LEN;
            if (i == 0)
            {
                vdDevId = VDIS_DEV_HDMI;
                swMsPrm[i].maxOutRes              = VSYS_STD_1080P_60;
                swMsPrm[i].initOutRes             = gVdisModuleContext.vdisConfig.deviceParams[VDIS_DEV_HDMI].resolution;
            }
            else if (i == 1)
            {
    #if defined(TI_814X_BUILD) || defined(TI_8107_BUILD)
                vdDevId = VDIS_DEV_SD;
                swMsPrm[i].maxOutRes              = VSYS_STD_PAL;
                swMsPrm[i].outQueParams.nextLink  = SYSTEM_LINK_ID_DISPLAY_2;
                swMsPrm[i].initOutRes             = gVdisModuleContext.vdisConfig.deviceParams[VDIS_DEV_SD].resolution;
    
    #else
                vdDevId = VDIS_DEV_DVO2;
                swMsPrm[i].maxOutRes              = VSYS_STD_1080P_60;
                swMsPrm[i].initOutRes             = gVdisModuleContext.vdisConfig.deviceParams[VDIS_DEV_DVO2].resolution;
    #endif
            }
            
            if(tilerEnable)
                swMsPrm[i].lineSkipMode           = FALSE;
            else
                swMsPrm[i].lineSkipMode           = TRUE;
    
            swMsPrm[i].enableLayoutGridDraw = gVdisModuleContext.vdisConfig.enableLayoutGridDraw;
    
            MultiCh_swMsGetDefaultLayoutPrm(vdDevId, &swMsPrm[i], FALSE);    
    
            displayPrm[i].inQueParams[0].prevLinkId    = gVdisModuleContext.swMsId[i];
            displayPrm[i].inQueParams[0].prevLinkQueId = 0;
            displayPrm[i].displayRes                = swMsPrm[i].initOutRes;
            if (i == 1)
    #if defined(TI_814X_BUILD) || defined(TI_8107_BUILD)
                            displayPrm[i].displayRes            = gVdisModuleContext.vdisConfig.deviceParams[VDIS_DEV_SD].resolution;
    #else
                            displayPrm[i].displayRes            = gVdisModuleContext.vdisConfig.deviceParams[VDIS_DEV_DVO2].resolution;
    #endif
            mulich_vdec_vdis_set_avsync_prm(&gMultiCh_VdecVdisObj.avsyncCfg[i],i,vdDevId);
        }
    
    
        AlgLink_OsdChWinParams * chWinPrm = &dspAlgPrm.osdChCreateParams[0].chDefaultParams;  
        dspAlgPrm.osdChCreateParams[0].maxWidth  = EXAMPLE_OSD_WIN_MAX_WIDTH;  
        dspAlgPrm.osdChCreateParams[0].maxHeight = EXAMPLE_OSD_WIN_MAX_HEIGHT;   
    
        chWinPrm->chId = 0;  
        chWinPrm->numWindows = 0;  
    
        System_linkCreate(gVdecModuleContext.ipcBitsOutHLOSId,&ipcBitsOutHostPrm,sizeof(ipcBitsOutHostPrm));
        System_linkCreate(gVdecModuleContext.ipcBitsInRTOSId,&ipcBitsInVideoPrm,sizeof(ipcBitsInVideoPrm));
        System_linkCreate(gVdecModuleContext.decId, &decPrm, sizeof(decPrm));
    
        System_linkCreate(gVcapModuleContext.ipcFramesOutVideoId, &ipcFramesOutVideoPrm, sizeof(ipcFramesOutVideoPrm));
        System_linkCreate(gVcapModuleContext.ipcFramesInDspId[0], &ipcFramesInDspPrm, sizeof(ipcFramesInDspPrm));
        System_linkCreate(gVcapModuleContext.dspAlgId[0] , &dspAlgPrm, sizeof(dspAlgPrm));
    
    
        System_linkCreate(gVdisModuleContext.ipcOutVideoId, &ipcOutVideoPrm, sizeof(ipcOutVideoPrm));    //gVdisModuleContext
        System_linkCreate(gMultiCh_VdecVdisObj.ipcInVpssId  , &ipcInVpssPrm, sizeof(ipcInVpssPrm));    
    
        System_linkCreate(gMultiCh_VdecVdisObj.dupId     , &dupPrm    , sizeof(dupPrm));
        
        System_linkCreate(gMultiCh_VdecVdisObj.ipcOutVpssId, &ipcOutVpssPrm, sizeof(ipcOutVpssPrm));  //1
        System_linkCreate(gMultiCh_VdecVdisObj.ipcInVideoId, &ipcInVideoPrm, sizeof(ipcInVideoPrm));
        System_linkCreate(gVencModuleContext.encId, &encPrm, sizeof(encPrm));
        System_linkCreate(gVencModuleContext.ipcBitsOutRTOSId, &ipcBitsOutVideoPrm, sizeof(ipcBitsOutVideoPrm));
        System_linkCreate(gVencModuleContext.ipcBitsInHLOSId, &ipcBitsInHostPrm, sizeof(ipcBitsInHostPrm));
    
    
        System_linkCreate(gVdisModuleContext.swMsId[0]  , &swMsPrm[0], sizeof(swMsPrm[0]));
        System_linkCreate(gVdisModuleContext.displayId[0], &displayPrm[0], sizeof(displayPrm[0]));
    
    
        MultiCh_memPrintHeapStatus();
    //    gMultiCh_VdecVdisObj.enableVideoFrameExport = enableVideoFrameExport;
        {
            MultiCh_setDec2DispMap(VDIS_DEV_HDMI,gVdecModuleContext.vdecConfig.numChn,0,0);
            #if defined(TI_814X_BUILD) || defined(TI_8107_BUILD)
            MultiCh_setDec2DispMap(VDIS_DEV_SD,gVdecModuleContext.vdecConfig.numChn,0,0);
            #else
            MultiCh_setDec2DispMap(VDIS_DEV_HDCOMP,gVdecModuleContext.vdecConfig.numChn,0,0);
            #endif
       }
    
    }
    
    Void MultiCh_deleteVdecVdis()
    {
        /* delete can be done in any order */
    
        Vdec_delete();
        Vdis_delete();
    
        if (gMultiCh_VdecVdisObj.enableVideoFrameExport)
        {
            System_linkDelete(gMultiCh_VdecVdisObj.mergeId);
        }
    
        System_linkDelete(gMultiCh_VdecVdisObj.dupId);
        System_linkDelete(gVdisModuleContext.ipcOutVideoId );
        System_linkDelete(gMultiCh_VdecVdisObj.ipcInVpssId );
    
        /* Print the HWI, SWI and all tasks load */
        /* Reset the accumulated timer ticks */
        MultiCh_prfLoadCalcEnable(FALSE, TRUE, FALSE);
    
    
    #if (tilerEnable == FALSE)
        {
            /* Disable tiler allocator for this usecase
             * for that tiler memory can be reused for
             * non-tiled allocation
             */
            SystemTiler_enableAllocator();
        }
    #endif
    
    }
    
    
    
    
    and
    /*==============================================================================
     * @file:       demo_vdec_vdis.c
     *
     * @brief:      Video capture mcfw function definition.
     *
     * @vers:       0.5.0.0 2011-06
     *
     *==============================================================================
     *
     * Copyright (C) 2011 Texas Instruments Incorporated - http://www.ti.com/
     *
     *  Redistribution and use in source and binary forms, with or without
     *  modification, are permitted provided that the following conditions
     *  are met:
     *
     *    Redistributions of source code must retain the above copyright
     *    notice, this list of conditions and the following disclaimer.
     *
     *    Redistributions in binary form must reproduce the above copyright
     *    notice, this list of conditions and the following disclaimer in the
     *    documentation and/or other materials provided with the
     *    distribution.
     *
     *    Neither the name of Texas Instruments Incorporated nor the names of
     *    its contributors may be used to endorse or promote products derived
     *    from this software without specific prior written permission.
     *
     *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
     *  "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
     *  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
     *  A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
     *  OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
     *  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
     *  LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
     *  DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
     *  THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
     *  OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     *
     */
    #include <sys/time.h>
    #include <demo_vdec_vdis.h>
    
    //#define VDEC_VDIS_ENABLE_IPCFRAMESOUT                 (TRUE)
    
    static Int64 get_current_time_to_msec(void)
    {
        struct timeval tv;
        gettimeofday(&tv, NULL);
    
        return ((Int64)tv.tv_sec*1000 + tv.tv_usec/1000);
    }
    
    Void VdecVdis_start()
    {
        VSYS_PARAMS_S vsysParams;
        VDEC_PARAMS_S vdecParams;
        VDIS_PARAMS_S vdisParams;
        VENC_PARAMS_S vencParams;
        //VDIS_MOSAIC_S sVdMosaicParam;
    
        UInt32 i;
        Bool forceLowCostScale = FALSE;
        UInt32 startChID;
        UInt64 wallTimeBase;
    
    
        VdecVdis_bitsRdInit();
    
        #ifdef VDEC_VDIS_ENABLE_IPCFRAMESOUT
        VdecVdis_ipcFramesCreate();
        #endif
    
        gDemo_info.maxVcapChannels = 0;
        gDemo_info.maxVdisChannels = gVdecVdis_config.fileNum;
        gDemo_info.maxVencChannels = 0;
        gDemo_info.maxVdecChannels = gVdecVdis_config.fileNum;
    
        vdecParams.numChn = gVdecVdis_config.fileNum;
        vdisParams.numChannels = gVdecVdis_config.fileNum;
    
        Vsys_params_init(&vsysParams);
        vsysParams.systemUseCase = VSYS_USECASE_MULTICHN_VDEC_VDIS;
        vsysParams.enableCapture = FALSE;
        vsysParams.enableNsf     = FALSE;
        vsysParams.enableEncode  = TRUE;
        vsysParams.enableDecode  = TRUE;
        vsysParams.enableOsd     = TRUE;
        vsysParams.enableNullSrc = FALSE;
        vsysParams.enableAVsync  = TRUE;
        vsysParams.numDeis       = 0;
    #if defined(TI_814X_BUILD) || defined(TI_8107_BUILD)
        vsysParams.numSwMs       = 2;
        vsysParams.numDisplays   = 2;
    #else
        vsysParams.numSwMs       = 2;
        vsysParams.numDisplays   = 2;
    #endif
    
        printf ("--------------- CHANNEL DETAILS-------------\n");
        printf ("Dec Channels => %d\n", vdecParams.numChn);
        printf ("Disp Channels => %d\n", vdisParams.numChannels);
        printf ("-------------------------------------------\n");
    
        /* Override the context here as needed */
        Vsys_init(&vsysParams);
    
        Vdec_params_init(&vdecParams);
        /* Override the context here as needed */
    
        vdecParams.numChn = gVdecVdis_config.fileNum;
        vdecParams.forceUseDecChannelParams = TRUE;
    
        OSA_assert( vdecParams.numChn <= VDEC_CHN_MAX );
    
        Venc_params_init(&vencParams);
    
        vencParams.numPrimaryChn = 16;
        vencParams.numSecondaryChn = 16;
    
        for (i=0; i < vdecParams.numChn; i++) {
    
            vdecParams.decChannelParams[i].dynamicParam.frameRate = 30; // NOT USED
            vdecParams.decChannelParams[i].dynamicParam.targetBitRate = 2 * 1000 * 1000; // NOT USED
            if (gVdecVdis_config.fileInfo[i].width != 0 && gVdecVdis_config.fileInfo[i].height != 0)
            {
                vdecParams.decChannelParams[i].maxVideoWidth = gVdecVdis_config.fileInfo[i].width;
                vdecParams.decChannelParams[i].maxVideoHeight = gVdecVdis_config.fileInfo[i].height;
            }
            else
            {
                printf(" ERROR: Invalid Decoder width x height !!!\n");
                OSA_assert(0);
            }
    
            /*If the codec type is missing, by default choose h264*/
            if(strlen(gVdecVdis_config.fileInfo[i].codec) == 0)
                strcpy(gVdecVdis_config.fileInfo[i].codec,"h264");
    
            if(strcmp(gVdecVdis_config.fileInfo[i].codec,"h264") == 0)
            {
                vdecParams.decChannelParams[i].isCodec = VDEC_CHN_H264;
                printf("ch[%d], h264\n",i);
            }
            else if(strcmp(gVdecVdis_config.fileInfo[i].codec,"mpeg4") == 0)
            {
                vdecParams.decChannelParams[i].isCodec = VDEC_CHN_MPEG4;
                vdecParams.decChannelParams[i].dynamicParam.frameRate = 30;
                vdecParams.decChannelParams[i].dynamicParam.targetBitRate = 2 * 1000 * 1000;
    
                printf("ch[%d], mpeg4\n",i);
            }
            else if(strcmp(gVdecVdis_config.fileInfo[i].codec,"mjpeg") == 0)
            {
                vdecParams.decChannelParams[i].isCodec = VDEC_CHN_MJPEG;
                vdecParams.decChannelParams[i].dynamicParam.frameRate = 1;
                vdecParams.decChannelParams[i].dynamicParam.targetBitRate = 2 * 1000 * 1000;
                printf("ch[%d], jpeg\n",i);
    
            }
    
            vdecParams.decChannelParams[i].displayDelay = gVdecVdis_config.fileInfo[i].displaydelay;
            vdecParams.decChannelParams[i].numBufPerCh = gVdecVdis_config.fileInfo[i].numbuf;
    
        }
    
        Vdec_init(&vdecParams);
    
        Venc_init(&vencParams);
    
    
        Vdis_params_init(&vdisParams);
        /* Override the context here as needed */
        vdisParams.numChannels = gVdecVdis_config.fileNum;
    
        vdisParams.deviceParams[VDIS_DEV_HDMI].resolution   = DEMO_HD_DISPLAY_DEFAULT_STD;
        /* Since HDCOMP and DVO2 are tied together they must have same resolution */
        vdisParams.deviceParams[VDIS_DEV_HDCOMP].resolution = DEMO_HD_DISPLAY_DEFAULT_STD;
        vdisParams.deviceParams[VDIS_DEV_DVO2].resolution   =
                               vdisParams.deviceParams[VDIS_DEV_HDMI].resolution;
        vdisParams.deviceParams[VDIS_DEV_SD].resolution     = VSYS_STD_NTSC;
    
        Vdis_tiedVencInit(VDIS_DEV_HDCOMP, VDIS_DEV_DVO2, &vdisParams);
    
    
    
    #if defined(TI_814X_BUILD) || defined(TI_8107_BUILD)
        /* set for 2 displays */
        i = 0;
        Demo_swMsGenerateLayout(VDIS_DEV_HDMI, 0, vdecParams.numChn,
                              DEMO_LAYOUT_MODE_4CH,
                              &vdisParams.mosaicParams[VDIS_DEV_HDMI], forceLowCostScale, gDemo_info.Type,
                              vdisParams.deviceParams[VDIS_DEV_HDMI].resolution);
        vdisParams.mosaicParams[VDIS_DEV_HDMI].userSetDefaultSWMLayout = TRUE;
    
        if(vdecParams.numChn < 16)
            startChID = 0;
        else
            startChID = 16;
        i = 1;
        Demo_swMsGenerateLayout(VDIS_DEV_SD, startChID, vdecParams.numChn,
                              DEMO_LAYOUT_MODE_4CH,
                              &vdisParams.mosaicParams[VDIS_DEV_SD], forceLowCostScale, gDemo_info.Type,
                              vdisParams.deviceParams[VDIS_DEV_SD].resolution);
        vdisParams.mosaicParams[VDIS_DEV_SD].userSetDefaultSWMLayout = TRUE;
    #else
        /* set for 3 displays */
        i = 0;
        Demo_swMsGenerateLayout(VDIS_DEV_HDMI, 0, vdecParams.numChn,
                              DEMO_LAYOUT_MODE_4CH_4CH,
                              &vdisParams.mosaicParams[i], forceLowCostScale,
                              gDemo_info.Type,
                              vdisParams.deviceParams[VDIS_DEV_HDMI].resolution);
        vdisParams.mosaicParams[i].userSetDefaultSWMLayout = TRUE;
    
    
        if(vdecParams.numChn < 16)
            startChID = 0;
        else
            startChID = 16;
    /*
        i = 1;
    
        Demo_swMsGenerateLayout(VDIS_DEV_HDCOMP, startChID, vdecParams.numChn,
                              DEMO_LAYOUT_MODE_4CH_4CH,
                              &vdisParams.mosaicParams[i], forceLowCostScale,
                              gDemo_info.Type,
                              vdisParams.deviceParams[VDIS_DEV_HDCOMP].resolution);
        vdisParams.mosaicParams[i].userSetDefaultSWMLayout = TRUE;
    */
    #endif
        Vdis_init(&vdisParams);
    
        wallTimeBase = get_current_time_to_msec();
        wallTimeBase = 0;
        Vdis_setWallTimeBase(wallTimeBase);
    
     	/* Configure display */
    	Vsys_configureDisplay();
    
    #if USE_FBDEV
        grpx_init(GRPX_FORMAT_RGB565);
    #endif
    
        /* Create Link instances and connects compoent blocks */
        Vsys_create();
    
        /* This is done to re-map ch to window mappping when no. of chan are <16 */
    //    if(vdecParams.numChn < 16)
    //    {
    //        status = Vdis_getMosaicParams(1,&sVdMosaicParam);
    //        status = Vdis_setMosaicParams(1,&sVdMosaicParam);
    //    }
    
        /* Start components in reverse order */
    //    Vdis_start();
    //    Venc_start();
        Vdec_start();
        
    
        #ifdef VDEC_VDIS_ENABLE_IPCFRAMESOUT
        VdecVdis_ipcFramesStart();
        #endif
    
        VdecVdis_bitsRdStart();
    
    	//Venc_setInputFrameRate(0, 25);
    }
    
    Void VdecVdis_stop()
    {
        VdecVdis_bitsRdStop();
    
        #ifdef VDEC_VDIS_ENABLE_IPCFRAMESOUT
        VdecVdis_ipcFramesStop();
        #endif
    
        /* Stop components */
        Vdec_stop();
        Vdis_stop();
    
    #if USE_FBDEV
        grpx_exit();
    #endif
    
        Vsys_delete();
    
     	/* De-configure display */
     	Vsys_deConfigureDisplay();
    
    
        /* De-initialize components */
        Vdec_exit();
        Vdis_exit();
        Vsys_exit();
    
        VdecVdis_bitsRdExit();
    
        #ifdef VDEC_VDIS_ENABLE_IPCFRAMESOUT
        VdecVdis_ipcFramesDelete();
        #endif
    
    }
    
    

        the logs :

    .......

     [m3video]  24596: IPC_FRAMES_OUT   : Received 1 framebufs !!!
     [m3video]  24632: IPC_FRAMES_OUT   : Received 1 framebufs !!!
     [m3video]  24664: IPC_FRAMES_OUT   : Received 1 framebufs !!!
     [m3video]  24696: IPC_FRAMES_OUT   : Received 1 framebufs !!!
     [m3video]  24732: IPC_FRAMES_OUT   : Received 1 framebufs !!!
     [m3video]  24764: IPC_FRAMES_OUT   : Received 1 framebufs !!!
     [m3video]  24796: IPC_FRAMES_OUT   : Received 1 framebufs !!!
     [m3video]  24832: IPC_FRAMES_OUT   : Received 1 framebufs !!!
     [m3video]  24864: IPC_FRAMES_OUT   : Received 1 framebufs !!!
     [m3video]  24896: IPC_FRAMES_OUT   : Received 1 framebufs !!!
     [m3video]  24932: IPC_FRAMES_OUT   : Received 1 framebufs !!!
     [m3video]  24964: IPC_FRAMES_OUT   : Received 1 framebufs !!!
     [m3video]  24996: IPC_FRAMES_OUT   : Received 1 framebufs !!!

    .......

    After I can see the video on monitor, the program print the above log only.

    the video dispaly on monitor is right.

    best regards!

    shen

  • I dont see your application receiving bitstream from encoder and freeing it back.Make sure you have a application thread that does

    Venc_getBitstreamBuffer 

    Venc_releaseBitstreamBuffer

     

    Refer example code in  /dvr_rdk/demos/mcfw_api_demos/mcfw_demo/demo_vcap_venc_vdis_bits_wr.c