海思多媒体(MPP)开发(2)——视频输入(VI)
前言:
? ? 海思多媒體處理平臺(MPP)分為:視頻輸入(VI),視頻處理(VPSS),視頻編碼(VENC),視頻解碼(VDEC),視頻輸出(VO)、視頻偵測分析(VDA),音頻輸入(AI),音頻輸出(AO),音頻編碼(AENC),音頻解碼(ADEC),區域管理(REGION)等模塊. 這里介紹視頻輸入模塊(VI)。?VI與AD密切相關,AD的輸出模式必須與海思的VI先對應,AD的輸出才能正確的傳輸到Hisi設備上,所以有必要的先了解自己使用的ADC的特性。另外VI的操作流程大致可以分為:
- 0.獲取默認參數
- 1.判斷ADC芯片的個數
- 2.通過IOC_VDEC_GET_INPUT_VIDEO_FMT 獲取當前已經插入的攝像頭的分辨率信息
- 3.計算緩存池的大小
- 4.初始化mpp系統
- 5.啟動ADC設備
- 6.啟動VI功能
- 7.設置VI通道綁定關系
- 8.建立VI與VPSS的綁定
說明:
開發板配置:
?? ?Hisi:Hi3521A
?? ?AD :NVP6134C 一個
?? ?攝像頭:720P,1080P
?? ?顯示:HDMI總線,1080P屏
(一)基本特性:
(1)NVP6134
Input Formats
?? ?- 4CH Video Input
?? ??? ?: CVBS / COMET
?? ??? ?: Universal 1M, 2M and 3/4/5M NRT
Output Formats
?? ??? ?- Output in BT.656/BT.1120 4:2:2 byte interleave format with37.125/74.25/148.5/297MHz
?? ??? ?- Support Sync Separate BT.601 Format (CLK/ H,V-SYNC/ 8’bitDATA)
?? ?Support 2*Video Output Port, Each Port Video Output FormatSelectable?? ?
?? ?
?? ?一個6134NVP芯片支持最大至此4路數據的輸入,兩個8位的輸出口,可以單獨選擇控制,也可以配合成一個16位的口。
(2)Hisi VI
? ? Hi3521A 芯片有 2 個 BT.1120 接口,每個 BT.1120 接口依次對應兩個 VI 設備,即第一?? ?個 BT.1120 口對應 VI 的 Dev0 和 Dev1,第二個 BT.1120 口對應 VI 的 Dev2 和 Dev3。4 個 VI 設備均支持 1/2/4 路 D1,960H 復合模式輸入(BT.656 協議),以及 2 路 720P復合模式。 4 個設備支持 1 路 720P/1080P 高清輸入(BT.1120 協議),此時,同一個BT1120 接口的另一個 Dev 不可用,即 DEV0,DEV1 中只能一個可用; DEV2,DEV3?? ?中只能用一個。
?? ?我這里使用的是BT.656模式,也就是4個dev都可以單獨使用,可以支持1/2/4 路 D1,960H 復合模式輸入(BT.656 協議),以及 2 路 720P復合模式。
(二)自適應輸入
? ? 自適應輸入也就是根據實際的攝像頭輸入路數和實際接入的攝像頭分辨率去申請內存池,去設置輸入模式等功能。
?? ?要實現自適應輸入,可以使用IOC_VDEC_GET_INPUT_VIDEO_FMT ?獲取視頻輸入分辨率,輸入攝像頭個數等信息。
?? ?實際操作的機構體是:
?? ?查詢攝像頭插入路數及分辨率可以如下實現:
int Check_NVP6134_VideoInputFMT(void) {int fd = -1;int i = 0;int l_s32Ret = 0;nvp6134_input_videofmt stInputFMT;bzero(&stInputFMT,sizeof(nvp6134_input_videofmt));fd = open(NVP6134_FILE, O_RDWR);if (fd < 0){printf("[%s:%d] open nvp6134 (%s) fail\n", __func__, __LINE__, NVP6134_FILE);return -1;}l_s32Ret = ioctl(fd, IOC_VDEC_GET_INPUT_VIDEO_FMT, &stInputFMT);if(l_s32Ret < 0){printf("[%s,%d][l_s32Ret:%d]\n",__FILE__,__LINE__,l_s32Ret);}close(fd);for(i=0;i<16;i++){printf("i=%d videofmt ? ? =0x%x \n",i,stInputFMT.getvideofmt[i]);printf("i=%d inputvideofmt=0x%x \n\n",i,stInputFMT.inputvideofmt[i]);}return 0; }???getvideofmt 與分辨率的對應關系可以查看NVP6134驅動中的函數
unsigned char nvp6134_vfmt_convert(unsigned char vdsts, unsigned char g_ck_fmt) /*nvp6134b視頻模式值轉換*/ unsigned char nvp6134_vfmt_convert(unsigned char vdsts, unsigned char g_ck_fmt) {unsigned int ret;switch(vdsts){case 0x00: ?ret = 0x01;?? ?break; ?//cvbs ntsccase 0x10: ?ret = 0x02; break;?? ?//cvbs palcase 0x20:?? ?ret = 0x04; break;?? ?//720p ntsccase 0x21: ?ret = 0x08; break;?? ?//720p palcase 0x22: ?ret = 0x51; break;?? ?//720P@RT ntsccase 0x23: ?ret = 0x52; break;?? ?//720P@RT palcase 0x30: ?ret = 0x40;?? ?break;?? ?//1080p ntsccase 0x31:?? ?ret = 0x80;?? ?break;?? ?//1080p pal....case 0x01:case 0x02:if((g_ck_fmt>>4) == 0x02)?? ?ret = 0x91;?? ?//AHD @ 3M RT-30Pelse ?? ??? ??? ??? ??? ??? ?ret = 0x92;?? ?//AHD @ 3M RT-25Pbreak;?? ?default:case 0xFF:?? ?ret = 0x00;?? ?break;?? ?//not detects}return ret; }比如執行上面函數得到:
/hi3520/app # ./nvp_6134_input_fmt_check?i=0 videofmt ? ? =0x0?i=0 inputvideofmt=0x0?i=1 videofmt ? ? =0x0?i=1 inputvideofmt=0x0?i=2 videofmt ? ? =0x0?i=2 inputvideofmt=0x0?i=3 videofmt ? ? =0x12?i=3 inputvideofmt=0x0....可以知道第四路輸入的是一個720P的攝像頭。然后可以去按照1路720P攝像頭輸入去初始化Hisi的MPP
(三)基本操作流程
0.獲取默認參數
? ? 這個不是必須的,只是作為沒有檢測到攝像頭時的一個默認參數使用。
1.判斷ADC芯片的個數
? ? 一個NVP6134最大只能支持4路攝像頭數據輸入,但是HI3521A最大可以支持16路攝像頭的輸入,因此可以同時使用多個ADC芯片作為還是得數據輸入。對海思設備,最大應該可以支持4個NVP6134的輸入。
2.獲取輸入攝像頭及分辨率
? ? 通過IOC_VDEC_GET_INPUT_VIDEO_FMT 獲取當前已經插入的攝像頭的分辨率信息,這個也就是上面(二)自適應輸入中介紹的內容
3.計算緩存池的大小
? ? 可以直接使用官方接口SAMPLE_COMM_SYS_CalcPicVbBlkSize 計算
4.初始化mpp系統
? ? 可以直接調用SAMPLE_COMM_SYS_Init接口初始化。
5.啟動ADC設備
? ? 這里需要注意:這里的ADC的設置必須與下面Hisi的VI設置相對應,否則數據不能正常傳輸。
?? ?我這里是設置NVP6134的兩個output port 2路復用,每個輸出口對應兩路數據,總共4路數據,設置如下:
結構體解析:
/** *?? ?Argurments?? ??? ?:? *?? ??? ??? ??? ??? ? ?portsel(port select->6134b[1,2],6134[0,1,2,3],6134C[1,2];) *?? ??? ??? ??? ??? ? ?portmode(port mode select[1mux,2mux,4mux]), *?? ??? ??? ??? ??? ? ?chid(channel id, 1mux[0,1,2,3], 2mux[0,1], 4mux[0]) **/ typedef struct _nvp6134_opt_mode {unsigned char chipsel;?unsigned char portsel;unsigned char portmode;unsigned char chid; }nvp6134_opt_mode;6.啟動VI功能
? ? 這里設計是使用dev0和dev1,兩路復用模式
? ? ? ? case SAMPLE_VI_MODE_8_720P:case SAMPLE_VI_MODE_16_720P:case SAMPLE_VI_MODE_8_1080P:case SAMPLE_VI_MODE_4_1080P:?case SAMPLE_VI_MODE_2_720P: ? ?memcpy(&stViDevAttr,&DEV_ATTR_6114_720P_2MUX_BASE,sizeof(stViDevAttr));SAMPLE_COMM_VI_SetMask(ViDev,&stViDevAttr);break;default:SAMPLE_PRT("vi input type[%d] is invalid!\n", enViMode);return HI_FAILURE;設備屬性如下:
VI_DEV_ATTR_S DEV_ATTR_6114_720P_2MUX_BASE = {/*接口模式*/VI_MODE_BT656,/*1、2、4路工作模式*/VI_WORK_MODE_2Multiplex,/* r_mask ? ?g_mask ? ?b_mask*/{0xFF000000, ? ?0x0},/* 雙沿輸入時必須設置 */VI_CLK_EDGE_SINGLE_UP,/*AdChnId*/{-1, -1, -1, -1},/*enDataSeq, 僅支持YUV格式*/VI_INPUT_DATA_YVYU,/*同步信息,對應reg手冊的如下配置, --bt1120時序無效*/{/*port_vsync ? port_vsync_neg ? ? port_hsync ? ? ? ?port_hsync_neg ? ? ? ?*/VI_VSYNC_FIELD, VI_VSYNC_NEG_HIGH, VI_HSYNC_VALID_SINGNAL,VI_HSYNC_NEG_HIGH,VI_VSYNC_VALID_SINGAL,VI_VSYNC_VALID_NEG_HIGH,/*timing信息,對應reg手冊的如下配置*//*hsync_hfb ? ?hsync_act ? ?hsync_hhb*/{0, ? ? ? ? ? ?0, ? ? ? ?0,/*vsync0_vhb vsync0_act vsync0_hhb*/0, ? ? ? ? ? ?0, ? ? ? ?0,/*vsync1_vhb vsync1_act vsync1_hhb*/0, ? ? ? ? ? ?0, ? ? ? ? ? ?0}},/*使用內部ISP*/VI_PATH_BYPASS,/*輸入數據類型*/VI_DATA_TYPE_YUV };7.設置 VI 通道綁定關系
設計是:
代碼實現為:
? ? for(i=0,ViChn=0; i<stViParam.s32ViDevCnt; i++){for(j=0;j<stViParam.s32ViChnCnt/2;j++,ViChn++){s32Ret = HI_MPI_VI_GetChnBind(ViChn, &stChnBindAttr);stChnBindAttr.ViDev=i;stChnBindAttr.ViWay = ViChn%2;if (HI_ERR_VI_FAILED_NOTBIND == s32Ret){s32Ret = HI_MPI_VI_BindChn(ViChn, &stChnBindAttr);if (HI_SUCCESS != s32Ret){SAMPLE_PRT("call HI_MPI_VI_BindChn failed with %#x\n", s32Ret);return HI_FAILURE;}?}?s32Ret = SAMPLE_COMM_VI_StartChn(ViChn, &stCapRect, &stTargetSize, enViMode, VI_CHN_SET_NORMAL);if (HI_SUCCESS != s32Ret){SAMPLE_PRT("call SAMPLE_COMM_VI_StarChn failed with %#x\n", s32Ret);return HI_FAILURE;}?}}8.開啟VPSS并將VI綁定到VPSS中
? ? /******************************************step 4: start vpss and vi bind vpss******************************************/s32Ret = SAMPLE_COMM_SYS_GetPicSize(enNorm, PIC_HD720, &stSize);if (HI_SUCCESS != s32Ret){SAMPLE_PRT("SAMPLE_COMM_SYS_GetPicSize failed!\n");goto END_4_720P_1;}memset(&stGrpAttr,0,sizeof(VPSS_GRP_ATTR_S));stGrpAttr.u32MaxW = stSize.u32Width;stGrpAttr.u32MaxH = stSize.u32Height;stGrpAttr.bNrEn = HI_TRUE;stGrpAttr.enDieMode = VPSS_DIE_MODE_NODIE;stGrpAttr.enPixFmt = SAMPLE_PIXEL_FORMAT;s32Ret = SAMPLE_COMM_VPSS_Start(s32VpssGrpCnt, &stSize, VPSS_MAX_CHN_NUM, &stGrpAttr);if (HI_SUCCESS != s32Ret){SAMPLE_PRT("Start Vpss failed!\n");goto END_4_720P_1;}s32Ret = SAMPLE_COMM_VI_BindVpss(enViMode);if (HI_SUCCESS != s32Ret){SAMPLE_PRT("Vi bind Vpss failed!\n");goto END_4_720P_2;}執行結果:
正確初始化和綁定之后,屬性如下:
/hi3520/app # cat /proc/umap/vi?[VIU] Version: [Hi3521A_MPP_V1.0.3.1 B010 Release], Build Time: [Apr 18 2016, 12:08:26]-----MODULE PARAM-------------------------------------------------------------- detect_err_frame drop_err_frame stop_int_level ?max_cas_gap10 ? ? ? ? ? ? ?0 ? ? ? ? ? ? ?0 ? ? ? ?28000-----VI DEV ATTR---------------------------------------------------------------Dev ? IntfM ?WkM ?ComMsk0 ?ComMsk1 ? ?CLKM AD0 AD1 AD2 AD3 ? Seq ? DPath DType DRev0 ? BT656 2Mux ? ? ? ff ? ? ? ?0 ? ? ?UP ?-1 ?-1 ?-1 ?-1 ?UYVY ?ByPass ? YUV ? ?N1 ? BT656 2Mux ? ? ff00 ? ? ? ?0 ? ? ?UP ?-1 ?-1 ?-1 ?-1 ?UYVY ?ByPass ? YUV ? ?N-----VI HIGH DEV ATTR---------------------------------------------------------------Dev ?InputM ?WkM ?ComMsk0 ?ComMsk1 AD0 AD1 AD2 AD3 ? Seq CombM CompM ClkM ?Fix FldP ? DPath DType DRev-----VI PHYCHN ATTR------------------------------------------------------------PhyChn CapX CapY ?CapW ?CapH ?DstW ?DstH CapSel ScanM ? SkipM Mirror Flip IntEn PixFom SrcRat DstRat0 ? ?0 ? ?0 ?1280 ? 720 ?1280 ? 720 ? both ? ? P SKIPNON ? ? ?N ? ?N ? ?Y ? sp420 ? ? -1 ? ? -11 ? ?0 ? ?0 ?1280 ? 720 ?1280 ? 720 ? both ? ? P SKIPNON ? ? ?N ? ?N ? ?Y ? sp420 ? ? -1 ? ? -12 ? ?0 ? ?0 ?1280 ? 720 ?1280 ? 720 ? both ? ? P SKIPNON ? ? ?N ? ?N ? ?Y ? sp420 ? ? -1 ? ? -13 ? ?0 ? ?0 ?1280 ? 720 ?1280 ? 720 ? both ? ? P SKIPNON ? ? ?N ? ?N ? ?Y ? sp420 ? ? -1 ? ? -1-----VI PHYCHN MINOR ATTR------------------------------------------------------------PhyChn CapX CapY ?CapW ?CapH ?DstW ?DstH CapSel ScanM Mirror ? Flip ?PixFom ?MixCap DwScal SrcRat DstRat-----VI PHYCHN STATUS 1----------------------------------------------------------PhyChn BindDev ?Way ? ? ?IntCnt ?VbFail ?LosInt ?TopLos ?BotLos BufCnt ?IntT ?SendT ?Field ?Stride0 ? ? 0 ? ? 0 ? ? ? ? 353 ? ? ? 0 ? ? ? 3 ? ? ? 0 ? ? ? 2 ? ? ?2 ? ?58 ? ? 24 ? ?frm ? ?12801 ? ? 0 ? ? 1 ? ? ? ? 352 ? ? ? 0 ? ? ? 3 ? ? ? 0 ? ? ? 2 ? ? ?2 ? ?27 ? ? 11 ? ?frm ? ?12802 ? ? 1 ? ? 0 ? ? ? ? 352 ? ? ? 0 ? ? ? 3 ? ? ? 0 ? ? ? 2 ? ? ?2 ? ?34 ? ? 13 ? ?frm ? ?12803 ? ? 1 ? ? 1 ? ? ? ? 352 ? ? ? 0 ? ? ? 3 ? ? ? 0 ? ? ? 2 ? ? ?2 ? ?26 ? ? 11 ? ?frm ? ?1280-----VI PHYCHN STATUS 2---------------------------------------------------------PhyChn MaxIntT IntGapT MaxGapT OverCnt LIntCnt ?ThrCnt AutoDis CasAutD ?TmgErr ? ? ?ccErrN ? ?IntRat0 ? ? ?58 ? 40009 ? 40021 ? ? ? 0 ? ? ? 0 ? ? ? 1 ? ? ? 0 ? ? ? 0 ? ? ? 0 ? ? ? ? ? 3 ? ? ? ?241 ? ? ?47 ? 40001 ? 40010 ? ? ? 0 ? ? ? 0 ? ? ? 1 ? ? ? 0 ? ? ? 0 ? ? ? 0 ? ? ? ? ? 3 ? ? ? ?252 ? ? ?52 ? 40026 ? 40026 ? ? ? 0 ? ? ? 0 ? ? ? 1 ? ? ? 0 ? ? ? 0 ? ? ? 0 ? ? ? ? ? 3 ? ? ? ?243 ? ? ?55 ? 40004 ? 40086 ? ? ? 0 ? ? ? 0 ? ? ? 1 ? ? ? 0 ? ? ? 0 ? ? ? 0 ? ? ? ? ? 3 ? ? ? ?24-----VI CHN STATUS-------------------------------------------------------------ViChn ? bEnUsrP ? FrmTime ? FrmRate ? ? SendCnt ? ? ?SwLost ? ? Depth0 ? ? ? ? N ? ? 40010 ? ? ? ?25 ? ? ? ? 350 ? ? ? ? ? 0 ? ? ? ? 01 ? ? ? ? N ? ? 40000 ? ? ? ?25 ? ? ? ? 349 ? ? ? ? ? 0 ? ? ? ? 02 ? ? ? ? N ? ? 40025 ? ? ? ?25 ? ? ? ? 349 ? ? ? ? ? 0 ? ? ? ? 03 ? ? ? ? N ? ? 40004 ? ? ? ?25 ? ? ? ? 349 ? ? ? ? ? 0 ? ? ? ? 0-----VI CHN CALL VGS STATUS 1-------------------------------------------------ViChn ? UsrBgnNOk ? UsrCancel ? ?UsrEndOk ? ? UsrCbOk ? ? CvrBgnNOk ? CvrCancel ? ?CvrEndOk ? ? CvrCbOk-----VI CHN CALL VGS STATUS 2-------------------------------------------------ViChn ? OsdBgnNOk ? OsdCancel ? ?OsdEndOk ? ? OsdCbOk ? ? ?ScaleNOk ? SclCancel ? ?SclEndOk ? ? SclCbOk /hi3520/app #?設置4路輸出,接入一個攝像頭的效果如下:
顯示屏有點臟,將就看下吧,哈哈~
? ?
本章頻測工程可以從「目錄與序言」提供的地址去獲取
本專欄第一篇文章「目錄與序言」列出了專欄的完整目錄,按目錄順序閱讀,有助于你的理解。
?
----------------------------------------------------------------2022.08.28----------------------------------------------------------------
新的文章內容和附件工程文件
已更新在博客首頁和:
|工|·-·|重|·-·|浩|:liwen01
感恩您的關注,謝謝~
總結
以上是生活随笔為你收集整理的海思多媒体(MPP)开发(2)——视频输入(VI)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 多点触控图片缩放linux,【Andro
- 下一篇: Flowable入门系列文章152 -