Поделиться через


Обработка шага в кодеках 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. В противном случае выходное изображение будет искажено.