成功将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();//
要注意后三个函数的顺序。否则放到前面会出现段错误。
在之前的工作基础上,将付雄做的代码加入到我的工程中,还是有些问题需要解决。付雄的函数除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();//
要注意后三个函数的顺序。否则放到前面会出现段错误。
相关文章推荐
- 有趣的Autolayout示例2-Masonry实现
- Android VideoView简单播放视频
- Java实现HTML转PDF的总结
- <iOS>ARC下需要注意的内存管理
- 进入docker容器之nsenter脚本
- python os模块 常用命令
- 如何去阅读Android的崩溃日志(crash log)和栈轨迹(stack trace)
- 高职组:2、马虎的算式
- Mac必备软件推荐
- ViewPager设置自适应
- 猫眼产品分析
- 集合类说明及区别
- java 多线程的实现
- Java知识二:泛型
- 第二十章 无状态Web应用集成
- 2144: 跳跳棋
- 性能
- set_include_path简叙
- 实用命令行工具详解crontab
- Foundation--NSArray+NSMutableArray