Elaborazione dei dati in un DMO
[La funzionalità associata a questa pagina, DirectShow, è una funzionalità legacy. È stata sostituita da MediaPlayer, FMMediaEngine 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, FMMediaEngine e Audio/Video Capture in Media Foundation anziché DirectShow, quando possibile. Microsoft suggerisce che il codice esistente che usa le API legacy venga riscritto per usare le nuove API, se possibile.
Questa sezione illustra come elaborare un flusso di dati usando un DMO. I passaggi elencati in questa sezione sono il comportamento predefinito; tutti i DMO devono supportare i metodi descritti qui. Questi metodi usano buffer separati per l'input e l'output. Alcuni DMO supportano anche l'elaborazione sul posto, usando un singolo buffer. Per altre informazioni sull'elaborazione sul posto, vedere Elaborazione sul posto.
Allocazione dei buffer
Il client è responsabile di tutte le allocazioni del buffer. Dopo aver impostato i tipi di supporti nella DMO, eseguire una query su DMO per i requisiti del buffer di ogni flusso. Questi possono cambiare a seconda del tipo di supporto. Per ogni flusso, chiamare il metodo IMediaObject::GetInputSizeInfo o IMediaObject::GetOutputSizeInfo . Questi metodi restituiscono le informazioni seguenti:
- Dimensioni minime del buffer, in byte.
- Requisiti di allineamento, se presenti. Un buffer è allineato se l'indirizzo iniziale è un multiplo di un numero intero specificato.
- La quantità massima di dati che il DMO conterrà per lookahead. Questo numero si applica solo ai flussi di input. Per alcuni tipi di dati (ad esempio, codifica MPEG), un DMO potrebbe dover cercare nel flusso. Il valore lookahead indica la quantità di dati di input necessari per il DMO prima di poter produrre l'output.
Il client deve allocare buffer che soddisfano questi requisiti. Inoltre, il DMO potrebbe avere requisiti relativi al modo in cui il client inserisce i dati di input. Ad esempio, il DMO potrebbe richiedere a ogni buffer di contenere esattamente un esempio (o fotogramma video). Per determinare questi requisiti, chiamare il metodo IMediaObject::GetInputStreamInfo . Il metodo IMediaObject::GetOutputStreamInfo restituisce informazioni simili su un flusso di output.
Nel modello di streaming predefinito, il client non passa i puntatori del buffer non elaborati all'oggetto DMO. Usa invece un oggetto COM leggero che espone l'interfaccia IMediaBuffer . L'interfaccia IMediaBuffer funge da wrapper COM per un blocco di memoria. Poiché è un oggetto COM, supporta il conteggio dei riferimenti, che consente di garantire che i buffer non vengano rilasciati mentre sono ancora in uso.
Nota
L'interfaccia IMediaBuffer funge da funzione simile all'interfaccia IMediaSample in DirectShow.
Il client deve implementare l'oggetto IMediaBuffer . Per altre informazioni, vedere Implementazione di IMediaBuffer.
Elaborazione dei dati
Per elaborare i dati, eseguire le operazioni seguenti:
- Per ogni flusso di input, riempire un buffer con dati di input.
- Chiamare IMediaObject::P rocessInput per distribuire ogni buffer.
- Chiamare IMediaObject::P rocessOutput per elaborare i dati. Questo metodo accetta una matrice di buffer, una per ogni flusso di output.
- Ripetere fino a quando non sono presenti più dati di input.
Il metodo ProcessInput accetta l'input per un flusso alla volta. In genere il metodo restituisce immediatamente e DMO contiene un conteggio dei riferimenti sull'oggetto IMediaBuffer . Rilascia l'oggetto dopo aver elaborato tutti i dati nel buffer oppure quando l'applicazione scarica l'oggetto DMO. Non riutilizzare un buffer fino a quando il DMO non lo ha rilasciato. Per determinare se un flusso di input può accettare altri dati, chiamare il metodo IMediaObject::GetInputStatus . Questo metodo restituisce il flag DMO_INPUT_STATUSF_ACCEPT_DATA se il flusso può accettare più input.
Il metodo ProcessOutput genera l'output per tutti i flussi di output contemporaneamente. L'applicazione passa in una matrice di strutture DMO_OUTPUT_DATA_BUFFER , una per ogni flusso di output. Ogni struttura nella matrice ha un puntatore a un oggetto IMediaBuffer . DMO scrive quanti dati di output possono essere inseriti nei buffer. Imposta anche vari flag per segnalare lo stato dell'operazione. Il flag DMO_OUTPUT_DATA_BUFFERF_INCOMPLETE indica che il DMO può produrre più output dall'input esistente. In questo caso, il client può chiamare di nuovo ProcessOutput . In caso contrario, deve chiamare ProcessInput con altri dati di input. DMO non modifica mai i dati nei buffer di input; scrive solo nei buffer di output.
Dopo aver recapitato tutti i dati a un flusso di input, chiamare il metodo IMediaObject::D iscontinuity . DMO non accetta ulteriori input per tale flusso fino a quando non si elabora l'output rimanente (o si scarica il DMO).
A qualsiasi punto dopo l'inizio del flusso, il DMO è in grado di ricevere l'input o produrre l'output o entrambi. Pertanto, GetInputStatus restituisce DMO_INPUT_STATUSF_ACCEPT_DATA o ProcessOutput restituisce DMO_OUTPUT_DATA_BUFFERF_INCOMPLETE. L'applicazione mantiene il flusso dei dati testando questi flag e chiamando ProcessInput o ProcessOutput di conseguenza. Per interrompere il flusso di dati, chiamare il metodo IMediaObject::Flush . Questo metodo causa l'eliminazione di tutti i buffer che contiene internamente.
Argomenti correlati