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.
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;
}
Relaterade ämnen