Condividi tramite


Metodo CBaseInputPin.Receive

[La funzionalità associata a questa pagina, DirectShow, è una funzionalità legacy. È stata sostituita da MediaPlayer, IMFMediaEngine e Audio/Video Capture in Media Foundation. Queste funzionalità sono state ottimizzate per Windows 10 e Windows 11. Microsoft consiglia vivamente che il nuovo codice usi MediaPlayer, IMFMediaEngine e Audio/Video Capture in Media Foundation invece di DirectShow, quando possibile. Microsoft suggerisce che il codice esistente che usa le API legacy venga riscritto per usare le nuove API, se possibile.

Il Receive metodo riceve l'esempio multimediale successivo nel flusso. Questo metodo implementa il metodo IMemInputPin::Receive .

Sintassi

HRESULT Receive(
   IMediaSample *pSample
);

Parametri

pSample

Puntatore all'interfaccia IMediaSample dell'esempio.

Valore restituito

Restituisce un valore HRESULT . I valori possibili includono quelli elencati nella tabella seguente.

Codice restituito Descrizione
S_OK
Operazione completata.
S_FALSE
Il pin è attualmente scaricamento; il campione è stato rifiutato.
E_POINTER
Argomento puntatore NULL.
VFW_E_INVALIDMEDIATYPE
Tipo di supporto non valido.
VFW_E_RUNTIME_ERROR
Si è verificato un errore di run-time.
VFW_E_WRONG_STATE
Il segnaposto viene arrestato.

Commenti

Il pin di output upstream chiama questo metodo per recapitare un esempio al pin di input. Il pin di input deve eseguire una delle operazioni seguenti:

  • Elaborare l'esempio prima di restituire.
  • Restituire ed elaborare l'esempio in un thread di lavoro.
  • Rifiutare l'esempio.

Se il pin usa un thread di lavoro per elaborare l'esempio, aggiungere un conteggio dei riferimenti all'esempio all'interno di questo metodo. Al termine del metodo, il pin upstream rilascia l'esempio. Quando il conteggio dei riferimenti dell'esempio raggiunge zero, l'esempio torna all'allocatore per il riutilizzo.

Questo metodo è sincrono e può bloccarsi. Se il metodo potrebbe bloccarsi, il metodo CBaseInputPin::ReceiveCanBlock del pin deve restituire S_OK.

Nella classe base questo metodo esegue i passaggi seguenti:

  1. Chiama il metodo CBaseInputPin::CheckStreaming per verificare che il pin possa elaborare ora esempi. Se ad esempio non è possibile, se il pin viene arrestato, il metodo ha esito negativo.
  2. Recupera le proprietà di esempio e controlla se il formato è stato modificato (vedere di seguito).
  3. Se il formato è stato modificato, il metodo chiama il metodo CBasePin::CheckMediaType per determinare se il nuovo formato è accettabile.
  4. Se il nuovo formato non è accettabile, il metodo chiama il metodo CBasePin::EndOfStream , invia un evento EC_ERRORABORT e restituisce un codice di errore.
  5. Supponendo che non ci siano errori, il metodo restituisce S_OK.

Testare la modifica di un formato nel modo seguente:

  • Se l'esempio supporta l'interfaccia IMediaSample2 , controllare il membro dwSampleFlags della struttura AM_SAMPLE2_PROPERTIES . Se il flag AM_SAMPLE_TYPECHANGED è presente, il formato è stato modificato.
  • In caso contrario, se l'esempio non supporta IMediaSample2, chiamare il metodo IMediaSample::GetMediaType . Se il metodo restituisce un valore non NULL , il formato è stato modificato.

Nella classe di base questo metodo non elabora l'esempio. La classe derivata deve eseguire l'override di questo metodo per eseguire l'elaborazione. Ciò che comporta dipende interamente dal filtro. La classe derivata deve chiamare il metodo della classe base per verificare la presenza degli errori descritti in precedenza.

Requisiti

Requisito Valore
Intestazione
Amfilter.h (include Streams.h)
Libreria
Strmbase.lib (build retail);
Strmbasd.lib (build di debug)

Vedi anche

Classe CBaseInputPin