Negoziazione degli allocatori

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

Quando si connettono due pin, è necessario un meccanismo per lo scambio di dati multimediali. Questo meccanismo viene chiamato trasporto. In generale, l'architettura DirectShow è indipendente dai trasporti. Due filtri possono accettare di connettersi utilizzando qualsiasi trasporto supportato da entrambi.

Il trasporto più comune è il trasporto di memoria locale , in cui i dati multimediali risiedono nella memoria principale. Esistono due tipi di trasporto di memoria locale, il modello push e il modello di pull. Nel modello push il filtro di origine esegue il push dei dati nel filtro downstream, usando l'interfaccia IMemInputPin sul pin di input del filtro downstream. Nel modello di pull il filtro downstream richiede i dati dal filtro di origine, usando l'interfaccia IAsyncReader nel pin di output del filtro di origine. Per altre informazioni su questi due modelli di flusso di dati, vedere Flusso di dati nel grafico dei filtri.

Nel trasporto di memoria locale, l'oggetto responsabile dell'allocazione dei buffer di memoria viene chiamato allocatore. Un allocatore supporta l'interfaccia IMemAllocator . Entrambi i pin condividono un singolo allocatore. Entrambi i pin possono fornire un allocatore, ma il pin di output seleziona l'allocatore da usare.

Il pin di output imposta anche le proprietà dell'allocatore, che determinano il numero di buffer creati dall'allocatore, le dimensioni di ogni buffer e l'allineamento della memoria. Il pin di output potrebbe rinviare al pin di input per i requisiti del buffer.

In una connessione IMemInputPin , la negoziazione dell'allocatore funziona come segue:

  1. Facoltativamente, il pin di output chiama IMemInputPin::GetAllocatorRequirements. Questo metodo recupera i requisiti del buffer del pin di input, ad esempio l'allineamento della memoria. In generale, il pin di output deve rispettare la richiesta del pin di input, a meno che non vi sia un buon motivo per non farlo.
  2. Facoltativamente, il pin di output chiama IMemInputPin::GetAllocator. Questo metodo richiede un allocatore dal pin di input. Il pin di input fornisce uno o restituisce un codice di errore.
  3. Il pin di output seleziona un allocatore. Può usare uno fornito dal pin di input o crearne uno personalizzato.
  4. Il pin di output chiama IMemAllocator::SetProperties per impostare le proprietà dell'allocatore. Tuttavia, l'allocatore potrebbe non rispettare le proprietà richieste. Ad esempio, ciò può verificarsi se il pin di input fornisce l'allocatore. L'allocatore restituisce le proprietà effettive come parametro di output nel metodo SetProperties .
  5. La puntina outpin chiama IMemInputPin::NotifyAllocator per informare il pin di input della selezione.
  6. Il pin di input deve chiamare IMemAllocator::GetProperties per verificare se le proprietà dell'allocatore sono accettabili.
  7. Il pin di output è responsabile del commit e dell'annullamento del commit dell'allocatore. Ciò si verifica all'avvio e all'arresto del flusso.

In una connessione IAsyncReader , la negoziazione dell'allocatore funziona come segue:

  1. Il pin di input chiama IAsyncReader::RequestAllocator nel pin di output. Il pin di input specifica i requisiti del buffer e, facoltativamente, fornisce un allocatore.
  2. Il pin di output seleziona un allocatore. Può usare quello fornito dal pin di input, se presente, o crearne uno personalizzato.
  3. Il pin di output restituisce l'allocatore come parametro in uscita nel metodo RequestAllocator . Il pin di input deve controllare le proprietà dell'allocatore.
  4. Il pin di input è responsabile del commit e dell'annullamento del commit dell'allocatore.
  5. In qualsiasi momento durante il processo di negoziazione dell'allocatore, entrambi i pin possono avere esito negativo per la connessione.
  6. Se il pin di output usa l'allocatore del pin di input, può usare tale allocatore solo per recapitare campioni al pin di input. Il filtro proprietario non deve usare l'allocatore per recapitare campioni ad altri pin.

Fornitura di un allocatore personalizzato