成功将DM8168作为服务器端总结

一、

在之前的工作基础上,将付雄做的代码加入到我的工程中,还是有些问题需要解决。付雄的函数除main函数外都放到demo目录下,直接编译由于4.0编译器的问题会报一些函数类似于没有定义的错误。以前的解决方法是在前面加入include语句包含此函数的C文件,但是这种办法的问题是如果有重复定义的变量就会报很多问题。解决办法是只要在前面重新声明此函数就好。但是要使用形参。

二、

由于LINk的连接需要连续性,获知上下游LINk,单独编译时不能正常运行的,因此需要将付雄的编码LINK移植到我的demo下,我的demo是在解码显示这个usecase下进行的,所以将所有Link移植过来,通过DUPlink一份去显示一份去编码。最终解决问题。Link代码如下,有时间把连接框图补上。

/*******************************************************************************

 *                                                                             *

 *Copyright (c) 2009 Texas Instruments Incorporated - http://www.ti.com/      *

 *                        ALL RIGHTSRESERVED                                 *

 *                                                                             *

 ******************************************************************************/

/* ========================= 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)

                          |

                         DUP

               (48CH)    | |   (48CH)

        +---------------+ +-------------+

        |                               |

        |                               |

     SW Mosaic                       SWMosaic

    (SC5 SC1 YUV422I)               (SC4 SC2 YUV422I)

       |  |                             |  |

       |  |                             |  |

      (DDR)(422I)                     (DDR)(422I)

         |                               |

 GRPX0   |                      GRPX1    |

    |    |                          |    |

     On-Chip HDMI                    Off-Chip HDMI

      1080p60                       1080p60

*/

 

/* ========================= TI_814X_BUILDcase ==============================

                          |

                        IPC_BITS_OUT_A8(BitStream)

                          |

                        IPC_BITS_IN (Video)

                          |

                        DEC (YUV420SP)

                          |

                        IPC_OUT (Video)

                          |

                        IPC_IN (Vpss)

                          |   (16 channels)

                        MP_SCLR (Vpss)

                          |

                         DUP

               (16CH)    | |   (16CH)

        +---------------+ +-------------+

        |                               |

        |                               |

     SW Mosaic                       SWMosaic

    (SC5 YUV422I)                (SC5YUV422I)

       |  |                             |  |

       |  |                             | |

      (DDR)(422I)                     (DDR)(422I)

         |                               |

 GRPX0   |----Tied---|                   |

    |    |           |                   |

    On-Chip HDMI  Off-Chip HDMI         SDTV

      1080p60       1080p60

*/

 

#include"mcfw/src_linux/mcfw_api/usecases/multich_common.h"

#include"mcfw/src_linux/mcfw_api/usecases/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)

#defineMULTICH_VDEC_VDIS_IPCFRAMEEXPORT_NUM_CHANNELS       (16)

#define MULTICH_VDEC_VDIS_IPCFRAMEEXPORT_FRAME_WIDTH        (720)

#defineMULTICH_VDEC_VDIS_IPCFRAMEEXPORT_FRAME_HEIGHT       (480)

#define MULTICH_NUM_SWMS_MAX_BUFFERS                        (7)

 

#define    MAX_BUFFERING_QUEUE_LEN_PER_CH          (50)

 

#define    BIT_BUF_LENGTH_LIMIT_FACTOR_CIF          (10)

#define    BIT_BUF_LENGTH_LIMIT_FACTOR_SD           (6)

#define    BIT_BUF_LENGTH_LIMIT_FACTOR_HD           (5)

#define    BIT_BUF_LENGTH_LIMIT_FACTOR_720P         (4)

#define    BIT_BUF_LENGTH_LIMIT_FACTOR_HMP           (4)

 

 

#if defined(TI_814X_BUILD) ||defined(TI_8107_BUILD)

static SystemVideo_Ivahd2ChMap_TblsystemVid_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},

   },

};

#define NUM_STATIC_CHANNELS   (6)

#else

/*

Max channels per IVA-HD MUST be < 16,

i.e total number of channels for decode canbe 48.

 

Example CH allocation for SD+HD,

 

32CH SD   :  0 to 31

 6CH1080P : 32 to 38

10CH 720P : 39 to 48

 

*/

 

static SystemVideo_Ivahd2ChMap_TblsystemVid_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

                     },

   },

};

#define NUM_STATIC_CHANNELS   (8)

#endif

 

typedef struct {

 

   UInt32 dupId[2];//yl_add [2]

   UInt32 ipcOutVideoId;

   UInt32 ipcInVpssId;

   UInt32 mergeId;

   Bool   enableVideoFrameExport;

   AvsyncLink_LinkSynchConfigParams  avsyncCfg[VDIS_DEV_MAX];

   UInt32 mpSclrId;

 

} MultiCh_VdecVdisObj;

/*set video out to enc and PC VLC*/

typedef struct {

 

 

   UInt32 ipcOutVpssId;

   UInt32 ipcInVideoId;

 

} MultiCh_VcapVencVdisObj;

MultiCh_VcapVencVdisObjgMultiCh_VcapVencVdisObj;

MultiCh_VdecVdisObj gMultiCh_VdecVdisObj;

 

static VoidMultiCh_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

Voidmulich_vdec_vdis_set_avsync_vidque_prm(Avsync_SynchConfigParams *queCfg,

                                            Intchnum,

                                           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

Voidmulich_vdec_vdis_set_avsync_prm(AvsyncLink_LinkSynchConfigParams *avsyncPrm,

                                     UInt32swMsIdx,

                                     VDIS_DEVvdDevId)

{

   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;

   DupLink_CreateParams       dupPrm[2];

//      DupLink_CreateParams        dupPrm;

   EncLink_CreateParams                                        encPrm;//

         EncLink_CreateParams                                        *pEncPrm;//todefine this because fuxiong's program is done

   IpcBitsOutLinkRTOS_CreateParams ipcBitsOutVideoPrm;//yl_add

   IpcBitsInLinkHLOS_CreateParams ipcBitsInHostPrm[1];//yl_add

 

   Uint32                         encId;//

   static SwMsLink_CreateParams      swMsPrm[VDIS_DEV_MAX];

   DisplayLink_CreateParams   displayPrm[VDIS_DEV_MAX];

   IpcFramesOutLinkHLOS_CreateParams ipcFramesOutHostPrm;

   IpcFramesInLinkRTOS_CreateParams  ipcFramesInVpssFromHostPrm;

   MergeLink_CreateParams             mergePrm;

   MpSclrLink_CreateParams           mpSclrPrm;

   IpcLink_CreateParams           ipcOutVpssPrm;

   IpcLink_CreateParams           ipcInVideoPrm;

   UInt32 i;

   UInt32 enableGrpx;

   Bool tilerEnable;

   Bool enableVideoFrameExport;

 

   MULTICH_INIT_STRUCT(IpcLink_CreateParams ,ipcOutVpssPrm);//yl_add

   MULTICH_INIT_STRUCT(IpcLink_CreateParams ,ipcInVideoPrm);//yl_add

   MULTICH_INIT_STRUCT(IpcBitsOutLinkRTOS_CreateParams,ipcBitsOutVideoPrm);//yl_add

   MULTICH_INIT_STRUCT(IpcBitsInLinkHLOS_CreateParams,ipcBitsInHostPrm[0]);//yl_add

   //MULTICH_INIT_STRUCT(IpcBitsInLinkHLOS_CreateParams,ipcBitsInHostPrm[1]);//yl_add

   MULTICH_INIT_STRUCT(IpcLink_CreateParams,ipcInVpssPrm);

   MULTICH_INIT_STRUCT(IpcLink_CreateParams,ipcOutVideoPrm);

   MULTICH_INIT_STRUCT(IpcBitsOutLinkHLOS_CreateParams,ipcBitsOutHostPrm);

   MULTICH_INIT_STRUCT(IpcBitsInLinkRTOS_CreateParams,ipcBitsInVideoPrm);

   MULTICH_INIT_STRUCT(EncLink_CreateParams, encPrm);

   MULTICH_INIT_STRUCT(DecLink_CreateParams, decPrm);

   MULTICH_INIT_STRUCT(IpcFramesOutLinkHLOS_CreateParams,ipcFramesOutHostPrm);

   MULTICH_INIT_STRUCT(IpcFramesInLinkRTOS_CreateParams  ,ipcFramesInVpssFromHostPrm);

   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(MpSclrLink_CreateParams, mpSclrPrm);

 

   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 defined(TI_814X_BUILD) ||defined(TI_8107_BUILD)

   enableGrpx   = FALSE;

#else

   enableGrpx   = TRUE;

#endif

 

   tilerEnable  = FALSE;

 

   if (tilerEnable == FALSE)

    {

       /* Disable tiler allocator for this usecase

        * for that tiler memory can be reused for

        * non-tiled allocation

        */

       SystemTiler_disableAllocator();

    }

   else

    {

       SystemTiler_BucketGeometry_t bucketRes;

 

       bucketRes.bucketWidth  =SYSTEM_TILER_ALLOCATOR_BUCKET_WIDTH_DEFAULT;

       bucketRes.bucketHeight = SYSTEM_TILER_ALLOCATOR_BUCKET_HEIGHT_DEFAULT;

       bucketRes.minResolution = SYSTEM_TILER_RESOLUTION_CIF;

       bucketRes.setSingleBucketGeometry = FALSE;

       SystemTiler_setBucketGeometry(&bucketRes);

    }

 

   enableVideoFrameExport = FALSE;

 

   gMultiCh_VcapVencVdisObj.ipcOutVpssId                       =SYSTEM_VPSS_LINK_ID_IPC_OUT_M3_0;

   gMultiCh_VcapVencVdisObj.ipcInVideoId                       =SYSTEM_VIDEO_LINK_ID_IPC_IN_M3_0;

 

   encId = SYSTEM_LINK_ID_VENC_0;

   gVdecModuleContext.ipcBitsOutHLOSId =SYSTEM_HOST_LINK_ID_IPC_BITS_OUT_0;

   gVdecModuleContext.ipcBitsInRTOSId = SYSTEM_VIDEO_LINK_ID_IPC_BITS_IN_0;

   gVencModuleContext.ipcBitsOutRTOSId =SYSTEM_VIDEO_LINK_ID_IPC_BITS_OUT_0;//yl_add

   gVencModuleContext.ipcBitsInHLOSId  = SYSTEM_HOST_LINK_ID_IPC_BITS_IN_0;//yl_add

   gVdecModuleContext.decId           = SYSTEM_LINK_ID_VDEC_0;

 

   gMultiCh_VdecVdisObj.ipcOutVideoId = SYSTEM_VIDEO_LINK_ID_IPC_OUT_M3_0;

   gMultiCh_VdecVdisObj.ipcInVpssId   = SYSTEM_VPSS_LINK_ID_IPC_IN_M3_0;

   gMultiCh_VdecVdisObj.dupId[1]         = SYSTEM_VPSS_LINK_ID_DUP_1;

   gMultiCh_VdecVdisObj.dupId[0]         = SYSTEM_VPSS_LINK_ID_DUP_0;

   gMultiCh_VdecVdisObj.mpSclrId      = SYSTEM_LINK_ID_MP_SCLR_INST_0;

   gVdisModuleContext.mpSclrId        = SYSTEM_LINK_ID_MP_SCLR_INST_0;

   gVdisModuleContext.swMsId[0]       = SYSTEM_LINK_ID_SW_MS_MULTI_INST_0;

 

   gVdisModuleContext.displayId[0]    = SYSTEM_LINK_ID_DISPLAY_0; // ON AND OFF CHIP HDMI

 

   if (gVsysModuleContext.vsysConfig.numDisplays > 1)

    {

       gVdisModuleContext.swMsId[1]       = SYSTEM_LINK_ID_SW_MS_MULTI_INST_1;

#if defined(TI_814X_BUILD) ||defined(TI_8107_BUILD)

       gVdisModuleContext.displayId[1]    = SYSTEM_LINK_ID_DISPLAY_2; // SDTV

#else

       gVdisModuleContext.displayId[1]    = SYSTEM_LINK_ID_DISPLAY_1; // OFF CHIP HDMI

#endif

    }

 

   if (enableVideoFrameExport)

    {

       gMultiCh_VdecVdisObj.mergeId                 = SYSTEM_VPSS_LINK_ID_MERGE_0;

       gVdisModuleContext.ipcFramesOutHostId        = SYSTEM_HOST_LINK_ID_IPC_FRAMES_OUT_0;

       gVdisModuleContext.ipcFramesInVpssFromHostId = SYSTEM_VPSS_LINK_ID_IPC_FRAMES_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;

 

   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.maxQueueDepth[i] = MAX_BUFFERING_QUEUE_LEN_PER_CH;

       ipcBitsOutHostPrm.chMaxReqBufSize[i] =

               (ipcBitsOutHostPrm.inQueInfo.chInfo[i].width *ipcBitsOutHostPrm.inQueInfo.chInfo[i].height);

       ipcBitsOutHostPrm.totalBitStreamBufferSize [i] =

               (ipcBitsOutHostPrm.chMaxReqBufSize[i] * BIT_BUF_LENGTH_LIMIT_FACTOR_HD);

 

    }

 

   ipcBitsInVideoPrm.baseCreateParams.inQueParams.prevLinkId    = gVdecModuleContext.ipcBitsOutHLOSId;

   ipcBitsInVideoPrm.baseCreateParams.inQueParams.prevLinkQueId = 0;

   ipcBitsInVideoPrm.baseCreateParams.outQueParams[0].nextLink  = gVdecModuleContext.decId;

  //ipcBitsInVideoPrm.baseCreateParams.outQueParams[0].nextLink  = gMultiCh_VdecVdisObj.dupId[1];

   //ipcBitsInVideoPrm.baseCreateParams.outQueParams[1].nextLink  = encId;//yl_add

   ipcBitsInVideoPrm.baseCreateParams.noNotifyMode              = TRUE;

   ipcBitsInVideoPrm.baseCreateParams.notifyNextLink            = TRUE;

   ipcBitsInVideoPrm.baseCreateParams.notifyPrevLink            = FALSE;

   ipcBitsInVideoPrm.baseCreateParams.numOutQue                 = 1;//yl_add

 

   /*dupPrm[1].inQueParams.prevLinkId         = gVdecModuleContext.ipcBitsInRTOSId;

   dupPrm[1].inQueParams.prevLinkQueId     = 0;

   dupPrm[1].numOutQue                     = 1;

   dupPrm[1].outQueParams[0].nextLink      = gVdecModuleContext.decId;

   //dupPrm.outQueParams[1].nextLink       =SYSTEM_LINK_ID_INVALID;

   dupPrm[1].notifyNextLink                = TRUE;*/

   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;

       if (gVdecModuleContext.vdecConfig.decChannelParams[i].fieldPicture)

       {

           OSA_printf("MULTICH_VDEC_VDIS:INFO ChId[%d] configured for fieldpicture\n",i);

           decPrm.chCreateParams[i].processCallLevel   = VDEC_FIELDLEVELPROCESSCALL;

       }

       else

       {

           decPrm.chCreateParams[i].processCallLevel   = VDEC_FRAMELEVELPROCESSCALL;

       }

       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;

       if (FALSE == tilerEnable)

       {

                decPrm.chCreateParams[i].tilerEnable= FALSE;

       }

       else

       {

                decPrm.chCreateParams[i].tilerEnable= gVdecModuleContext.vdecConfig.decChannelParams[i].tilerEnable;

       }

    }

 

   decPrm.inQueParams.prevLinkId      = gVdecModuleContext.ipcBitsInRTOSId;

  //decPrm.inQueParams.prevLinkId      = gMultiCh_VdecVdisObj.dupId[1];//yl_add

   decPrm.inQueParams.prevLinkQueId   = 0;

   decPrm.outQueParams.nextLink       = gMultiCh_VdecVdisObj.ipcOutVideoId;

 

   ipcOutVideoPrm.inQueParams.prevLinkId   = gVdecModuleContext.decId;

   ipcOutVideoPrm.inQueParams.prevLinkQueId = 0;

   ipcOutVideoPrm.outQueParams[0].nextLink     = gMultiCh_VdecVdisObj.ipcInVpssId;

   ipcOutVideoPrm.notifyNextLink           = TRUE;

   ipcOutVideoPrm.notifyPrevLink           = TRUE;

   ipcOutVideoPrm.numOutQue                = 1;

 

   ipcInVpssPrm.inQueParams.prevLinkId   = gMultiCh_VdecVdisObj.ipcOutVideoId;

   ipcInVpssPrm.inQueParams.prevLinkQueId = 0;

   ipcInVpssPrm.notifyNextLink           = TRUE;

   ipcInVpssPrm.notifyPrevLink           = TRUE;

   ipcInVpssPrm.numOutQue                = 1;

 

   if (enableVideoFrameExport)

    {

       ipcFramesOutHostPrm.baseCreateParams.noNotifyMode = TRUE;

       ipcFramesOutHostPrm.baseCreateParams.notifyNextLink = FALSE;

       ipcFramesOutHostPrm.baseCreateParams.notifyPrevLink = FALSE;

       ipcFramesOutHostPrm.baseCreateParams.inQueParams.prevLinkId =SYSTEM_LINK_ID_INVALID;

       ipcFramesOutHostPrm.baseCreateParams.inQueParams.prevLinkQueId = 0;

       ipcFramesOutHostPrm.baseCreateParams.numOutQue = 1;

       ipcFramesOutHostPrm.baseCreateParams.outQueParams[0].nextLink =gVdisModuleContext.ipcFramesInVpssFromHostId;

       MultiCh_setIpcFramesOutInQueInfo(&ipcFramesOutHostPrm.inQueInfo);

 

       ipcFramesInVpssFromHostPrm.baseCreateParams.noNotifyMode = TRUE;

       ipcFramesInVpssFromHostPrm.baseCreateParams.notifyNextLink = TRUE;

       ipcFramesInVpssFromHostPrm.baseCreateParams.notifyPrevLink = FALSE;

       ipcFramesInVpssFromHostPrm.baseCreateParams.inQueParams.prevLinkId =gVdisModuleContext.ipcFramesOutHostId;

       ipcFramesInVpssFromHostPrm.baseCreateParams.inQueParams.prevLinkQueId =0;

       ipcFramesInVpssFromHostPrm.baseCreateParams.numOutQue = 1;

       ipcFramesInVpssFromHostPrm.baseCreateParams.outQueParams[0].nextLink =gMultiCh_VdecVdisObj.mergeId;

 

 

       ipcInVpssPrm.outQueParams[0].nextLink    = gMultiCh_VdecVdisObj.mergeId;

 

       mergePrm.numInQue                     = 2;

       mergePrm.inQueParams[0].prevLinkId   = gMultiCh_VdecVdisObj.ipcInVpssId;

       mergePrm.inQueParams[0].prevLinkQueId = 0;

       mergePrm.inQueParams[1].prevLinkId   = gVdisModuleContext.ipcFramesInVpssFromHostId;

       mergePrm.inQueParams[1].prevLinkQueId = 0;

 

       mergePrm.outQueParams.nextLink       = gMultiCh_VdecVdisObj.mpSclrId;

       mergePrm.notifyNextLink              = TRUE;

       mpSclrPrm.inQueParams.prevLinkId     = gMultiCh_VdecVdisObj.mergeId;

    }

   else

    {

       mpSclrPrm.inQueParams.prevLinkId       = gMultiCh_VdecVdisObj.ipcInVpssId;

       ipcInVpssPrm.outQueParams[0].nextLink  = gMultiCh_VdecVdisObj.mpSclrId;

 

    }

#if defined(TI_814X_BUILD) ||defined(TI_8107_BUILD)

   mpSclrPrm.pathId = MP_SCLR_LINK_SEC0_SC3_VIP0;

#else

   mpSclrPrm.pathId = MP_SCLR_LINK_SEC1_SC4_VIP1;

#endif

 

   mpSclrPrm.numCh = 4;

   mpSclrPrm.enableLineSkip = FALSE;

 

   mpSclrPrm.outQueParams.nextLink      = gMultiCh_VdecVdisObj.dupId[0];

   dupPrm[0].inQueParams.prevLinkId        = gMultiCh_VdecVdisObj.mpSclrId;

 

   dupPrm[0].inQueParams.prevLinkQueId     = 0;

   dupPrm[0].numOutQue                     = 2;//gVsysModuleContext.vsysConfig.numDisplays;

   dupPrm[0].outQueParams[0].nextLink      = gVdisModuleContext.swMsId[0];

   //dupPrm[0].outQueParams[1].nextLink       = gVdisModuleContext.swMsId[1];

   dupPrm[0].outQueParams[1].nextLink      = gMultiCh_VcapVencVdisObj.ipcOutVpssId;//yl_add

   dupPrm[0].notifyNextLink                = TRUE;

         //IpcLink_CreateParams_Init(&ipcOutVpssPrm);

         ipcOutVpssPrm.inQueParams.prevLinkId= gMultiCh_VdecVdisObj.dupId[0];//yl_add

         ipcOutVpssPrm.inQueParams.prevLinkQueId= 1;

         //ipcOutVpssPrm.inQueParams.prevLinkQueId= 0;

         ipcOutVpssPrm.numOutQue= 1;

         ipcOutVpssPrm.outQueParams[0].nextLink= gMultiCh_VcapVencVdisObj.ipcInVideoId;

         ipcOutVpssPrm.notifyNextLink= TRUE;

         ipcOutVpssPrm.notifyPrevLink= TRUE;

         ipcOutVpssPrm.noNotifyMode= FALSE;

         //IpcLink_CreateParams_Init(&ipcInVideoPrm);

   ipcInVideoPrm.inQueParams.prevLinkId   =gMultiCh_VcapVencVdisObj.ipcOutVpssId;

   ipcInVideoPrm.inQueParams.prevLinkQueId = 0;

   ipcInVideoPrm.numOutQue                = 1;

   ipcInVideoPrm.outQueParams[0].nextLink     = encId;

   ipcInVideoPrm.notifyNextLink           = TRUE;

   ipcInVideoPrm.notifyPrevLink           = FALSE;

   ipcInVideoPrm.noNotifyMode             = TRUE;

 

 

      pEncPrm = &(encPrm);

         for(i=0;i<8;i++)

         {

                   pEncPrm->chCreateParams[i].format     = IVIDEO_H264HP;

                   pEncPrm->chCreateParams[i].profile      = IH264_HIGH_PROFILE;

                   pEncPrm->chCreateParams[i].dataLayout= IVIDEO_FIELD_SEPARATED;

                   pEncPrm->chCreateParams[i].fieldMergeEncodeEnable  = FALSE;

                   pEncPrm->chCreateParams[i].defaultDynamicParams.intraFrameInterval= 150;

                   pEncPrm->chCreateParams[i].encodingPreset= XDM_DEFAULT;

                   pEncPrm->chCreateParams[i].enableAnalyticinfo= 0;

                   pEncPrm->chCreateParams[i].rateControlPreset= IVIDEO_STORAGE;

                   pEncPrm->chCreateParams[i].defaultDynamicParams.inputFrameRate= 30;//video_param.nFrameRate;

                   pEncPrm->chCreateParams[i].defaultDynamicParams.targetBitRate= 1*1000*1000;//20000 * 1000; //video_param.sBitrate*1000;

                   pEncPrm->chCreateParams[i].defaultDynamicParams.interFrameInterval= 1;

                   pEncPrm->chCreateParams[i].defaultDynamicParams.mvAccuracy= IVIDENC2_MOTIONVECTOR_QUARTERPEL;

         }

 encPrm.inQueParams.prevLinkId   = gMultiCh_VcapVencVdisObj.ipcInVideoId;

       encPrm.inQueParams.prevLinkQueId= 0;

       encPrm.outQueParams.nextLink    =gVencModuleContext.ipcBitsOutRTOSId;

        

   ipcBitsOutVideoPrm.baseCreateParams.inQueParams.prevLinkId    = 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;

   ipcBitsInHostPrm[0].baseCreateParams.numOutQue                 = 1;

   ipcBitsInHostPrm[0].baseCreateParams.outQueParams[0].nextLink   = SYSTEM_LINK_ID_INVALID;

  MultiCh_ipcBitsInitCreateParams_BitsInHLOS(&ipcBitsInHostPrm[0]);

 

 

 

#if defined(TI_814X_BUILD) ||defined(TI_8107_BUILD)

 

   swMsPrm[0].numSwMsInst = 1;

   swMsPrm[0].swMsInstId[0]        =SYSTEM_SW_MS_SC_INST_DEIHQ_SC_NO_DEI;

 

   swMsPrm[0].swMsInstStartWin[0]  =0;

    swMsPrm[0].swMsInstStartWin[1]  = 10;

 

   swMsPrm[1].numSwMsInst = 1;

   swMsPrm[1].swMsInstId[0]        =SYSTEM_SW_MS_SC_INST_DEI_SC_NO_DEI;

 

   swMsPrm[1].swMsInstStartWin[0]  =0;

   swMsPrm[1].swMsInstStartWin[1]  =10;

 

   swMsPrm[0].enableProcessTieWithDisplay = TRUE;

   swMsPrm[1].enableProcessTieWithDisplay = FALSE;

 

   /* We do not require dual output, this free up SC3 scalar */

   swMsPrm[0].includeVipScInDrvPath = FALSE;

   swMsPrm[1].includeVipScInDrvPath = FALSE;

#else

   swMsPrm[0].swMsInstId[0]        =SYSTEM_SW_MS_SC_INST_DEI_SC_NO_DEI;

   swMsPrm[0].swMsInstId[1]        =SYSTEM_SW_MS_SC_INST_VIP1_SC;

 

 //  swMsPrm[1].swMsInstId[0]        = SYSTEM_SW_MS_SC_INST_DEIHQ_SC_NO_DEI;

 //  swMsPrm[1].swMsInstId[1]        = SYSTEM_SW_MS_SC_INST_VIP0_SC;

 

   swMsPrm[0].numSwMsInst          =2;

 

   swMsPrm[0].swMsInstStartWin[0]  =0;

   swMsPrm[0].swMsInstStartWin[1]  =16;

 

   //swMsPrm[1].numSwMsInst          =swMsPrm[0].numSwMsInst;

   //swMsPrm[1].swMsInstStartWin[0]  =swMsPrm[0].swMsInstStartWin[0];

   //swMsPrm[1].swMsInstStartWin[1]  =swMsPrm[0].swMsInstStartWin[1];

 

   swMsPrm[0].enableProcessTieWithDisplay = TRUE;

   //swMsPrm[1].enableProcessTieWithDisplay = TRUE;

 

#endif

   //for(i=0; i<gVsysModuleContext.vsysConfig.numDisplays; i++)

         for(i=0;i<1; i++)

    {

       VDIS_DEV vdDevId = VDIS_DEV_HDMI;

 

       swMsPrm[i].inQueParams.prevLinkId    = gMultiCh_VdecVdisObj.dupId[0];

       swMsPrm[i].inQueParams.prevLinkQueId = i;

       swMsPrm[i].outQueParams.nextLink     = gVdisModuleContext.displayId[i];

       swMsPrm[i].numOutBuf                = MULTICH_NUM_SWMS_MAX_BUFFERS;

 

       /* Disable inQue drop at SwMs as input may arrive very fast inVDEC->VDIS use case */

       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

       }

       /* low cost line skip mode of scaling can be used, when tiler is off */

       if(tilerEnable)

           swMsPrm[i].lineSkipMode          = FALSE;

       else

           swMsPrm[i].lineSkipMode          = TRUE;

 

       swMsPrm[i].enableLayoutGridDraw =gVdisModuleContext.vdisConfig.enableLayoutGridDraw;

 

       MultiCh_swMsGetDefaultLayoutPrm(vdDevId, &swMsPrm[i], FALSE);    /* both from 0-16 chnl */

 

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

    }

 

    System_linkCreate(gVdecModuleContext.ipcBitsOutHLOSId,&ipcBitsOutHostPrm,sizeof(ipcBitsOutHostPrm));

   System_linkCreate(gVdecModuleContext.ipcBitsInRTOSId,&ipcBitsInVideoPrm,sizeof(ipcBitsInVideoPrm));

   //System_linkCreate(gMultiCh_VdecVdisObj.dupId[1]     , &dupPrm[1]    , sizeof(dupPrm[1]));//yl_add

   System_linkCreate(gVdecModuleContext.decId, &decPrm,sizeof(decPrm));

 

   System_linkCreate(gMultiCh_VdecVdisObj.ipcOutVideoId,&ipcOutVideoPrm, sizeof(ipcOutVideoPrm));

   System_linkCreate(gMultiCh_VdecVdisObj.ipcInVpssId  , &ipcInVpssPrm, sizeof(ipcInVpssPrm));

 

   if (enableVideoFrameExport)

    {

       System_linkCreate(gVdisModuleContext.ipcFramesOutHostId     , &ipcFramesOutHostPrm    , sizeof(ipcFramesOutHostPrm));

       System_linkCreate(gVdisModuleContext.ipcFramesInVpssFromHostId     , &ipcFramesInVpssFromHostPrm    , sizeof(ipcFramesInVpssFromHostPrm));

       System_linkCreate(gMultiCh_VdecVdisObj.mergeId,&mergePrm,sizeof(mergePrm));

    }

 

   System_linkCreate(gMultiCh_VdecVdisObj.mpSclrId, &mpSclrPrm,sizeof(mpSclrPrm));

   System_linkCreate(gMultiCh_VdecVdisObj.dupId[0]     , &dupPrm[0]    , sizeof(dupPrm[0]));

   System_linkCreate(gMultiCh_VcapVencVdisObj.ipcOutVpssId ,&ipcOutVpssPrm , sizeof(ipcOutVpssPrm) );

   System_linkCreate(gMultiCh_VcapVencVdisObj.ipcInVideoId ,&ipcInVideoPrm , sizeof(ipcInVideoPrm) );

 

   System_linkCreate(encId, &encPrm, sizeof(encPrm));

   System_linkCreate(gVencModuleContext.ipcBitsOutRTOSId,&ipcBitsOutVideoPrm, sizeof(ipcBitsOutVideoPrm));

   System_linkCreate(gVencModuleContext.ipcBitsInHLOSId,&ipcBitsInHostPrm[0], sizeof(ipcBitsInHostPrm[0]));

 

   //for(i=0; i<gVsysModuleContext.vsysConfig.numDisplays; i++)

for(i=0; i<1; i++)

       System_linkCreate(gVdisModuleContext.swMsId[i]  , &swMsPrm[i], sizeof(swMsPrm[i]));

 

   //for(i=0; i<gVsysModuleContext.vsysConfig.numDisplays; i++)

for(i=0; i<1; i++)

       System_linkCreate(gVdisModuleContext.displayId[i], &displayPrm[i],sizeof(displayPrm[i]));

 

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

{

    Bool tilerEnable;

 

   tilerEnable  = FALSE;

 

   /* delete can be done in any order */

   Vdec_delete();

   Vdis_delete();

 

   if (gMultiCh_VdecVdisObj.enableVideoFrameExport)

    {

       System_linkDelete(gMultiCh_VdecVdisObj.mergeId);

    }

 

    System_linkDelete(gMultiCh_VdecVdisObj.mpSclrId);

   System_linkDelete(gMultiCh_VdecVdisObj.dupId[0]);

//System_linkDelete(gMultiCh_VdecVdisObj.dupId[1]);

   System_linkDelete(gMultiCh_VdecVdisObj.ipcOutVideoId );

   System_linkDelete(gMultiCh_VdecVdisObj.ipcInVpssId );

 

   /* Print the HWI, SWI and all tasks load */

   /* Reset the accumulated timer ticks */

   MultiCh_prfLoadCalcEnable(FALSE, TRUE, FALSE);

 

 

   if (tilerEnable == FALSE)

    {

       /* Disable tiler allocator for this usecase

        * for that tiler memory can be reused for

        * non-tiled allocation

        */

       SystemTiler_enableAllocator();

    }

   else

    {

       SystemTiler_BucketGeometry_t bucketRes;

 

       bucketRes.minResolution = SYSTEM_TILER_RESOLUTION_CIF;

       bucketRes.setSingleBucketGeometry = TRUE;

       SystemTiler_setBucketGeometry(&bucketRes);

    }

 

}

三、这里创建了LINK的链路,eightchan.c里面自然要屏蔽掉,只留下发送RTP包的程序。

四、demo里面  

Venc_start();  

   Vdis_start();

   Vdec_start();

  RtspServerThreadCreate();//yinlei_add 2015-12-4

   OutputStreamThreadCreate();

         EightChan_LinkCreate();//

要注意后三个函数的顺序。否则放到前面会出现段错误。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值