Dear Expert,
I created my usecase as :
cap -> nsf -> dei -> enc(jpg) -> write frame to file
Here is part of my code:
..........................
for(vipInstId=0; vipInstId<capturePrm.numVipInst; vipInstId++)
{
pCaptureInstPrm = &capturePrm.vipInst[vipInstId];
pCaptureInstPrm->vipInstId = (SYSTEM_CAPTURE_INST_VIP0_PORTA+vipInstId)%SYSTEM_CAPTURE_INST_MAX;
pCaptureInstPrm->videoDecoderId = SYSTEM_DEVICE_VID_DEC_TVP5158_DRV;
pCaptureInstPrm->inDataFormat = SYSTEM_DF_YUV422P;
pCaptureInstPrm->standard = SYSTEM_STD_1080P_30; //SYSTEM_STD_MUX_4CH_D1;
pCaptureInstPrm->numOutput = 1;
pCaptureOutPrm = &pCaptureInstPrm->outParams[0];
pCaptureOutPrm->dataFormat = SYSTEM_DF_YUV422I_YUYV;
pCaptureOutPrm->scEnable = FALSE;
pCaptureOutPrm->scOutWidth = 0;
pCaptureOutPrm->scOutHeight = 0;
pCaptureOutPrm->outQueId = 0;
}
for(i = 0; i < NUM_CAPTURE_DEVICES; i++)
{
vidDecVideoModeArgs[i].videoIfMode = DEVICE_CAPT_VIDEO_IF_MODE_8BIT;
vidDecVideoModeArgs[i].videoDataFormat = SYSTEM_DF_YUV422P;
vidDecVideoModeArgs[i].standard = SYSTEM_STD_1080P_30; //SYSTEM_STD_MUX_4CH_D1;
vidDecVideoModeArgs[i].videoCaptureMode = DEVICE_CAPT_VIDEO_CAPTURE_MODE_MULTI_CH_PIXEL_MUX_EMBEDDED_SYNC;
vidDecVideoModeArgs[i].videoSystem = DEVICE_VIDEO_DECODER_VIDEO_SYSTEM_AUTO_DETECT;
vidDecVideoModeArgs[i].videoCropEnable = FALSE;
vidDecVideoModeArgs[i].videoAutoDetectTimeout = -1;
}
................................
gVcapModuleContext.deiId[0] = SYSTEM_LINK_ID_DEI_HQ_0;
deiPrm.outScaleFactor[DEI_LINK_OUT_QUE_VIP_SC][0].scaleMode = DEI_SCALE_MODE_RATIO;
deiPrm.outScaleFactor[DEI_LINK_OUT_QUE_VIP_SC][0].ratio.widthRatio.numerator = 1;
deiPrm.outScaleFactor[DEI_LINK_OUT_QUE_VIP_SC][0].ratio.widthRatio.denominator = 1;
deiPrm.outScaleFactor[DEI_LINK_OUT_QUE_VIP_SC][0].ratio.heightRatio.numerator = 1;
deiPrm.outScaleFactor[DEI_LINK_OUT_QUE_VIP_SC][0].ratio.heightRatio.denominator = 1;
...............................................
deiPrm.comprEnable = FALSE;
deiPrm.setVipScYuv422Format = FALSE;
deiPrm.inputFrameRate[DEI_LINK_OUT_QUE_VIP_SC] = 30;
deiPrm.outputFrameRate[DEI_LINK_OUT_QUE_VIP_SC] = 30;
deiPrm.enableDeiForceBypass = TRUE;
deiPrm.numBufsPerCh[DEI_LINK_OUT_QUE_VIP_SC] = 6;
deiPrm.enableOut[DEI_LINK_OUT_QUE_VIP_SC] = TRUE;
deiPrm.outQueParams[DEI_LINK_OUT_QUE_VIP_SC].nextLink = ipcId[IPC_OUT_VPSS_LINK_IDX];
If I use SYSTEM_STD_MUX_4CH_D1 parameter I get frame with resolution 704x288.
Then I've changed that parameter to SYSTEM_STD_1080P_30 and I get frame with the same resolution!
I would like to get 1920x1080.
What is wrong?
Thank you!
Void setMJPEGEncChParams (EncLink_CreateParams *encPrm, Int32 startChNum, Int32 endChNum) { Int32 i; EncLink_ChCreateParams *pLinkChPrm; EncLink_ChDynamicParams *pLinkDynPrm; VENC_CHN_DYNAMIC_PARAM_S *pDynPrm; VENC_CHN_PARAMS_S *pChPrm; for (i=startChNum; i<endChNum; 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 = 30; pLinkDynPrm->qpMin = 0; pLinkDynPrm->qpMax = 0; pLinkDynPrm->qpInit = -1; pLinkDynPrm->vbrDuration = 0; pLinkDynPrm->vbrSensitivity = 0; } } Void Create_Chain_VcapVenc_h264_2() { UInt32 NumberOfChannelTVP = 1; //1 to 4 !!! CaptureLink_CreateParams capturePrm; NsfLink_CreateParams nsfPrm[NUM_NSF_LINK]; DeiLink_CreateParams deiPrm; CaptureLink_VipInstParams *pCaptureInstPrm; CaptureLink_OutParams *pCaptureOutPrm; VCAP_VIDDEC_PARAMS_S vidDecVideoModeArgs[NUM_CAPTURE_DEVICES]; //UInt32 mergeId, dupId; UInt32 vipInstId, i, chId; /* For encoder's branch - start */ IpcLink_CreateParams ipcOutVpssPrm; IpcLink_CreateParams ipcInVideoPrm; EncLink_CreateParams encPrm; IpcBitsOutLinkRTOS_CreateParams ipcBitsOutVideoPrm; IpcBitsInLinkHLOS_CreateParams ipcBitsInHostPrm; System_LinkInfo bitsProducerLinkInfo; UInt32 ipcId[NUM_IPC_LINK]; for (i = 0; i < NUM_NSF_LINK;i++) MULTICH_INIT_STRUCT(NsfLink_CreateParams, nsfPrm[i]); System_linkControl( SYSTEM_LINK_ID_M3VPSS, SYSTEM_M3VPSS_CMD_RESET_VIDEO_DEVICES, NULL, 0, TRUE ); /* For encoder's branch */ System_linkControl( SYSTEM_LINK_ID_M3VIDEO, SYSTEM_COMMON_CMD_SET_CH2IVAHD_MAP_TBL, &systemVid_encDecIvaChMapTbl, sizeof(SystemVideo_Ivahd2ChMap_Tbl), TRUE ); gVcapModuleContext.captureId = SYSTEM_LINK_ID_CAPTURE; gVcapModuleContext.nsfId[NSF_AFTER_CAPTURE] = SYSTEM_LINK_ID_NSF_0; gVencModuleContext.encId = SYSTEM_LINK_ID_VENC_0; //ENCODERS IPC ipcId[IPC_OUT_VPSS_LINK_IDX] = SYSTEM_VPSS_LINK_ID_IPC_OUT_M3_0; ipcId[IPC_IN_VIDEO_LINK_IDX] = SYSTEM_VIDEO_LINK_ID_IPC_IN_M3_0; gVencModuleContext.ipcBitsOutRTOSId = SYSTEM_VIDEO_LINK_ID_IPC_BITS_OUT_0; gVencModuleContext.ipcBitsInHLOSId = SYSTEM_HOST_LINK_ID_IPC_BITS_IN_0; gVcapModuleContext.deiId[0] = SYSTEM_LINK_ID_DEI_HQ_0; MULTICH_INIT_STRUCT(IpcLink_CreateParams,ipcOutVpssPrm); MULTICH_INIT_STRUCT(IpcLink_CreateParams,ipcInVideoPrm); MULTICH_INIT_STRUCT(IpcBitsOutLinkRTOS_CreateParams,ipcBitsOutVideoPrm); MULTICH_INIT_STRUCT(IpcBitsInLinkHLOS_CreateParams,ipcBitsInHostPrm); MULTICH_INIT_STRUCT(EncLink_CreateParams, encPrm); CaptureLink_CreateParams_Init(&capturePrm); capturePrm.outQueParams[0].nextLink = gVcapModuleContext.nsfId[NSF_AFTER_CAPTURE]; capturePrm.numVipInst = NumberOfChannelTVP; capturePrm.tilerEnable = FALSE; capturePrm.numBufsPerCh = 6; for(vipInstId=0; vipInstId<capturePrm.numVipInst; vipInstId++) { pCaptureInstPrm = &capturePrm.vipInst[vipInstId]; pCaptureInstPrm->vipInstId = (SYSTEM_CAPTURE_INST_VIP0_PORTA+vipInstId)%SYSTEM_CAPTURE_INST_MAX; pCaptureInstPrm->videoDecoderId = SYSTEM_DEVICE_VID_DEC_TVP5158_DRV; pCaptureInstPrm->inDataFormat = SYSTEM_DF_YUV422P; pCaptureInstPrm->standard = SYSTEM_STD_1080P_30;//SYSTEM_STD_D1;//SYSTEM_STD_1080P_30;//SYSTEM_STD_MUX_4CH_D1; pCaptureInstPrm->numOutput = 1; pCaptureOutPrm = &pCaptureInstPrm->outParams[0]; pCaptureOutPrm->dataFormat = SYSTEM_DF_YUV422I_YUYV; pCaptureOutPrm->scEnable = FALSE; pCaptureOutPrm->scOutWidth = 1920; pCaptureOutPrm->scOutHeight = 1080; pCaptureOutPrm->outQueId = 0; } for(i = 0; i < NUM_CAPTURE_DEVICES; i++) { vidDecVideoModeArgs[i].videoIfMode = DEVICE_CAPT_VIDEO_IF_MODE_8BIT; vidDecVideoModeArgs[i].videoDataFormat = SYSTEM_DF_YUV422P; vidDecVideoModeArgs[i].standard = SYSTEM_STD_1080P_30;//SYSTEM_STD_D1;//SYSTEM_STD_1080P_30;//SYSTEM_STD_MUX_4CH_D1; vidDecVideoModeArgs[i].videoCaptureMode = DEVICE_CAPT_VIDEO_CAPTURE_MODE_MULTI_CH_PIXEL_MUX_EMBEDDED_SYNC; vidDecVideoModeArgs[i].videoSystem = DEVICE_VIDEO_DECODER_VIDEO_SYSTEM_AUTO_DETECT; vidDecVideoModeArgs[i].videoCropEnable = FALSE; vidDecVideoModeArgs[i].videoAutoDetectTimeout = -1; } if(gVsysModuleContext.enableFastUsecaseSwitch==FALSE) Vcap_configVideoDecoder(vidDecVideoModeArgs, NUM_CAPTURE_DEVICES); //cap <- nsf -> dei nsfPrm[NSF_AFTER_CAPTURE].bypassNsf = TRUE; nsfPrm[NSF_AFTER_CAPTURE].tilerEnable = FALSE; nsfPrm[NSF_AFTER_CAPTURE].inQueParams.prevLinkId = gVcapModuleContext.captureId; nsfPrm[NSF_AFTER_CAPTURE].inQueParams.prevLinkQueId = 0; nsfPrm[NSF_AFTER_CAPTURE].numOutQue = 1; nsfPrm[NSF_AFTER_CAPTURE].outQueParams[0].nextLink = gVcapModuleContext.deiId[0]; nsfPrm[NSF_AFTER_CAPTURE].numBufsPerCh = 6; //nsf <- dei -> ipcOutVpss DeiLink_CreateParams_Init(&deiPrm); deiPrm.inQueParams.prevLinkId = gVcapModuleContext.nsfId[NSF_AFTER_CAPTURE]; deiPrm.inQueParams.prevLinkQueId = 0; deiPrm.outScaleFactor[DEI_LINK_OUT_QUE_VIP_SC][0].scaleMode = DEI_SCALE_MODE_RATIO; deiPrm.outScaleFactor[DEI_LINK_OUT_QUE_VIP_SC][0].ratio.widthRatio.numerator = 1; deiPrm.outScaleFactor[DEI_LINK_OUT_QUE_VIP_SC][0].ratio.widthRatio.denominator = 1; deiPrm.outScaleFactor[DEI_LINK_OUT_QUE_VIP_SC][0].ratio.heightRatio.numerator = 1; deiPrm.outScaleFactor[DEI_LINK_OUT_QUE_VIP_SC][0].ratio.heightRatio.denominator = 1; for (chId=0; chId < 16; chId++) deiPrm.outScaleFactor[DEI_LINK_OUT_QUE_VIP_SC][chId] = deiPrm.outScaleFactor[DEI_LINK_OUT_QUE_VIP_SC][0]; deiPrm.comprEnable = FALSE; deiPrm.setVipScYuv422Format = FALSE; deiPrm.inputFrameRate[DEI_LINK_OUT_QUE_VIP_SC] = 30; deiPrm.outputFrameRate[DEI_LINK_OUT_QUE_VIP_SC] = 30; deiPrm.enableDeiForceBypass = TRUE; deiPrm.numBufsPerCh[DEI_LINK_OUT_QUE_VIP_SC] = 6; deiPrm.enableOut[DEI_LINK_OUT_QUE_VIP_SC] = TRUE; deiPrm.outQueParams[DEI_LINK_OUT_QUE_VIP_SC].nextLink = ipcId[IPC_OUT_VPSS_LINK_IDX]; //dei <- ipcOutVpss -> ipcInVideo ipcOutVpssPrm.inQueParams.prevLinkQueId = DEI_LINK_OUT_QUE_VIP_SC; ipcOutVpssPrm.inQueParams.prevLinkId = gVcapModuleContext.deiId[0]; ipcOutVpssPrm.numOutQue = 1; ipcOutVpssPrm.outQueParams[0].nextLink = ipcId[IPC_IN_VIDEO_LINK_IDX]; ipcOutVpssPrm.notifyPrevLink = TRUE; ipcOutVpssPrm.notifyNextLink = TRUE; ipcOutVpssPrm.noNotifyMode = FALSE; //ipcOutVpss <- ipcInVideo -> enc ipcInVideoPrm.inQueParams.prevLinkId = ipcId[IPC_OUT_VPSS_LINK_IDX]; ipcInVideoPrm.inQueParams.prevLinkQueId = 0; ipcInVideoPrm.numOutQue = 1; ipcInVideoPrm.outQueParams[0].nextLink = gVencModuleContext.encId; ipcInVideoPrm.notifyNextLink = TRUE; ipcInVideoPrm.notifyPrevLink = TRUE; ipcInVideoPrm.noNotifyMode = FALSE; //ipcInVideo <- enc -> ipcBitsOutVideo EncLink_CreateParams_Init(&encPrm); encPrm.numBufPerCh[0] = 6; setMJPEGEncChParams(&encPrm, 0, 16); encPrm.inQueParams.prevLinkId = ipcId[IPC_IN_VIDEO_LINK_IDX]; encPrm.inQueParams.prevLinkQueId = 0; encPrm.outQueParams.nextLink = gVencModuleContext.ipcBitsOutRTOSId; //enc <- ipcBitsOutVideo -> ipcBitsInHost ipcBitsOutVideoPrm.baseCreateParams.inQueParams.prevLinkId = gVencModuleContext.encId; ipcBitsOutVideoPrm.baseCreateParams.inQueParams.prevLinkQueId = 0; ipcBitsOutVideoPrm.baseCreateParams.numOutQue = 1; ipcBitsOutVideoPrm.baseCreateParams.outQueParams[0].nextLink = gVencModuleContext.ipcBitsInHLOSId; ipcBitsOutVideoPrm.baseCreateParams.notifyNextLink = TRUE; ipcBitsOutVideoPrm.baseCreateParams.notifyPrevLink = TRUE; ipcBitsOutVideoPrm.baseCreateParams.noNotifyMode = FALSE; ipcBitsOutVideoPrm.baseCreateParams.notifyProcessLink = FALSE; //ipcBitsOutVideo <- ipcBitsInHost -> SYSTEM_LINK_ID_INVALID ipcBitsInHostPrm.baseCreateParams.inQueParams.prevLinkId = gVencModuleContext.ipcBitsOutRTOSId; ipcBitsInHostPrm.baseCreateParams.inQueParams.prevLinkQueId = 0; ipcBitsInHostPrm.baseCreateParams.numOutQue = 1; ipcBitsInHostPrm.baseCreateParams.outQueParams[0].nextLink = SYSTEM_LINK_ID_INVALID; ipcBitsInHostPrm.baseCreateParams.noNotifyMode = FALSE; ipcBitsInHostPrm.baseCreateParams.notifyNextLink = TRUE; ipcBitsInHostPrm.baseCreateParams.notifyPrevLink = TRUE; ipcBitsInHostPrm.cbCtx = NULL; ipcBitsInHostPrm.cbFxn = DataAvailable_cb; capturePrm.isPalMode = Vcap_isPalMode(); /* * Create ALL Modules * */ System_linkCreate (gVcapModuleContext.captureId, &capturePrm, sizeof(capturePrm)); System_linkCreate (gVcapModuleContext.nsfId[NSF_AFTER_CAPTURE], &nsfPrm[NSF_AFTER_CAPTURE], sizeof(nsfPrm[NSF_AFTER_CAPTURE])); System_linkCreate(gVcapModuleContext.deiId[0], &deiPrm, sizeof(deiPrm)); System_linkCreate(ipcId[IPC_OUT_VPSS_LINK_IDX], &ipcOutVpssPrm , sizeof(ipcOutVpssPrm) ); System_linkCreate(ipcId[IPC_IN_VIDEO_LINK_IDX], &ipcInVideoPrm , sizeof(ipcInVideoPrm) ); System_linkCreate(gVencModuleContext.encId, &encPrm, sizeof(encPrm)); System_linkCreate(gVencModuleContext.ipcBitsOutRTOSId, &ipcBitsOutVideoPrm, sizeof(ipcBitsOutVideoPrm)); System_linkCreate(gVencModuleContext.ipcBitsInHLOSId, &ipcBitsInHostPrm, sizeof(ipcBitsInHostPrm)); System_linkGetInfo(gVencModuleContext.ipcBitsInHLOSId, &bitsProducerLinkInfo); printf ("\n\n========bitsProducerLinkInfo============\n"); printf ("numQ %d, numCh %d\n", bitsProducerLinkInfo.numQue, bitsProducerLinkInfo.queInfo[0].numCh); { int i; for (i=0; i<bitsProducerLinkInfo.queInfo[0].numCh; i++) { printf ("Ch [%d] Width %d, Height %d\n", i, bitsProducerLinkInfo.queInfo[0].chInfo[i].width, bitsProducerLinkInfo.queInfo[0].chInfo[i].height ); } } printf ("\n====================\n\n"); }