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:
- CDynamicOutputPin::ChangeOutputFormat
- CDynamicOutputPin::ChangeMediaType
- CDynamicOutputPin::D ynamicReconnect
- CBaseOutputPin::D eliver
- CBaseOutputPin::D eliverEndOfStream
- CBaseOutputPin::D eliverNewSegment
- IMemInputPin::Receive
- IMemInputPin::ReceiveMultiple
- IPin::EndOfStream
- IPin::NewSegment
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 |
|
Biblioteca |
|