Definindo estados DXVA-HD

Durante o processamento de vídeo, o dispositivo de Alta Definição de Aceleração de Vídeo (DXVA-HD) do Microsoft DirectX mantém um estado persistente de um quadro para o outro. Cada estado tem um padrão documentado. Depois de configurar o dispositivo, defina todos os estados que você deseja alterar de seus padrões. Antes de processar cada quadro, atualize todos os estados que devem ser alterados.

Observação

Esse design é diferente do DXVA-VP. No DXVA-VP, o aplicativo deve especificar todos os parâmetros de VP com cada quadro.

 

Os estados do dispositivo se enquadram em duas categorias:

  • Os estados de fluxo aplicam cada fluxo de entrada separadamente. Você pode aplicar configurações diferentes a cada fluxo.
  • Os estados Blit se aplicam globalmente a todo o blit de processamento de vídeo.

Os estados de fluxo a seguir são definidos.

Estado do Fluxo Descrição
DXVAHD_STREAM_STATE_D3DFORMAT Formato de vídeo de entrada.
DXVAHD_STREAM_STATE_FRAME_FORMAT Entrelaçamento.
DXVAHD_STREAM_STATE_INPUT_COLOR_SPACE Espaço de cor de entrada. Esse estado especifica o intervalo de cores RGB e a matriz de transferência YCbCr para o fluxo de entrada.
DXVAHD_STREAM_STATE_OUTPUT_RATE Taxa de quadros de saída. Esse estado controla a conversão de taxa de quadros.
DXVAHD_STREAM_STATE_SOURCE_RECT Retângulo de origem.
DXVAHD_STREAM_STATE_DESTINATION_RECT Retângulo de destino.
DXVAHD_STREAM_STATE_ALPHA Alfa planar.
DXVAHD_STREAM_STATE_PALETTE Paleta de cores. Esse estado se aplica somente a formatos de entrada palettizados.
DXVAHD_STREAM_STATE_LUMA_KEY Chave luma.
DXVAHD_STREAM_STATE_ASPECT_RATIO Taxa de proporção de pixel.
DXVAHD_STREAM_STATE_FILTER_Xxxx Configurações de filtro de imagem. O driver pode dar suporte a brilho, contraste e outros filtros de imagem.

 

Os seguintes estados blit são definidos:

Estado Blit Descrição
DXVAHD_BLT_STATE_TARGET_RECT Retângulo de destino.
DXVAHD_BLT_STATE_BACKGROUND_COLOR Cor da tela de fundo.
DXVAHD_BLT_STATE_OUTPUT_COLOR_SPACE Espaço de cor de saída.
DXVAHD_BLT_STATE_ALPHA_FILL Modo de preenchimento alfa.
DXVAHD_BLT_STATE_CONSTRICTION Constrição. Esse estado controla se o dispositivo reduz a amostra da saída.

 

Para definir um estado de fluxo, chame o método IDXVAHD_VideoProcessor::SetVideoProcessStreamState . Para definir um estado blit, chame o método IDXVAHD_VideoProcessor::SetVideoProcessBltState . Em ambos os métodos, um valor de enumeração especifica o estado a ser definido. Os dados de estado são fornecidos usando uma estrutura de dados específica do estado, que o aplicativo converte em um tipo void* .

O exemplo de código a seguir define o formato de entrada e o retângulo de destino para o fluxo 0 e define a cor da tela de fundo como preta.

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