다음을 통해 공유


핀 다시 연결

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

핀 연결 중에 필터는 다음과 같이 다른 핀 중 하나의 연결을 끊고 다시 연결할 수 있습니다.

  1. 필터는 다른 필터의 핀에서 IPin::QueryAccept 를 호출하고 새 미디어 유형을 지정합니다.
  2. QueryAccept가 S_OK 반환하는 경우 필터는 IFilterGraph2::ReconnectEx를 호출하여 핀을 다시 연결합니다.

다음은 필터가 핀을 다시 연결해야 하는 경우에 대한 몇 가지 예입니다.

  • 티 필터. 티 필터는 스트림의 데이터를 변경하지 않고 입력 스트림을 여러 출력으로 분할합니다. 티 필터는 다양한 미디어 형식을 허용할 수 있지만 형식은 모든 핀 연결에서 일치해야 합니다. 따라서 입력 핀이 연결되면 필터가 출력 핀의 기존 연결을 재협상해야 할 수도 있고 그 반대의 경우도 마찬가지입니다. 예제는 InfTee 필터 샘플을 참조하세요.
  • 현재 위치 간 필터입니다. 현재 위치 변환 필터는 데이터를 별도의 출력 버퍼에 복사하는 대신 원래 버퍼의 입력 데이터를 수정합니다. 현재 위치 변환 필터는 업스트림 및 다운스트림 연결 모두에 대해 동일한 할당자를 사용해야 합니다. 연결할 첫 번째 핀(입력 또는 출력)은 일반적인 방식으로 할당자를 협상합니다. 그러나 다른 핀이 연결되면 첫 번째 할당자가 허용되지 않을 수 있습니다. 이 경우 두 번째 핀은 다른 할당자를 선택하고 첫 번째 핀은 새 할당자를 사용하여 다시 연결됩니다. 구현 예제는 CTransInPlaceFilter 클래스를 참조하세요.

ReconnectEx 메서드에서 Filter Graph Manager는 핀의 연결을 비동기적으로 끊고 다시 연결합니다. QueryAccept가 S_OK 반환하지 않는 한 필터는 다시 연결을 시도해서는 안됩니다. 그렇지 않으면 핀의 연결이 끊어져 그래프 오류가 발생합니다. 또한 필터는 동일한 스레드의 IPin::Connect 메서드 내에서 다시 연결을 요청해야 합니다. Connect 메서드가 한 스레드에서 반환하고 다른 스레드가 다시 연결 요청을 수행하는 경우 Filter Graph Manager는 다시 연결하기 전에 그래프를 실행하여 그래프 오류를 일으킬 수 있습니다.