다음을 통해 공유


캡처 필터에 대한 핀 요구 사항

[이 페이지와 연결된 기능인 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;
}

캡처 필터 작성