Método CBaseInputPin.Receive

[La característica asociada a esta página, DirectShow, es una característica heredada. Se ha reemplazado por MediaPlayer, IMFMediaEngine y Captura de audio/vídeo en Media Foundation. Esas características se han optimizado para Windows 10 y Windows 11. Microsoft recomienda encarecidamente que el nuevo código use MediaPlayer, IMFMediaEngine y Audio/Video Capture en Media Foundation en lugar de DirectShow, siempre que sea posible. Microsoft sugiere que el código existente que usa las API heredadas se reescriba para usar las nuevas API si es posible.

El Receive método recibe el siguiente ejemplo multimedia en la secuencia. Este método implementa el método IMemInputPin::Receive .

Sintaxis

HRESULT Receive(
   IMediaSample *pSample
);

Parámetros

pSample

Puntero a la interfaz IMediaSample del ejemplo.

Valor devuelto

Devuelve un valor HRESULT . Entre los valores posibles se incluyen los enumerados en la tabla siguiente.

Código devuelto Descripción
S_OK
Correcto.
S_FALSE
El pin está vacíando actualmente; se rechazó el ejemplo.
E_POINTER
Argumento de puntero NULL.
VFW_E_INVALIDMEDIATYPE
Tipo de medio no válido.
VFW_E_RUNTIME_ERROR
Error en tiempo de ejecución.
VFW_E_WRONG_STATE
El pin se detiene.

Observaciones

El pin de salida ascendente llama a este método para entregar un ejemplo al pin de entrada. El pin de entrada debe realizar una de las siguientes acciones:

  • Procese el ejemplo antes de devolverlo.
  • Devuelve y procesa el ejemplo en un subproceso de trabajo.
  • Rechace el ejemplo.

Si el pin usa un subproceso de trabajo para procesar el ejemplo, agregue un recuento de referencias al ejemplo dentro de este método. Después de que el método vuelva, la patilla ascendente libera el ejemplo. Cuando el recuento de referencias del ejemplo alcanza cero, el ejemplo vuelve al asignador para su reutilización.

Este método es sincrónico y puede bloquearse. Si el método puede bloquearse, el método CBaseInputPin::ReceiveCanBlock del pin debe devolver S_OK.

En la clase base, este método realiza los pasos siguientes:

  1. Llama al método CBaseInputPin::CheckStreaming para comprobar que el pin puede procesar ejemplos ahora. Si no puede, por ejemplo, si se detiene el pin, se produce un error en el método.
  2. Recupera las propiedades de ejemplo y comprueba si el formato ha cambiado (consulte a continuación).
  3. Si el formato ha cambiado, el método llama al método CBasePin::CheckMediaType para determinar si el nuevo formato es aceptable.
  4. Si el nuevo formato no es aceptable, el método llama al método CBasePin::EndOfStream , publica un evento de EC_ERRORABORT y devuelve un código de error.
  5. Suponiendo que no hubo errores, el método devuelve S_OK.

Pruebe un cambio de formato de la siguiente manera:

  • Si el ejemplo admite la interfaz IMediaSample2 , compruebe el miembro dwSampleFlags de la estructura AM_SAMPLE2_PROPERTIES . Si la marca AM_SAMPLE_TYPECHANGED está presente, el formato ha cambiado.
  • De lo contrario, si el ejemplo no admite IMediaSample2, llame al método IMediaSample::GetMediaType . Si el método devuelve un valor distinto de NULL , el formato ha cambiado.

En la clase base, este método no procesa el ejemplo. La clase derivada debe invalidar este método para realizar el procesamiento. (Lo que esto implica depende completamente del filtro). La clase derivada debe llamar al método de clase base para comprobar los errores descritos anteriormente.

Requisitos

Requisito Value
Encabezado
Amfilter.h (include Streams.h)
Biblioteca
Strmbase.lib (compilaciones comerciales);
Strmbasd.lib (compilaciones de depuración)

Consulte también

CBaseInputPin (clase)