ピン カテゴリの操作
[このページに関連付けられている機能 DirectShow は、従来の機能です。 MediaPlayer、IMFMediaEngine、Media Foundation のオーディオ/ビデオ キャプチャに置き換わりました。 これらの機能は、Windows 10とWindows 11用に最適化されています。 新しいコードでは、可能であれば、DirectShow ではなく Media Foundation で MediaPlayer、IMFMediaEngine、Audio/Video Capture を使用することを強くお勧めします。 Microsoft は、レガシ API を使用する既存のコードを、可能であれば新しい API を使用するように書き換えるよう提案しています。]
特定のピン カテゴリを持つピンをフィルターで検索するには、 ICaptureGraphBuilder2::FindPin メソッドを使用します。 次の例では、ビデオ プレビュー ピンを検索します。
int i = 0;
hr = pBuild->FindPin(
pFilter, // Pointer to a filter to search.
PINDIR_OUTPUT, // Which pin direction?
&PIN_CATEGORY_PREVIEW, // Which category? (NULL means "any category")
&MEDIATYPE_Video, // What media type? (NULL means "any type")
FALSE, // Must be connected?
i, // Get the i'th matching pin (0 = first match)
&pPin // Receives a pointer to the pin.
);
最初のパラメーターは、フィルターの IBaseFilter インターフェイスへのポインターです。 次の 3 つのパラメーターは、方向、ピン カテゴリ、メディアの種類を指定します。 5 番目のパラメーターの値 FALSE は、ピンが接続または接続されていないことを示します。 (これらのパラメーターの正確な定義については、 メソッドのドキュメントを参照してください)。メソッドが一致するピンを見つけた場合、pPin パラメーターの IPin インターフェイスへのポインターを返します。
FindPin メソッドは便利ですが、必要に応じて独自のヘルパー関数を記述することもできます。 ピンのカテゴリを確認するには、「Pin プロパティ セット」の説明に従って IKsPropertySet::Get メソッドを呼び出します。
次のコードは、ピンが指定したカテゴリと一致するかどうかをチェックするヘルパー関数を示しています。
// Returns TRUE if a pin matches the specified pin category.
BOOL PinMatchesCategory(IPin *pPin, REFGUID Category)
{
BOOL bFound = FALSE;
IKsPropertySet *pKs = NULL;
HRESULT hr = pPin->QueryInterface(IID_PPV_ARGS(&pKs));
if (SUCCEEDED(hr))
{
GUID PinCategory;
DWORD cbReturned;
hr = pKs->Get(AMPROPSETID_Pin, AMPROPERTY_PIN_CATEGORY, NULL, 0,
&PinCategory, sizeof(GUID), &cbReturned);
if (SUCCEEDED(hr) && (cbReturned == sizeof(GUID)))
{
bFound = (PinCategory == Category);
}
pKs->Release();
}
return bFound;
}
次の例は、 FindPin メソッドと同様に、カテゴリ別にピンを検索する関数です。
// Finds the first pin that matches a specified pin category and direction.
HRESULT FindPinByCategory(
IBaseFilter *pFilter, // Pointer to the filter to search.
PIN_DIRECTION PinDir, // Direction of the pin.
REFGUID Category, // Pin category.
IPin **ppPin) // Receives a pointer to the pin.
{
*ppPin = 0;
HRESULT hr = S_OK;
BOOL bFound = FALSE;
IEnumPins *pEnum = 0;
IPin *pPin = 0;
hr = pFilter->EnumPins(&pEnum);
if (FAILED(hr))
{
goto done;
}
while (hr = pEnum->Next(1, &pPin, 0), hr == S_OK)
{
PIN_DIRECTION ThisPinDir;
hr = pPin->QueryDirection(&ThisPinDir);
if (FAILED(hr))
{
goto done;
}
if ((ThisPinDir == PinDir) &&
PinMatchesCategory(pPin, Category))
{
*ppPin = pPin;
(*ppPin)->AddRef(); // The caller must release the interface.
bFound = TRUE;
break;
}
SafeRelease(&pPin);
}
done:
SafeRelease(&pPin);
SafeRelease(&pEnum);
if (SUCCEEDED(hr) && !bFound)
{
hr = E_FAIL;
}
return hr;
}
次のコードでは、前の関数を使用して、フィルター上のビデオ ポート ピンを検索します。
IPin *pVP;
hr = FindPinByCategory(pFilter, PINDIR_OUTPUT,
PIN_CATEGORY_VIDEOPORT, &pVP);
if (SUCCEEDED(hr))
{
// Use pVP ...
// Release when you are done.
pVP->Release();
}
プロパティ セットの詳細については、 Windows Driver Kit (WDK) のドキュメントを参照してください。
関連トピック