基於Hi3559AV100 RFCN實現細節解析-(3)系統輸入VI分析一 :
下面隨筆系列將對Hi3559AV100 RFCN實現細節進行解析,整個過程涉及到VI、VDEC、VPSS、VGS、VO、NNIE,其中涉及的內容,大家可以參考之前我寫的部落格:
//www.cnblogs.com/iFrank/p/14374658.html
基於Hi3559AV100的影片採集(VDEC-VPSS-VO)整體框圖設計
//www.cnblogs.com/iFrank/p/14370575.html
基於Hi3559AV100 RFCN實現細節解析-(1)VGS初介紹:
//www.cnblogs.com/iFrank/p/14465306.html
基於Hi3559AV100的SVP(NNIE)開發整體流程 :
//www.cnblogs.com/iFrank/p/14377668.html
基於Hi3559AV100 RFCN實現細節解析-(2)RFCN數據流分析 :
//www.cnblogs.com/iFrank/p/14473724.html
下面隨筆將對RFCN的輸入VI進行詳細的分析,因為VI是整個系統的影片輸入來源,弄清楚輸入VI之後,當系統輸入源替換為.h264、.h265影片流數據及MJPEG格式的圖片時,可以靈活修改程式碼,例如實現.h264->VDEC->VPSS->NNIE->VGS->VO數據流輸出。VI的具體程式碼分析如下:
涉及VI參數初始化等等程式碼段如下:
1 SAMPLE_COMM_VI_GetSensorInfo(pstViConfig); 2 //pstViConfig->astViInfo[0].stSnsInfo.enSnsType = SENSOR0_TYPE; 3 4 pstViConfig->s32WorkingViNum = s32ViCnt; 5 6 pstViConfig->as32WorkingViId[0] = 0; 7 pstViConfig->astViInfo[0].stSnsInfo.MipiDev = SAMPLE_COMM_VI_GetComboDevBySensor(pstViConfig->astViInfo[0].stSnsInfo.enSnsType, 0); 8 pstViConfig->astViInfo[0].stSnsInfo.s32BusId = 0; 9 10 pstViConfig->astViInfo[0].stDevInfo.ViDev = ViDev0; 11 pstViConfig->astViInfo[0].stDevInfo.enWDRMode = enWDRMode; 12 13 pstViConfig->astViInfo[0].stPipeInfo.enMastPipeMode = enMastPipeMode; 14 pstViConfig->astViInfo[0].stPipeInfo.aPipe[0] = ViPipe0; 15 pstViConfig->astViInfo[0].stPipeInfo.aPipe[1] = -1; 16 pstViConfig->astViInfo[0].stPipeInfo.aPipe[2] = -1; 17 pstViConfig->astViInfo[0].stPipeInfo.aPipe[3] = -1; 18 19 pstViConfig->astViInfo[0].stChnInfo.ViChn = ViChn; 20 pstViConfig->astViInfo[0].stChnInfo.enPixFormat = enPixFormat; 21 pstViConfig->astViInfo[0].stChnInfo.enDynamicRange = enDynamicRange; 22 pstViConfig->astViInfo[0].stChnInfo.enVideoFormat = enVideoFormat; 23 pstViConfig->astViInfo[0].stChnInfo.enCompressMode = enCompressMode; 24 25 /****************************************** 26 Start vi 27 ******************************************/ 28 s32Ret = SAMPLE_COMM_VI_SetParam(pstViConfig); 29 SAMPLE_CHECK_EXPR_GOTO(HI_SUCCESS != s32Ret, END_INIT_1, 30 "Error(%#x),SAMPLE_COMM_VI_SetParam failed!\n",s32Ret); 31 32 s32Ret = SAMPLE_COMM_VI_StartVi(pstViConfig); 33 SAMPLE_CHECK_EXPR_GOTO(HI_SUCCESS != s32Ret, END_INIT_1, 34 "Error(%#x),SAMPLE_COMM_VI_StartVi failed!\n",s32Ret);
很大一部分都是對pstViConfig結構體進行初始化,配置像素格式、壓縮形式等等,其中關鍵的兩個函數為SAMPLE_COMM_VI_SetParam(pstViConfig)和SAMPLE_COMM_VI_StartVi(pstViConfig),二者具體實現見如下所示:
SAMPLE_COMM_VI_SetParam(pstViConfig)具體實現如下功能:
1 //獲取 VI,VPSS 的工作模式 2 s32Ret = HI_MPI_SYS_GetVIVPSSMode(&stVIVPSSMode); 3 //設置 VI,VPSS 工作模式。 4 s32Ret = HI_MPI_SYS_SetVIVPSSMode(&stVIVPSSMode);
SAMPLE_COMM_VI_StartVi(pstViConfig)具體實現如下功能:
1 //function : init mipi 2 s32Ret = SAMPLE_COMM_VI_StartMIPI(pstViConfig); 3 4 5 //function :獲取VI VPSS的工作模式並設置VI VPSS工作模式 6 s32Ret = SAMPLE_COMM_VI_SetParam(pstViConfig); 7 8 9 10 s32Ret = SAMPLE_COMM_VI_CreateVi(pstViConfig); 11 //涉及下面函數 12 SAMPLE_COMM_VI_CreateSingleVi(pstViInfo); 13 { 14 SAMPLE_COMM_VI_StartDev(pstViInfo); 15 { 16 SAMPLE_COMM_VI_GetDevAttrBySns(enSnsType, &stViDevAttr); 17 //memcpy_s(pstChnAttr, sizeof(VI_CHN_ATTR_S), &CHN_ATTR_4000x3000_420_SDR8_LINEAR, sizeof(VI_CHN_ATTR_S)); 18 19 HI_MPI_VI_SetDevAttr(ViDev, &stViDevAttr); 20 //設置 VI 設備屬性。基本設備屬性默認了部分晶片配置,滿足絕大部分的 sensor 對接要求。 21 22 HI_MPI_VI_EnableDev(ViDev); 23 //啟用 VI 設備。 24 } 25 26 SAMPLE_COMM_VI_BindPipeDev(pstViInfo);////we should bind pipe,then creat pipe 27 { 28 HI_MPI_VI_SetDevBindPipe(pstViInfo->stDevInfo.ViDev, &stDevBindPipe); 29 //設置 VI 設備與物理 PIPE 的綁定關係。 30 } 31 32 SAMPLE_COMM_VI_StartViPipe(pstViInfo); 33 { 34 SAMPLE_COMM_VI_GetPipeAttrBySns(pstViInfo->stSnsInfo.enSnsType, &stPipeAttr); 35 //memcpy_s(pstPipeAttr, sizeof(VI_PIPE_ATTR_S), &PIPE_ATTR_4000x3000_RAW12_420_3DNR_RFR, sizeof(VI_PIPE_ATTR_S)); 36 37 s32Ret = HI_MPI_VI_CreatePipe(ViPipe, &stPipeAttr); 38 //創建一個 VI PIPE。 39 } 40 41 SAMPLE_COMM_VI_StartViChn(pstViInfo); 42 { 43 SAMPLE_COMM_VI_GetChnAttrBySns(pstViInfo->stSnsInfo.enSnsType, &stChnAttr); 44 45 HI_MPI_VI_SetChnAttr(ViPipe, ViChn, &stChnAttr); 46 //設置 VI 通道屬性。 47 48 HI_MPI_VI_EnableChn(ViPipe, ViChn); 49 //啟用 VI 通道。 50 51 } 52 } 53 54 55 //此處有關ISP API介面函數的有關說明將在後面隨筆介紹 56 s32Ret = SAMPLE_COMM_VI_CreateIsp(pstViConfig); 57 { 58 SAMPLE_COMM_VI_StartIsp(pstViInfo); 59 { 60 SAMPLE_COMM_ISP_GetIspAttrBySns(pstViInfo->stSnsInfo.enSnsType, &stPubAttr); 61 62 SAMPLE_COMM_ISP_Sensor_Regiter_callback(ViPipe, u32SnsId); 63 64 SAMPLE_COMM_ISP_BindSns(ViPipe, u32SnsId, pstViInfo->stSnsInfo.enSnsType, -1); 65 66 SAMPLE_COMM_ISP_Aelib_Callback(ViPipe); 67 68 SAMPLE_COMM_ISP_Awblib_Callback(ViPipe); 69 70 HI_MPI_ISP_MemInit(ViPipe); 71 72 HI_MPI_ISP_SetPubAttr(ViPipe, &stPubAttr); 73 74 HI_MPI_ISP_Init(ViPipe); 75 76 SAMPLE_COMM_ISP_GetSnsObj(u32SnsId); 77 78 SAMPLE_COMM_ISP_Run(&pstViInfo->stPipeInfo.aPipe[i]); 79 80 } 81 }
整個的RFCN VI實現過程如上所示,函數具體含義也通過注釋進行了一一的說明,而在VI初始化過程中,用到了ISP(Image Signal Processing) 影像訊號處理的相關知識,海思也為其定義了API介面,隨後隨筆將介紹ISP相關概念,方便大家對VI整個過程進行了更為清晰的認識。
