第十八篇:融汇贯通--谈USB Video Class驱动

USB Video Class驱动是WINDOWS系统包含的一个针对于USB VIDEO 类的驱动程序.

好多工程师都做过USB VIDEO设备端的开发, 主要的工作内容为: 使用FIRMWARE,或者LIINUX GADGET驱动程序, 构建USB VIDEO设备的描述符, 通过这些描述符的TOPOLOGY关系, 让系统了解,设备所支持的某些控制, 支持的视频格式, 系统驱动通过对这些描述符的解释, 构建自己的KS, FILTER, NODE, PIN网络, 属性, 方法, 最终, 又由这些FILTER, NODE, PIN的属性,方法提供的接口,供DShow展现给上层应用.

设备端需要LENS的视频数据(VSYNC,HSYNC, DATA)打成USB VIDEO类型的包, 加上12字节的头, 通过BULK或者ISO EP往上层传输, 相应的PROBE/COMMIT, 视频属性的控制,最终都是将上层的CLASS REQUEST转化为底层硬件的设置.

设备端的开发, 可以说,只是一部分, 对整个系统的了解,也只是较小的一块.

WINDOWS帮助USB VIDEO CLASS的系统实现了更多的部分.

USBVIDEO.SYS作为PIN-CENTRIC 的AVSTREAM minidriver, 根据设备的描述符, 创建了filter factory(同时对对设备的INPUT,OUTPUT terminal).

利用设备描述符内容, USB VIDEO CLASS驱动, 在系统内部构建了FILTER, NODE, 与CONNECTIONS建立的一张GRAPH.

同时,通过描述符中相应的控制CONTROL, USB VIDEO CLASS也在FILTER, PIN, NODE的描述符及其属性中加入相应的AUTOMATION TABLES.

根据描述符中的视频数据格式, 驱动同样向KS提交数据范围的列表以及数据交集的处理名柄.

该驱动同样为音视频同步做了考虑, 主旨是通过KS的MASTER CLOCK给视频数据打上时间戳, 作为同步需求的参考时间.

为了和驱动交互, 应用程序通过DShow COM 接口来达到应用的目的.

做过AVStream/BDA驱动的工程师都了解,AVStream/BDA的架构的复杂程度, 与设备端的程序的直观性, 易理解性,易调试性,都不是一个数量级的.

要真正从底层到顶层, 一个USB VIDEO CLASS设备的理解, 包括USB DEVICE CONTROLLER, CMOS, FIRMWARE/LINUX GADGET, 还包括, AVSTREAM/BDA架构与细节, DShow, 等一系列的内容.

第十八篇:融汇贯通--谈USB Video Class驱动,布布扣,bubuko.com

时间: 2024-10-02 10:50:05

第十八篇:融汇贯通--谈USB Video Class驱动的相关文章

Python之路【第十八篇】:Web框架们

Python之路[第十八篇]:Web框架们 Python的WEB框架 Bottle Bottle是一个快速.简洁.轻量级的基于WSIG的微型Web框架,此框架只由一个 .py 文件,除了Python的标准库外,其不依赖任何其他模块. 1 2 3 4 pip install bottle easy_install bottle apt-get install python-bottle wget http://bottlepy.org/bottle.py Bottle框架大致可以分为以下部分: 路

【Python之路】第十八篇--MySQL(一)

[Python之路]第十八篇--MySQL(一) 一.概述 1.什么是数据库 ? 答:数据的仓库,如:在ATM的示例中我们创建了一个 db 目录,称其为数据库 2.什么是 MySQL.Oracle.SQLite.Access.MS SQL Server等 ? 答:他们均是一个软件,都有两个主要的功能: a. 将数据保存到文件或内存 b. 接收特定的命令,然后对文件进行相应的操作 PS:如果有了以上软件,无须自己再去创建文件和文件夹,而是直接传递 命令 给上述软件,让其来进行文件操作,他们统称为数

Python开发【第十八篇】:MySQL(二)

Python开发[第十八篇]:MySQL(二) 视图 视图是一个虚拟表(非真实存在),其本质是[根据SQL语句获取动态的数据集,并为其命名],用户使用时只需使用[名称]即可获取结果集,并可以将其当作表来使用. SELECT * FROM ( SELECT nid, NAME FROM tb1 WHERE nid > 2 ) AS A WHERE A. NAME > 'alex'; 临时表搜索 1.创建视图 --格式:CREATE VIEW 视图名称 AS SQL语句 CREATE VIEW v

Egret入门学习日记 --- 第二十八篇(书中 9.19 ~ 9.19 节 内容)

第二十八篇(书中 9.19 节 内容) 没想到第九章的组件篇可真是够长的,没事,慢慢来吧. 开始 9.19节. 重点: 1.创建一个Tips提示组件. 操作: 1.创建一个Tips提示组件. 哇!出大问题!这个Tips组件有点牛皮!怎么办? 书中内容这部分,我直接懵逼. 还有这部分也是. 一点一点来分析好吧. 好,开始分析一波. 第一步:查看最终展示效果. 这是最终效果.(我去,我现在才知道,原来博客园的编辑器还可以放Gif图片...) 第二步:这个黑色的弹框组件本质上是由什么构成的? 可见,在

第二十八篇: 学习笔记

最近一直在学一些零零碎碎的东西, 首先,将<鸟哥的 Linux 私房菜 -- 基础学习篇>过了一遍. 因为有了Windows驱动,PCI/PCIe, USB, xHCI, Windows内核编程的基础, 加上自己以前也动手写过Linux设备驱动, 研究过Makefile, KConfig, make menuconfig, GIT的部分内容 鸟哥的这本书确实写得非常通俗易懂,帮我解开了一些以前知道怎么操作, 但不知道为什么要这样操作的疑惑. 另外,基本完成了USB Audio/Video Cl

SpringBoot非官方教程 | 第十八篇: 定时任务(Scheduling Tasks)

转载请标明出处: http://blog.csdn.net/forezp/article/details/71023783 本文出自方志朋的博客 这篇文章将介绍怎么通过spring去做调度任务. 构建工程 创建一个Springboot工程,在它的程序入口加上@EnableScheduling,开启调度任务. @SpringBootApplication @EnableScheduling public class SpringbootSchedulingTasksApplication { pu

第十八篇 liunx系统下 JDK的安装

大家好,今天我给大家简单介绍一下我所学到的一些经验和总结: 今天我们学习了如何在liunx系统下 安装 JDK ,说到JDK 可能很多人都知道,JDK :英文名叫 Java Development Kit ,意思就是 Java 语言的软件开发工具包:其作用 我就不再一一介绍了,好了,下面就来说一下安装步骤吧: 第一步,先找到安装包,并且在DOS命令下打开,当然 liunx系统下的JDK安装包 跟Windows系统下的 JDK安装包不一样,这点需要大家注意一下: 第二步,配置环境变量,当然也是在

跟我学SpringCloud | 第十八篇:微服务 Docker 化之基础环境

1. 容器化 Docker 的横空出世,给了容器技术带来了质的飞跃,Docker 标准化了服务的基础设施,统一了应用的打包分发,部署以及操作系统相关类库等,解决了测试生产部署时环境差异的问题.对于运维来讲,由于镜像的不可变性,更容易进行服务部署和回滚操作.利用各种第三方容器管理平台,实现一键部署.动态伸缩等操作变的轻而易举. 2. 基础镜像选择 在操作系统的选择上,可选择传统的 CentOS . Ubuntu 或者更为轻量化的 Alpine .比如 CentOS 或者 Ubuntu 的镜像都在

第三十八篇、给UITabBar按钮的动画效果

- (void)tabBar:(UITabBar *)tabBar didSelectItem:(UITabBarItem *)item { NSInteger index = [self.tabBar.items indexOfObject:item]; if (self.indexFlag != index) { [self animationWithIndex:index]; } } // 动画 - (void)animationWithIndex:(NSInteger) index {