初始化VI视频输入模块

视频数据获取功能的完整接口调用流程请参见接口调用流程,本节仅描述该完整流程中的其中一步“初始化VI视频输入模块”。

总体说明

不同数据来源、不同数据格式、不同模式,初始化VI视频输入模块的流程不同:

从Sensor传入数据,通过VI通道处理,获取YUV图(线性模式)

  1. 依次调用hi_mpi_vi_set_dev_attrhi_mpi_vi_enable_dev接口,完成VI设备的属性配置并使能。
  2. 调用hi_mpi_vi_set_dev_bind_pipe接口,完成设备和PIPE的绑定关系设置。
  3. 依次调用hi_mpi_vi_create_pipehi_mpi_vi_start_pipe接口,创建并启动VI PIPE。需要合理设置hi_vi_pipe_attr.depth队列深度,队列深度越大,抗抖动性越好,建议设置为3或以上值。
  4. 依次调用hi_mpi_vi_set_chn_attrhi_mpi_vi_enable_chn接口,完成VI通道的属性配置并使能。需要合理设置hi_vi_chn_attr.depth队列深度,该队列深度除了要考虑VI内部处理预留内存外,还需结合用户自己的图像业务处理时长(从用户调用hi_mpi_vi_get_chn_frame接口取走图像资源,到用户调用hi_mpi_vi_release_chn_frame接口归还图像资源的时间间隔),合理设置队列深度大小。

从Sensor传入数据,通过VI通道处理,获取YUV图(WDR模式)

相对于普通线性模式,WDR模式下,Sensor模组会通过长短曝光方式同时产生两帧图像数据,VI需要创建两个PIPE资源,并将两个PIPE绑定到同一个VI设备上,分别接收和处理对应的长短曝光帧图像,然后在主PIPE对应的通道中,输出长短曝光融合后的图像数据。所以,接口调用流程存在如下差异:

  1. 需要调用hi_mpi_vi_set_dev_bind_pipe,将同一个Sensor设备的图像数据,绑定到两个Pipe上去,按示例图,将DEV0设备绑定到PIPE0和PIPE1上。
  2. 需要通过接口hi_mpi_vi_create_pipehi_mpi_vi_start_pipe创建并启动两个PIPE,按示例图,创建了PIPE0和PIPE1,其中PIPE0作为主PIPE,接收并处理短曝光帧,PIPE1作为从PIPE,接收并处理长曝光帧。

    WDR模式下,pipe0和pipe1为一组,pipe0为主pipe,pipe1和pipe2为一组,pipe1为主pipe。

  3. 只需启动主PIPE上的通道,从PIPE上的通道可不使能,节省资源。

从Sensor传入数据,通过VI PIPE获取RAW图像

  1. 调用hi_mpi_vi_set_dev_attrhi_mpi_vi_enable_dev接口,完成VI设备的属性配置并使能。
  2. 调用hi_mpi_vi_set_dev_bind_pipe接口,完成设备和Pipe的绑定关系设置。
  3. 调用接口hi_mpi_vi_create_pipe创建PIPE。
    1. 如果用户只需要获取RAW图,不需要图像经过VI处理和转换,则在hi_mpi_vi_create_pipe创建pipe时,可执行以下操作:
      1. 将pipe_bypass_mode设置为HI_VI_PIPE_BYPASS_BE,不经过ISP BE处理。
      2. 设置hi_vi_pipe_attr.depth大小为hi_vi_dump_attr.depth,除了dump所需图像队列外,不额外申请多余的图像资源。
      3. 不需要调用hi_mpi_vi_set_chn_attrhi_mpi_vi_enable_chn接口,不需要使能VI通道。
    2. 如果用户除了获取RAW图,还需要继续将图像送给VI处理和转换,则
      1. hi_mpi_vi_create_pipe创建pipe时,需要合理设置hi_vi_pipe_attr.depth的值,该值需要考虑在hi_vi_dump_attr.depth大小的基础上,额外预留部分VI PIPE内部处理所需队列深度,一般为hi_vi_dump_attr.depth + 3。
      2. 需要继续调用hi_mpi_vi_set_chn_attrhi_mpi_vi_enable_chn接口,使能VI通道,并调用接口hi_mpi_vi_get_chn_frame获取VI处理后的图像结果数据并处理,处理完成后调用hi_mpi_vi_release_chn_frame接口释放对应图像的内存资源。
  4. 要调用接口hi_mpi_vi_set_pipe_frame_dump_attr设置采图所需预留的图像队列深度。
  5. 调用hi_mpi_vi_start_pipe接口启动PIPE。

由用户指定RAW图数据,VI PIPE灌入并处理,获取YUV图

用户回灌图片场景,图片的数据来源不再是外部的摄像头设备,但因为当前版本还不支持虚拟pipe,只能通过物理pipe进行灌图,所以即使数据不从sensor输入,仍旧需要设置对应dev并调用hi_mpi_vi_set_dev_bind_pipe接口做dev和pipe的绑定。不需要初始化并使能VI设备,也不需要对VI设备和VI PIPE做绑定处理。

  1. 调用hi_mpi_vi_create_pipe接口创建PIPE。
  2. 调用hi_mpi_vi_set_pipe_frame_source接口将PIPE的图像数据来源设置为VI_PIPE_FRAME_SOURCE_USER。
  3. 调用hi_mpi_vi_start_pipe接口启动PIPE。
  4. 调用hi_mpi_vi_set_chn_attrhi_mpi_vi_enable_chn接口,完成VI通道的属性配置并使能。
  5. 开始循环发送用户指定的图片数据。
    1. 调用hi_mpi_vi_pipe_get_buffer获取空闲的图像数据,所能获取的最大可用内存数量由hi_mpi_vi_create_pipe接口下发的hi_vi_pipe_attr.depth属性决定。
    2. 成功获取到可用的内存资源后,将需要灌入的图像数据写入返回的内存地址中,内存地址为hi_mpi_vi_pipe_get_buffer接口返回的frame_info.v_frame.vir_addr[0],然后调用接口hi_mpi_vi_send_pipe_raw发送RAW图数据。
    3. hi_mpi_vi_send_pipe_raw发送数据成功后,需要及时调用hi_mpi_vi_pipe_release_buffer接口,释放内存资源。
    4. 图示为用户发送bayer格式图像的流程,如果用户需要发送YUV格式数据,则需要在调用hi_mpi_vi_create_pipe接口创建pipe时,指定像素格式pixel_format为YUV,并将isp_bypass设置为true,并将接口hi_mpi_vi_send_pipe_raw修改为hi_mpi_vi_send_pipe_yuv。当前版本支持发送的YUV图像格式为:HI_PIXEL_FORMAT_YVU_SEMIPLANAR_422、HI_PIXEL_FORMAT_YVU_SEMIPLANAR_420、HI_PIXEL_FORMAT_YUV_400。