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