Types de média 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 en général, consultez À propos des types de médias.

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

Attribut Description
MF_MT_MAJOR_TYPE Type principal. Définissez sur MFMediaType_Video.
MF_MT_SUBTYPE Sous-type. Consultez GUID de sous-type de vidéo.
MF_MT_DEFAULT_STRIDE Surface stride. La foulée est le nombre d’octets nécessaires pour passer d’une ligne de pixels à la suivante. Définissez cet attribut si la foulée en octets n’est pas la même que la largeur vidéo en octets. Sinon, vous pouvez omettre cet attribut.
MF_MT_FRAME_RATE Fréquence d’images.
MF_MT_FRAME_SIZE Taille du cadre.
MF_MT_INTERLACE_MODE Mode d’entrelacement.
MF_MT_ALL_SAMPLES_INDEPENDENT Spécifie si chaque échantillon est indépendant. Définissez sur TRUE pour les formats non compressés.
MF_MT_PIXEL_ASPECT_RATIO Proportions de pixels.

 

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

Attribut Description
MF_MT_VIDEO_PRIMARIES Couleurs primaires.
MF_MT_TRANSFER_FUNCTION Fonction de transfert.
MF_MT_YUV_MATRIX Matrice de transfert.
MF_MT_VIDEO_CHROMA_SITING L’implantation chromatique.
MF_MT_VIDEO_NOMINAL_RANGE Plage nominale.

 

Pour plus d’informations, consultez Informations de couleur é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 chromatique, 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 moyenne des images.
MFCalculateImageSize Calcule la taille de l’image d’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 la foulée de surface minimale pour un format vidéo. Pour plus d’informations, consultez 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 Demande 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 prend 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 de couleur étendues

Stride d’image

Types de média

Types de médias vidéo

GUID de sous-type de vidéo