RKMEDIA--VP使用

news2024/12/25 23:56:27

本章描述rkmedia vp模块 即视频一入四处功能的介绍。

使用场景:主要用在DVR/DMS产品上,需要多路视频节点的输入和获取。

可以rv1126/rv1109可以外接模拟高清RX芯片(NVP6188,TP2815等),达到8路camera输入的能力。

在rga部分也有提及过,rv1126/rv1109只有一个硬件rga,所以工作能力有限,在dvr这种产品中需要多路视频的缩放,使用rga的话就无法达到需求。vp就可以解决视频分辨率缩放的功能,缓解rga的压力。

vp实际上就是使用RK平台上ispp模块,实现一个视频数据从rkispp_input_image节点对应的video节点输入,四个视频数据从rkispp_m_bypassrkispp_scale0rkispp_scale1rkispp_scale2节点对应video输出。。这样四个输出的节点中rkispp_scale0、rkispp_scale1、rkispp_scale2是具有缩放能力的。

使用方式:

因为我是使用的evb板,默认ispp0已经打开,也在使用。所以我用ispp1来做讲解。在实际使用时,你们的ispp可能都没有使用,所以可以从ispp0开始使用。

1、在dts文件中打开ispp1

 * 1. add code to kernel dts:
 &rkispp_vir1 {
     status = "okay";
 };

在dts里面打开ispp1后,重新编译kernel,烧录到开发板。启动后会在/dev/ 生成新的media节点

2、检查新的media节点所对应的video号,使用media-ctl -p -d 查看


[root@RV1126_RV1109:/userdata]# ls /dev/media
media0  media1  media2  media3
[root@RV1126_RV1109:/userdata]# media-ctl -p -d /dev/media3
Media controller API version 4.19.111

Media device information
------------------------
driver          rkispp
model           rkispp1
serial
bus info
hw revision     0x0
driver version  4.19.111

Device topology
- entity 1: rkispp_input_image (1 pad, 1 link)
            type Node subtype V4L flags 0
            device node name /dev/video25
        pad0: Source
                -> "rkispp-subdev":0 [ENABLED]

- entity 5: rkispp_m_bypass (1 pad, 1 link)
            type Node subtype V4L flags 0
            device node name /dev/video26
        pad0: Sink
                <- "rkispp-subdev":2 [ENABLED]

- entity 9: rkispp_scale0 (1 pad, 1 link)
            type Node subtype V4L flags 0
            device node name /dev/video27
        pad0: Sink
                <- "rkispp-subdev":2 [ENABLED]

- entity 13: rkispp_scale1 (1 pad, 1 link)
             type Node subtype V4L flags 0
             device node name /dev/video28
        pad0: Sink
                <- "rkispp-subdev":2 [ENABLED]

- entity 17: rkispp_scale2 (1 pad, 1 link)
             type Node subtype V4L flags 0
             device node name /dev/video29
        pad0: Sink
                <- "rkispp-subdev":2 [ENABLED]

- entity 21: rkispp_iqtool (1 pad, 1 link)
             type Node subtype V4L flags 0
             device node name /dev/video30
        pad0: Sink
                <- "rkispp-subdev":2 [ENABLED]

- entity 25: rkispp_input_params (1 pad, 1 link)
             type Node subtype V4L flags 0
             device node name /dev/video31
        pad0: Source
                -> "rkispp-subdev":1 [ENABLED]

- entity 29: rkispp-stats (1 pad, 1 link)
             type Node subtype V4L flags 0
             device node name /dev/video32
        pad0: Sink
                <- "rkispp-subdev":3 [ENABLED]

- entity 33: rkispp-subdev (4 pads, 8 links)
             type V4L2 subdev subtype Unknown flags 0
             device node name /dev/v4l-subdev1
        pad0: Sink
                [fmt:unknown/0x0
                 crop.bounds:(0,0)/0x0
                 crop:(0,0)/0x0
                 compose.bounds:(0,0)/0x0
                 compose:(0,0)/0x0]
                <- "rkispp_input_image":0 [ENABLED]
        pad1: Sink
                <- "rkispp_input_params":0 [ENABLED]
        pad2: Source
                [fmt:unknown/0x0]
                -> "rkispp_m_bypass":0 [ENABLED]
                -> "rkispp_scale0":0 [ENABLED]
                -> "rkispp_scale1":0 [ENABLED]
                -> "rkispp_scale2":0 [ENABLED]
                -> "rkispp_iqtool":0 [ENABLED]
        pad3: Source
                -> "rkispp-stats":0 [ENABLED]

[root@RV1126_RV1109:/userdata]#

如上所示,在打开ispp1的时候,会多出一个media3。使用命令查看media3的拓扑结构。

rkispp_input_imagevideo25
rkispp_m_bypassvideo26
rkispp_scale0video27
rkispp_scale1video28
rkispp_scale2video29

3、配置media节点

media-ctl -d /dev/media3 -l '"rkispp_input_image":0->"rkispp-subdev":0[1]'
media-ctl -d /dev/media3 --set-v4l2 '"rkispp-subdev":0[fmt:YUYV8_2X8/1920x1080]'
media-ctl -d /dev/media3 --set-v4l2 '"rkispp-subdev":2[fmt:YUYV8_2X8/1920x1080]'

以上是命令行执行的,在rkmedia_vi_vp_vo_test中是在代码中调用:

  char cmd[256];
  snprintf(
      cmd, sizeof(cmd),
      "media-ctl -d %s -l '\"rkispp_input_image\":0->\"rkispp-subdev\":0[1]'",
      media);
  system(cmd);
  snprintf(cmd, sizeof(cmd),
           "media-ctl -d %s --set-v4l2 "
           "'\"rkispp-subdev\":0[fmt:YUYV8_2X8/1920x1080]'",
           media);
  system(cmd);
  snprintf(cmd, sizeof(cmd),
           "media-ctl -d %s --set-v4l2 "
           "'\"rkispp-subdev\":2[fmt:YUYV8_2X8/1920x1080]'",
           media);
  system(cmd);

4、配置rkmedia vi 节点初始化。(输出的四个节点初始化要在vp之前)

int video_width = 1920;
int video_height = 1080;
int video1_width = 1920;
int video1_height = 1080;
int video2_width = 640;
int video2_height = 360;

// 先配置原始输入节点,就是用nvp6188在开发板上生成的节点
vi_chn_attr.pcVideoNode = "/dev/video0";
vi_chn_attr.u32BufCnt = 3;
vi_chn_attr.u32Width = video_width;
vi_chn_attr.u32Height = video_height;
vi_chn_attr.enPixFmt = IMAGE_TYPE_NV12;
vi_chn_attr.enWorkMode = VI_WORK_MODE_NORMAL;

//video0节点不支持dma申请内存,所以要配置成mmap
vi_chn_attr.enBufType = VI_CHN_BUF_TYPE_MMAP;   
ret = RK_MPI_VI_SetChnAttr(s32CamId, 0, &vi_chn_attr);
ret |= RK_MPI_VI_EnableChn(s32CamId, 0);
if (ret) {
    printf("Create vi[0] failed! ret=%d\n", ret);
    return -1;
}

//配置media3 中的rkispp_m_bypass节点video26,rkispp_scale0 video27
//我这里就先用两个输出,如需多个,就再继续初始化即可
memset(&vi_chn_attr, 0, sizeof(vi_chn_attr));
vi_chn_attr.pcVideoNode = "/dev/video26";
vi_chn_attr.u32BufCnt = 3;
vi_chn_attr.u32Width = video1_width;
vi_chn_attr.u32Height = video1_height;
vi_chn_attr.enPixFmt = IMAGE_TYPE_NV12;
vi_chn_attr.enWorkMode = VI_WORK_MODE_NORMAL;
ret = RK_MPI_VI_SetChnAttr(2, 2, &vi_chn_attr);
ret |= RK_MPI_VI_EnableChn(2, 2);
if (ret) {
    printf("Create vi[2] failed! ret=%d\n", ret);
    return -1;
}


memset(&vi_chn_attr, 0, sizeof(vi_chn_attr));
vi_chn_attr.pcVideoNode = "/dev/video27";
vi_chn_attr.u32BufCnt = 3;
vi_chn_attr.u32Width = video2_width;
vi_chn_attr.u32Height = video2_height;
vi_chn_attr.enPixFmt = IMAGE_TYPE_NV12;
vi_chn_attr.enWorkMode = VI_WORK_MODE_NORMAL;
ret = RK_MPI_VI_SetChnAttr(3, 3, &vi_chn_attr);
ret |= RK_MPI_VI_EnableChn(3, 3);
if (ret) {
    printf("Create vi[3] failed! ret=%d\n", ret);
    return -1;
}


//接着初始化vp,实际上就是初始化media中rkispp_input_image 节点video25
VP_CHN_ATTR_S vp_chn_attr;
vp_chn_attr.pcVideoNode = "/dev/video25";
vp_chn_attr.u32BufCnt = 3;
vp_chn_attr.u32Width = video_width;
vp_chn_attr.u32Height = video_height;
vp_chn_attr.enPixFmt = IMAGE_TYPE_NV12;
vp_chn_attr.enWorkMode = VP_WORK_MODE_NORMAL;
ret = RK_MPI_VP_SetChnAttr(0, 0, &vp_chn_attr);
ret |= RK_MPI_VP_EnableChn(0, 0);
if (ret) {
    printf("Create vp[0] failed! ret=%d\n", ret);
    return -1;
}

//最后就是将video0 绑定到video25, 这样video26、video27就可以像正常的video节点取流、绑定后级
MPP_CHN_S stSrcChn = {0};
MPP_CHN_S stDestChn = {0};

printf("#Bind VI[0] to VP[0]....\n");
stSrcChn.enModId = RK_ID_VI;
stSrcChn.s32ChnId = 0;
stDestChn.enModId = RK_ID_VP;
stDestChn.s32ChnId = 0;
ret = RK_MPI_SYS_Bind(&stSrcChn, &stDestChn);
if (ret) {
    printf("Bind vi[0] to vp[0] failed! ret=%d\n", ret);
    return -1;
}

注意点:

1、video0不支持dma申请内存

2、rkispp_m_bypass节点不支持缩放。四个节点的缩放能力可以去看我前面介绍VI模块的章节。

        RKMEDIA--VI的使用_未_定的博客-CSDN博客

3、vp要放在最后初始化

以上就是一路vp的使用方式。在使用8路vp的时候基本上就是照葫芦画瓢,但是也需要改一些地方,需要修改的地方放在下面。

主要修改的是

1、dts加上其余的ispp和配置

2、设置ispp虚拟节点的数量

3、修改v4l2节点的数量

diff --git a/arch/arm/boot/dts/rv1109-evb-ddr3-v13-facial-gate.dts b/arch/arm/boot/dts/rv1109-evb-ddr3-v13-facial-gate.dts
index 982da51..97d91931 100644
--- a/arch/arm/boot/dts/rv1109-evb-ddr3-v13-facial-gate.dts
+++ b/arch/arm/boot/dts/rv1109-evb-ddr3-v13-facial-gate.dts
@@ -30,6 +30,26 @@
+&rkispp_vir2 {
+	status = "okay";
+};
 
+&rkispp_vir3 {
+	status = "okay";
+};
+
+&rkispp_vir4 {
+	status = "okay";
+};
+
+&rkispp_vir5 {
+	status = "okay";
+};
+
+&rkispp_vir6 {
+	status = "okay";
+};
+
+&rkispp_vir7 {
+	status = "okay";
+};
+
 &isp_reserved {
 	size = <0x8000000>;
 };
diff --git a/arch/arm/boot/dts/rv1126.dtsi b/arch/arm/boot/dts/rv1126.dtsi
index 194f2d1..c40fc92 100644
--- a/arch/arm/boot/dts/rv1126.dtsi
+++ b/arch/arm/boot/dts/rv1126.dtsi
@@ -2115,6 +2115,36 @@
+	rkispp_vir2: rkispp-vir2 {
+		compatible = "rockchip,rv1126-rkispp-vir";
+		rockchip,hw = <&rkispp>;
+		status = "disabled";
+	};
 
+	rkispp_vir3: rkispp-vir3 {
+		compatible = "rockchip,rv1126-rkispp-vir";
+		rockchip,hw = <&rkispp>;
+		status = "disabled";
+	};
+
+	rkispp_vir4: rkispp-vir4 {
+		compatible = "rockchip,rv1126-rkispp-vir";
+		rockchip,hw = <&rkispp>;
+		status = "disabled";
+	};
+
+	rkispp_vir5: rkispp-vir5 {
+		compatible = "rockchip,rv1126-rkispp-vir";
+		rockchip,hw = <&rkispp>;
+		status = "disabled";
+	};
+
+	rkispp_vir6: rkispp-vir6 {
+		compatible = "rockchip,rv1126-rkispp-vir";
+		rockchip,hw = <&rkispp>;
+		status = "disabled";
+	};
+
+	rkispp_vir7: rkispp-vir7 {
+		compatible = "rockchip,rv1126-rkispp-vir";
+		rockchip,hw = <&rkispp>;
+		status = "disabled";
+	};
+
 	rkvdec: rkvdec@ffb80000 {
 		compatible = "rockchip,rkv-decoder-v1";
 		reg = <0xffb80000 0x400>;
diff --git a/drivers/media/platform/rockchip/isp/isp_ispp.h b/drivers/media/platform/rockchip/isp/isp_ispp.h
index 71878ca..beae6c6 100644
--- a/drivers/media/platform/rockchip/isp/isp_ispp.h
+++ b/drivers/media/platform/rockchip/isp/isp_ispp.h
@@ -34,6 +34,10 @@ enum rkisp_ispp_dev {
 	DEV_ID1,
 	DEV_ID2,
 	DEV_ID3,
+	DEV_ID4,
+	DEV_ID5,
+	DEV_ID6,
+	DEV_ID7,
 	DEV_MAX,
 };
 
 
 
 
 
 diff --git a/lib/libv4l2/libv4l2-priv.h b/lib/libv4l2/libv4l2-priv.h
index cce6de4..83dc659 100644
--- a/lib/libv4l2/libv4l2-priv.h
+++ b/lib/libv4l2/libv4l2-priv.h
@@ -25,7 +25,7 @@
 
 #include "../libv4lconvert/libv4lsyscall-priv.h"
 
-#define V4L2_MAX_DEVICES 16
+#define V4L2_MAX_DEVICES 32
 /* Warning when making this larger the frame_queued and frame_mapped members of
    the v4l2_dev_info struct can no longer be a bitfield, so the code needs to
    be adjusted! */
diff --git a/lib/libv4l2/libv4l2.c b/lib/libv4l2/libv4l2.c
index f949b5d..ab0cffc 100644
--- a/lib/libv4l2/libv4l2.c
+++ b/lib/libv4l2/libv4l2.c
@@ -96,7 +96,11 @@ static struct v4l2_dev_info devices[V4L2_MAX_DEVICES] = {
 	{ .fd = -1 },
 	{ .fd = -1 }, { .fd = -1 }, { .fd = -1 }, { .fd = -1 }, { .fd = -1 },
 	{ .fd = -1 }, { .fd = -1 }, { .fd = -1 }, { .fd = -1 }, { .fd = -1 },
-	{ .fd = -1 }, { .fd = -1 }, { .fd = -1 }, { .fd = -1 }, { .fd = -1 }
+	{ .fd = -1 }, { .fd = -1 }, { .fd = -1 }, { .fd = -1 }, { .fd = -1 },
+	{ .fd = -1 }, { .fd = -1 }, { .fd = -1 }, { .fd = -1 }, { .fd = -1 },
+	{ .fd = -1 }, { .fd = -1 }, { .fd = -1 }, { .fd = -1 }, { .fd = -1 },
+	{ .fd = -1 }, { .fd = -1 }, { .fd = -1 }, { .fd = -1 }, { .fd = -1 },
+	{ .fd = -1 }
 };
 static int devices_used;

以上就是vp的介绍,如有问题可在评论区探讨。

 文章汇总:RKMEDIA使用简介_未_定的博客-CSDN博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/71703.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

PLSQL导出、导入数据 和 同步数据 以及 navicat 里同步数据 以及解决plsql导出数据乱码问题

PLSQL导出、导入数据 和 同步数据 以及 navicat 里同步数据 以及解决plsql导出数据乱码问题1. 导出数据1.1 导出.pde文件1.2 导出sql文件1.2.1 导出sql压缩文件1.2.1 导出问题——乱码 与 解决乱码问题1. 尝试解决方式12. 尝试解决方式23. 直接换PLSQ版本&#xff08;最终解决问…

Traysoft AddTapi.NET 支持多条线路

Traysoft AddTapi.NET 支持多条线路 使用Traysoft AddTapi。您可以轻松地将手机功能添加到C#、VB.NET和C应用程序中。添加Tapi。NET将为您提供开发移动应用程序所需的一切。包括&#xff1a;电话呼叫、接收者ID、语音邮件、警告系统、电话呼叫跟踪和监控。添加Tapi。NET继续联系…

微服务框架 SpringCloud微服务架构 25 黑马旅游案例 25.3 我附近的酒店

微服务框架 【SpringCloudRabbitMQDockerRedis搜索分布式&#xff0c;系统详解springcloud微服务技术栈课程|黑马程序员Java微服务】 SpringCloud微服务架构 文章目录微服务框架SpringCloud微服务架构25 黑马旅游案例25.3 我附近的酒店25.3.1 直接开干25 黑马旅游案例 25.3 …

计算机组成大题分析(四)

假设计算机 M 的主存地址为 24 位,按字节编址,采用分页存储管理方式,虚拟地址为 30 位,页大小为 4KB,TLB 采用 2 路组相联方式 和LRU 替换策略,一共8组。请回答一下问题。 (1) 虚拟地址中有哪几位表示虚页号? 哪几位表示内存地址? (2)己知访问 TLB 时虚页号高位部分用作 TLB…

留学Assignment写作语法错误怎么改正?

如何避免Assignment写作中的一些语法错误&#xff0c;在留学生提交论文要求进行润色修改时&#xff0c;经常会碰到一些语法上的错误&#xff0c;这都是英语水平的问题&#xff0c;同时也与自身的习惯相关&#xff0c;下面小编说一下Assignment写作的语法错误的几种情况&#xf…

浙江省AAA级“守合同重信用”公示企业

浙江省“守合同重信用”企业公示&#xff0c;是市场监管部门依企业自愿申请&#xff0c;对符合公示条件企业前两个年度内的合同履约信息向社会公示的行政指导行为。 浙江省“守合同重信用”企业公示实行逐级推荐、分级公示、动态管理制度。企业住所地县级市场监管局受理企业公示…

你还在使用swagger?试试这个吧

文章目录easyyapi插件使用1. 安装插件2. 配置插件3. 编写javadoc4. 上传接口javadoc5. 登录YApi,查看项目接口easyyapi插件使用 1. 安装插件 打开idea的Settings–>Plugins,查找easyyapi插件安装。 2. 配置插件 安装成功后&#xff0c;再次打开Settings–>OtherSett…

公司小程序小程序毕业设计,企业小程序系统设计与实现,微信小程序毕业设计论文怎么写毕设源码开题报告需求分析怎么做

项目背景和意义 目的&#xff1a;本课题主要目标是设计并能够实现一个基于微信小程序公司企业站系统&#xff0c;前台用户使用小程序&#xff0c;后台管理使用基PHP开发&#xff0c;存储使用Mysql数据库&#xff1b;通过后台添加公司信息、资讯、产品等&#xff0c;用户通过小程…

vue+element+electron仿微信实现

一.仿得太像了有木有~ 1.登录窗口 2.主窗口 二.构思&#xff0c;以微信设计布局构思 以微信布局构思&#xff0c;参考element提供的组件&#xff1b;element提供的tabs标签页刚好能实现切换效果&#xff0c;element tabs 标签页&#xff1b;element tabs标签页虽然能达到切换…

如果把网络原理倒过来看,从无到有,一切如此清晰

从物理层到数据链路层 也从上篇我们创造一个计算机网络&#xff0c;你会去怎么设计&#xff1f;&#xff0c;追溯到计算机网络互联的本质就是通信问题&#xff0c;所以从物理层解决使用何种信号来传输比特的问题。 再从物理设备中的集线器&#xff0c;聊到二层的交换机&#…

零基础CSS入门教程(9)——背景颜色和背景图片

本章目录1.任务目标2.背景颜色3.背景图片4.小结1.任务目标 我们前几小节学习了如何设置字体格式&#xff0c;我们这一小节学习一下如何设置背景颜色和图片 2.背景颜色 我们可以通过background-color给标签设置背景颜色&#xff0c;例如&#xff1a; <!DOCTYPE html> …

【世界杯限定】致敬梅西,用Python刻画足球场上的战神

最近卡塔尔世界杯正在火热的进行着&#xff0c;相信球迷们一定不会错过每一场精彩的比赛吧&#xff0c;在看球的同时&#xff0c;小伙伴们不要忘记自己的学习与工作哦&#xff0c;本人纯属路人&#xff0c;虽然不是很懂球&#xff0c;但是很喜欢梅西&#xff0c;所以我开始关注…

云边协同下的统一应用管理: 基于 OpenYurt 和 KubeVela 的解决方案

作者&#xff1a;乔中沛&#xff08;伊灵&#xff09; 背景 随着万物互联场景的逐渐普及&#xff0c;边缘设备的算力也不断增强&#xff0c;如何借助云计算的优势满足复杂多样化的边缘应用场景&#xff0c;让云原生技术延伸到端和边缘成为了新的技术挑战&#xff0c;“云边协…

RNA-seq 详细教程:样本质控(6)

学习目标 了解计数数据变换方法的重要性了解 PCA (principal component analysis)了解如何使用 PCA 和层次聚类评估样本质量1. 质控 DESeq2 工作流程的下一步是 QC&#xff0c;其中包括样本和基因程度上&#xff0c;以对计数数据执行 QC 检查&#xff0c;以帮助我们确保样本或重…

[附源码]Python计算机毕业设计Django右脑开发教育课程管理系统

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;我…

iOS现有APP上架流程​

一. 登录App Store Connect​ 1.登录App Store Connect(apple.com)账号密码登录​ 2.点击“我的App”-->”选中升级的APP”-->创建新的APP版本号​ 输入版本的升级内容--》然后点击右上角的“存储”按钮&#xff0c;保存本次修改。​ 上传更新App Store安装包​ Xcode-…

【Rust日报】2022-12-07 测量 Rust 中 HashMap 的开销

测量 Rust 中 HashMap 的开销在处理将大量数据放入 HashMap的项目时&#xff0c;作者开始注意到 HashMap 占用了大量内存并对最小内存使用量进行了粗略计算&#xff0c;得到的常驻内存是预期的两倍多。我们都知道 HashMaps 以空间换取时间。通过使用更多空间&#xff0c;我们能…

Apache HTTP 两个路径穿越漏洞复现

目录 Apache HTTP Server 2.4.49 路径穿越漏洞&#xff08;CVE-2021-41773&#xff09; 漏洞环境&#xff1a; 漏洞复现&#xff1a; 漏洞复现成功&#xff01; Apache HTTP Server 2.4.50 路径穿越漏洞&#xff08;CVE-2021-42013&#xff09; 漏洞复现分析&#xff1a; 漏…

React - Hooks 使用(函数组件中使用 React 特性)

React - Hooks 使用&#xff08;函数组件中使用 React 特性&#xff09;一. 为什么要使用 HOOKS&#xff1f;二. HOOKS 概念三. HOOKS 用法1. useState1.1 参数及返回值1.2 setState 两种写法1.3 setState 示例2. useEffect2.1 useEffect 实例3. useRef3.1 useRef 实例四. 一个…

R语言中的偏最小二乘回归PLS-DA

主成分回归&#xff08;PCR&#xff09;的方法 本质上是使用第一个方法的普通最小二乘&#xff08;OLS&#xff09;拟合来自预测变量的主成分&#xff08;PC&#xff09;。这带来许多优点&#xff1a; 预测变量的数量实际上没有限制。 相关的预测变量不会破坏回归拟合。 但是…