说明
前文中,我们了解到了avstrean的基本概念,avscamera demo的实现和效果。本篇从代码角度,分析avscamera demo的源码。
主体流程
背景知识
- 通过DriverEntry找到相关入口函数
- 了解KsInitializeDriver注册分发机制
- 连接AVStream运作框架
1、AVStream
说明
- AVStream 是 Microsoft 提供的多媒体类驱动程序,支持仅限视频的流式处理和集成的音频/视频流。 Microsoft 在导出驱动程序 Ks.sys中作为操作系统的一部分提供 AVStream。 硬件供应商编写 在Ks.sys下运行的微型驱动程序。
- Microsoft 仅支持现有微型驱动程序的 流类 驱动程序。
- AVStream 驱动程序基于 Microsoft Windows XP、Microsoft Windows Server 2003 或任何平台Windows安装了 DirectX 8.0 或更高版本的 98 Gold 或更高版本。
AVStream对象层次结构:AVStream 微型驱动程序可以通过层次结构公开许多不同类型的筛选器,例如下图中的筛选器。
2、主要流程
- DriverEntry内,KsInitializeDriver初始化注册分发函数
- DispatchCreate内初始化,注册filter,包含了PinDescriptors(内含:VideoCapturePinDataRanges、VideoPreviewPinDataRanges、ImageCapturePinDataRanges)
- 根据上述PIN的注册分发函数,响应设备相关的数据/控制请求
相关源码
1、驱动入口
// DriverEntry
extern "C"
NTSTATUS
DriverEntry(
_In_ PDRIVER_OBJECT DriverObject,
_In_ PUNICODE_STRING RegistryPath
)
{
// ...
auto status = KsInitializeDriver(
DriverObject,
RegistryPath,
&AvsCameraDeviceDescriptor
);
// ...
}
// KSDEVICE_DESCRIPTOR
const
KSDEVICE_DESCRIPTOR
AvsCameraDeviceDescriptor =
{
&AvsCameraDispatch,
0,
NULL
};
// AvsCameraDispatch
DEFINE_CAMERA_KSDEVICE_DISPATCH(AvsCameraDispatch, CAvsCameraDevice);
// DEFINE_CAMERA_KSDEVICE_DISPATCH
#define DEFINE_CAMERA_KSDEVICE_DISPATCH( Table, Class ) \
const \
KSDEVICE_DISPATCH \
Table = \
{
\
Class::DispatchCreate, /* Pnp Add Device */ \
Class::DispatchStart, /* Pnp Start */ \
Class::DispatchPostStart, /* Post-Start */ \
Class::DispatchQueryStop, /* Pnp Query Stop */ \
Class::DispatchCancelStop, /* Pnp Cancel Stop */ \
Class::DispatchStop, /* Pnp Stop */ \
Class::DispatchQueryRemove, /* Pnp Query Remove */ \
Class::DispatchCancelRemove, /* Pnp Cancel Remove */ \
<