Condividi tramite


Trasformazioni di pre-elaborazione del decodificatore MPEG

[La funzionalità associata a questa pagina, DirectShow, è una funzionalità legacy. È stata sostituita da MediaPlayer, IMFMediaEngine 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, IMFMediaEngine e Audio/Video Capture in Media Foundation invece di 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 dalla spaziatura interna della parte superiore e inferiore dell'immagine (denominata immagine letterbox) o tramite l'estrazione di una parte 4x3 dell'immagine (denominata immagine PanScan). I menu e i flussi di sottopicture sono sovrapposti all'immagine video finale. Le immagini del rapporto 16x9 vengono archiviate in un formato anamorfico 4x3. L'estensione delle proporzioni anamorfiche 4x3 720x480 source video a 16x9 proporzioni forma l'immagine dell'aspetto originale 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. Le evidenziazioni sono relative 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 sottowindowa 4x3 nella più grande area 4x3 della finestra del client di output. Le coordinate dell'evidenziazione sono relative alla finestra di output 4x3 e non hanno alcuna relazione con il video di origine 16x9. Le barre nere devono essere aggiunte alla parte superiore e inferiore o ai lati per mantenere un'area 4x3.
  • Letterbox: Calcolare l'area 4x3 più grande 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 di origine 4x3 (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.

Pre-elaborazione MPEG con lo strumento di navigazione DVD e VMR

Attualmente, il decodificatore viene passato un tipo di supporto FORMAT_MPEG2_VIDEO (il cui blocco di formato punta a una struttura MPEG2VIDEOINFO ). Nei pin di output, il decodificatore produce un tipo di supporto FORMAT_VideoInfo2, il cui blocco di formato punta a una struttura VIDEOINFOHEADER2 . Il campo dwReserved della struttura è stato rinominato in 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, non è possibile usare i flag AMCONTROL e dwReserved1 deve essere impostato su 0.

AMCONTROL_PAD_TO_4x3 indica che l'immagine deve essere riempita e visualizzata in un'area 4x3.

AMCONTROL_PAD_TO_16x9 indica che l'immagine deve essere riempita e visualizzata in un'area 16x9.

Il decodificatore deve copiare o elaborare in modo cieco i bit. Se il decodificatore esegue il letterboxing stesso, deve modificare le proporzioni dei pixel, aggiungere l'immagine e rimuovere i bit AMCONTROL_* corrispondenti.

MPEG2VIDEOINFO.dwFlags contiene ora tre flag per il controllo per controllare la 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 di analisi panoramica in picture_display_extension e modificare le proporzioni dell'immagine in 4x3. VmR non deve ricevere un esempio 16x9 con questo flag. Un'implementazione semplice può modificare il rettangolo di origine per indicare un'area di origine a 540 larghe 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) offre due opzioni durante l'elaborazione delle immagini:

    1. Ignorare questo flag e passare il contenuto di VideoInfoHeader2 a VMR (il flag AMCONTROL_PAD_TO_4x3 sarà già impostato dallo strumento di navigazione DVD nell'esempio). VmR incontrerà un esempio video 16x9 con il flag AMCONTROL_PAD_TO_4x3 impostato e un flusso di sottopicture 4x3. L'applicazione deve impostare i rettangoli di destinazione normalizzati di output dei due flussi in modo che corrispondano alla stessa larghezza.
    2. 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 da VIDEOINFOHEADER2.

    I decodificatori DirectXVA che combinano i flussi video e secondario dovranno elaborare questo flag. Se l'hardware non è in grado di ridimensionare la sottopictura combinata, il decodificatore deve produrre un flusso di sottopicture separato per la fusione 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 una visualizzazione 16x9 (anamorfica).

    Un decodificatore software (o un decodificatore hardware che produce l'output inviato a VMR) ha due opzioni durante l'elaborazione di un'immagine anamorfica:

    1. Ignorare questo flag e copiare il contenuto di VideoInfoHeader2 in VMR. Se il AMCONTROL_PAD_TO_16x9 è impostato, la vmR eseguirà il pad delle immagini da 4x3 a 16x9.
    2. Aggiungere l'immagine di output a un'immagine a 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 VIDEOINFOHEADER2 (contenuto in MPEG2INFOHEADER) nel pin di output. Probabilmente elaboreranno solo il bit PanScan.

Il codice di esempio seguente mostra come copiare il contenuto 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;
}