VMR 中的坐标映射

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

本部分介绍在 VMR 映射到最终输出映像之前应用于源映像的五个转换。

  1. 转换 T(Src) 源矩形映射到目标矩形。 这些属性由 rcSourcercTargetVIDEOINFOHEADER 或媒体类型中的 VIDEOINFOHEADER2 结构的成员指定。 此映射在传递给 VMR 时预处理源映像。
  2. 转换 T(Flag) 执行媒体示例中标志指定的任何图像作。 这些转换包括垂直转换和缩放以适应 bob 交错标志。 交错转换将图像高度加倍,如果图像位于奇数领域,则可能会将图像转换为视频线的一半。
  3. 转换 T(AR) 根据图像纵横比将图像调整为平方像素。 对于 VIDEOINFOHEADER 媒体类型,纵横比由图像大小决定。 对于 VIDEOINFOHEADER2 类型,纵横比由 dwPictAspectRatioXdwPictAspectRatioY 字段确定,除非设置了AMCONTROL_PAD_TO_16x9或AMCONTROL_PAD_TO_4x3标志。 此转换假定监视器显示设置与监视器的物理纵横比匹配。 例如,如果用户具有 4 x 3 纵横比的监视器,但将显示器设置为 1280 x 768 像素(5 x 3),则图像将没有正确的纵横比。
  4. 转换 T(Mix) 转换使用 IVMRMixerControl 方法中指定的规范化矩形将图像定位到目标图像中。 规范化矩形使应用程序能够组织源流的定位方式并相互缩放。 VMR 通过计算所有源图像的最大尺寸并在整体边界矩形内居中每个图像来计算目标图像。 边界矩形的角将范围 (0,0) 分配给 (1,1)。 边界矩形在图形运行之前是固定的,即使添加或删除了流,也保持不变。 每个流的目标矩形可以位于范围 (0,0) 到 (1,1) 之外,并且仍然有效。
  5. 最后,可以通过映射 T(Dst)转换混合映像的一部分,该映射由 VMR 上的 IBasicVideo 接口中的源矩形和目标矩形指定。 如果未使用 Allocator-Presenter 并且未使用 IBasicVideo 接口,则应用程序必须实现 IVMRWindowlessControl 接口,并将坐标映射回二维线性空间。 返回到 DVD 导航器的鼠标坐标也必须在此空间中。 例如,如果应用程序将视频呈现到旋转的多维数据集上,它们将报告无窗口控件的整个显示,并返回相对于显示器的鼠标坐标。

从源数据到最终呈现器的总体图像转换为:

T = T(Src)* T(Flag)T(Ar)T(Mix)* T(Dst)*

其中 * 指示图像可以剪切到该阶段的目标图像。 请注意,这些都是仿射转换,因此 VMR 可以将它们合并为单个转换。

转换的反函数为:

逆转换

因子 T(Src) T(Flag) T(Ar) 相对于源分辨率。 在因子 T(Mix 中),规范化源矩形相对于方面更正的图像。 规范化目标矩形相对于输出分辨率。 下图显示了这些关系。

映像转换步骤

将 VMR 用于 DirectShow 筛选器开发人员