Informazioni sui tipi di supporti (DirectShow)

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

Poiché DirectShow è modulare, richiede un modo per descrivere il formato dei dati in ogni punto del grafico del filtro. Si consideri ad esempio la riproduzione AVI. I dati vengono immessi nel grafico come flusso di blocchi RIFF. Questi vengono analizzati in flussi video e audio. Il flusso video è costituito da fotogrammi video, che probabilmente sono compressi. Dopo la decodifica, il flusso video è una serie di bitmap non compresse. Il flusso audio passa attraverso un processo simile.

Tipi di supporti: come DirectShow rappresenta i formati

Il tipo di supporto è un modo universale ed estendibile per descrivere i formati multimediali digitali. Quando due filtri si connettono, accettano un tipo di supporto. Il tipo di supporto identifica il tipo di dati che il filtro upstream fornirà al filtro downstream e il layout fisico dei dati. Se due filtri non possono accettare un tipo di supporto, non si connetteranno.

Per alcune applicazioni, non è mai necessario preoccuparsi dei tipi di supporti. Nella riproduzione di file, ad esempio, DirectShow gestisce tutti i dettagli. È possibile che altri tipi di applicazioni funzionino direttamente con i tipi di supporti.

I tipi di supporti vengono definiti usando la struttura AM_MEDIA_TYPE . Questa struttura contiene le informazioni seguenti:

  • Tipo principale: il tipo principale è un GUID che definisce la categoria complessiva dei dati. I tipi principali includono video, audio, flusso di byte non analizzato, dati MIDI e così via.

  • Sottotipo: il sottotipo è un altro GUID, che definisce ulteriormente il formato. Ad esempio, all'interno del tipo principale del video, sono disponibili sottotipi per RGB-24, RGB-32, UYVY e così via. All'interno dell'audio sono presenti audio PCM, payload MPEG-1 e altri. Il sottotipo fornisce più informazioni rispetto al tipo principale, ma non definisce tutti gli elementi relativi al formato. Ad esempio, i sottotipi video non definiscono le dimensioni dell'immagine o la frequenza dei fotogrammi. Questi sono definiti dal blocco di formato, descritto di seguito.

  • Blocco di formato: il blocco di formato è un blocco di dati che descrive in dettaglio il formato. Il blocco di formato viene allocato separatamente dalla struttura AM_MEDIA_TYPE . Il membro pbFormat della struttura AM_MEDIA_TYPE punta al blocco di formato.

    Il membro pbFormat viene tipizzato void* perché il layout del blocco di formato cambia a seconda del tipo di supporto. Ad esempio, l'audio PCM usa una struttura WAVEFORMATEX . Il video usa varie strutture, tra cui VIDEOINFOHEADER e VIDEOINFOHEADER2. Il membro formattype della struttura AM_MEDIA_TYPE è un GUID che specifica la struttura contenuta nel blocco di formato. A ogni struttura di formato viene assegnato un GUID. Il membro cbFormat specifica le dimensioni del blocco di formato. Controllare sempre questi valori prima di dereferenziare il puntatore pbFormat .

Se il blocco di formato viene compilato, il tipo principale e il sottotipo contengono informazioni ridondanti. Il tipo principale e il sottotipo, tuttavia, offrono un modo pratico per identificare i formati senza un blocco di formato completo. Ad esempio, è possibile specificare un formato RGB a 24 bit generico (MEDIASUBTYPE_RGB24), senza conoscere tutte le informazioni richieste dalla struttura VIDEOINFOHEADER , ad esempio dimensioni dell'immagine e frequenza dei fotogrammi.

Ad esempio, un filtro può usare il codice seguente per controllare un tipo di supporto:

HRESULT CheckMediaType(AM_MEDIA_TYPE *pmt)
{
    if (pmt == NULL) return E_POINTER;

    // Check the major type. We're looking for video.
    if (pmt->majortype != MEDIATYPE_Video)
    {
        return VFW_E_INVALIDMEDIATYPE;
    }

    // Check the subtype. We're looking for 24-bit RGB.
    if (pmt->subtype != MEDIASUBTYPE_RGB24)
    {
        return VFW_E_INVALIDMEDIATYPE;
    }

    // Check the format type and the size of the format block.
    if ((pmt->formattype == FORMAT_VideoInfo) &&
         (pmt->cbFormat >= sizeof(VIDEOINFOHEADER) &&
         (pmt->pbFormat != NULL))
    {
        // Now it's safe to coerce the format block pointer to the
        // correct structure, as defined by the formattype GUID.
        VIDEOINFOHEADER *pVIH = (VIDEOINFOHEADER*)pmt->pbFormat;
    
        // Examine pVIH (not shown). If it looks OK, return S_OK.
        return S_OK;
    }

    return VFW_E_INVALIDMEDIATYPE;
}

La struttura AM_MEDIA_TYPE contiene anche alcuni campi facoltativi. Questi possono essere usati per fornire informazioni aggiuntive, ma i filtri non sono necessari per usarli:

  • lSampleSize. Se questo campo è diverso da zero, definisce le dimensioni di ogni campione. Se è zero, indica che la dimensione del campione può cambiare da campione a campione.
  • bFixedSizeSamples. Se questo flag booleano è TRUE, significa che il valore in lSampleSize è valido. In caso contrario, è necessario ignorare lSampleSize.
  • bTemporalCompression. Se questo flag booleano è FALSE, significa che tutti i fotogrammi sono fotogrammi chiave.

Grafico dei filtri e relativi componenti