필터 체인

[이 페이지와 연결된 기능인 DirectShow는 레거시 기능입니다. MediaPlayer, IMFMediaEngine 및 Media Foundation의 오디오/비디오 캡처로 대체되었습니다. 이러한 기능은 Windows 10 및 Windows 11 최적화되었습니다. 가능한 경우 새 코드가 DirectShow 대신 Media Foundation에서 MediaPlayer, IMFMediaEngine오디오/비디오 캡처를 사용하는 것이 좋습니다. 가능한 경우 레거시 API를 사용하는 기존 코드를 다시 작성하여 새 API를 사용하도록 제안합니다.]

필터 체인은 다음 조건을 충족하는 필터 시퀀스입니다.

  • 체인의 각 필터에는 최대 하나의 연결된 입력 핀과 하나의 연결된 출력 핀이 있습니다.
  • 체인 외부의 필터를 트래버스하지 않고 체인의 모든 필터를 트래버스할 수 있습니다.

예를 들어 다음 다이어그램에서 필터 A-B, C-D 및 F-G-H는 필터 체인입니다. F-G-H(F-G 및 G-H)의 각 하위 집합도 필터 체인입니다. 필터 체인은 단일 필터로 구성되므로 필터 A, B, C, D, F, G 및 H도 고유한 필터 체인입니다. 필터 E에는 두 개의 입력 연결이 있으므로 필터 E를 포함하는 필터 시퀀스는 필터 체인이 아닙니다.

필터 체인(예제 1)

IFilterChain 인터페이스는 필터 체인을 제어하기 위한 다음 메서드를 제공합니다.

레이블
IFilterChain::StartChain 체인을 시작합니다.
IFilterChain::StopChain 체인을 중지합니다.
IFilterChain::P auseChain 체인을 일시 중지합니다.
IFilterChain::RemoveChain 그래프에서 체인을 제거합니다.

 

체인을 추가하는 특정 메서드는 없습니다. 체인을 추가하려면 IFilterGraph::AddFilter 메서드를 사용하여 새 필터를 삽입합니다. 그런 다음 , IGraphBuilder::Connect, IGraphBuilder::Render 또는 유사한 메서드를 호출하여 필터를 연결합니다.

그래프가 실행 중이면 필터 체인이 실행 중과 중지 간에 전환될 수 있습니다. 그래프가 일시 중지되면 일시 중지와 중지 사이를 전환할 수 있습니다. 필터 체인에서 가능한 유일한 상태 전환입니다.

필터 체인 지침

IFilterChain 메서드를 사용하는 경우 그래프의 필터가 필터 연결 작업을 지원할 수 있는지 확인해야 합니다. 그렇지 않으면 교착 상태 또는 그래프 오류가 발생할 수 있습니다. 체인 상태가 변경된 후 체인에 연결된 필터가 올바르게 작동해야 합니다.

IFilterChain을 사용하는 가장 좋은 방법은 체인을 위해 특별히 디자인한 필터 집합을 사용하는 것입니다. 필터 체인 작업에 필터가 안전한지 확인하려면 다음 지침을 사용합니다. 이러한 점은 다음 다이어그램을 참조합니다.

필터 체인(예제 2)

  • 필터 체인의 상태가 변경되기 전에 필터 체인의 경계에서 모든 데이터 처리 호출을 완료해야 합니다. 이 규칙은 IMemInputPin::Receive, IPin::NewSegmentIPin::EndOfStream 메서드에 적용됩니다. 체인의 필터는 체인 외부의 필터에 의해 만들어진 이러한 메서드에 대한 호출에서 반환되어야 합니다. 체인 외부의 및 필터는 체인 내의 필터에 의한 호출에서 반환되어야 합니다.

예를 들어 이전 다이어그램에서 필터 B는 필터 A의 모든 데이터 처리 호출을 완료해야 하며 필터 E는 필터 D에서 호출을 완료해야 합니다. 핀이 IPinFlowControlIPinConnection 인터페이스를 노출하는 경우 동적 다시 연결에 설명된 대로 IPinFlowControl::BlockIGraphConfig::P ushThroughData 메서드를 호출하여 그래프를 통해 데이터를 푸시할 수 있습니다. 필터는 데이터를 푸시하기 위한 프라이빗 메서드를 지원할 수도 있습니다.

  • 업스트림 필터는 체인의 상태가 변경될 것으로 예상해야 합니다. 예를 들어 이전 다이어그램에서 체인이 중지되었지만 A 호출 IMemInputPin::Receive를 필터링한다고 가정합니다. 호출이 실패하고 필터 A의 응답은 스트리밍을 중지하는 것입니다. 애플리케이션이 체인을 다시 시작하면 필터 A가 더 이상 데이터를 스트리밍하지 않으므로 영향을 주지 않습니다.
  • 다운스트림 필터는 체인의 상태도 변경될 것으로 예상해야 합니다. 그렇지 않은 경우 다운스트림 필터는 도착하지 않는 샘플을 기다리는 동안 차단될 수 있습니다. 예를 들어 MUX(멀티플렉서) 필터에는 모든 입력 핀의 데이터가 필요한 경우가 많습니다. 한 입력 핀에서 데이터 흐름을 중지하면 다른 스트림의 처리가 차단될 수 있습니다. 이로 인해 그래프가 교착 상태가 될 수 있습니다.
  • 체인 외부의 필터에서 체인 내의 필터로의 각 핀 연결에는 다른 연결에서 공유되지 않는 자체 할당자가 있어야 합니다. 체인이 상태를 변경하거나 그래프에서 제거되면 할당자가 커밋 해제될 수 있습니다. 다른 연결에서 동일한 할당자를 사용하는 경우 더 이상 샘플을 처리할 수 없습니다.
  • 체인에 연결된 필터가 동적 연결 끊기를 지원하지 않는 한 체인을 제거하지 마세요. 일반적으로 연결된 필터는 IPinConnection 또는 IPinFlowControl 인터페이스를 지원하지만 대신 프라이빗 인터페이스를 지원할 수 있습니다.

동적 그래프 빌드