处理数据

[与此页面关联的功能 DirectShow 是旧版功能。 它已被 MediaPlayerIMFMediaEngineMedia Foundation 中的音频/视频捕获所取代。 这些功能已针对Windows 10和Windows 11进行了优化。 Microsoft 强烈建议新代码尽可能在 Media Foundation 中使用 MediaPlayerIMFMediaEngine音频/视频捕获 ,而不是 DirectShow。 如果可能,Microsoft 建议重写使用旧 API 的现有代码以使用新 API。]

分析媒体数据

如果筛选器分析媒体数据,请不要信任内容中的标头或其他自描述数据。 例如,不要信任在 AVI RIFF 区块或 MPEG 数据包中显示的大小值。 此类错误的常见示例包括:

  • 读取 N 个字节的数据,其中 N 的值来自内容,而不检查 N 与缓冲区的实际大小。
  • 跳转到缓冲区内的字节偏移量,但不验证偏移量是否在缓冲区内。

另一类常见错误涉及不验证内容中找到的格式说明。 例如:

  • BITMAPINFOHEADER 结构后跟颜色表。 BITMAPINFO 结构定义为 BITMAPINFOHEADER 结构,后跟构成颜色表的 RGBQUAD 值数组。 数组的大小由 biClrUsed 的值决定。 在未首先检查为 BITMAPINFO 结构分配的缓冲区大小的情况下,切勿将颜色表复制到 BITMAPINFO 中。
  • WAVEFORMATEX 结构可能追加了额外的格式信息。 cbSize 成员指定额外信息的大小。

在引脚连接期间,筛选器应验证所有格式结构的格式是否正确且包含合理的值。 如果没有,请拒绝连接。 在验证格式结构的代码中,请特别注意算术溢出。 例如,在 BITMAPINFOHEADER 中,宽度和高度是 32 位 值,但图像大小 (这两个) 的乘积只是 一个 DWORD 值。

如果格式化源中的数据大于分配的缓冲区,请不要截断源数据,以便将其复制到缓冲区中。 这样做可以创建一个结构,其隐式大小大于其实际大小。 例如,位图标头可能指定不再存在的调色板表。 相反,请重新分配缓冲区或直接使连接失败。

流式处理期间的错误

当图形运行时,如果筛选器收到格式不正确的内容,它应终止流式处理。 请执行以下操作:

格式更改

存在多种机制,筛选器可在流中更改格式。 每个步骤都涉及多个步骤,这可能会导致错误接受。 如果筛选器收到动态格式更改请求,则它必须拒绝请求,或者在新格式到达时遵循新格式。 同样,除非其他筛选器同意,否则切勿切换格式。 有关详细信息,请参阅 动态格式更改