Delen via


Conversies van mediatypen

Soms is het noodzakelijk om te converteren tussen Media Foundation-mediatypen en de oudere mediatypestructuren van DirectShow of de Windows Media Format SDK.

Van een indelingsstructuur naar een Media Foundation-type

Met de volgende functies wordt een Media Foundation-mediatype geïnitialiseerd op basis van een indelingsstructuur. Deze functies zijn ook handig als een gegevensstroom of een bestandskop een indelingsstructuur bevat. De bestandskoptekst voor WAVE-audiobestanden bevat bijvoorbeeld een WAVEFORMATEX structuur.

Structuur die moet worden geconverteerd Functie
AM_MEDIA_TYPE (DirectShow)
DMO_MEDIA_TYPE (DirectX Media Objects)
WM_MEDIA_TYPE (Windows Media Format SDK)
Opmerking: Deze structuren zijn gelijkwaardig.
MFInitMediaTypeFromAMMediaType
BITMAPINFOHEADER- MFCreateVideoMediaTypeFromBitMapHeaderEx
MFVIDEOFORMAT- MFInitMediaTypeFromMFVideoFormat
MPEG1VIDEOINFO MFInitMediaTypeFromMPEG1VideoInfo
MPEG2VIDEOINFO MFInitMediaTypeFromMPEG2VideoInfo
VIDEOINFOHEADER2 MFInitMediaTypeFromVideoInfoHeader2
VIDEOINFOHEADER- MFInitMediaTypeFromVideoInfoHeader
WAVEFORMATEX of WAVEFORMATEXTENSIBLE MFInitMediaTypeFromWaveFormatEx

 

Van een Media Foundation-type naar een indelingsstructuur

Met de volgende functies maakt of initialiseert u een indelingsstructuur van een Media Foundation-mediatype.

Functie Doelstructuur
IMFMediaType::GetRepresentation AM_MEDIA_TYPE, MFVIDEOFORMAT, VIDEOINFOHEADERof VIDEOINFOHEADER2
MFCreateAMMediaTypeFromMFMediaType AM_MEDIA_TYPE
MFCreateMFVideoFormatFromMFMediaType MFVIDEOFORMAT-
MFCreateWaveFormatExFromMFMediaType WAVEFORMATEX of WAVEFORMATEXTENSIBLE
MFInitAMMediaTypeFromMFMediaType AM_MEDIA_TYPE

 

Indelingstoewijzingen

De volgende tabellen bevatten de Media Foundation-kenmerken die overeenkomen met verschillende indelingsstructuren. Niet al deze kenmerken kunnen rechtstreeks worden vertaald. Als u conversies wilt uitvoeren, moet u de functies gebruiken die in de vorige sectie worden vermeld; deze tabellen worden voornamelijk ter referentie verstrekt.

AM_MEDIA_TYPE

Lid Attribuut
bTemporalCompression MF_MT_ALL_SAMPLES_INDEPENDENT
bFixedSizeSamples MF_MT_FIXED_SIZE_SAMPLES
lSampleSize MF_MT_SAMPLE_SIZE

 

WAVEFORMATEX, WAVEFORMATEXTENSIBLE

Lid Attribuut
wFormatTag- MF_MT_SUBTYPE
Als wFormatTag- is WAVE_FORMAT_EXTENSIBLE, wordt het subtype gevonden in het subopmaak- lid.
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
SubOpmaak- MF_MT_SUBTYPE
Extra gegevens MF_MT_USER_DATA

 

VIDEOINFOHEADER, VIDEOINFOHEADER2

Lid Attribuut
dwBitRate- MF_MT_AVG_BITRATE
dwBitErrorRate MF_MT_AVG_BIT_ERROR_RATE
AvgTimePerFrame- MF_MT_FRAME_RATE; gebruik MFAverageTimePerFrameToFrameRate om deze waarde te berekenen.
dwInterlaceFlags- MF_MT_INTERLACE_MODE
dwCopyProtectFlags- Geen gedefinieerd equivalent
dwPictAspectRatioX, dwPictAspectRatioY MF_MT_PIXEL_ASPECT_RATIO; moet worden geconverteerd van de hoogte-breedteverhouding van de afbeelding tot de hoogte-breedteverhouding van de afbeelding.
dwControlFlags- MF_MT_PAD_CONTROL_FLAGS. Als de vlag AMCONTROL_COLORINFO_PRESENT aanwezig is, stelt u de uitgebreide kleurkenmerken in die worden beschreven in Uitgebreide kleurinformatie.
bmiHeader.biWidth, bmiHeader.biHeight MF_MT_FRAME_SIZE
bmiHeader.biBitCount Impliciet in het subtype (MF_MT_SUBTYPE).
bmiHeader.biCompression Impliciet in het subtype.
bmiHeader.biSizeImage MF_MT_SAMPLE_SIZE
Paletgegevens MF_MT_PALETTE

 

De volgende kenmerken kunnen worden afgeleid van de VIDEOINFOHEADER- of VIDEOINFOHEADER2 structuur, maar vereisen ook enige kennis van de indelingsdetails. Verschillende YUV-indelingen hebben bijvoorbeeld verschillende vereisten voor overschrijvingen.

MPEG1VIDEOINFO

Lid Attribuut
dwStartTimeCode- MF_MT_MPEG_START_TIME_CODE
bSequenceHeader- MF_MT_MPEG_SEQUENCE_HEADER
biXPelsPerMeter, biYPelsPerMeter- MF_MT_PIXEL_ASPECT_RATIO

 

MPEG2VIDEOINFO

Lid Attribuut
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

 

Voorbeelden

Met de volgende code wordt een BITMAPINFOHEADER structuur van een videomediatype ingevuld. Houd er rekening mee dat deze conversies enkele informatie over de indeling verliezen (interlacing, framesnelheid, uitgebreide kleurgegevens). Het kan echter handig zijn bij het opslaan van een bitmap uit een videoframe, bijvoorbeeld.

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

mediatypen