Medientypkonvertierungen

Gelegentlich ist es erforderlich, zwischen Media Foundation Medientypen und den älteren Medientypstrukturen aus DirectShow oder dem Windows Media Format SDK zu konvertieren.

Von einer Formatstruktur zu einem Media Foundation Typ

Die folgenden Funktionen initialisieren einen Media Foundation Medientyp aus einer Formatstruktur. Diese Funktionen sind auch nützlich, wenn ein Datenstrom oder ein Dateiheader eine Formatstruktur enthält. Beispielsweise enthält der Dateiheader für WAVE-Audiodateien eine WAVEFORMATEX-Struktur.

Zu konvertierende Struktur Funktion
AM_MEDIA_TYPE (DirectShow)
DMO_MEDIA_TYPE (DirectX-Medienobjekte)
WM_MEDIA_TYPE (Windows Media Format SDK)
[!Note]
Diese Strukturen sind gleichwertig.


MFInitMediaTypeFromAMMediaType
BITMAPINFOHEADER MFCreateVideoMediaTypeFromBitMapInfoHeaderEx
MFVIDEOFORMAT MFInitMediaTypeFromMFVideoFormat
MPEG1VIDEOINFO MFInitMediaTypeFromMPEG1VideoInfo
MPEG2VIDEOINFO MFInitMediaTypeFromMPEG2VideoInfo
VIDEOINFOHEADER2 MFInitMediaTypeFromVideoInfoHeader2
VIDEOINFOHEADER MFInitMediaTypeFromVideoInfoHeader
WAVEFORMATEX oder WAVEFORMATEXTENSIBLE MFInitMediaTypeFromWaveFormatEx

Von einem Media Foundation zu einer Formatstruktur

Die folgenden Funktionen erstellen oder initialisieren eine Formatstruktur aus einem Media Foundation Medientyps.

Funktion Zielstruktur
BESCHRIFTUNGstyp::GetRepresentation AM _ _MEDIENTYP, MFVIDEOFORMAT, VIDEOINFOHEADERoder VIDEOINFOHEADER2
MFCreateAMMediaTypeFromMFMediaType _ _ AM-MEDIENTYP
MFCreateMFVideoFormatFromMFMediaType MFVIDEOFORMAT
MFCreateWaveFormatExFromMFMediaType WAVEFORMATEX oder WAVEFORMATEXTENSIBLE
MFInitAMMediaTypeFromMFMediaType _ _ AM-MEDIENTYP

Formatzuordnungen

In den folgenden Tabellen sind die Media Foundation aufgeführt, die verschiedenen Formatstrukturen entsprechen. Nicht alle diese Attribute können direkt übersetzt werden. Um Konvertierungen durchzuführen, sollten Sie die im vorherigen Abschnitt aufgeführten Funktionen verwenden. diese Tabellen werden hauptsächlich als Referenz bereitgestellt.

_ _ AM-MEDIENTYP

Member attribute
bTemporalCompression MF _ MT _ ALL _ SAMPLES _ INDEPENDENT
bFixedSizeSamples BEISPIELE FÜR MF _ MT _ MIT FESTER _ _ GRÖßE
lSampleSize MF _ _ MT-STICHPROBENGRÖßE _

WAVEFORMATEX, WAVEFORMATEXTENSIBLE

Member attribute
wFormatTag MF _ _ MT-UNTERTYP
Wenn wFormatTag WAVE _ FORMAT _ EXTENSIBLE ist, befindet sich der Untertyp im SubFormat-Member.
nChannels MF _ MT AUDIO _ _ _ NUM-KANÄLE
nSamplesPerSec MF _ _ MT-AUDIOBEISPIELE _ _ PRO _ SEKUNDE
nAvgBytesPerSec MF _ MT _ AUDIO _ AVG _ BYTES _ PER _ SECOND
nBlockAlign MF MT AUDIO BLOCK ALIGNMENT (MF _ _ MT-AUDIOBLOCKAUSRICHTUNG) _ _
wBitsPerSample MF _ _ MT-AUDIOBITS _ _ PRO _ BEISPIEL
wValidBitsPerSample GÜLTIGE MF _ _ MT-AUDIOBITS _ _ PRO _ _ BEISPIEL
wSamplesPerBlock MF _ _ MT-AUDIOBEISPIELE _ _ PRO _ BLOCK
dwChannelMask MF _ MT _ AUDIO _ CHANNEL _ MASK
SubFormat MF _ _ MT-UNTERTYP
Zusätzliche Daten MF _ _ MT-BENUTZERDATEN _

VIDEOINFOHEADER, VIDEOINFOHEADER2

Member attribute
dwBitRate MF _ MT _ AVG _ BITRATE
dwBitErrorRate MF _ MT _ AVG _ BIT _ ERROR _ RATE
AvgTimePerFrame MF _ MT _ FRAME _ RATE;Verwenden Sie MFAverageTimePerFrameToFrameRate, um diesen Wert zu berechnen.
dwInterlaceFlags MF _ MT _ INTERLACE-MODUS _
dwCopyProtectFlags Keine definierte Entsprechung
dwPictAspectRatioX, dwPictAspectRatioY MF _ MT _ PIXEL _ ASPECT _ RATIO;muss das Bild-Seitenverhältnis in das Bild-Seitenverhältnis konvertieren.
dwControlFlags MF _ MT _ _ PAD-STEUERELEMENTFLAGS _. Wenn das FLAG AMCONTROL _ COLORINFO _ PRESENT vorhanden ist, legen Sie die erweiterten Farbattribute fest, die unter Erweiterte Farbinformationen beschrieben werden.
bmiHeader.biWidth, bmiHeader.biHeight MF _ MT _ FRAME _ SIZE
bmiHeader.biBitCount Implizit im Untertyp (MF _ MT _ SUBTYPE).
bmiHeader.biCompression Implizit im Untertyp.
bmiHeader.biSizeImage MF _ _ MT-STICHPROBENGRÖßE _
Paletteninformationen MF _ MT _ PALETTE

Die folgenden Attribute können aus der VIDEOINFOHEADER- oder VIDEOINFOHEADER2-Struktur abgeleitet werden, erfordern jedoch auch kenntnisse der Formatdetails. Beispielsweise haben verschiedene YUV-Formate unterschiedliche Anforderungen.

MPEG1VIDEOINFO

Member attribute
dwStartTimeCode MF _ MT _ MPEG _ START _ TIME _ CODE
bSequenceHeader MF _ MT _ MPEG _ SEQUENCE _ HEADER
biXPelsPerMeter, biYPelsPerMeter MF _ MT PIXEL _ _ _ SEITENVERHÄLTNIS

MPEG2VIDEOINFO

Member attribute
dwStartTimeCode MF _ MT _ MPEG _ START _ TIME _ CODE
dwSequenceHeader MF _ MT _ MPEG _ SEQUENCE _ HEADER
dwProfile MF _ MT _ _ MPEG2-PROFIL
dwLevel MF _ MT _ MPEG2 _ LEVEL
dwFlags MF _ MT _ _ MPEG2-FLAGS

Beispiele

Der folgende Code füllt eine BITMAPINFOHEADER-Struktur aus einem Videomedientyp aus. Beachten Sie, dass bei diesen Konvertierungen einige der Formatinformationen (Interlacing, Framerate, erweiterte Farbdaten) verloren geht. Dies kann jedoch hilfreich sein, wenn Sie z. B. eine Bitmap aus einem Videoframe speichern.

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

Medientypen