Partager via


Gestion de Stride dans les codecs AVStream

Lorsqu’un décodeur est connecté à un convertisseur comme le convertisseur vidéo amélioré (EVR) ou à un composant qui prend en charge Direct3D, le minidriver reçoit des mémoires tampons D3D au lieu des mémoires tampons système.

Contrairement aux mémoires tampons système, qui doivent être copiées sur une surface D3D avant le rendu, les mémoires tampons D3D peuvent être affichées directement par le moteur de rendu. Par conséquent, en utilisant des mémoires tampons D3D plutôt que des mémoires tampons système, le minidriver enregistre une opération de copie pour chaque mémoire tampon.

Lorsqu’un minidriver compatible AVEC SHED reçoit des mémoires tampons D3D, la surface D3D est verrouillée et un pointeur vers celle-ci se trouve dans KSSTREAM_HEADER. Données. Les informations de foulée de surface sont fournies dans l’extension KS_FRAME_INFO à KSSTREAM_HEADER, comme illustré dans l’exemple de code suivant :

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;

Les minidrivers doivent utiliser le membre biWidth de la structure KS_BITMAPINFOHEADER comme largeur de surface.

(KS_VIDEOINFOHEADER. bmiHeader est de type KS_BITMAPINFOHEADER. KS_DATARANGE_VIDEO. VideoInfoHeader est de type KS_VIDEOINFOHEADER.)

Si KS_FRAME_INFO. lSurfacePitch a une valeur différente de zéro. Le minidriver doit utiliser lSurfacePitch comme largeur/foulée pour la mémoire tampon spécifiée dans le KSSTREAM_HEADER associé. Dans le cas contraire, l’image de sortie apparaît en état de tronquée.