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;
}
Tópicos relacionados