Creazione del grafico del filtro DVD

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

Come per qualsiasi applicazione DirectShow, un'applicazione di riproduzione DVD inizia creando un grafico di filtro. DirectShow fornisce i componenti seguenti per la riproduzione DVD:

La riproduzione DVD richiede anche un decodificatore MPEG-2. I decodificatori MPEG-2 hardware e software sono disponibili da terze parti. Creare prima di tutto un'istanza dell'oggetto DVD Graph Builder.

IDvdGraphBuilder *pBuild = NULL;
hr = CoCreateInstance(CLSID_DvdGraphBuilder, NULL, 
    CLSCTX_INPROC_SERVER, IID_IDvdGraphBuilder, (void **)&pBuild);

A questo punto, è possibile selezionare e configurare il renderer video prima di compilare il resto del grafico. Questo passaggio, facoltativo, è descritto in modo più dettagliato nella sezione successiva. Se si omette questo passaggio, il generatore di grafici DVD seleziona un renderer predefinito. Compilare quindi il grafico chiamando il metodo IDeviceGraphBuilder::RenderVideoVolume .

AM_DVD_RENDERSTATUS buildStatus;
hr = pBuild->RenderDvdVideoVolume(L"Z:\\video_ts", 0, &buildStatus);

Il primo parametro è il nome di una directory contenente i file DVD. In un disco DVD questi file si trovano in una directory denominata VIDEO_TS. Se il primo parametro è NULL, dvd Graph Builder usa la prima unità che contiene un volume DVD.

Il secondo parametro contiene vari flag facoltativi per scegliere il tipo di decodificatore (hardware o software) e altre opzioni.

Il terzo parametro è una struttura AM_DVD_RENDERSTATUS che riceve informazioni sullo stato. Se il metodo RenderVideoVolume restituisce S_FALSE, significa che la chiamata ha esito parziale (o parzialmente non riuscita, se si è un pessimista). Ad esempio, il metodo potrebbe non riuscire a eseguire il rendering del flusso di sottopicture, anche se gli altri flussi sono stati sottoposti a rendering correttamente. Se il metodo RenderVideoVolume restituisce un codice di errore o il valore S_FALSE, è possibile esaminare la struttura di AM_DVD_RENDERSTATUS per informazioni dettagliate sull'errore.

Ottenere quindi un puntatore a Filter Graph Manager chiamando IDeviceGraphBuilder::GetFiltergraph. Questo metodo restituisce un puntatore all'interfaccia IGraphBuilder di Filter Graph Manager.

IGraphBuilder *pGraph = NULL;
hr =  pBuild->GetFiltergraph(&m_pGraph);

Usare il metodo IDeviceGraphBuilder::GetDeviceInterface per recuperare le interfacce correlate al DVD, tra cui quanto segue:

  • I MdfControl2. Controlla la riproduzione e i comandi DVD
  • I MdfInfo2. Restituisce informazioni sullo stato corrente del navigatore DVD.
  • IAMLine21Decoder. Controlli chiusi didascalia visualizzazione. La visualizzazione chiusa didascalia è abilitata per impostazione predefinita. Per disabilitarla, chiamare IAMLine21Decoder::SetServiceState con il flag di AM_L21_CCSTATE_Off.
  • IBasicAudio. Controlla il volume audio e il bilanciamento.

Ad esempio, il codice seguente restituisce l'interfaccia I MdfControl2 .

IDvdControl2 *pDvdControl = NULL;
hr = pBuild->GetDvdInterface(IID_IDvdControl2, (void**)&pDvdControl);

Il modo consigliato per compilare il grafico del filtro di riproduzione DVD consiste nell'avere un oggetto DVD Graph Builder automaticamente. Questo approccio è illustrato di seguito e nell'applicazione di esempio DVD. Se è necessario compilare manualmente il grafico del filtro DVD, è possibile eseguire questa operazione seguendo le regole di base della compilazione di grafo illustrate altrove nella documentazione di DirectShow. In genere, non è consigliabile aggiungere manualmente, rimuovere, connettere o disconnettere singoli filtri nel grafico creato da DVD Graph Builder, perché in questo modo potrebbe confondere il codice di pulizia.

Configurazione del renderer video

DirectShow offre diversi filtri del renderer video. Prima di compilare il grafico, è possibile scegliere quale renderer video si preferisce. Selezionare il renderer chiamando IDeviceGraphBuilder::GetDeviceInterface e richiedendo un'interfaccia specifica per tale renderer:

Se si richiede una di queste interfacce prima di compilare il grafico del filtro, il generatore di grafici DVD crea il renderer video corrispondente. Successivamente, quando si compila il grafico, il generatore di grafici DVD tenterà di usare tale renderer. Tuttavia, se non riesce a compilare il grafico usando il renderer selezionato, può passare a un altro renderer. Ad esempio, il decodificatore MPEG-2 potrebbe non essere compatibile con il filtro VMR, in questo caso il generatore di grafici DVD potrebbe essere predefinito per il mixer di sovrapposizione.

Queste interfacce offrono anche la possibilità di configurare il renderer prima che sia connesso al decodificatore. Ad esempio, è possibile impostare vmR per usare la modalità senza finestra anziché la modalità finestra predefinita. Per altre informazioni sui renderer video, vedere l'argomento Informazioni sul rendering video in DirectShow.

In Windows XP e versioni successive, Il generatore di grafici DVD usa sempre il Renderer 7 (VMR-7), a meno che:

  • Le interfacce del chiamante trovano solo il Mixer sovrimpressione, ad esempio IMixerPinConfig2. In questo modo viene inviato un suggerimento a DVD Graph Builder che l'applicazione vuole usare il mixer di sovrapposizione e non la macchina virtuale. Lettore multimediale Windows dispone anche di un'opzione della finestra di dialogo per forzare l'uso di Overlay Mixer.
  • Il decodificatore installato non è compatibile con VMR. Durante la compilazione del grafico, viene usata la nuova interfaccia IAMDecoderCaps per verificare la presenza del supporto vmR del decodificatore. Se questo non è presente, il generatore di grafici DVD userà il mixer di sovrapposizione.
  • Durante l'uso di un decodificatore hardware, il decodificatore non può connettersi a Video Port Manager (VPM). Se un decodificatore hardware non può usare il VPM, non può usare VMR e quindi dvd Graph Builder tenta di creare un grafico usando il mixer di sovrapposizione.
  • La scheda di visualizzazione è nota per avere risorse e/o funzionalità insufficienti per supportare vmR, ma non segnala correttamente questo problema nel driver. Alcuni casi noti sono esclusi in particolare dal DVD Graph Builder.
  • La connessione tra il decodificatore e la VMR non riesce per qualsiasi motivo, in genere a causa di una mancanza di VRAM per creare le superfici necessarie. In questi casi, il generatore di grafici DVD disattiva l'uso di VMR e tenta di usare Il mixer di sovrapposizione per compilare un grafico.

Modalità finestra

In modalità finestra (Overlay Mixer o VMR), il renderer crea la propria finestra video. Per rendere questa finestra figlio della finestra dell'applicazione, chiamare IVideoWindow::p ut_Owner con un handle all'applicazione. Chiamare anche IVideoWindow::p ut_WindowStyle per impostare gli stili di WS_CHILD e WS_CLIPSIBLINGS nella finestra video del renderer. Per ottenere messaggi del mouse dalla finestra video del renderer, chiamare IVideoWindow::p ut_MessageDrain con un handle nella finestra dell'applicazione. Questo metodo configura un "svuotamento dei messaggi", ovvero la finestra video inoltra tutti i messaggi del mouse ricevuti nella finestra di svuotamento dei messaggi.

pVideoWindow->put_Owner((OAHWND)hwnd);
pVideoWindow->put_WindowStyle(WS_CHILD | WS_CLIPSIBLINGS);
pVideoWindow->put_MessageDrain((OAHWND)hwnd) ;

Il svuotamento del messaggio rende la selezione dei pulsanti di menu DVD leggermente complicati. Supponendo che la finestra video non riempia l'intera area client dell'applicazione, alcuni eventi del mouse verranno caduti all'esterno della finestra video. Quando si ottiene un evento del mouse dall'interno della finestra video, è necessario elaborarlo per la navigazione del menu DVD. Gli eventi del mouse dall'esterno della finestra video non devono essere elaborati. Con il messaggio di svuotamento, non c'è modo di distinguere tra i due. Inoltre, le coordinate per gli eventi del mouse dalla finestra video sono relative all'area client della finestra video; ma gli eventi del mouse dall'esterno della finestra video sono relativi all'area client dell'applicazione.

Modalità senza finestra

La modalità senza finestre evita completamente i problemi relativi ai messaggi del mouse. Non è necessario scaricare un messaggio, perché vmR (o EVR) non crea la propria finestra in modalità senza finestra. Viene invece disegnato direttamente nella finestra dell'applicazione. Se il rettangolo di destinazione è minore dell'area client dell'applicazione, lo strumento di navigazione DVD tiene conto di quando calcola le posizioni del pulsante DVD. Pertanto, quando si riceve un messaggio del mouse, è possibile passare le coordinate direttamente al navigatore DVD, come descritto nella sezione Spostamento menu.

Applicazioni DVD