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.
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;
}
Verwante onderwerpen