三亩地 三亩地SAN MU DI · CODE DIARY
ARTICLE DETAIL

日记详情

真实记录编程学习的某一天,欢迎挑你感兴趣的翻一翻。

Linux_24:RV1126的VI模块讲解

Linux_24:RV1126的VI模块讲解

1.VI模块

本章节主要是介绍视觉项目的VI视频输入模块的讲解,VI视频模块是所有摄像头数据的入口。VI模块的配置在源文件rkmedia_module_function.cpp里面。

2.VI模块的思维导图

上面思维导图主要是描述VI模块设置的大致流程,首先对RV1126_VI_CONFIG结构体进行参数设置,然后调用rkmedia_vi_init对VI模块进行设置和使能,设置完成后再把VI的模块ID放到VI数组里面(vi_containers)。

3.VI模块代码的截图

下图就是整个VI模块配置的具体参数,这里使用设置的结构体是RV1126_VI_CONFIG。RV1126_VI_CONFIG里面主要包含了ID和VI_CHN_ATTR_S结构体设置。

这种分离设计主要有以下目的:

  1. 解耦:将"容器"和"实际的VI设备"分开管理,便于扩展和维护
  2. 灵活性:一个VI设备可能对应多个容器,或者一个容器可能管理多个VI设备
  3. 资源管理:通过容器来统一管理和访问VI资源

id:VI模块的id号,用于初始化和使能VI模块

pcVideoNode:摄像头的视频节点,这里默认是rkispp_scale0

u32BufCnt:缓冲区计数,默认是3

u32Width:VI模块分辨率宽度1920

u32Height:VI模块分辨率高度1080

enPixFmt:图像格式默认是NV12,这里填的是IMAGE_TYPE_NV12

enBufType:VI模块捕捉视频的类型,这里默认填写MMAP

enWorkMode:VI工作模式,这里写的是VI_WORK_MODE_NORMAL

填写完上述的配置参数后,就会调用rkmedia_vi_init这个自己封装的函数,这个函数主要是实现VI模块的初始化和使能的具体操作,具体看下图

rkmedia_vi_init这个自定义函数里面,关键是对VI进行初始化和使能,它分别调用了RK_MPI_VI_SetChnAttr的API对VI模块的属性进行初始化,然后再调用RK_MPI_VI_EnableChn对其使能。

设置完VI模块后,就要把VI模块的ID号设置到容器里面,调用自己封装的函数是set_vi_container

  • id:VI容器的标识符,用于区分不同的容器实例
  • vi_id:关联到前面初始化的VI设备ID(值就是之前设置的0)

set_vi_container的具体实现是:

在这个自定义的函数里面,最主要是把VI的ID号存放在VI模块数组里面(vi_containers),具体结构如下图:

RV1126_ALL_CONTAINER结构体里面包含了四个模块的数组存储分别是VI模块(vi_contaianers)、AI模块(ai_containers)、VENC模块(venc_containers)、AENC模块(aenc_containers)。这四个模块容器就是分别存储,四个模块的ID号,让其能够更加方便的管理起来。

← 返回列表