Обработка шага в кодеках AVStream
При подключении декодера к такому отрисовщику, как расширенный отрисовщик видео (EVR) или компонент, поддерживающий Direct3D, мини-диск получает буферы D3D вместо буферов системной памяти.
В отличие от буферов системной памяти, которые необходимо скопировать на поверхность D3D перед отрисовкой, буферы D3D могут отображаться непосредственно подсистемой отрисовки. Таким образом, используя буферы D3D вместо буферов системной памяти, мини-диск сохраняет операцию копирования для каждого буфера.
Когда мини-диск с поддержкой SHED получает буферы D3D, поверхность D3D блокируется, а указатель на нее находится в KSSTREAM_HEADER. Данные. Сведения о шаге поверхности предоставляются в расширении KS_FRAME_INFO для KSSTREAM_HEADER, как показано в следующем примере кода:
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;
Мини-драйверы должны использовать элемент biWidthструктуры KS_BITMAPINFOHEADER в качестве ширины поверхности.
(KS_VIDEOINFOHEADER. BmiHeader имеет тип KS_BITMAPINFOHEADER. KS_DATARANGE_VIDEO. VideoInfoHeader имеет тип KS_VIDEOINFOHEADER.)
Если KS_FRAME_INFO. Значение lSurfacePitch не равно нулю. Мини-driver должен использовать lSurfacePitch в качестве ширины или шага для буфера, указанного в связанном KSSTREAM_HEADER. В противном случае выходное изображение будет искажено.