Linux 媒体框架(Media Framework)一
Linux V4l2 框架 一
v4l2的框架图
1.Linux Media Framework( 媒体框架)
1.基本概念
media framework 是嵌入到lv4l2 框架中,主要分成entity pad link三大部分,entity设备的实例
pad 用来作为entity的连接点 link 用来连接entity 下图可以直观的看到
2.media的源码
1.注册media总线
首先看media-devnode.c文件,在/sys/bus/下注册了media总线,后续相关的media设备都会注册到下面
Z:\RV1109\kernel\drivers\media\media-devnode.c
subsys_initcall(media_devnode_init);static int __init media_devnode_init(void)
{int ret;pr_info("Linux media interface: v0.10\n");ret = alloc_chrdev_region(&media_dev_t, 0, MEDIA_NUM_DEVICES,MEDIA_NAME);if (ret < 0) {pr_warn("unable to allocate major\n");return ret;}ret = bus_register(&media_bus_type);if (ret < 0) {unregister_chrdev_region(media_dev_t, MEDIA_NUM_DEVICES);pr_warn("bus_register failed\n");return -EIO;}return 0;
}
2.注册media实例
注册完总线后需要把媒体设备实例化,调用注册媒体设备接口在media总线下注册
Z:\RV1109\kernel\drivers\media\media-device.c
//初始化media device下的 entity pad link 链表
void media_device_init(struct media_device *mdev)
{INIT_LIST_HEAD(&mdev->entities);INIT_LIST_HEAD(&mdev->interfaces);INIT_LIST_HEAD(&mdev->pads);INIT_LIST_HEAD(&mdev->links);INIT_LIST_HEAD(&mdev->entity_notify);mutex_init(&mdev->graph_mutex);ida_init(&mdev->entity_internal_idx);dev_dbg(mdev->dev, "Media device initialized\n");
}
//将媒体实例化注册到media总线下 实际调用media_devnode_register 注册media节点
int __must_check __media_device_register(struct media_device *mdev,struct module *owner)
{struct media_devnode *devnode;int ret;devnode = kzalloc(sizeof(*devnode), GFP_KERNEL);if (!devnode)return -ENOMEM;/* Register the device node. */mdev->devnode = devnode;devnode->fops = &media_device_fops;devnode->parent = mdev->dev;devnode->release = media_device_release;/* Set version 0 to indicate user-space that the graph is static */mdev->topology_version = 0;ret = media_devnode_register(mdev, devnode, owner);if (ret < 0) {/* devnode free is handled in media_devnode_*() */mdev->devnode = NULL;return ret;}ret = device_create_file(&devnode->dev, &dev_attr_model);if (ret < 0) {/* devnode free is handled in media_devnode_*() */mdev->devnode = NULL;media_devnode_unregister_prepare(devnode);media_devnode_unregister(devnode);return ret;}dev_dbg(mdev->dev, "Media device registered\n");return 0;
}
//注册media node节点
int __must_check media_devnode_register(struct media_device *mdev,struct media_devnode *devnode,struct module *owner)
{int minor;int ret;/* Part 1: Find a free minor number */mutex_lock(&media_devnode_lock);minor = find_next_zero_bit(media_devnode_nums, MEDIA_NUM_DEVICES, 0);if (minor == MEDIA_NUM_DEVICES) {mutex_unlock(&media_devnode_lock);pr_err("could not get a free minor\n");kfree(devnode);return -ENFILE;}set_bit(minor, media_devnode_nums);mutex_unlock(&media_devnode_lock);devnode->minor = minor;devnode->media_dev = mdev;/* Part 1: Initialize dev now to use dev.kobj for cdev.kobj.parent */devnode->dev.bus = &media_bus_type;devnode->dev.devt = MKDEV(MAJOR(media_dev_t), devnode->minor);devnode->dev.release = media_devnode_release;if (devnode->parent)devnode->dev.parent = devnode->parent;dev_set_name(&devnode->dev, "media%d", devnode->minor);device_initialize(&devnode->dev);/* Part 2: Initialize the character device */cdev_init(&devnode->cdev, &media_devnode_fops);devnode->cdev.owner = owner;/* Part 3: Add the media and char device */ret = cdev_device_add(&devnode->cdev, &devnode->dev);if (ret < 0) {pr_err("%s: cdev_device_add failed\n", __func__);goto cdev_add_error;}/* Part 4: Activate this minor. The char device can now be used. */set_bit(MEDIA_FLAG_REGISTERED, &devnode->flags);return 0;cdev_add_error:mutex_lock(&media_devnode_lock);clear_bit(devnode->minor, media_devnode_nums);devnode->media_dev = NULL;mutex_unlock(&media_devnode_lock);put_device(&devnode->dev);return ret;
}
3.初始化entity 实例相关
//pads entity links 头文件
media/media-entity.h
//entity init
int media_entity_init(struct media_entity *entity, u16 num_pads,struct media_pad *pads, u16 extra_links)
//entity pad init
int media_entity_pads_init(struct media_entity *entity, u16 num_pads,struct media_pad *pads)
{struct media_device *mdev = entity->graph_obj.mdev;unsigned int i;if (num_pads >= MEDIA_ENTITY_MAX_PADS)return -E2BIG;entity->num_pads = num_pads;entity->pads = pads;if (mdev)mutex_lock(&mdev->graph_mutex);for (i = 0; i < num_pads; i++) {pads[i].entity = entity;pads[i].index = i;if (mdev)media_gobj_create(mdev, MEDIA_GRAPH_PAD,&entity->pads[i].graph_obj);}if (mdev)mutex_unlock(&mdev->graph_mutex);return 0;
}
//控制pipeline开启
__must_check int media_pipeline_start(struct media_entity *entity,struct media_pipeline *pipe)
{struct media_device *mdev = entity->graph_obj.mdev;int ret;mutex_lock(&mdev->graph_mutex);ret = __media_pipeline_start(entity, pipe);mutex_unlock(&mdev->graph_mutex);return ret;
}
//控制pipeline 关闭
void media_pipeline_stop(struct media_entity *entity)
{struct media_device *mdev = entity->graph_obj.mdev;mutex_lock(&mdev->graph_mutex);__media_pipeline_stop(entity);mutex_unlock(&mdev->graph_mutex);
}
4.links的连接
//entity的相关连接是通过pad之间的连接
//创建pad -> pad 的连接
media_create_pad_link()
//remove link
media_entity_remove_links()
//interface to entity的连接
media_create_intf_link()
//remove
media_remove_intf_links()
2.linux V4l2 Framework
1.v4l2 device
1.V4L2 device 实例基本概念
每个设备实体都代表着一个struct v4l2_device,在linux中我们往往把这个结构嵌入到大框架中,旗下包含着设备实体
2.v4l2 设备的注册以及相关操作
//注册v4l2 device
int v4l2_device_register(struct device *dev, struct v4l2_device *v4l2_dev)
{if (v4l2_dev == NULL)return -EINVAL;INIT_LIST_HEAD(&v4l2_dev->subdevs);spin_lock_init(&v4l2_dev->lock);v4l2_prio_init(&v4l2_dev->prio);kref_init(&v4l2_dev->ref);get_device(dev);v4l2_dev->dev = dev;if (dev == NULL) {/* If dev == NULL, then name must be filled in by the caller */if (WARN_ON(!v4l2_dev->name[0]))return -EINVAL;return 0;}/* Set name to driver name + device name if it is empty. */if (!v4l2_dev->name[0])snprintf(v4l2_dev->name, sizeof(v4l2_dev->name), "%s %s",dev->driver->name, dev_name(dev));if (!dev_get_drvdata(dev))dev_set_drvdata(dev, v4l2_dev);return 0;
}
//初始化v4l2 device name
int v4l2_device_set_name(struct v4l2_device *v4l2_dev, const char *basename,atomic_t *instance)
{int num = atomic_inc_return(instance) - 1;int len = strlen(basename);if (basename[len - 1] >= '0' && basename[len - 1] <= '9')snprintf(v4l2_dev->name, sizeof(v4l2_dev->name),"%s-%d", basename, num);elsesnprintf(v4l2_dev->name, sizeof(v4l2_dev->name),"%s%d", basename, num);return num;
}
2.v4l2 subdevice
相对于一个监控系统来说,v4l2 subdevice 通常是作为一个sensor来做相应的操作
1.v4l2 sudevice相关操作
//v4l2 subdevice init
void v4l2_subdev_init(struct v4l2_subdev *sd, const struct v4l2_subdev_ops *ops)
{INIT_LIST_HEAD(&sd->list);BUG_ON(!ops);sd->ops = ops;sd->v4l2_dev = NULL;sd->flags = 0;sd->name[0] = '\0';sd->grp_id = 0;sd->dev_priv = NULL;sd->host_priv = NULL;
#if defined(CONFIG_MEDIA_CONTROLLER)sd->entity.name = sd->name;sd->entity.obj_type = MEDIA_ENTITY_TYPE_V4L2_SUBDEV;sd->entity.function = MEDIA_ENT_F_V4L2_SUBDEV_UNKNOWN;
#endif
}
//v4l2 subdevice通常引入media framework
//注册subdevice到v4l2 框架中
v4l2_device_register_subdev();
2.I2c subdevice 相关操作
//初始化device
v4l2_i2c_subdev_init()
//v4l2_subdev struct to the i2c_client struct
struct i2c_client *client = v4l2_get_subdevdata(sd);
//i2c_client to a v4l2_subdev struct
struct v4l2_subdev *sd = i2c_get_clientdata(client);
work
//注册subdevice到v4l2 框架中
v4l2_device_register_subdev();
#### 2.I2c subdevice 相关操作```c
//初始化device
v4l2_i2c_subdev_init()
//v4l2_subdev struct to the i2c_client struct
struct i2c_client *client = v4l2_get_subdevdata(sd);
//i2c_client to a v4l2_subdev struct
struct v4l2_subdev *sd = i2c_get_clientdata(client);
Linux 媒体框架(Media Framework)一相关推荐
- Linux驱动学习--V4L2设备(二)subdev的ops介绍及media framework深入解析
目录 一.引言 二.v4l2_subdev_ops介绍 ------>v4l2_subdev_ops ------>v4l2_subdev_internal_ops ------>使 ...
- 浅谈Linux media framework
基本概念 通过调试camera过程中对接触的v4l2,意外发现了Linux一个不是很起眼的子系统--Linux media framework,那它存在的意义是什么? 节选一段来自Linux源码中的文 ...
- Java Media Framework 基础教程
Java Media Framework 基础教程 作者:Eric Olson 来源:ibm 摘要: 很少发现有关于jmf方面的中文资料,这是在IBM上面找的一本书,可作为jmf的入门学习,业 ...
- JMF(java media framework)综述
摘要: 本文先简述了JMF发展的历史,后对JMF的基本构架做了综述.对重要的类和接口都有详细的介绍. 关键字:JMF(java media framework).具有时域约束关系的媒体数据 正文: J ...
- java jmf 视屏监控的核心代码_JMF(Java Media Framework)使用摄像头
JMF(Java Media Framework)是Java平台使用摄像头.麦克风等媒体设备的应用程序框架,但到了2.1.1e就不再更新,在Windows 7 X64上还能正常运行,只是安装的界面让你 ...
- Linux v4l2框架分析
背景 说明: Kernel版本:4.14 ARM64处理器,Contex-A53,双核 使用工具:Source Insight 3.5, Visio 1. 概述 V4L2(Video for Linu ...
- Android Media Framework(1): 总纲
转自:http://www.jianshu.com/users/5ba48666a89d/latest_articles Android系统整体架构: 我们先看一下多媒体框架在整个Android系统所 ...
- css3的媒体查询(Media Queries)
css3的媒体查询(Media Queries) 我今天就总结一下响应式设计的核心CSS技术Media(媒体查询器)的用法. 先看一个简单的例子: <link rel="stylesh ...
- Linux DMA 框架介绍,demengine.c文件
Linux DMA 框架介绍(demengine.c) 1.介绍 从我们的直观感受来说,DMA并不是一个复杂的东西,要做的事情也很单纯直白.因此Linux kernel对它的抽象和实现,也应该简洁.易 ...
- JMF介绍之媒体框架
JMF(Java Media Framework) 是Sun 公司提出的Java 媒体架构.它是对应Java 2 平台标准版(J2SE) 的一种可选用的应用编程接口(API) .JMF 的源代码通过S ...
最新文章
- 关于DMA,TCM(ITCM和DTCM)和Cache的理解
- Linux shell去除字符串中所有空格
- python画六边形
- jdk8 获取上一个月时间_JDK 10:FutureTask获取一个toString()
- 各种说明方法的答题格式_语文万能答题公式,给孩子收藏吧!
- 商业智能在公安交通管理领域的应用
- 解决fullgc_CMS发生FullGc分析
- Android 手势检测实战 打造支持缩放平移的图片预览效果(下)
- 电脑常用截图方法(含长截图)
- 学生简单个人博客网页DW模板 简单HTML静态网页设计个人主页制作 大学生个人网站模板下载 网页作业个人主页制作
- 计算机键盘盲打方法,电脑键盘盲打练习方法 盲打键盘指法练习技巧
- 小爱同学脱离局域网远程控制开关?
- Spring Cloud 系列之 Netflix Eureka 注册中心(一)
- 电脑在使用b站的时候插入耳机,耳机没有声音,只能外放,其他软件可以正常使用。
- Ubuntu 18.04安装全面战争三国游戏 (by quqi99)
- [kuangbin带你飞]专题六 最小生成树
- 浅谈PHP如何实现网站文章或博客浏览量页面访问量+1
- PHP开发Android应用程序
- freertos使用基础
- Android解析服务器Json数据实例