次の方法で共有


手順 3B. GetMediaType メソッドを実装する

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

DirectShow フィルターの作成