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


Настройка состояний 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