下面隨筆系列將對Hi3559AV100 RFCN實現細節進行解析,整個過程涉及到VI、VDEC、VPSS、VGS、VO、NNIE,其中涉及的內容,你們能夠參考以前我寫的博客:html
https://www.cnblogs.com/iFrank/p/14374658.htmlpost
基於Hi3559AV100的視頻採集(VDEC-VPSS-VO)總體框圖設計測試
https://www.cnblogs.com/iFrank/p/14370575.htmlspa
基於Hi3559AV100 RFCN實現細節解析-(1)VGS初介紹:線程
https://www.cnblogs.com/iFrank/p/14465306.html設計
基於Hi3559AV100的SVP(NNIE)開發總體流程 :code
https://www.cnblogs.com/iFrank/p/14377668.html視頻
首先給出總體的RFCN流程圖解,整個RFCN分爲3個step,具體以下所示:htm
在分析RFCN數據流以前,首先了解一下基於Hi3559AV100的NNIE模型,在搭建好SDK等環境後,配置好對應的硬件,在HiLinux上進行測試,具體以下:
1 ~ # ./sample_nnie_main 2 Usage : ./sample_nnie_main <index> 3 index: 4 0) RFCN(VI->VPSS->NNIE->VGS->VO). 5 1) Segnet(Read File). 6 2) FasterRcnnAlexnet(Read File). 7 3) FasterRcnnDoubleRoiPooling(Read File). 8 4) Cnn(Read File). 9 5) SSD(Read File). 10 6) Yolov1(Read File). 11 7) Yolov2(Read File). 12 8) Yolov3(Read File) 13 9) LSTM(Read File) 14 a) Pvanet(Read File).\n")
從中看能夠看到RFCN的整個過程VI->VPSS->NNIE->VGS->VO,VI模塊綁定了VPSS模塊,VI從攝像頭輸入一路視頻,經VPSS分解爲兩路,(具體見SAMPLE_SVP_NNIE_Rfcn中step 3-線程建立函數SAMPLE_SVP_NNIE_Rfcn_ViToVo),經過以下函數:
1 HI_MPI_VPSS_GetChnFrame( //用戶從通道獲取一幀處理完成的圖像。 2 3 s32VpssGrp, 4 5 as32VpssChn[1], 6 7 &stExtFrmInfo, 8 9 s32MilliSec); 10 HI_MPI_VPSS_GetChnFrame( //用戶從通道獲取一幀處理完成的圖像。 11 12 s32VpssGrp, 13 14 as32VpssChn[0], 15 16 &stBaseFrmInfo, 17 18 s32MilliSec);
(設置兩路VPSS通道如幀圖片大小等等參數見SAMPLE_COMM_IVE_StartVpss函數)
一路stBaseFrmInfo保持原來的1080P分辨率(這個須要看MIPI接口的相機型號來,如:見SAMPLE_COMM_IVE_StartViVpssVencVo函數:
case SONY_IMX277_SLVS_2M_240FPS_12BIT:
*penSize = PIC_1080P;
);
一路stExtFrmInfo轉爲PIC_CIF(352x288)分辨率(追溯到最初的賦值語句:在SAMPLE_SVP_NNIE_Rfcn函數中:PIC_SIZE_E enSize = PIC_CIF;
通過以下獲得VPSS通道對應的圖片大小:
1 SAMPLE_COMM_IVE_StartViVpssVencVo 2 3 aenSize[1] = *penExtPicSize; 4 5 SAMPLE_COMM_IVE_VbInit(aenSize,astSize,VPSS_CHN_NUM); 6 7 SAMPLE_COMM_SYS_GetPicSize(paenSize[i], &pastSize[i]) 8 9 SAMPLE_COMM_SYS_GetPicSize 10 11 { 12 13 switch (enPicSize) 14 15 { 16 17 case PIC_CIF: /* 352 * 288 */ 18 pstSize->u32Width = 352; 19 pstSize->u32Height = 288; break;...... 20 21 } 22 23 }
以後到SAMPLE_SVP_NNIE_Rfcn_Proc函數,具體以下:
1 s32Ret = SAMPLE_SVP_NNIE_Rfcn_Proc( 2 3 pstParam, 4 5 pstSwParam, 6 7 &stExtFrmInfo, 8 9 stBaseFrmInfo.stVFrame.u32Width, 10 11 stBaseFrmInfo.stVFrame.u32Height);
隨後進入加框函數:(即進入VGS視頻圖形子系統)
1 //Draw rect 2 3 s32Ret = SAMPLE_COMM_SVP_NNIE_FillRect( 4 5 &stBaseFrmInfo, //*pstFrmInfo 6 7 &(pstSwParam->stRect), // *pstRect 8 9 0x0000FF00); //u32color
用到了兩個VGS重要參數定義:
VGS_TASK_ATTR_S stVgsTask; //定義 VGS task 的屬性
VGS_ADD_COVER_S stVgsAddCover; //定義 VGS 上 COVER 的配置
下面爲定義圖像屬性和輸出圖像屬性:
1 memcpy( &stVgsTask.stImgIn, 2 pstFrmInfo, 3 sizeof(VIDEO_FRAME_INFO_S)); 4 5 memcpy( &stVgsTask.stImgOut, 6 pstFrmInfo, 7 sizeof(VIDEO_FRAME_INFO_S));
隨後定義 VGS 上 COVER 的配置,設置COVER參數,如顏色設置爲0x0000FF00(綠色,這個與以前Hi3519 RFCN運行一致,加綠色的框)
經過memcpy定義任意四邊形 COVER 四個座標點:
1 memcpy( stVgsAddCover.stQuadRangle.stPoint, 2 3 pstRect->astRect[i][j].astPoint, //(pstSwParam->stRect) 4 5 sizeof(pstRect->astRect[i][j].astPoint));
VGS 支持對一幅圖像進行遮擋操做,遮擋區域形狀能夠是矩形或者任意四邊形, 遮擋區域顏色爲純色,支持批量打 COVER。 而在Draw rect函數中,沒有對stBaseFrmInfo數據直接操做,目前認知VGS作COVER任務提交job時,直接將COVER數據送入至VO,隨後加上stBaseFrmInfo的數據:
1 //將視頻圖像送入指定輸出通道顯示。 2 3 s32Ret = HI_MPI_VO_SendFrame( 4 5 voLayer, 6 7 voChn, 8 9 &stBaseFrmInfo, 10 11 s32MilliSec);
總體的數據流處理流程以下: