Tipi di supporti DMO

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

Un tipo di supporto descrive il formato associato a un flusso di dati multimediali. Questo articolo descrive come i DMO gestiscono i tipi di supporti. È destinato principalmente agli sviluppatori che scrivono DMO personalizzati.

I tipi di supporti vengono definiti usando la struttura DMO_MEDIA_TYPE . Questa struttura include le informazioni seguenti:

  • Il tipo principale è un identificatore univoco globale (GUID) che definisce una categoria ampia, ad esempio audio o video.
  • Il sottotipo è un GUID che definisce aspetti più specifici del tipo. Ad esempio, all'interno del video, i sottotipi includono RGB a 16 bit, RGB a 24 bit, UYVY, video con codifica DV e così via.
  • Il blocco di formato è una struttura secondaria che specifica completamente il formato. Il layout del blocco di formato dipende dal tipo di dati. Ad esempio, l'audio PCM usa la struttura WAVEFORMATEX . Il video usa varie altre strutture, tra cui VIDEOINFOHEADER e VIDEOINFOHEADER2. Il layout del blocco di formato è identificato da un GUID di tipo formato. Ad esempio, FORMAT_WaveFormatEx specifica una struttura WAVEFORMATEX .

Quando viene creato un DMO per la prima volta, i flussi non hanno un tipo di supporto. Prima che DMO possa elaborare qualsiasi dato, il client deve impostare un tipo di supporto per ogni flusso. Questo processo viene descritto dal punto di vista del client in Impostazione dei tipi di supporti in un DMO.

Tipi di supporti nel Registro di sistema

Un oggetto DMO può aggiungere un elenco di tipi di supporti supportati nel Registro di sistema chiamando la funzione DMORegister . Un'applicazione può usare queste informazioni per cercare DMO che corrispondono a un formato specifico. Le informazioni nel Registro di sistema non devono essere complete. In genere, è possibile includere solo i tipi principali supportati da DMO. La voce del Registro di sistema ha chiavi separate per i tipi di input e output, ma non distingue tra i singoli flussi.

La funzione DMORegister usa la struttura DMO_PARTIAL_MEDIATYPE per descrivere i tipi di supporti. Questa struttura contiene un sottoinsieme delle informazioni disponibili nella struttura DMO_MEDIA_TYPE , ovvero il tipo principale e il sottotipo. Non include un blocco di formato, perché il blocco di formato contiene in genere informazioni troppo granulari da includere nel Registro di sistema, ad esempio l'altezza e la larghezza di un'immagine video.

Tipi di supporti preferiti

Dopo aver creato un DMO, l'applicazione può eseguire una query sull'ISTANZA DMO per i tipi di supporto supportati. Per ogni flusso, DMO crea un elenco di tipi di supporti (possibilmente vuoto), classificati in ordine di preferenza. I metodi IMediaObject::GetInputType e IMediaObject::GetOutputType enumera i tipi preferiti. I tipi preferiti di un flusso possono cambiare in modo dinamico quando l'applicazione imposta tipi di supporti su altri flussi. Ad esempio, l'elenco dei tipi di output preferiti può cambiare dopo l'impostazione del tipo di input o viceversa. Non è tuttavia necessario aggiornare dinamicamente i tipi preferiti. L'applicazione non può presupporre che ogni tipo ricevuto sia valido. Per questo motivo, i metodi IMediaObject::SetInputType e IMediaObject::SetOutputType supportano un flag per il test di un tipo specifico.

I metodi GetInputType e GetOutputType restituiscono entrambi una struttura DMO_MEDIA_TYPE . L'oggetto DMO può lasciare vuote alcune delle informazioni contenute in questa struttura per indicare un intervallo di tipi. Il tipo principale o il sottotipo può essere GUID_NULL e il blocco di formato può essere vuoto (zero byte). Se il blocco di formato è vuoto, il tipo di formato deve essere GUID_NULL.

Dopo che l'applicazione imposta tutti i tipi di input di DMO, il DMO deve in genere restituire almeno un tipo completo per ogni flusso di output. Un tipo di output completo facilita il test e le applicazioni possono usarlo come impostazione predefinita ragionevole. L'applicazione di test DMO si basa su questo comportamento. Vedere Uso dell'applicazione DMOTest.

Impostazione dei tipi di supporti

Le applicazioni usano i metodi SetInputType e SetOutputType per testare, impostare o cancellare i tipi in un flusso specificato. L'applicazione deve specificare completamente il tipo. DMO verifica se può accettare il tipo proposto. La risposta può dipendere dai tipi impostati su altri flussi. Il flag DMO_SET_TYPEF_CLEAR cancella il tipo di un flusso, in modo che l'applicazione possa "eseguire il backout" e provare un'altra combinazione.

Scenari di esempio

Gli esempi seguenti descrivono alcuni scenari tipici, per illustrare i punti fatti nelle sezioni precedenti.

  • Decodificatori video. In un tipico decodificatore video, il tipo di input determina in parte il tipo di output. Ad esempio, entrambi i flussi devono avere la stessa frequenza dei fotogrammi e le stesse dimensioni dell'immagine. Un'opzione non consiste nel definire alcun tipo di output preferito fino a quando non viene impostato il tipo di input. Un'altra opzione consiste nell'enumerare un set di tipi incompleti, omettendo il blocco di formato. Usare il sottotipo per indicare i tipi non compressi supportati, ad esempio RGB a 16 bit, RGB a 24 bit e così via. Inoltre, i decodificatori video in genere non supportano l'impostazione del tipo di output prima del tipo di input. Lo scenario consueto consiste nel decodificare da un formato di input noto, quindi questa limitazione è ragionevole.
  • Decodificatori audio. Un decodificatore audio potrebbe supportare un set limitato e fisso di formati di output. In tal caso, potrebbe essere possibile creare un elenco di formati di output preferiti prima che il formato di input sia noto.
  • Compressori. Nella maggior parte dei casi, un compressore video non può specificare completamente i formati di output preferiti fino a quando l'applicazione non imposta il formato di input e viceversa. Al contrario, DMO deve restituire un tipo incompleto senza blocchi di formato. Per la compressione audio e video, l'applicazione in genere deve impostare vari parametri di output, ad esempio la velocità in bit. Tuttavia, dopo aver impostato il tipo di input, il compressore deve restituire almeno un tipo di output completo, per i motivi indicati in precedenza.

Scrittura di un DMO