Classe CDynamicOutputPin

[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.]

A CDynamicOutputPin classe implementa um pino de saída que dá suporte a reconexões dinâmicas e alterações de formato.

Essa classe deriva da classe CBaseOutputPin e implementa a interface IPinFlowControl . Ele dá suporte a várias operações importantes para a criação dinâmica de grafo:

  • Reconexão dinâmica: o pino pode se desconectar e reconectar enquanto o filtro ainda estiver ativo (pausado ou em execução).
  • Alteração de formato dinâmico: o pin pode negociar um novo tipo de mídia enquanto o filtro ainda estiver ativo, sem reconectar.
  • Controle de fluxo: o filtro proprietário (ou um aplicativo) pode bloquear o fluxo de dados do pino sem interromper o filtro.

Para obter mais informações, consulte Dynamic Graph Building.

O pino tem três estados possíveis: bloqueado, desbloqueado e pendente. No estado pendente , o pino está aguardando a conclusão de alguma operação em outro thread, antes que o pino mude para o estado bloqueado. Embora o pino esteja bloqueado, o filtro não pode fornecer dados por meio do pino ou alterar a conexão do pino.

Para coordenar entre vários threads, o filtro proprietário deve seguir determinadas regras. (Para obter mais informações sobre threads no grafo de filtro, consulte Threads e Seções Críticas.) Primeiro, o thread de streaming deve sempre chamar o método CDynamicOutputPin::StartUsingOutputPin antes de chamar qualquer um dos seguintes métodos:

Posteriormente, ele deve chamar o método CDynamicOutputPin::StopUsingOutputPin .

Em segundo lugar, o thread do aplicativo não deve chamar nenhum dos métodos na lista anterior. Em terceiro lugar, o thread de streaming não deve chamar os métodos de classe que bloqueiam ou desbloqueia o pino. Esses métodos são: CDynamicOutputPin::Block, CDynamicOutputPin::SynchronousBlockOutputPin, CDynamicOutputPin::AsynchronousBlockOutputPin e CDynamicOutputPin::UnblockOutputPin.

Essas regras garantem que o thread do aplicativo não possa bloquear o pino enquanto o thread de streaming o estiver usando e vice-versa. Depois que o thread de streaming tiver chamado StartUsingOutputPin, o pino não será bloqueado até que o thread de streaming chame StopUsingOutputPin. Por outro lado, se o pino estiver bloqueado, StartUsingOutputPin aguardará até que o pino seja desbloqueado.

Para evitar esquecer de chamar StopUsingOutputPin, você pode usar a classe CAutoUsingOutputPin . Ele chama StopUsingOutputPin automaticamente quando ele sai do escopo.

Quando o filtro proprietário ingressa ou deixa o grafo de filtro (em seu método IBaseFilter::JoinFilterGraph ), ele deve chamar o método CDynamicOutputPin::SetConfigInfo do pino.

Variáveis de membro protegidas Descrição
m_BlockStateLock Seção crítica que protege o estado de bloqueio.
m_hUnblockOutputPinEvent Evento que é sinalizado quando o pino não está bloqueado.
m_hNotifyCallerPinBlockedEvent Evento que é sinalizado quando o pino é bloqueado com êxito ou o usuário cancela um bloco pendente.
m_BlockState Estado de bloqueio.
m_dwBlockCallerThreadID O identificador do thread que chamou pela última vez o método IPinFlowControl::Block nesse pin.
m_dwNumOutstandingOutputPinUsers Número de threads de streaming usando esse pino.
m_hStopEvent Evento que é sinalizado quando o filtro é interrompido ou o pino libera dados.
m_pGraphConfig Ponteiro para a interface IGraphConfig para executar reconexões dinâmicas.
m_bPinUsesReadOnlyAllocator Sinalizador que especifica se os exemplos do alocador do pin são somente leitura.
Métodos Protegidos Descrição
SynchronousBlockOutputPin Bloqueia o pino; não retorna até que o pino seja bloqueado.
AsynchronousBlockOutputPin Bloqueia o pino; pode retornar antes que o pino seja bloqueado.
UnblockOutputPin Desbloqueia o pino.
BlockOutputPin Bloqueia o pino.
WaitEvent Aguarda até que o evento especificado seja sinalizado.
Métodos públicos Descrição
CDynamicOutputPin Método de construtor.
~CDynamicOutputPin Método destruidor.
SetConfigInfo Especifica o ponteiro IGraphConfig e o evento stop.
DeliverBeginFlush Solicita o pin de entrada conectado para iniciar uma operação de liberação.
DeliverEndFlush Solicita o pin de entrada conectado para encerrar uma operação de liberação.
Inativo Notifica o pino de que o filtro foi interrompido.
Ativo Notifica o pino de que o filtro agora está ativo.
Completeconnect Conclui uma conexão com um pino de entrada. Virtual.
StartUsingOutputPin Obtém acesso ao pino para uma operação de streaming. Virtual.
StopUsingOutputPin Libera o acesso ao pino após uma operação de streaming. Virtual.
StreamingThreadUsingOutputPin Determina se algum thread está executando uma operação de streaming no pino. Virtual.
ChangeOutputFormat Altera dinamicamente o tipo de mídia para a conexão e fornece novas informações de segmento.
ChangeMediaType Altera dinamicamente o tipo de mídia para a conexão.
DynamicReconnect Executa uma reconexão dinâmica com um novo tipo de mídia.
Métodos IPin Descrição
Desconectar Quebra a conexão de pino atual.
Métodos IPinFlowControl Descrição
Bloquear Bloqueia ou desbloqueia o fluxo de dados do pino.

Requisitos

Requisito Valor
parâmetro
Amfilter.h (inclua Streams.h)
Biblioteca
Strmbase.lib (builds de varejo);
Strmbasd.lib (builds de depuração)