AVStreaml架构
2025-02-12
23
0
AVStream描述符架构
AVStream迷你端口驱动提供以下的层级对象,各个层级对象通过其描述符来创建其工厂对象,再由工厂对象创建其对应的层级对象。故重点就是通过提供描述符创建其工厂对象。
工厂对象的创建分为静态创建和动态创建:
- 静态创建是直接在DriverEntry函数中调用KsInitializeDriver,其第三个参数就是描述符。
- 动态创建是在驱动运行过程中调用KsCreateFilterFactory函数来创建,动态创建Node通过KsFilterCreateNode,动态建Pin通过KsFilterCreatePinFactory.
Pin和Node不管是动态还是静态创建,都不能单独删除,只能随着Filter对象一起删除。
静态创建
在静态创建时,其描述符类型为:KSDEVICE_DESCRIPTOR。设备描述符KSDEVICE_DESCRIPTOR内包含了多个FilterFactory描述符,而FilterFactory描述符中又包含了多个PinFactory及其它描述符。
设备描述符
typedef struct {
const KSDEVICE_DISPATCH* Dispatch;//仅用于PNP相关的系统回调
ULONG FilterDescriptorsCount;
const KSFILTER_DESCRIPTOR*const* FilterDescriptors;
ULONG Version;
ULONG Flags;
} KSDEVICE_DESCRIPTOR, *PKSDEVICE_DESCRIPTOR;
FilerFactory描述符
typedef struct {
const KSFILTER_DISPATCH* Dispatch; //Filter本身的通知函数-create-close-reset-process
const KSAUTOMATION_TABLE* AutomationTable;//filter支持的通知事件、方法、属性
ULONG Version;
ULONG Flags;
const GUID* ReferenceGuid;//Filter类型GUID
ULONG PinDescriptorsCount;
ULONG PinDescriptorSize;
const KSPIN_DESCRIPTOR_EX* PinDescriptors;
ULONG CategoriesCount;
const GUID* Categories;//filter category GUIDs
ULONG NodeDescriptorsCount;
ULONG NodeDescriptorSize;
const KSNODE_DESCRIPTOR* NodeDescriptors;
ULONG ConnectionsCount;
const KSTOPOLOGY_CONNECTION* Connections;
const KSCOMPONENTID* ComponentId;
} KSFILTER_DESCRIPTOR, *PKSFILTER_DESCRIPTOR;
如下图的TopologyFilter,拥有2个Pin和一个Node.数据从左边的KSPIN_WAVEOUT_SRC pin流入到该Filter,这个Pin与唯一的Volume Node之间有一个Connection结构体,然后数据再从KSPIN_SPEAKER_DST pin流出,而Volume Node和这个Pin之间也有一个Connection结构体。
这个Filter的两个Connection结构体定义如下:
KSTOPOLOGY_CONNECTION connect[]={
{PCFILTER_NODE,KSPIN_WAREOUT_SRC,KSNODE_WAVEOUT_VOUME,1}
{KSNODE_WAVEOUT_VOUME,0,PCFILTER_NODE,KPIN_SPEAKERS_DST}
}
- PIN其实是该Filter对外暴露的惟一接口
- Node内部进行数据处理,但和PIN需要Connection