Gestione di Stride nei codec AVStream
Quando un decodificatore è connesso a un renderer come EVR (Enhanced Video Renderer) o a un componente che supporta Direct3D, il minidriver riceve buffer D3D anziché buffer di memoria di sistema.
A differenza dei buffer di memoria di sistema, che devono essere copiati in una superficie D3D prima del rendering, i buffer D3D possono essere visualizzati direttamente dal motore di rendering. Pertanto, usando buffer D3D anziché buffer di memoria di sistema, il minidriver salva un'operazione di copia per ogni buffer.
Quando un minidriver che supporta SHED riceve buffer D3D, la superficie D3D è bloccata e un puntatore a esso si trova in KSSTREAM_HEADER. Dati. Le informazioni sullo stride di superficie vengono fornite nell'estensione KS_FRAME_INFO a KSSTREAM_HEADER , come illustrato nell'esempio di codice seguente:
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;
I minidriver devono usare il membro biWidth della struttura KS_BITMAPINFOHEADER come larghezza della superficie.
(KS_VIDEOINFOHEADER. bmiHeader è di tipo KS_BITMAPINFOHEADER. KS_DATARANGE_VIDEO. VideoInfoHeader è di tipo KS_VIDEOINFOHEADER.
Se KS_FRAME_INFO. lSurfacePitch ha un valore diverso da zero, il minidriver deve usare lSurfacePitch come larghezza/stride per il buffer specificato nel KSSTREAM_HEADER correlato. In caso contrario, viene visualizzata l'immagine di output.