Condividi tramite


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.