필터 상태

필터에는 중지 됨, 일시 중지 됨, 실행 중의 세 가지 상태가 있습니다. 일시 중지 된 상태의 목적은 실행 명령이 즉시 응답 하도록 그래프의 데이터를 큐에 두기 위한 것입니다. 필터 Graph 관리자는 모든 상태 전환을 제어 합니다. 응용 프로그램에서 IMediaControl:: Run, IMediaControl::P ause또는 IMediaControl:: Stop을 호출할 때 필터 Graph 관리자는 모든 필터에 대해 해당 imediafilter 메서드를 호출 합니다. 중지 됨과 실행 중인 전환 간의 전환은 항상 일시 중지 됨 상태를 거칩니다. 따라서 응용 프로그램이 중지 된 그래프에서 실행 되는 경우 필터 Graph 관리자는 그래프를 실행 하기 전에 그래프를 일시 중지 합니다.

대부분의 필터에 대해 실행 중 및 일시 중지 됨 상태는 동일 합니다. 다음 필터 그래프를 살펴보십시오.

원본 > 변환 > 렌더러

원본 필터가 라이브 캡처 원본이 아닌 것으로 가정 합니다. 원본 필터가 일시 중지 되 면 새 데이터를 생성 하는 스레드를 만들고 가능한 한 빨리 미디어 샘플에 씁니다. 스레드는 변환 필터의 입력 핀에서 Imeminputpin:: Receive 를 호출 하 여 샘플 다운스트림을 "푸시합니다". 변환 필터는 소스 필터의 스레드에 대 한 샘플을 수신 합니다. 이 클래스는 작업자 스레드를 사용 하 여 샘플을 렌더러에 제공할 수 있지만 일반적으로 동일한 스레드에 전달 합니다. 렌더러가 일시 중지 되어 있는 동안 샘플을 수신 대기 합니다. 하나를 받은 후에는 해당 샘플을 무기한 차단 하 고 유지 합니다. 비디오 렌더러 인 경우 예제를 포스터 이미지로 표시 하 고 필요에 따라 이미지를 다시 표시 합니다.

이 시점에서 스트림은 완전히 cued 렌더링할 준비가 됩니다. 그래프가 일시 중지 된 상태로 유지 되는 경우 모든 필터가 Receive 또는 Imemallocator:: getbuffer에서 차단 될 때까지 첫 번째 샘플 뒤의 그래프가 "더미" 됩니다. 그러나 데이터는 손실 되지 않습니다. 원본 스레드의 차단이 해제 되 면 차단 된 지점부터 다시 시작 됩니다.

원본 필터와 변환 필터는 일시 중지 됨에서 실행 중으로의 전환을 무시 합니다. 즉, 가능한 한 빨리 데이터를 처리 합니다. 그러나 렌더러에서 실행 하면 렌더링 샘플이 시작 됩니다. 먼저 일시 중지 된 동안 보유 한 샘플을 렌더링 합니다. 그런 다음 새 샘플을 받을 때마다 샘플의 프레젠테이션 시간을 계산 합니다. 자세한 내용은 DirectShow의 시간 및 시계를 참조 하세요. 렌더러는 프레젠테이션 시간까지 샘플을 렌더링 하는 시점까지 각 샘플을 보관 합니다. 프레젠테이션 시간이 될 때까지 대기 하는 동안 수신 메서드에서 차단 하거나 큐가 있는 작업자 스레드에서 새 샘플을 받습니다. 렌더러의 업스트림 필터는 일정에 포함 되지 않습니다.

장치 캡처와 같은 라이브 원본은이 일반 아키텍처에 대 한 예외입니다. 라이브 원본을 사용 하는 경우 데이터를 미리 큐에 추가할 수 없습니다. 응용 프로그램에서 그래프를 일시 중지 한 다음 실행 하기 전에 오랜 시간 동안 기다릴 수 있습니다. 그래프가 "부실" 샘플을 렌더링 해서는 안 됩니다. 따라서 라이브 소스는를 실행 하는 동안 일시 중지 된 동안에만 샘플을 생성 하지 않습니다. 이 사실을 필터 Graph 관리자에 게 알리기 위해 원본 필터의 imediafilter:: getstate 메서드는 vfw의 신호를 반환 하지 _ _ _ 않습니다. 이 반환 코드는 렌더러가 데이터를 받지 않은 경우에도 필터가 일시 중지 된 상태로 전환 되었음을 나타냅니다.

필터를 중지 하면 해당 필터는 더 이상 전달 된 샘플을 거부 합니다. 원본 필터는 해당 스트리밍 스레드를 종료 하 고, 다른 필터는 사용자가 만든 작업자 스레드를 종료 합니다. 해당 할당자를 커밋을 해제할 때 핀입니다.

상태 전환

필터 Graph 관리자는 렌더러에서 시작 하 여 원본 필터에 대해 뒤로 작업 하 여 업스트림 순서로 모든 상태 전환을 수행 합니다. 이러한 순서는 샘플을 삭제 하지 않고 그래프가 교착 상태를 방지 하기 위해 필요 합니다. 가장 중요 한 상태 전환은 일시 중지 및 중지 됨 사이입니다.

  • 일시 중지 됨: 각 필터가 일시 중지 되 면 다음 필터에서 샘플을 받을 준비가 된 것입니다. 원본 필터는 일시 중지 하기 위한 마지막입니다. 스트리밍 스레드를 만들고 샘플을 전달 하기 시작 합니다. 모든 다운스트림 필터가 일시 중지 되기 때문에 어떠한 필터도 모든 샘플을 거부 합니다. 필터 Graph 관리자는 그래프의 모든 렌더러에서 샘플이 수신 될 때까지 전환을 완료 하지 않습니다 (앞에서 설명한 대로 라이브 원본 제외).
  • 중지 됨으로 일시 중지 됨: 필터가 중지 되 면 포함 된 모든 샘플이 해제 되어 Getbuffer에서 대기 중인 업스트림 필터가 모두 차단 됩니다. 필터가 receive 메서드 내에서 리소스를 대기 하는 경우 대기를 중지 하 고 receive 에서 반환 하 여 호출 하는 필터의 차단을 해제 합니다. 따라서 필터 Graph Manager에서 다음 업스트림 필터를 중지할 때 해당 필터는 getbuffer 또는 Receive 에서 차단 되지 않으며 중지 명령에 응답할 수 있습니다. 업스트림 필터는 중지 명령을 가져오기 전에 몇 가지 추가 샘플을 제공할 수 있지만 다운스트림 필터는 이미 중지 되었기 때문에이를 거부 하기만 합니다.

필터 Graph의 데이터 Flow