处理 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_VIDEOINFOHEADERbmiHeader 的类型为 KS_BITMAPINFOHEADER。 KS_DATARANGE_VIDEOVideoInfoHeader 的类型为 KS_VIDEOINFOHEADER.)

如果KS_FRAME_INFO。lSurfacePitch 具有非零值,微型驱动程序必须使用 lSurfacePitch 作为相关KSSTREAM_HEADER中指定的缓冲区的宽度/步幅。 否则,输出图像会出现乱码。