Převody typů médií
Někdy je nutné převést mezi typy médií Media Foundation a staršími strukturami typů médií z DirectShow nebo sady Windows Media Format SDK.
Z struktury formátu na typ základu média
Následující funkce inicializují typ média Media Foundation ze struktury formátu. Tyto funkce jsou užitečné také v případě, že datový proud nebo hlavička souboru obsahují strukturu formátu. Například hlavička souboru pro zvukové soubory WAVE obsahuje strukturu WAVEFORMATEX.
Struktura, která se má převést | Funkce |
---|---|
AM_MEDIA_TYPE (DirectShow) DMO_MEDIA_TYPE (objekty médií DirectX) WM_MEDIA_TYPE (Windows Media Format SDK) Poznámka: tyto struktury jsou ekvivalentní. |
MFInitMediaTypeFromAMMediaType |
BITMAPINFOHEADER | MFCreateVideoMediaTypeFromBitMapInfoHeaderEx |
MFVIDEOFORMAT | MFInitMediaTypeFromMFVideoFormat |
MPEG1VIDEOINFO | MFInitMediaTypeFromMPEG1VideoInfo |
MPEG2VIDEOINFO | MFInitMediaTypeFromMPEG2VideoInfo |
VIDEOINFOHEADER2 | MFInitMediaTypeFromVideoInfoHeader2 |
VIDEOINFOHEADER | MFInitMediaTypeFromVideoInfoHeader |
WAVEFORMATEX nebo WAVEFORMATEXTENSIBLE | MFInitMediaTypeFromWaveFormatEx |
Z typu Media Foundation do struktury formátu
Následující funkce vytvářejí nebo inicializují strukturu formátu z typu média Media Foundation.
Mapování formátu
Následující tabulky uvádějí atributy Media Foundation, které odpovídají různým strukturám formátu. Ne všechny tyto atributy lze přeložit přímo. K provádění převodů byste měli použít funkce uvedené v předchozí části; tyto tabulky jsou k dispozici především pro referenci.
AM_MEDIA_TYPE
Člen | Atribut |
---|---|
bTemporalCompression | MF_MT_ALL_SAMPLES_INDEPENDENT |
bFixedSizeSamples | MF_MT_FIXED_SIZE_SAMPLES |
lSampleSize | MF_MT_SAMPLE_SIZE |
WAVEFORMATEX, WAVEFORMATEXTENSIBLE
Člen | Atribut |
---|---|
wFormatTag |
MF_MT_SUBTYPE Pokud je wFormatTag WAVE_FORMAT_EXTENSIBLE, nachází se podtyp v podformuláři členu. |
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 |
podformulář | MF_MT_SUBTYPE |
Další data | MF_MT_USER_DATA |
VIDEOINFOHEADER, VIDEOINFOHEADER2
Člen | Atribut |
---|---|
dwBitRate | MF_MT_AVG_BITRATE |
dwBitErrorRate | MF_MT_AVG_BIT_ERROR_RATE |
AvgTimePerFrame | MF_MT_FRAME_RATE; K výpočtu této hodnoty použijte MFAverageTimePerFrameToFrameRate. |
dwInterlaceFlags | MF_MT_INTERLACE_MODE |
dwCopyProtectFlags | Žádný definovaný ekvivalent |
dwPictAspectRatioX, dwPictAspectRatioY | MF_MT_PIXEL_ASPECT_RATIO; musí převést poměr stran obrázku na poměr stran obrázku. |
dwControlFlags | MF_MT_PAD_CONTROL_FLAGS. Pokud je k dispozici příznak AMCONTROL_COLORINFO_PRESENT, nastavte rozšířené atributy barev popsané v Rozšířené informace o barvách. |
bmiHeader.biWidth, bmiHeader.biHeight | MF_MT_FRAME_SIZE |
bmiHeader.biBitCount | Implicitní v podtypu (MF_MT_SUBTYPE). |
bmiHeader.biCompression | Implicitní v podtypu. |
bmiHeader.biSizeImage | MF_MT_SAMPLE_SIZE |
Informace o paletě | MF_MT_PALETTE |
Následující atributy lze odvodit ze struktury VIDEOINFOHEADER nebo VIDEOINFOHEADER2, ale také vyžadují určité znalosti podrobností o formátu. Různé formáty YUV mají například různé požadavky na krok.
MPEG1VIDEOINFO
Člen | Atribut |
---|---|
dwStartTimeCode | MF_MT_MPEG_START_TIME_CODE |
bSequenceHeader | MF_MT_MPEG_SEQUENCE_HEADER |
biXPelsPerMeter, biYPelsPerMeter | MF_MT_PIXEL_ASPECT_RATIO |
MPEG2VIDEOINFO
Člen | Atribut |
---|---|
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 |
Příklady
Následující kód vyplní BITMAPINFOHEADER strukturu z typu média videa. Všimněte si, že tyto převody ztratí některé informace o formátu (prokládání, frekvence snímků, rozšířená barevná data). Může však být užitečné při ukládání rastrového obrázku z rámečku videa, například.
#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;
}
Související témata