플러싱
[DirectShow 이 페이지와 연결된 기능은 레거시 기능입니다. 이것은 MediaPlayer, IMFMediaEngine, Media Foundation의 오디오/비디오 캡처 으로 대체되었습니다. 이러한 기능은 Windows 10 및 Windows 11에 최적화되었습니다. Microsoft는 가능하면 새로운 코드에서 MediaPlayer, IMFMediaEngine 및 Audio/Video Capture를 DirectShow대신 Media Foundation 사용하는 것이 좋습니다. 가능한 경우 레거시 API를 사용하는 기존 코드를 다시 작성하여 새 API를 사용하도록 제안합니다.]
필터 그래프가 실행되는 동안 임의의 양의 데이터가 그래프를 통해 이동할 수 있습니다. 그 중 일부는 배달되기를 기다리는 큐에 있을 수 있습니다. 필터 그래프에서 보류 중인 데이터를 가능한 한 빨리 제거하고 새 데이터로 바꿔야 하는 경우가 있습니다. 예를 들어 seek 명령 후에 원본 필터는 원본의 새 위치에서 샘플을 생성합니다. 대기 시간을 최소화하기 위해 다운스트림 필터는 seek 명령 전에 생성된 샘플을 모두 삭제해야 합니다. 샘플을 폐기하는 프로세스를 플러시 라고 합니다. 이를 통해 이벤트가 일반 데이터 흐름을 변경할 때 그래프의 응답성이 높아질 수 있습니다.
플러싱은 밀어넣기 모델과 끌어오기 모델에 의해 약간 다르게 처리됩니다. 이 문서는 푸시 모델을 설명하는 것으로 시작합니다. 그런 다음 끌어오기 모델의 차이점을 설명합니다.
플러시 작업은 두 단계로 이루어집니다.
- 먼저 소스 필터는 다운스트림 필터의 입력 핀에서 IPin::BeginFlush호출합니다. 다운스트림 필터는 업스트림에서 샘플을 거부하기 시작합니다. 또한 보유하고 있는 샘플을 모두 삭제하고 BeginFlush 호출 다운스트림을 다음 필터로 보냅니다.
- 원본 필터가 새 데이터를 보낼 준비가 되면 입력 핀에서 IPin::EndFlush 호출합니다. 그러면 다운스트림 필터가 새 샘플을 받을 수 있음을 알 수 있습니다. 다운스트림 필터는 EndFlush 호출을 다음 필터로 보냅니다.
BeginFlush 메서드에서 입력 핀은 다음을 수행합니다.
- 다운스트림 입력 핀에서 beginFlush 호출합니다.
- 수신 및 EndOfStream포함하여 데이터를 스트리밍하는 추가 호출을 거부합니다.
- 필터 할당자에서 샘플을 기다리는 동안 차단된 업스트림 필터의 차단을 해제합니다. 일부 필터는 이 목적을 위해 할당자를 커밋 해제합니다.
- 스트리밍을 방해하는 모든 대기로부터 벗어납니다. 예를 들어, 렌더러 필터는 일시 중지될 때 차단됩니다. 또한 올바른 스트림 시간에 샘플을 렌더링하기 위해 대기하는 경우에도 차단됩니다. 대기 중인 업스트림 샘플을 배달하고 거부할 수 있도록 필터의 차단을 해제해야 합니다. 이 단계에서는 모든 업스트림 필터가 결국 차단을 해제하도록 합니다.
EndFlush 메서드에서 입력 핀은 다음을 수행합니다.
- 큐에 대기된 모든 샘플이 삭제될 때까지 기다립니다.
- 버퍼링된 데이터를 해제합니다. 이 단계는 때때로 BeginFlush 메서드에서 수행할 수 있습니다. 그러나 BeginFlush 스트리밍 스레드와 동기화되지 않습니다. 필터는 BeginFlush 호출과 EndFlush호출 간에 더 이상 데이터를 처리하거나 버퍼링해서는 안 됩니다.
- 보류 중인 EC_COMPLETE 알림을 지웁니다.
- EndFlush 다운스트림에 호출합니다.
이 시점에서 필터는 샘플을 다시 수락할 수 있습니다. 모든 샘플은 플러시보다 최신으로 보장됩니다.
끌어오기 모델에서 파서 필터는 원본 필터가 아닌 플러시를 시작합니다. 다운스트림 필터에서 IPin::BeginFlush 및 IPin::EndFlush 호출할 뿐만 아니라 원본 필터의 출력 핀에서 IAsyncReader::BeginFlush 및 IAsyncReader::EndFlush 호출합니다. 원본 필터에 보류 중인 읽기 요청이 있으면 삭제됩니다.
관련 항목