RKMEDIA--VI的使用
Posted kn-zheng
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了RKMEDIA--VI的使用相关的知识,希望对你有一定的参考价值。
在上一篇文章RKMEDIA使用简介中简单的介绍了rkmedia的组成部分,本章主要聊聊VI模块。
rkmedia中的VI模块主要可以从两个方式获取流:直接打开video节点的方式、使用rk平台的rkaiq。
1、直接打开video节点的方式 顾名思义只需要在vi初始化中配置VI_CHN_ATTR_S参数中pcVideoNode成对应的/dev/video*节点
VI_CHN_ATTR_S vi_chn_attr;
vi_chn_attr.pcVideoNode = "/dev/video0";
vi_chn_attr.u32BufCnt = 3;
vi_chn_attr.u32Width = u32Width;
vi_chn_attr.u32Height = u32Height;
vi_chn_attr.enPixFmt = IMAGE_TYPE_NV12;
vi_chn_attr.enWorkMode = VI_WORK_MODE_NORMAL;
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;
2、使用rkaiq方式,rkaiq是对ispp的实现。 ispp支持分辨率的缩放。
VI_CHN_ATTR_S vi_chn_attr;
vi_chn_attr.pcVideoNode = "rkispp_scale0";
vi_chn_attr.u32BufCnt = 3;
vi_chn_attr.u32Width = u32Width;
vi_chn_attr.u32Height = u32Height;
vi_chn_attr.enPixFmt = IMAGE_TYPE_NV12;
vi_chn_attr.enWorkMode = VI_WORK_MODE_NORMAL;
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;
在使用sensor作为输入的时候,一般都是采用rkaiq的方式;使用hdmi或者是模拟高清RX芯片(NVP6188等)这种作为输入,是采用直接打开video节点的方式。
rkmedia的demo中,默认是使用ispp节点作为输入。所以在使用demo时需要在后台执行ispserver& 程序,或者在输入参数加上-a 选项指定iqfiles文件路径(默认路径是在/etc/iqfiles下面)。
以下是rv1126/rv1109ispp节点的能力:
ps:缩放只支持缩小不支持放大,倍数是等比关系,不是分辨率的关系(长宽要同时缩放1-8倍之间)。比如输入的分辨率是1920*1080 那么缩放范围在960*540~240*135,缩放的倍率不要求是整数倍,但是分辨率需要16字节对齐
rkmedia_vi_get_frame_test 提供了获取yuv数据的demo,在使用demo前要确保可以在命令行用v4l2命令可以获取数据。
v4l2抓取命令如下:
v4l2-ctl -d /dev/video19 --set-fmt-video=width=1920,height=1080,pixelformat=NV12 --stream-mmap=3
在配置多路输入的时候,需要注意VI_CHN 是不可以重复的。
在接入两个sensor的时候使用ispp时,VI_PIPE是用来选择对应的sensor的,对应关系是在设备树中设置的。如果是hdmi和RX芯片接入,则无需考虑VI_PIPE的设置,随便怎么设置。
在使用vi模块最常见的问题是在初始化时,配置VI_CHN_BUF_TYPE_DMA ,程序执行会错误。
主要是有两点:
1、输入节点是video0, 目前的经验得出video0是不支持DMA申请内存
2、rkmedia的DMA内存是去通过DRM去申请的,所以有些无屏设备在设备树中把display_subsystem节点禁用了,所以需要开启。
&display_subsystem
status = "okay";
;
常用VI查看信息的命令:
media-ctl -p -d /dev/media3 //用来查看media节点的拓扑结构
v4l2-ctl --list-formats-ext -d /dev/video25 //用来查看video节点支持的分辨率以及格式等信息
cat /proc/rkispp0 //查看ispp的信息(在ispp使用的时候用,否则只能查看频率和版本)
在使用uvc作为输入的时候需要做一下操作:
1、修改kernel的配置,(Device Drivers > Multimedia support > Media USB Adapters >Media USB Adapters>USB Video Class(UVC))
其实只需在arch/arm/cofnigs/下对应的配置文件中添加:CONFIG_MEDIA_USB_SUPPORT=y CONFIG_USB_VIDEO_CLASS=y
2、插上uvc摄像头后,通过media-ctl -p -d /dev/media*找到对应的video节点
3、v4l2-ctl --list-formats-ext -d /dev/video* 通过这个命令可以得到节点支持的分辨率以及输入格式
4、修改demo中vi的配置,改成对应的节点、支持的分辨率、支持的格式
暂时关于VI部分写这么多,有新的建议后续加上来。
@Conditional的使用及使用场景
@Conditional的使用
- 作用:根据条件,决定类是否加载到Spring Ioc容器中,在SpringBoot中有大量的运用
- 应用场景:在一些需要条件满足才是实例化的类中,使用此注解,我曾经在项目中需要根据不同的场景使用不同的mq中间件的时候使用过,在mq的实例化bean上,加上此注解,根据配置文件的不同,来决定这个bean是否加载至ioc容器中。
使用方法
实现Conditional接口, 实现matches方法。
public class MqExistsCondition implements Condition{ @Override public boolean matches(ConditionContext context,AnnotatedTypeMetadata metadata) { Environment environment = context.getEnvironment(); //从这里获取配置文件中 active 的值,根据当前的active值决定是否加载类 String[] activeProfiles = environment.getActiveProfiles(); for (String active : activeProfiles) { if(active.equals(ActiveEnum.open_active.getActive().toString())){ return true; } } return false; } }
在需要判断条件的bean上,加上@Conditional(TestExistsCondition.class) 即可在满足条件的时候加载对应的类。
@Bean @Conditional(TestMqExistsCondition.class) public TestBean getTestBean(){ TestBean testBean = new TestBean(); return testBean; }
其他派生的的conditional
@ConditionalOnClass
? 如果此class不存在
@ConditionalOnMissingBean
? 只有对应的ban在系统中都没有被创建,它修饰的初始化代码块才会执行,用户自己手动创建的bean优先
@ConditionalOnBean
仅仅在当前上下文中存在某个对象时,才会实例化一个Bean。
@ConditionalOnClass
? 某个class位于类路径上,才会实例化一个Bean
@ConditionalOnExpression
? 当表达式为true的时候,才会实例化一个Bean。
比如:
@ConditionalOnExpression("true")
@ConditionalOnExpression("${my.controller.enabled:false}")
@ConditionalOnMissingBean
? 仅仅在当前上下文中不存在某个对象时,才会实例化一个Bean
@ConditionalOnMissingClass
某个class类路径上不存在的时候,才会实例化一个Bean
@ConditionalOnNotWebApplication
? 不是web应用
以上是关于RKMEDIA--VI的使用的主要内容,如果未能解决你的问题,请参考以下文章
在使用加载数据流步骤的猪中,使用(使用 PigStorage)和不使用它有啥区别?
Kettle java脚本组件的使用说明(简单使用升级使用)
PageHelp的使用getParameter的使用zpage-nav的使用QRcode的使用wxpay微信支付的使用jackson-xml数据的转换