캡처 필터에 대한 핀 요구 사항
[이 페이지와 연결된 기능인 DirectShow는 레거시 기능입니다. MediaPlayer, IMFMediaEngine 및 Media Foundation의 오디오/비디오 캡처로 대체되었습니다. 이러한 기능은 Windows 10 및 Windows 11 최적화되었습니다. 가능한 경우 새 코드가 DirectShow 대신 Media Foundation에서 MediaPlayer, IMFMediaEngine 및 오디오/비디오 캡처를 사용하는 것이 좋습니다. 가능한 경우 레거시 API를 사용하는 기존 코드를 다시 작성하여 새 API를 사용하도록 제안합니다.]
이 항목에서는 DirectShow 캡처 필터에서 출력 핀을 구현하기 위한 요구 사항에 대해 설명합니다.
핀 이름
핀에 이름을 지정할 수 있습니다. 핀 이름이 바일드(~) 문자로 시작하는 경우 애플리케이션이 IGraphBuilder::RenderFile을 호출할 때 필터 그래프 관리자가 해당 핀을 자동으로 렌더링하지 않습니다. 예를 들어 필터에 캡처 핀과 미리 보기 핀이 있는 경우 각각 이름을 "~캡처" 및 "미리 보기"로 지정할 수 있습니다. 애플리케이션이 그래프에서 필터를 렌더링하는 경우 미리 보기 핀은 기본 렌더러에 연결되고 캡처 핀에 연결되지 않습니다. 이는 적절한 기본 동작입니다. 이는 렌더링할 수 없는 정보 데이터를 제공하는 핀이나 사용자 지정 속성 집합이 필요한 핀에도 적용될 수 있습니다. 타일(~) 접두사를 사용하는 핀은 애플리케이션에서 수동으로 연결할 수 있습니다.
범주 고정
캡처 필터에는 항상 캡처 핀이 있으며 미리 보기 핀이 있을 수 있습니다. 일부 캡처 필터에는 컨트롤 정보와 같은 다른 유형의 데이터를 제공하기 위한 다른 출력 핀이 있을 수 있습니다. 각 출력 핀 은 IKsPropertySet 인터페이스를 노출해야 합니다. 애플리케이션은 이 인터페이스를 사용하여 핀 범주를 결정합니다. 핀은 일반적으로 PIN_CATEGORY_CAPTURE 또는 PIN_CATEGORY_PREVIEW 반환합니다. 자세한 내용은 Pin 속성 집합을 참조하세요.
다음 예제에서는 IKsPropertySet 을 구현하여 캡처 핀에 핀 범주를 반환하는 방법을 보여 줍니다.
// Set: Cannot set any properties.
HRESULT CMyCapturePin::Set(REFGUID guidPropSet, DWORD dwID,
void *pInstanceData, DWORD cbInstanceData, void *pPropData,
DWORD cbPropData)
{
return E_NOTIMPL;
}
// Get: Return the pin category (our only property).
HRESULT CMyCapturePin::Get(
REFGUID guidPropSet, // Which property set.
DWORD dwPropID, // Which property in that set.
void *pInstanceData, // Instance data (ignore).
DWORD cbInstanceData, // Size of the instance data (ignore).
void *pPropData, // Buffer to receive the property data.
DWORD cbPropData, // Size of the buffer.
DWORD *pcbReturned // Return the size of the property.
)
{
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) // Caller just wants to know the size.
return S_OK;
if (cbPropData < sizeof(GUID)) // The buffer is too small.
return E_UNEXPECTED;
*(GUID *)pPropData = PIN_CATEGORY_CAPTURE;
return S_OK;
}
// QuerySupported: Query whether the pin supports the specified property.
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)
// We support getting this property, but not setting it.
*pTypeSupport = KSPROPERTY_SUPPORT_GET;
return S_OK;
}
관련 항목