Partilhar via


QueryAccept (a jusante)

[O recurso associado a esta página, DirectShow, é um recurso herdado. Foi substituído por MediaPlayer, IMFMediaEnginee Audio/Video Capture in Media Foundation. Esses recursos foram otimizados para Windows 10 e Windows 11. A Microsoft recomenda vivamente que o novo código utilize 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.]

Este mecanismo permite que um pino de saída proponha um novo formato ao seu par a jusante. O novo formato não deve exigir um tamanho de buffer maior. O pino de saída faz o seguinte:

  1. Chama IPin::QueryAccept ou IPinConnection::D ynamicQueryAccept no pino downstream, para verificar se o outro pino pode aceitar o novo tipo de mídia (veja a ilustração, etapa A).

  2. Se o valor de retorno da etapa 1 for S_OK, o pino anexará o tipo de mídia à próxima amostra. Para fazer isso, primeiro ele chama IMemAllocator::GetBuffer para obter o exemplo (B). Em seguida, ele chama IMediaSample::SetMediaType para anexar o tipo de mídia a esse exemplo (C). Ao anexar o tipo de mídia ao exemplo, o filtro indica que o formato foi alterado, começando com esse exemplo.

  3. O pino entrega a amostra (D).

  4. Quando o filtro downstream recebe a amostra, ele chama IMediaSample::GetMediaType para recuperar o novo tipo de mídia.

    queryaccept (downstream)

Todos os pinos suportam o método QueryAccept. No entanto, esse método é ligeiramente ambíguo, porque um valor de retorno de S_OK nem sempre garante que você pode alterar o formato enquanto o gráfico está ativo. Alguns filtros podem retornar S_OK mas rejeitar a alteração se o gráfico estiver ativo. O método DynamicQueryAccept, que é suportado por alguns pinos de entrada, define explicitamente S_OK significa que o pino pode mudar de formato enquanto estiver ativo. Se um pino de entrada suportar a interface IPinConnection, você deverá chamar DynamicQueryAccept em vez de QueryAccept.

Na maioria dos casos, esse mecanismo não permite mudanças drásticas no formato, como alterar a profundidade de bits. Uma situação em que ele pode ser usado é quando um decodificador de vídeo alterna paletas. Os detalhes básicos do formato permanecem os mesmos, como as dimensões da imagem e a profundidade de bits, mas o novo tipo de mídia tem um conjunto diferente de entradas de paleta.

Nota de Aplicação

Nas classes base DirectShow, CBasePin::QueryAccept chama o método CheckMediaType, que também é chamado durante a conexão de pino inicial. No caso de um filtro de transformação, o método CheckMediaType do pino de entrada deve sempre verificar se o pino de saída está conectado e, em caso afirmativo, se o tipo de mídia de entrada é compatível com o tipo de mídia de saída. Portanto, essa implementação provavelmente será válida para QueryAccept. Caso contrário, você deve substituir QueryAccept para executar quaisquer verificações adicionais necessárias. Além disso, observe que a classeCTransformFilter doencapsula essa lógica nos métodos CheckInputType e CheckTransform. O classe CTransInPlaceFilter, por outro lado, sempre chama QueryAccept no próximo filtro upstream ou downstream.

O método CBaseInputPin::Receive verifica se há um tipo de mídia na amostra de entrada e, se houver, chama CheckMediaType. No entanto, ele não atualiza o membro m_mt do pino, que contém o tipo de mídia atual. Quando o filtro processar a amostra, você deverá verificar se há um tipo de mídia na amostra. Se houver um novo tipo, você provavelmente precisará armazená-lo, chamando SetMediaType em seu pino ou definindo o valor de m_mt diretamente. Por outro lado, o classe CVideoTransformFilter, que é projetado para filtros de transformação de vídeo, armazena o tipo de mídia quando ele muda. Para obter detalhes, consulte o código-fonte do CVideoTransformFilter::Receive na biblioteca de classes base do DirectShow.

Em alguns casos, você pode simplesmente passar a chamada de QueryAccept downstream, anexar o tipo de mídia à amostra de saída e deixar o filtro downstream lidar com a alteração de formato.