기본 품질 제어

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

DirectShow 기본 클래스는 비디오 품질 제어를 위한 몇 가지 기본 동작을 구현합니다.

품질 메시지는 렌더러에서 시작합니다. 비디오 렌더러의 기본 클래스는 다음과 같은 동작이 있는 CBaseVideoRenderer입니다.

  1. 비디오 렌더러가 샘플을 받으면 샘플의 타임스탬프를 현재 참조 시간과 비교합니다.
  2. 비디오 렌더러는 품질 메시지를 생성합니다. 기본 클래스에서 품질 메시지의 Proportion 멤버는 500(50%)에서 2000(200%) 범위로 제한됩니다. 이 범위를 벗어난 값으로 인해 품질이 갑자기 변경됩니다.
  3. 기본적으로 비디오 렌더러는 업스트림 출력 핀(입력 핀에 연결된 핀)에 품질 메시지를 보냅니다. 애플리케이션은 SetSink 메서드를 호출하여 이 동작을 재정의할 수 있습니다.

다음에 발생하는 작업은 업스트림 필터에 따라 달라집니다. 일반적으로 변환 필터입니다. 변환 필터의 기본 클래스는 CTransformFilter이며 CTransformInputPinCTransformOutputPin 클래스를 사용하여 입력 및 출력 핀을 구현합니다. 이러한 클래스에는 다음과 같은 동작이 있습니다.

  1. CTransformOutputPin::Notify 메서드는 필터 기본 클래스의 프라이빗 메서드인 CTransformFilter::AlterQuality를 호출합니다.
  2. 파생 필터는 AlterQuality 를 재정의하여 품질 메시지를 처리할 수 있습니다. 기본적으로 AlterQuality 는 품질 메시지를 무시합니다.
  3. AlterQuality가 품질 메시지를 처리하지 않으면 출력 핀은 필터의 입력 핀에서 프라이빗 메서드인 CBaseInputPin::P assNotify를 호출합니다.
  4. PassNotify는 다음 업스트림 출력 핀 또는 사용자 지정 품질 관리자와 같은 적절한 위치에 품질 메시지를 전달합니다.

변환 필터가 품질 메시지를 처리하지 않는다고 가정하면 메시지는 결국 원본 필터의 출력 핀에 도달합니다. 기본 클래스에서 CBasePin::Notify 는 E_NOTIMPL 반환합니다. 특정 소스 필터가 품질 메시지를 처리하는 방법은 원본의 특성에 따라 달라집니다. 라이브 비디오 캡처와 같은 일부 원본은 의미 있는 품질 관리를 수행할 수 없습니다. 다른 소스는 샘플을 제공하는 속도를 조정할 수 있습니다.

다음 다이어그램에서는 기본 동작을 보여 줍니다.

기본 클래스의 품질 제어

기본 비디오 렌더러는 IQualityControl::Notify를 구현합니다. 즉, 렌더러 자체에 품질 메시지를 전달할 수 있습니다. Proportion 멤버를 1000보다 작은 값으로 설정하면 비디오 렌더러는 렌더링되는 각 프레임 사이에 대기 기간을 삽입하여 렌더러의 속도를 늦출 수 있습니다. (예를 들어 시스템 사용량을 줄이기 위해 이 작업을 수행할 수 있습니다.) 자세한 내용은 CBaseVideoRenderer::ThrottleWait을 참조하세요. Proportion 멤버를 1000보다 큰 값으로 설정해도 아무런 효과가 없습니다.

품질 제어 관리