Partager via


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.

Fonction Structure cible
IMFMediaType::GetRepresentation AM_MEDIA_TYPE, MFVIDEOFORMAT, VIDEOINFOHEADER ou VIDEOINFOHEADER2
MFCreateAMMediaTypeFromMFMediaType AM_MEDIA_TYPE
MFCreateMFVideoFormatFromMFMediaType MFVIDEOFORMAT
MFCreateWaveFormatExFromMFMediaType WAVEFORMATEX ou WAVEFORMATEXTENSIBLE
MFInitAMMediaTypeFromMFMediaType AM_MEDIA_TYPE

 

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

Types de médias