キャプチャ フィルタのピン要件
ピン名
ピンには任意の名前を付けられる。ピンの名前がチルダ (~) 文字で始まる場合、アプリケーションが IGraphBuilder::RenderFile を呼び出しても、フィルタ グラフはそのピンに対して自動的なレンダリングを行わない。たとえば、フィルタにキャプチャ ピンとプレビュー ピンがあり、それぞれ "~ Capture" と "Preview" という名前を付けたとする。アプリケーションがグラフでそのフィルタをレンダリングする場合、プレビュー ピンはデフォルト レンダラに接続し、キャプチャ ピンには何も接続しない。これは適切なデフォルト動作である。また、レンダリングする予定がない情報提供用データを送信するピン、またはカスタム プロパティ セットを必要とするピンにも適用できる。チルダ (~) プレフィックスが付いたピンはアプリケーションで手動接続もできる点に注意すること。
ピン カテゴリ
キャプチャ フィルタには常にキャプチャ ピンがあり、場合によってはプレビュー ピンもある。一部のキャプチャ フィルタは、制御情報など他のタイプのデータを送信するため、他の出力ピンを持つことがある。各出力ピンは IKsPropertySet インターフェイスを公開する必要がある。アプリケーションはこのインターフェイスを使って、ピン カテゴリを判別する。通常、ピンは PIN_CATEGORY_CAPTURE または PIN_CATEGORY_PREVIEW を返す。詳細については、「ピン プロパティ セット」を参照すること。
次の例は、キャプチャ ピンのピン カテゴリを返す IKsPropertySet を実装する方法を示している。
// Set: プロパティを設定できない。
HRESULT CMyCapturePin::Set(REFGUID guidPropSet, DWORD dwID,
void *pInstanceData, DWORD cbInstanceData, void *pPropData,
DWORD cbPropData)
{
return E_NOTIMPL;
}
// Get: ピン カテゴリを返す (唯一のプロパティ)。
HRESULT CMyCapturePin::Get(
REFGUID guidPropSet, // どのプロパティ セットか。
DWORD dwPropID, // そのセットの中でどのプロパティか。
void *pInstanceData, // インスタンス データ (無視)。
DWORD cbInstanceData, // インスタンス データのサイズ (無視)。
void *pPropData, // プロパティ データを受け取るバッファ。
DWORD cbPropData, // バッファのサイズ。
DWORD *pcbReturned // プロパティのサイズを返す。
)
{
if (guidPropSet != AMPROPSETID_Pin)
return E_PROP_SET_UNSUPPORTED;
if (dwPropID != AMPROPERTY_PIN_CATEGORY)
return E_PROP_ID_UNSUPPORTED;
if (pPropData == NULL && pcbReturned == NULL)
return E_POINTER;
if (pcbReturned)
*pcbReturned = sizeof(GUID);
if (pPropData == NULL) // 呼び出し元はサイズだけ知りたい。
return S_OK;
if (cbPropData < sizeof(GUID)) // バッファが小さすぎる。
return E_UNEXPECTED;
*(GUID *)pPropData = PIN_CATEGORY_CAPTURE;
return S_OK;
}
// QuerySupported: 指定されたプロパティをピンがサポートしているかどうか問い合わせる。
HRESULT CMyCapturePin::QuerySupported(REFGUID guidPropSet, DWORD dwPropID,
DWORD *pTypeSupport)
{
if (guidPropSet != AMPROPSETID_Pin)
return E_PROP_SET_UNSUPPORTED;
if (dwPropID != AMPROPERTY_PIN_CATEGORY)
return E_PROP_ID_UNSUPPORTED;
if (pTypeSupport)
// このプロパティの取得はサポートしているが、設定はサポートしていない。
*pTypeSupport = KSPROPERTY_SUPPORT_GET;
return S_OK;
}