前言:

海思多媒体处理平台(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  获取视频输入分辨率,输入摄像头个数等信息。
    实际操作的机构体是:

typedef struct _nvp6134_input_videofmt
{unsigned int inputvideofmt[16];unsigned int getvideofmt[16];unsigned int geteqstage[16];unsigned int getacpdata[16][8];
}nvp6134_input_videofmt;

查询摄像头插入路数及分辨率可以如下实现:

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路数据,设置如下:

        case SAMPLE_VI_MODE_6134_960H_720P_2MUX:{SAMPLE_PRT("SAMPLE_VI_MODE_6134_960H_720P_2MUX!!!\n");for(i=0;i<chip_cnt*4;i++){schnmode.ch = i;schnmode.vformat = video_mode;schnmode.chmode = NVP6134_VI_720P_2530;ioctl(fd, IOC_VDEC_SET_CHNMODE, &schnmode);}for(i=0;i<chip_cnt;i++){optmode.chipsel = i;optmode.portsel = 2;optmode.portmode = NVP6134_OUTMODE_2MUX_HD;optmode.chid = 0;ioctl(fd, IOC_VDEC_SET_OUTPORTMODE, &optmode);optmode.portsel = 1;optmode.portmode = NVP6134_OUTMODE_2MUX_HD;optmode.chid = 1;ioctl(fd, IOC_VDEC_SET_OUTPORTMODE, &optmode);}SAMPLE_PRT("[%s:%d] SET OK!!!\n", __func__, __LINE__);break;}    

结构体解析:

/**
*    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 通道绑定关系

设计是:

  1. 将通道0,1,分别绑定到dev0 的way0,和way1,
  2. 将通道2,3,分别绑定到dev1 的way0,和way1,

代码实现为:

    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)相关推荐

  1. 海思多媒体(MPP)开发(0)——序言与目录

    1.背景: 海思多媒体处理平台(MPP)分为:视频输入(VI),视频处理(VPSS),视频编码(VENC),视频解码(VDEC),视频输出(VO).视频侦测分析(VDA),音频输入(AI),音频输出( ...

  2. 海思多媒体(MPP)开发(9)——视频遮挡和运动检测

    前言: 海思多媒体处理平台(MPP)分为:视频输入(VI),视频处理(VPSS),视频编码(VENC),视频解码(VDEC),视频输出(VO).视频侦测分析(VDA),音频输入(AI),音频输出(AO ...

  3. 海思多媒体(MPP)开发(10)——通道绑定

    前言: 海思多媒体处理平台(MPP)分为:视频输入(VI),视频处理(VPSS),视频编码(VENC),视频解码(VDEC),视频输出(VO).视频侦测分析(VDA),音频输入(AI),音频输出(AO ...

  4. 海思多媒体(MPP)开发(1)——nvp6134驱动介绍

    简介: NVP6134C在Nextchip中的介绍是: quipped with Universal AHD™ Technology for the first time among the AHD™ ...

  5. 海思媒体处理平台VI视频输入模块

    海思媒体处理平台VI视频输入模块 [Hi3516A||Vi视频输入||海思媒体处理平台] 文章目录 海思媒体处理平台VI视频输入模块 VI模块的概念 VI模块的功能.作用.内部单元工作流程 硬件单元功 ...

  6. 海思3531DV200 --mpp学习

    海思MPP: 海思系列芯片网络摄像头开发主要就是使用海思提供的MPP(媒体处理软件平台Media Process Platform,简称 MPP),说简单点MPP就是一套封装好的系统,这套系统包含了已 ...

  7. 华为海思系列芯片开发学习中常见缩写详解

    1. 系统控制 Hi -- HiSilicon 海思半导体公司 MPP -- Media Process Platform 媒体处理平台 MPI -- MPP Programe Interface M ...

  8. 【HISI系列】海思媒体处理平台架构分析

    Date: 2019-3-9 前言     Hi35xx系列芯片作为高清/超高清安防监控主流芯片,现在已经广泛应用于安防监控产品中.本文重点分析: 海思媒体处理平台架构 系统架构 1.参考 Hi35X ...

  9. 全志Tina Linux MPP 开发指南

    全志Tina Linux MPP 开发指南支持百问网T113 D1-H哪吒DongshanPI-D1s V853-Pro等开发板 1 简述 整理 MPP sample 使用说明文档的目的是:使 MPP ...

最新文章

  1. Python Qt GUI设计:窗口布局管理方法【强化】(基础篇—6)
  2. Asp.net 2.0 中将网站首页生成静态页的一个比较好的方法
  3. 一种轻量级的C4C业务数据同步到S/4HANA的方式:Odata通知
  4. 【免费报名】挑战与机遇同在,大步迈进全真互联网时代
  5. 【链接】Linux C/C++ 学习路线-已拿腾讯、百度 offer
  6. 截取数组中的第i个元素,并返回截取后的结果
  7. 基于.NET Socket API 通信的综合应用
  8. 通俗的解释交叉熵与相对熵
  9. mongo 监听指定语句
  10. 51nod 1130 N的阶乘的长度 V2(斯特林近似)
  11. NSArray 和 NSMutableArray
  12. w10 计算机配置管理模板,win10老是配置更新,设置这个,让你无处可更...
  13. DirectX11 Tessellation曲面细分实现动态增加模型细节
  14. 零基础入门学习HTML(下)
  15. html5 css3制作柱形图,一步一步教你实现纯CSS的柱形图
  16. c语言输入一串字符统计各字母出现次数,统计输入字符各个字母出现频率的解题思路...
  17. 与麻花兄弟诉苦兼讨论欠缺的知识
  18. 定制xdoclet 标签
  19. JPA基础知识----JPA 基本注解,JPA API
  20. 2021-2027全球与中国成像色度计市场现状及未来发展趋势

热门文章

  1. Dubbo入门(一)——了解Dubbo
  2. 弃用 Lambda,Twitter 启用 Kafka 和数据流新架构
  3. 基于java的论坛管理系统设计(含源文件)
  4. Python,一正整数,如果是奇数,乘3加1,如果是偶数,除2,最终可以得到1
  5. 中国的软件开发工程师已近饱和了吗?
  6. mw325r设置虚拟服务器,水星mw325r路由器怎么设置?
  7. 把玩数据在内存中的存储
  8. IBM V7000存储配置
  9. 马斯克:特斯拉考虑在加拿大、墨西哥建厂
  10. 前端基础知识点汇总(持续更新...)