メディアの種類の変換
場合によっては、Media Foundation メディアの種類と、DirectShow または Windows Media Format SDK から古いメディアの種類の構造を変換する必要があります。
書式構造から Media Foundation 型へ
次の関数は、形式構造から Media Foundation メディアの種類を初期化します。 これらの関数は、データ ストリームまたはファイル ヘッダーに書式構造が含まれている場合にも役立ちます。 たとえば、WAVE オーディオ ファイルのファイル ヘッダーには WAVEFORMATEX 構造体が含まれています。
変換する構造体 | 機能 |
---|---|
AM_MEDIA_TYPE (DirectShow) DMO_MEDIA_TYPE (DirectX メディア オブジェクト) WM_MEDIA_TYPE (Windows Media Format SDK) メモ: これらの構造体は同等です。 |
MFInitMediaTypeFromAMMediaType |
BITMAPINFOHEADER | MFCreateVideoMediaTypeFromBitMapInfoHeaderEx |
MFVIDEOFORMAT | MFInitMediaTypeFromMFVideoFormat |
MPEG1VIDEOINFO | MFInitMediaTypeFromMPEG1VideoInfo |
MPEG2VIDEOINFO | MFInitMediaTypeFromMPEG2VideoInfo |
VIDEOINFOHEADER2 | MFInitMediaTypeFromVideoInfoHeader2 |
VIDEOINFOHEADER | MFInitMediaTypeFromVideoInfoHeader |
WAVEFORMATEX または WAVEFORMATEXTENSIBLE | MFInitMediaTypeFromWaveFormatEx |
Media Foundation の種類から書式構造へ
次の関数は、Media Foundation メディアの種類から書式構造を作成または初期化します。
マッピングの書式設定
次の表に、さまざまな形式構造に対応する Media Foundation 属性の一覧を示します。 これらの属性の一部を直接変換できるわけではありません。 変換を実行するには、前のセクションで示した関数を使用する必要があります。これらのテーブルは、主に参照用に提供されています。
AM_MEDIA_TYPE
メンバー | 属性 |
---|---|
bTemporalCompression | MF_MT_ALL_SAMPLES_INDEPENDENT |
bFixedSizeSamples | MF_MT_FIXED_SIZE_SAMPLES |
lSampleSize | MF_MT_SAMPLE_SIZE |
WAVEFORMATEX、WAVEFORMATEXTENSIBLE
メンバー | 属性 |
---|---|
wFormatTag |
MF_MT_SUBTYPE wFormatTag がWAVE_FORMAT_EXTENSIBLE場合、サブタイプは SubFormat メンバーにあります。 |
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 |
SubFormat | MF_MT_SUBTYPE |
追加のデータ | MF_MT_USER_DATA |
VIDEOINFOHEADER、VIDEOINFOHEADER2
メンバー | 属性 |
---|---|
dwBitRate | MF_MT_AVG_BITRATE |
dwBitErrorRate | MF_MT_AVG_BIT_ERROR_RATE |
AvgTimePerFrame | MF_MT_FRAME_RATE。この値を計算するには、 MFAverageTimePerFrameToFrameRate を使用します。 |
dwInterlaceFlags | MF_MT_INTERLACE_MODE |
dwCopyProtectFlags | 同等の定義はありません |
dwPictAspectRatioX、 dwPictAspectRatioY | MF_MT_PIXEL_ASPECT_RATIO;は、画像の縦横比から図の縦横比に変換する必要があります。 |
dwControlFlags | MF_MT_PAD_CONTROL_FLAGS。 AMCONTROL_COLORINFO_PRESENT フラグが存在する場合は、「拡張カラー情報」で説明されている拡張カラー属性を設定します。 |
bmiHeader.biWidth、 bmiHeader.biHeight | MF_MT_FRAME_SIZE |
bmiHeader.biBitCount | サブタイプ (MF_MT_SUBTYPE) で暗黙的です。 |
bmiHeader.biCompression | サブタイプの暗黙的。 |
bmiHeader.biSizeImage | MF_MT_SAMPLE_SIZE |
パレット情報 | MF_MT_PALETTE |
次の属性は VIDEOINFOHEADER または VIDEOINFOHEADER2 構造体から推論できますが、形式の詳細に関する知識も必要です。 たとえば、YUV 形式によってストライド要件が異なります。
MPEG1VIDEOINFO
メンバー | 属性 |
---|---|
dwStartTimeCode | MF_MT_MPEG_START_TIME_CODE |
bSequenceHeader | MF_MT_MPEG_SEQUENCE_HEADER |
biXPelsPerMeter、 biYPelsPerMeter | MF_MT_PIXEL_ASPECT_RATIO |
MPEG2VIDEOINFO
メンバー | 属性 |
---|---|
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 |
例
次のコードは、ビデオ メディアの種類から BITMAPINFOHEADER 構造体を入力します。 この変換では、一部の形式情報 (インターレース、フレーム レート、拡張カラー データ) が失われることに注意してください。 ただし、たとえば、ビデオ フレームからビットマップを保存する場合に便利な場合があります。
#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;
}
関連トピック