您的位置:首页 > 其它

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

2015-12-23 15:23 344 查看
一、

在之前的工作基础上,将付雄做的代码加入到我的工程中,还是有些问题需要解决。付雄的函数除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();//

要注意后三个函数的顺序。否则放到前面会出现段错误。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: