Conversions de types de supports
Il est parfois nécessaire de convertir entre les types multimédias Media Foundation et les anciennes structures de type multimédia à partir de DirectShow ou du Kit de développement logiciel (SDK) Windows Media Format.
D’une structure de format à un type Media Foundation
Les fonctions suivantes initialisent un type de média Media Foundation à partir d’une structure de format. Ces fonctions sont également utiles si un flux de données ou un en-tête de fichier contient une structure de format. Par exemple, l’en-tête de fichier pour les fichiers audio WAVE contient une structureWAVEFORMATEX.
Structure à convertir | Fonction |
---|---|
AM_MEDIA_TYPE (DirectShow) DMO_MEDIA_TYPE (objets multimédias DirectX) WM_MEDIA_TYPE (Kit de développement logiciel (SDK) windows Media Format) Remarque : Ces structures sont équivalentes. |
MFInitMediaTypeFromAMMediaType |
BITMAPINFOHEADER | MFCreateVideoMediaTypeFromBitMapInfoHeaderEx |
MFVIDEOFORMAT | MFInitMediaTypeFromMFVideoFormat |
MPEG1VIDEOINFO | MFInitMediaTypeFromMPEG1VideoInfo |
MPEG2VIDEOINFO | MFInitMediaTypeFromMPEG2VideoInfo |
VIDEOINFOHEADER2 | MFInitMediaTypeFromVideoInfoHeader2 |
VIDEOINFOHEADER | MFInitMediaTypeFromVideoInfoHeader |
WAVEFORMATEX ou WAVEFORMATEXTENSIBLE | MFInitMediaTypeFromWaveFormatEx |
D’un type Media Foundation à une structure de format
Les fonctions suivantes créent ou initialisent une structure de format à partir d’un type de média Media Foundation.
Mappages de format
Les tableaux suivants répertorient les attributs Media Foundation qui correspondent à différentes structures de format. Tous ces attributs ne peuvent pas être traduits directement. Pour effectuer des conversions, vous devez utiliser les fonctions répertoriées dans la section précédente ; ces tables sont fournies principalement pour référence.
AM_MEDIA_TYPE
Membre | Attribut |
---|---|
bTemporalCompression | MF_MT_ALL_SAMPLES_INDEPENDENT |
bFixedSizeSamples | MF_MT_FIXED_SIZE_SAMPLES |
lSampleSize | MF_MT_SAMPLE_SIZE |
WAVEFORMATEX, WAVEFORMATEXTENSIBLE
Membre | Attribut |
---|---|
wFormatTag |
MF_MT_SUBTYPE Si wFormatTag est WAVE_FORMAT_EXTENSIBLE, le sous-type se trouve dans le membre SubFormat. |
nChannels | MF_MT_AUDIO_NUM_CHANNELS |
nSamplesPerSec | MF_MT_AUDIO_SAMPLES_PER_SECOND |
nAvgBytesPerSec | MF_MT_AUDIO_AVG_BYTES_PER_SECOND |
nBlockAlign | MF_MT_AUDIO_BLOCK_ALIGNMENT |
wBitsPerSample | MF_MT_AUDIO_BITS_PER_SAMPLE |
wValidBitsPerSample | MF_MT_AUDIO_VALID_BITS_PER_SAMPLE |
wSamplesPerBlock | MF_MT_AUDIO_SAMPLES_PER_BLOCK |
dwChannelMask | MF_MT_AUDIO_CHANNEL_MASK |
Sous-format | MF_MT_SUBTYPE |
Données supplémentaires | MF_MT_USER_DATA |
VIDEOINFOHEADER, VIDEOINFOHEADER2
Membre | Attribut |
---|---|
dwBitRate | MF_MT_AVG_BITRATE |
dwBitErrorRate | MF_MT_AVG_BIT_ERROR_RATE |
AvgTimePerFrame | MF_MT_FRAME_RATE; utilisez MFAverageTimePerFrameToFrameRate pour calculer cette valeur. |
dwInterlaceFlags | MF_MT_INTERLACE_MODE |
dwCopyProtectFlags | Aucun équivalent défini |
dwPictAspectRatioX, dwPictAspectRatioY | MF_MT_PIXEL_ASPECT_RATIO; doit convertir des proportions d’image en proportions d’image. |
dwControlFlags | MF_MT_PAD_CONTROL_FLAGS. Si l’indicateur AMCONTROL_COLORINFO_PRESENT est présent, définissez les attributs de couleur étendus décrits dans informations de couleur étendues. |
bmiHeader.biWidth, bmiHeader.biHeight | MF_MT_FRAME_SIZE |
bmiHeader.biBitCount | Implicite dans le sous-type (MF_MT_SUBTYPE). |
bmiHeader.biCompression | Implicite dans le sous-type. |
bmiHeader.biSizeImage | MF_MT_SAMPLE_SIZE |
Informations sur la palette | MF_MT_PALETTE |
Les attributs suivants peuvent être déduits de la structure VIDEOINFOHEADER ou VIDEOINFOHEADER2, mais nécessitent également une connaissance des détails du format. Par exemple, différents formats YUV ont des exigences de pas à pas différentes.
MPEG1VIDEOINFO
Membre | Attribut |
---|---|
dwStartTimeCode | MF_MT_MPEG_START_TIME_CODE |
bSequenceHeader | MF_MT_MPEG_SEQUENCE_HEADER |
biXPelsPerMeter, biYPelsPerMeter | MF_MT_PIXEL_ASPECT_RATIO |
MPEG2VIDEOINFO
Membre | Attribut |
---|---|
dwStartTimeCode | MF_MT_MPEG_START_TIME_CODE |
dwSequenceHeader | MF_MT_MPEG_SEQUENCE_HEADER |
dwProfile | MF_MT_MPEG2_PROFILE |
dwLevel | MF_MT_MPEG2_LEVEL |
dwFlags | MF_MT_MPEG2_FLAGS |
Exemples
Le code suivant remplit une structure BITMAPINFOHEADER à partir d’un type de média vidéo. Notez que ces conversions perdent certaines informations de format (entrelacement, fréquence d’images, données de couleur étendues). Toutefois, il peut être utile d’enregistrer une bitmap à partir d’une image vidéo, par exemple.
#include <dshow.h>
#include <dvdmedia.h>
// Converts a video type to a BITMAPINFO structure.
// The caller must free the structure by calling CoTaskMemFree.
// Note that this conversion loses some format information, including
// interlacing, and frame rate.
HRESULT GetBitmapInfoHeaderFromMFMediaType(
IMFMediaType *pType, // Pointer to the media type.
BITMAPINFOHEADER **ppBmih, // Receives a pointer to the structure.
DWORD *pcbSize) // Receives the size of the structure.
{
*ppBmih = NULL;
*pcbSize = 0;
GUID majorType = GUID_NULL;
AM_MEDIA_TYPE *pmt = NULL;
DWORD cbSize = 0;
DWORD cbOffset = 0;
BITMAPINFOHEADER *pBMIH = NULL;
// Verify that this is a video type.
HRESULT hr = pType->GetMajorType(&majorType);
if (FAILED(hr))
{
goto done;
}
if (majorType != MFMediaType_Video)
{
hr = MF_E_INVALIDMEDIATYPE;
goto done;
}
hr = pType->GetRepresentation(AM_MEDIA_TYPE_REPRESENTATION, (void**)&pmt);
if (FAILED(hr))
{
goto done;
}
if (pmt->formattype == FORMAT_VideoInfo)
{
cbOffset = (FIELD_OFFSET(VIDEOINFOHEADER,bmiHeader));
}
else if (pmt->formattype == FORMAT_VideoInfo2)
{
cbOffset = (FIELD_OFFSET(VIDEOINFOHEADER2,bmiHeader));
}
else
{
hr = MF_E_INVALIDMEDIATYPE; // Unsupported format type.
goto done;
}
if (pmt->cbFormat - cbOffset < sizeof(BITMAPINFOHEADER))
{
hr = E_UNEXPECTED; // Bad format size.
goto done;
}
cbSize = pmt->cbFormat - cbOffset;
pBMIH = (BITMAPINFOHEADER*)CoTaskMemAlloc(cbSize);
if (pBMIH == NULL)
{
hr = E_OUTOFMEMORY;
goto done;
}
CopyMemory(pBMIH, pmt->pbFormat + cbOffset, cbSize);
*ppBmih = pBMIH;
*pcbSize = cbSize;
done:
if (pmt)
{
pType->FreeRepresentation(AM_MEDIA_TYPE_REPRESENTATION, pmt);
}
return hr;
}
Rubriques connexes