Manipulando alterações de formato do renderizador de vídeo
[O recurso associado a esta página, DirectShow, é um recurso herdado. Ele foi substituído por MediaPlayer, IMFMediaEngine e Captura de Áudio/Vídeo na Media Foundation. Esses recursos foram otimizados para Windows 10 e Windows 11. A Microsoft recomenda fortemente que o novo código use MediaPlayer, IMFMediaEngine e Captura de Áudio/Vídeo no Media Foundation em vez de DirectShow, quando possível. A Microsoft sugere que o código existente que usa as APIs herdadas seja reescrito para usar as novas APIs, se possível.]
Esta seção descreve como um filtro de decodificador ou filtro de transformação deve lidar com alterações de formato do renderizador de vídeo.
Filtro do Renderizador de Vídeo
Quando o filtro antigo do Renderizador de Vídeo se conecta, ele requer um formato RGB que corresponda ao formato de exibição do monitor primário. Isso permite que ele use gdi para renderização se DirectDraw não estiver disponível. Quando a reprodução é iniciada, o Renderizador de Vídeo pode mudar para um formato compatível com DirectDraw. Para ver se o filtro upstream pode dar suporte ao novo formato, o Renderizador de Vídeo chama IPin::QueryAccept no pin de saída do filtro upstream. Se o filtro upstream aceitar o novo formato, o método QueryAccept retornará S_OK. O Renderizador de Vídeo alterna formatos anexando um tipo de mídia com o novo formato à próxima amostra de mídia retornada por seu alocador. O filtro upstream deve marcar para alterações de formato chamando IMediaSample::GetMediaType em cada exemplo. O Renderizador de Vídeo pode alternar entre o formato original e o novo formato a qualquer momento durante o streaming. Ele não chama QueryAccept após a alteração do primeiro formato. Depois que o filtro de upstream tiver aceitado o novo formato, ele deverá ser capaz de alternar para frente e para trás.
O filtro upstream pode rejeitar a alteração de formato retornando S_FALSE de QueryAccept. Nesse caso, o Renderizador de Vídeo continua a usar o GDI com o formato original.
Filtro do renderizador de combinação de vídeo
O filtro renderizador de combinação de vídeo (VMR-7 e VMR-9) se conectará com qualquer formato compatível com o hardware gráfico no sistema. A VMR-7 sempre usa DirectDraw para renderização e aloca as superfícies subjacentes do DirectDraw quando o filtro upstream se conecta. A VMR-9 sempre usa o Direct3D para renderização e aloca as superfícies Direct3D subjacentes quando o filtro upstream se conecta.
O hardware gráfico pode exigir uma superfície maior do que a largura da imagem. Nesse caso, a VMR solicita um novo formato chamando QueryAccept. Ele relata o passo da superfície no membro biWidth do BITMAPINFOHEADER no formato de vídeo. Se o filtro upstream não retornar S_OK de QueryAccept, a VMR rejeitará o formato e tentará se conectar usando o próximo formato anunciado pelo filtro upstream. A VMR anexa o tipo de mídia com o novo formato ao primeiro exemplo de mídia. Após o primeiro exemplo, o formato permanece constante; a VMR não alternará formatos enquanto o grafo estiver em execução.
Renderização avançada de vídeo (EVR)
O EVR sempre usa Direct3D para renderização. Se um passo de superfície maior for necessário, o EVR usará o mesmo mecanismo QueryAccept que a VMR.
Tópicos relacionados