플러싱

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

필터 그래프가 실행되는 동안 임의의 양의 데이터가 그래프를 통해 이동할 수 있습니다. 그 중 일부는 배달되기를 기다리는 큐에 있을 수 있습니다. 필터 그래프가 보류 중인 이 데이터를 가능한 한 빨리 제거하고 새 데이터로 바꿔야 하는 경우가 있습니다. 예를 들어 seek 명령 후에 원본 필터는 원본의 새 위치에서 샘플을 생성합니다. 대기 시간을 최소화하기 위해 다운스트림 필터는 seek 명령 전에 생성된 샘플을 모두 삭제해야 합니다. 샘플을 삭제하는 프로세스를 플러시라고 합니다. 이를 통해 이벤트가 일반 데이터 흐름을 변경할 때 그래프의 응답성이 높아질 수 있습니다.

플러싱은 푸시 모델과 끌어오기 모델에 의해 약간 다르게 처리됩니다. 이 문서는 푸시 모델을 설명하는 것으로 시작합니다. 끌어오기 모델의 차이점을 설명합니다.

플러시 작업은 두 단계로 이루어집니다.

  • 먼저 원본 필터는 다운스트림 필터의 입력 핀에서 IPin::BeginFlush 를 호출합니다. 다운스트림 필터는 업스트림 샘플을 거부하기 시작합니다. 또한 보유하고 있는 샘플을 모두 삭제하고 BeginFlush 호출 다운스트림을 다음 필터로 보냅니다.
  • 원본 필터가 새 데이터를 보낼 준비가 되면 입력 핀에서 IPin::EndFlush 를 호출합니다. 그러면 다운스트림 필터가 새 샘플을 받을 수 있다는 신호를 보냅니다. 다운스트림 필터는 EndFlush 호출을 다음 필터로 보냅니다.

BeginFlush 메서드에서 입력 핀은 다음을 수행합니다.

  1. 다운스트림 입력 핀에서 BeginFlush 를 호출합니다.
  2. ReceiveEndOfStream을 포함하여 데이터를 스트리밍하는 추가 호출을 거부합니다.
  3. 필터 할당자에서 샘플을 기다리는 동안 차단된 업스트림 필터의 차단을 해제합니다. 일부 필터는 이 목적을 위해 할당자를 커밋 해제합니다.
  4. 스트리밍을 차단하는 모든 대기에서 종료됩니다. 예를 들어 렌더러 필터는 일시 중지 시 차단됩니다. 또한 올바른 스트림 시간에 샘플을 렌더링하기 위해 대기하는 경우에도 차단됩니다. 큐에 대기 중인 업스트림 샘플을 배달하고 거부할 수 있도록 필터 차단을 해제해야 합니다. 이 단계에서는 모든 업스트림 필터가 결국 차단을 해제하도록 합니다.

EndFlush 메서드에서 입력 핀은 다음을 수행합니다.

  1. 큐에 대기된 모든 샘플이 삭제될 때까지 기다립니다.
  2. 버퍼링된 데이터를 해제합니다. 이 단계는 때때로 BeginFlush 메서드에서 수행할 수 있습니다. 그러나 BeginFlush 는 스트리밍 스레드와 동기화되지 않습니다. 필터는 BeginFlush 호출과 EndFlush 호출 간에 더 이상 데이터를 처리하거나 버퍼링해서는 안 됩니다.
  3. 보류 중인 EC_COMPLETE 알림을 지웁니다.
  4. EndFlush 다운스트림을 호출합니다.

이 시점에서 필터는 샘플을 다시 수락할 수 있습니다. 모든 샘플은 플러시보다 최신 상태여야 합니다.

끌어오기 모델에서 파서 필터는 원본 필터가 아닌 플러시를 시작합니다. 다운스트림 필터에서 IPin::BeginFlushIPin::EndFlush를 호출할 뿐만 아니라 원본 필터의 출력 핀에서 IAsyncReader::BeginFlushIAsyncReader::EndFlush를 호출합니다. 원본 필터에 보류 중인 읽기 요청이 있는 경우 삭제됩니다.

데이터 플러시