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;
}
Rubriques connexes