针对视频子流和目标图面的操作

本部分仅适用于 Windows Server 2003 SP1 及更高版本,以及 SP2 和更高版本 Windows XP。

Microsoft Windows Server 2003 SP1 及更高版本以及 Windows XP SP2 及更高版本上的 VMR 必须能够对视频子流和目标表面执行特定操作。

视频子流图面上的操作

除了视频子流上的操作图面上驱动程序的 DeinterlaceBltExDeinterlaceBlt 函数执行的操作,驱动程序必须支持以下操作:

颜色填充子流图面
VMR 和其他 Microsoft DirectShow 组件必须能够将视频子流表面填充到已知的初始颜色值,如透明黑色。 因此,你的驱动程序应使用 DDBLT_COLORFILL 标志支持对其 DdBlt 回调函数的调用,其中视频子流表面是位块传输的目标 (blt) 。

对于 AYUV FOURCC 格式的视频子流图面,VMR 在 dwFillColor 结构的 DDBLTFX 成员中指定透明黑色的 AYUV 颜色。 当调用其DdBlt函数时,驱动程序会在 DD_BLTDATA 结构的bltFX成员中接收 DDBLTFX。 有关 DDBLTFX 结构的信息,请参阅 Windows SDK 文档。

透明黑色的 AYUV 颜色设置如下:

DXVA_AYUVsample2 clr; 
clr.bCrValue = 0x80;
clr.bCbValue = 0x80;
clr.bY_Value = 0x10;
clr.bSampleAlpha8 = 0x00;
DWORD dwFillColor = *(DWORD*)&clr;

对于具有 AI44 或 IA44 格式的视频子流图面, dwFillColor 成员中值的低序位字节指示驱动程序应用于填充图面的颜色值。 通常,颜色值为0。

将内容复制到子流图面
Line21 隐藏式字幕解码器和 teletext 解码器创建包含一系列缓存字符标志符号的源视频子流图面。 驱动程序应通过将相应的字符从字形缓存复制到视频子流图面来生成每个输出帧。 然后,VMR 将视频子流表面发送到驱动程序的 DeinterlaceBltEx 函数。

因此,驱动程序的 DdBlt 函数应支持将任何 FOURCC 图面复制到相同 FOURCC 格式的视频子流表面。

你的驱动程序应指示它支持通过设置DDCORECAPS结构的dwCaps2成员中的 DDCAPS2_COPYFOURCC 标志来复制 FOURCC 格式。 驱动程序在DD_HALINFO结构的ddCaps成员中指定 DDCORECAPS 结构。 DD_HALINFO 由驱动程序的 DrvGetDirectDrawInfo 函数返回。

在 FOURCC 视频子流表面复制操作中,驱动程序不应执行拉伸或颜色空间转换操作。

针对目标面的操作

您的驱动程序必须支持在您的驱动程序的 DeinterlaceBltEx 函数中使用的目标表面上执行以下操作:

填充目标图面的颜色
由于 VMR 必须将目标图面初始化为 YUV 不透明黑色,因此,驱动程序还必须使用 DDBLT_COLORFILL 标志支持对其 DdBlt 回调函数的调用,其中,位块传输的目标是目标面。 VMR 指定 DDBLTFX 结构的 dwFillColor 成员中不透明黑色的颜色。 当调用DdBlt时,驱动程序会在 DD_BLTDATA 结构的bltFX成员中接收 DDBLTFX 结构。

对于 YUV 打包的图面类型,VMR 将填充颜色 DWORD 设置为适用于不透明黑色的适当字节模式。 对于 YUY2 表面,不透明黑色的填充颜色 DWORD 为0x80108010。

对于平面表面类型,VMR 设置不透明黑色的 AYUV 颜色,如下所示:

DXVA_AYUVsample2 clr; 
clr.bCrValue = 0x80;
clr.bCbValue = 0x80;
clr.bY_Value = 0x10;
clr.bSampleAlpha8 = 0xFF;
DWORD dwFillColor = *(DWORD*)&clr;

您的驱动程序应确保将正确的像素值写入到 YUV 图面的每个平面。

拉伸目标图面
你的驱动程序还必须支持用作位块传输的源图面的位块传输的源图面,此操作组合拉伸操作和颜色空间转换。 有关详细信息,请参阅 支持 Stretch Array.blit 操作

从目标图面复制内容
驱动程序的 DdBlt 函数必须支持将 FOURCC 目标图面复制到相同 FOURCC 格式的表面。 目标图面用作复制操作中的源图面。 驱动程序应指示它支持通过设置 DDCAPS2_COPYFOURCC 标志来复制 FOURCC 格式。

位块传输操作的目标图面可以是主要表面或 Direct3D 纹理。