处理 AVStream 编解码器中的步幅
当解码器连接到呈现器(如增强型视频呈现器 (EVR) 或支持 Direct3D 的组件)时,微型驱动程序将接收 D3D 缓冲区而不是系统内存缓冲区。
与呈现前必须复制到 D3D 图面的系统内存缓冲区不同,D3D 缓冲区可以直接由呈现引擎显示。 因此,通过使用 D3D 缓冲区而不是系统内存缓冲区,微型驱动程序会为每个缓冲区保存复制操作。
当支持 SHED 的微型驱动程序接收 D3D 缓冲区时,D3D 图面将被锁定,并且指向它的指针位于 KSSTREAM_HEADER中。数据。 图面步幅信息在 KSSTREAM_HEADER KS_FRAME_INFO 扩展中提供,如以下代码示例所示:
typedef struct KS_FRAME_INFO {
ULONG ExtendedHeaderSize; // Size of this extended header
DWORD dwFrameFlags; // Field1, Field2, or Frame
LONGLONG PictureNumber;
LONGLONG DropCount;
// The following are only set when you use OverlayMixer
HANDLE hDirectDraw; // user mode DDraw handle
HANDLE hSurfaceHandle; // user mode surface handle
RECT DirectDrawRect; // portion of surface locked
union {
LONG lSurfacePitch; // Contains surface pitch a.k.a stride
DWORD Reserved1;
};
// Reserved fields, never reference these
DWORD Reserved2;
DWORD Reserved3;
DWORD Reserved4;
} KS_FRAME_INFO, *PKS_FRAME_INFO;
微型驱动程序应使用KS_BITMAPINFOHEADER结构的 biWidth 成员作为图面宽度。
(KS_VIDEOINFOHEADER。bmiHeader 的类型为 KS_BITMAPINFOHEADER。 KS_DATARANGE_VIDEO。VideoInfoHeader 的类型为 KS_VIDEOINFOHEADER.)
如果KS_FRAME_INFO。lSurfacePitch 具有非零值,微型驱动程序必须使用 lSurfacePitch 作为相关KSSTREAM_HEADER中指定的缓冲区的宽度/步幅。 否则,输出图像会出现乱码。