我对视频做了scalar处理,分为两个link进行处理,每个link两个通道,当然这两个link的裁剪比例是不同的。两个link均能收到21fps,但处理帧率只为8fps。请问为什么处理帧率会这么低?skip out FPS是什么?如图打印信息:
This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
我对视频做了scalar处理,分为两个link进行处理,每个link两个通道,当然这两个link的裁剪比例是不同的。两个link均能收到21fps,但处理帧率只为8fps。请问为什么处理帧率会这么低?skip out FPS是什么?如图打印信息:
Hi,Ternence Hsu
下面是usecase代码,link中有两个scalar link,pathId均为SCLR_LINK_SC5。我看文档中提到可将pathId以设置为SCLR_LINK_SEC0_SC3,但是我把另一个scalar link设置为SCLR_LINK_SEC0_SC3,scalar link就会创建失败。
Void MultiCh_createVcapVencVdis()
{
CaptureLink_CreateParams capturePrm;
// DeiLink_CreateParams deiPrm[NUM_DEI_LINK]; xpli
DupLink_CreateParams dupPrm[NUM_DUP_LINK]; //2 dup link
SelectLink_CreateParams selectPrm; //xpli0710
SclrLink_CreateParams sclrPrm[2]; //xpli0710
NsfLink_CreateParams nsfPrm;
SwMsLink_CreateParams swMsPrm;
MergeLink_CreateParams mergePrm[3];
DisplayLink_CreateParams displayPrm[2];
IpcLink_CreateParams ipcOutVpssPrm;
IpcLink_CreateParams ipcInVideoPrm;
EncLink_CreateParams encPrm;
IpcBitsOutLinkRTOS_CreateParams ipcBitsOutVideoPrm;
IpcBitsInLinkHLOS_CreateParams ipcBitsInHostPrm[2];
//xpli 0629
IpcFramesInLinkRTOS_CreateParams ipcFramesInDspPrm;
IpcFramesOutLinkRTOS_CreateParams ipcFramesOutVpssPrm;
AlgLink_CreateParams dspAlgPrm;
CaptureLink_VipInstParams *pCaptureInstPrm;
CaptureLink_OutParams *pCaptureOutPrm;
UInt32 vipInstId;
UInt32 mergeId[3],selectId;
UInt32 i,j;
Bool tilerEnable;
Bool enableTiler;
MULTICH_INIT_STRUCT(IpcLink_CreateParams ,ipcOutVpssPrm);
MULTICH_INIT_STRUCT(IpcLink_CreateParams ,ipcInVideoPrm);
MULTICH_INIT_STRUCT(IpcBitsOutLinkRTOS_CreateParams,ipcBitsOutVideoPrm);
MULTICH_INIT_STRUCT(IpcBitsInLinkHLOS_CreateParams,ipcBitsInHostPrm[0]);
MULTICH_INIT_STRUCT(IpcBitsInLinkHLOS_CreateParams,ipcBitsInHostPrm[1]);
MULTICH_INIT_STRUCT(EncLink_CreateParams, encPrm);
MULTICH_INIT_STRUCT(DisplayLink_CreateParams,displayPrm[0]);
// MULTICH_INIT_STRUCT(DisplayLink_CreateParams,displayPrm[1]);
//xpli 0629
MULTICH_INIT_STRUCT(IpcFramesInLinkRTOS_CreateParams,ipcFramesInDspPrm);
MULTICH_INIT_STRUCT(IpcFramesOutLinkRTOS_CreateParams,ipcFramesOutVpssPrm);
MULTICH_INIT_STRUCT(AlgLink_CreateParams, dspAlgPrm);
MULTICH_INIT_STRUCT(SwMsLink_CreateParams,swMsPrm);
MULTICH_INIT_STRUCT(SclrLink_CreateParams, sclrPrm[0]); //xpli0710
MULTICH_INIT_STRUCT(SclrLink_CreateParams, sclrPrm[1]); //xpli0710
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
);
/* Disable tiler allocator for this usecase
* for that tiler memory can be reused for
* non-tiled allocation
*/
SystemTiler_disableAllocator();
enableTiler = FALSE;
gVcapModuleContext.captureId = SYSTEM_LINK_ID_CAPTURE;
// gVcapModuleContext.deiId[0] = SYSTEM_LINK_ID_DEI_HQ_0; xpli
gVcapModuleContext.nsfId[0] = SYSTEM_LINK_ID_NSF_0;
gVcapModuleContext.ipcBitsInHLOSId = SYSTEM_HOST_LINK_ID_IPC_BITS_IN_0;
selectId = SYSTEM_VPSS_LINK_ID_SELECT_0; //xpli0710
gVcapModuleContext.sclrId[0] = SYSTEM_LINK_ID_SCLR_INST_0;
gVcapModuleContext.sclrId[1] = SYSTEM_LINK_ID_SCLR_INST_1;
gVdisModuleContext.swMsId[0] = SYSTEM_LINK_ID_SW_MS_MULTI_INST_0;
gVdisModuleContext.displayId[0] = SYSTEM_LINK_ID_DISPLAY_0; // ON CHIP HDMI
//gVdisModuleContext.displayId[1] = SYSTEM_LINK_ID_DISPLAY_2; // ON CHIP HDMI
mergeId[0] = SYSTEM_VPSS_LINK_ID_MERGE_0;
mergeId[1] = SYSTEM_VPSS_LINK_ID_MERGE_1;
mergeId[2] = SYSTEM_VPSS_LINK_ID_MERGE_2;
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;
gMultiCh_VcapVencVdisObj.dupId[0] = SYSTEM_VPSS_LINK_ID_DUP_0;
gMultiCh_VcapVencVdisObj.dupId[1] = SYSTEM_VPSS_LINK_ID_DUP_1; //xpli0123
gMultiCh_VcapVencVdisObj.ipcOutVpssId = SYSTEM_VPSS_LINK_ID_IPC_OUT_M3_0;
gMultiCh_VcapVencVdisObj.ipcInVideoId = SYSTEM_VIDEO_LINK_ID_IPC_IN_M3_0;
gVcapModuleContext.ipcFramesOutVpssToHostId = SYSTEM_VPSS_LINK_ID_IPC_FRAMES_OUT_1;
gVcapModuleContext.ipcFramesInHostId = SYSTEM_HOST_LINK_ID_IPC_FRAMES_IN_0;
gVdisModuleContext.ipcFramesOutHostId = SYSTEM_HOST_LINK_ID_IPC_FRAMES_OUT_0;
gVdisModuleContext.ipcFramesInVpssFromHostId = SYSTEM_VPSS_LINK_ID_IPC_FRAMES_IN_0;
Bool enableOsdAlgLink = TRUE;
//xpli 0629
if(enableOsdAlgLink)
{
gVcapModuleContext.dspAlgId[0] = SYSTEM_LINK_ID_ALG_0;
gVcapModuleContext.ipcFramesOutVpssId[0] = SYSTEM_VPSS_LINK_ID_IPC_FRAMES_OUT_0;
gVcapModuleContext.ipcFramesInDspId[0] = SYSTEM_DSP_LINK_ID_IPC_FRAMES_IN_0;
}
CaptureLink_CreateParams_Init(&capturePrm);
capturePrm.numVipInst = 4; //xpli
capturePrm.outQueParams[0].nextLink = mergeId[0];
capturePrm.outQueParams[1].nextLink = mergeId[0];
capturePrm.outQueParams[2].nextLink = mergeId[0];
capturePrm.outQueParams[3].nextLink = mergeId[0];
// capturePrm.outQueParams[1].nextLink = gVcapModuleContext.deiId[0];
capturePrm.tilerEnable = FALSE;
capturePrm.maxBlindAreasPerCh = 4;
vipInstId=0;
{
pCaptureInstPrm = &capturePrm.vipInst[vipInstId];
pCaptureInstPrm->vipInstId = SYSTEM_CAPTURE_INST_VIP0_PORTA%SYSTEM_CAPTURE_INST_MAX;
pCaptureInstPrm->videoDecoderId = 0; //not used
pCaptureInstPrm->inDataFormat = SYSTEM_DF_YUV422P;
pCaptureInstPrm->standard = SYSTEM_STD_1080P_30;
pCaptureInstPrm->numOutput = 1;
pCaptureInstPrm->videoIfMode = SYSTEM_CAPT_VIDEO_IF_MODE_8BIT;
pCaptureInstPrm->videoCaptureMode = SYSTEM_CAPT_VIDEO_CAPTURE_MODE_SINGLE_CH_NON_MUX_DISCRETE_SYNC_ACTVID_VSYNC;
pCaptureInstPrm->inScanFormat = SYSTEM_SF_PROGRESSIVE;
pCaptureInstPrm->useAdvancedParams = FALSE;
pCaptureOutPrm = &pCaptureInstPrm->outParams[0];
pCaptureOutPrm->dataFormat = SYSTEM_DF_YUV422I_YUYV;
pCaptureOutPrm->scEnable = FALSE;
pCaptureOutPrm->scOutWidth = 0;
pCaptureOutPrm->scOutHeight = 0;
pCaptureOutPrm->outQueId = 0;
}
vipInstId=1;
{
pCaptureInstPrm = &capturePrm.vipInst[vipInstId];
pCaptureInstPrm->vipInstId = SYSTEM_CAPTURE_INST_VIP0_PORTB%SYSTEM_CAPTURE_INST_MAX;
pCaptureInstPrm->videoDecoderId = 0; //not used
pCaptureInstPrm->inDataFormat = SYSTEM_DF_YUV422P;
pCaptureInstPrm->standard = SYSTEM_STD_1080P_30;
pCaptureInstPrm->numOutput = 1;
pCaptureInstPrm->videoIfMode = SYSTEM_CAPT_VIDEO_IF_MODE_8BIT;
pCaptureInstPrm->videoCaptureMode = SYSTEM_CAPT_VIDEO_CAPTURE_MODE_SINGLE_CH_NON_MUX_DISCRETE_SYNC_ACTVID_VSYNC;
pCaptureInstPrm->inScanFormat = SYSTEM_SF_PROGRESSIVE;
pCaptureInstPrm->useAdvancedParams = FALSE;
pCaptureOutPrm = &pCaptureInstPrm->outParams[0];
pCaptureOutPrm->dataFormat = SYSTEM_DF_YUV422I_YUYV;
pCaptureOutPrm->scEnable = FALSE;
pCaptureOutPrm->scOutWidth = 0;
pCaptureOutPrm->scOutHeight = 0;
pCaptureOutPrm->outQueId = 1;
}
vipInstId=2;
{
pCaptureInstPrm = &capturePrm.vipInst[vipInstId];
pCaptureInstPrm->vipInstId = SYSTEM_CAPTURE_INST_VIP1_PORTA%SYSTEM_CAPTURE_INST_MAX;
pCaptureInstPrm->videoDecoderId = 0; //not used
pCaptureInstPrm->inDataFormat = SYSTEM_DF_YUV422P;
pCaptureInstPrm->standard = SYSTEM_STD_1080P_30;
pCaptureInstPrm->numOutput = 1;
pCaptureInstPrm->videoIfMode = SYSTEM_CAPT_VIDEO_IF_MODE_8BIT;
pCaptureInstPrm->videoCaptureMode = SYSTEM_CAPT_VIDEO_CAPTURE_MODE_SINGLE_CH_NON_MUX_DISCRETE_SYNC_ACTVID_VSYNC;
pCaptureInstPrm->inScanFormat = SYSTEM_SF_PROGRESSIVE;
pCaptureInstPrm->useAdvancedParams = FALSE;
pCaptureOutPrm = &pCaptureInstPrm->outParams[0];
pCaptureOutPrm->dataFormat = SYSTEM_DF_YUV422I_YUYV;
pCaptureOutPrm->scEnable = FALSE;
pCaptureOutPrm->scOutWidth = 0;
pCaptureOutPrm->scOutHeight = 0;
pCaptureOutPrm->outQueId = 2;
}
vipInstId=3;
{
pCaptureInstPrm = &capturePrm.vipInst[vipInstId];
pCaptureInstPrm->vipInstId = SYSTEM_CAPTURE_INST_VIP1_PORTB%SYSTEM_CAPTURE_INST_MAX;
pCaptureInstPrm->videoDecoderId = 0; //not used
pCaptureInstPrm->inDataFormat = SYSTEM_DF_YUV422P;
pCaptureInstPrm->standard = SYSTEM_STD_1080P_30;
pCaptureInstPrm->numOutput = 1;
pCaptureInstPrm->videoIfMode = SYSTEM_CAPT_VIDEO_IF_MODE_8BIT;
pCaptureInstPrm->videoCaptureMode = SYSTEM_CAPT_VIDEO_CAPTURE_MODE_SINGLE_CH_NON_MUX_DISCRETE_SYNC_ACTVID_VSYNC;
pCaptureInstPrm->inScanFormat = SYSTEM_SF_PROGRESSIVE;
pCaptureInstPrm->useAdvancedParams = FALSE;
pCaptureOutPrm = &pCaptureInstPrm->outParams[0];
pCaptureOutPrm->dataFormat = SYSTEM_DF_YUV422I_YUYV;
pCaptureOutPrm->scEnable = FALSE;
pCaptureOutPrm->scOutWidth = 0;
pCaptureOutPrm->scOutHeight = 0;
pCaptureOutPrm->outQueId = 3;
}
/*
**dup1 link
**dup 2 video ques
**pre link is cature link
**next link is merge link
**xpli 0123
*/
#if 0
dupPrm[1].inQueParams.prevLinkId = gVcapModuleContext.captureId;
dupPrm[1].inQueParams.prevLinkQueId = 0;
dupPrm[1].notifyNextLink = TRUE;
dupPrm[1].numOutQue = 4;
dupPrm[1].outQueParams[0].nextLink = mergeId;
dupPrm[1].outQueParams[1].nextLink = mergeId;
dupPrm[1].outQueParams[2].nextLink = mergeId;
dupPrm[1].outQueParams[3].nextLink = mergeId;
#endif
/*
**merge link
**merge 4 video ques to 1 video ques
**pre link is dup1 link
**next link is swMs link
**xpli 0123
*/
#if 1
mergePrm[0].numInQue = 4;
mergePrm[0].inQueParams[0].prevLinkId = gVcapModuleContext.captureId;
mergePrm[0].inQueParams[0].prevLinkQueId = 0;
mergePrm[0].inQueParams[1].prevLinkId = gVcapModuleContext.captureId;
mergePrm[0].inQueParams[1].prevLinkQueId = 1;
mergePrm[0].inQueParams[2].prevLinkId = gVcapModuleContext.captureId;
mergePrm[0].inQueParams[2].prevLinkQueId = 2;
mergePrm[0].inQueParams[3].prevLinkId = gVcapModuleContext.captureId;
mergePrm[0].inQueParams[3].prevLinkQueId = 3;
mergePrm[0].notifyNextLink = TRUE;
mergePrm[0].outQueParams.nextLink = gMultiCh_VcapVencVdisObj.dupId[0];
#endif
#if 1
dupPrm[0].inQueParams.prevLinkId = mergeId[0];
dupPrm[0].inQueParams.prevLinkQueId = 0;
dupPrm[0].notifyNextLink = TRUE;
dupPrm[0].numOutQue = 2;
dupPrm[0].outQueParams[0].nextLink = selectId;
dupPrm[0].outQueParams[1].nextLink = mergeId[1];//gVdisModuleContext.displayId[1];//
#endif
//xpli0710
#if 1
selectPrm.inQueParams.prevLinkId = gMultiCh_VcapVencVdisObj.dupId[0];
selectPrm.inQueParams.prevLinkQueId = 0;
selectPrm.numOutQue = 2;
selectPrm.outQueParams[0].nextLink = gVcapModuleContext.sclrId[0];
selectPrm.outQueParams[1].nextLink = gVcapModuleContext.sclrId[1];
selectPrm.outQueChInfo[0].numOutCh = 2;
selectPrm.outQueChInfo[0].outQueId = 0;
selectPrm.outQueChInfo[0].inChNum[0] = 0;
selectPrm.outQueChInfo[0].inChNum[1] = 3;
selectPrm.outQueChInfo[1].numOutCh = 2;
selectPrm.outQueChInfo[1].outQueId = 1;
selectPrm.outQueChInfo[1].inChNum[0] = 1;
selectPrm.outQueChInfo[1].inChNum[1] = 2;
#endif
//xpli0710
#if 1
sclrPrm[0].enableLineSkipSc = FALSE;
sclrPrm[0].inputFrameRate = 25;
sclrPrm[0].outputFrameRate = 25;
sclrPrm[0].inQueParams.prevLinkId = selectId;
sclrPrm[0].inQueParams.prevLinkQueId = 0;
sclrPrm[0].outQueParams.nextLink = mergeId[2];
sclrPrm[0].scaleMode = DEI_SCALE_MODE_RATIO;
sclrPrm[0].outScaleFactor.ratio.heightRatio.numerator = 1;
sclrPrm[0].outScaleFactor.ratio.heightRatio.denominator = 3;
sclrPrm[0].outScaleFactor.ratio.widthRatio.numerator = 1;
sclrPrm[0].outScaleFactor.ratio.widthRatio.denominator = 1;
sclrPrm[0].tilerEnable = FALSE; // force tiler disable;
sclrPrm[0].numBufsPerCh = 4;
sclrPrm[0].pathId = SCLR_LINK_SC5;//SCLR_LINK_SEC0_SC3;//SCLR_LINK_SC5;
#endif
//xpli0710
#if 1
sclrPrm[1].enableLineSkipSc = FALSE;
sclrPrm[1].inputFrameRate = 25;
sclrPrm[1].outputFrameRate = 25;
sclrPrm[1].inQueParams.prevLinkId = selectId;
sclrPrm[1].inQueParams.prevLinkQueId = 1;
sclrPrm[1].outQueParams.nextLink = mergeId[2];
sclrPrm[1].scaleMode = DEI_SCALE_MODE_RATIO;
sclrPrm[1].outScaleFactor.ratio.heightRatio.numerator = 1;
sclrPrm[1].outScaleFactor.ratio.heightRatio.denominator = 1;
sclrPrm[1].outScaleFactor.ratio.widthRatio.numerator = 87;
sclrPrm[1].outScaleFactor.ratio.widthRatio.denominator = 192;
sclrPrm[1].tilerEnable = FALSE; // force tiler disable;
sclrPrm[1].numBufsPerCh = 4;
sclrPrm[1].pathId = SCLR_LINK_SC5;//SCLR_LINK_SEC0_SC3;
#endif
#if 1
mergePrm[2].numInQue = 2;
mergePrm[2].inQueParams[0].prevLinkId = gVcapModuleContext.sclrId[0];
mergePrm[2].inQueParams[0].prevLinkQueId = 0;
mergePrm[2].inQueParams[1].prevLinkId = gVcapModuleContext.sclrId[1];
mergePrm[2].inQueParams[1].prevLinkQueId = 0;
mergePrm[2].notifyNextLink = TRUE;
mergePrm[2].outQueParams.nextLink = gVdisModuleContext.swMsId[0];
#endif
#if 1
swMsPrm.swMsInstId[0] = SYSTEM_SW_MS_SC_INST_VIP0_SC;
swMsPrm.numSwMsInst = 1;
swMsPrm.swMsInstStartWin[0] = 0;
swMsPrm.swMsInstStartWin[1] = 4;//---wp1412
swMsPrm.enableProcessTieWithDisplay = TRUE;
VDIS_DEV vdDevId = VDIS_DEV_HDMI;
swMsPrm.inQueParams.prevLinkId = mergeId[2];
swMsPrm.inQueParams.prevLinkQueId = 0;
swMsPrm.numOutBuf = MULTICH_NUM_SWMS_MAX_BUFFERS;
swMsPrm.maxInputQueLen = SYSTEM_SW_MS_INVALID_INPUT_QUE_LEN;
vdDevId = VDIS_DEV_HDMI;
swMsPrm.maxOutRes = VSYS_STD_1080P_60;
swMsPrm.initOutRes = gVdisModuleContext.vdisConfig.deviceParams[VDIS_DEV_HDMI].resolution;
swMsPrm.outQueParams.nextLink = gMultiCh_VcapVencVdisObj.dupId[1]; //----wp1412
/* low cost line skip mode of scaling can be used, when tiler is off */
tilerEnable = FALSE;
if(tilerEnable)
swMsPrm.lineSkipMode = FALSE;
else
swMsPrm.lineSkipMode = TRUE;
swMsPrm.enableLayoutGridDraw = gVdisModuleContext.vdisConfig.enableLayoutGridDraw;
MultiCh_swMsGetDefaultLayoutPrm(vdDevId, &swMsPrm, FALSE); /* both from 0-16 chnl */
displayPrm[0].inQueParams[0].prevLinkId = gMultiCh_VcapVencVdisObj.dupId[1];
displayPrm[0].inQueParams[0].prevLinkQueId = 0;
displayPrm[0].displayRes = swMsPrm.initOutRes;
mulich_vdec_vdis_set_avsync_prm(&gMultiCh_VcapVencVdisObj.avsyncCfg[0],0,vdDevId);
dupPrm[1].inQueParams.prevLinkId = gVdisModuleContext.swMsId[0];
dupPrm[1].inQueParams.prevLinkQueId = 0;
dupPrm[1].numOutQue = 2;
dupPrm[1].outQueParams[0].nextLink = gVdisModuleContext.displayId[0];
dupPrm[1].outQueParams[1].nextLink = gVcapModuleContext.ipcFramesOutVpssId[0];//mergeId[1];
dupPrm[1].notifyNextLink = TRUE;
#endif
//xpli 0629
/* Redirect to DSP for OSD / SCD */
ipcFramesOutVpssPrm.baseCreateParams.inQueParams.prevLinkId = gMultiCh_VcapVencVdisObj.dupId[1];
ipcFramesOutVpssPrm.baseCreateParams.inQueParams.prevLinkQueId = 1;//0 xpli
ipcFramesOutVpssPrm.baseCreateParams.outQueParams[0].nextLink = mergeId[1];//ipcOutVpssId;*****xpli
ipcFramesOutVpssPrm.baseCreateParams.processLink = gVcapModuleContext.ipcFramesInDspId[0];
ipcFramesOutVpssPrm.baseCreateParams.notifyPrevLink = TRUE;
ipcFramesOutVpssPrm.baseCreateParams.notifyNextLink = TRUE;
ipcFramesOutVpssPrm.baseCreateParams.notifyProcessLink = TRUE;
ipcFramesOutVpssPrm.baseCreateParams.noNotifyMode = FALSE;
ipcFramesOutVpssPrm.baseCreateParams.numOutQue = 1;
ipcFramesInDspPrm.baseCreateParams.inQueParams.prevLinkId = gVcapModuleContext.ipcFramesOutVpssId[0];
ipcFramesInDspPrm.baseCreateParams.inQueParams.prevLinkQueId = 0;
ipcFramesInDspPrm.baseCreateParams.outQueParams[0].nextLink = gVcapModuleContext.dspAlgId[0];
ipcFramesInDspPrm.baseCreateParams.notifyPrevLink = TRUE;
ipcFramesInDspPrm.baseCreateParams.notifyNextLink = TRUE;
ipcFramesInDspPrm.baseCreateParams.noNotifyMode = FALSE;
ipcFramesInDspPrm.baseCreateParams.numOutQue = 1;
dspAlgPrm.enableOSDAlg = TRUE; //xpli
dspAlgPrm.enableSCDAlg = FALSE;
dspAlgPrm.inQueParams.prevLinkId = gVcapModuleContext.ipcFramesInDspId[0];
dspAlgPrm.inQueParams.prevLinkQueId = 0;
UInt32 chId;
if(enableOsdAlgLink)
{
for(chId = 0; chId < ALG_LINK_OSD_MAX_CH; chId++)
{
AlgLink_OsdChWinParams * chWinPrm = &dspAlgPrm.osdChCreateParams[chId].chDefaultParams;
/* set osd window max width and height */
dspAlgPrm.osdChCreateParams[chId].maxWidth = EXAMPLE_OSD_WIN_MAX_WIDTH;
dspAlgPrm.osdChCreateParams[chId].maxHeight = EXAMPLE_OSD_WIN_MAX_HEIGHT;
chWinPrm->chId = chId;
chWinPrm->numWindows = 1; //??xpli0629
}
}
#if 1
mergePrm[1].numInQue = 2;
mergePrm[1].inQueParams[0].prevLinkId = gMultiCh_VcapVencVdisObj.dupId[0];
mergePrm[1].inQueParams[0].prevLinkQueId = 1;
mergePrm[1].inQueParams[1].prevLinkId = gVcapModuleContext.ipcFramesOutVpssId[0];
mergePrm[1].inQueParams[1].prevLinkQueId = 0;//1;???
mergePrm[1].notifyNextLink = TRUE;
mergePrm[1].outQueParams.nextLink = gVcapModuleContext.nsfId[0];
#endif
NsfLink_CreateParams_Init(&nsfPrm);
nsfPrm.bypassNsf = TRUE;
nsfPrm.inputFrameRate = 30;
nsfPrm.outputFrameRate = 30;
nsfPrm.tilerEnable = FALSE;
nsfPrm.inQueParams.prevLinkId = mergeId[1];
nsfPrm.inQueParams.prevLinkQueId = 0;
nsfPrm.numOutQue = 1;
nsfPrm.outQueParams[0].nextLink = gMultiCh_VcapVencVdisObj.ipcOutVpssId;
nsfPrm.numBufsPerCh = 6;
ipcOutVpssPrm.inQueParams.prevLinkId = gVcapModuleContext.nsfId[0];
ipcOutVpssPrm.inQueParams.prevLinkQueId = 0;
ipcOutVpssPrm.numOutQue = 1;
ipcOutVpssPrm.outQueParams[0].nextLink = gMultiCh_VcapVencVdisObj.ipcInVideoId;
ipcOutVpssPrm.notifyNextLink = FALSE;
ipcOutVpssPrm.notifyPrevLink = TRUE;
ipcOutVpssPrm.noNotifyMode = TRUE;
ipcInVideoPrm.inQueParams.prevLinkId = gMultiCh_VcapVencVdisObj.ipcOutVpssId;
ipcInVideoPrm.inQueParams.prevLinkQueId = 0;
ipcInVideoPrm.numOutQue = 1;
ipcInVideoPrm.outQueParams[0].nextLink = gVencModuleContext.encId;
ipcInVideoPrm.notifyNextLink = TRUE;
ipcInVideoPrm.notifyPrevLink = FALSE;
ipcInVideoPrm.noNotifyMode = TRUE;
ipcBitsOutVideoPrm.baseCreateParams.inQueParams.prevLinkId = gVencModuleContext.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]);
encPrm.numBufPerCh[0] = 7; //D1
encPrm.numBufPerCh[1] = 7; //CIF
{
EncLink_ChCreateParams *pLinkChPrm;
EncLink_ChDynamicParams *pLinkDynPrm;
VENC_CHN_DYNAMIC_PARAM_S *pDynPrm;
VENC_CHN_PARAMS_S *pChPrm;
/* Primary Stream Params - D1 */
for (i=0; i<gVencModuleContext.vencConfig.numPrimaryChn; i++)
{
pLinkChPrm = &encPrm.chCreateParams[i];
pLinkDynPrm = &pLinkChPrm->defaultDynamicParams;
pChPrm = &gVencModuleContext.vencConfig.encChannelParams[i];
pDynPrm = &pChPrm->dynamicParam;
pLinkChPrm->format = IVIDEO_H264HP;
pLinkChPrm->profile = gVencModuleContext.vencConfig.h264Profile[i];
pLinkChPrm->dataLayout = VCODEC_FIELD_SEPARATED;
pLinkChPrm->fieldMergeEncodeEnable = FALSE;
pLinkChPrm->enableAnalyticinfo = pChPrm->enableAnalyticinfo;
pLinkChPrm->enableWaterMarking = pChPrm->enableWaterMarking;
pLinkChPrm->maxBitRate = pChPrm->maxBitRate;
pLinkChPrm->encodingPreset = pChPrm->encodingPreset;
pLinkChPrm->rateControlPreset = pChPrm->rcType;
pLinkChPrm->enableSVCExtensionFlag = pChPrm->enableSVCExtensionFlag;
pLinkChPrm->numTemporalLayer = pChPrm->numTemporalLayer;
pLinkDynPrm->intraFrameInterval = pDynPrm->intraFrameInterval;
pLinkDynPrm->targetBitRate = pDynPrm->targetBitRate;
pLinkDynPrm->interFrameInterval = 1;
pLinkDynPrm->mvAccuracy = IVIDENC2_MOTIONVECTOR_QUARTERPEL;
pLinkDynPrm->inputFrameRate = pDynPrm->inputFrameRate;
pLinkDynPrm->rcAlg = pDynPrm->rcAlg;
pLinkDynPrm->qpMin = pDynPrm->qpMin;
pLinkDynPrm->qpMax = pDynPrm->qpMax;
pLinkDynPrm->qpInit = pDynPrm->qpInit;
pLinkDynPrm->vbrDuration = pDynPrm->vbrDuration;
pLinkDynPrm->vbrSensitivity = pDynPrm->vbrSensitivity;
}
if (gVsysModuleContext.vsysConfig.enableSecondaryOut == TRUE)
{
/* 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 = VCODEC_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;
pLinkChPrm->overrideInputScanFormat = TRUE;
pLinkChPrm->fieldPicEncode = FALSE;
}
}
/* MJPEG Params */
if (gVsysModuleContext.vsysConfig.enableMjpegEnc == TRUE)
{
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 = VCODEC_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 = 1;//pDynPrm->inputFrameRate;
pLinkDynPrm->qpMin = 0;
pLinkDynPrm->qpMax = 0;
pLinkDynPrm->qpInit = -1;
pLinkDynPrm->vbrDuration = 0;
pLinkDynPrm->vbrSensitivity = 0;
}
}
encPrm.inQueParams.prevLinkId = gMultiCh_VcapVencVdisObj.ipcInVideoId;
encPrm.inQueParams.prevLinkQueId= 0;
encPrm.outQueParams.nextLink = gVencModuleContext.ipcBitsOutRTOSId;
}
capturePrm.isPalMode = Vcap_isPalMode();
System_linkCreate(gVcapModuleContext.captureId, &capturePrm, sizeof(capturePrm));
System_linkCreate(mergeId[0], &mergePrm[0],sizeof(mergePrm[0]));
System_linkCreate(gMultiCh_VcapVencVdisObj.dupId[0], &dupPrm[0], sizeof(dupPrm[0]));
System_linkCreate(selectId, &selectPrm, sizeof(selectPrm)); //xpli0710
System_linkCreate(gVcapModuleContext.sclrId[0], &sclrPrm[0], sizeof(sclrPrm[0])); //xpli0710
System_linkCreate(gVcapModuleContext.sclrId[1], &sclrPrm[1],sizeof(sclrPrm[1])); //xpli0710
System_linkCreate(mergeId[2], &mergePrm[2], sizeof(mergePrm[2])); //xpli0710
System_linkCreate(gVdisModuleContext.swMsId[0], &swMsPrm, sizeof(swMsPrm));
System_linkCreate(gMultiCh_VcapVencVdisObj.dupId[1], &dupPrm[1], sizeof(dupPrm[1]));
System_linkCreate(gVdisModuleContext.displayId[0], &displayPrm[0], sizeof(displayPrm[0]));
#if 1
if(enableOsdAlgLink)
{
System_linkCreate(gVcapModuleContext.ipcFramesOutVpssId[0], &ipcFramesOutVpssPrm, sizeof(ipcFramesOutVpssPrm));
System_linkCreate(gVcapModuleContext.ipcFramesInDspId[0], &ipcFramesInDspPrm, sizeof(ipcFramesInDspPrm));
System_linkCreate(gVcapModuleContext.dspAlgId[0], &dspAlgPrm, sizeof(dspAlgPrm));
}
#endif
System_linkCreate(mergeId[1], &mergePrm[1], sizeof(mergePrm[1]));
System_linkCreate(gVcapModuleContext.nsfId[0], &nsfPrm, sizeof(nsfPrm));
System_linkCreate(gMultiCh_VcapVencVdisObj.ipcOutVpssId , &ipcOutVpssPrm , sizeof(ipcOutVpssPrm) );
System_linkCreate(gMultiCh_VcapVencVdisObj.ipcInVideoId , &ipcInVideoPrm , sizeof(ipcInVideoPrm) );
System_linkCreate(gVencModuleContext.encId, &encPrm, sizeof(encPrm));
System_linkCreate(gVencModuleContext.ipcBitsOutRTOSId, &ipcBitsOutVideoPrm, sizeof(ipcBitsOutVideoPrm));
System_linkCreate(gVencModuleContext.ipcBitsInHLOSId, &ipcBitsInHostPrm[0], sizeof(ipcBitsInHostPrm[0]));
MultiCh_setDec2DispMap(VDIS_DEV_HDMI,gVcapModuleContext.vcapConfig.numChn,0,0);
MultiCh_memPrintHeapStatus();
System_linkStart(gVdisModuleContext.displayId[0]); //xpli
System_linkStart(gVencModuleContext.ipcBitsInHLOSId);
System_linkStart(gVencModuleContext.ipcBitsOutRTOSId);
System_linkStart(gVencModuleContext.encId);
System_linkStart(gMultiCh_VcapVencVdisObj.ipcInVideoId);
System_linkStart(gMultiCh_VcapVencVdisObj.ipcOutVpssId);
System_linkStart(gVcapModuleContext.nsfId[0]);
System_linkStart(mergeId[1]);
System_linkStart(gMultiCh_VcapVencVdisObj.dupId[1]); //xpli
System_linkStart(gVdisModuleContext.swMsId[0]); //xpli
System_linkStart(gMultiCh_VcapVencVdisObj.dupId[0]); //xpli
System_linkStart(mergeId[0]);
System_linkStart(gVcapModuleContext.captureId);
}
你好,
你配置基本是这样的,
sclrPrm[0].pathId = SCLR_LINK_SC5;//SCLR_LINK_SEC0_SC3;//SCLR_LINK_SC5; sclrPrm[1].pathId = SCLR_LINK_SC5;//SCLR_LINK_SEC0_SC3; swMsPrm.swMsInstId[0] = SYSTEM_SW_MS_SC_INST_VIP0_SC;
你这样配置sc模块和使用1个sc模块的效果是一样的,但是你的总体性能只达到了32帧(1080P),理论应当是60帧(1080)是没有问题的;
你的m3vpss的主频配置是多少 ?
感谢你的回复,Ternence Hsu
文档中提到each SC can safely do - about 170MP/s processing (in TI816x)。
我的应用情况时4ch 1080p的scalar处理,也就是SC5要处理1920*1080*4*25=207MP/s,超过了SC5的处理能力。那么可以指定不同的SC模块进行处理吗?如何在代码中指定SC的硬件处理单元?是sclrPrm.pathId吗? 还是通过其它途径?
另外文档中提到的DDR BW是机制?
祝好!
Hi,Ternence Hsu
为什么这样设置效果是一样的?那具体应该怎样设置才能配置不同的SC模块,另外我的swms并不用SC功能。M3 VPSS主频250MHz。
祝好!
xinpeng li 说:我的应用情况时4ch 1080p的scalar处理,也就是SC5要处理1920*1080*4*25=207MP/s,超过了SC5的处理能力。那么可以指定不同的SC模块进行处理吗?
可以指定不同的sc模块进行出来,你这个2个sc link 可以指定不同的 path id 处理;出现错误,是你配置的结构在hdvpss中有互斥的逻辑,或者数据格式有问题;
你可以借助swms或者dei 实现scale 的功能;可以指定到 sc1(dei内部)、sc2(deih内部)、sc4(vip1内)模块上面,
xinpeng li 说:如何在代码中指定SC的硬件处理单元?是sclrPrm.pathId吗? 还是通过其它途径?
对, 在scale link 中是这样的,dei 或者 swms 都可以的,具体参考代码就可以
xinpeng li 说:为什么这样设置效果是一样的?那具体应该怎样设置才能配置不同的SC模块,另外我的swms并不用SC功能。M3 VPSS主频250MHz。
swms 模块是可以实现scale的效果的,你也可以使用dei模块,在内部都可以实现scale 的效果,
M3 VPSS主频 250M ,这样没有问题,正常,(如果过低会影响hdvpss中模块的性能)