Dela via


Konverteringar av medietyp

Ibland är det nödvändigt att konvertera mellan Media Foundation-medietyper och de äldre medietypsstrukturerna från DirectShow eller Windows Media Format SDK.

Från en formatstruktur till en Media Foundation-typ

Följande funktioner initierar en Media Foundation-medietyp från en formatstruktur. Dessa funktioner är också användbara om en dataström eller ett filhuvud innehåller en formatstruktur. Filhuvudet för WAVE-ljudfiler innehåller till exempel en WAVEFORMATEX- struktur.

Struktur att konvertera Funktion
AM_MEDIA_TYPE (DirectShow)
DMO_MEDIA_TYPE (DirectX Media Objects)
WM_MEDIA_TYPE (Windows Media Format SDK)
Obs! Dessa strukturer är likvärdiga.
MFInitMediaTypeFromAMMediaType
BITMAPINFOHEADER MFCreateVideoMediaTypeFromBitMapInfoHeaderEx
MFVIDEOFORMAT MFInitMediaTypeFromMFVideoFormat
MPEG1VIDEOINFO MFInitMediaTypeFromMPEG1VideoInfo
MPEG2VIDEOINFO MFInitMediaTypeFromMPEG2VideoInfo
VIDEOINFOHEADER2 MFInitMediaTypeFromVideoInfoHeader2
VIDEOINFOHEADER MFInitMediaTypeFromVideoInfoHeader
WAVEFORMATEX eller WAVEFORMATEXTENSIBLE MFInitMediaTypeFromWaveFormatEx

 

Från en Media Foundation-typ till en formatstruktur

Följande funktioner skapar eller initierar en formatstruktur från en Media Foundation-medietyp.

Funktion Målstruktur
IMFMediaType::GetRepresentation AM_MEDIA_TYPE, MFVIDEOFORMAT, VIDEOINFOHEADEReller VIDEOINFOHEADER2
MFCreateAMMediaTypeFromMFMediaType AM_MEDIA_TYPE
MFCreateMFVideoFormatFromMFMediaType MFVIDEOFORMAT
MFCreateWaveFormatExFromMFMediaType WAVEFORMATEX eller WAVEFORMATEXTENSIBLE
MFInitAMMediaTypeFromMFMediaType AM_MEDIA_TYPE

 

Formatera mappningar

I följande tabeller visas de Media Foundation-attribut som motsvarar olika formatstrukturer. Alla dessa attribut kan inte översättas direkt. Om du vill utföra konverteringar bör du använda de funktioner som anges i föregående avsnitt. dessa tabeller tillhandahålls huvudsakligen som referens.

AM_MEDIA_TYPE

Medlem Attribut
bTemporalCompression MF_MT_ALL_SAMPLES_INDEPENDENT
bFixedSizeSamples MF_MT_FIXED_SIZE_SAMPLES
lSampleSize MF_MT_SAMPLE_SIZE

 

WAVEFORMATEX, WAVEFORMATEXTENSIBLE

Medlem Attribut
wFormatTag MF_MT_SUBTYPE
Om wFormatTag är WAVE_FORMAT_EXTENSIBLE, hittas undertypen i SubFormat-medlemmen.
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
underformat MF_MT_SUBTYPE
Extra data MF_MT_USER_DATA

 

VIDEOINFOHEADER, VIDEOINFOHEADER2

Medlem Attribut
dwBitRate MF_MT_AVG_BITRATE
dwBitErrorRate MF_MT_AVG_BIT_ERROR_RATE
AvgTimePerFrame MF_MT_FRAME_RATE; använd MFAverageTimePerFrameToFrameRate för att beräkna det här värdet.
dwInterlaceFlags MF_MT_INTERLACE_MODE
dwCopyProtectFlags Ingen definierad motsvarighet
dwPictAspectRatioX, dwPictAspectRatioY MF_MT_PIXEL_ASPECT_RATIO; måste konvertera från bildproportionsgrad till bildproportion.
dwControlFlags MF_MT_PAD_CONTROL_FLAGS. Om flaggan AMCONTROL_COLORINFO_PRESENT finns anger du de utökade färgattributen som beskrivs i Utökad färginformation.
bmiHeader.biWidth, bmiHeader.biHeight MF_MT_FRAME_SIZE
bmiHeader.biBitCount Implicit i undertypen (MF_MT_SUBTYPE).
bmiHeader.biCompression Implicit i undertypen.
bmiHeader.biSizeImage MF_MT_SAMPLE_SIZE
Palettinformation MF_MT_PALETTE

 

Följande attribut kan härledas från VIDEOINFOHEADER- eller VIDEOINFOHEADER2 struktur, men kräver också viss kunskap om formatinformationen. Olika YUV-format har till exempel olika stegkrav.

MPEG1VIDEOINFO

Medlem Attribut
dwStartTimeCode MF_MT_MPEG_START_TIME_CODE
bSequenceHeader MF_MT_MPEG_SEQUENCE_HEADER
biXPelsPerMeter, biYPelsPerMeter MF_MT_PIXEL_ASPECT_RATIO

 

MPEG2VIDEOINFO

Medlem 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

 

Exempel

Följande kod fyller i en BITMAPINFOHEADER struktur från en videomedietyp. Observera att den här konverteringen förlorar en del av formatinformationen (sammanflätning, bildfrekvens, utökade färgdata). Det kan dock vara användbart när du till exempel sparar en bitmapp från en videoram.

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

medietyper