次の方法で共有


手順 3A. CheckInputType メソッドを実装する

[このページに関連付けられている機能 DirectShow は、従来の機能です。 MediaPlayer、IMFMediaEngine、Media Foundation のオーディオ/ビデオ キャプチャに置き換わりました。 これらの機能は、Windows 10とWindows 11用に最適化されています。 新しいコードでは、可能であれば、DirectShow ではなく Media Foundation で MediaPlayerIMFMediaEngineAudio/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 メソッドを実装します

DirectShow フィルターの作成