Partager via


Transformations de prétraitement du décodeur MPEG

[La fonctionnalité associée à cette page, DirectShow, est une fonctionnalité héritée. Il a été remplacé par MediaPlayer, IMFMediaEngine et Audio/Video Capture dans Media Foundation. Ces fonctionnalités ont été optimisées pour Windows 10 et Windows 11. Microsoft recommande vivement au nouveau code d’utiliser MediaPlayer, IMFMediaEngine et La capture audio/vidéo dans Media Foundation au lieu de DirectShow, lorsque cela est possible. Microsoft suggère que le code existant qui utilise les API héritées soit réécrit pour utiliser les nouvelles API si possible.]

Boîte aux lettres et PanScan

L’image 4x3 peut être formée en remplissant le haut et le bas de l’image (appelée image Letterbox) ou en extrayant une partie 4x3 de l’image (appelée image PanScan). Les menus et les flux de sous-image sont superposés sur l’image vidéo finale. Les images au format 16x9 sont stockées dans un format anamorphique 4x3. L’étirement de la vidéo source anamorphique 4x3 de 720x480 à un format d’aspect 16x9 forme l’image d’origine 16x9.

Vous trouverez ci-dessous une description de la façon d’afficher correctement chacun des modes et leurs points forts :

  • Widescreen: La vidéo source s’est étendue à la plus grande zone de 16x9 de la fenêtre de sortie. Les points forts sont relatifs à l’intérieur de la zone 16x9. Les barres noires doivent être ajoutées en haut et en bas ou sur les côtés pour maintenir une zone de 16x9.
  • Analyse panoramique : À partir de la vidéo 16x9, utilisez le décalage horizontal fourni dans le flux MPEG2 pour extraire une sous-version 4x3. Placez la sous-fenêtre 4x3 dans la plus grande zone 4x3 de la fenêtre cliente de sortie. Les coordonnées de la mise en surbrillance sont relatives à la fenêtre de sortie 4x3 et n’ont aucune relation avec la vidéo source 16x9. Les barres noires doivent être ajoutées en haut et en bas ou sur les côtés pour maintenir une zone 4x3.
  • Boîte aux lettres: Calculez la plus grande zone 4x3 de la fenêtre de sortie. Les barres noires doivent être ajoutées en haut et en bas ou sur les côtés pour maintenir une zone 4x3. La vidéo 4x3 anamorphique source (représentant une image 16x9) est placée dans le plus grand sous-window 16x9 à l’intérieur de la zone 4x3. Les barres noires doivent être ajoutées en haut et en bas de la sous-fenêtre pour conserver une zone de 16x9. Les coordonnées de la mise en surbrillance sont relatives à la zone 4x3 et n’ont aucune relation avec la vidéo 16x9 source. Il est possible pour un disque de spécifier une mise en surbrillance qui se trouve en dehors de la zone 16x9 (mais toujours dans la fenêtre 4x3). Pour la vidéo 4x3, la vidéo est placée dans la plus grande zone de sortie 4x3 de la fenêtre cliente de sortie. Les barres noires doivent être ajoutées en haut et en bas ou sur les côtés pour maintenir une zone 4x3.

Prétraitement MPEG avec dvd Navigator et VMR

Actuellement, le décodeur est passé un FORMAT_MPEG2_VIDEO type de média (dont le bloc de format pointe vers une structure MPEG2VIDEOINFO ). Sur les broches de sortie, le décodeur produit un type de média FORMAT_VideoInfo2, dont le bloc de format pointe vers une structure VIDEOINFOHEADER2 . Le champ dwReserved de la structure a été renommé en indicateurs dwControls .

Le membre dwControlFlags contient désormais les nouveaux bits.

Étiquette Valeur
AMCONTROL_USED 0x00000001
AMCONTROL_PAD_TO_4x3 0x00000002
AMCONTROL_PAD_TO_16x9 0x00000004

 

AMCONTROL_USED est utilisé pour tester si ces nouveaux indicateurs sont pris en charge. Un filtre source doit définir l’indicateur AMCONTROL_USED et voir si QueryAccept(MediaType) réussit sur la broche en aval. S’il est rejeté, les indicateurs AMCONTROL ne peuvent pas être utilisés et dwReserved1 doit être défini sur 0.

AMCONTROL_PAD_TO_4x3 indique que l’image doit être rembourrée et affichée dans une zone 4x3.

AMCONTROL_PAD_TO_16x9 indique que l’image doit être rembourrée et affichée dans une zone 16x9.

Le décodeur doit copier ou traiter aveuglément les bits. Si le décodeur effectue lui-même le letterboxing, il doit modifier le rapport d’aspect des pixels, compléter l’image et supprimer les bits AMCONTROL_* correspondants.

LE MPEG2VIDEOINFO.dwFlags contient désormais trois indicateurs permettant de contrôler la façon dont le contenu doit être affiché :

  • AMMPEG2_DoPanScan (0x00000001): si cet indicateur est défini, le décodeur vidéo MPEG-2 doit rogner l’image de sortie en fonction des vecteurs de balayage panoramique dans picture_display_extension et modifier le rapport d’image sur 4x3. Le VMR ne doit pas recevoir d’exemple 16x9 avec cet indicateur. Une implémentation simple peut modifier le rectangle source pour indiquer une région source de 540 largeurs avec un bord gauche égal au décalage d’affichage dans le picture_display_extension.

  • AMMPEG2_LetterboxAnalogOut (0x00000020): lorsqu’un décodeur matériel affiche ce flux sur une sortie vidéo (généralement un connecteur SVIDEO sur le carte), il doit appliquer les règles d’affichage d’un exemple 16x9 sur un écran 4x3.

    Un décodeur logiciel (ou un décodeur matériel produisant une sortie envoyée au VMR) a deux options lors du traitement des images :

    1. Ignorez cet indicateur et transmettez le contenu de VideoInfoHeader2 au VMR (l’indicateur de AMCONTROL_PAD_TO_4x3 sera déjà défini par le NAVIGATEUR DVD de l’exemple). Le VMR rencontrera un exemple de vidéo 16x9 avec l’indicateur AMCONTROL_PAD_TO_4x3 défini et un flux de sous-image 4x3. L’application doit définir les rectangles de destination normalisés de sortie des deux flux sur la même largeur.
    2. Convertissez le flux anamorphique en image 4x3 en paddant le haut et le bas de l’image et en définissant le rapport d’aspect de l’image sur 4x3 (voir Letterbox ci-dessus) et en supprimant le AMCONTROL_PAD_TO_4x3 bit du VIDEOINFOHEADER2.

    Les décodeurs DirectXVA qui mélangent les flux vidéo et sous-image devront traiter cet indicateur. Si le matériel ne peut pas mettre à l’échelle la sous-image fusionnée, le décodeur doit produire un flux de sous-image distinct pour que le vmR se mélange à la vidéo.

  • AMMPEG2_WidescreenAnalogOut (0x00000200): lorsqu’un décodeur matériel affiche ce flux sur une sortie vidéo (généralement un connecteur SVIDEO sur le carte), il doit supposer un affichage 16x9 (anamorphique).

    Un décodeur logiciel (ou un décodeur matériel produisant une sortie envoyée au VMR) a deux options lors du traitement d’une image anamorphique :

    1. Ignorez cet indicateur et copiez le contenu de VideoInfoHeader2 dans le VMR. Le VMR pad les images 4x3 à 16x9 s’ils ont le AMCONTROL_PAD_TO_16x9 défini.
    2. Padez l’image de sortie sur une image 16x9 et supprimez le AMCONTROL_PAD_TO_16x9 bit.

La plupart des décodeurs doivent utiliser GetMediaType pour détecter une modification de média sur la broche d’entrée et copier le contenu VIDEOINFOHEADER2 (contenu dans MPEG2INFOHEADER) dans l’épingle de sortie. Ils traiteront probablement uniquement le bit PanScan.

L’exemple de code suivant montre comment copier le contenu de VIDEOINFOHEADER2 d’une broche d’entrée vers une broche de sortie.

#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;
}