Partilhar via


Método CBaseInputPin.Receive

[O recurso associado a esta página, DirectShow, é um recurso herdado. Foi substituído por MediaPlayer, IMFMediaEngine e Audio/Video Capture in 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 Audio/Video Capture in 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.]

O Receive método recebe o próximo exemplo de mídia no fluxo. Esse método implementa o método IMemInputPin::Receive .

Sintaxe

HRESULT Receive(
   IMediaSample *pSample
);

Parâmetros

pSample

Ponteiro para a interface IMediaSample do exemplo.

Retornar valor

Retorna um valor HRESULT . Os valores possíveis incluem aqueles listados na tabela a seguir.

Código de retorno Descrição
S_OK
Êxito.
S_FALSE
O pino está sendo liberado no momento; exemplo foi rejeitado.
E_POINTER
Argumento de ponteiro NULL.
VFW_E_INVALIDMEDIATYPE
Tipo de mídia inválido.
VFW_E_RUNTIME_ERROR
Ocorreu um erro em tempo de execução.
VFW_E_WRONG_STATE
O pino está parado.

Comentários

O pino de saída upstream chama esse método para entregar um exemplo ao pino de entrada. O pino de entrada deve fazer um dos seguintes procedimentos:

  • Processe o exemplo antes de retornar.
  • Retorne e processe o exemplo em um thread de trabalho.
  • Rejeite o exemplo.

Se o pino usar um thread de trabalho para processar o exemplo, adicione uma contagem de referência ao exemplo dentro desse método. Depois que o método retorna, o pino upstream libera o exemplo. Quando a contagem de referência do exemplo atinge zero, o exemplo retorna ao alocador para reutilizar.

Esse método é síncrono e pode ser bloqueado. Se o método puder ser bloqueado, o método CBaseInputPin::ReceiveCanBlock do pin deverá retornar S_OK.

Na classe base, esse método executa as seguintes etapas:

  1. Chama o método CBaseInputPin::CheckStreaming para verificar se o pino pode processar exemplos agora. Se não puder, por exemplo, se o pino for interrompido, o método falhará.
  2. Recupera as propriedades de exemplo e verifica se o formato foi alterado (veja abaixo).
  3. Se o formato tiver sido alterado, o método chamará o método CBasePin::CheckMediaType para determinar se o novo formato é aceitável.
  4. Se o novo formato não for aceitável, o método chamará o método CBasePin::EndOfStream , postará um evento EC_ERRORABORT e retornará um código de erro.
  5. Supondo que não houve erros, o método retorna S_OK.

Teste uma alteração de formato da seguinte maneira:

  • Se o exemplo der suporte à interface IMediaSample2, marcar o membro dwSampleFlags da estrutura AM_SAMPLE2_PROPERTIES. Se o sinalizador AM_SAMPLE_TYPECHANGED estiver presente, o formato será alterado.
  • Caso contrário, se o exemplo não der suporte a IMediaSample2, chame o método IMediaSample::GetMediaType . Se o método retornar um valor não NULL , o formato será alterado.

Na classe base, esse método não processa o exemplo. A classe derivada deve substituir esse método para executar o processamento. (O que isso implica depende inteiramente do filtro.) A classe derivada deve chamar o método de classe base para marcar para os erros descritos anteriormente.

Requisitos

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

Confira também

Classe CBaseInputPin