Notificações de fim do fluxo
[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.]
Quando um filtro de origem terminar de enviar dados, ele chamará o método IPin::EndOfStream no pin de entrada downstream. O filtro downstream propaga a chamada para o próximo filtro e assim por diante. Quando a chamada EndOfStream atinge o renderizador, o renderizador envia um evento EC_COMPLETE para o Gerenciador de Grafo de Filtro. Se o renderizador tiver vários pinos de entrada, ele entregará o evento EC_COMPLETE depois que cada pin de entrada receber a notificação de fim do fluxo.
Um filtro deve serializar chamadas EndOfStream com outras chamadas de streaming, como IMemInputPin::Receive. (Em outras palavras, o filtro downstream deve sempre receber as chamadas na ordem correta.)
Em alguns casos, um filtro downstream pode detectar o fim do fluxo antes do filtro de origem. (Por exemplo, o filtro downstream pode estar analisando o fluxo.) Nesse caso, o filtro downstream pode enviar a notificação de fim do fluxo, nesse caso, ele deve retornar S_FALSE de IMemInputPin::Receive até que o grafo seja interrompido ou liberado. O valor retornado S_FALSE informa o filtro de origem para interromper o envio de dados.
Tratamento padrão de EC_COMPLETE
Por padrão, o Gerenciador de Grafo de Filtro não encaminha todos os EC_COMPLETE evento para o aplicativo. Em vez disso, ele aguarda até que todos os fluxos tenham sinalizado EC_COMPLETE e envie um único evento EC_COMPLETE. Assim, o aplicativo recebe o evento após a conclusão de cada fluxo.
Para determinar o número de fluxos, o Gerenciador de Grafo de Filtro conta o número de filtros que dão suporte à busca (por meio de IMediaSeeking ou IMediaPosition) e têm um pino de entrada renderizado , que é definido como um pino de entrada sem saídas correspondentes. O Gerenciador de Grafo de Filtro determina se um pino é renderizado de duas maneiras:
- O método IPin::QueryInternalConnections do pin retorna zero no parâmetro nPin .
- O filtro expõe a interface IAMFilterMiscFlags e retorna o sinalizador AM_FILTER_MISC_FLAGS_IS_RENDERER.
Notificações de fim de fluxo no modo de pull
Em uma conexão IAsyncReader , o filtro de origem não envia uma notificação de fim do fluxo. Instread, isso é feito pelo filtro downstream, que normalmente é um filtro de analisador. O analisador envia a chamada EndOfStream downstream. Ele não envia um upstream para o filtro de origem.
Tópicos relacionados