Controlar el paso en los códecs de AVStream
Cuando un descodificador está conectado a un representador como El representador de vídeo mejorado (EVR) o un componente que admite Direct3D, el minidriver recibe búferes D3D en lugar de búferes de memoria del sistema.
A diferencia de los búferes de memoria del sistema, que se deben copiar en una superficie D3D antes de la representación, el motor de representación puede mostrar directamente los búferes D3D. Por lo tanto, mediante el uso de búferes D3D en lugar de búferes de memoria del sistema, el minidriver guarda una operación de copia para cada búfer.
Cuando un minidriver compatible con SHED recibe búferes D3D, la superficie D3D está bloqueada y un puntero a él se encuentra en KSSTREAM_HEADER. Datos. La información del intervalo de superficie se proporciona en la extensión KS_FRAME_INFO para KSSTREAM_HEADER, como se muestra en el ejemplo de código siguiente:
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;
Los minidrivers deben usar el miembro biWidth de la estructura KS_BITMAPINFOHEADER como ancho de superficie.
(KS_VIDEOINFOHEADER. indexHeader es de tipo KS_BITMAPINFOHEADER. KS_DATARANGE_VIDEO. VideoInfoHeader es de tipo KS_VIDEOINFOHEADER).
Si KS_FRAME_INFO. lSurfacePitch tiene un valor distinto de cero, el minidriver debe usar lSurfacePitch como ancho o paso para el búfer especificado en el KSSTREAM_HEADER relacionado. De lo contrario, la imagen de salida aparece engrasada.