手順 3A. CheckInputType メソッドを実装する
[このページに関連付けられている機能 DirectShow は、従来の機能です。 MediaPlayer、IMFMediaEngine、Media Foundation のオーディオ/ビデオ キャプチャに置き換わりました。 これらの機能は、Windows 10とWindows 11用に最適化されています。 新しいコードでは、可能であれば、DirectShow ではなく Media Foundation で MediaPlayer、IMFMediaEngine、Audio/Video Capture を使用することを強くお勧めします。 Microsoft は、レガシ API を使用する既存のコードを、可能であれば新しい API を使用するように書き換えるよう提案しています。]
これは、 変換フィルターの記述に関するチュートリアルの手順 3A です。
CTransformFilter::CheckInputType メソッドは、アップストリーム フィルターが変換フィルターにメディアの種類を提案するときに呼び出されます。 このメソッドは、AM_MEDIA_TYPE構造体のシン ラッパーである CMediaType オブジェクトへのポインターを受け取ります。 このメソッドでは、書式ブロック内のフィールドを含め、 AM_MEDIA_TYPE 構造のすべての関連フィールドを調べる必要があります。 CMediaType で定義されているアクセサー メソッドを使用することも、構造体メンバーを直接参照することもできます。 フィールドが無効な場合は、VFW_E_TYPE_NOT_ACCEPTEDを返します。 メディアの種類全体が有効な場合は、S_OKを返します。
たとえば、RLE エンコーダー フィルターでは、入力の種類は 8 ビットまたは 4 ビットの非圧縮 RGB ビデオである必要があります。 16 ビットまたは 24 ビット RGB などの他の入力形式をサポートする理由はありません。フィルターは、より低いビット深度に変換する必要があり、DirectShow は既にその目的のために 色空間コンバーター フィルターを提供しています。 次の例では、エンコーダーが 8 ビット ビデオをサポートしているが、4 ビット ビデオはサポートしていないと想定しています。
HRESULT CRleFilter::CheckInputType(const CMediaType *mtIn)
{
if ((mtIn->majortype != MEDIATYPE_Video) ||
(mtIn->subtype != MEDIASUBTYPE_RGB8) ||
(mtIn->formattype != FORMAT_VideoInfo) ||
(mtIn->cbFormat < sizeof(VIDEOINFOHEADER)))
{
return VFW_E_TYPE_NOT_ACCEPTED;
}
VIDEOINFOHEADER *pVih =
reinterpret_cast<VIDEOINFOHEADER*>(mtIn->pbFormat);
if ((pVih->bmiHeader.biBitCount != 8) ||
(pVih->bmiHeader.biCompression != BI_RGB))
{
return VFW_E_TYPE_NOT_ACCEPTED;
}
// Check the palette table.
if (pVih->bmiHeader.biClrUsed > PALETTE_ENTRIES(pVih))
{
return VFW_E_TYPE_NOT_ACCEPTED;
}
DWORD cbPalette = pVih->bmiHeader.biClrUsed * sizeof(RGBQUAD);
if (mtIn->cbFormat < sizeof(VIDEOINFOHEADER) + cbPalette)
{
return VFW_E_TYPE_NOT_ACCEPTED;
}
// Everything is good.
return S_OK;
}
この例では、メソッドは最初にメジャー型とサブタイプをチェックします。 次に、形式の種類をチェックして、フォーマット ブロックが VIDEOINFOHEADER 構造体であることを確認します。 フィルターは VIDEOINFOHEADER2 をサポートすることもできますが、この場合は実際の利点はありません。 VIDEOINFOHEADER2 構造体は、インターレースと非四角形ピクセルのサポートを追加します。これは、8 ビット ビデオでは関係ない可能性があります。
形式の種類が正しい場合は、VIDEOINFOHEADER 構造体の biBitCount メンバーと biCompression メンバーを調べて、形式が 8 ビットの非圧縮 RGB であることを確認します。 この例に示すように、
pbFormat
形式の型に基づいて、正しい構造体へのポインター。 ポインターをキャストする前に、常に形式の種類 GUID (formattype) と書式ブロック (cbFormat) のサイズをチェックします。
また、この例では、パレット エントリの数がビット深度と互換性があり、書式ブロックがパレット エントリを保持するのに十分な大きさであることを確認します。 この情報がすべて正しい場合、メソッドは S_OKを返します。
次へ: 手順 3B. GetMediaType メソッドを実装します。
関連トピック