KSSTREAM_HEADER结构 (ks.h)
KSSTREAM_HEADER结构是一种可变长度结构,用于描述要从流驱动程序引脚读取或写入的数据包。
语法
typedef struct {
ULONG Size;
ULONG TypeSpecificFlags;
KSTIME PresentationTime;
LONGLONG Duration;
ULONG FrameExtent;
ULONG DataUsed;
PVOID Data;
ULONG OptionsFlags;
ULONG Reserved;
} KSSTREAM_HEADER, *PKSSTREAM_HEADER;
成员
Size
指定结构的大小(以字节为单位)。 这至少应 大小(KSSTREAM_HEADER)。
TypeSpecificFlags
指定特定于数据格式的标志。 TypeSpecificFlags 当前支持的唯一标志是KS_AM_UseNewCSSKey。 此标志指示硬件解码器应切换到下一个排队的 CSS(内容 Scramble 系统)解密密钥,因为紧跟标头的数据示例是应用新游戏密钥的第一个数据示例。
PresentationTime
KSTIME 结构,该结构指定 100 纳秒单位中相关流缓冲区的呈现时间。 有关详细信息,请参阅 备注 部分。
Duration
指定此流段的持续时间,其单位与演示时间(100 纳秒单位)相同。 未使用时设置为零。
FrameExtent
指定整个帧的大小。 帧范围中的区域可用于筛选器,流作生成的有效数据大小反映在 DataUsed 成员中。
DataUsed
对于写入作,此成员指定将帧提交到较低级别的驱动程序时帧内有效的字节数。 在写入作上不修改标头;但是,IO_STATUS_BLOCK结构的 信息 成员包含实际写入的字节总数。 对于读取作,将帧提交到较低级别的驱动程序时,不会使用此成员,并且必须设置为零。 返回时,此成员包含实际在此帧中填充的字节数,IO_STATUS_BLOCK结构 信息 成员包含实际使用的标头列表的大小。 请注意,如果微型驱动程序在 KSPIN_DESCRIPTOR_EX中指定KSPIN_FLAG_GENERATE_MAPPINGS,则在流指针超过帧时,DataUsed 设置为 Count 减去 剩余(KSSTREAM_POINTER_OFFSET成员)。 如果驱动程序未指定此标志,则微型驱动程序负责设置 DataUsed。
Data
指定数据缓冲区的虚拟地址。
OptionsFlags
指定数据流的各种属性。 OptionsFlags 成员可以具有下表中列出的值。
价值 | 描述 |
---|---|
KSSTREAM_HEADER_OPTIONSF_DATADISCONTINUITY | 指定在此数据包中包含的数据之前,数据流中存在不连续。 这意味着筛选器可能需要在处理数据之前重置其内部状态。 无需附加实际的数据缓冲区。 |
KSSTREAM_HEADER_OPTIONSF_DURATIONVALID | 指定此结构的 持续时间 成员有效。 |
KSSTREAM_HEADER_OPTIONSF_ENDOFPHOTOSEQUENCE | 指示此帧表示照片序列的末尾。 |
KSSTREAM_HEADER_OPTIONSF_ENDOFSTREAM | 指示此帧表示数据流的末尾。 |
KSSTREAM_HEADER_OPTIONSF_FLUSHONPAUSE | 如果流已暂停,则应刷新此缓冲区。 例如,此标志由实时数据源使用,其中暂停呈现当前数据过时。 |
KSSTREAM_HEADER_OPTIONSF_FRAMEINFO | 指示KSSTREAM_HEADER后有一个KS_FRAME_INFO结构。 |
KSSTREAM_HEADER_OPTIONSF_LOOPEDDATA | 此数据缓冲区是循环数据的开始。 驱动程序应循环访问此数据,直到显式停止。 |
KSSTREAM_HEADER_OPTIONSF_METADATA | 指示KSSTREAM_HEADER后有KS_FRAME_INFO后面的KSSTREAM_METADATA_INFO。 仅当支持KSPROPERTY_CAMERACONTROL_EXTENDED_METADATA时,才会显示此标志。 |
KSSTREAM_HEADER_OPTIONSF_PREROLL | 此缓冲区中的数据用于对设备状态进行质素。 这是特定于流的选项。 |
KSSTREAM_HEADER_OPTIONSF_SPLICEPOINT | 数据流位于连接的自然点。 例如,当发送使用帧间压缩的数据(如 MPEG 视频)时,客户端会使用此客户端来指示此时可以安全地连接数据。 |
KSSTREAM_HEADER_OPTIONSF_TIMEDISCONTINUITY | 此数据包之后,数据流中存在不连续性。 此标志可用于定位型接口,以指示流数据的末尾。 无需附加实际的数据缓冲区。 |
KSSTREAM_HEADER_OPTIONSF_TIMEVALID | 指定此结构的 PresentationTime 成员有效。 指示此缓冲区具有与之关联的有效时间戳。 |
KSSTREAM_HEADER_OPTIONSF_TYPECHANGED | 表示此流的数据格式已更改。 如果设置了此标志,则 Data 成员包含包含新格式的 KSDATAFORMAT 结构。 此标志仅适用于以前协商动态类型更改的流。 对于写入作,请包含新的数据格式来代替媒体示例。 如果修改了特定于媒体的扩展大小,则此标头必须是给定流请求标头列表中的最后一个标头。 在读取请求期间,在通过KSPROPERTY_CONNECTION_DATAFORMAT检索新格式之前,任何其他 I/O 将保持挂起状态。 对于写入作,标头不得扩展,并且必须是写入作中唯一的标头。 |
KSSTREAM_HEADER_OPTIONSF_VRAM_DATA_TRANSFER | 指定流标头的 数据 成员指向 VRAM_SURFACE_INFO类型的结构。 系统提供的 KS 代理模块设置此标志以指示它 直接捕获到 VRAM。 |
KSSTREAM_HEADER_OPTIONSF_BUFFEREDTRANSFER | 指定KSSTREAM_HEADER 数据 成员包含原始缓冲区的内核模式副本。 Ksproxy 在 WVDDM(Windows Vista 显示驱动程序模型)捕获期间为小型数据传输设置此标志。 如果未设置此标志,KS 会将直接 I/O 用于 数据 缓冲区。 |
Reserved
保留供内部使用。
言论
此结构可以遵循内存中特定于数据包中数据类型的其他信息。
呈现时间通常以 100 纳秒为单位;但是,这次的标准格式基于数据格式。 可以通过将呈现时间规范化为KSSTREAM_HEADER的缩放比例。PresentationTime.Numerator 除以KSSTREAM_HEADER。PresentationTime.分母 。
转换应首先使用分母,然后再使用分母,以减少舍入错误。 例如,音频流可能会将当前时间显示为数据流中的字节偏移量:
#define BITS_PER_BYTE8
#define NANOSECONDS10000000
StreamHdr->PresentationTime.Numerator = BITS_PER_BYTE * NANOSECONDS;
StreamHdr->PresentationTime.Denominator = BitsPerSample * Channels * Frequency;
StreamHdr->PresentationTime.Time = ByteOffset;
StreamHdr->Duration = ByteLength;
在IOCTL_KS_READ_STREAM上,流标头的某些部分由调用填充。 每个KSSTREAM_HEADER。DataUsed 元素包含读取的实际字节数,这些字节数小于或等于每个KSSTREAM_HEADER。FrameExtent。 pIrp->IoStatus.Information 元素包含要返回的标头数据的总大小,这是至少一个 大小(KSSTREAM_HEADER)。
在IOCTL_KS_WRITE_STREAM上,必须初始化成员元素以及每个KSSTREAM_HEADER。DataUsed 元素包含要写入的字节数。 写入的实际字节数在 pIrp->IoStatus.Information 中返回。 这小于或等于所有KSSTREAM_HEADER总数。标头中的 DataUsed 元素。
如果使用 IKsReferenceClock 接口获取时间戳以放置在 KSSTREAM_HEADER PresentationTime 成员中,请参阅 AVStream 时钟 了解详细信息。
要求
要求 | 价值 |
---|---|
标头 | ks.h (包括 Ks.h) |