Обработка видео DXVA

Обработка видео DXVA инкапсулирует функции графического оборудования, посвященного обработке несжатых изображений видео. Службы обработки видео включают деинтерлакирование и сочетание видео.

Этот раздел состоит из следующих подразделов.

Обзор

Графическое оборудование может использовать модуль обработки графики (GPU) для обработки несжатых изображений видео. Устройство обработки видео — это программный компонент, инкапсулирующий эти функции. Приложения могут использовать устройство обработки видео для выполнения таких функций, как:

  • Деинтерлакирование и обратная телецина
  • Перемешивание подпотоков видео на основное видео
  • Изменение цвета (ProcAmp) и фильтрация изображений
  • Масштабирование изображений
  • Преобразование цветового пространства
  • Альфа-смешение

На следующей схеме показаны этапы конвейера обработки видео. Схема не предназначена для отображения фактической реализации. Например, графический драйвер может объединить несколько этапов в одну операцию. Все эти операции можно выполнять в одном вызове устройства обработки видео. Некоторые этапы, показанные здесь, такие как фильтрация шума и детализации, могут не поддерживаться драйвером.

diagram showing the stages of dxva video processing.

Входные данные конвейера обработки видео всегда включают основной видеопоток, содержащий основные данные изображения. Основной видеопоток определяет частоту кадров для выходного видео. Каждый кадр выходного видео вычисляется относительно входных данных из основного видеопотока. Пиксели в основном потоке всегда непрозрачны, без альфа-данных на пиксель. Основной видеопоток может быть прогрессивным или перемешанным.

При необходимости конвейер обработки видео может получать до 15 подпотоков видео. Подпоток содержит вспомогательные данные изображения, такие как закрытые подпись или подпирики DVD. Эти изображения отображаются над основным видеопотоком и обычно не предназначены для отображения сами по себе. Вложенные изображения могут содержать альфа-данные на пиксель и всегда являются прогрессивными кадрами. Устройство обработки видео альфа-смешает вложенные изображения с текущим деинтерлакированного кадра из основного видеопотока.

В оставшейся части этого раздела рисунок термина используется для входных данных на устройство обработки видео. Изображение может состоять из прогрессивного кадра, одного поля или двух чередуемых полей. Выходные данные всегда являются деинтерлакированного кадра.

Видео драйвер может реализовать несколько устройств обработки видео, чтобы предоставить различные наборы возможностей обработки видео. Устройства идентифицируются по GUID. Предопределены следующие идентификаторы GUID:

  • DXVA2_VideoProcBobDevice. Это устройство выполняет деинтерлакирование боба.
  • DXVA2_VideoProcProgressiveDevice. Это устройство используется, если видео содержит только прогрессивные кадры без чередуемых кадров. (Некоторые видеоматериалы содержат сочетание прогрессивных и чередуемых кадров. Прогрессивное устройство не может использоваться для такого рода смешанного содержимого видео, так как для чередующихся кадров требуется шаг деинтерлакирования.)

Каждый графический драйвер, поддерживающий обработку видео DXVA, должен реализовать по крайней мере эти два устройства. Графический драйвер также может предоставлять другие устройства, которые определяются идентификаторами GUID для конкретного драйвера. Например, драйвер может реализовать собственный алгоритм деинтерлакирования, который создает более качественные выходные данные, чем боб deinterlacing. Для некоторых алгоритмов деинтерлакации может потребоваться переадресация или обратное эталонные изображения из основного потока. Если это так, вызывающий объект должен предоставить эти изображения драйверу в правильной последовательности, как описано далее в этом разделе.

Также предоставляется эталонное программное устройство. Программное устройство оптимизировано для качества, а не скорости, и может быть недостаточно для обработки видео в режиме реального времени. Эталонное программное устройство использует значение GUID DXVA2_VideoProcSoftwareDevice.

Создание устройства обработки видео

Прежде чем использовать обработку видео DXVA, приложение должно создать устройство обработки видео. Ниже приведен краткий обзор шагов, которые подробно описаны в оставшейся части этого раздела:

  1. Получите указатель на интерфейс IDirectXVideoProcessorService.
  2. Создайте описание формата видео для основного видеопотока. Используйте это описание, чтобы получить список устройств обработки видео, поддерживающих формат видео. Устройства идентифицируются по GUID.
  3. Для конкретного устройства получите список форматов отрисовки, поддерживаемых устройством. Форматы возвращаются в виде списка D3DFORMAT значений. Если вы планируете смешивать подпотоки, получите список поддерживаемых форматов подпотоков.
  4. Запрос возможностей каждого устройства.
  5. Создайте устройство обработки видео.

Иногда некоторые из этих шагов можно опустить. Например, вместо получения списка форматов, предназначенных для отрисовки, можно просто попытаться создать устройство обработки видео с предпочитаемым форматом и узнать, успешно ли оно выполнено. Общий формат, например D3DFMT_X8R8G8B8, скорее всего, будет успешным.

Остальная часть этого раздела подробно описывает эти действия.

Получение указателя IDirectXVideoProcessorService

Интерфейс IDirectXVideoProcessorService получается с устройства Direct3D. Существует два способа получения указателя на этот интерфейс:

Если у вас есть указатель на устройство Direct3D, можно получить указатель IDirectXVideoProcessorService, вызвав функцию DXVA2CreateVideoService. Передайте указатель на интерфейс IDirect3Device9 устройства и укажите IID_IDirectXVideoProcessorService для параметра riid, как показано в следующем коде:

    // Create the DXVA-2 Video Processor service.
    hr = DXVA2CreateVideoService(g_pD3DD9, IID_PPV_ARGS(&g_pDXVAVPS));

n некоторые случаи, один объект создает устройство Direct3D, а затем использует его с другими объектами через Диспетчер устройств Direct3D. В этой ситуации можно вызвать IDirect3DDeviceManager9::GetVideoService в диспетчере устройств, чтобы получить указатель IDirectXVideoProcessorService, как показано в следующем коде:

HRESULT GetVideoProcessorService(
    IDirect3DDeviceManager9 *pDeviceManager,
    IDirectXVideoProcessorService **ppVPService
    )
{
    *ppVPService = NULL;

    HANDLE hDevice;

    HRESULT hr = pDeviceManager->OpenDeviceHandle(&hDevice);
    if (SUCCEEDED(hr))
    {
        // Get the video processor service 
        HRESULT hr2 = pDeviceManager->GetVideoService(
            hDevice, 
            IID_PPV_ARGS(ppVPService)
            );

        // Close the device handle.
        hr = pDeviceManager->CloseDeviceHandle(hDevice);

        if (FAILED(hr2))
        {
            hr = hr2;
        }
    }

    if (FAILED(hr))
    {
        SafeRelease(ppVPService);
    }

    return hr;
}

Перечисление устройств обработки видео

Чтобы получить список устройств обработки видео, заполните структуру DXVA2_VideoDesc форматом основного видеопотока и передайте эту структуру в метод IDirectXVideoProcessorService::GetVideoProcessorDeviceGuids. Метод возвращает массив идентификаторов GUID, по одному для каждого устройства обработки видео, которое можно использовать с этим форматом видео.

Рассмотрим приложение, которое отображает видеопоток в формате YUY2 с помощью определения цвета YUV BT.709 с частотой кадров 29,97 кадров в секунду. Предположим, что видеоконтент состоит полностью из прогрессивных кадров. В следующем фрагменте кода показано, как заполнить описание формата и получить идентификаторы графического интерфейса устройства:

    // Initialize the video descriptor.

    g_VideoDesc.SampleWidth                         = VIDEO_MAIN_WIDTH;
    g_VideoDesc.SampleHeight                        = VIDEO_MAIN_HEIGHT;
    g_VideoDesc.SampleFormat.VideoChromaSubsampling = DXVA2_VideoChromaSubsampling_MPEG2;
    g_VideoDesc.SampleFormat.NominalRange           = DXVA2_NominalRange_16_235;
    g_VideoDesc.SampleFormat.VideoTransferMatrix    = EX_COLOR_INFO[g_ExColorInfo][0];
    g_VideoDesc.SampleFormat.VideoLighting          = DXVA2_VideoLighting_dim;
    g_VideoDesc.SampleFormat.VideoPrimaries         = DXVA2_VideoPrimaries_BT709;
    g_VideoDesc.SampleFormat.VideoTransferFunction  = DXVA2_VideoTransFunc_709;
    g_VideoDesc.SampleFormat.SampleFormat           = DXVA2_SampleProgressiveFrame;
    g_VideoDesc.Format                              = VIDEO_MAIN_FORMAT;
    g_VideoDesc.InputSampleFreq.Numerator           = VIDEO_FPS;
    g_VideoDesc.InputSampleFreq.Denominator         = 1;
    g_VideoDesc.OutputFrameFreq.Numerator           = VIDEO_FPS;
    g_VideoDesc.OutputFrameFreq.Denominator         = 1;

    // Query the video processor GUID.

    UINT count;
    GUID* guids = NULL;

    hr = g_pDXVAVPS->GetVideoProcessorDeviceGuids(&g_VideoDesc, &count, &guids);

Код для этого примера взят из примера пакета SDK DXVA2_VideoProc .

Массив pGuids в этом примере выделяется методом GetVideoProcessorDeviceGuids, поэтому приложение должно освободить массив путем вызова CoTaskMemFree. Остальные шаги можно выполнить с помощью любого из идентификаторов GUID устройства, возвращаемых этим методом.

Перечисление форматов render-Target

Чтобы получить список форматов, поддерживаемых устройством, передайте GUID устройства и структуру DXVA2_VideoDesc в метод IDirectXVideoProcessorService::GetVideoProcessorRenderTargets, как показано в следующем коде:

    // Query the supported render-target formats.

    UINT i, count;
    D3DFORMAT* formats = NULL;

    HRESULT hr = g_pDXVAVPS->GetVideoProcessorRenderTargets(
        guid, &g_VideoDesc, &count, &formats);

    if (FAILED(hr))
    {
        DBGMSG((L"GetVideoProcessorRenderTargets failed: 0x%x.\n", hr));
        return FALSE;
    }

    for (i = 0; i < count; i++)
    {
        if (formats[i] == VIDEO_RENDER_TARGET_FORMAT)
        {
            break;
        }
    }

    CoTaskMemFree(formats);

    if (i >= count)
    {
        DBGMSG((L"The device does not support the render-target format.\n"));
        return FALSE;
    }

Метод возвращает массив значений D3DFORMAT . В этом примере, где тип входных данных — YUY2, типичный список форматов может быть D3DFMT_X8R8G8B8 (32-разрядная RGB) и D3DMFT_YUY2 (входной формат). Однако точный список будет зависеть от драйвера.

Список доступных форматов для подпотоков может отличаться в зависимости от формата целевого отрисовки и входного формата. Чтобы получить список вложенных форматов, передайте GUID устройства, структуру формата и целевой формат отрисовки в метод IDirectXVideoProcessorService::GetVideoProcessorSubStreamFormats , как показано в следующем коде:

    // Query the supported substream formats.

    formats = NULL;

    hr = g_pDXVAVPS->GetVideoProcessorSubStreamFormats(
        guid, &g_VideoDesc, VIDEO_RENDER_TARGET_FORMAT, &count, &formats);

    if (FAILED(hr))
    {
        DBGMSG((L"GetVideoProcessorSubStreamFormats failed: 0x%x.\n", hr));
        return FALSE;
    }

    for (i = 0; i < count; i++)
    {
        if (formats[i] == VIDEO_SUB_FORMAT)
        {
            break;
        }
    }

    CoTaskMemFree(formats);

    if (i >= count)
    {
        DBGMSG((L"The device does not support the substream format.\n"));
        return FALSE;
    }

Этот метод возвращает другой массив значений D3DFORMAT . Типичные форматы подпотоков — AYUV и AI44.

Запрос возможностей устройства

Чтобы получить возможности конкретного устройства, передайте GUID устройства, структуру формата и целевой формат отрисовки в метод IDirectXVideoProcessorService::GetVideoProcessorCaps. Метод заполняет структуру DXVA2_VideoProcessorCaps возможностями устройства.

    // Query video processor capabilities.

    hr = g_pDXVAVPS->GetVideoProcessorCaps(
        guid, &g_VideoDesc, VIDEO_RENDER_TARGET_FORMAT, &g_VPCaps);

    if (FAILED(hr))
    {
        DBGMSG((L"GetVideoProcessorCaps failed: 0x%x.\n", hr));
        return FALSE;
    }

Создание устройства

Чтобы создать устройство обработки видео, вызовите IDirectXVideoProcessorService::CreateVideoProcessor. Входные данные этого метода — это GUID устройства, описание формата, формат отрисовки и максимальное количество вложенных потоков, которые планируется смешивать. Метод возвращает указатель на интерфейс IDirectXVideoProcessor , представляющий устройство обработки видео.

    // Finally create a video processor device.

    hr = g_pDXVAVPS->CreateVideoProcessor(
        guid,
        &g_VideoDesc,
        VIDEO_RENDER_TARGET_FORMAT,
        SUB_STREAM_COUNT,
        &g_pDXVAVPD
        );

Видеопроцесс Blit

Основная операция обработки видео — это обрезка видеообработки. (Blit — это любая операция, которая объединяет два или более растровых изображений в одну растровую карту. Видеообработка объединяет входные изображения для создания выходного кадра.) Чтобы выполнить обработку видео, вызовите IDirectXVideoProcessor::VideoProcessBlt. Этот метод передает набор примеров видео на устройство обработки видео. В ответ устройство обработки видео обрабатывает входные изображения и создает один выходной кадр. Обработка может включать деинтерлакирование, преобразование цветового пространства и перемешивание подпотока. Выходные данные записываются в целевую область, предоставляемую вызывающим элементом.

Метод VideoProcessBlt принимает следующие параметры:

  • pRT указывает на целевую поверхность отрисовки IDirect3DSurface9 , которая получит обработанный видеокадр.
  • pBltParams указывает на структуру DXVA2_VideoProcessBltParams , указывающую параметры для ячейки.
  • pSamples — это адрес массива DXVA2_VideoSample структур. Эти структуры содержат входные образцы для блочной щели.
  • NumSamples предоставляет размер массива pSamples.
  • Зарезервированный параметр зарезервирован и должен иметь значение NULL.

В массиве pSamples вызывающий объект должен предоставить следующие входные примеры:

  • Текущее изображение из основного видеопотока.
  • Переадресация и обратное эталонные рисунки, если это требуется алгоритмом деинтерлакации.
  • От нуля до 15 подпотоков.

Драйвер ожидает, что этот массив должен находиться в определенном порядке, как описано в примере ввода.

Параметры Blit

Структура DXVA2_VideoProcessBltParams содержит общие параметры для ячейки. Наиболее важные параметры хранятся в следующих элементах структуры:

  • TargetFrame — это время представления выходного кадра. Для прогрессивного содержимого на этот раз должно быть равно времени начала текущего кадра из основного видеопотока. На этот раз указывается в элементе start структуры DXVA2_VideoSample для этого входного примера.

    Для чередуемого содержимого кадр с двумя чередуемых полей создает два деинтерлакированных выходных кадра. На первом выходном кадре время презентации должно быть равно времени начала текущего рисунка в основном видеопотоке, как и прогрессивное содержимое. Во втором выходном кадре время начала должно быть равно середине между временем начала текущего рисунка в основном видеопотоке и временем начала следующего рисунка в потоке. Например, если входное видео составляет 25 кадров в секунду (50 полей в секунду), выходные кадры будут иметь метки времени, показанные в следующей таблице. Метки времени отображаются в единицах 100 наносекунд.

    Входной рисунок TargetFrame (1) TargetFrame (2)
    0 0 200000
    400000 0 600 000
    800000 800000 1000 000
    1200000 1200000 1400000

     

    Если переплетаемое содержимое состоит из отдельных полей, а не чередуемых полей, время вывода всегда совпадает с временем ввода, как и с прогрессивным содержимым.

  • TargetRect определяет прямоугольную область в области назначения. В этом регионе будут записываться выходные данные. В частности, каждый пиксель внутри TargetRect будет изменен, и никакие пиксели за пределами TargetRect не будут изменены. Целевой прямоугольник определяет ограничивающий прямоугольник для всех входных видеопотоков. Размещение отдельных потоков в этом прямоугольнике контролируется с помощью параметра pSamples iDirectXVideoProcessor::VideoProcessBlt.

  • BackgroundColor предоставляет цвет фона, где не отображается изображение видео. Например, если изображение видео 16 x 9 отображается в пределах 4 x 3 области (почтовые ящики), области с буквами отображаются с цветом фона. Цвет фона применяется только в целевом прямоугольнике (TargetRect). Любые пиксели за пределами TargetRect не изменяются.

  • DestFormat описывает цветовое пространство для выходного видео, например, используется ли цвет ITU-R BT.709 или BT.601. Эти сведения могут повлиять на отображение изображения. Дополнительные сведения см. в разделе "Расширенные сведения о цвете".

Другие параметры описаны на странице ссылки для структуры DXVA2_VideoProcessBltParams.

Примеры входных данных

Параметр pSamples iDirectXVideoProcessor::VideoProcessBlt указывает на массив DXVA2_VideoSample структур. Каждая из этих структур содержит сведения об одном входном образце и указателе на поверхность Direct3D, содержащую пример. Каждый пример является одним из следующих вариантов:

  • Текущее изображение из первичного потока.
  • Изображение обратной или обратной ссылки из первичного потока, используемое для деинтерлакации.
  • Подпоток.

Точное порядок, в котором образцы должны отображаться в массиве, описаны далее в разделе "Порядок ввода образца".

Можно предоставить до 15 подпотоков, хотя большинству приложений видео требуется только один подпоток. Количество подпотоков может изменяться при каждом вызове VideoProcessBlt. Рисунки подпотока указываются путем задания элемента SampleFormat.SampleFormat структуры DXVA2_VideoSample равным DXVA2_SampleSubStream. Для основного видеопотока этот элемент описывает перемешивание входного видео. Дополнительные сведения см. в DXVA2_SampleFormat перечислении.

Для основного видеопотока члены DXVA2_VideoSample структуры запуска и окончания дают время начала и окончания входного примера. Для подпотоков задайте для этих значений нулевое значение, так как время презентации всегда вычисляется из первичного потока. Приложение отвечает за отслеживание, когда каждый подпоток должен быть представлен и отправляет его в VideoProcessBlt в нужное время.

Два прямоугольника определяют расположение исходного видео для каждого потока:

  • Элемент SrcRect структуры DXVA2_VideoSample указывает исходный прямоугольник, прямоугольник исходного рисунка, который будет отображаться в составном выходном кадре. Чтобы обрезать рисунок, задайте для этого значение меньше размера кадра. В противном случае задайте его равным размеру кадра.
  • Элемент DstRect той же структуры задает прямоугольник назначения, прямоугольную область целевой поверхности, в которой будет отображаться кадр видео.

Драйвер щелкает пиксели из исходного прямоугольника в целевой прямоугольник. Два прямоугольника могут иметь разные размеры или пропорции; Драйвер будет масштабировать изображение по мере необходимости. Кроме того, каждый входной поток может использовать другой коэффициент масштабирования. На самом деле, масштабирование может потребоваться для создания правильного пропорции в выходном кадре. Драйвер не учитывает пропорции пикселей источника, поэтому если исходное изображение использует некверные пиксели, оно относится к приложению, чтобы вычислить правильный прямоугольник назначения.

Предпочтительные форматы подпотоков — AYUV и AI44. Последний является поддонизированным форматом с 16 цветами. Записи палитры указываются в элементе Pal структуры DXVA2_VideoSample. (Если исходный формат видео изначально выражается как тип носителя Media Foundation, записи палитры хранятся в атрибут MF_MT_PALETTE.) Для недонизированных форматов снимите этот массив до нуля.

Композиция изображений

Каждая операция blit определяется следующими тремя прямоугольниками:

  • Целевой прямоугольник (TargetRect) определяет регион в области назначения, где будут отображаться выходные данные. Выходной образ обрезается к этому прямоугольнику.
  • Прямоугольник назначения для каждого потока (DstRect) определяет, где входной поток отображается в составном изображении.
  • Исходный прямоугольник для каждого потока (SrcRect) определяет, какая часть исходного изображения отображается.

Целевые и целевые прямоугольники задаются относительно целевой поверхности. Исходный прямоугольник указывается относительно исходного изображения. Все прямоугольники указываются в пикселях.

diagram showing source, destination, and target rectangles

Устройство обработки видеотрансляции объединяет входные изображения, используя любой из следующих источников альфа-данных:

  • Альфа-данные на пиксель из подпотоков.
  • Планарное альфа-значение для каждого видеопотока, указанное в элементе PlanarAlpha структуры DXVA2_VideoSample.
  • Планарное альфа-значение составного изображения, указанное в элементе Альфа структуры DXVA2_VideoProcessBltParams. Это значение используется для смешивания всего составного изображения с цветом фона.

В этом разделе приведен ряд примеров, показывающих, как устройство обработки видео создает выходной образ.

Пример 1. Почтовые ящики

В этом примере показано, как забуксировать исходное изображение, задав прямоугольник назначения меньше целевого прямоугольника. Основной видеопоток в этом примере — это изображение 720 × 480, которое должно отображаться в пропорции 16:9. Целевая поверхность составляет 640 × 480 пикселей (4:3 пропорции). Чтобы добиться правильного пропорции, прямоугольник назначения должен быть 640 × 360. Для простоты этот пример не включает подпоток. На следующей схеме показаны прямоугольники источника и назначения.

diagram showing letterboxing.

На предыдущей схеме показаны следующие прямоугольники:

  • Целевой прямоугольник: { 0, 0, 640, 480 }

  • Основное видео:

    • Исходный прямоугольник: { 0, 0, 720, 480 }
    • Прямоугольник назначения: { 0, 60, 640, 420 }

Драйвер будет деинтерлацировать видео, сжимать деинтерлакированные кадры до 640 × 360, а фрейм — в прямоугольник назначения. Целевой прямоугольник больше целевого прямоугольника назначения, поэтому драйвер будет использовать цвет фона для заполнения горизонтальных полос выше и ниже кадра. Цвет фона указывается в структуре DXVA2_VideoProcessBltParams .

Пример 2. Растяжение подпотоков

Вложенные изображения могут распространяться за рамки основного изображения видео. Например, в DVD-видео основной видеопоток может иметь пропорции 4:3, а подпоток — 16:9. В этом примере оба видеопотока имеют одинаковые размеры источника (720 × 480), но подпоток должен отображаться в пропорции 16:9. Для достижения этого пропорции подпоток изображение растягивается по горизонтали. Исходные и конечные прямоугольники показаны на следующей схеме.

diagram showing substream image stretching.

На предыдущей схеме показаны следующие прямоугольники:

  • Целевой прямоугольник: { 0, 0, 854, 480 }

  • Основное видео:

    • Исходный прямоугольник: { 0, 0, 720, 480 }
    • Прямоугольник назначения: { 0, 107, 474, 480 }
  • Подпоток:

    • Исходный прямоугольник: { 0, 0, 720, 480 }
    • Прямоугольник назначения: { 0, 0, 854, 480 }

Эти значения сохраняют высоту изображения и масштабировать оба изображения по горизонтали. В регионах, где отображаются оба изображения, они альфа-смешиваются. Где подпоток распространяется за рамки видео primay, подпоток смешается с цветом фона. Эта альфа-смесь учитывает измененные цвета в правой части схемы.

Пример 3. Несоответствие высоты потока

В предыдущем примере подпоток и основной поток имеют одинаковую высоту. Потоки также могут иметь несовпадение высот, как показано в этом примере. Области в целевом прямоугольнике, где видео не отображается, используется цвет фона — черный в этом примере. Исходные и конечные прямоугольники показаны на следующей схеме.

diagram showing mismatched stream heights,

На предыдущей схеме показаны следующие прямоугольники:

  • Целевой прямоугольник: { 0, 0, 150, 85 }
  • Основное видео:
    • Исходный прямоугольник: { 0, 0, 150, 50 }
    • Прямоугольник назначения: { 0, 17, 150, 67 }
  • Подпоток:
    • Исходный прямоугольник: { 0, 0, 100, 85 }
    • Прямоугольник назначения: { 25, 0, 125, 85 }

Пример 4. Целевой прямоугольник меньше конечной поверхности

В этом примере показан случай, когда целевой прямоугольник меньше целевой поверхности.

diagram showing a blit to a destination rectangle.

На предыдущей схеме показаны следующие прямоугольники:

  • Область назначения: { 0, 0, 300, 200 }
  • Целевой прямоугольник: { 0, 0, 150, 85 }
  • Основное видео:
    • Исходный прямоугольник: { 0, 0, 150, 50 }
    • Прямоугольник назначения: { 0, 17, 150, 67 }
  • Подпоток:
    • Исходный прямоугольник: { 0, 0, 100, 85 }
    • Прямоугольник назначения: { 25, 0, 125, 85 }

Пиксели за пределами целевого прямоугольника не изменяются, поэтому цвет фона отображается только в целевом прямоугольнике. Пунктирная область указывает части целевой поверхности, которые не влияют на щель.

Пример 5. Исходные прямоугольники

Если указать исходный прямоугольник, который меньше исходного рисунка, драйвер будет перерезать только эту часть рисунка. В этом примере исходные прямоугольники указывают квадрант в правом нижнем углу первичного видеопотока и левого квадранта подпотока (обозначены хэш-метками на схеме). Прямоугольники назначения совпадают с размерами исходных прямоугольников, поэтому видео не растянуто. Исходные и конечные прямоугольники показаны на следующей схеме.

diagram showing a blit from two source rectangles.

На предыдущей схеме показаны следующие прямоугольники:

  • Целевой прямоугольник: { 0, 0, 720, 576 }
  • Основное видео:
    • Размер исходной поверхности: { 0, 0, 720, 480 }
    • Исходный прямоугольник: { 360, 240, 720, 480 }
    • Прямоугольник назначения: { 0, 0, 360, 240 }
  • Подпоток:
    • Размер исходной поверхности: { 0, 0, 640, 576 }
    • Исходный прямоугольник: { 0, 288, 320, 576 }
    • Прямоугольник назначения: { 400, 0, 720, 288 }

Пример 6. Пересечение прямоугольников назначения

Этот пример аналогичен предыдущему, но прямоугольники назначения пересекаются. Размеры поверхности совпадают с предыдущим примером, но исходные и конечные прямоугольники не являются. Опять же, видео обрезано, но не растянуто. Исходные и конечные прямоугольники показаны на следующей схеме.

diagram showing intersecting destination rectangles.

На предыдущей схеме показаны следующие прямоугольники:

  • Целевой прямоугольник: { 0, 0, 720, 576 }
  • Основное видео:
    • Размер исходной поверхности: { 0, 0, 720, 480 }
    • Исходный прямоугольник: { 260, 92, 720, 480 }
    • Прямоугольник назначения: { 0, 0, 460, 388 }
  • Подпоток:
    • Размер исходной поверхности: { 0, 0, 640, 576 }
    • Исходный прямоугольник: { 0, 0, 460, 388 }
    • Прямоугольник назначения: { 260, 188, 720, 576 }

Пример 7. Растяжение и обрезка видео

В этом примере видео растягивается, а также обрезается. 180 × 120 регионов из каждого потока растянуты для покрытия 360 × 240 областей в прямоугольнике назначения.

diagram showing stretching and cropping.

На предыдущей схеме показаны следующие прямоугольники:

  • Целевой прямоугольник: { 0, 0, 720, 480 }
  • Основное видео:
    • Размер исходной поверхности: { 0, 0, 360, 240 }
    • Исходный прямоугольник: { 180, 120, 360, 240 }
    • Прямоугольник назначения: { 0, 0, 360, 240 }
  • Подпоток:
    • Размер исходной поверхности: { 0, 0, 360, 240 }
    • Исходный прямоугольник: { 0, 0, 180, 120 }
    • Прямоугольник назначения: { 360, 240, 720, 480 }

Входной пример заказа

Параметр pSamples метода VideoProcessBlt является указателем на массив входных примеров. Примеры из основного видеопотока отображаются в первую очередь, а затем подпотоковые рисунки в порядке Z. Примеры должны быть помещены в массив в следующем порядке:

  • Примеры для основного видеопотока сначала отображаются в массиве в темпоральной последовательности. В зависимости от режима deinterlace драйвер может требовать один или несколько эталонных примеров из основного видеопотока. Члены DXVA2_VideoProcessorCaps структуры NumForwardRefSamples и NumForwardRefSamples указывают, сколько нужны примеров обратной и обратной ссылки. Вызывающий объект должен предоставить эти эталонные примеры, даже если видеоконтент является прогрессивным и не требует деинтерлакирования. (Это может произойти, когда прогрессивные кадры предоставляются устройству деинтерлакирования, например, если источник содержит сочетание интерлакированных и прогрессивных кадров.)
  • После выборки для основного видеопотока массив может содержать до 15 подпотоков, расположенных в порядке Z, снизу до верхней части. Подпотоки всегда прогрессивны и не требуют ссылочных рисунков.

В любое время основной видеопоток может переключаться между переплетом и прогрессивным содержимым, а также количество подпотоков.

Элемент SampleFormat.SampleFormat структуры DXVA2_VideoSample указывает тип рисунка. Для подпотоков задайте для этого значения значение DXVA2_SampleSubStream. Для прогрессивных изображений значение DXVA2_SampleProgressiveFrame. Для чередуемых изображений значение зависит от макета поля.

Если драйверу требуются примеры обратной и обратной ссылки, то полное количество примеров может быть недоступно в начале последовательности видео. В этом случае включите записи для них в массив pSamples , но помечайте отсутствующие примеры как тип DXVA2_SampleUnknown.

Члены DXVA2_VideoSample структуры начального и конечного элементов предоставляют темпоральные расположения каждого образца. Эти значения используются только для примеров из основного видеопотока. Для рисунков подпоток задайте для обоих членов значение нулю.

В следующих примерах можно уточнить эти требования.

Пример 1

Самый простой случай возникает, если нет подпотоков и алгоритм деинтерлакирования не требует эталонных примеров (NumForwardRefSamples и NumBackwardRefSamples равно нулю). Боб deinterlacing является примером такого алгоритма. В этом случае массив pSamples должен содержать одну входную поверхность, как показано в следующей таблице.

Указатель Тип Surface Временное расположение
pSamples[0] Перемешанный рисунок. T

 

Предполагается, что значение времени T — время начала текущего кадра видео.

Пример 2

В этом примере приложение смешивает два вложенных потока с основным потоком. Алгоритм деинтерлакизации не требует эталонных примеров. В следующей таблице показано, как эти образцы упорядочены в массиве pSamples .

Указатель Тип Surface Временное расположение Z-порядок
pSamples[0] Перемешанный рисунок T 0
pSamples[1] Подпоток 0 1
pSamples[2] Подпоток 0 2

 

Пример 3

Теперь предположим, что для алгоритма деинтерлакации требуется один пример обратной ссылки и один пример обратной ссылки. Кроме того, предоставляются два подпотока для пяти поверхностей. Правильное упорядочение показано в следующей таблице.

Указатель Тип Surface Временное расположение Z-порядок
pSamples[0] Перемешанный рисунок (справочник) T –1 Нет данных
pSamples[1] Перемешанный рисунок T 0
pSamples[2] Перемешанный рисунок (справочник) T +1 Нет данных
pSamples[3] Подпоток 0 1
pSamples[4] Подпоток 0 2

 

Время T –1 — время начала кадра до текущего кадра, а T +1 — время начала следующего кадра.

Если видеопоток переключается на прогрессивное содержимое, используя тот же режим деинтерлакации, приложение должно предоставить такое же количество примеров, как показано в следующей таблице.

Указатель Тип Surface Временное расположение Z-порядок
pSamples[0] Прогрессивный рисунок (справочник) T –1 Нет данных
pSamples[1] Прогрессивный рисунок T 0
pSamples[2] Прогрессивный рисунок (справочник) T +1 Нет данных
pSamples[3] Подпоток 0 1
pSamples[4] Подпоток 0 2

 

Пример 4

В начале последовательности видео примеры пересылки и обратной ссылки могут быть недоступны. В этом случае записи отсутствующих примеров включаются в массив pSamples с типом примера DXVA2_SampleUnknown.

Предположим, что для режима деинтерлакации требуется один переадресация и один пример обратной ссылки, первые три вызова VideoProcessBlt будут иметь последовательности входных данных, показанные в следующих трех таблицах.

Указатель Тип Surface Временное расположение
pSamples[0] Неизвестно 0
pSamples[1] Неизвестно 0
pSamples[2] Перемешанный рисунок (справочник) T +1

 

Указатель Тип Surface Временное расположение
pSamples[0] Неизвестно 0
pSamples[1] Перемешанный рисунок T
pSamples[2] Перемешанный рисунок (справочник) T +1

 

Указатель Тип Surface Временное расположение
pSamples[0] Перемешанный рисунок T –1
pSamples[1] Перемешанный рисунок T
pSamples[2] Перемешанный рисунок (справочник) T +1

 

Ускорение видео DirectX 2.0

Пример DXVA2_VideoProc