본문 바로가기

About Programing/07. Direct Show

[DirectShow기초] Indroduction

- Filter, Filter Graphs 
 DirectShow의 기본 빌딩 블럭은 filter라 불리는 콤포넌트이다. 필터는 멀티미디어 스트림을 
어떤 연산을 해서, 내용을 변화시킨 후 출력해 주는 콤포넌트라 할 수 있다. 
 
 예를 들면 파일을 읽는 필터는 HDD에서 파일을 읽어서, 해당 파일을 스트림으로 만들어서
출력으로 내놓게 된다. 디코더나 출력장치로 출력하는 콤포넌트도 DirectShow에서는 필터라 부른다. 
 
 DiretShow에서는 이런 필터를 연결해서 필요한 작업을 진행한다. 예를 들어 파일필터의 출력을 디코더 필터의
입력에 연결하고, 디코더필터의 출력을 렌더러에 연결하고 하는 식이다. 당연한 이야기지만, 한 필터의 출력이
두개 이상의 필터에 입력으로 연결될 수도 있고, (아마도) 둘 이상의 필터의 출력을 한 필터에서 입력으로 받아서
처리할 수도 있을 것이다. 따라서, 필터간의 연결상태는 단순한 선형이 아닌 그래프 구조를 띄게 되며,
이런 연결된 필터들의 집합을 필터그래프라 한다. 
 
다음 예는 MSDN에 나온 필터그래프의 예이다.


 HDD의 파일을 FileSource필터가 읽어서, AVI Splitter에 전달하면, AVI Splitter는 그 데이터를 비디오 스트림과
오디오 스트림으로 만들어서 각각 AVI Decompressor와 Default DirectSound Device에 전달한다.
 AVI Decompressor는 비디오 스트림을 디코드하고, 그 결과를 Video Renderer에 전달하게 되며,
최종적으로 VideoRenderer는 DirectDraw나 GDI를 이용해 비디오 프레임을 화면에, DirectSound Device는
소리를 DirectSound를 이용해 스피커에 출력하게 된다. 
 
 어플리케이션 작성시에는 이러한 필터 그래프 생성을 위해 Filter Graph Manager를 사용하게 된다.
Filter Graph Manager는 필터들을 서로 연결할 수 있는 메소드를 제공하고, 스트림의 흐름을 제어하는
메소드와 각 필터에서 발생할 수 있는 이벤트를 전달하는 구조를 가지고 있다. 
 
DIrectShow 어플리케이션의 동작은 다음과 같은 절차를 거쳐 이루어진다. 

1. Filter Graph Manager의 인스턴스 생성
2. Filter Graph Manager를 통한 Filter Graph의 생성
3. Filter Graph Manager를 통한 스트림의 제어와 이벤트의 처리
4. 동작 완료 후엔 사용했던 필터와 manager를 해제

 다음 그림은 이 과정을 도식화한 것이다.


각 필터와 Graph Filter Manager는 COM객체이다. 따라서, 객체의 생성과 해제도 COM의 규칙에 따라
이루어지게 된다.