DirectShow DirectShow 에 대해 필터 그래프의 데이터 플로우 필터 상태   [목차열람] [주소복사] [슬롯비우기]
필터 상태
 
Microsoft DirectX 9.0

필터 상태

필터에는, 정지·포즈·실행이라고 하는 3 개 상태가 있다. 포즈 상태의 목적은, 실행 커멘드를 즉시 응답할 수 있도록(듯이), 그래프내의 데이터의 머리 방편을 하는 것이다. 필터 그래프 매니저는, 모든 상태의 처리을 제어한다. 애플리케이션이 IMediaControl::Run , IMediaControl::Pause 또는 IMediaControl::Stop 를 호출하면, 필터 그래프 매니저는 모든 필터에 대해 대응하는 IMediaFilter 메서드를 호출한다. 정지로부터 실행중에의 처리에서는 항상 포즈 상태가 개재하므로, 애플리케이션이, 정지하고 있는 그래프에 대해 Run 를 호출하면, 필터 그래프 매니저는 그래프를 포즈 상태로 하고 나서 실행한다.

대부분의 필터에서는, 실행중 상태와 포즈 상태는 같다. 다음과 같은 필터 그래프를 생각해 본다.

    Source > Transform > Renderer

여기에서는, 소스 필터는 라이브 캡춰 소스는 아니면 가정한다. 소스 필터는, 포즈 상태가 되면 새로운 데이터를 생성하는 thread를 생성 해, 데이터를 즉석에서 미디어 샘플에 기입한다. thread는, 변환 필터의 입력 핀의 IMemInputPin::Receive 메서드를 호출해, 샘플을 다운 스트림에 "푸쉬" 한다. 변환 필터는, 소스 필터의 thread상에서 샘플을 받는다. 필터는 워커 thread를 사용해 샘플을 렌더러에 보내는 경우도 있지만, 보통은 같은 thread상에서 샘플을 보낸다. 렌더러는 포즈 상태인 동안, 샘플의 수신을 기다리고 있다. 렌더러는, 샘플을 수신 하면, 샘플을 블록 해, 무기한 으로 유지한다. 비디오 렌더러의 경우는, 샘플을 포스터 이미지로서 표시해, 필요에 따라서 이미지를 재드로잉(Drawing) 한다.

이 시점에서, 스트림은 완전하게 머리 내 되어 렌더링의 준비가 되어 있다. 그래프가 그대로 포즈 상태인 경우, 각 필터가 Receive 또는 GetBuffer 내에서 블록 될 때까지, 샘플은 그래프내에서 최초의 샘플의 뒤에 "쌓아올리고". 다만, 데이터가 없어질 것은 없다. 소스 thread의 블록이 해제되면 블록 된 포인트로부터 재개한다.

소스 필터와 변환 필터는 포즈로부터 실행중에의 처리을 무시한다. 이러한 필터는, 할 수 있는 한 고속으로 데이터를 계속 처리한다. 한편, 렌더러는, 실행중이 되면 샘플의 렌더링을 시작 한다. 최초로, 포즈 상태가 되었을 때에 보관 유지하고 있던 샘플을 렌더링 한다. 다음에, 새로운 샘플을 받을 때마다, 샘플의 프레젠테이션 타임을 계산한다. 더 자세한 정보는, 「DirectShow 의 타임과 클럭」을 참조할것. 렌더러는 프레젠테이션 타임까지 각 샘플을 보관 유지해, 프레젠테이션 타임이 되면 샘플을 렌더링 한다. 프레젠테이션 타임까지 대기하는 동안, 렌더러는 Receive 메서드내에서 블록 하는지, 큐를 가지는 워커 thread상에서 새로운 샘플을 받는다. 렌더러보다 업 스트림의 필터는, 스케줄에는 관여하지 않는다.

캡춰 장치등의 라이브 소스는, 이 일반적인 아키텍처의 예외이다. 라이브 소스의 경우, 데이터를 미리 머리 내 하는 것은 적절하지 않다. 애플리케이션은 그래프를 포즈 상태로 해, 그래프를 실행할 때까지 장시간 대기하는 경우가 있다. 그래프는 "낡은" 샘플을 렌더링 해서는 안된다. 따라서, 라이브 소스는 포즈 상태에서는 샘플을 생성하지 않고, 실행중에만 생성한다. 이것을 필터 그래프 매니저에 통지하기 위해서, 소스 필터의 IMediaFilter::GetState 메서드는 VFW_S_CANT_CUE 를 돌려준다. 이 반환 코드는, 렌더러가 아무것도 데이터를 받지 않은 경우에서도, 필터가 포즈 상태에 바뀐 것을 나타낸다.

필터는 정지 하면, 그 이후에 보내진 샘플을 거부한다. 소스 필터는 스트리밍 thread를 셧다운 해, 다른 필터는 생성 한 워커 thread를 셧다운 한다. 핀은 그 할당자를 데코밋트 한다.

상태의 처리

필터 그래프 매니저는, 렌더러로부터 시작해, 소스 필터에 돌아오면서, 업 스트림 방향으로 모든 상태의 처리을 실행한다. 이 순서부는, 샘플의 드롭과 그래프의 데드 록을 방지하기 위해서 필요하다. 가장 치명적인 상태의 처리은, 포즈와 정지동안의 처리이다.

↑TOP