Conversions de types de média
Parfois, il est nécessaire de convertir entre les types de médias Media Foundation et les anciennes structures de type multimédia à partir de DirectShow ou du Kit de développement logiciel (SDK) au format Windows Media.
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 structure WAVEFORMATEX .
Structure à convertir | Fonction |
---|---|
AM_MEDIA_TYPE (DirectShow) DMO_MEDIA_TYPE (objets multimédias DirectX) WM_MEDIA_TYPE (Kit de développement logiciel (SDK) au format Windows Media Note: 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 à titre de 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 du rapport d’aspect de l’image en proportion d’image. |
dwControlFlags | MF_MT_PAD_CONTROL_FLAGS. Si l’indicateur AMCONTROL_COLORINFO_PRESENT est présent, définissez les attributs de couleur étendue 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 de palette | MF_MT_PALETTE |
Les attributs suivants peuvent être déduits de la structure VIDEOINFOHEADER ou VIDEOINFOHEADER2 , mais nécessitent également une certaine connaissance des détails du format. Par exemple, différents formats YUV ont des exigences de foulée 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 des informations de format (entrelacement, fréquence d’images, données de couleur étendues). Toutefois, il peut être utile lors de l’enregistrement d’une image 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