I have a use case where in I need a single 1080p H.264 stream. Following is the use case diagram.
SENSOR
________||_______
| |
| CAMERA LINK |
|____(VPSSM3)____|
|
|
RSZA
(1920x1080)
(420SP)
|
___________|
|
DUP(VPSSM3)
(0)
| ------------ |
|
|
|
|
|
|
|
IPC OUT(VPSSM3)
|
|
IPC IN(VIDEOM3)
|
|
H264ENC(VIDEOM3)
|
|
IPC BITS OUT(VIDEOM3)
|
|
IPC BITS IN(A8)
|
|
*************
* STREAMING *
*************
However , this gives black frames upon dumping. Attached is the code.
I can get 2 streams after simple modification (1080p and 720p) without any problem. Request somebody to check this.
Best Regards
JK
/** ================================================================== * @file multich_tristream_lowPower.c * * @path ipnc_mcfw/mcfw/src_linux/mcfw_api/usecases/ * * @desc This File contains. * =================================================================== * Copyright (c) Texas Instruments Inc 2011, 2012 * * Use of this software is controlled by the terms and conditions found * in the license agreement under which this software has been supplied * ===================================================================*/ /*------------------------------ TRIPLE OUT <1080p + D1 + 1080p> --------------------------- SENSOR ________||_______ | | | CAMERA LINK | |____(VPSSM3)____| | RSZA (1920x1080) (420SP) | ___________| | DUP(VPSSM3) (0) | ------------ | | | | | | | | IPC OUT(VPSSM3) | | IPC IN(VIDEOM3) | | H264ENC(VIDEOM3) | | IPC BITS OUT(VIDEOM3) | | IPC BITS IN(A8) | | ************* * STREAMING * ************* ------------------------------------------------------------------------------------------*/ #include "mcfw/src_linux/mcfw_api/usecases/multich_common.h" #include "mcfw/src_linux/mcfw_api/usecases/multich_ipcbits.h" #include "demos/mcfw_api_demos/multich_usecase/ti_mcfw_ipnc_main.h" extern UInt32 gIsGlbceInitDone; extern UInt32 gIsDiplayToBeDisabled; extern GlbcePreset gGLBCE_AlgoPreset; /* ============================================================================= * Externs * ============================================================================= */ /* ============================================================================= * Use case code * ============================================================================= */ static SystemVideo_Ivahd2ChMap_Tbl systemVid_encDecIvaChMapTbl = { .isPopulated = 1, .ivaMap[0] = { .EncNumCh = 2, .EncChList = {0, 1}, .DecNumCh = 2, .DecChList = {0, 1}, }, }; #ifdef ENABLE_TILER #define TILER_ENABLE TRUE #else #define TILER_ENABLE FALSE #endif //#define MUX /* Merge Link for camera streams */ #define NUM_MERGE_LINK (1) #define CAM_STREAM_MERGE_IDX (0) /* =================================================================== * @func MultiCh_createTriStreamLowPwr * * @desc Function does the following * * @modif This function modifies the following structures * * @inputs This function takes the following inputs * <argument name> * Description of usage * <argument name> * Description of usage * * @outputs <argument name> * Description of usage * * @return Return value of this function if any * ================================================================== */ Void singleStream_create() { UInt32 i; CameraLink_CreateParams cameraPrm; IspLink_CreateParams ispPrm; UInt32 ispId; GlbceLink_CreateParams glbcePrm; UInt32 glbceId; MergeLink_CreateParams mergePrm[NUM_MERGE_LINK]; IpcLink_CreateParams ipcOutVpssPrm; IpcLink_CreateParams ipcInVideoPrm; EncLink_CreateParams encPrm; DupLink_CreateParams dupPrm; IpcBitsOutLinkRTOS_CreateParams ipcBitsOutVideoPrm; IpcBitsInLinkHLOS_CreateParams ipcBitsInHostPrm0; VstabLink_CreateParams vstabPrm; GlbceSupportLink_CreateParams glbceSupportPrm; CameraLink_VipInstParams *pCameraInstPrm; CameraLink_OutParams *pCameraOutPrm; UInt32 dupId; #ifdef MUX UInt32 muxId; #endif UInt32 ipcOutVpssId; UInt32 ipcInVideoId; // UInt32 swosdId; UInt32 vstabId; UInt32 glbceSupportId; #ifdef WDR_ON WdrLink_CreateParams wdrPrm; UInt32 wdrId; #endif /* IPC struct init */ MULTICH_INIT_STRUCT(IpcLink_CreateParams, ipcOutVpssPrm); MULTICH_INIT_STRUCT(IpcLink_CreateParams, ipcInVideoPrm); MULTICH_INIT_STRUCT(IpcBitsOutLinkRTOS_CreateParams, ipcBitsOutVideoPrm); MULTICH_INIT_STRUCT(IpcBitsInLinkHLOS_CreateParams, ipcBitsInHostPrm0); #ifdef MUX MULTICH_INIT_STRUCT(MuxLink_CreateParams, muxPrm); #endif OSA_printf("\n********** LOW POWER USECASE ********\n"); OSA_printf ("********* Entered Tri Streaming usecase - H264 1080p @60fps + H264 D1 @30fps + MJPEG 1080p @5fps ********\n\n"); 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); /* Link IDs */ gVcamModuleContext.cameraId = SYSTEM_LINK_ID_CAMERA; gVencModuleContext.encId = SYSTEM_LINK_ID_VENC_0; dupId = SYSTEM_VPSS_LINK_ID_DUP_0; gVsysModuleContext.swOsdId = SYSTEM_LINK_ID_SWOSD_0; vstabId = SYSTEM_LINK_ID_VSTAB_0; glbceSupportId = SYSTEM_LINK_ID_GLBCE_SUPPORT_0; #ifdef WDR_ON wdrId = SYSTEM_LINK_ID_WDR; #endif /* IPC frame Link IDs */ ipcOutVpssId = SYSTEM_VPSS_LINK_ID_IPC_OUT_M3_0; ipcInVideoId = SYSTEM_VIDEO_LINK_ID_IPC_IN_M3_0; /* IPC bits link IDs */ gVencModuleContext.ipcBitsOutRTOSId = SYSTEM_VIDEO_LINK_ID_IPC_BITS_OUT_0; gVencModuleContext.ipcBitsInHLOSId = SYSTEM_HOST_LINK_ID_IPC_BITS_IN_0; ispId = SYSTEM_LINK_ID_ISP_0; glbceId = SYSTEM_LINK_ID_GLBCE; OSA_printf("JK:gUI_mcfw_config.glbceEnable = %d \n ",gUI_mcfw_config.glbceEnable);//0 OSA_printf("JK:gUI_mcfw_config.demoCfg.resolution_combo = %d \n ",gUI_mcfw_config.demoCfg.resolution_combo);//0 { /* Camera Link params */ CameraLink_CreateParams_Init(&cameraPrm); cameraPrm.captureMode = CAMERA_LINK_CAPMODE_ISIF; cameraPrm.outQueParams[0].nextLink = dupId; //cameraPrm.outQueParams[1].nextLink = mergeId[CAM_STREAM_MERGE_IDX]; // gVcamModuleContext.glbceId = SYSTEM_LINK_ID_INVALID; /* This is for TVP5158 Audio Channels - Change it to 16 if there are 16 * audio channels connected in cascade */ // cameraPrm.numAudioChannels = 1; cameraPrm.numVipInst = 1; #ifdef ENABLE_TILER_CAMERA cameraPrm.tilerEnable = TRUE; #else cameraPrm.tilerEnable = FALSE; #endif cameraPrm.vsEnable = gUI_mcfw_config.vsEnable; cameraPrm.vstabLinkId = vstabId; pCameraInstPrm = &cameraPrm.vipInst[0]; pCameraInstPrm->vipInstId = SYSTEM_CAMERA_INST_VP_CSI2; pCameraInstPrm->videoDecoderId = MultiCh_getSensorId(gUI_mcfw_config.sensorId); pCameraInstPrm->inDataFormat = SYSTEM_DF_YUV420SP_UV; #ifdef IMGS_OMNIVISION_OV10630 pCameraInstPrm->sensorOutWidth = 1280; pCameraInstPrm->sensorOutHeight = 720; #elif defined IMGS_MICRON_MT9M034 pCameraInstPrm->sensorOutWidth = 1280; pCameraInstPrm->sensorOutHeight = 720; #else switch(gUI_mcfw_config.demoCfg.resolution_combo) { case RES_1080P_D1 : pCameraInstPrm->sensorOutWidth = 1920; pCameraInstPrm->sensorOutHeight = 1080; break; case RES_1080P_1080P: pCameraInstPrm->sensorOutWidth = 1920; pCameraInstPrm->sensorOutHeight = 1080; break; case RES_3MP_D1 : pCameraInstPrm->sensorOutWidth = 2048; pCameraInstPrm->sensorOutHeight = 1536; break; case RES_5MP_D1 : pCameraInstPrm->sensorOutWidth = 2560; pCameraInstPrm->sensorOutHeight = 1920; break; case RES_8MP_D1 : pCameraInstPrm->sensorOutWidth = 3264; pCameraInstPrm->sensorOutHeight = 2448; break; case RES_10MP_D1 : pCameraInstPrm->sensorOutWidth = 3648; pCameraInstPrm->sensorOutHeight = 2736; break; case RES_960P_D1 : pCameraInstPrm->sensorOutWidth = 1280; pCameraInstPrm->sensorOutHeight = 960; break; default : pCameraInstPrm->sensorOutWidth = 1920; pCameraInstPrm->sensorOutHeight = 1080; break; } #endif switch(gUI_mcfw_config.demoCfg.resolution_combo) { case RES_1080P_D1 : pCameraInstPrm->standard = SYSTEM_STD_1080P_60; break; case RES_1080P_1080P: pCameraInstPrm->standard = SYSTEM_STD_1080P_60; break; case RES_3MP_D1 : pCameraInstPrm->standard = SYSTEM_STD_3MP_2048_1536; break; case RES_5MP_D1 : pCameraInstPrm->standard = SYSTEM_STD_5MP_2560_1920; break; case RES_8MP_D1 : pCameraInstPrm->standard = SYSTEM_STD_8MP_3264_2448; break; case RES_10MP_D1 : pCameraInstPrm->standard = SYSTEM_STD_10MP_3648_2736; break; case RES_960P_D1 : pCameraInstPrm->standard = SYSTEM_STD_960P_30; break; default : pCameraInstPrm->standard = SYSTEM_STD_1080P_60; break; } pCameraInstPrm->numOutput = 1;//2; /* First stream */ pCameraOutPrm = &pCameraInstPrm->outParams[0]; pCameraOutPrm->dataFormat = SYSTEM_DF_YUV420SP_UV; pCameraOutPrm->scEnable = FALSE; #ifdef IMGS_OMNIVISION_OV10630 pCameraOutPrm->scOutWidth = 1280; pCameraOutPrm->scOutHeight = 720; #elif defined IMGS_MICRON_MT9M034 pCameraOutPrm->scOutWidth = 1280; pCameraOutPrm->scOutHeight = 720; #else /* When VS is enabled then scOutWidth/scOutHeight cannot be equal to sensorOutWidth/sensorOutHeight */ if(cameraPrm.vsEnable == 0) { switch(gUI_mcfw_config.demoCfg.resolution_combo) { case RES_1080P_D1 : pCameraOutPrm->scOutWidth = 1920; pCameraOutPrm->scOutHeight = 1080; break; case RES_1080P_1080P: pCameraOutPrm->scOutWidth = 1920; pCameraOutPrm->scOutHeight = 1080; break; case RES_3MP_D1 : pCameraOutPrm->scOutWidth = 2048; pCameraOutPrm->scOutHeight = 1536; break; case RES_5MP_D1 : pCameraOutPrm->scOutWidth = 2560; pCameraOutPrm->scOutHeight = 1920; break; case RES_8MP_D1 : pCameraOutPrm->scOutWidth = 3264; pCameraOutPrm->scOutHeight = 2448; break; case RES_10MP_D1 : pCameraOutPrm->scOutWidth = 3648; pCameraOutPrm->scOutHeight = 2736; break; case RES_960P_D1 : pCameraOutPrm->scOutWidth = 1280; pCameraOutPrm->scOutHeight = 960; break; default : pCameraOutPrm->scOutWidth = 1920; pCameraOutPrm->scOutHeight = 1080; break; } } else { pCameraOutPrm->scOutWidth = 1600; pCameraOutPrm->scOutHeight = 900; } #endif pCameraOutPrm->outQueId = 0; /* Second stream */ /* pCameraOutPrm = &pCameraInstPrm->outParams[1]; pCameraOutPrm->dataFormat = SYSTEM_DF_YUV420SP_UV; pCameraOutPrm->scEnable = FALSE; pCameraOutPrm->scOutWidth = 1280;//720; pCameraOutPrm->scOutHeight =720;// 480; pCameraOutPrm->standard = SYSTEM_STD_NTSC;//SYSTEM_STD_PAL; pCameraOutPrm->outQueId = 1;*/ /* 2A config */ cameraPrm.t2aConfig.n2A_vendor = gUI_mcfw_config.n2A_vendor; cameraPrm.t2aConfig.n2A_mode = gUI_mcfw_config.n2A_mode; } /* vstab Link params */ vstabPrm.totalFrameWidth = pCameraInstPrm->sensorOutWidth; vstabPrm.totalFrameHeight = pCameraInstPrm->sensorOutHeight; glbceSupportPrm.glbceLinkID = glbceId; OSA_printf("JK:gUI_mcfw_config.glbceEnable = %d \n ",gUI_mcfw_config.glbceEnable);//0 dupPrm.inQueParams.prevLinkId = gVcamModuleContext.cameraId; dupPrm.inQueParams.prevLinkQueId = 0; dupPrm.numOutQue = 1;//2; dupPrm.outQueParams[0].nextLink = ipcOutVpssId;//mergeId[CAM_STREAM_MERGE_IDX]; //dupPrm.outQueParams[1].nextLink = mergeId[CAM_STREAM_MERGE_IDX]; dupPrm.notifyNextLink = TRUE; #endif #if 0 /* SWOSD Link Params */ swosdPrm.inQueParams.prevLinkId = mergeId[CAM_STREAM_MERGE_IDX]; swosdPrm.inQueParams.prevLinkQueId = 0; swosdPrm.outQueParams.nextLink = ipcOutVpssId; #endif /* IPC Out VPSS link params */ ipcOutVpssPrm.inQueParams.prevLinkId = dupId; ipcOutVpssPrm.inQueParams.prevLinkQueId = 0; ipcOutVpssPrm.numOutQue = 1; ipcOutVpssPrm.outQueParams[0].nextLink = ipcInVideoId; ipcOutVpssPrm.notifyNextLink = TRUE; ipcOutVpssPrm.notifyPrevLink = TRUE; ipcOutVpssPrm.noNotifyMode = FALSE; /* IPC In VIDEO params */ 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; /* Video Encoder Link params */ MULTICH_INIT_STRUCT(EncLink_CreateParams, encPrm); { EncLink_ChCreateParams *pLinkChPrm; EncLink_ChDynamicParams *pLinkDynPrm; VENC_CHN_DYNAMIC_PARAM_S *pDynPrm; VENC_CHN_PARAMS_S *pChPrm; for (i = 0; i < VENC_PRIMARY_CHANNELS; i++)//VENC_PRIMARY_CHANNELS = 1 { pLinkChPrm = &encPrm.chCreateParams[i]; pLinkDynPrm = &pLinkChPrm->defaultDynamicParams; pChPrm = &gVencModuleContext.vencConfig.encChannelParams[i]; pDynPrm = &pChPrm->dynamicParam; pLinkChPrm->format = IVIDEO_H264HP; //"SINGLE_H264" pLinkChPrm->profile = gVencModuleContext.vencConfig.h264Profile[i]; pLinkChPrm->dataLayout = IVIDEO_PROGRESSIVE; pLinkChPrm->fieldMergeEncodeEnable = FALSE; pLinkChPrm->enableAnalyticinfo = pChPrm->enableAnalyticinfo; pLinkChPrm->maxBitRate = pChPrm->maxBitRate; pLinkChPrm->encodingPreset = pChPrm->encodingPreset; pLinkChPrm->rateControlPreset = IVIDEO_USER_DEFINED; //pChPrm->rcType; pLinkChPrm->enableHighSpeed = FALSE; pLinkChPrm->enableWaterMarking = pChPrm->enableWaterMarking; pLinkChPrm->StreamPreset = gUI_mcfw_config.StreamPreset[i]; 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 ((gUI_mcfw_config.demoCfg.resolution_combo == RES_10MP_D1) && (i == 0)) { encPrm.numBufPerCh[i] = 2; } else if ((gUI_mcfw_config.demoCfg.resolution_combo == RES_8MP_D1) && (i == 0)) { encPrm.numBufPerCh[i] = 3; } else { encPrm.numBufPerCh[i] = 4; } gVencModuleContext.encFormat[i] = pLinkChPrm->format; } } /* Video Encoder Framerate */ encPrm.chCreateParams[0].defaultDynamicParams.inputFrameRate = 60; // ENC_LINK_DEFAULT_ALGPARAMS_INPUTFRAMERATE; // encPrm.chCreateParams[1].defaultDynamicParams.inputFrameRate = 30; // ENC_LINK_DEFAULT_ALGPARAMS_INPUTFRAMERATE; //encPrm.chCreateParams[1].defaultDynamicParams.inputFrameRate = 5; encPrm.vsEnable = 0;//gUI_mcfw_config.vsEnable; OSA_printf("JK:encPrm.vsEnable = %d \n ",encPrm.vsEnable);//0 encPrm.isVaUseCase = 0; encPrm.inQueParams.prevLinkId = ipcInVideoId; encPrm.inQueParams.prevLinkQueId = 0; encPrm.outQueParams.nextLink = gVencModuleContext.ipcBitsOutRTOSId; /* IPC Bits Out VIDEO Link params */ 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); /* IPC Bits In HOST Link params */ ipcBitsInHostPrm0.baseCreateParams.inQueParams.prevLinkId = gVencModuleContext.ipcBitsOutRTOSId; ipcBitsInHostPrm0.baseCreateParams.inQueParams.prevLinkQueId = 0; MultiCh_ipcBitsInitCreateParams_BitsInHLOS(&ipcBitsInHostPrm0); /* Links Creation */ /* Camera Link */ System_linkCreate(gVcamModuleContext.cameraId, &cameraPrm, sizeof(cameraPrm)); System_linkControl(gVcamModuleContext.cameraId, CAMERA_LINK_CMD_DETECT_VIDEO, NULL, 0, TRUE); if(gUI_mcfw_config.glbceEnable) { #ifndef WDR_ON System_linkCreate(glbceSupportId, &glbceSupportPrm,sizeof(glbceSupportPrm)); /* glbce link create */ System_linkCreate(glbceId, &glbcePrm,sizeof(glbcePrm)); #else System_linkCreate(wdrId, &wdrPrm,sizeof(wdrPrm)); #endif /* cam pp link create */ System_linkCreate(ispId, &ispPrm,sizeof(ispPrm)); gIsGlbceInitDone = 1; } else { gIsGlbceInitDone = 0; } /* Dup Link */ System_linkCreate(dupId, &dupPrm, sizeof(dupPrm)); /* IPC Links */ System_linkCreate(ipcOutVpssId, &ipcOutVpssPrm, sizeof(ipcOutVpssPrm)); System_linkCreate(ipcInVideoId, &ipcInVideoPrm, sizeof(ipcInVideoPrm)); /* Video Encoder Link */ System_linkCreate(gVencModuleContext.encId, &encPrm, sizeof(encPrm)); /* VSTAB link */ System_linkCreate(vstabId, &vstabPrm, sizeof(vstabPrm)); /* IPC Bits Links */ System_linkCreate(gVencModuleContext.ipcBitsOutRTOSId, &ipcBitsOutVideoPrm, sizeof(ipcBitsOutVideoPrm)); System_linkCreate(gVencModuleContext.ipcBitsInHLOSId, &ipcBitsInHostPrm0, sizeof(ipcBitsInHostPrm0)); OSA_printf("USECASE SETUP DONE\n"); } /* =================================================================== * @func MultiCh_deleteTriStreamLowPwr * * @desc Function does the following * * @modif This function modifies the following structures * * @inputs This function takes the following inputs * <argument name> * Description of usage * <argument name> * Description of usage * * @outputs <argument name> * Description of usage * * @return Return value of this function if any * ================================================================== */ Void single_stream_delete() { UInt32 ispId; UInt32 glbceId; UInt32 dupId; UInt32 ipcOutVpssId; UInt32 ipcInVideoId; UInt32 vstabId; UInt32 glbceSupportId; #ifdef WDR_ON UInt32 wdrId; #endif dupId = SYSTEM_VPSS_LINK_ID_DUP_0; gVsysModuleContext.swOsdId = SYSTEM_LINK_ID_SWOSD_0; ipcOutVpssId = SYSTEM_VPSS_LINK_ID_IPC_OUT_M3_0; ipcInVideoId = SYSTEM_VIDEO_LINK_ID_IPC_IN_M3_0; ispId = SYSTEM_LINK_ID_ISP_0; glbceId = SYSTEM_LINK_ID_GLBCE; vstabId = SYSTEM_LINK_ID_VSTAB_0; glbceSupportId = SYSTEM_LINK_ID_GLBCE_SUPPORT_0; #ifdef WDR_ON wdrId = SYSTEM_LINK_ID_WDR; #endif /* Deleting the links in order of sink to source */ System_linkDelete(gVencModuleContext.ipcBitsOutRTOSId); System_linkDelete(gVencModuleContext.ipcBitsInHLOSId); /* VSTAB Link */ System_linkDelete(vstabId); System_linkDelete(gVencModuleContext.encId); System_linkDelete(ipcOutVpssId); System_linkDelete(ipcInVideoId); System_linkDelete(dupId); if(gIsGlbceInitDone) { #ifndef WDR_ON System_linkDelete(glbceId); System_linkDelete(glbceSupportId); #else System_linkDelete(wdrId); #endif System_linkDelete(ispId); gIsGlbceInitDone = 0; } else OSA_printf("We come here to leave for the day\n"); System_linkDelete(gVcamModuleContext.cameraId); /* SWOSD Link */ System_linkDelete(gVsysModuleContext.swOsdId); /* Print the HWI, SWI and all tasks load */ /* Reset the accumulated timer ticks */ MultiCh_prfLoadCalcEnable(FALSE, TRUE, FALSE); OSA_printf("USECASE TEARDOWN DONE\n"); }