Compartilhar via


Classe CTransInPlaceFilter

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

Hierarquia da classe ctransinplacefilter

A CTransInPlaceFilter classe foi projetada para filtros de transformação in-loco, que são filtros que modificam os dados de entrada em vez de copiar os dados entre buffers. Para usar essa classe, derive uma nova classe de CTransInPlaceFilter e implemente os seguintes métodos:

Essa classe usa a classe CTransInPlaceInputPin para seu pin de entrada e a classe CTransInPlaceOutputPin para seu pin de saída. Normalmente, você não precisa substituir essas classes de pino. O filtro cria ambos os pinos no método CTransInPlaceFilter::GetPin . Se você substituir as classes de pino, deverá substituir GetPin para criar seus pinos personalizados.

Essa classe foi projetada para que o tipo de entrada sempre corresponda ao tipo de saída. Sempre que possível, o filtro usa um único alocador para ambas as conexões de pino.

Tipos de mídia preferenciais

Se o pino de saída já estiver conectado, o pino de entrada oferecerá os tipos preferenciais do filtro downstream. (Na verdade, ele simplesmente retorna o objeto enumerador do filtro downstream.) Caso contrário, ele não tem tipos preferenciais. O pino de saída tem o mesmo comportamento, mas ao contrário: se o pin de entrada já estiver conectado, o pino de saída oferecerá os tipos preferenciais do filtro upstream. Caso contrário, ele não tem tipos preferenciais

Fixar Conexões

Quando um pino se conecta, o filtro geralmente reconecta o outro pino, para garantir que ambos os pinos usem o mesmo tipo de mídia e o mesmo alocador. (O mecanismo para reconectar pinos é descrito em Reconectando pinos.) Dois cenários são possíveis: o pino de entrada se conecta primeiro ou o pino de saída se conecta primeiro.

Suponha que o pino de entrada se conecte primeiro. As seguintes etapas ocorrem:

  1. O pin de entrada chama o método CheckInputType do filtro para marcar o tipo de mídia.
  2. O filtro upstream seleciona um alocador. Neste ponto, o pin de entrada não tem requisitos de alocador e aceita qualquer alocador para a conexão. Se o filtro upstream solicitar um alocador, o pino criará um novo. Por motivos descritos em breve, esse alocador não será usado na conexão final. Ele é fornecido apenas para ajudar a concluir esta fase do processo de conexão.

Posteriormente, quando o pino de saída se conecta:

  1. O pino de saída chama o método CheckInputType do filtro para marcar o tipo de mídia. Ele também chama IPin::QueryAccept no filtro upstream. Isso garante que o pino de entrada possa alterar seu tipo de mídia para corresponder.
  2. O pino de saída chama o método CheckInputType do filtro para marcar o tipo de mídia. Ele também chama IPin::QueryAccept no filtro upstream. Isso garante que o pino de entrada possa alterar seu tipo de mídia para corresponder.
  3. O pino de saída chama o método CheckInputType do filtro para marcar o tipo de mídia. Ele também chama IPin::QueryAccept no filtro upstream. Isso garante que o pino de entrada possa alterar seu tipo de mídia para corresponder.
  4. Desta vez, o método GetAllocator do pino de entrada retorna o alocador downstream e GetAllocatorRequirements retorna os requisitos do alocador do filtro downstream. O pin de entrada aceita qualquer alocador escolhido pelo filtro upstream.
  5. Desta vez, o método GetAllocator do pino de entrada retorna o alocador downstream e GetAllocatorRequirements retorna os requisitos do alocador do filtro downstream. O pin de entrada aceita qualquer alocador escolhido pelo filtro upstream.

Agora considere o cenário oposto, em que o pino de saída é o primeiro pino a se conectar.

  1. O pino de saída chama o método CheckInputType do filtro para marcar o tipo de mídia.
  2. Ele seleciona um alocador, preferindo usar o alocador do filtro downstream.

Em seguida, quando o pino de entrada se conecta:

  1. O pin de entrada verifica o tipo de mídia chamando CheckInputType no filtro e chamando QueryAccept no pino de saída do filtro downstream.
  2. Se o tipo de entrada não corresponder ao tipo de saída, o filtro reconectará o pino de saída.
  3. O filtro upstream seleciona um alocador. O método GetAllocator do pino de entrada retorna o alocador downstream e o pin de entrada aceita qualquer alocador selecionado pelo filtro upstream.
  4. O filtro usa o mesmo alocador para a conexão downstream, possivelmente substituindo o alocador downstream original.

Essa sequência de eventos mudará ligeiramente se qualquer um dos alocadores envolvidos for somente leitura, pois o alocador downstream deve ser gravável. Nesse caso, o filtro pode usar dois alocadores separados.

Para obter mais informações sobre como usar essa classe, consulte Escrevendo filtros de transformação.

Variáveis de membro protegidas Descrição
m_bModifiesData Indica se o filtro modifica os dados de exemplo.
Métodos Protegidos Descrição
Copy Copia um exemplo de mídia.
InputPin Recupera um ponteiro para o pino de entrada do filtro.
OutputPin Recupera um ponteiro para o pino de saída do filtro.
TypesMatch Determina se o tipo de mídia de entrada corresponde ao tipo de mídia de saída.
UsingDifferentAllocators Determina se os pinos de entrada e saída estão usando alocadores diferentes.
Métodos públicos Descrição
Ctransinplacefilter Método de construtor.
Getpin Recupera um pino.
Getmediatype Recupera um tipo de mídia preferencial para o pino de saída.
Decidebuffersize Define os requisitos de buffer do pino de saída.
CheckTransform Verifica se um tipo de mídia de entrada é compatível com um tipo de mídia de saída.
Completeconnect Conclui uma conexão de pino.
Receber Recebe um exemplo de mídia, processa-o e entrega-o ao filtro downstream.
Métodos virtuais puros Descrição
Transform Transforma um exemplo no local.

Requisitos

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