圧縮されていないビデオ メディアの種類
このトピックでは、圧縮されていないビデオ形式を記述するメディアの種類を作成する方法について説明します。 一般的なメディアの種類の詳細については、「 メディアの種類について」を参照してください。
完全な圧縮されていないビデオの種類を作成するには、 IMFMediaType インターフェイス ポインターに次の属性を設定します。
属性 | 説明 |
---|---|
MF_MT_MAJOR_TYPE | メジャーの種類。 MFMediaType_Videoに設定します。 |
MF_MT_SUBTYPE | サブタイプ。 「ビデオ サブタイプ GUID」を参照してください。 |
MF_MT_DEFAULT_STRIDE | サーフェスストライド。 ストライドは、1 行のピクセルから次の行に移動するために必要なバイト数です。 ストライド (バイト単位) がビデオの幅 (バイト単位) と同じでない場合は、この属性を設定します。 それ以外の場合は、この属性を省略できます。 |
MF_MT_FRAME_RATE | フレーム レート。 |
MF_MT_FRAME_SIZE | フレーム サイズ。 |
MF_MT_INTERLACE_MODE | インターレース モード。 |
MF_MT_ALL_SAMPLES_INDEPENDENT | 各サンプルが独立しているかどうかを指定します。 圧縮されていない形式の場合は TRUE に 設定します。 |
MF_MT_PIXEL_ASPECT_RATIO | ピクセルの縦横比。 |
また、正しい値がわかっている場合は、次の属性を設定します。 (それ以外の場合は、これらの属性を省略します)。
属性 | 説明 |
---|---|
MF_MT_VIDEO_PRIMARIES | 色の原色。 |
MF_MT_TRANSFER_FUNCTION | 転送関数。 |
MF_MT_YUV_MATRIX | 転送マトリックス。 |
MF_MT_VIDEO_CHROMA_SITING | 座っている彩度。 |
MF_MT_VIDEO_NOMINAL_RANGE | 標準範囲。 |
詳細については、「 拡張色情報」を参照してください。 たとえば、ビデオ標準を記述するメディアタイプを作成し、標準で彩度を定義する場合は、この情報をメディアタイプに追加します。 そうすることで、パイプライン全体で色の忠実性を維持するのに役立ちます。
ビデオ メディアの種類を作成する場合は、次の関数が役立つ場合があります。
機能 | 説明 |
---|---|
MFAverageTimePerFrameToFrameRate | フレームの平均期間を指定して、フレーム レートを計算します。 |
MFCalculateImageSize | 圧縮されていないビデオ形式の画像サイズを計算します。 |
MFFrameRateToAverageTimePerFrame | フレーム レートを指定して、ビデオ フレームの平均継続時間を計算します。 |
MFGetStrideForBitmapInfoHeader | ビデオ形式の最小サーフェス ストライドを返します。 詳細については、「 イメージストライド」を参照してください。 |
MFInitVideoFormat | NTSC テレビなどの一部の標準ビデオ形式の MFVIDEOFORMAT 構造体を初期化します。 その後、 構造体を使用してメディアの種類を初期化できます。 |
MFIsFormatYUV | ビデオ形式が YUV 形式であるかどうかを照会します。 |
例
この例では、圧縮されていないビデオ形式の最も一般的な情報を入力する関数を示します。 関数は IMFMediaType インターフェイス ポインターを返します。 その後、必要に応じてメディアの種類に属性を追加できます。
HRESULT CreateUncompressedVideoType(
DWORD fccFormat, // FOURCC or D3DFORMAT value.
UINT32 width,
UINT32 height,
MFVideoInterlaceMode interlaceMode,
const MFRatio& frameRate,
const MFRatio& par,
IMFMediaType **ppType
)
{
if (ppType == NULL)
{
return E_POINTER;
}
GUID subtype = MFVideoFormat_Base;
LONG lStride = 0;
UINT cbImage = 0;
IMFMediaType *pType = NULL;
// Set the subtype GUID from the FOURCC or D3DFORMAT value.
subtype.Data1 = fccFormat;
HRESULT hr = MFCreateMediaType(&pType);
if (FAILED(hr))
{
goto done;
}
hr = pType->SetGUID(MF_MT_MAJOR_TYPE, MFMediaType_Video);
if (FAILED(hr))
{
goto done;
}
hr = pType->SetGUID(MF_MT_SUBTYPE, subtype);
if (FAILED(hr))
{
goto done;
}
hr = pType->SetUINT32(MF_MT_INTERLACE_MODE, interlaceMode);
if (FAILED(hr))
{
goto done;
}
hr = MFSetAttributeSize(pType, MF_MT_FRAME_SIZE, width, height);
if (FAILED(hr))
{
goto done;
}
// Calculate the default stride value.
hr = pType->SetUINT32(MF_MT_DEFAULT_STRIDE, UINT32(lStride));
if (FAILED(hr))
{
goto done;
}
// Calculate the image size in bytes.
hr = MFCalculateImageSize(subtype, width, height, &cbImage);
if (FAILED(hr))
{
goto done;
}
hr = pType->SetUINT32(MF_MT_SAMPLE_SIZE, cbImage);
if (FAILED(hr))
{
goto done;
}
hr = pType->SetUINT32(MF_MT_FIXED_SIZE_SAMPLES, TRUE);
if (FAILED(hr))
{
goto done;
}
hr = pType->SetUINT32(MF_MT_ALL_SAMPLES_INDEPENDENT, TRUE);
if (FAILED(hr))
{
goto done;
}
// Frame rate
hr = MFSetAttributeRatio(pType, MF_MT_FRAME_RATE, frameRate.Numerator,
frameRate.Denominator);
if (FAILED(hr))
{
goto done;
}
// Pixel aspect ratio
hr = MFSetAttributeRatio(pType, MF_MT_PIXEL_ASPECT_RATIO, par.Numerator,
par.Denominator);
if (FAILED(hr))
{
goto done;
}
// Return the pointer to the caller.
*ppType = pType;
(*ppType)->AddRef();
done:
SafeRelease(&pType);
return hr;
}
次の例では、エンコードされたビデオ形式を入力として受け取り、一致する圧縮されていないビデオの種類を作成します。 この型は、たとえば、エンコーダーまたはデコーダーで設定するのに適しています。
HRESULT ConvertVideoTypeToUncompressedType(
IMFMediaType *pType, // Pointer to an encoded video type.
const GUID& subtype, // Uncompressed subtype (eg, RGB-32, AYUV)
IMFMediaType **ppType // Receives a matching uncompressed video type.
)
{
IMFMediaType *pTypeUncomp = NULL;
HRESULT hr = S_OK;
GUID majortype = { 0 };
MFRatio par = { 0 };
hr = pType->GetMajorType(&majortype);
if (majortype != MFMediaType_Video)
{
return MF_E_INVALIDMEDIATYPE;
}
// Create a new media type and copy over all of the items.
// This ensures that extended color information is retained.
if (SUCCEEDED(hr))
{
hr = MFCreateMediaType(&pTypeUncomp);
}
if (SUCCEEDED(hr))
{
hr = pType->CopyAllItems(pTypeUncomp);
}
// Set the subtype.
if (SUCCEEDED(hr))
{
hr = pTypeUncomp->SetGUID(MF_MT_SUBTYPE, subtype);
}
// Uncompressed means all samples are independent.
if (SUCCEEDED(hr))
{
hr = pTypeUncomp->SetUINT32(MF_MT_ALL_SAMPLES_INDEPENDENT, TRUE);
}
// Fix up PAR if not set on the original type.
if (SUCCEEDED(hr))
{
hr = MFGetAttributeRatio(
pTypeUncomp,
MF_MT_PIXEL_ASPECT_RATIO,
(UINT32*)&par.Numerator,
(UINT32*)&par.Denominator
);
// Default to square pixels.
if (FAILED(hr))
{
hr = MFSetAttributeRatio(
pTypeUncomp,
MF_MT_PIXEL_ASPECT_RATIO,
1, 1
);
}
}
if (SUCCEEDED(hr))
{
*ppType = pTypeUncomp;
(*ppType)->AddRef();
}
SafeRelease(&pTypeUncomp);
return hr;
}
関連トピック