为什么会有media这样的一个子系统?

在多媒体的框架中,总是复杂多样的,为了解决多媒体设备的复杂性和数据流动性,创建了media子系统。Media使用一个树状结构,将多媒体数据通路的各个设备连接在一起,方便各个设备的管理和控制。

media 框架

在开机的时候,将会在[media-devnode.c]中,通过media_devnode_init()函数为media设备分配一个主设备号,次设备号从0~255,同时注册一个名字为“media”的bus总线。这个时候,只是申请分配了一个名为media的设备号而已,具体的media设备注册,将在相应的设备驱动中进行注册登记。

下面以camera为例,介绍media框架流程。在了解media框架前,先了解camera设备的注册流程,在注册 /dev/videoX 节点时,主要操作流程如下:

  1. 通过 platform probe,初始化各个 v4l2 subdevice;
  2. 先通过 v4l2_device_register() 函数,注册 v4l2 device;
  3. 先后通过调用 media_device_init()、 media_device_register() 函数,注册 /dev/mediaX 设备,这个时候,将 v4l2_dev->mdev = media_dev;
  4. 注册各 v4l2 subdevice,同时,在注册各个subdevice时,subdevice 将会作为一个 entity,登记到media_dev;
  5. 通过 video_register_device() 函数注册 /dev/videoX 节点,到目前为止,各个 v4l2 subdevice 已经注册完成,接下来将是根据各个各个子设备的需求,进行相应的连接,设置数据通路;

media 设备与 entity

实际上 /dev/mediaX 设备是一个字符设备,只不过是通过 media 框架的一层封装,只是注册设备的主设备号与此设备号都是从之前预分配的 media 设备获取。
怎么理解 media device 与 entity ,可以简单的理解,media device是一个部门的主管,而 entity 是各个下属,media device 将负责统筹 entity,管理各个数据通路的流向。所以,下面再来看看,entity又是怎样注册的。

我们是以camera为例了解media框架的,在 /dev/videox jieidan 节点设备中,通过struct video_device结构体管理节点,而在该结构体中,又将会包含 v4l2 device 的结构体struct v4l2_device,而在 v4l2 device 的结构体中,又将会包含media device的结构体struct media_device,就是这样,层层包含。

在通过 v4l2_device_register_subdev() 函数注册 v4l2 subdevice 时,将会调用 media_device_register_entity() 函数,将该 v4l2 subdevice 当成一个 entity 注册到 media device,于此同时,还将会有 entity 的 pads 初始化等操作。

media框架的目标之一是发现设备内部拓扑,实时配置。为了实现这个目标,硬件设备被建模为一些图形积木,称为用垫子(pads)连接的实体(entity)。一个entity是一个基本的媒体硬件积木。它可以和大量的逻辑模块–譬如物理硬件设备(CMOS传感器), 逻辑硬件设备(一个SOC图形处理流水线积木),DMA通道或者物理连接器通信。pad是用于entity和其他entity互通的连接端点。entity产生的数据(不仅是video)从该entity的输出流向一个或多个entity的输入。pads不能与芯片的物理pin脚弄混了。一个link是两个pads之间的点对点连接,可以是同一个entity或者不同的entity之间。数据从pad源流向pad终点。
各个entity都已经注册到 media ,那么,接下来看看 entity 间的 link 又是怎样操作的。

entity link

media entity link 是通过media_create_pad_link(struct media_entity *source, u16 source_pad, struct media_entity *sink, u16 sink_pad, u32 flags) 函数完成的。如该函数的声明,需要输入source entity以及source pad、sink entity以及sink pad。各个 entity pad数目是预先已知的,所以在连接的时候,自然知道需要使用哪个pad。
link 时,其实就是分别针对 source、sink 创建一个 media link,都添加到 media device中,并将赋值 link 到 source 与 sink 。
到这里,简单的理解了 media device、entity、pad、link,那么,我们究竟使用这一套框架干嘛呢,继续往下看。

media 框架有什么用?

协商

我们知道,在使用camera的过程中,有各个模块需要互相协助,简单的数据流如下:

sensor ---> CPHY ---> csi ---> isp ---> stream

那么,我们在设置camera的图像输出格式时,将会需要确认,整个 pipeline 都是支持该格式的,这个时候,我们就可以通过 media 框架提供的函数 media_entity_graph_walk_init()media_entity_graph_walk_start()media_entity_graph_walk_next() 等函数开始遍历 pipeline 的各个entity,确认每个entity都是支持该格式的,完成一个数据的协商过程。
同时,当平台支持 scaler 缩放时,又可以从同一个源,经过 scaler 之后,输出不同的分辨率大小等,这样的一个entity,多个输出,这样也是很方便通过 media 框架进行数据的管理。

控制

大部分soc厂商,对自己的ISP算法是不开源的,但是linux内核是开源的,这个时候,soc厂商会将自己的ISP算法放在应用层,这个时候,就需要通过应用层操作到内核,而 media 框架管理着数据的整条通路,所以,在这里,通过 media 框架操作ISP等硬件是非常便捷的。
在注册 media 设备时,在 __media_device_register() 函数,赋值 media devnode fops 为 media_device_fops。而 media_device_fops 主要是通过 ioctl 操作 media 设备。支持以下操作:

static const struct media_ioctl_info ioctl_info[] = {MEDIA_IOC(DEVICE_INFO, media_device_get_info, MEDIA_IOC_FL_GRAPH_MUTEX),MEDIA_IOC(ENUM_ENTITIES, media_device_enum_entities, MEDIA_IOC_FL_GRAPH_MUTEX),MEDIA_IOC(ENUM_LINKS, media_device_enum_links, MEDIA_IOC_FL_GRAPH_MUTEX),MEDIA_IOC(SETUP_LINK, media_device_setup_link, MEDIA_IOC_FL_GRAPH_MUTEX),MEDIA_IOC(G_TOPOLOGY, media_device_get_topology, MEDIA_IOC_FL_GRAPH_MUTEX),
};

通过这些ioctl,可以获取操作相应 entity 的句柄,进而控制相应的模块操作。

同时,在应用层打开各个 entity,通过 VIDIOC_SUBSCRIBE_EVENT 设置事件的监听,当在内核中产生相应的事件时,通过 v4l2_event_queue() 函数,将事件传递到应用层。

参考文章
  • htjacky:Linux Media子系统
  • htjacky:Linux Kernel media框架(一)
  • htjacky:Linux Kernel media框架(二)
  • htjacky:Linux Kernel media框架(三)

Linux media子系统相关推荐

  1. 浅谈Linux media framework

    基本概念 通过调试camera过程中对接触的v4l2,意外发现了Linux一个不是很起眼的子系统--Linux media framework,那它存在的意义是什么? 节选一段来自Linux源码中的文 ...

  2. 【Linux】Linux input子系统之Input event codes

    文章目录 前言 正文 附件 参考文章 前言 在阅读和修改Linux kernel中Touch相关驱动代码时经常可以见到形如INPUT_PROP_DIRECT EV_SYN BTN_TOUCH之类的In ...

  3. linux V4L2子系统——v4l2架构(3)之video_device

    linux V4L2子系统--v4l2架构(3)之video_device 备注:   1. Kernel版本:5.4   2. 使用工具:Source Insight 4.0   3. 参考博客: ...

  4. Linux V4L2子系统分析(一)

    1.概述 Linux系统上的Video设备多种多样,如通过Camera Host控制器接口连接的摄像头,通过USB总线连接的摄像头等.为了兼容更多的硬件,Linux内核抽象了V4L2(Video fo ...

  5. Chromium浏览器media子系统mojo说明

    Chromium浏览器media子系统mojo说明 该文件夹包含mojo接口.客户端和实现,它们扩展了核心media来支持大多数进程外使用,包括media Player.Metrics(WatchTi ...

  6. 在windows10中安装 linux ubuntu 子系统

    在windows10中安装 linux ubuntu 子系统 文章目录 在windows10中安装 linux ubuntu 子系统 打开开发者模式 windows子系统功能 重启计算机 Micros ...

  7. 利用 libvirt 和 Linux 审计子系统跟踪 KVM 客户机

    在虚拟环境中审计和过滤客户机和主机事件 Marcelo H. Cerri, 软件工程师, IBM Marcelo Cerri 是位于巴西 IBM Linux Technology Center 的软件 ...

  8. Linux内核网络数据包发送(四)——Linux netdevice 子系统

    Linux内核网络数据包发送(四)--Linux netdevice 子系统 1. 前言 2. `dev_queue_xmit` and `__dev_queue_xmit` 2.1 `netdev_ ...

  9. Linux网络设备子系统

    Linux网络设备子系统 1. 前言 2. 网络设备子系统初始化 2.1 `struct softnet_data`变量初始化 2.2 SoftIRQ Handler 初始化 3. 网络数据监测和调优 ...

  10. Linux内核子系统

    分享Linux内核子系统结构图一张

最新文章

  1. Spring请求参数校验
  2. idea中修改jsp文件不用再重启tomcat的方法
  3. 解决ORA-00257: 归档程序错误。在释放之前仅限于内部连接
  4. JS面向对象的程序设计之创建对象_工厂模式,构造函数模式,原型模式-1
  5. Python与开源GIS:GDAL简介转载
  6. char* str = abc ;跟char str[] = abc;的区别
  7. 移动应用开发 jQuery Mobile
  8. 数据库系统概论第五版课后习题答案王珊
  9. vue-事件修饰符-详解(.prevent .stop .once .capture .self)
  10. Virtual KD 出现 Still cannot find RPC dispatcher table 无法连接
  11. 闲鱼网站实时监控iphone最新发布信息
  12. 虚拟服务器和vdi,如何搭建高效虚拟桌面架构(VDI)
  13. Gartner发布《2023年十大战略技术趋势》
  14. 如何用阿里云服务器建立个人网站(针对新手)
  15. SecureCRT连接服务器报错Failed to open the host key database file解决方法
  16. 使用ARP欺骗, 截取局域网中任意一台机器的网页请求,破解用户名密码等信息
  17. 百度css3背景图代码,CSS3 实现花式背景图案
  18. C语言中的与、或、非
  19. 200亿元输血求生,中芯国际希望几何?
  20. 为什么很多人工作都不开心?【转】

热门文章

  1. 2022年上半年5月网络工程师试题及答案
  2. U盘引导网络安装CentOS 7
  3. 兔子数列规律怎么讲_“兔子数列”的秘密
  4. Android 第三方应用广告拦截实现
  5. windows远程桌面不能复制粘贴的解决办法
  6. 方法区、永久代、元空间的区别
  7. 使用IPV6技术访问网站
  8. Linux指令部分(一)
  9. 408操作系统考研笔记!超级详细!23最新考纲
  10. 手披云雾开鸿蒙,描写泰山的诗句不是整首诗、注明作者