AVStream コーデックのストライド処理

デコーダーが拡張ビデオ レンダラー (EVR) や Direct3D をサポートするコンポーネントなどのレンダラーに接続されている場合、ミニドライバーはシステム メモリ バッファーではなく D3D バッファーを受け取ります。

レンダリングの前に D3D サーフェスにコピーする必要があるシステム メモリ バッファーとは異なり、D3D バッファーはレンダリング エンジンによって直接表示できます。 したがって、ミニドライバーは、システム メモリ バッファーではなく D3D バッファーを使用して、バッファーごとにコピー操作を保存します。

SHED 対応ミニドライバーが D3D バッファーを受け取ると、D3D サーフェスがロックされ、そのポインターが KSSTREAM_HEADER.Data に配置されます。 サーフェス ストライド情報は、次のコード例に示すように、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 に 0 以外の値がある場合、ミニドライバーは、関連する KSSTREAM_HEADER で指定されたバッファーの幅/ストライドとして lSurfacePitch を使用する必要があります。 それ以外の場合は、出力イメージが正しく表示されません。