Impostazione delle preferenze di Deinterlace
[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.
Il renderer di mix video (VMR) supporta l'interlacing accelerato dall'hardware, che migliora la qualità di rendering per il video interlacciato. Le funzionalità esatte disponibili dipendono dall'hardware sottostante. L'applicazione può eseguire una query per le funzionalità di deinterlacing hardware e impostare le preferenze di deinterlacing tramite l'interfaccia IVMRDeinterlaceControl (VMR-7) o LVMRDeinterlaceControl9 (VMR-9). La deinterlacing viene eseguita su base per flusso.
Esiste una differenza importante nel comportamento di interlacciamento tra VMR-7 e VMR-9. Nei sistemi in cui l'hardware grafico non supporta l'inserimento deinterlacing avanzato, vmR-7 può tornare alla sovrapposizione hardware e indicare che usa uno stile BOB deinterlace. In questo caso, anche se vmR segnala 30fps il video viene effettivamente eseguito il rendering a 60 capovolgimenti al secondo.
Tranne nel caso di VMR-7 usando la sovrapposizione hardware, la denterlacing viene eseguita dal mixer di VMR. Il mixer usa l'interfaccia DDI (DirectX Video Acceleration) deinterlacing device interface (DDI) per eseguire la denterlacing. Questa DDI non è chiamabile dalle applicazioni e le applicazioni non possono sostituire la funzionalità di deinterlacing di VMR. Tuttavia, un'applicazione può selezionare la modalità di deinterlacing desiderata, come descritto in questa sezione.
Nota
Questa sezione descrive i metodi IVMRDeinterlaceControl9 , ma le versioni di VMR-7 sono quasi identiche.
Per ottenere le funzionalità di deinterlacing per un flusso video, eseguire le operazioni seguenti:
- Compilare una struttura VMR9VideoDesc con una descrizione del flusso video. I dettagli su come compilare questa struttura vengono forniti in un secondo momento.
- Passare la struttura al metodo IVMRDeinterlaceControl9::GetNumberOfDeinterlaceModes . Chiamare il metodo due volte. La prima chiamata restituisce il numero di modalità deinterlace supportate dall'hardware per il formato specificato. Allocare una matrice di GUID di questa dimensione e chiamare di nuovo il metodo, passando l'indirizzo della matrice. La seconda chiamata riempie la matrice con GUID. Ogni GUID identifica una modalità di deinterlacing.
- Per ottenere le capabiltiies di una determinata modalità, chiamare il metodo IVMRDeinterlaceControl9::GetDeinterlaceModeCaps . Passare la stessa struttura VMR9VideoDesc , insieme a uno dei GUID della matrice. Il metodo riempie una struttura VMR9DeinterlaceCaps con le funzionalità della modalità.
Il codice seguente illustra questi passaggi:
VMR9VideoDesc VideoDesc;
DWORD dwNumModes = 0;
// Fill in the VideoDesc structure (not shown).
hr = pDeinterlace->GetNumberOfDeinterlaceModes(&VideoDesc,
&dwNumModes, NULL);
if (SUCCEEDED(hr) && (dwNumModes != 0))
{
// Allocate an array for the GUIDs that identify the modes.
GUID *pModes = new GUID[dwNumModes];
if (pModes)
{
// Fill the array.
hr = pDeinterlace->GetNumberOfDeinterlaceModes(&VideoDesc,
&dwNumModes, pModes);
if (SUCCEEDED(hr))
{
// Loop through each item and get the capabilities.
for (int i = 0; i < dwNumModes; i++)
{
VMR9DeinterlaceCaps Caps;
hr = pDeinterlace->GetDeinterlaceModeCaps(pModes + i,
&VideoDesc, &Caps);
if (SUCCEEDED(hr))
{
// Examine the Caps structure.
}
}
}
delete [] pModes;
}
}
Ora l'applicazione può impostare la modalità di deinterlacing per il flusso usando i metodi seguenti:
- Il metodo SetDeinterlaceMode imposta la modalità preferita. Usare GUID_NULL per disattivare il denterlacing.
- Il metodo SetDeinterlacePrefs specifica il comportamento se la modalità richiesta non è disponibile.
- Il metodo GetDeinterlaceMode restituisce la modalità preferita impostata.
- Il metodo GetActualDeinterlaceMode restituisce la modalità effettiva in uso, che potrebbe essere una modalità di fallback, se la modalità preferita non è disponibile.
Le pagine di riferimento del metodo forniscono altre informazioni.
Uso della struttura VMR9VideoDesc
Nella procedura specificata in precedenza, il primo passaggio consiste nel compilare una struttura VMR9VideoDesc con una descrizione del flusso video. Per iniziare, ottenere il tipo di supporto del flusso video. È possibile eseguire questa operazione chiamando IPin::ConnectionMediaType nel pin di input del filtro VMR. Verificare quindi se il flusso video è interlacciato. Solo i formati VIDEOINFOHEADER2 possono essere interlacciati. Se il tipo di formato è FORMAT_VideoInfo, deve essere un frame progressivo. Se il tipo di formato è FORMAT_VideoInfo2, controllare il campo dwInterlaceFlags per il flag di AMINTERLACE_IsInterlaced. La presenza di questo flag indica che il video è interlacciato.
Si supponga che la variabile pBMI sia un puntatore alla struttura BITMAPINFOHEADER nel blocco di formato. Impostare i valori seguenti nella struttura VMR9VideoDesc :
dwSize: impostare questo campo su
sizeof(VMR9VideoDesc)
.dwSampleWidth: Impostare questo campo su
pBMI->biWidth
.dwSampleHeight: impostare questo campo su
abs(pBMI->biHeight)
.SampleFormat: questo campo descrive le caratteristiche interlace del tipo di supporto. Controllare il campo dwInterlaceFlags nella struttura VIDEOINFOHEADER2 e impostare SampleFormat uguale al flag di VMR9_SampleFormat equivalente. Di seguito è riportata una funzione helper.
InputSampleFreq: questo campo fornisce la frequenza di input, che può essere calcolata dal campo AvgTimePerFrame nella struttura VIDEOINFOHEADER2 . Nel caso generale impostare dwNumerator su 10000000 e impostare dwDenominator su AvgTimePerFrame. Tuttavia, è anche possibile verificare la presenza di alcune frequenze di frame ben note:
Tempo medio per fotogramma Frequenza dei fotogrammi (fps) Numeratore Denominatore 166833 59.94 (NTSC) 60000 1001 333667 29.97 (NTSC) 30000 1001 417188 23.97 (NTSC) 24000 1001 200000 50.00 (PAL) 50 1 400000 25.00 (PAL) 25 1 416667 24.00 (Film) 24 1 OutputFrameFreq: questo campo fornisce la frequenza di output, che può essere calcolata dal valore InputSampleFreq e dalle caratteristiche interleaving del flusso di input:
- Impostare OutputFrameFreq.dwDenominator uguale a InputSampleFreq.dwDenominator.
- Se il video di input è interleaved, impostare OutputFrameFreq.dwNumerator su 2 x InputSampleFreq.dwNumerator. Dopo la denterlacing, la frequenza dei fotogrammi viene raddoppiata. In caso contrario, impostare il valore su InputSampleFreq.dwNumerator.
dwFourCC: impostare questo campo su
pBMI->biCompression
.
La funzione helper seguente converte i flag AMINTERLACE_X in valori VMR9_SampleFormat :
#define IsInterlaced(x) ((x) & AMINTERLACE_IsInterlaced)
#define IsSingleField(x) ((x) & AMINTERLACE_1FieldPerSample)
#define IsField1First(x) ((x) & AMINTERLACE_Field1First)
VMR9_SampleFormat ConvertInterlaceFlags(DWORD dwInterlaceFlags)
{
if (IsInterlaced(dwInterlaceFlags)) {
if (IsSingleField(dwInterlaceFlags)) {
if (IsField1First(dwInterlaceFlags)) {
return VMR9_SampleFieldSingleEven;
}
else {
return VMR9_SampleFieldSingleOdd;
}
}
else {
if (IsField1First(dwInterlaceFlags)) {
return VMR9_SampleFieldInterleavedEvenFirst;
}
else {
return VMR9_SampleFieldInterleavedOddFirst;
}
}
}
else {
return VMR9_SampleProgressiveFrame; // Not interlaced.
}
}