Hi Badri,
Thanks for the answer. But mid Aug is too late.
I want to display interlaced 60 fields on the dispaly. Do you have any suggestion for me?
Please see my source code below:
{
IpcFramesOutLinkHLOS_CreateParams ipcFramesOutHostPrm;
IpcFramesInLinkRTOS_CreateParams ipcFramesInVideoPrm;
EncLink_CreateParams encPrm;
IpcBitsOutLinkRTOS_CreateParams ipcBitsOutVideoPrm;
IpcBitsInLinkHLOS_CreateParams ipcBitsInHostPrm;
IpcBitsOutLinkHLOS_CreateParams ipcBitsOutHostPrm;
IpcBitsInLinkRTOS_CreateParams ipcBitsInVideoPrm;
DecLink_CreateParams decPrm;
IpcLink_CreateParams ipcOutVideoPrm;
IpcLink_CreateParams ipcInVpssPrm;
static SwMsLink_CreateParams swMsPrm[VDIS_DEV_MAX];
DisplayLink_CreateParams displayPrm[VDIS_DEV_MAX];
UInt32 enableGrpx;
Bool tilerEnable;
Int i, j;
UInt32 ipcFramesInVideoId, ipcFramesOutHostId;
UInt32 ipcBitsOutVideoId, ipcBitsInHostId;
Int32 FrameWidth, FrameHeight, FrameRate;
Venc_get_resolution(&FrameWidth,&FrameHeight,&FrameRate);
if( (FrameWidth > 1920) || (FrameHeight > 1080) || (0 == FrameWidth) || (0 == FrameHeight) )
{
OSA_printf("ERROR: initVIDFrameBufs: invalid width/height: %d %d\n",FrameWidth,FrameHeight);
return;
}
MULTICH_INIT_STRUCT(IpcFramesOutLinkHLOS_CreateParams,ipcFramesOutHostPrm);
MULTICH_INIT_STRUCT(IpcFramesInLinkRTOS_CreateParams,ipcFramesInVideoPrm);
MULTICH_INIT_STRUCT(EncLink_CreateParams, encPrm);
MULTICH_INIT_STRUCT(IpcBitsOutLinkRTOS_CreateParams,ipcBitsOutVideoPrm);
MULTICH_INIT_STRUCT(IpcBitsInLinkHLOS_CreateParams,ipcBitsInHostPrm);
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(DecLink_CreateParams, decPrm);
for (i = 0; i < VDIS_DEV_MAX;i++)
{
MULTICH_INIT_STRUCT(DisplayLink_CreateParams,displayPrm[i]);
MULTICH_INIT_STRUCT(SwMsLink_CreateParams ,swMsPrm[i]);
}
ipcFramesOutHostId = SYSTEM_HOST_LINK_ID_IPC_FRAMES_OUT_0;
ipcFramesInVideoId = SYSTEM_VIDEO_LINK_ID_IPC_FRAMES_IN_0;
ipcBitsOutVideoId = SYSTEM_VIDEO_LINK_ID_IPC_BITS_OUT_0;
ipcBitsInHostId = SYSTEM_HOST_LINK_ID_IPC_BITS_IN_0;
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
);
gVencModuleContext.encId = SYSTEM_LINK_ID_VENC_0;
gVencModuleContext.ipcBitsInHLOSId = SYSTEM_HOST_LINK_ID_IPC_BITS_IN_0;
gVencModuleContext.ipcBitsOutRTOSId = SYSTEM_VIDEO_LINK_ID_IPC_BITS_OUT_0;
gVencModuleContext.ipcM3OutId = SYSTEM_HOST_LINK_ID_IPC_FRAMES_OUT_0;
gVencModuleContext.ipcM3InId = SYSTEM_VIDEO_LINK_ID_IPC_FRAMES_IN_0;
#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();
}
/**
* IPC Frames OUT (A8)
* */
ipcFramesOutHostPrm.baseCreateParams.outQueParams[0].nextLink = ipcFramesInVideoId;
ipcFramesOutHostPrm.baseCreateParams.notifyNextLink = TRUE;
ipcFramesOutHostPrm.baseCreateParams.notifyPrevLink = TRUE;
ipcFramesOutHostPrm.baseCreateParams.noNotifyMode = FALSE;
ipcFramesOutHostPrm.baseCreateParams.numOutQue = 1;
ipcFramesOutHostPrm.baseCreateParams.inQueParams.prevLinkId = SYSTEM_LINK_ID_INVALID;
ipcFramesOutHostPrm.inQueInfo.numCh = gVencModuleContext.vencConfig.numPrimaryChn;
for (i=0; i<gVencModuleContext.vencConfig.numPrimaryChn; i++)
{
ipcFramesOutHostPrm.inQueInfo.chInfo[i].width = FrameWidth; //CH_WIDTH;
#ifdef INTERLACED_ENCODING
ipcFramesOutHostPrm.inQueInfo.chInfo[i].height = FrameHeight/2;
#else
ipcFramesOutHostPrm.inQueInfo.chInfo[i].height = FrameHeight;
#endif
ipcFramesOutHostPrm.inQueInfo.chInfo[i].bufType = 0; // NOT USED
ipcFramesOutHostPrm.inQueInfo.chInfo[i].codingformat = 0; // NOT USED
ipcFramesOutHostPrm.inQueInfo.chInfo[i].dataFormat = SYSTEM_DF_YUV420SP_UV; //0x07; //FVID2_DF_YUV420SP_UV
#ifdef INTERLACED_ENCODING
ipcFramesOutHostPrm.inQueInfo.chInfo[i].scanFormat = SYSTEM_SF_INTERLACED;
#else
ipcFramesOutHostPrm.inQueInfo.chInfo[i].scanFormat = SYSTEM_SF_PROGRESSIVE; //progressive
#endif
ipcFramesOutHostPrm.inQueInfo.chInfo[i].memType = 0; // zzs change from 1 to NON_TILED MEM
ipcFramesOutHostPrm.inQueInfo.chInfo[i].startX = 0; // NOT USED
ipcFramesOutHostPrm.inQueInfo.chInfo[i].startY = 0; // NOT USED
ipcFramesOutHostPrm.inQueInfo.chInfo[i].pitch[0] = FrameWidth;//16384; //CH_WIDTH;
ipcFramesOutHostPrm.inQueInfo.chInfo[i].pitch[1] = FrameWidth;//32768; //CH_WIDTH;
ipcFramesOutHostPrm.inQueInfo.chInfo[i].pitch[2] = 0; // NOT USED
}
/**
* IPC Frames OUT (A8) to IPC Frames IN (Video)
* */
ipcFramesInVideoPrm.baseCreateParams.noNotifyMode = FALSE;
ipcFramesInVideoPrm.baseCreateParams.notifyNextLink = TRUE;
ipcFramesInVideoPrm.baseCreateParams.notifyPrevLink = TRUE;
ipcFramesInVideoPrm.baseCreateParams.inQueParams.prevLinkId = ipcFramesOutHostId;
ipcFramesInVideoPrm.baseCreateParams.inQueParams.prevLinkQueId = 0;
ipcFramesInVideoPrm.baseCreateParams.outQueParams[0].nextLink = gVencModuleContext.encId;
/**
* IPC Frames IN (Video) to Encoder
* */
{
EncLink_ChCreateParams *pLinkChPrm;
EncLink_ChDynamicParams *pLinkDynPrm;
VENC_CHN_DYNAMIC_PARAM_S *pDynPrm;
VENC_CHN_PARAMS_S *pChPrm;
EncLink_CreateParams_Init(&encPrm);
encPrm.numBufPerCh[0] = NUM_BUF_PER_CH;
encPrm.numBufPerCh[1] = NUM_BUF_PER_CH;
pLinkDynPrm = NULL;
/* Primary Stream Params - 1080p */
for (i=0; i<gVencModuleContext.vencConfig.numPrimaryChn; i++)
{
pLinkChPrm = &encPrm.chCreateParams[i];
pLinkDynPrm = &pLinkChPrm->defaultDynamicParams;
pChPrm = &gVencModuleContext.vencConfig.encChannelParams[i];
pDynPrm = &pChPrm->dynamicParam;
pLinkChPrm->format = IVIDEO_H264HP;
pLinkChPrm->profile = gVencModuleContext.vencConfig.h264Profile[i];
pLinkChPrm->dataLayout = IVIDEO_FIELD_SEPARATED;
#ifdef INTERLACED_ENCODING
pLinkChPrm->fieldMergeEncodeEnable = FALSE; //zzs change from FALSE for interlaced encoding test;
#else
pLinkChPrm->fieldMergeEncodeEnable = FALSE;
#endif
pLinkChPrm->enableAnalyticinfo = pChPrm->enableAnalyticinfo;
pLinkChPrm->enableWaterMarking = pChPrm->enableWaterMarking;
pLinkChPrm->maxBitRate = pChPrm->maxBitRate;
pLinkChPrm->encodingPreset = pChPrm->encodingPreset;
pLinkChPrm->rateControlPreset = pChPrm->rcType;
pLinkChPrm->enableSVCExtensionFlag = pChPrm->enableSVCExtensionFlag;
pLinkChPrm->numTemporalLayer = pChPrm->numTemporalLayer;
pLinkDynPrm->intraFrameInterval = pDynPrm->intraFrameInterval;
pLinkDynPrm->targetBitRate = pDynPrm->targetBitRate;
pLinkDynPrm->interFrameInterval = 1;
pLinkDynPrm->mvAccuracy = IVIDENC2_MOTIONVECTOR_QUARTERPEL;
pLinkDynPrm->inputFrameRate = pDynPrm->inputFrameRate;
pLinkDynPrm->rcAlg = pDynPrm->rcAlg;
pLinkDynPrm->qpMin = pDynPrm->qpMin;
pLinkDynPrm->qpMax = pDynPrm->qpMax;
pLinkDynPrm->qpInit = pDynPrm->qpInit;
pLinkDynPrm->vbrDuration = pDynPrm->vbrDuration;
pLinkDynPrm->vbrSensitivity = pDynPrm->vbrSensitivity;
printf("GVenc i %d inputFrameRate: %d\n",i, pLinkDynPrm->targetBitRate);
}
#if 1
printf("GVenc numSecondaryChn: %d\n", gVencModuleContext.vencConfig.numSecondaryChn);
/* Secondary Out <CIF> Params */
for (i=gVencModuleContext.vencConfig.numPrimaryChn, j=VENC_PRIMARY_CHANNELS;
i<(gVencModuleContext.vencConfig.numPrimaryChn
+ gVencModuleContext.vencConfig.numSecondaryChn);
i++, j++)
{
pLinkChPrm = &encPrm.chCreateParams[i];
pLinkDynPrm = &pLinkChPrm->defaultDynamicParams;
pChPrm = &gVencModuleContext.vencConfig.encChannelParams[j];
pDynPrm = &pChPrm->dynamicParam;
pLinkChPrm->format = IVIDEO_H264HP;
pLinkChPrm->profile = gVencModuleContext.vencConfig.h264Profile[i];
pLinkChPrm->dataLayout = IVIDEO_FIELD_SEPARATED;
pLinkChPrm->fieldMergeEncodeEnable = FALSE;
pLinkChPrm->enableAnalyticinfo = pChPrm->enableAnalyticinfo;
pLinkChPrm->enableWaterMarking = pChPrm->enableWaterMarking;
pLinkChPrm->maxBitRate = pChPrm->maxBitRate;
pLinkChPrm->encodingPreset = pChPrm->encodingPreset;
pLinkChPrm->rateControlPreset = pChPrm->rcType;
pLinkChPrm->enableSVCExtensionFlag = pChPrm->enableSVCExtensionFlag;
pLinkChPrm->numTemporalLayer = pChPrm->numTemporalLayer;
pLinkDynPrm->intraFrameInterval = pDynPrm->intraFrameInterval;
pLinkDynPrm->targetBitRate = pDynPrm->targetBitRate;
pLinkDynPrm->interFrameInterval = 1;
pLinkDynPrm->mvAccuracy = IVIDENC2_MOTIONVECTOR_QUARTERPEL;
pLinkDynPrm->inputFrameRate = pDynPrm->inputFrameRate;
pLinkDynPrm->qpMin = pDynPrm->qpMin;
pLinkDynPrm->qpMax = pDynPrm->qpMax;
pLinkDynPrm->qpInit = pDynPrm->qpInit;
pLinkDynPrm->vbrDuration = pDynPrm->vbrDuration;
pLinkDynPrm->vbrSensitivity = pDynPrm->vbrSensitivity;
printf("GVencsec i %d,j %d inputFrameRate: %d\n",i,j, pLinkDynPrm->targetBitRate);
}
printf("GVenc left: %d\n", gVencModuleContext.vencConfig.numPrimaryChn + gVencModuleContext.vencConfig.numSecondaryChn);
/* MJPEG Params */
for (i=gVencModuleContext.vencConfig.numPrimaryChn + gVencModuleContext.vencConfig.numSecondaryChn;
i<(VENC_CHN_MAX); i++)
{
pLinkChPrm = &encPrm.chCreateParams[i];
pLinkDynPrm = &pLinkChPrm->defaultDynamicParams;
pChPrm = &gVencModuleContext.vencConfig.encChannelParams[i];
pDynPrm = &pChPrm->dynamicParam;
pLinkChPrm->format = IVIDEO_MJPEG;
pLinkChPrm->profile = 0;
pLinkChPrm->dataLayout = IVIDEO_FIELD_SEPARATED;
pLinkChPrm->fieldMergeEncodeEnable = FALSE;
pLinkChPrm->enableAnalyticinfo = 0;
pLinkChPrm->enableWaterMarking = 0;
pLinkChPrm->maxBitRate = 0;
pLinkChPrm->encodingPreset = 0;
pLinkChPrm->rateControlPreset = 0;
pLinkChPrm->enableSVCExtensionFlag = 0;
pLinkChPrm->numTemporalLayer = 0;
pLinkDynPrm->intraFrameInterval = 0;
pLinkDynPrm->targetBitRate = 100*1000;
pLinkDynPrm->interFrameInterval = 0;
pLinkDynPrm->mvAccuracy = 0;
pLinkDynPrm->inputFrameRate = pDynPrm->inputFrameRate;
pLinkDynPrm->qpMin = 0;
pLinkDynPrm->qpMax = 0;
pLinkDynPrm->qpInit = -1;
pLinkDynPrm->vbrDuration = 0;
pLinkDynPrm->vbrSensitivity = 0;
}
#endif
encPrm.inQueParams.prevLinkId = ipcFramesInVideoId;
encPrm.inQueParams.prevLinkQueId= 0;
encPrm.outQueParams.nextLink = ipcBitsOutVideoId;
OSA_printf("encPrm: %d %d %d %d %d %d %d %d %d %d\n",
pLinkDynPrm->intraFrameInterval,
pLinkDynPrm->targetBitRate,
pLinkDynPrm->mvAccuracy,
pLinkDynPrm->inputFrameRate,
pLinkDynPrm->rcAlg,
pLinkDynPrm->qpMin,
pLinkDynPrm->qpMax,
pLinkDynPrm->qpInit,
pLinkDynPrm->vbrDuration,
pLinkDynPrm->vbrSensitivity);
}
/**
* Encoder to ipcBitsOutVideo
**/
ipcBitsOutVideoPrm.baseCreateParams.inQueParams.prevLinkId = gVencModuleContext.encId;
ipcBitsOutVideoPrm.baseCreateParams.inQueParams.prevLinkQueId = 0;
ipcBitsOutVideoPrm.baseCreateParams.numOutQue = 1;
ipcBitsOutVideoPrm.baseCreateParams.noNotifyMode = TRUE;
ipcBitsOutVideoPrm.baseCreateParams.notifyPrevLink = TRUE;
ipcBitsOutVideoPrm.baseCreateParams.notifyNextLink = FALSE;
ipcBitsOutVideoPrm.baseCreateParams.outQueParams[0].nextLink = ipcBitsInHostId;
/**
* ipcBitsOutVideo to
**/
{
VENC_CALLBACK_S *callback;
Ptr cbCtx;
ipcBitsInHostPrm.baseCreateParams.inQueParams.prevLinkId = ipcBitsOutVideoId;
ipcBitsInHostPrm.baseCreateParams.inQueParams.prevLinkQueId = 0;
ipcBitsInHostPrm.baseCreateParams.notifyNextLink = FALSE;
ipcBitsInHostPrm.baseCreateParams.notifyPrevLink = FALSE;
ipcBitsInHostPrm.baseCreateParams.noNotifyMode = TRUE;
//ipcBitsInHostPrm.baseCreateParams.outQueParams[0].nextLink = SYSTEM_LINK_ID_INVALID;
Venc_getCallbackInfo(&callback, &cbCtx);
ipcBitsInHostPrm.cbFxn = callback->newDataAvailableCb;
ipcBitsInHostPrm.cbCtx = cbCtx;
}
System_linkCreate(ipcFramesOutHostId,&ipcFramesOutHostPrm,sizeof(ipcFramesOutHostPrm));
System_linkCreate(ipcFramesInVideoId,&ipcFramesInVideoPrm,sizeof(ipcFramesInVideoPrm));
System_linkCreate(gVencModuleContext.encId, &encPrm, sizeof(encPrm));
sleep(2);
System_linkCreate(ipcBitsOutVideoId, &ipcBitsOutVideoPrm, sizeof(ipcBitsOutVideoPrm));
System_linkCreate(ipcBitsInHostId, &ipcBitsInHostPrm, sizeof(ipcBitsInHostPrm));
gVdecModuleContext.ipcBitsOutHLOSId = SYSTEM_HOST_LINK_ID_IPC_BITS_OUT_0;
gVdecModuleContext.ipcBitsInRTOSId = SYSTEM_VIDEO_LINK_ID_IPC_BITS_IN_0;
gVdecModuleContext.decId = SYSTEM_LINK_ID_VDEC_0;
gMultiCh_VdecVdisObj.ipcOutVideoId = SYSTEM_VIDEO_LINK_ID_IPC_OUT_M3_0;
gMultiCh_VdecVdisObj.ipcInVpssId = SYSTEM_VPSS_LINK_ID_IPC_IN_M3_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
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;
#ifdef INTERLACED_ENCODING
ipcBitsOutHostPrm.inQueInfo.chInfo[i].scanFormat =
SYSTEM_SF_INTERLACED;
#else
ipcBitsOutHostPrm.inQueInfo.chInfo[i].scanFormat =
SYSTEM_SF_PROGRESSIVE;
#endif
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.noNotifyMode = TRUE;
ipcBitsInVideoPrm.baseCreateParams.notifyNextLink = TRUE;
ipcBitsInVideoPrm.baseCreateParams.notifyPrevLink = FALSE;
ipcBitsInVideoPrm.baseCreateParams.numOutQue = 1;
for (i=0; i<ipcBitsOutHostPrm.inQueInfo.numCh; i++)
{
if(gVdecModuleContext.vdecConfig.decChannelParams[i].isCodec == VDEC_CHN_H264)
decPrm.chCreateParams[i].format = IVIDEO_H264HP;
else if(gVdecModuleContext.vdecConfig.decChannelParams[i].isCodec == VDEC_CHN_MPEG4)
decPrm.chCreateParams[i].format = IVIDEO_MPEG4ASP;
else if(gVdecModuleContext.vdecConfig.decChannelParams[i].isCodec == VDEC_CHN_MJPEG)
decPrm.chCreateParams[i].format = IVIDEO_MJPEG;
decPrm.chCreateParams[i].numBufPerCh
= gVdecModuleContext.vdecConfig.decChannelParams[i].numBufPerCh;
decPrm.chCreateParams[i].profile = IH264VDEC_PROFILE_ANY;
decPrm.chCreateParams[i].displayDelay
= gVdecModuleContext.vdecConfig.decChannelParams[i].displayDelay;
decPrm.chCreateParams[i].dpbBufSizeInFrames = IH264VDEC_DPB_NUMFRAMES_AUTO;
if (gVdecModuleContext.vdecConfig.decChannelParams[i].fieldPicture)
{
OSA_printf("MULTICH_VDEC_VDIS:INFO ChId[%d] configured for field picture\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.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;
ipcInVpssPrm.outQueParams[0].nextLink = gVdisModuleContext.swMsId[0];
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;
for(i=0; i<gVsysModuleContext.vsysConfig.numDisplays; i++)
{
#ifdef OUTPUT_HDMI
VDIS_DEV vdDevId = VDIS_DEV_HDMI;
#else
VDIS_DEV vdDevId = VDIS_DEV_DVO2; //zzs
#endif
swMsPrm[i].inQueParams.prevLinkId = gMultiCh_VdecVdisObj.ipcInVpssId;
swMsPrm[i].inQueParams.prevLinkQueId = 0;
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 in VDEC->VDIS use case */
swMsPrm[i].maxInputQueLen = SYSTEM_SW_MS_INVALID_INPUT_QUE_LEN;
if (i == 0)
{
#ifdef OUTPUT_HDMI
vdDevId = VDIS_DEV_HDMI;
#else
vdDevId = VDIS_DEV_DVO2; //zzs
#endif
swMsPrm[i].maxOutRes = VSYS_STD_1080P_60;
swMsPrm[i].initOutRes = gVdisModuleContext.vdisConfig.deviceParams[VDIS_DEV_HDMI].resolution;
}
else if (i == 1)
{
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;
}
/* 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(gVdecModuleContext.decId, &decPrm, sizeof(decPrm));
System_linkCreate(gMultiCh_VdecVdisObj.ipcOutVideoId, &ipcOutVideoPrm, sizeof(ipcOutVideoPrm));
System_linkCreate(gMultiCh_VdecVdisObj.ipcInVpssId , &ipcInVpssPrm, sizeof(ipcInVpssPrm));
for(i=0; i<gVsysModuleContext.vsysConfig.numDisplays; i++)
System_linkCreate(gVdisModuleContext.swMsId[i] , &swMsPrm[i], sizeof(swMsPrm[i]));
for(i=0; i<gVsysModuleContext.vsysConfig.numDisplays; i++)
System_linkCreate(gVdisModuleContext.displayId[i], &displayPrm[i], sizeof(displayPrm[i]));
MultiCh_memPrintHeapStatus();
{
#ifdef OUTPUT_HDMI
MultiCh_setDec2DispMap(VDIS_DEV_HDMI,gVdecModuleContext.vdecConfig.numChn,0,0);
#else
MultiCh_setDec2DispMap(VDIS_DEV_DVO2,gVdecModuleContext.vdecConfig.numChn,0,0); //zzs
#endif
#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
}
}