Compartilhar via


Manipulando Stride em codecs AVStream

Quando um decodificador é conectado a um renderizador como eVR (Renderizador de Vídeo Avançado) ou um componente que dá suporte ao Direct3D, o minidriver recebe buffers D3D em vez de buffers de memória do sistema.

Ao contrário dos buffers de memória do sistema, que devem ser copiados para uma superfície D3D antes da renderização, os buffers D3D podem ser exibidos diretamente pelo mecanismo de renderização. Portanto, usando buffers D3D em vez de buffers de memória do sistema, o minidriver salva uma operação de cópia para cada buffer.

Quando um minidriver compatível com SHED recebe buffers D3D, a superfície D3D é bloqueada e um ponteiro para ele está localizado em KSSTREAM_HEADER. Dados. As informações de avanço da superfície são fornecidas na extensão KS_FRAME_INFO para KSSTREAM_HEADER, conforme mostrado no exemplo de código a seguir:

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;

Os minidrivers devem usar o membro biWidth da estrutura KS_BITMAPINFOHEADER como a largura da superfície.

(KS_VIDEOINFOHEADER. bmiHeader é do tipo KS_BITMAPINFOHEADER. KS_DATARANGE_VIDEO. VideoInfoHeader é do tipo KS_VIDEOINFOHEADER.)

Se KS_FRAME_INFO. LSurfacePitch tem um valor diferente de zero, o minidriver deve usar lSurfacePitch como a largura/passo para o buffer especificado no KSSTREAM_HEADER relacionado. Caso contrário, a imagem de saída aparecerá embaralhada.