Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
[La funzionalità associata a questa pagina, DirectShow, è una funzionalità legacy. È stato sostituito da MediaPlayer, IMFMediaEnginee Acquisizione audio/video in Media Foundation. Queste funzionalità sono state ottimizzate per Windows 10 e Windows 11. Microsoft consiglia vivamente di usare nuovo codice MediaPlayer, IMFMediaEngine e acquisizione audio/video 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.
Letterbox e PanScan
L'immagine 4x3 può essere formata spaziando la parte superiore e inferiore dell'immagine (definita immagine letterbox) o estraendo una parte 4x3 dell'immagine (detta immagine PanScan). I menu e i flussi di sottopicture sono sovrapposti all'immagine video finale. Le immagini di rapporto 16x9 vengono archiviate in un formato anamorfico 4x3. Estendendo il video di origine con proporzioni anamorfiche 4x3 720x480 a un rapporto 16x9 si ottiene l'immagine originale con aspetto 16x9.
Di seguito è riportata una descrizione di come visualizzare correttamente ognuna delle modalità e le relative evidenziazioni:
- Widescreen: Il video di origine si estende nella più grande area 16x9 della finestra di output. I punti salienti sono relativi all'interno dell'area 16x9. Le barre nere devono essere aggiunte alla parte superiore e inferiore o ai lati per mantenere un'area 16x9.
- Analisi panoramica: Dal video 16x9, usare l'offset orizzontale fornito nel flusso MPEG2 per estrarre una sottofinestra 4x3. Posizionare la sottofinestra 4x3 nella più grande area 4x3 della finestra del client di output. Le coordinate dell'elemento evidenziato sono relative alla finestra di output 4x3 e non hanno alcun rapporto con il video sorgente 16x9. Le barre nere devono essere aggiunte alla parte superiore e inferiore o ai lati per mantenere un'area 4x3.
- Letterbox: Calcolare la più grande area 4x3 della finestra di output. Le barre nere devono essere aggiunte alla parte superiore e inferiore o ai lati per mantenere un'area 4x3. Il video anamorfico 4x3 di origine (che rappresenta un'immagine 16x9) viene inserito nella finestra secondaria 16x9 più grande all'interno dell'area 4x3. Le barre nere devono essere aggiunte alla parte superiore e inferiore della finestra secondaria per mantenere un'area 16x9. Le coordinate dell'evidenziazione sono relative all'area 4x3 e non hanno alcuna relazione con il video di origine 16x9. È possibile che un disco specifichi un'evidenziazione esterna all'area 16x9 (ma ancora nella finestra 4x3). Per il video 4x3, il video viene posizionato nell'area di output 4x3 più grande della finestra del client di output. Le barre nere devono essere aggiunte alla parte superiore e inferiore o ai lati per mantenere un'area 4x3.
preprocessamento MPEG con il Navigatore DVD e VMR
Attualmente, al decodificatore viene fornito un tipo di media FORMAT_MPEG2_VIDEO (il cui blocco di formato punta a una struttura MPEG2VIDEOINFO). Nei pin di output, il decodificatore produce un tipo di media FORMAT_VideoInfo2, il cui blocco di formato punta a una struttura VIDEOINFOHEADER2. Il campo dwReserved della struttura è stato rinominato nel campo di flag dwControls.
Il membro dwControlFlags conterrà ora i nuovi bit.
| Etichetta | Valore |
|---|---|
| AMCONTROL_USED | 0x00000001 |
| AMCONTROL_PAD_TO_4x3 | 0x00000002 |
| AMCONTROL_PAD_TO_16x9 | 0x00000004 |
AMCONTROL_USED viene usato per verificare se questi nuovi flag sono supportati. Un filtro di origine deve impostare il flag AMCONTROL_USED e verificare se QueryAccept(MediaType) ha esito positivo sul pin downstream. Se viene rifiutato, i flag AMCONTROL non possono essere usati e dwReserved1 deve essere impostato su 0.
AMCONTROL_PAD_TO_4x3 indica che l'immagine deve essere imbottita e visualizzata in un formato 4x3.
AMCONTROL_PAD_TO_16x9 indica che l'immagine deve essere riempita e visualizzata in un'area 16x9.
Il decodificatore deve copiare o elaborare alla cieca i bit. Se il decodificatore esegue il letterboxing dell'immagine stesso, deve modificare il rapporto d'aspetto dei pixel, aggiungere bande all'immagine e rimuovere i bit corrispondenti di AMCONTROL_*.
Il MPEG2VIDEOINFO.dwFlags contiene ora tre flag per il controllo per il controllo della modalità di visualizzazione del contenuto:
AMMPEG2_DoPanScan (0x00000001): Se questo flag è impostato, il decodificatore video MPEG-2 deve ritagliare l'immagine di output in base ai vettori pan-scan in picture_display_extension e modificare il rapporto d'aspetto dell'immagine in 4x3. Il VMR non dovrebbe ricevere un campione 16x9 con questo flag. Un'implementazione semplice può modificare il rettangolo di origine per indicare un'area di origine 540 wide con un bordo sinistro uguale all'offset di visualizzazione nella picture_display_extension.AMMPEG2_LetterboxAnalogOut (0x00000020): quando un decodificatore hardware visualizza questo flusso in un output video (in genere un connettore SVIDEO sulla scheda), deve applicare le regole per la visualizzazione di un campione di 16x9 su un display 4x3.Un decodificatore software (o un decodificatore hardware che produce l'output inviato a VMR) ha due opzioni durante l'elaborazione delle immagini:
- Ignora questo flag e passa il contenuto di VideoInfoHeader2 al VMR (il flag AMCONTROL_PAD_TO_4x3 sarà già impostato dal navigatore DVD nell'esempio). VmR rileva un esempio video di 16x9 con il flag AMCONTROL_PAD_TO_4x3 impostato e un flusso secondario 4x3. L'applicazione deve impostare i rettangoli di destinazione normalizzati di output dei due flussi in modo che corrispondano alla stessa larghezza.
- Convertire il flusso anamorfico in un'immagine 4x3 spaziando la parte superiore e inferiore dell'immagine e impostando le proporzioni dell'immagine su 4x3 (vedere Letterbox sopra) e rimuovendo il bit AMCONTROL_PAD_TO_4x3 dal VIDEOINFOHEADER2.
I decodificatori DirectXVA che fondono i flussi video e sottotitoli dovranno elaborare questo flag. Se l'hardware non è in grado di ridimensionare l'area secondaria combinata, il decodificatore deve produrre un flusso di sottopicture separato per il vmR per fondersi con il video.
AMMPEG2_WidescreenAnalogOut (0x00000200): quando un decodificatore hardware visualizza questo flusso in un output video (in genere un connettore SVIDEO sulla scheda), deve presupporre uno schermo 16x9 (anamorfico).Un decodificatore software (o un decodificatore hardware che produce l'output inviato a VMR) ha due opzioni durante l'elaborazione di un'immagine anamorfica:
- Ignorare questo flag e copiare il contenuto di VideoInfoHeader2 nel VMR. Il VMR eseguirà il padding delle immagini 4x3 a 16x9 se hanno il AMCONTROL_PAD_TO_16x9 impostato.
- Estendere l'immagine di output per adattarla a un formato 16x9 e rimuovere il bit AMCONTROL_PAD_TO_16x9.
La maggior parte dei decodificatori deve usare GetMediaType per rilevare una modifica multimediale sul pin di input e copiare il contenuto del VIDEOINFOHEADER2 (contenuto nel MPEG2INFOHEADER) nel pin di output. Probabilmente eseguiranno solo l'elaborazione del bit PanScan.
Il codice di esempio seguente illustra come copiare il contenuto del VIDEOINFOHEADER2 da un pin di input a un pin di output.
#include <dvdmedia.h>
HRESULT CopyMPeg2ToVideoInfoHeader2(CMediaSample* pInSample, CMediaSample* pOutSample)
{
HRESULT hr = S_OK;
// Check for a media type on the input sample.
AM_MEDIA_TYPE* pInType;
if (pInSample->GetMediaType(&pInType) == S_OK)
{
// Make sure it's an MPEG2 Video format.
if ((pInType->formattype == FORMAT_MPEG2_VIDEO) &&
(pInType->cbFormat >= sizeof(MPEG2VIDEOINFO)))
{
hr = S_OK; // Initialize hr for the CMediaType constructor.
CMediaType outType(*pInType, &hr);
if (FAILED(hr))
{
DeleteMediaType( pInType );
return hr;
}
// Set the format type GUID.
outType.SetFormatType(&FORMAT_VideoInfo2);
// Truncate the format block to include just the VIDEOINFOHEADER part.
MPEG2VIDEOINFO *pMPeg2Header = (MPEG2VIDEOINFO*)pInType->pbFormat;
BYTE *pVIH = (BYTE*)&pMPeg2Header->hdr;
hr = (outType.SetFormat(pVIH, sizeof(VIDEOINFOHEADER2)) ? S_OK : E_OUTOFMEMORY);
if (SUCCEEDED(hr))
{
hr = pOutSample->SetMediaType(&outType);
}
}
else
{
ASSERT(FALSE); // Not a MPEG2 header.
hr = VFW_E_INVALIDMEDIATYPE;
}
DeleteMediaType( pInType );
}
return hr;
}