Types de médias vidéo non compressés

Cette rubrique explique comment créer un type de média qui décrit un format vidéo non compressé. Pour plus d’informations sur les types de médias, consultez à propos des types de média.

Pour créer un type de vidéo non compressé complet, définissez les attributs suivants sur le pointeur d’interface IMFMediaType .

Attribut Description
_type de _ majeurese MF MT _ Type principal. Définissez sur MFMediaType _ Video.
_sous- _ type MF MT Sous-type. Consultez GUID de sous-type de vidéo.
_Stride MT _ par défaut _ STRIDE de surface. Le Stride est le nombre d’octets nécessaires pour passer d’une ligne de pixels à la suivante. Définissez cet attribut si le Stride en octets n’est pas le même que la largeur vidéo en octets. Sinon, vous pouvez omettre cet attribut.
_fréquence d' _ images MF MF _ Fréquence d’images.
_taille de _ trame MF MF _ Taille du frame.
_ _ mode entrelacé MF-MT _ Mode entrelacement.
MF _ MT _ tous les _ exemples _ indépendants Spécifie si chaque échantillon est indépendant. Affectez la valeur true pour les formats non compressés.
_ _ _ rapport hauteur/largeur des pixels _ MF Proportions de pixels.

En outre, définissez les attributs suivants si vous connaissez les valeurs correctes. (Sinon, omettez ces attributs.)

Attribut Description
_vidéos de _ _ réamorçage de la vidéo MF Couleurs primaires.
_fonction de _ transfert MF-MF _ Fonction de transfert.
_ _ matrice YUV MT _ YUV Matrice de transfert.
vidéo MF MT-présentation de _ _ _ chrominance _ Emplacement de chrominance.
_ _ plage nominale de vidéo MF MT _ _ Plage nominale.

Pour plus d’informations, consultez informations sur les couleurs étendues. Par exemple, si vous créez un type de média qui décrit une norme vidéo et que la norme définit l’emplacement de chrominance, ajoutez ces informations au type de média. Cela permet de préserver la fidélité des couleurs dans l’ensemble du pipeline.

Les fonctions suivantes peuvent être utiles lors de la création d’un type de média vidéo.

Fonction Description
MFAverageTimePerFrameToFrameRate Calcule la fréquence d’images, en fonction de la durée de trame moyenne.
MFCalculateImageSize Calcule la taille de l’image pour un format vidéo non compressé.
MFFrameRateToAverageTimePerFrame Calcule la durée moyenne d’une image vidéo, en fonction de la fréquence d’images.
MFGetStrideForBitmapInfoHeader Retourne le Stride de surface minimal pour un format vidéo. Pour plus d’informations, consultez l' image Stride.
MFInitVideoFormat Initialise une structure MFVIDEOFORMAT pour certains formats vidéo standard, tels que la télévision NTSC. Vous pouvez ensuite utiliser la structure pour initialiser un type de média.
MFIsFormatYUV Interroge si un format vidéo est un format YUV.

Exemples

Cet exemple montre une fonction qui remplit les informations les plus courantes pour un format vidéo non compressé. La fonction retourne un pointeur d’interface IMFMediaType . Vous pouvez ensuite ajouter des attributs supplémentaires au type de média, si nécessaire.

HRESULT CreateUncompressedVideoType(
    DWORD                fccFormat,  // FOURCC or D3DFORMAT value.     
    UINT32               width, 
    UINT32               height,
    MFVideoInterlaceMode interlaceMode,
    const MFRatio&       frameRate,
    const MFRatio&       par,
    IMFMediaType         **ppType
    )
{
    if (ppType == NULL)
    {
        return E_POINTER;
    }

    GUID    subtype = MFVideoFormat_Base;
    LONG    lStride = 0;
    UINT    cbImage = 0;

    IMFMediaType *pType = NULL;

    // Set the subtype GUID from the FOURCC or D3DFORMAT value.
    subtype.Data1 = fccFormat;

    HRESULT hr = MFCreateMediaType(&pType);
    if (FAILED(hr))
    {
        goto done;
    }

    hr = pType->SetGUID(MF_MT_MAJOR_TYPE, MFMediaType_Video);
    if (FAILED(hr))
    {
        goto done;
    }

    hr = pType->SetGUID(MF_MT_SUBTYPE, subtype);
    if (FAILED(hr))
    {
        goto done;
    }

    hr = pType->SetUINT32(MF_MT_INTERLACE_MODE, interlaceMode);
    if (FAILED(hr))
    {
        goto done;
    }

    hr = MFSetAttributeSize(pType, MF_MT_FRAME_SIZE, width, height);
    if (FAILED(hr))
    {
        goto done;
    }

    // Calculate the default stride value.
    hr = pType->SetUINT32(MF_MT_DEFAULT_STRIDE, UINT32(lStride));
    if (FAILED(hr))
    {
        goto done;
    }

    // Calculate the image size in bytes.
    hr = MFCalculateImageSize(subtype, width, height, &cbImage);
    if (FAILED(hr))
    {
        goto done;
    }

    hr = pType->SetUINT32(MF_MT_SAMPLE_SIZE, cbImage);
    if (FAILED(hr))
    {
        goto done;
    }

    hr = pType->SetUINT32(MF_MT_FIXED_SIZE_SAMPLES, TRUE);
    if (FAILED(hr))
    {
        goto done;
    }

    hr = pType->SetUINT32(MF_MT_ALL_SAMPLES_INDEPENDENT, TRUE);
    if (FAILED(hr))
    {
        goto done;
    }

    // Frame rate
    hr = MFSetAttributeRatio(pType, MF_MT_FRAME_RATE, frameRate.Numerator, 
        frameRate.Denominator);
    if (FAILED(hr))
    {
        goto done;
    }

    // Pixel aspect ratio
    hr = MFSetAttributeRatio(pType, MF_MT_PIXEL_ASPECT_RATIO, par.Numerator, 
        par.Denominator);
    if (FAILED(hr))
    {
        goto done;
    }

    // Return the pointer to the caller.
    *ppType = pType;
    (*ppType)->AddRef();

done:
    SafeRelease(&pType);
    return hr;
}

L’exemple suivant utilise un format vidéo encodé comme entrée et crée un type de vidéo non compressé correspondant. Ce type peut être défini sur un encodeur ou un décodeur, par exemple.

HRESULT ConvertVideoTypeToUncompressedType(
    IMFMediaType *pType,    // Pointer to an encoded video type.
    const GUID& subtype,    // Uncompressed subtype (eg, RGB-32, AYUV)
    IMFMediaType **ppType   // Receives a matching uncompressed video type.
    )
{
    IMFMediaType *pTypeUncomp = NULL;

    HRESULT hr = S_OK;
    GUID majortype = { 0 };
    MFRatio par = { 0 };

    hr = pType->GetMajorType(&majortype);

    if (majortype != MFMediaType_Video)
    {
        return MF_E_INVALIDMEDIATYPE;
    }

    // Create a new media type and copy over all of the items.
    // This ensures that extended color information is retained.

    if (SUCCEEDED(hr))
    {
        hr = MFCreateMediaType(&pTypeUncomp);
    }

    if (SUCCEEDED(hr))
    {
        hr = pType->CopyAllItems(pTypeUncomp);
    }

    // Set the subtype.
    if (SUCCEEDED(hr))
    {
        hr = pTypeUncomp->SetGUID(MF_MT_SUBTYPE, subtype);
    }

    // Uncompressed means all samples are independent.
    if (SUCCEEDED(hr))
    {
        hr = pTypeUncomp->SetUINT32(MF_MT_ALL_SAMPLES_INDEPENDENT, TRUE);
    }

    // Fix up PAR if not set on the original type.
    if (SUCCEEDED(hr))
    {
        hr = MFGetAttributeRatio(
            pTypeUncomp, 
            MF_MT_PIXEL_ASPECT_RATIO, 
            (UINT32*)&par.Numerator, 
            (UINT32*)&par.Denominator
            );

        // Default to square pixels.
        if (FAILED(hr))
        {
            hr = MFSetAttributeRatio(
                pTypeUncomp, 
                MF_MT_PIXEL_ASPECT_RATIO, 
                1, 1
                );
        }
    }

    if (SUCCEEDED(hr))
    {
        *ppType = pTypeUncomp;
        (*ppType)->AddRef();
    }

    SafeRelease(&pTypeUncomp);
    return hr;
}

Informations sur les couleurs étendues

STRIDE d’image

Types de médias

Types de média vidéo

GUID de sous-type de vidéo