static Void DisplayLink_drvSetFieldSeparatedInfo(DisplayLink_Obj * pObj) { Int i,status; DisplayLink_CreateParams * pPrm; pPrm = &pObj->createArgs; for (i = 0; i < pObj->createArgs.numInputQueues;i++) { status = System_linkGetInfo(pPrm->inQueParams[i].prevLinkId, &pObj->inTskInfo[i]); UTILS_assert(status == FVID2_SOK); if (DisplayLink_drvIsSDDef(pObj)) { pObj->fieldInput[i] = DisplayLink_drvIsFieldSeparatedInput (pObj, &pObj->inTskInfo[i].queInfo[pPrm->inQueParams[i].prevLinkQueId]); if(pObj->fieldInput[i]) { Vps_printf(" %d: DISPLAY: %d: Field Separate Mode ENABLED for Que %d !!!\n", Utils_getCurTimeInMsec(), SYSTEM_GET_LINK_ID(pObj->tskId), i ); } } else { pObj->fieldInput[i] = FALSE; } } }
Int32 AlgLink_algCreate(AlgLink_Obj * pObj, AlgLink_CreateParams * pPrm) { Int32 status; Vps_printf(" %d: ALG : Create in progress !!!\n", Utils_getCurTimeInMsec()); UTILS_MEMLOG_USED_START(); memcpy(&pObj->createArgs, pPrm, sizeof(*pPrm)); memcpy(&pObj->scdAlg.createArgs, &pPrm->scdCreateParams, sizeof(AlgLink_ScdCreateParams)); memcpy(&pObj->osdAlg.osdChCreateParams, &pPrm->osdChCreateParams, (sizeof(AlgLink_OsdChCreateParams) * ALG_LINK_OSD_MAX_CH)); status = System_linkGetInfo(pPrm->inQueParams.prevLinkId, &pObj->inTskInfo); UTILS_assert(status == FVID2_SOK); UTILS_assert(pPrm->inQueParams.prevLinkQueId < pObj->inTskInfo.numQue); memcpy(&pObj->inQueInfo, &pObj->inTskInfo.queInfo[pPrm->inQueParams.prevLinkQueId], sizeof(pObj->inQueInfo)); UTILS_assert(pObj->inQueInfo.numCh <= ALG_LINK_OSD_MAX_CH); pObj->scdAlg.inQueInfo = &pObj->inQueInfo; pObj->osdAlg.inQueInfo = &pObj->inQueInfo; if (pObj->createArgs.enableOSDAlg) { status = AlgLink_OsdalgCreate(&pObj->osdAlg); UTILS_assert(status == FVID2_SOK); } if (pObj->createArgs.enableSCDAlg) { status = AlgLink_ScdalgCreate(&pObj->scdAlg); UTILS_assert(status == FVID2_SOK); AlgLink_createOutObj(pObj); } pObj->isCreated = ALG_LINK_STATE_ACTIVE; UTILS_MEMLOG_USED_END(pObj->memUsed); UTILS_MEMLOG_PRINT("ALGLINK", pObj->memUsed, UTILS_ARRAYSIZE(pObj->memUsed)); Vps_printf(" %d: ALG : Create Done !!!\n", Utils_getCurTimeInMsec()); return FVID2_SOK; }
/* This usecase assumes CIF/QCIF <secondary out>, MJPEG are enabled */ Void MultiCh_createProgressive8D1VcapVencVdecVdis() { CaptureLink_CreateParams capturePrm; SclrLink_CreateParams sclrPrm; NsfLink_CreateParams nsfPrm; DeiLink_CreateParams deiPrm; MergeLink_CreateParams mergePrm[NUM_MERGE_LINK]; DupLink_CreateParams dupPrm[NUM_DUP_LINK]; static SwMsLink_CreateParams swMsPrm[VDIS_DEV_MAX]; DisplayLink_CreateParams displayPrm[VDIS_DEV_MAX]; IpcLink_CreateParams ipcOutVpssPrm; IpcLink_CreateParams ipcInVpssPrm; IpcLink_CreateParams ipcOutVideoPrm; IpcLink_CreateParams ipcInVideoPrm; EncLink_CreateParams encPrm; DecLink_CreateParams decPrm; IpcBitsOutLinkHLOS_CreateParams ipcBitsOutHostPrm; IpcBitsOutLinkRTOS_CreateParams ipcBitsOutVideoPrm; IpcBitsInLinkHLOS_CreateParams ipcBitsInHostPrm[2]; IpcBitsInLinkRTOS_CreateParams ipcBitsInVideoPrm; CaptureLink_VipInstParams *pCaptureInstPrm; CaptureLink_OutParams *pCaptureOutPrm; IpcFramesInLinkRTOS_CreateParams ipcFramesInDspPrm; IpcFramesOutLinkRTOS_CreateParams ipcFramesOutVpssPrm; AlgLink_CreateParams dspAlgPrm; System_LinkInfo bitsProducerLinkInfo; UInt32 mergeId[NUM_MERGE_LINK]; UInt32 dupId[NUM_DUP_LINK]; UInt32 ipcOutVpssId, ipcInVpssId; UInt32 ipcOutVideoId, ipcInVideoId; VCAP_VIDDEC_PARAMS_S vidDecVideoModeArgs[NUM_CAPTURE_DEVICES]; IpcBitsOutLinkRTOS_CreateParams ipcBitsOutDspPrm; UInt32 ipcBitsOutDSPId; UInt32 vipInstId; UInt32 i, j; Bool enableOsdAlgLink = gVsysModuleContext.vsysConfig.enableOsd; Bool enableScdAlgLink = gVsysModuleContext.vsysConfig.enableScd; MULTICH_INIT_STRUCT(IpcLink_CreateParams,ipcOutVpssPrm); MULTICH_INIT_STRUCT(IpcLink_CreateParams,ipcInVpssPrm); MULTICH_INIT_STRUCT(IpcLink_CreateParams,ipcOutVideoPrm); MULTICH_INIT_STRUCT(IpcLink_CreateParams,ipcInVideoPrm); MULTICH_INIT_STRUCT(IpcBitsOutLinkHLOS_CreateParams,ipcBitsOutHostPrm); MULTICH_INIT_STRUCT(IpcBitsOutLinkRTOS_CreateParams,ipcBitsOutVideoPrm); MULTICH_INIT_STRUCT(IpcBitsOutLinkRTOS_CreateParams,ipcBitsOutDspPrm); MULTICH_INIT_STRUCT(IpcBitsInLinkHLOS_CreateParams,ipcBitsInHostPrm[0]); MULTICH_INIT_STRUCT(IpcBitsInLinkHLOS_CreateParams,ipcBitsInHostPrm[1]); MULTICH_INIT_STRUCT(IpcBitsInLinkRTOS_CreateParams,ipcBitsInVideoPrm); MULTICH_INIT_STRUCT(DecLink_CreateParams, decPrm); MULTICH_INIT_STRUCT(IpcFramesInLinkRTOS_CreateParams,ipcFramesInDspPrm); MULTICH_INIT_STRUCT(IpcFramesOutLinkRTOS_CreateParams,ipcFramesOutVpssPrm); MULTICH_INIT_STRUCT(EncLink_CreateParams, encPrm); MULTICH_INIT_STRUCT(AlgLink_CreateParams, dspAlgPrm); 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(SclrLink_CreateParams, sclrPrm); MULTICH_INIT_STRUCT(NsfLink_CreateParams, nsfPrm); MULTICH_INIT_STRUCT(DeiLink_CreateParams, deiPrm); printf("\n********* Entered usecase 8CH <814x> Enc/Dec OSD %s SCD %s \n\n", enableOsdAlgLink == TRUE ? "Enabled" : "Disabled", enableScdAlgLink == TRUE ? "Enabled" : "Disabled" ); 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 (TILER_ENABLE == FALSE) { /* Disable tiler allocator for this usecase * for that tiler memory can be reused for * non-tiled allocation */ SystemTiler_disableAllocator(); } #endif vipInstId = 0; gVcapModuleContext.captureId = SYSTEM_LINK_ID_CAPTURE; if(enableOsdAlgLink || enableScdAlgLink) { dspAlgPrm.enableOSDAlg = TRUE; 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; if(enableScdAlgLink) { ipcBitsOutDSPId = SYSTEM_DSP_LINK_ID_IPC_BITS_OUT_0; gVcapModuleContext.ipcBitsInHLOSId = SYSTEM_HOST_LINK_ID_IPC_BITS_IN_0; } } gVcapModuleContext.sclrId[0] = SYSTEM_LINK_ID_SCLR_INST_0; gVcapModuleContext.nsfId[0] = SYSTEM_LINK_ID_NSF_0; gVcapModuleContext.deiId[0] = SYSTEM_LINK_ID_DEI_0; gVencModuleContext.encId = SYSTEM_LINK_ID_VENC_0; gVdecModuleContext.decId = SYSTEM_LINK_ID_VDEC_0; gVdisModuleContext.swMsId[0] = SYSTEM_LINK_ID_SW_MS_MULTI_INST_0; gVdisModuleContext.swMsId[1] = SYSTEM_LINK_ID_SW_MS_MULTI_INST_1; swMsPrm[0].numSwMsInst = 1; swMsPrm[1].numSwMsInst = 1; #if defined(TI_814X_BUILD) || defined(TI_8107_BUILD) /* use AUX scaler (SC2), since SC1 is used for DEI */ swMsPrm[0].swMsInstId[0] = SYSTEM_SW_MS_SC_INST_DEI_SC_NO_DEI; #else /* use MAIN scaler (SC1), since SC2 is used for DEI */ swMsPrm[0].swMsInstId[0] = SYSTEM_SW_MS_SC_INST_DEIHQ_SC_NO_DEI; #endif swMsPrm[1].swMsInstId[0] = SYSTEM_SW_MS_SC_INST_SC5; gVdisModuleContext.displayId[0] = SYSTEM_LINK_ID_DISPLAY_0; /* ON AND OFF CHIP HDMI */ gVdisModuleContext.displayId[1] = SYSTEM_LINK_ID_DISPLAY_2; /* SDTV */ mergeId[LIVE_DECODE_MERGE_LINK_IDX] = SYSTEM_VPSS_LINK_ID_MERGE_0; mergeId[D1_CIF_MERGE_LINK_IDX] = SYSTEM_VPSS_LINK_ID_MERGE_1; dupId[CAP_DUP_LINK_IDX] = SYSTEM_VPSS_LINK_ID_DUP_0; dupId[LIVE_DECODE_DUP_LINK_IDX] = SYSTEM_VPSS_LINK_ID_DUP_1; ipcOutVpssId = SYSTEM_VPSS_LINK_ID_IPC_OUT_M3_0; ipcInVideoId = SYSTEM_VIDEO_LINK_ID_IPC_IN_M3_0; ipcOutVideoId= SYSTEM_VIDEO_LINK_ID_IPC_OUT_M3_0; ipcInVpssId = SYSTEM_VPSS_LINK_ID_IPC_IN_M3_0; gVencModuleContext.ipcBitsOutRTOSId = SYSTEM_VIDEO_LINK_ID_IPC_BITS_OUT_0; if(enableScdAlgLink) gVencModuleContext.ipcBitsInHLOSId = SYSTEM_HOST_LINK_ID_IPC_BITS_IN_1; else gVencModuleContext.ipcBitsInHLOSId = SYSTEM_HOST_LINK_ID_IPC_BITS_IN_0; gVdecModuleContext.ipcBitsOutHLOSId = SYSTEM_HOST_LINK_ID_IPC_BITS_OUT_0; gVdecModuleContext.ipcBitsInRTOSId = SYSTEM_VIDEO_LINK_ID_IPC_BITS_IN_0; CaptureLink_CreateParams_Init(&capturePrm); capturePrm.outQueParams[0].nextLink = dupId[CAP_DUP_LINK_IDX]; capturePrm.numVipInst = 2; capturePrm.tilerEnable = FALSE; capturePrm.numBufsPerCh = NUM_CAPTURE_BUFFERS; capturePrm.maxBlindAreasPerCh = 4; pCaptureInstPrm = &capturePrm.vipInst[0]; 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_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; pCaptureInstPrm = &capturePrm.vipInst[1]; pCaptureInstPrm->vipInstId = SYSTEM_CAPTURE_INST_VIP0_PORTB; pCaptureInstPrm->videoDecoderId = SYSTEM_DEVICE_VID_DEC_TVP5158_DRV; pCaptureInstPrm->inDataFormat = SYSTEM_DF_YUV422P; pCaptureInstPrm->standard = 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_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; } Vcap_configVideoDecoder(vidDecVideoModeArgs, NUM_CAPTURE_DEVICES); dupPrm[CAP_DUP_LINK_IDX].inQueParams.prevLinkId = gVcapModuleContext.captureId; dupPrm[CAP_DUP_LINK_IDX].inQueParams.prevLinkQueId = 0; dupPrm[CAP_DUP_LINK_IDX].notifyNextLink = TRUE; dupPrm[CAP_DUP_LINK_IDX].numOutQue = 2; dupPrm[CAP_DUP_LINK_IDX].outQueParams[0].nextLink = gVcapModuleContext.deiId[0]; dupPrm[CAP_DUP_LINK_IDX].outQueParams[1].nextLink = gVcapModuleContext.sclrId[0]; deiPrm.inQueParams.prevLinkId = dupId[CAP_DUP_LINK_IDX]; deiPrm.inQueParams.prevLinkQueId = 0; /* Set Output Scaling at DEI based on ratio */ deiPrm.outScaleFactor[DEI_LINK_OUT_QUE_DEI_SC][0].scaleMode = DEI_SCALE_MODE_RATIO; deiPrm.outScaleFactor[DEI_LINK_OUT_QUE_DEI_SC][0].ratio.widthRatio.numerator = 1; deiPrm.outScaleFactor[DEI_LINK_OUT_QUE_DEI_SC][0].ratio.widthRatio.denominator = 1; deiPrm.outScaleFactor[DEI_LINK_OUT_QUE_DEI_SC][0].ratio.heightRatio.numerator = 1; deiPrm.outScaleFactor[DEI_LINK_OUT_QUE_DEI_SC][0].ratio.heightRatio.denominator = 1; for (i=1; i < DEI_LINK_MAX_CH; i++) deiPrm.outScaleFactor[DEI_LINK_OUT_QUE_DEI_SC][i] = deiPrm.outScaleFactor[DEI_LINK_OUT_QUE_DEI_SC][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.heightRatio.numerator = 1; deiPrm.outScaleFactor[DEI_LINK_OUT_QUE_VIP_SC][0].ratio.heightRatio.denominator = 1; 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; for (i=1; i < DEI_LINK_MAX_CH; i++) deiPrm.outScaleFactor[DEI_LINK_OUT_QUE_VIP_SC][i] = deiPrm.outScaleFactor[DEI_LINK_OUT_QUE_VIP_SC][0]; deiPrm.outScaleFactor[DEI_LINK_OUT_QUE_VIP_SC_SECONDARY_OUT][0].scaleMode = DEI_SCALE_MODE_RATIO; deiPrm.outScaleFactor[DEI_LINK_OUT_QUE_VIP_SC_SECONDARY_OUT][0].ratio.heightRatio.numerator = 1; deiPrm.outScaleFactor[DEI_LINK_OUT_QUE_VIP_SC_SECONDARY_OUT][0].ratio.heightRatio.denominator = 1; deiPrm.outScaleFactor[DEI_LINK_OUT_QUE_VIP_SC_SECONDARY_OUT][0].ratio.widthRatio.numerator = 1; deiPrm.outScaleFactor[DEI_LINK_OUT_QUE_VIP_SC_SECONDARY_OUT][0].ratio.widthRatio.denominator = 1; for (i=1; i < DEI_LINK_MAX_CH; i++) deiPrm.outScaleFactor[DEI_LINK_OUT_QUE_VIP_SC_SECONDARY_OUT][i] = deiPrm.outScaleFactor[DEI_LINK_OUT_QUE_VIP_SC_SECONDARY_OUT][0]; deiPrm.enableOut[DEI_LINK_OUT_QUE_DEI_SC] = TRUE; deiPrm.enableOut[DEI_LINK_OUT_QUE_VIP_SC] = TRUE; deiPrm.enableOut[DEI_LINK_OUT_QUE_VIP_SC_SECONDARY_OUT] = TRUE; deiPrm.outputFrameRate[DEI_LINK_OUT_QUE_VIP_SC_SECONDARY_OUT] = 1; deiPrm.outQueParams[DEI_LINK_OUT_QUE_DEI_SC].nextLink = mergeId[LIVE_DECODE_MERGE_LINK_IDX]; deiPrm.outQueParams[DEI_LINK_OUT_QUE_VIP_SC].nextLink = mergeId[D1_CIF_MERGE_LINK_IDX]; deiPrm.outQueParams[DEI_LINK_OUT_QUE_VIP_SC_SECONDARY_OUT].nextLink = mergeId[D1_CIF_MERGE_LINK_IDX]; deiPrm.tilerEnable[DEI_LINK_OUT_QUE_VIP_SC] = TILER_ENABLE; deiPrm.comprEnable = FALSE; deiPrm.setVipScYuv422Format = FALSE; sclrPrm.enableLineSkipSc = FALSE; sclrPrm.inputFrameRate = 30; sclrPrm.outputFrameRate = 30; sclrPrm.inQueParams.prevLinkId = dupId[CAP_DUP_LINK_IDX]; sclrPrm.inQueParams.prevLinkQueId = 1; sclrPrm.outQueParams.nextLink = gVcapModuleContext.nsfId[0]; sclrPrm.scaleMode = DEI_SCALE_MODE_RATIO; sclrPrm.outScaleFactor.ratio.heightRatio.numerator = 1; sclrPrm.outScaleFactor.ratio.heightRatio.denominator = 2; sclrPrm.outScaleFactor.ratio.widthRatio.numerator = 1; sclrPrm.outScaleFactor.ratio.widthRatio.denominator = 4; sclrPrm.tilerEnable = FALSE; nsfPrm.bypassNsf = TRUE; nsfPrm.tilerEnable = FALSE; nsfPrm.inQueParams.prevLinkId = gVcapModuleContext.sclrId[0]; nsfPrm.inQueParams.prevLinkQueId = 0; nsfPrm.numOutQue = 1; nsfPrm.outQueParams[0].nextLink = mergeId[D1_CIF_MERGE_LINK_IDX]; nsfPrm.numBufsPerCh = NUM_NSF_BUFFERS; nsfPrm.inputFrameRate = 30; nsfPrm.outputFrameRate = 30; /* Merge Q0 - D1 <from VIP-SC>, Q1 - CIF <from VIP-SC_SECONDARY>, Q2 -D1 for MJPEG <from DEI-SC> */ mergePrm[D1_CIF_MERGE_LINK_IDX].inQueParams[0].prevLinkId = gVcapModuleContext.deiId[0]; mergePrm[D1_CIF_MERGE_LINK_IDX].inQueParams[0].prevLinkQueId = DEI_LINK_OUT_QUE_VIP_SC; mergePrm[D1_CIF_MERGE_LINK_IDX].inQueParams[1].prevLinkId = gVcapModuleContext.nsfId[0]; mergePrm[D1_CIF_MERGE_LINK_IDX].inQueParams[1].prevLinkQueId = 0; mergePrm[D1_CIF_MERGE_LINK_IDX].inQueParams[2].prevLinkId = gVcapModuleContext.deiId[0]; mergePrm[D1_CIF_MERGE_LINK_IDX].inQueParams[2].prevLinkQueId = DEI_LINK_OUT_QUE_VIP_SC_SECONDARY_OUT; mergePrm[D1_CIF_MERGE_LINK_IDX].notifyNextLink = TRUE; mergePrm[D1_CIF_MERGE_LINK_IDX].numInQue = 3; if (enableOsdAlgLink || enableScdAlgLink) { mergePrm[D1_CIF_MERGE_LINK_IDX].outQueParams.nextLink = gVcapModuleContext.ipcFramesOutVpssId[0]; ipcOutVpssPrm.inQueParams.prevLinkId = gVcapModuleContext.ipcFramesOutVpssId[0]; /* Redirect to DSP for OSD / SCD */ ipcFramesOutVpssPrm .baseCreateParams.inQueParams.prevLinkId = mergeId[D1_CIF_MERGE_LINK_IDX]; ipcFramesOutVpssPrm.baseCreateParams.inQueParams.prevLinkQueId = 0; ipcFramesOutVpssPrm.baseCreateParams.outQueParams[0].nextLink = ipcOutVpssId; 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.inQueParams.prevLinkId = gVcapModuleContext.ipcFramesInDspId[0]; dspAlgPrm.inQueParams.prevLinkQueId = 0; } else { mergePrm[D1_CIF_MERGE_LINK_IDX].outQueParams.nextLink = ipcOutVpssId; ipcOutVpssPrm.inQueParams.prevLinkId = mergeId[D1_CIF_MERGE_LINK_IDX]; } ipcOutVpssPrm.inQueParams.prevLinkQueId = 0; ipcOutVpssPrm.numOutQue = 1; ipcOutVpssPrm.outQueParams[0].nextLink = ipcInVideoId; ipcOutVpssPrm.notifyNextLink = TRUE; ipcOutVpssPrm.notifyPrevLink = TRUE; ipcOutVpssPrm.noNotifyMode = FALSE; ipcInVideoPrm.inQueParams.prevLinkId = ipcOutVpssId; ipcInVideoPrm.inQueParams.prevLinkQueId = 0; ipcInVideoPrm.numOutQue = 1; ipcInVideoPrm.outQueParams[0].nextLink = gVencModuleContext.encId; ipcInVideoPrm.notifyNextLink = TRUE; ipcInVideoPrm.notifyPrevLink = TRUE; ipcInVideoPrm.noNotifyMode = FALSE; encPrm.numBufPerCh[0] = NUM_ENCODE_D1_BUFFERS; encPrm.numBufPerCh[1] = NUM_ENCODE_CIF_BUFFERS; { 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 = 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->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 = 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->rcAlg = pDynPrm->rcAlg; pLinkDynPrm->qpMin = pDynPrm->qpMin; pLinkDynPrm->qpMax = pDynPrm->qpMax; pLinkDynPrm->qpInit = pDynPrm->qpInit; pLinkDynPrm->vbrDuration = pDynPrm->vbrDuration; pLinkDynPrm->vbrSensitivity = pDynPrm->vbrSensitivity; } } /* 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 = 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 = 1;//pDynPrm->inputFrameRate; pLinkDynPrm->qpMin = 0; pLinkDynPrm->qpMax = 0; pLinkDynPrm->qpInit = -1; pLinkDynPrm->vbrDuration = 0; pLinkDynPrm->vbrSensitivity = 0; } } encPrm.inQueParams.prevLinkId = ipcInVideoId; encPrm.inQueParams.prevLinkQueId = 0; encPrm.outQueParams.nextLink = gVencModuleContext.ipcBitsOutRTOSId; } 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; MultiCh_ipcBitsInitCreateParams_BitsInHLOS(&ipcBitsInHostPrm[0]); if(enableOsdAlgLink) { int chId; 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 = 0; } } if (enableScdAlgLink) { Int32 numBlksInFrame; Int32 numHorzBlks, numVertBlks, chId; Uint32 x, y, i; //AlgLink_ScdblkChngConfig blkConfig[ALG_LINK_SCD_MAX_BLOCKS_IN_FRAME]; dspAlgPrm.enableSCDAlg = TRUE; dspAlgPrm.outQueParams[ALG_LINK_SCD_OUT_QUE].nextLink = ipcBitsOutDSPId; dspAlgPrm.scdCreateParams.maxWidth = 176; dspAlgPrm.scdCreateParams.maxHeight = 144; dspAlgPrm.scdCreateParams.maxStride = 176; dspAlgPrm.scdCreateParams.numValidChForSCD = 8; dspAlgPrm.scdCreateParams.numSecs2WaitB4Init = 3; dspAlgPrm.scdCreateParams.numSecs2WaitB4FrmAlert= 1; dspAlgPrm.scdCreateParams.inputFrameRate = 30; dspAlgPrm.scdCreateParams.outputFrameRate = 5; dspAlgPrm.scdCreateParams.numSecs2WaitAfterFrmAlert = 2; dspAlgPrm.scdCreateParams.enableMotionNotify = FALSE; dspAlgPrm.scdCreateParams.enableTamperNotify = FALSE; // Configure array to monitor scene changes in all frame blocks, i.e., motion detection. // Each block is fixed to be 32x10 in size, numHorzBlks = ((dspAlgPrm.scdCreateParams.maxWidth + 0x1F ) & (~0x1F)) / 32; if (dspAlgPrm.scdCreateParams.maxHeight == 120) numVertBlks = dspAlgPrm.scdCreateParams.maxHeight / 10; else numVertBlks = dspAlgPrm.scdCreateParams.maxHeight / 12; numBlksInFrame = numHorzBlks * numVertBlks; for(chId = 0; chId < dspAlgPrm.scdCreateParams.numValidChForSCD; chId++) { AlgLink_ScdChParams * chPrm = &dspAlgPrm.scdCreateParams.chDefaultParams[chId]; chPrm->blkNumBlksInFrame = numBlksInFrame; chPrm->chId = SCDChannelMonitor[chId]; chPrm->mode = ALG_LINK_SCD_DETECTMODE_MONITOR_BLOCKS_AND_FRAME; chPrm->frmIgnoreLightsON = FALSE; chPrm->frmIgnoreLightsOFF = FALSE; chPrm->frmSensitivity = ALG_LINK_SCD_SENSITIVITY_MID; chPrm->frmEdgeThreshold = 100; i = 0; for(y = 0; y < numVertBlks; y++) { for(x = 0; x < numHorzBlks; x++) { chPrm->blkConfig[i].sensitivity = ALG_LINK_SCD_SENSITIVITY_MID; chPrm->blkConfig[i].monitored = 0; i++; } } } ipcBitsOutDspPrm.baseCreateParams.inQueParams.prevLinkId = gVcapModuleContext.dspAlgId[0]; ipcBitsOutDspPrm.baseCreateParams.inQueParams.prevLinkQueId = 0; ipcBitsOutDspPrm.baseCreateParams.numOutQue = 1; ipcBitsOutDspPrm.baseCreateParams.outQueParams[0].nextLink = gVcapModuleContext.ipcBitsInHLOSId; MultiCh_ipcBitsInitCreateParams_BitsOutRTOS(&ipcBitsOutDspPrm, TRUE); ipcBitsOutDspPrm.baseCreateParams.notifyNextLink = TRUE; ipcBitsOutDspPrm.baseCreateParams.noNotifyMode = FALSE; ipcBitsInHostPrm[1].baseCreateParams.inQueParams.prevLinkId = ipcBitsOutDSPId; ipcBitsInHostPrm[1].baseCreateParams.inQueParams.prevLinkQueId = 0; MultiCh_ipcBitsInitCreateParams_BitsInHLOSVcap(&ipcBitsInHostPrm[1]); ipcBitsInHostPrm[1].baseCreateParams.notifyPrevLink = TRUE; ipcBitsInHostPrm[1].baseCreateParams.noNotifyMode = FALSE; } else { dspAlgPrm.outQueParams[ALG_LINK_SCD_OUT_QUE].nextLink = SYSTEM_LINK_ID_INVALID; } #ifndef SYSTEM_USE_VIDEO_DECODER capturePrm.isPalMode = Vcap_isPalMode(); #endif System_linkCreate (gVcapModuleContext.captureId, &capturePrm, sizeof(capturePrm)); System_linkCreate(dupId[CAP_DUP_LINK_IDX], &dupPrm[CAP_DUP_LINK_IDX], sizeof(dupPrm[CAP_DUP_LINK_IDX])); System_linkCreate(gVcapModuleContext.sclrId[0], &sclrPrm, sizeof(sclrPrm)); System_linkCreate(gVcapModuleContext.nsfId[0] , &nsfPrm, sizeof(nsfPrm)); System_linkCreate(gVcapModuleContext.deiId[0], &deiPrm, sizeof(deiPrm)); System_linkCreate(mergeId[D1_CIF_MERGE_LINK_IDX], &mergePrm[D1_CIF_MERGE_LINK_IDX], sizeof(mergePrm[D1_CIF_MERGE_LINK_IDX])); if(enableOsdAlgLink || enableScdAlgLink) { System_linkCreate(gVcapModuleContext.ipcFramesOutVpssId[0], &ipcFramesOutVpssPrm, sizeof(ipcFramesOutVpssPrm)); System_linkCreate(gVcapModuleContext.ipcFramesInDspId[0], &ipcFramesInDspPrm, sizeof(ipcFramesInDspPrm)); System_linkCreate(gVcapModuleContext.dspAlgId[0] , &dspAlgPrm, sizeof(dspAlgPrm)); if(enableScdAlgLink) { System_linkCreate(ipcBitsOutDSPId, &ipcBitsOutDspPrm, sizeof(ipcBitsOutDspPrm)); System_linkCreate(gVcapModuleContext.ipcBitsInHLOSId, &ipcBitsInHostPrm[1], sizeof(ipcBitsInHostPrm[1])); } } System_linkCreate(ipcOutVpssId , &ipcOutVpssPrm , sizeof(ipcOutVpssPrm) ); System_linkCreate(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])); System_linkGetInfo(gVencModuleContext.ipcBitsInHLOSId,&bitsProducerLinkInfo); OSA_assert(bitsProducerLinkInfo.numQue == 1); ipcBitsOutHostPrm.baseCreateParams.outQueParams[0].nextLink = gVdecModuleContext.ipcBitsInRTOSId; 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"); if (bitsProducerLinkInfo.queInfo[0].numCh > gVencModuleContext.vencConfig.numPrimaryChn) bitsProducerLinkInfo.queInfo[0].numCh = gVencModuleContext.vencConfig.numPrimaryChn; printf ("Reducing bitsProducerLinkInfo.numCh to %d\n", bitsProducerLinkInfo.queInfo[0].numCh); MultiCh_ipcBitsInitCreateParams_BitsOutHLOS(&ipcBitsOutHostPrm, &bitsProducerLinkInfo.queInfo[0]); ipcBitsOutHostPrm.numBufPerCh[0] = NUM_IPC_OUT_BUFFERS; if(gVdecModuleContext.vdecConfig.forceUseDecChannelParams) { /* use channel info provided by user instead of from encoder */ UInt32 chId; System_LinkChInfo *pChInfo; ipcBitsOutHostPrm.inQueInfo.numCh = gVdecModuleContext.vdecConfig.numChn; for(chId=0; chId<ipcBitsOutHostPrm.inQueInfo.numCh; chId++) { pChInfo = &ipcBitsOutHostPrm.inQueInfo.chInfo[chId]; /* Not Used - Start */ pChInfo->bufType = 0; pChInfo->codingformat = 0; pChInfo->dataFormat = 0; pChInfo->memType = 0; pChInfo->startX = 0; pChInfo->startY = 0; pChInfo->pitch[0] = 0; pChInfo->pitch[1] = 0; pChInfo->pitch[2] = 0; /* Not Used - End */ pChInfo->width = gVdecModuleContext.vdecConfig.decChannelParams[chId].maxVideoWidth; pChInfo->height = gVdecModuleContext.vdecConfig.decChannelParams[chId].maxVideoHeight; pChInfo->scanFormat = SYSTEM_SF_PROGRESSIVE; } } ipcBitsInVideoPrm.baseCreateParams.inQueParams.prevLinkId = gVdecModuleContext.ipcBitsOutHLOSId; ipcBitsInVideoPrm.baseCreateParams.inQueParams.prevLinkQueId = 0; ipcBitsInVideoPrm.baseCreateParams.numOutQue = 1; ipcBitsInVideoPrm.baseCreateParams.outQueParams[0].nextLink = gVdecModuleContext.decId; MultiCh_ipcBitsInitCreateParams_BitsInRTOS(&ipcBitsInVideoPrm, TRUE); for (i=0; i<gVdecModuleContext.vdecConfig.numChn; i++) { decPrm.chCreateParams[i].format = IVIDEO_H264HP; decPrm.chCreateParams[i].profile = IH264VDEC_PROFILE_ANY; decPrm.chCreateParams[i].fieldMergeDecodeEnable = FALSE; 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; decPrm.chCreateParams[i].numBufPerCh = NUM_DECODE_BUFFERS; } decPrm.inQueParams.prevLinkId = gVdecModuleContext.ipcBitsInRTOSId; decPrm.inQueParams.prevLinkQueId = 0; decPrm.outQueParams.nextLink = ipcOutVideoId; decPrm.tilerEnable = TILER_ENABLE; ipcOutVideoPrm.inQueParams.prevLinkId = gVdecModuleContext.decId; ipcOutVideoPrm.inQueParams.prevLinkQueId = 0; ipcOutVideoPrm.numOutQue = 1; ipcOutVideoPrm.outQueParams[0].nextLink = ipcInVpssId; ipcOutVideoPrm.notifyNextLink = TRUE; ipcOutVideoPrm.notifyPrevLink = TRUE; ipcOutVideoPrm.noNotifyMode = FALSE; ipcInVpssPrm.inQueParams.prevLinkId = ipcOutVideoId; ipcInVpssPrm.inQueParams.prevLinkQueId = 0; ipcInVpssPrm.numOutQue = 1; ipcInVpssPrm.outQueParams[0].nextLink = mergeId[LIVE_DECODE_MERGE_LINK_IDX]; ipcInVpssPrm.notifyNextLink = TRUE; ipcInVpssPrm.notifyPrevLink = TRUE; ipcInVpssPrm.noNotifyMode = FALSE; mergePrm[LIVE_DECODE_MERGE_LINK_IDX].numInQue = 2; mergePrm[LIVE_DECODE_MERGE_LINK_IDX].inQueParams[0].prevLinkId = gVcapModuleContext.deiId[0]; mergePrm[LIVE_DECODE_MERGE_LINK_IDX].inQueParams[0].prevLinkQueId = DEI_LINK_OUT_QUE_DEI_SC; mergePrm[LIVE_DECODE_MERGE_LINK_IDX].inQueParams[1].prevLinkId = ipcInVpssId; mergePrm[LIVE_DECODE_MERGE_LINK_IDX].inQueParams[1].prevLinkQueId = 0; mergePrm[LIVE_DECODE_MERGE_LINK_IDX].outQueParams.nextLink = dupId[LIVE_DECODE_DUP_LINK_IDX]; mergePrm[LIVE_DECODE_MERGE_LINK_IDX].notifyNextLink = TRUE; dupPrm[LIVE_DECODE_DUP_LINK_IDX].inQueParams.prevLinkId = mergeId[LIVE_DECODE_MERGE_LINK_IDX]; dupPrm[LIVE_DECODE_DUP_LINK_IDX].inQueParams.prevLinkQueId = 0; dupPrm[LIVE_DECODE_DUP_LINK_IDX].numOutQue = 2; dupPrm[LIVE_DECODE_DUP_LINK_IDX].outQueParams[0].nextLink = gVdisModuleContext.swMsId[0]; dupPrm[LIVE_DECODE_DUP_LINK_IDX].outQueParams[1].nextLink = gVdisModuleContext.swMsId[1]; dupPrm[LIVE_DECODE_DUP_LINK_IDX].notifyNextLink = TRUE; for(i=0; i<2; i++) { swMsPrm[i].inQueParams.prevLinkId = dupId[LIVE_DECODE_DUP_LINK_IDX]; swMsPrm[i].inQueParams.prevLinkQueId = i; swMsPrm[i].outQueParams.nextLink = gVdisModuleContext.displayId[i]; swMsPrm[i].maxInputQueLen = 4; // KC: changed to 4 to make the display smooth swMsPrm[i].maxOutRes = VSYS_STD_1080P_60; swMsPrm[i].initOutRes = gVdisModuleContext.vdisConfig.deviceParams[i].resolution; swMsPrm[0].numOutBuf = 5; swMsPrm[1].numOutBuf = 8; if (i == 1) { swMsPrm[i].maxOutRes = VSYS_STD_PAL; swMsPrm[i].initOutRes = gVdisModuleContext.vdisConfig.deviceParams[VDIS_DEV_SD].resolution; } #ifdef SYSTEM_USE_TILER swMsPrm[i].lineSkipMode = FALSE; // Double pitch not possible in tiler mode; so Line skip not possible #else swMsPrm[i].lineSkipMode = TRUE; // Set to TRUE for Enable low cost scaling #endif swMsPrm[i].enableLayoutGridDraw = gVdisModuleContext.vdisConfig.enableLayoutGridDraw; MultiCh_swMsGetDefaultLayoutPrm(VDIS_DEV_HDMI, &swMsPrm[0], TRUE); MultiCh_swMsGetDefaultLayoutPrm(VDIS_DEV_SD, &swMsPrm[1], TRUE); displayPrm[i].inQueParams[0].prevLinkId = gVdisModuleContext.swMsId[i]; displayPrm[i].inQueParams[0].prevLinkQueId = 0; displayPrm[i].displayRes = swMsPrm[i].initOutRes; if (i == 1) { displayPrm[i].displayRes = gVdisModuleContext.vdisConfig.deviceParams[VDIS_DEV_SD].resolution; displayPrm[i].forceFieldSeparatedInputMode = TRUE; } } System_linkCreate(gVdecModuleContext.ipcBitsOutHLOSId,&ipcBitsOutHostPrm,sizeof(ipcBitsOutHostPrm)); System_linkCreate(gVdecModuleContext.ipcBitsInRTOSId,&ipcBitsInVideoPrm,sizeof(ipcBitsInVideoPrm)); System_linkCreate(gVdecModuleContext.decId, &decPrm, sizeof(decPrm)); System_linkCreate(ipcOutVideoId, &ipcOutVideoPrm, sizeof(ipcOutVideoPrm)); System_linkCreate(ipcInVpssId , &ipcInVpssPrm , sizeof(ipcInVpssPrm) ); System_linkCreate(mergeId[LIVE_DECODE_MERGE_LINK_IDX], &mergePrm[LIVE_DECODE_MERGE_LINK_IDX], sizeof(mergePrm[LIVE_DECODE_MERGE_LINK_IDX])); System_linkCreate(dupId[LIVE_DECODE_DUP_LINK_IDX], &dupPrm[LIVE_DECODE_DUP_LINK_IDX], sizeof(dupPrm[LIVE_DECODE_DUP_LINK_IDX])); for(i=0; i<2; i++) System_linkCreate(gVdisModuleContext.swMsId[i] , &swMsPrm[i], sizeof(swMsPrm[i])); for(i=0; i<2; i++) /* Both tied VENCs HDMI and DVO2 are handled by single link instance */ System_linkCreate(gVdisModuleContext.displayId[i], &displayPrm[i], sizeof(displayPrm[i])); { MergeLink_InLinkChInfo inChInfo; MergeLink_InLinkChInfo_Init(&inChInfo); inChInfo.inLinkID = ipcInVpssId; System_linkControl(mergeId[LIVE_DECODE_MERGE_LINK_IDX], MERGE_LINK_CMD_GET_INPUT_LINK_CHINFO, &inChInfo, sizeof(inChInfo), TRUE); OSA_assert(inChInfo.numCh == gVdecModuleContext.vdecConfig.numChn); MultiCh_setDec2DispMap(VDIS_DEV_HDMI,gVdecModuleContext.vdecConfig.numChn,0,inChInfo.startChNum); MultiCh_setDec2DispMap(VDIS_DEV_SD,gVdecModuleContext.vdecConfig.numChn,0,inChInfo.startChNum); } }
Int32 IpcFramesInLink_create(IpcFramesInLink_Obj * pObj, IpcFramesInLinkRTOS_CreateParams * pPrm) { Int32 status; System_LinkInQueParams *pInQueParams; Int i; #ifdef SYSTEM_DEBUG_IPC Vps_printf(" %d: IPC_FRAMES_IN : Create in progress !!!\n", Utils_getCurTimeInMsec()); #endif UTILS_MEMLOG_USED_START(); memcpy(&pObj->createArgs, pPrm, sizeof(pObj->createArgs)); status = System_ipcListMPOpen(pObj->createArgs.baseCreateParams.inQueParams. prevLinkId, &pObj->listMPOutHndl, &pObj->listMPInHndl); UTILS_assert(status == FVID2_SOK); UTILS_assert(pObj->listMPInHndl != NULL); while(!ListMP_empty(pObj->listMPInHndl)) { Ptr listElem = ListMP_getHead(pObj->listMPInHndl); if (listElem != NULL) { IPCFRAMESINLINK_INFO_LOG(pObj->tskId, "InList not empty!!!" "Stale entry:[%p]", listElem); } } status = Utils_queCreate(&pObj->outFrameBufQue, SYSTEM_IPC_FRAMES_MAX_LIST_ELEM, pObj->outFrameBufQueMem, UTILS_QUE_FLAG_NO_BLOCK_QUE); UTILS_assert(status == FVID2_SOK); status = Utils_queCreate(&pObj->freeFrameQue, SYSTEM_IPC_FRAMES_MAX_LIST_ELEM, pObj->freeFrameQueMem, UTILS_QUE_FLAG_NO_BLOCK_QUE); UTILS_assert(status == FVID2_SOK); for (i = 0; i < SYSTEM_IPC_FRAMES_MAX_LIST_ELEM; i++) { pObj->freeFrameMem[i].appData = &pObj->freeFrameInfoMem[i]; Utils_quePut(&pObj->freeFrameQue,&pObj->freeFrameMem[i],BIOS_NO_WAIT); } pInQueParams = &pObj->createArgs.baseCreateParams.inQueParams; status = System_linkGetInfo(pInQueParams->prevLinkId, &pObj->inQueInfo); UTILS_assert(status == FVID2_SOK); IpcFramesInLink_setOutQueInfo(pObj); IpcFramesInLink_initStats(pObj); IpcFramesInLink_createPrdObj(pObj); if (TRUE == pObj->createArgs.baseCreateParams.noNotifyMode) { if (FALSE == pObj->prd.clkStarted) { IpcFramesInLink_startPrdObj(pObj, IPC_FRAMES_IN_LINK_DONE_PERIOD_MS, FALSE); } } pObj->state = IPC_FRAMES_IN_LINK_STATE_ACTIVE; UTILS_MEMLOG_USED_END(pObj->memUsed); UTILS_MEMLOG_PRINT("IPC_FRAMES_IN", pObj->memUsed, UTILS_ARRAYSIZE(pObj->memUsed)); #ifdef SYSTEM_DEBUG_IPC Vps_printf(" %d: IPC_FRAMES_IN : Create Done !!!\n", Utils_getCurTimeInMsec()); #endif return IPC_FRAMES_IN_LINK_S_SUCCESS; }
Int32 IpcOutM3Link_create(IpcOutM3Link_Obj * pObj, IpcLink_CreateParams * pPrm) { Int32 status, elemId; System_LinkInQueParams *pInQueParams; System_LinkQueInfo *pInQueInfo; IpcOutM3Link_ChObj *pChObj; UInt32 chId; #ifdef SYSTEM_DEBUG_IPC Vps_printf(" %d: IPC_OUT_M3 : Create in progress !!!\n", Utils_getCurTimeInMsec()); #endif pObj->totalFrameCount = 0; memcpy(&pObj->createArgs, pPrm, sizeof(pObj->createArgs)); status = System_ipcListMPReset(pObj->listMPOutHndl, pObj->listMPInHndl); UTILS_assert(status == FVID2_SOK); status = Utils_queCreate(&pObj->listElemQue, SYSTEM_IPC_M3_MAX_LIST_ELEM, pObj->listElemQueMem, UTILS_QUE_FLAG_NO_BLOCK_QUE); UTILS_assert(status == FVID2_SOK); for (elemId = 0; elemId < SYSTEM_IPC_M3_MAX_LIST_ELEM; elemId++) { status = Utils_quePut(&pObj->listElemQue, pObj->listElem[elemId], BIOS_NO_WAIT); UTILS_assert(status == FVID2_SOK); } pInQueParams = &pObj->createArgs.inQueParams; status = System_linkGetInfo(pInQueParams->prevLinkId, &pObj->inQueInfo); UTILS_assert(status == FVID2_SOK); pInQueInfo = &pObj->inQueInfo.queInfo[ pObj->createArgs.inQueParams.prevLinkQueId ]; UTILS_assert(pInQueInfo->numCh <= IPC_OUTM3_LINK_MAX_CH); /* set number of input / output channels */ pObj->numCh = pInQueInfo->numCh; IpcOutM3Link_createPrdObj(pObj); IpcOutM3Link_resetStatistics(pObj); for (chId = 0; chId < pObj->numCh; chId++) { pChObj = &pObj->chObj[chId]; pChObj->frameSkipCtx.firstTime = TRUE; pChObj->frameSkipCtx.inputFrameRate = pObj->createArgs.inputFrameRate; pChObj->frameSkipCtx.outputFrameRate = pObj->createArgs.outputFrameRate; } #ifdef SYSTEM_DEBUG_IPC Vps_printf(" %d: IPC_OUT_M3 : Create Done !!!\n", Utils_getCurTimeInMsec()); #endif return FVID2_SOK; }
Int32 DupLink_drvCreate(DupLink_Obj * pObj, DupLink_CreateParams * pPrm) { UInt32 outId, frameId; Int32 status; FVID2_Frame *pFrame; System_FrameInfo *pFrameInfo; Semaphore_Params semParams; memcpy(&pObj->createArgs, pPrm, sizeof(pObj->createArgs)); UTILS_assert(pObj->createArgs.numOutQue <= DUP_LINK_MAX_OUT_QUE); pObj->putFrameCount = 0; pObj->getFrameCount = 0; memset(pObj->frames, 0, sizeof(pObj->frames)); memset(pObj->frameInfo, 0, sizeof(pObj->frameInfo)); status = System_linkGetInfo(pPrm->inQueParams.prevLinkId, &pObj->inTskInfo); UTILS_assert(status == FVID2_SOK); UTILS_assert(pPrm->inQueParams.prevLinkQueId < pObj->inTskInfo.numQue); pObj->info.numQue = pObj->createArgs.numOutQue; memcpy(&pObj->info.queInfo[0], &pObj->inTskInfo.queInfo[pPrm->inQueParams.prevLinkQueId], sizeof(pObj->inTskInfo.queInfo[0])); for (outId = 1; outId < pObj->info.numQue; outId++) { memcpy(&pObj->info.queInfo[outId], &pObj->info.queInfo[0], sizeof(pObj->info.queInfo[0])); } Semaphore_Params_init(&semParams); semParams.mode = Semaphore_Mode_BINARY; pObj->lock = Semaphore_create(1u, &semParams, NULL); for (outId = 0; outId < DUP_LINK_MAX_OUT_QUE; outId++) { status = Utils_bufCreate(&pObj->outFrameQue[outId], FALSE, FALSE); UTILS_assert(status == FVID2_SOK); for (frameId = 0; frameId < DUP_LINK_MAX_FRAMES_PER_OUT_QUE; frameId++) { pFrame = &pObj->frames[DUP_LINK_MAX_FRAMES_PER_OUT_QUE * outId + frameId]; pFrameInfo = &pObj->frameInfo[DUP_LINK_MAX_FRAMES_PER_OUT_QUE * outId + frameId]; pFrame->appData = pFrameInfo; status = Utils_bufPutEmptyFrame(&pObj->outFrameQue[outId], pFrame); UTILS_assert(status == FVID2_SOK); } } #ifdef SYSTEM_DEBUG_DUP Vps_printf(" %d: DUP : Create Done !!!\n", Utils_getCurTimeInMsec()); #endif return FVID2_SOK; }
/* =================================================================== * @func HelloWorldLink_algCreate * * @desc Creates HelloWorld link instance * * @modif This function modifies the following structures * * @inputs This function takes the following inputs * <HelloWorldLink_Obj> * Object to hello world link * <HelloWorldLink_CreateParams> * Create time parameters passed by the user * * @outputs <argument name> * Description of usage * * @return Status of instance creation * ================================================================== */ Int32 HelloWorldLink_create(HelloWorldLink_Obj * pObj, HelloWorldLink_CreateParams * pPrm) { Int32 status; Vps_printf(" %d: HELLOWORLD : Create in progress !!!\n", Utils_getCurTimeInMsec()); /*************************************************************************/ /* copy the create time parameters passed from host to local object */ /*************************************************************************/ memcpy(&pObj->createArgs, pPrm, sizeof(*pPrm)); /*************************************************************************/ /* Get frame header information from previous link input queue */ /*************************************************************************/ status = System_linkGetInfo(pPrm->inQueParams.prevLinkId, &pObj->inTskInfo); UTILS_assert(status == FVID2_SOK); /*************************************************************************/ /* Make sure queid information provided in create params is less then */ /* total number of queues in previous link (returned by */ /* System_linkGetInfo module */ /*************************************************************************/ UTILS_assert(pPrm->inQueParams.prevLinkQueId < pObj->inTskInfo.numQue); /*************************************************************************/ /* Make a local copy of previous link queue number connected to */ /* helloWorld link */ /*************************************************************************/ memcpy(&pObj->inQueInfo, &pObj->inTskInfo.queInfo[pPrm->inQueParams.prevLinkQueId], sizeof(pObj->inQueInfo)); /*************************************************************************/ /* Check if helloWorld link instance can handle the number of channels */ /* from previous links */ /*************************************************************************/ UTILS_assert(pObj->inQueInfo.numCh <= HELLOWORLD_LINK_MAX_CH); /*************************************************************************/ /* Create an instance to hello world algorithm */ /*************************************************************************/ status = HelloWorldLink_algCreate(pObj); UTILS_assert(status == FVID2_SOK); /*************************************************************************/ /* If you have more algorithms that sequentially process upon the */ /* received input frame, you can create instances to those algorithms */ /* in series here */ /*************************************************************************/ //xxxLink_Create(); //yyyLink_Create(); /*************************************************************************/ /* All links creates and manages the output buffers they produce. Input */ /* buffers managed by prior link that produced that buffer */ /* This is generic link and hence user input taken from A8 if link needs */ /* to produce and hence create an output buffer. */ /*************************************************************************/ if (pObj->createArgs.createOutBuf1) HelloWorldLink_createOutObj(pObj); Vps_printf(" %d: HELLOWORLD : Create Done !!!\n", Utils_getCurTimeInMsec()); return FVID2_SOK; }
Int32 DisplayLink_drvCreate(DisplayLink_Obj * pObj, DisplayLink_CreateParams * pPrm) { Semaphore_Params semParams; Int32 status = FVID2_SOK; #ifdef SYSTEM_DEBUG_DISPLAY Vps_printf(" %d: DISPLAY: Create in progress !!!\n", Utils_getCurTimeInMsec()); #endif pObj->cbCount = 0; pObj->dequeCount = 0; pObj->totalTime = 0; pObj->minCbTime = 0xFF; pObj->maxCbTime = 0; pObj->lastCbTime = 0; pObj->maxLatency = 0; pObj->minLatency = 0xFF; pObj->drvTopFieldLatency = 0; pObj->numTopFields = 0; pObj->inFrameGetCount = 0; pObj->inFramePutCount = 0; memcpy(&pObj->createArgs, pPrm, sizeof(*pPrm)); UTILS_assertError((pPrm->activeQueue < UTILS_ARRAYSIZE(pPrm->inQueParams)), status, -1, pObj->tskId, -1); if (status != FVID2_SOK) { pPrm->activeQueue = 0; } DisplayLink_drvSetFieldSeparatedInfo(pObj); status = System_linkGetInfo(pPrm->inQueParams[pPrm->activeQueue].prevLinkId, &pObj->inTskInfo[pPrm->activeQueue]); UTILS_assert(status == FVID2_SOK); UTILS_assert(pPrm->inQueParams[pPrm->activeQueue].prevLinkQueId < pObj->inTskInfo[pPrm->activeQueue].numQue); memcpy(&pObj->inQueInfo, &pObj->inTskInfo[pPrm->activeQueue].queInfo[pPrm->inQueParams[pPrm->activeQueue].prevLinkQueId], sizeof(pObj->inQueInfo)); pObj->curActiveQueue = pPrm->activeQueue; pObj->numBufsInDriver = 0; pObj->topField = NULL; pObj->nextFid = FVID2_FID_TOP; Semaphore_Params_init(&semParams); semParams.mode = Semaphore_Mode_BINARY; pObj->lock = Semaphore_create(1u, &semParams, NULL); UTILS_assert(pObj->lock != NULL); Semaphore_Params_init(&semParams); semParams.mode = Semaphore_Mode_BINARY; pObj->complete = Semaphore_create(0u, &semParams, NULL); UTILS_assert(pObj->complete != NULL); DisplayLink_drvDisplayCreate(pObj); DisplayLink_drvCreateFrameInfo(pObj); DisplayLink_drvCreateRtParams(pObj); DisplayLink_drvDisplayAllocAndQueBlankFrame(pObj); DisplayLink_drvSwitchCh(pObj, 0); DisplayLink_drvSetPitchInfo(pObj); #ifdef SYSTEM_DEBUG_DISPLAY Vps_printf(" %d: DISPLAY: Create Done !!!\n", Utils_getCurTimeInMsec()); #endif return FVID2_SOK; }
Void Chains_singleChDucatiSystem(Chains_Ctrl *chainsCfg) { CaptureLink_CreateParams capturePrm; CaptureLink_VipInstParams *pCaptureInstPrm; CaptureLink_OutParams *pCaptureOutPrm; NsfLink_CreateParams nsfPrm; SwMsLink_CreateParams swMsPrm; DisplayLink_CreateParams displayPrm; EncLink_CreateParams encPrm; DecLink_CreateParams decPrm; IpcLink_CreateParams ipcOutVpssPrm; IpcLink_CreateParams ipcInVpssPrm; IpcLink_CreateParams ipcOutVideoPrm; IpcLink_CreateParams ipcInVideoPrm; IpcBitsOutLinkHLOS_CreateParams ipcBitsOutHostPrm; IpcBitsOutLinkRTOS_CreateParams ipcBitsOutVideoPrm; IpcBitsInLinkHLOS_CreateParams ipcBitsInHostPrm; IpcBitsInLinkRTOS_CreateParams ipcBitsInVideoPrm; System_LinkInfo bitsProducerLinkInfo; UInt32 captureId, displayId; UInt32 nsfId, swMsId; UInt32 vipInstId; UInt32 encId, decId; UInt32 ipcOutVpssId, ipcInVpssId; UInt32 ipcOutVideoId, ipcInVideoId; UInt32 ipcBitsOutVideoId, ipcBitsInHostId; UInt32 ipcBitsInVideoId, ipcBitsOutHostId; UInt32 i; char ch; Chains_ipcBitsInit(); CHAINS_INIT_STRUCT(CaptureLink_CreateParams, capturePrm); CHAINS_INIT_STRUCT(NsfLink_CreateParams, nsfPrm); CHAINS_INIT_STRUCT(SwMsLink_CreateParams, swMsPrm); CHAINS_INIT_STRUCT(DisplayLink_CreateParams,displayPrm); CHAINS_INIT_STRUCT(IpcLink_CreateParams,ipcOutVpssPrm); CHAINS_INIT_STRUCT(IpcLink_CreateParams,ipcInVpssPrm); CHAINS_INIT_STRUCT(IpcLink_CreateParams,ipcOutVideoPrm); CHAINS_INIT_STRUCT(IpcLink_CreateParams,ipcInVideoPrm); CHAINS_INIT_STRUCT(IpcBitsOutLinkRTOS_CreateParams,ipcBitsOutVideoPrm); CHAINS_INIT_STRUCT(IpcBitsInLinkHLOS_CreateParams,ipcBitsInHostPrm); CHAINS_INIT_STRUCT(IpcBitsOutLinkHLOS_CreateParams,ipcBitsOutHostPrm); CHAINS_INIT_STRUCT(IpcBitsInLinkRTOS_CreateParams,ipcBitsInVideoPrm); CHAINS_INIT_STRUCT(EncLink_CreateParams, encPrm); CHAINS_INIT_STRUCT(DecLink_CreateParams, decPrm); captureId = SYSTEM_LINK_ID_CAPTURE; nsfId = SYSTEM_LINK_ID_NSF_0; swMsId = SYSTEM_LINK_ID_SW_MS_MULTI_INST_0; displayId = SYSTEM_LINK_ID_DISPLAY_1; encId = SYSTEM_LINK_ID_VENC_0; decId = SYSTEM_LINK_ID_VDEC_0; ipcOutVpssId = SYSTEM_VPSS_LINK_ID_IPC_OUT_M3_0; ipcInVideoId = SYSTEM_VIDEO_LINK_ID_IPC_IN_M3_0; ipcOutVideoId= SYSTEM_VIDEO_LINK_ID_IPC_OUT_M3_0; ipcInVpssId = SYSTEM_VPSS_LINK_ID_IPC_IN_M3_0; ipcBitsOutVideoId = SYSTEM_VIDEO_LINK_ID_IPC_BITS_OUT_0; ipcBitsInHostId = SYSTEM_HOST_LINK_ID_IPC_BITS_IN_0; ipcBitsOutHostId = SYSTEM_HOST_LINK_ID_IPC_BITS_OUT_0; ipcBitsInVideoId = SYSTEM_VIDEO_LINK_ID_IPC_BITS_IN_0; System_linkControl( SYSTEM_LINK_ID_M3VIDEO, SYSTEM_COMMON_CMD_SET_CH2IVAHD_MAP_TBL, &systemVid_encDecIvaChMapTbl, sizeof(SystemVideo_Ivahd2ChMap_Tbl), TRUE ); capturePrm.numVipInst = 1; capturePrm.tilerEnable = FALSE; capturePrm.numBufsPerCh = CAPTURE_LINK_NUM_BUFS_PER_CH_DEFAULT; capturePrm.numExtraBufs = 8; capturePrm.maxBlindAreasPerCh = 0; capturePrm.isPalMode = FALSE; capturePrm.enableSdCrop = FALSE; capturePrm.doCropInCapture = FALSE; for(vipInstId=0; vipInstId<capturePrm.numVipInst; vipInstId++) { pCaptureInstPrm = &capturePrm.vipInst[vipInstId]; pCaptureInstPrm->vipInstId = (SYSTEM_CAPTURE_INST_VIP0_PORTA+vipInstId*2)%SYSTEM_CAPTURE_INST_MAX; pCaptureInstPrm->videoDecoderId = SYSTEM_DEVICE_VID_DEC_SII9233A_DRV; pCaptureInstPrm->inDataFormat = SYSTEM_DF_YUV422P; pCaptureInstPrm->standard = chainsCfg->displayRes[0]; pCaptureInstPrm->numOutput = 1; pCaptureInstPrm->numChPerOutput = 1; pCaptureInstPrm->frameCaptureMode = FALSE; pCaptureInstPrm->fieldsMerged = FALSE; if (Chains_IsInterlaced(chainsCfg->displayRes[0])) { pCaptureInstPrm->frameCaptureMode = TRUE; pCaptureInstPrm->fieldsMerged = TRUE; } pCaptureOutPrm = &pCaptureInstPrm->outParams[0]; pCaptureOutPrm->dataFormat = SYSTEM_DF_YUV422I_YUYV; pCaptureOutPrm->scEnable = FALSE; pCaptureOutPrm->scOutWidth = chainsCfg->channelConf[0].width; pCaptureOutPrm->scOutHeight = chainsCfg->channelConf[0].height; pCaptureOutPrm->outQueId = 0; } capturePrm.outQueParams[0].nextLink = nsfId; System_linkCreate(captureId, &capturePrm, sizeof(capturePrm)); chainsCfg->displayRes[0] = capturePrm.vipInst[0].standard; Vsys_getResSize(chainsCfg->displayRes[0], &chainsCfg->channelConf[0].width, &chainsCfg->channelConf[0].height); Vsys_getResRate(chainsCfg->displayRes[0], &chainsCfg->channelConf[0].frameRate); nsfPrm.inQueParams.prevLinkId = captureId; nsfPrm.inQueParams.prevLinkQueId = 0; nsfPrm.bypassNsf = FALSE; nsfPrm.tilerEnable = TRUE; nsfPrm.numOutQue = 1; nsfPrm.outQueParams[0].nextLink = ipcOutVpssId; nsfPrm.inputFrameRate = chainsCfg->channelConf[0].frameRate; nsfPrm.outputFrameRate = chainsCfg->channelConf[0].frameRate; nsfPrm.numBufsPerCh = 8; ipcOutVpssPrm.inQueParams.prevLinkId = nsfId; ipcOutVpssPrm.inQueParams.prevLinkQueId = 0; ipcOutVpssPrm.numOutQue = 1; ipcOutVpssPrm.numChPerOutQue[0] = 1; ipcOutVpssPrm.outQueParams[0].nextLink = ipcInVideoId; ipcOutVpssPrm.notifyNextLink = TRUE; ipcOutVpssPrm.notifyPrevLink = FALSE; ipcOutVpssPrm.noNotifyMode = FALSE; ipcOutVpssPrm.inputFrameRate = chainsCfg->channelConf[0].frameRate; ipcOutVpssPrm.outputFrameRate = chainsCfg->channelConf[0].frameRate; ipcOutVpssPrm.equallyDivideChAcrossOutQues = FALSE; ipcOutVpssPrm.numChPerOutQue[0] = 0; ipcInVideoPrm.inQueParams.prevLinkId = ipcOutVpssId; ipcInVideoPrm.inQueParams.prevLinkQueId = 0; ipcInVideoPrm.numOutQue = 1; ipcInVideoPrm.numChPerOutQue[0] = 1; ipcInVideoPrm.outQueParams[0].nextLink = encId; ipcInVideoPrm.notifyNextLink = TRUE; ipcInVideoPrm.notifyPrevLink = FALSE; ipcInVideoPrm.noNotifyMode = FALSE; ipcInVideoPrm.inputFrameRate = chainsCfg->channelConf[0].frameRate; ipcInVideoPrm.outputFrameRate = chainsCfg->channelConf[0].frameRate; ipcInVideoPrm.equallyDivideChAcrossOutQues = FALSE; ipcInVideoPrm.numChPerOutQue[0] = 0; for (i=0; i<1; i++) { encPrm.chCreateParams[i].format = chainsCfg->channelConf[i].encFormat; encPrm.chCreateParams[i].profile = chainsCfg->channelConf[i].encProfile; encPrm.chCreateParams[i].dataLayout = IVIDEO_FIELD_SEPARATED; encPrm.chCreateParams[i].fieldMergeEncodeEnable = FALSE; encPrm.chCreateParams[i].enableAnalyticinfo = FALSE; encPrm.chCreateParams[i].enableWaterMarking = FALSE; encPrm.chCreateParams[i].maxBitRate = -1; encPrm.chCreateParams[i].encodingPreset = XDM_USER_DEFINED; //XDM_DEFAULT; encPrm.chCreateParams[i].rateControlPreset = IVIDEO_USER_DEFINED; //IVIDEO_STORAGE; //IVIDEO_LOW_DELAY; encPrm.chCreateParams[i].enableHighSpeed = FALSE; encPrm.chCreateParams[i].numTemporalLayer = 0; encPrm.chCreateParams[i].enableSVCExtensionFlag = FALSE; encPrm.chCreateParams[i].defaultDynamicParams.intraFrameInterval = chainsCfg->channelConf[i].intraFrameInterval; encPrm.chCreateParams[i].defaultDynamicParams.interFrameInterval = 1; encPrm.chCreateParams[i].defaultDynamicParams.inputFrameRate = chainsCfg->channelConf[i].frameRate; encPrm.chCreateParams[i].defaultDynamicParams.targetFrameRate = chainsCfg->channelConf[i].encFrameRate; encPrm.chCreateParams[i].defaultDynamicParams.targetBitRate = chainsCfg->channelConf[i].bitRate; encPrm.chCreateParams[i].defaultDynamicParams.mvAccuracy = IVIDENC2_MOTIONVECTOR_QUARTERPEL; encPrm.chCreateParams[i].defaultDynamicParams.rcAlg = chainsCfg->channelConf[i].rateCtrl; encPrm.chCreateParams[i].defaultDynamicParams.qpMin = 0; encPrm.chCreateParams[i].defaultDynamicParams.qpMax = 51; encPrm.chCreateParams[i].defaultDynamicParams.qpInit = -1; encPrm.chCreateParams[i].defaultDynamicParams.vbrDuration = 8; encPrm.chCreateParams[i].defaultDynamicParams.vbrSensitivity = 0; } encPrm.inQueParams.prevLinkId = ipcInVideoId; encPrm.inQueParams.prevLinkQueId= 0; encPrm.outQueParams.nextLink = ipcBitsOutVideoId; encPrm.numBufPerCh[0] = 8; ipcBitsOutVideoPrm.baseCreateParams.inQueParams.prevLinkId = encId; ipcBitsOutVideoPrm.baseCreateParams.inQueParams.prevLinkQueId = 0; ipcBitsOutVideoPrm.baseCreateParams.numOutQue = 1; ipcBitsOutVideoPrm.baseCreateParams.numChPerOutQue[0] = 1; ipcBitsOutVideoPrm.baseCreateParams.outQueParams[0].nextLink = ipcBitsInHostId; ipcBitsOutVideoPrm.baseCreateParams.inputFrameRate = chainsCfg->channelConf[0].encFrameRate; ipcBitsOutVideoPrm.baseCreateParams.outputFrameRate = chainsCfg->channelConf[0].encFrameRate; Chains_ipcBitsInitCreateParams_BitsOutRTOS(&ipcBitsOutVideoPrm, FALSE); ipcBitsInHostPrm.baseCreateParams.inQueParams.prevLinkId = ipcBitsOutVideoId; ipcBitsInHostPrm.baseCreateParams.inQueParams.prevLinkQueId = 0; ipcBitsInHostPrm.baseCreateParams.numOutQue = 1; ipcBitsInHostPrm.baseCreateParams.numChPerOutQue[0] = 1; ipcBitsInHostPrm.baseCreateParams.inputFrameRate = chainsCfg->channelConf[0].encFrameRate; ipcBitsInHostPrm.baseCreateParams.outputFrameRate = chainsCfg->channelConf[0].encFrameRate; Chains_ipcBitsInitCreateParams_BitsInHLOS(&ipcBitsInHostPrm); Chains_displayCtrlInit(chainsCfg->displayRes); System_linkCreate(nsfId , &nsfPrm, sizeof(nsfPrm)); System_linkCreate(ipcOutVpssId , &ipcOutVpssPrm , sizeof(ipcOutVpssPrm) ); System_linkCreate(ipcInVideoId , &ipcInVideoPrm , sizeof(ipcInVideoPrm) ); System_linkCreate(encId, &encPrm, sizeof(encPrm)); System_linkCreate(ipcBitsOutVideoId, &ipcBitsOutVideoPrm, sizeof(ipcBitsOutVideoPrm)); System_linkCreate(ipcBitsInHostId, &ipcBitsInHostPrm, sizeof(ipcBitsInHostPrm)); System_linkGetInfo(ipcBitsInHostId,&bitsProducerLinkInfo); OSA_assert(bitsProducerLinkInfo.numQue = 1); System_LinkQueInfo queInfo; queInfo.numCh = 1; queInfo.chInfo[0].bufType = SYSTEM_BUF_TYPE_VIDBITSTREAM; queInfo.chInfo[0].codingformat = chainsCfg->channelConf[0].encFormat; queInfo.chInfo[0].memType = SYSTEM_MT_TILEDMEM; queInfo.chInfo[0].width = chainsCfg->channelConf[0].width; queInfo.chInfo[0].height = chainsCfg->channelConf[0].height; queInfo.chInfo[0].scanFormat = SYSTEM_SF_PROGRESSIVE; ipcBitsOutHostPrm.baseCreateParams.numOutQue = 1; ipcBitsOutHostPrm.baseCreateParams.numChPerOutQue[0] = 1; ipcBitsOutHostPrm.baseCreateParams.outQueParams[0].nextLink = ipcBitsInVideoId; ipcBitsOutHostPrm.bufPoolPerCh = FALSE; ipcBitsOutHostPrm.numBufPerCh[0] = 0; //Chains_ipcBitsInitCreateParams_BitsOutHLOS(&ipcBitsOutHostPrm, &bitsProducerLinkInfo.queInfo[0]); Chains_ipcBitsInitCreateParams_BitsOutHLOS(&ipcBitsOutHostPrm, &queInfo); ipcBitsInVideoPrm.baseCreateParams.inQueParams.prevLinkId = ipcBitsOutHostId; ipcBitsInVideoPrm.baseCreateParams.inQueParams.prevLinkQueId = 0; ipcBitsInVideoPrm.baseCreateParams.numOutQue = 1; ipcBitsInVideoPrm.baseCreateParams.outQueParams[0].nextLink = decId; Chains_ipcBitsInitCreateParams_BitsInRTOS(&ipcBitsInVideoPrm, TRUE); for (i=0; i<1; i++) { decPrm.chCreateParams[i].format = chainsCfg->channelConf[i].encFormat; decPrm.chCreateParams[i].profile = IH264VDEC_PROFILE_ANY; decPrm.chCreateParams[i].targetMaxWidth = chainsCfg->channelConf[i].width; decPrm.chCreateParams[i].targetMaxHeight = chainsCfg->channelConf[i].height; decPrm.chCreateParams[i].displayDelay = IVIDDEC3_DECODE_ORDER; decPrm.chCreateParams[i].fieldMergeDecodeEnable = FALSE; decPrm.chCreateParams[i].numBufPerCh = 16; decPrm.chCreateParams[i].dpbBufSizeInFrames = //DEC_LINK_DPB_SIZE_IN_FRAMES_DEFAULT; IH264VDEC_DPB_NUMFRAMES_AUTO; decPrm.chCreateParams[i].algCreateStatus = DEC_LINK_ALG_CREATE_STATUS_CREATE; decPrm.chCreateParams[i].defaultDynamicParams.targetFrameRate = chainsCfg->channelConf[i].encFrameRate; decPrm.chCreateParams[i].defaultDynamicParams.targetBitRate = chainsCfg->channelConf[i].bitRate; } decPrm.inQueParams.prevLinkId = ipcBitsInVideoId; decPrm.inQueParams.prevLinkQueId = 0; decPrm.outQueParams.nextLink = ipcOutVideoId; decPrm.tilerEnable = TRUE; ipcOutVideoPrm.inQueParams.prevLinkId = decId; ipcOutVideoPrm.inQueParams.prevLinkQueId = 0; ipcOutVideoPrm.numOutQue = 1; ipcOutVideoPrm.outQueParams[0].nextLink = ipcInVpssId; ipcOutVideoPrm.notifyNextLink = TRUE; ipcOutVideoPrm.notifyPrevLink = FALSE; ipcOutVideoPrm.noNotifyMode = FALSE; ipcInVpssPrm.inQueParams.prevLinkId = ipcOutVideoId; ipcInVpssPrm.inQueParams.prevLinkQueId = 0; ipcInVpssPrm.numOutQue = 1; ipcInVpssPrm.outQueParams[0].nextLink = swMsId; ipcInVpssPrm.notifyNextLink = TRUE; ipcInVpssPrm.notifyPrevLink = FALSE; ipcInVpssPrm.noNotifyMode = FALSE; swMsPrm.numSwMsInst = 1; swMsPrm.swMsInstId[0] = SYSTEM_SW_MS_SC_INST_SC5; swMsPrm.inQueParams.prevLinkId = ipcInVpssId; swMsPrm.inQueParams.prevLinkQueId = 0; swMsPrm.outQueParams.nextLink = displayId; swMsPrm.layoutPrm.outputFPS = chainsCfg->channelConf[0].frameRate; swMsPrm.maxOutRes = chainsCfg->displayRes[0]; swMsPrm.lineSkipMode = FALSE; swMsPrm.enableLayoutGridDraw = FALSE; swMsPrm.maxInputQueLen = SYSTEM_SW_MS_DEFAULT_INPUT_QUE_LEN; swMsPrm.numOutBuf = 0; Chains_swMsGenerateLayoutParams(0, 2, &swMsPrm); displayPrm.inQueParams[0].prevLinkId = swMsId; displayPrm.inQueParams[0].prevLinkQueId = 0; displayPrm.displayRes = chainsCfg->displayRes[0]; System_linkCreate(ipcBitsOutHostId,&ipcBitsOutHostPrm,sizeof(ipcBitsOutHostPrm)); System_linkCreate(ipcBitsInVideoId,&ipcBitsInVideoPrm,sizeof(ipcBitsInVideoPrm)); System_linkCreate(decId, &decPrm, sizeof(decPrm)); System_linkCreate(ipcOutVideoId, &ipcOutVideoPrm, sizeof(ipcOutVideoPrm)); System_linkCreate(ipcInVpssId , &ipcInVpssPrm , sizeof(ipcInVpssPrm) ); System_linkCreate(swMsId, &swMsPrm, sizeof(swMsPrm)); System_linkCreate(displayId, &displayPrm, sizeof(displayPrm)); Chains_memPrintHeapStatus(); { System_linkStart(displayId); System_linkStart(swMsId); System_linkStart(decId); System_linkStart(ipcBitsInVideoId); System_linkStart(ipcBitsOutHostId); System_linkStart(ipcBitsInHostId); System_linkStart(ipcBitsOutVideoId); System_linkStart(encId); System_linkStart(nsfId); System_linkStart(captureId); while(1) { ch = Chains_menuRunTime(); if(ch=='0') break; if(ch=='v') System_linkControl(captureId, CAPTURE_LINK_CMD_FORCE_RESET, NULL, 0, TRUE); if(ch=='p') System_linkControl(captureId, CAPTURE_LINK_CMD_PRINT_ADV_STATISTICS, NULL, 0, TRUE); } System_linkStop(captureId); System_linkStop(nsfId); System_linkStop(encId); Chains_ipcBitsStop(); System_linkStop(ipcBitsInVideoId); System_linkStop(ipcBitsOutHostId); System_linkStop(ipcBitsInHostId); System_linkStop(ipcBitsOutVideoId); System_linkStop(decId); System_linkStop(swMsId); System_linkStop(displayId); } System_linkDelete(captureId); System_linkDelete(nsfId); System_linkDelete(ipcOutVpssId); System_linkDelete(ipcInVideoId); System_linkDelete(encId); System_linkDelete(ipcBitsOutVideoId); System_linkDelete(ipcBitsInHostId); System_linkDelete(ipcBitsOutHostId); System_linkDelete(ipcBitsInVideoId); System_linkDelete(decId); System_linkDelete(ipcOutVideoId); System_linkDelete(ipcInVpssId); System_linkDelete(swMsId); System_linkDelete(displayId); Chains_displayCtrlDeInit(); Chains_ipcBitsExit(); }
Void MultiCh_create_8CifProgressiveVcapVencVdecVdis() { CaptureLink_CreateParams capturePrm; NsfLink_CreateParams nsfPrm; DeiLink_CreateParams deiPrm[1]; DupLink_CreateParams dup1Prm; MergeLink_CreateParams merge1Prm; static SwMsLink_CreateParams swMsPrm[2]; DisplayLink_CreateParams displayPrm[3]; IpcLink_CreateParams ipcOutVpssPrm; IpcLink_CreateParams ipcInVpssPrm; IpcLink_CreateParams ipcOutVideoPrm; IpcLink_CreateParams ipcInVideoPrm; EncLink_CreateParams encPrm; DecLink_CreateParams decPrm; IpcBitsOutLinkHLOS_CreateParams ipcBitsOutHostPrm; IpcBitsOutLinkRTOS_CreateParams ipcBitsOutVideoPrm; IpcBitsInLinkHLOS_CreateParams ipcBitsInHostPrm; IpcBitsInLinkRTOS_CreateParams ipcBitsInVideoPrm; System_LinkInfo bitsProducerLinkInfo; VCAP_VIDDEC_PARAMS_S vidDecVideoModeArgs[NUM_CAPTURE_DEVICES]; CaptureLink_VipInstParams *pCaptureInstPrm; CaptureLink_OutParams *pCaptureOutPrm; UInt32 dup1Id,merge1Id,nullId; UInt32 ipcOutVpssId, ipcInVpssId; UInt32 ipcOutVideoId, ipcInVideoId; UInt32 vipInstId; UInt32 i; UInt32 numSubChains; printf("\nDB_DEBUG:%s %s() %d\n",__FILE__,__FUNCTION__,__LINE__); System_init(); printf("\nDB_DEBUG:%s %s() %d\n",__FILE__,__FUNCTION__,__LINE__); MULTICH_INIT_STRUCT(IpcLink_CreateParams,ipcOutVpssPrm); MULTICH_INIT_STRUCT(IpcLink_CreateParams,ipcInVpssPrm); MULTICH_INIT_STRUCT(IpcLink_CreateParams,ipcOutVideoPrm); MULTICH_INIT_STRUCT(IpcLink_CreateParams,ipcInVideoPrm); MULTICH_INIT_STRUCT(IpcBitsOutLinkHLOS_CreateParams,ipcBitsOutHostPrm); MULTICH_INIT_STRUCT(IpcBitsOutLinkRTOS_CreateParams,ipcBitsOutVideoPrm); MULTICH_INIT_STRUCT(IpcBitsInLinkHLOS_CreateParams,ipcBitsInHostPrm); MULTICH_INIT_STRUCT(IpcBitsInLinkRTOS_CreateParams,ipcBitsInVideoPrm); MULTICH_INIT_STRUCT(DecLink_CreateParams, decPrm); MULTICH_INIT_STRUCT(EncLink_CreateParams, encPrm); MULTICH_INIT_STRUCT(SwMsLink_CreateParams ,swMsPrm[0]); MULTICH_INIT_STRUCT(SwMsLink_CreateParams ,swMsPrm[1]); for (i = 0; i < 3; i++) { MULTICH_INIT_STRUCT(DisplayLink_CreateParams ,displayPrm[i]); } printf("\n********* Entered usecase 8CH <814x> Enc/Dec \n\n"); printf("\nDB_DEBUG:%s %s() %d\n",__FILE__,__FUNCTION__,__LINE__); 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 ); printf("\nDB_DEBUG:%s %s() %d\n",__FILE__,__FUNCTION__,__LINE__); gVcapModuleContext.captureId = SYSTEM_LINK_ID_CAPTURE; gVcapModuleContext.nsfId[0] = SYSTEM_LINK_ID_NSF_0; gVcapModuleContext.deiId[0] = SYSTEM_LINK_ID_DEI_0; gVencModuleContext.encId = SYSTEM_LINK_ID_VENC_0; gVdecModuleContext.decId = SYSTEM_LINK_ID_VDEC_0; gVdisModuleContext.swMsId[0] = SYSTEM_LINK_ID_SW_MS_MULTI_INST_0; gVdisModuleContext.swMsId[1] = SYSTEM_LINK_ID_SW_MS_MULTI_INST_1; swMsPrm[0].numSwMsInst = 1; swMsPrm[1].numSwMsInst = 1; swMsPrm[0].swMsInstId[0] = SYSTEM_SW_MS_SC_INST_SC5; swMsPrm[1].swMsInstId[0] = SYSTEM_SW_MS_SC_INST_SC5; gVdisModuleContext.displayId[0] = SYSTEM_LINK_ID_DISPLAY_0; // ON CHIP HDMI gVdisModuleContext.displayId[1] = SYSTEM_LINK_ID_DISPLAY_1; // OFF CHIP HDMI gVdisModuleContext.displayId[2] = SYSTEM_LINK_ID_DISPLAY_2; // OFF CHIP HDMI merge1Id = SYSTEM_VPSS_LINK_ID_MERGE_0; dup1Id = SYSTEM_VPSS_LINK_ID_DUP_0; nullId = SYSTEM_VPSS_LINK_ID_NULL_0; ipcOutVpssId = SYSTEM_VPSS_LINK_ID_IPC_OUT_M3_0; ipcInVideoId = SYSTEM_VIDEO_LINK_ID_IPC_IN_M3_0; ipcOutVideoId= SYSTEM_VIDEO_LINK_ID_IPC_OUT_M3_0; ipcInVpssId = SYSTEM_VPSS_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; gVdecModuleContext.ipcBitsOutHLOSId = SYSTEM_HOST_LINK_ID_IPC_BITS_OUT_0; gVdecModuleContext.ipcBitsInRTOSId = SYSTEM_VIDEO_LINK_ID_IPC_BITS_IN_0; capturePrm.numVipInst = 2; // 8 channel capturePrm.outQueParams[0].nextLink = gVcapModuleContext.deiId[0]; // DEI support both 420SP & 422I capturePrm.tilerEnable = FALSE; for(vipInstId=0; vipInstId<capturePrm.numVipInst; vipInstId++) { pCaptureInstPrm = &capturePrm.vipInst[vipInstId]; pCaptureInstPrm->vipInstId = (SYSTEM_CAPTURE_INST_VIP1_PORTB- vipInstId)%SYSTEM_CAPTURE_INST_MAX;//(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_MUX_4CH_HALF_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_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; } Vcap_configVideoDecoder(vidDecVideoModeArgs, NUM_CAPTURE_DEVICES); { DeiLink_CreateParams_Init(&deiPrm[0]); deiPrm[0].inQueParams.prevLinkId = gVcapModuleContext.captureId; deiPrm[0].inQueParams.prevLinkQueId = 0; deiPrm[0].outQueParams[DEI_LINK_OUT_QUE_VIP_SC].nextLink = merge1Id; deiPrm[0].outQueParams[DEI_LINK_OUT_QUE_DEI_SC].nextLink = gVcapModuleContext.nsfId[0]; deiPrm[0].enableOut[DEI_LINK_OUT_QUE_VIP_SC] = TRUE; deiPrm[0].enableOut[DEI_LINK_OUT_QUE_DEI_SC] = TRUE; deiPrm[0].tilerEnable = TRUE; deiPrm[0].comprEnable = FALSE; deiPrm[0].setVipScYuv422Format = FALSE; #ifdef DEI_SCALING_BASED_ON_RATIO /* Set Output Scaling at DEI to ratio based */ deiPrm[0].scaleMode = DEI_SCALE_MODE_RATIO; /* DEI Path Scalar ratio is 1:2, D1 => CIF */ deiPrm[0].outScaleFactor[DEI_LINK_OUT_QUE_DEI_SC].ratio.widthRatio.numerator = 1; deiPrm[0].outScaleFactor[DEI_LINK_OUT_QUE_DEI_SC].ratio.widthRatio.denominator = 2; deiPrm[0].outScaleFactor[DEI_LINK_OUT_QUE_DEI_SC].ratio.heightRatio.numerator = 1; deiPrm[0].outScaleFactor[DEI_LINK_OUT_QUE_DEI_SC].ratio.heightRatio.denominator = 2; /* VIP Scalar ratio is 1:1 */ deiPrm[0].outScaleFactor[DEI_LINK_OUT_QUE_VIP_SC].ratio.widthRatio.numerator = 1; deiPrm[0].outScaleFactor[DEI_LINK_OUT_QUE_VIP_SC].ratio.widthRatio.denominator = 1; deiPrm[0].outScaleFactor[DEI_LINK_OUT_QUE_VIP_SC].ratio.heightRatio.numerator = 1; deiPrm[0].outScaleFactor[DEI_LINK_OUT_QUE_VIP_SC].ratio.heightRatio.denominator = 1; #else /* Set Output Scaling at DEI to ratio based */ deiPrm[0].scaleMode = DEI_SCALE_MODE_ABSOLUTE; /* DEI Path Scalar <for primary out> is set to D1 */ deiPrm[0].outScaleFactor[DEI_LINK_OUT_QUE_DEI_SC].absoluteResolution.outWidth = 352; deiPrm[0].outScaleFactor[DEI_LINK_OUT_QUE_DEI_SC].absoluteResolution.outHeight = 288; /* DEI Path Scalar <for secondary out> is set to CIF */ deiPrm[0].outScaleFactor[DEI_LINK_OUT_QUE_VIP_SC].absoluteResolution.outWidth = 720; deiPrm[0].outScaleFactor[DEI_LINK_OUT_QUE_VIP_SC].absoluteResolution.outHeight = 480; #endif } NsfLink_CreateParams_Init(&nsfPrm); nsfPrm.bypassNsf = TRUE; nsfPrm.tilerEnable = FALSE; nsfPrm.inQueParams.prevLinkId = gVcapModuleContext.deiId[0]; nsfPrm.inQueParams.prevLinkQueId = DEI_LINK_OUT_QUE_DEI_SC; nsfPrm.numOutQue = 1; nsfPrm.outQueParams[0].nextLink = ipcOutVpssId; ipcOutVpssPrm.inQueParams.prevLinkId = gVcapModuleContext.nsfId[0]; ipcOutVpssPrm.inQueParams.prevLinkQueId = 0; ipcOutVpssPrm.outQueParams[0].nextLink = ipcInVideoId; ipcOutVpssPrm.notifyNextLink = FALSE; ipcOutVpssPrm.notifyPrevLink = TRUE; ipcOutVpssPrm.noNotifyMode = TRUE; ipcInVideoPrm.inQueParams.prevLinkId = ipcOutVpssId; ipcInVideoPrm.inQueParams.prevLinkQueId = 0; ipcInVideoPrm.outQueParams[0].nextLink = gVencModuleContext.encId; ipcInVideoPrm.notifyNextLink = TRUE; ipcInVideoPrm.notifyPrevLink = FALSE; ipcInVideoPrm.noNotifyMode = TRUE; encPrm.numBufPerCh[0] = 4; //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<8; 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; pLinkChPrm->fieldMergeEncodeEnable = FALSE; pLinkChPrm->enableAnalyticinfo = pChPrm->enableAnalyticinfo; pLinkChPrm->maxBitRate = pChPrm->maxBitRate; pLinkChPrm->encodingPreset = pChPrm->encodingPreset; pLinkChPrm->rateControlPreset = pChPrm->rcType; 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; } encPrm.inQueParams.prevLinkId = ipcInVideoId; encPrm.inQueParams.prevLinkQueId = 0; encPrm.outQueParams.nextLink = gVencModuleContext.ipcBitsOutRTOSId; } ipcBitsOutVideoPrm.baseCreateParams.inQueParams.prevLinkId = gVencModuleContext.encId; ipcBitsOutVideoPrm.baseCreateParams.inQueParams.prevLinkQueId = 0; ipcBitsOutVideoPrm.baseCreateParams.outQueParams[0].nextLink = gVencModuleContext.ipcBitsInHLOSId; MultiCh_ipcBitsInitCreateParams_BitsOutRTOS(&ipcBitsOutVideoPrm, TRUE); ipcBitsInHostPrm.baseCreateParams.inQueParams.prevLinkId = gVencModuleContext.ipcBitsOutRTOSId; ipcBitsInHostPrm.baseCreateParams.inQueParams.prevLinkQueId = 0; MultiCh_ipcBitsInitCreateParams_BitsInHLOS(&ipcBitsInHostPrm); MultiCh_displayCtrlInit(&gVdisModuleContext.vdisConfig); #ifndef SYSTEM_USE_VIDEO_DECODER capturePrm.isPalMode = Vcap_isPalMode(); #endif System_linkCreate (gVcapModuleContext.captureId, &capturePrm, sizeof(capturePrm)); System_linkCreate(gVcapModuleContext.deiId[0] , &deiPrm[0], sizeof(deiPrm[0])); System_linkCreate(gVcapModuleContext.nsfId[0] , &nsfPrm, sizeof(nsfPrm)); System_linkCreate(ipcOutVpssId , &ipcOutVpssPrm , sizeof(ipcOutVpssPrm) ); System_linkCreate(ipcInVideoId , &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); OSA_assert(bitsProducerLinkInfo.numQue = 1); ipcBitsOutHostPrm.baseCreateParams.outQueParams[0].nextLink = gVdecModuleContext.ipcBitsInRTOSId; 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"); printf ("Reducing bitsProducerLinkInfo.numCh to 8\n"); bitsProducerLinkInfo.queInfo[0].numCh = 8; MultiCh_ipcBitsInitCreateParams_BitsOutHLOS(&ipcBitsOutHostPrm, &bitsProducerLinkInfo.queInfo[0]); if(gVdecModuleContext.vdecConfig.forceUseDecChannelParams) { /* use channel info provided by user instead of from encoder */ UInt32 chId; System_LinkChInfo *pChInfo; ipcBitsOutHostPrm.inQueInfo.numCh = gVdecModuleContext.vdecConfig.numChn; for(chId=0; chId<ipcBitsOutHostPrm.inQueInfo.numCh; chId++) { pChInfo = &ipcBitsOutHostPrm.inQueInfo.chInfo[chId]; pChInfo->bufType = 0; // NOT USED pChInfo->codingformat = 0; // NOT USED pChInfo->dataFormat = 0; // NOT USED pChInfo->memType = 0; // NOT USED pChInfo->startX = 0; // NOT USED pChInfo->startY = 0; // NOT USED pChInfo->width = gVdecModuleContext.vdecConfig.decChannelParams[chId].maxVideoWidth; pChInfo->height = gVdecModuleContext.vdecConfig.decChannelParams[chId].maxVideoHeight; pChInfo->pitch[0] = 0; // NOT USED pChInfo->pitch[1] = 0; // NOT USED pChInfo->pitch[2] = 0; // NOT USED pChInfo->scanFormat = SYSTEM_SF_PROGRESSIVE; } } ipcBitsInVideoPrm.baseCreateParams.inQueParams.prevLinkId = gVdecModuleContext.ipcBitsOutHLOSId; ipcBitsInVideoPrm.baseCreateParams.inQueParams.prevLinkQueId = 0; ipcBitsInVideoPrm.baseCreateParams.outQueParams[0].nextLink = gVdecModuleContext.decId; MultiCh_ipcBitsInitCreateParams_BitsInRTOS(&ipcBitsInVideoPrm, TRUE); for (i=0; i<8; i++) { decPrm.chCreateParams[i].format = IVIDEO_H264HP; decPrm.chCreateParams[i].profile = IH264VDEC_PROFILE_ANY; decPrm.chCreateParams[i].fieldMergeDecodeEnable = FALSE; decPrm.chCreateParams[i].targetMaxWidth = gVdecModuleContext.vdecConfig.decChannelParams[i].maxVideoWidth; decPrm.chCreateParams[i].targetMaxHeight = gVdecModuleContext.vdecConfig.decChannelParams[i].maxVideoHeight; decPrm.chCreateParams[i].defaultDynamicParams.targetFrameRate = gVdecModuleContext.vdecConfig.decChannelParams[i].dynamicParam.frameRate; decPrm.chCreateParams[i].defaultDynamicParams.targetBitRate = gVdecModuleContext.vdecConfig.decChannelParams[i].dynamicParam.targetBitRate; } decPrm.inQueParams.prevLinkId = gVdecModuleContext.ipcBitsInRTOSId; decPrm.inQueParams.prevLinkQueId = 0; decPrm.outQueParams.nextLink = ipcOutVideoId; decPrm.tilerEnable = TRUE; ipcOutVideoPrm.inQueParams.prevLinkId = gVdecModuleContext.decId; ipcOutVideoPrm.inQueParams.prevLinkQueId = 0; ipcOutVideoPrm.outQueParams[0].nextLink = ipcInVpssId; ipcOutVideoPrm.notifyNextLink = FALSE; ipcOutVideoPrm.notifyPrevLink = TRUE; ipcOutVideoPrm.noNotifyMode = TRUE; ipcInVpssPrm.inQueParams.prevLinkId = ipcOutVideoId; ipcInVpssPrm.inQueParams.prevLinkQueId = 0; ipcInVpssPrm.outQueParams[0].nextLink = merge1Id; ipcInVpssPrm.notifyNextLink = TRUE; ipcInVpssPrm.notifyPrevLink = FALSE; ipcInVpssPrm.noNotifyMode = TRUE; merge1Prm.numInQue = 2; merge1Prm.inQueParams[0].prevLinkId = gVcapModuleContext.deiId[0]; merge1Prm.inQueParams[0].prevLinkQueId = DEI_LINK_OUT_QUE_VIP_SC; merge1Prm.inQueParams[1].prevLinkId = ipcInVpssId; merge1Prm.inQueParams[1].prevLinkQueId = 0; merge1Prm.outQueParams.nextLink = dup1Id; merge1Prm.notifyNextLink = TRUE; dup1Prm.inQueParams.prevLinkId = merge1Id;; dup1Prm.inQueParams.prevLinkQueId = 0; dup1Prm.numOutQue = 2; dup1Prm.outQueParams[0].nextLink = gVdisModuleContext.swMsId[0]; dup1Prm.outQueParams[1].nextLink = gVdisModuleContext.swMsId[1]; dup1Prm.notifyNextLink = TRUE; // swMsPrm[0].inQueParams.prevLinkId = dup1Id; // swMsPrm[0].inQueParams.prevLinkQueId = 0; //DEI_LINK_OUT_QUE_VIP_SC; // swMsPrm[1].inQueParams.prevLinkId = dup1Id; // swMsPrm[1].inQueParams.prevLinkQueId = 1; numSubChains = 2; for(i=0; i<numSubChains; i++) { swMsPrm[i].inQueParams.prevLinkId = dup1Id; swMsPrm[i].inQueParams.prevLinkQueId = i; swMsPrm[i].outQueParams.nextLink = gVdisModuleContext.displayId[i]; swMsPrm[i].maxOutRes = gVdisModuleContext.vdisConfig.deviceParams[i].resolution; swMsPrm[i].lineSkipMode = FALSE; swMsPrm[i].enableLayoutGridDraw = gVdisModuleContext.vdisConfig.enableLayoutGridDraw; MultiCh_swMsGetDefaultLayoutPrm(i, &swMsPrm[i], FALSE); displayPrm[i].inQueParams[0].prevLinkId = gVdisModuleContext.swMsId[i]; displayPrm[i].inQueParams[0].prevLinkQueId = 0; displayPrm[i].displayRes = swMsPrm[i].maxOutRes; } displayPrm[2].inQueParams[0].prevLinkId = dup1Id; displayPrm[2].inQueParams[0].prevLinkQueId = 1; displayPrm[2].displayRes = gVdisModuleContext.vdisConfig.deviceParams[VDIS_DEV_SD].resolution; System_linkCreate(gVdecModuleContext.ipcBitsOutHLOSId,&ipcBitsOutHostPrm,sizeof(ipcBitsOutHostPrm)); System_linkCreate(gVdecModuleContext.ipcBitsInRTOSId,&ipcBitsInVideoPrm,sizeof(ipcBitsInVideoPrm)); System_linkCreate(gVdecModuleContext.decId, &decPrm, sizeof(decPrm)); System_linkCreate(ipcOutVideoId, &ipcOutVideoPrm, sizeof(ipcOutVideoPrm)); System_linkCreate(ipcInVpssId , &ipcInVpssPrm , sizeof(ipcInVpssPrm) ); System_linkCreate(merge1Id , &merge1Prm , sizeof(merge1Prm)); System_linkCreate(dup1Id , &dup1Prm , sizeof(dup1Prm)); for(i=0; i<2; i++) System_linkCreate(gVdisModuleContext.swMsId[i] , &swMsPrm[i], sizeof(swMsPrm[i])); for(i=0; i<3; i++) System_linkCreate(gVdisModuleContext.displayId[i], &displayPrm[i], sizeof(displayPrm[i])); // MultiCh_memPrintHeapStatus(); //Utils_encdecHdvicpPrfInit(); }