다음을 통해 공유


플러싱

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

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

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

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

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

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

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

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

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

이 시점에서 필터는 샘플을 다시 수락할 수 있습니다. 모든 샘플은 플러시보다 최신으로 보장됩니다.

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

플러시 데이터