Negoziazione dei tipi di supporti

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

Quando Filter Graph Manager chiama il metodo IPin::Connect , sono disponibili diverse opzioni per specificare un tipo di supporto:

  • Tipo completo: Se il tipo di supporto è completamente specificato, i pin tentano di connettersi a tale tipo. Se non è possibile, il tentativo di connessione ha esito negativo.
  • Tipo di supporto parziale: Un tipo di supporto è parziale se il tipo principale, il sottotipo o il tipo di formato è GUID_NULL. Il valore GUID_NULL funge da carattere jolly, che indica che qualsiasi valore è accettabile. I pin negoziano un tipo coerente con il tipo parziale.
  • Nessun tipo di supporto: Se Filter Graph Manager passa un puntatore NULL , i pin possono accettare qualsiasi tipo di supporto accettabile per entrambi i pin.

Se i pin si connettono, la connessione ha sempre un tipo di supporto completo. Lo scopo del tipo di supporto specificato da Filter Graph Manager consiste nel limitare i possibili tipi di connessione.

Durante il processo di negoziazione, il pin di output propone un tipo di supporto chiamando il metodo IPin::ReceiveConnection del pin di input. Il pin di input può accettare o rifiutare il tipo proposto. Questo processo viene ripetuto fino a quando il pin di input accetta un tipo o il pin di output viene esaurito di tipi e la connessione non riesce.

In che modo un pin di output seleziona i tipi di supporti da proporre dipende dall'implementazione. Nelle classi di base DirectShow il pin di output chiama IPin::EnumMediaTypes nel pin di input. Questo metodo restituisce un enumeratore che enumera i tipi di supporti preferiti del pin di input. In caso contrario, il pin di output enumera i propri tipi preferiti.

Uso dei tipi di supporti

In qualsiasi funzione che riceve un parametro AM_MEDIA_TYPE , convalidare sempre i valori di cbFormat e formattype prima di rinviare il membro pbFormat . Il codice seguente non è corretto:

if (pmt->formattype == FORMAT_VideoInfo)
{
    VIDEOINFOHEADER *pVIH = (VIDEOINFOHEADER*)pmt->pbFormat;
    // Wrong!
}

Il codice seguente è corretto:

if ((pmt->formattype == FORMAT_VideoInfo) && 
    (pmt->cbFormat > sizeof(VIDEOINFOHEADER) &&
    (pbFormat != NULL))
{
    VIDEOINFOHEADER *pVIH = (VIDEOINFOHEADER*)pmt->pbFormat;
    // Now you can dereference pVIH.
}