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.