本章描述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使用相关推荐

  1. HarmonyOS UI 开发 vp ,fp , px 以及写具体数字的 理解

    HarmonyOS 开发UI 距离和字体使用什么单位 距离使用 vp (virtual pixel) 字体大小使用 fp (font pixel) 详细了解 vp ,fp , px 虚拟像素单位:vp ...

  2. AI领域为何缺乏突破?前Quora工程VP:Hinton没有说到点子上

    https://www.toutiao.com/i6638505383340016142/ 坤艮机器之心 2018-12-24 18:31:21 选自 Quora 作者:Xavier Amatriai ...

  3. EMC virtual provisining and fast vp

    emc中只有thin pool,从thin pool中可以创建thin device and data device(physical),没有thick pool,是否是thin lun可以在prop ...

  4. 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 ...

  5. 点融产品 VP 赵征宇:增长是一个探索人性的过程

    这篇文章是点融产品 VP 赵征宇先生在我们 2017 增长大会互联网金融专场的演讲内容,是非常实战的内容.点融将增长的方法论分为 "定义增长 - 最小化 - 衡量 - 最大化" 四 ...

  6. 龙图 VP 李翀:数据化运营及云计算下的运维

    文 | 龙图 VP 李翀 原文地址:当游戏遇上大数据和云计算--谈数据化运营及云计算下的运维 龙图做了8年的游戏,真正快速发展起来是在移动互联网这个时代.随着刀塔快速的扩张,我们在各个领域都遇到了非常 ...

  7. vp翻N_VP刀叨叨:如何让G胖给你唱生日歌

    VS看起来好凶喵 ▼ ESL欧洲&独联体区 VP发推庆祝击败OG 昨晚第九个比赛日,OG与VP的比赛无疑是大家关注的焦点,一边是TI双冠王,一边是状态开始回升的俄罗斯毛熊,大家都很期待他们能给 ...

  8. 专访 | 「Smartbi 」VP徐晶:未来,BI将成为决策者的诸葛亮

    作者 | Sherson 责编 |  唐小引 头图 | CSDN 下载自视觉中国 出品 | CSDN(ID:CSDNnews) 编者按:作为专注于商业智能分析行业的产品提供商,Smartbi是拥有最多 ...

  9. 从应届技术男到百度VP,这是低调到没百科的吴海锋首次受访

    李根 发自 上地十街  量子位 报道 | 公众号 QbitAI 百度有很多技术出众又低调隐秘的大牛,有的甚至找不到专属的"百科词条". 百度副总裁吴海锋,正是其中代表人物. 在&l ...

最新文章

  1. LinkedHashMap和HashMap的比较使用 详解
  2. CSS绘制放大缩小关闭按钮
  3. java建立tcp服务器长连接_B/S 架构下后端能否建立 TCP 长连接?
  4. 机器学习模型 非线性模型_机器学习模型说明
  5. cocos2d JS 鼠标响应事件
  6. android checkbox 选中事件_智慧树知到Android移动应用开发基础章节测试答案
  7. 编译原理第四章课后题
  8. 复习了C++前几章,做一个ASCII码转换的小程序
  9. NXP RT1062 flashloader下载程序到RAM执行
  10. linux下类everthing搜索工具
  11. 计算机固态硬盘与机械硬盘的区别是什么,电脑固态硬盘和机械硬盘有什么区别-电脑固态硬盘和机械硬盘区别介绍 - 系统家园...
  12. Git 常用回滚撤销命令总结
  13. CentOS7 开启路由转发
  14. 正则表达式随记(3)常用的正则表达式
  15. 切片函数python_python切片操作
  16. Going Deeper with Convolutions——GoogLeNet论文翻译——中文版
  17. 互联网大公司与创业公司
  18. python抓取网站88titienmae88中的“图片区”的第一页的所有图片
  19. 西门子博途梯形图写的Modbus RTU 程序
  20. easyui SWFUpload

热门文章

  1. RabbitMQ(详解)
  2. CS285课程解释_01_为什么是深度强化学习
  3. 千寻位置服务嵌入式SDK集成——基本概念
  4. HarmonyOS 2.0鸿蒙应用开发者官网地址
  5. html5图片与文字垂直对齐
  6. 时间复杂度和空间复杂度简介
  7. Python 的主要应用领域有哪些?
  8. 报错:ERROR: modpost: “__aeabi_unwind_cpp_pr1“ [/tmp/stapuOPLIl/stap_xxx.ko]undefined!
  9. RecycleView 和Viewpager2
  10. 【Apache POI】Excel操作(一):Excel本地写入基本操作的实现