手順 3B. GetMediaType メソッドを実装する
[このページに関連付けられている機能 DirectShow は、従来の機能です。 MediaPlayer、IMFMediaEngine、および Media Foundation のオーディオ/ビデオ キャプチャに置き換わりました。 これらの機能は、Windows 10とWindows 11用に最適化されています。 新しいコードでは、可能であれば、DirectShow ではなく Media Foundation で MediaPlayer、IMFMediaEngine、Audio/Video Capture を使用することを強くお勧めします。 Microsoft は、従来の API を使用する既存のコードを、可能であれば新しい API を使用するように書き直すよう提案しています。]
これは、 変換フィルターの作成に関するチュートリアルの手順 3B です。
注意
この手順は、 CTransInPlaceFilter から派生したフィルターには必要ありません。
CTransformFilter::GetMediaType メソッドは、インデックス番号によって参照される、フィルターの優先される出力の種類のいずれかを返します。 フィルターの入力ピンが既に接続されていない限り、このメソッドは呼び出されません。 したがって、アップストリーム接続のメディアタイプを使用して、優先される出力タイプを決定できます。
エンコーダーは通常、ターゲット形式を表す 1 つの優先型を提供します。 デコーダーは通常、さまざまな出力形式をサポートし、降順の品質または効率の順に提供します。 たとえば、リストは UYVY、Y211、RGB-24、RGB-565、RGB-555、RGB-8 のいずれかです。 効果フィルターでは、出力形式と入力形式の完全一致が必要になる場合があります。
次の例では、1 つの出力型を返します。これは、入力型を変更して RLE8 圧縮を指定することによって構築されます。
HRESULT CRleFilter::GetMediaType(int iPosition, CMediaType *pMediaType)
{
ASSERT(m_pInput->IsConnected());
if (iPosition < 0)
{
return E_INVALIDARG;
}
if (iPosition == 0)
{
HRESULT hr = m_pInput->ConnectionMediaType(pMediaType);
if (FAILED(hr))
{
return hr;
}
FOURCCMap fccMap = FCC('MRLE');
pMediaType->subtype = static_cast<GUID>(fccMap);
pMediaType->SetVariableSize();
pMediaType->SetTemporalCompression(FALSE);
ASSERT(pMediaType->formattype == FORMAT_VideoInfo);
VIDEOINFOHEADER *pVih =
reinterpret_cast<VIDEOINFOHEADER*>(pMediaType->pbFormat);
pVih->bmiHeader.biCompression = BI_RLE8;
pVih->bmiHeader.biSizeImage = DIBSIZE(pVih->bmiHeader);
return S_OK;
}
// else
return VFW_S_NO_MORE_ITEMS;
}
この例では、メソッドは IPin::ConnectionMediaType を呼び出して、入力ピンから入力の種類を取得します。 次に、圧縮形式を示すように一部のフィールドを変更します。
- FOURCCMap クラスを使用して、FOURCC コード 'MRLE' から構築された新しいサブタイプ GUID が割り当てられます。
- CMediaType::SetVariableSize メソッドを呼び出します。これにより、bFixedSizeSamples フラグが FALSE に設定され、lSampleSize メンバーが 0 に設定され、可変サイズのサンプルが示されます。
- CMediaType::SetTemporalCompression メソッドを呼び出し、値 FALSE を指定して、すべてのフレームがキー フレームであることを示します。 (このフィールドは情報のみであるため、無視しても問題ありません。
- biCompression フィールドをBI_RLE8に設定します。
- biSizeImage フィールドをイメージ サイズに設定します。
次へ: 手順 3C. CheckTransform メソッドを実装します。
関連トピック