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


Настройка состояний DXVA-HD

Во время обработки видео устройство Microsoft DirectX Video Acceleration High Definition (DXVA-HD) поддерживает постоянное состояние от одного кадра к другому. Каждое состояние имеет документированные значения по умолчанию. После настройки устройства задайте все состояния, которые вы хотите изменить по умолчанию. Перед обработкой каждого кадра обновите все состояния, которые должны измениться.

Примечание

Эта конструкция отличается от DXVA-VP. В DXVA-VP приложение должно указать все параметры VP с каждым кадром.

 

Состояния устройств делятся на две категории:

  • Состояния потока применяют каждый входной поток отдельно. К каждому потоку можно применить разные параметры.
  • Состояния Blit применяются глобально ко всему видеообработки.

Определяются следующие состояния потока.

Состояние потока Описание
DXVAHD_STREAM_STATE_D3DFORMAT Формат входного видео.
DXVAHD_STREAM_STATE_FRAME_FORMAT Переплетения.
DXVAHD_STREAM_STATE_INPUT_COLOR_SPACE Пространство входных цветов. Это состояние задает диапазон цветов RGB и матрицу передачи YCbCr для входного потока.
DXVAHD_STREAM_STATE_OUTPUT_RATE Частота выходных кадров. Это состояние управляет преобразованием частоты кадров.
DXVAHD_STREAM_STATE_SOURCE_RECT Исходный прямоугольник.
DXVAHD_STREAM_STATE_DESTINATION_RECT Прямоугольник назначения.
DXVAHD_STREAM_STATE_ALPHA Planar alpha.
DXVAHD_STREAM_STATE_PALETTE Цветовая палитра. Это состояние применяется только к палеттизированным входным форматам.
DXVAHD_STREAM_STATE_LUMA_KEY Клавиша Luma.
DXVAHD_STREAM_STATE_ASPECT_RATIO Пропорции пикселей.
DXVAHD_STREAM_STATE_FILTER_Xxxx Параметры фильтра изображений. Драйвер может поддерживать фильтры яркости, контрастности и других изображений.

 

Определяются следующие состояния blit:

Состояние Blit Описание
DXVAHD_BLT_STATE_TARGET_RECT Целевой прямоугольник.
DXVAHD_BLT_STATE_BACKGROUND_COLOR Цвет фона.
DXVAHD_BLT_STATE_OUTPUT_COLOR_SPACE Выходное цветовое пространство.
DXVAHD_BLT_STATE_ALPHA_FILL Режим альфа-заполнения.
DXVAHD_BLT_STATE_CONSTRICTION Сужение. Это состояние определяет, понижает ли устройство выходные данные.

 

Чтобы задать состояние потока, вызовите метод IDXVAHD_VideoProcessor::SetVideoProcessStreamState . Чтобы задать состояние blit, вызовите метод IDXVAHD_VideoProcessor::SetVideoProcessBltState . В обоих этих методах значение перечисления указывает состояние для задания. Данные о состоянии предоставляются с использованием структуры данных, зависяющей от состояния, которую приложение приводит к типу void* .

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

HRESULT SetDXVAHDStates(HWND hwnd, D3DFORMAT inputFormat)
{
    // Set the initial stream states.

    // Set the format of the input stream

    DXVAHD_STREAM_STATE_D3DFORMAT_DATA d3dformat = { inputFormat };

    HRESULT hr = g_pDXVAVP->SetVideoProcessStreamState(
        0,  // Stream index
        DXVAHD_STREAM_STATE_D3DFORMAT,
        sizeof(d3dformat),
        &d3dformat
        );

    if (SUCCEEDED(hr))
    { 
        // For this example, the input stream contains progressive frames.

        DXVAHD_STREAM_STATE_FRAME_FORMAT_DATA frame_format = { DXVAHD_FRAME_FORMAT_PROGRESSIVE };
        
        hr = g_pDXVAVP->SetVideoProcessStreamState(
            0, // Stream index
            DXVAHD_STREAM_STATE_FRAME_FORMAT,
            sizeof(frame_format),
            &frame_format
            );
    }

    if (SUCCEEDED(hr))
    { 
        // Compute the letterbox area.

        RECT rcDest;
        GetClientRect(hwnd, &rcDest);

        RECT rcSrc;
        SetRect(&rcSrc, 0, 0, VIDEO_WIDTH, VIDEO_HEIGHT);

        rcDest = LetterBoxRect(rcSrc, rcDest);

        // Set the destination rectangle, so the frame is displayed within the 
        // letterbox area. Otherwise, the frame is stretched to cover the 
        // entire surface.

        DXVAHD_STREAM_STATE_DESTINATION_RECT_DATA DstRect = { TRUE, rcDest };

        hr = g_pDXVAVP->SetVideoProcessStreamState(
            0, // Stream index 
            DXVAHD_STREAM_STATE_DESTINATION_RECT,
            sizeof(DstRect),
            &DstRect
            );
    }

    if (SUCCEEDED(hr))
    { 
        DXVAHD_COLOR_RGBA rgbBackground = { 0.0f, 0.0f, 0.0f, 1.0f };  // RGBA

        DXVAHD_BLT_STATE_BACKGROUND_COLOR_DATA background = { FALSE, rgbBackground };

        hr = g_pDXVAVP->SetVideoProcessBltState(
            DXVAHD_BLT_STATE_BACKGROUND_COLOR,
            sizeof (background),
            &background
            );
    }

    return hr;
}

DXVA-HD