RKMEDIA--VP使用
本章描述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_bypass、rkispp_scale0、rkispp_scale1、rkispp_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.111Media device information
------------------------
driver rkispp
model rkispp1
serial
bus info
hw revision 0x0
driver version 4.19.111Device topology
- entity 1: rkispp_input_image (1 pad, 1 link)type Node subtype V4L flags 0device node name /dev/video25pad0: Source-> "rkispp-subdev":0 [ENABLED]- entity 5: rkispp_m_bypass (1 pad, 1 link)type Node subtype V4L flags 0device node name /dev/video26pad0: Sink<- "rkispp-subdev":2 [ENABLED]- entity 9: rkispp_scale0 (1 pad, 1 link)type Node subtype V4L flags 0device node name /dev/video27pad0: Sink<- "rkispp-subdev":2 [ENABLED]- entity 13: rkispp_scale1 (1 pad, 1 link)type Node subtype V4L flags 0device node name /dev/video28pad0: Sink<- "rkispp-subdev":2 [ENABLED]- entity 17: rkispp_scale2 (1 pad, 1 link)type Node subtype V4L flags 0device node name /dev/video29pad0: Sink<- "rkispp-subdev":2 [ENABLED]- entity 21: rkispp_iqtool (1 pad, 1 link)type Node subtype V4L flags 0device node name /dev/video30pad0: Sink<- "rkispp-subdev":2 [ENABLED]- entity 25: rkispp_input_params (1 pad, 1 link)type Node subtype V4L flags 0device node name /dev/video31pad0: Source-> "rkispp-subdev":1 [ENABLED]- entity 29: rkispp-stats (1 pad, 1 link)type Node subtype V4L flags 0device node name /dev/video32pad0: Sink<- "rkispp-subdev":3 [ENABLED]- entity 33: rkispp-subdev (4 pads, 8 links)type V4L2 subdev subtype Unknown flags 0device node name /dev/v4l-subdev1pad0: Sink[fmt:unknown/0x0crop.bounds:(0,0)/0x0crop:(0,0)/0x0compose.bounds:(0,0)/0x0compose:(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_image | video25 |
rkispp_m_bypass | video26 |
rkispp_scale0 | video27 |
rkispp_scale1 | video28 |
rkispp_scale2 | video29 |
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 ofthe v4l2_dev_info struct can no longer be a bitfield, so the code needs tobe 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博客
RKMEDIA--VP使用相关推荐
- HarmonyOS UI 开发 vp ,fp , px 以及写具体数字的 理解
HarmonyOS 开发UI 距离和字体使用什么单位 距离使用 vp (virtual pixel) 字体大小使用 fp (font pixel) 详细了解 vp ,fp , px 虚拟像素单位:vp ...
- AI领域为何缺乏突破?前Quora工程VP:Hinton没有说到点子上
https://www.toutiao.com/i6638505383340016142/ 坤艮机器之心 2018-12-24 18:31:21 选自 Quora 作者:Xavier Amatriai ...
- EMC virtual provisining and fast vp
emc中只有thin pool,从thin pool中可以创建thin device and data device(physical),没有thick pool,是否是thin lun可以在prop ...
- AI公开课:19.05.22 Aya Soffer—IBM AI Tech VP《Advanced, scalable, and trusted AI 》课堂笔记以及个人感悟
AI公开课:19.05.22 Aya Soffer-IBM AI Tech VP<Advanced, scalable, and trusted AI >课堂笔记以及个人感悟 Introd ...
- 点融产品 VP 赵征宇:增长是一个探索人性的过程
这篇文章是点融产品 VP 赵征宇先生在我们 2017 增长大会互联网金融专场的演讲内容,是非常实战的内容.点融将增长的方法论分为 "定义增长 - 最小化 - 衡量 - 最大化" 四 ...
- 龙图 VP 李翀:数据化运营及云计算下的运维
文 | 龙图 VP 李翀 原文地址:当游戏遇上大数据和云计算--谈数据化运营及云计算下的运维 龙图做了8年的游戏,真正快速发展起来是在移动互联网这个时代.随着刀塔快速的扩张,我们在各个领域都遇到了非常 ...
- vp翻N_VP刀叨叨:如何让G胖给你唱生日歌
VS看起来好凶喵 ▼ ESL欧洲&独联体区 VP发推庆祝击败OG 昨晚第九个比赛日,OG与VP的比赛无疑是大家关注的焦点,一边是TI双冠王,一边是状态开始回升的俄罗斯毛熊,大家都很期待他们能给 ...
- 专访 | 「Smartbi 」VP徐晶:未来,BI将成为决策者的诸葛亮
作者 | Sherson 责编 | 唐小引 头图 | CSDN 下载自视觉中国 出品 | CSDN(ID:CSDNnews) 编者按:作为专注于商业智能分析行业的产品提供商,Smartbi是拥有最多 ...
- 从应届技术男到百度VP,这是低调到没百科的吴海锋首次受访
李根 发自 上地十街 量子位 报道 | 公众号 QbitAI 百度有很多技术出众又低调隐秘的大牛,有的甚至找不到专属的"百科词条". 百度副总裁吴海锋,正是其中代表人物. 在&l ...
最新文章
- LinkedHashMap和HashMap的比较使用 详解
- CSS绘制放大缩小关闭按钮
- java建立tcp服务器长连接_B/S 架构下后端能否建立 TCP 长连接?
- 机器学习模型 非线性模型_机器学习模型说明
- cocos2d JS 鼠标响应事件
- android checkbox 选中事件_智慧树知到Android移动应用开发基础章节测试答案
- 编译原理第四章课后题
- 复习了C++前几章,做一个ASCII码转换的小程序
- NXP RT1062 flashloader下载程序到RAM执行
- linux下类everthing搜索工具
- 计算机固态硬盘与机械硬盘的区别是什么,电脑固态硬盘和机械硬盘有什么区别-电脑固态硬盘和机械硬盘区别介绍 - 系统家园...
- Git 常用回滚撤销命令总结
- CentOS7 开启路由转发
- 正则表达式随记(3)常用的正则表达式
- 切片函数python_python切片操作
- Going Deeper with Convolutions——GoogLeNet论文翻译——中文版
- 互联网大公司与创业公司
- python抓取网站88titienmae88中的“图片区”的第一页的所有图片
- 西门子博途梯形图写的Modbus RTU 程序
- easyui SWFUpload
热门文章
- RabbitMQ(详解)
- CS285课程解释_01_为什么是深度强化学习
- 千寻位置服务嵌入式SDK集成——基本概念
- HarmonyOS 2.0鸿蒙应用开发者官网地址
- html5图片与文字垂直对齐
- 时间复杂度和空间复杂度简介
- Python 的主要应用领域有哪些?
- 报错:ERROR: modpost: “__aeabi_unwind_cpp_pr1“ [/tmp/stapuOPLIl/stap_xxx.ko]undefined!
- RecycleView 和Viewpager2
- 【Apache POI】Excel操作(一):Excel本地写入基本操作的实现