Freigeben über


Behandeln von Stride in AVStream-Codecs

Wenn ein Decoder mit einem Renderer wie Enhanced Video Renderer (EVR) oder einer Komponente verbunden ist, die Direct3D unterstützt, empfängt der Minidriver D3D-Puffer anstelle von Systemspeicherpuffern.

Im Gegensatz zu Systemspeicherpuffern, die vor dem Rendern auf eine D3D-Oberfläche kopiert werden müssen, können D3D-Puffer direkt von der Render-Engine angezeigt werden. Daher speichert der Minidriver durch verwendung von D3D-Puffern anstelle von Systemspeicherpuffern einen Kopiervorgang für jeden Puffer.

Wenn ein SHED-fähiger Minidriver D3D-Puffer empfängt, wird die D3D-Oberfläche gesperrt, und ein Zeiger darauf befindet sich in KSSTREAM_HEADER. Daten. Die Oberflächenschrittinformationen werden in der KS_FRAME_INFO-Erweiterung für KSSTREAM_HEADER bereitgestellt, wie im folgenden Codebeispiel gezeigt:

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;

Minidriver sollten das biWidth-Element der KS_BITMAPINFOHEADER-Struktur als Oberflächenbreite verwenden.

(KS_VIDEOINFOHEADER. bmiHeader ist vom Typ KS_BITMAPINFOHEADER. KS_DATARANGE_VIDEO. VideoInfoHeader ist vom Typ KS_VIDEOINFOHEADER.)

Wenn KS_FRAME_INFO. lSurfacePitch hat einen nonzero-Wert. Der Minidriver muss lSurfacePitch als width/stride für den Puffer verwenden, der im zugehörigen KSSTREAM_HEADER angegeben wird. Andernfalls wird das Ausgabebild verworren angezeigt.