본문 바로가기

About Programing/07. Direct Show

[DirectShow기초] 필터와 핀

 여러번 반복해서 지겨운 생각도 들겠지만, DirectShow구조는 필터들을 연결해서 데이터가 흘러가게 하고,
필터그래프 매니저가 데이터의 흐름을 제어하는 구조로 되어있다. 
 
 그렇다면 필터와 필터는 어떻게 연결할 수 있을까? 이 연결을 위한 객체가 바로 핀(pin)이다.
 
 IC에 핀이 있어서 다른 소자와 연결할 수 있는 것 처럼 필터에도 핀이 있어 다른 필터와 연결을
할 수 있는 것이다.
 IC마다 핀의 종류와 성격이 다르 듯, 필터의 성격에 따라 하나의 핀만을 노출할 수도 있고, 둘 이상의 핀을
노출할 수도 있다. 
 
 MSDN의 설명에 따르면, 핀은 필터에 의해 생성되는 COM 객체로써, 필터에 대한 단방향 데이터 스트림
(unidirectional data stream)의 연결점 역활을 한다. 
 
 입력핀은 데이터를 필터 안으로 읽어들일 때 사용하며, 출력핀은 데이터를 다른 필터에 전달할 때 사용한다.
소스필터는 파일에서 읽은 개개의 스트림마다 각각 하나의 출력핀을 제공한다. 코덱과
(compression/decompression을 줄여서 codec이라 함)같은 전형적인 변환필터는 하나의 입력핀과
출력핀을 가진다.
 마찬가지로 렌더러 필터는 보통 하나의 입력핀만을 가지는 경우가 많다. 
 
 핀의 이름은 필터를 작성하는 사람이 마음대로 붙일 수 있다. 만약 핀의 이름이 ~로 시작되면, 필터그래프는
그 핀을 IGraphBuilder::RenderFile을 어플리케이션이 호출했을 때, 자동으로 처리하지 않는다. 따라서, ~로
시작되는 핀 이름은 렌더링을 원하지 않고 정보만 제공하고 싶은 경우에 사용할 수 있다.
 ~가 핀의 이름의 첫글자로 들어가는것은 IGraphBuilder::RenderFile과 인텔리전트 연결
(IGraphBuilder::Connect)에만 영향을 끼친다.
 만약 ~로 시작되는 핀을 인텔리전트 연결에 사용하고 싶으면, IPin::Connect메소드를 해당 핀에 구현해주면
된다.
 
 필터는 최소한 IBaseFilter인터페이스는 노출을 시켜야 한다. 이 인터페이스는 필터가 제공하는 핀들을
뒤질 수 있도록 하는 메소드를 제공하고, 필터에 대한 정보를 제공한다. 또한, 이 인터페이스는
IMediaFilter에서 상속한 메소드를 함께 제공한다.
 이런 메소드에는 필터의 상태를 처리하는 것이나(플레이/일시중지/정지), 동기화 관련된 메소드들이 있으며,
필터 그래프 매니저에 의해 주로 호출되게 된다. 
 
 당연한 말이지만, 필터가 처리하는 미디어의 종류나 작업에 따라 이 인터페이스 외에 필요한 인터페이스를
더 노출할 수 있다.
 예를 들어 ISpecifyPropertyPages 인터페이스를 통해 프로퍼티 페이지를 제공해서, 필터의 프로퍼티를
설정할 수 있도록 할수도 있다. 
 
 핀은 다른 핀과의 연결과 데이터의 전송을 책임진다. 핀 인터페이스는 다음 기능을 지원한다.

* 공유메모리 혹은 다른 자원을 사용한 타임스탬프가 찍힌 정보의 전달
* 핀대핀 연결에 있어 데이터 포맷의 협상
* 데이터 복사 최소화화 처리 성능 향상을 위한 버퍼 관리와 버퍼 할당 관리 협상

 핀 인터페이스는 그 핀이 입력핀인지 출력핀인지에 따라 약간씩 다르다. 
출력핀은 일반적으로 다음 인터페이스들을 노출한다.

* IPin의 메소드들은 핀, 연결, 그리고 데이터 타입 정보에 대한 질의에 응답하도록 하며,
 필터그래프가 정지될 때, 플러쉬 통지를 다운스트림으로 보내는데 사용된다.
* IMediaSeeking의 메소드들은 스트림의 길이, 시작시간, 그리고 종료시간을 렌더러로 전달하도록 한다.
 렌더러는 미디어의 위치를 업스트림으로 보내서, 스트림이 적절한 위치로 위치하도록 하는 책임을 지닌
 필터 (일반적으로는 소스필터)가 위치 변경을 처리할 수 있도록 한다.
* IQualityControl의 메소드들은 렌더러에서 업스트림쪽으로 품질 컨트롤을 위한 메시지를 전달하도록 하는데
 사용된다. 입력핀은 다음 인터페이스들을 노출한다.
* IPin은 핀이 출력핀에 연결될 수 있도록 하고, 핀의 정보와 연결 정보를 제공하도록 한다.
* IMemInputPin은 핀이 자신의 메모리 할당자를 제안하고, 메모리 할당자에게 출력핀이 데이터를 제공하고
 있음을 통지하고, 미디어 샘플을 설정된 할당자를 통해 전달할 수 있도록 한다. 또한, 버퍼의 플러쉬 기능도
 제공한다. 이 인터페이스는 연결된 핀이 전송을 위한 메모리 할당자를 제공하지 않는다면,
 공유메모리 할당자를 생성할 수 있다.