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.