2 つのフィルターを接続する
[このページに関連付けられている機能 DirectShow は、従来の機能です。 MediaPlayer、IMFMediaEngine、Media Foundation のオーディオ/ビデオ キャプチャに置き換わりました。 これらの機能は、Windows 10とWindows 11用に最適化されています。 新しいコードでは、可能であれば、DirectShow ではなく Media Foundation で MediaPlayer、IMFMediaEngine、Audio/Video Capture を使用することを強くお勧めします。 Microsoft は、レガシ API を使用する既存のコードを、可能であれば新しい API を使用するように書き換えるよう提案しています。]
このトピックでは、DirectShow フィルターを接続するためのヘルパー関数をいくつか示します。
2 つのフィルターを接続するには、アップストリーム フィルターに接続されていない出力ピンと、ダウンストリーム フィルターに接続されていない入力ピンが見つかる必要があります。
両方のピンへのポインターが既にある場合は、 IGraphBuilder::Connect メソッドを呼び出して接続します。 ピンが直接接続できない場合、 IGraphBuilder::Connect メソッドによって追加のフィルターが挿入され、接続が完了する可能性があります。 詳細については、「 インテリジェント接続」を参照してください。
ピンではなくフィルターへのポインターがある場合は、 IBaseFilter::EnumPins メソッドを使用してピンを検索する必要があります。 (「 ピンの列挙」を参照)。このトピックのヘルパー関数は、この手法を示しています。
フィルターにピン留めする出力
次の関数は、出力ピンへのポインターとフィルターへのポインターの 2 つのパラメーターを受け取ります。 関数は、出力ピンをフィルターの最初の使用可能な入力ピンに接続します。
// Connect output pin to filter.
HRESULT ConnectFilters(
IGraphBuilder *pGraph, // Filter Graph Manager.
IPin *pOut, // Output pin on the upstream filter.
IBaseFilter *pDest) // Downstream filter.
{
IPin *pIn = NULL;
// Find an input pin on the downstream filter.
HRESULT hr = FindUnconnectedPin(pDest, PINDIR_INPUT, &pIn);
if (SUCCEEDED(hr))
{
// Try to connect them.
hr = pGraph->Connect(pOut, pIn);
pIn->Release();
}
return hr;
}
この関数は、次の処理を行います。
- 関数を
FindUnconnectedPin
呼び出して、接続されていない入力ピンを取得します。 この関数は、「 フィルターで接続されていないピンを検索する」のトピックに示されています。 - IGraphBuilder::Connect を呼び出して、2 つのピンを接続します。
入力ピンへのフィルター処理
次の関数は、フィルターへのポインターと入力ピンへのポインターを受け取ります。 入力ピンをフィルタの最初の使用可能な出力ピンに接続します。
// Connect filter to input pin.
HRESULT ConnectFilters(IGraphBuilder *pGraph, IBaseFilter *pSrc, IPin *pIn)
{
IPin *pOut = NULL;
// Find an output pin on the upstream filter.
HRESULT hr = FindUnconnectedPin(pSrc, PINDIR_OUTPUT, &pOut);
if (SUCCEEDED(hr))
{
// Try to connect them.
hr = pGraph->Connect(pOut, pIn);
pOut->Release();
}
return hr;
}
フィルター処理
3 番目の関数は、アップストリーム フィルターへのポインターとダウンストリーム フィルターへのポインターを受け取り、両方のフィルターの接続を試みます。
// Connect filter to filter
HRESULT ConnectFilters(IGraphBuilder *pGraph, IBaseFilter *pSrc, IBaseFilter *pDest)
{
IPin *pOut = NULL;
// Find an output pin on the first filter.
HRESULT hr = FindUnconnectedPin(pSrc, PINDIR_OUTPUT, &pOut);
if (SUCCEEDED(hr))
{
hr = ConnectFilters(pGraph, pOut, pDest);
pOut->Release();
}
return hr;
}
関連トピック