Condividi tramite


Controllo qualità predefinito

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

Le classi di base DirectShow implementano alcuni comportamenti predefiniti per il controllo qualità video.

I messaggi di qualità iniziano nel renderer. La classe base per i renderer video è CBaseVideoRenderer, che ha il comportamento seguente:

  1. Quando il renderer video riceve un esempio, confronta il timestamp nell'esempio con l'ora di riferimento corrente.
  2. Il renderer video genera un messaggio di qualità. Nella classe di base, il membro Proporzioni del messaggio di qualità è limitato a un intervallo di 500 (50%) a 2000 (200%). I valori esterni a questo intervallo potrebbero comportare modifiche di qualità improvvise.
  3. Per impostazione predefinita, il renderer video invia il messaggio di qualità al pin di output upstream (il pin connesso al pin di input). Le applicazioni possono eseguire l'override di questo comportamento chiamando il metodo SetSink .

Ciò che accade successivamente dipende dal filtro upstream. In genere, si tratta di un filtro di trasformazione. La classe di base per i filtri di trasformazione è CTransformFilter, che usa le classi CTransformInputPin e CTransformOutputPin per implementare i pin di input e di output. Insieme, queste classi hanno il comportamento seguente:

  1. Il metodo CTransformOutputPin::Notify chiama CTransformFilter::AlterQuality, un metodo privato nella classe base del filtro.
  2. I filtri derivati possono eseguire l'override di AlterQuality per gestire il messaggio di qualità. Per impostazione predefinita, AlterQuality ignora il messaggio di qualità.
  3. Se AlterQuality non gestisce il messaggio di qualità, il pin di output chiama CBaseInputPin::P assNotify, un metodo privato nel pin di input del filtro.
  4. PassNotify passa il messaggio di qualità al posto appropriato, ovvero il pin di output upstream successivo o un gestore di qualità personalizzato.

Supponendo che nessun filtro di trasformazione gestisca il messaggio di qualità, il messaggio raggiunge infine il pin di output nel filtro di origine. Nelle classi di base, CBasePin::Notify restituisce E_NOTIMPL. Il modo in cui un determinato filtro di origine gestisce i messaggi di qualità dipende dalla natura dell'origine. Alcune origini, ad esempio l'acquisizione di video live, non possono eseguire controlli qualitativi significativi. Altre origini possono modificare la frequenza in cui forniscono campioni.

Il diagramma seguente illustra il comportamento predefinito.

controllo qualitativo nelle classi di base

Il renderer video di base implementa IQualityControl::Notify, che significa che è possibile passare messaggi di qualità al renderer stesso. Se si imposta il membro Proportion su un valore minore di 1000, il renderer video inserisce un periodo di attesa tra ogni fotogramma che esegue il rendering, in effetti rallentando il renderer. È possibile eseguire questa operazione per ridurre l'utilizzo del sistema, ad esempio. Per altre informazioni, vedere CBaseVideoRenderer::ThrottleWait. L'impostazione del membro Proporzioni su un valore maggiore di 1000 non ha alcun effetto.

Gestione del controllo della qualità