다음을 통해 공유


대체 비디오 렌더러

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

이 항목에서는 DirectShow용 사용자 지정 비디오 렌더러를 작성하는 방법을 설명합니다.

참고

사용자 지정 비디오 렌더러를 작성하는 대신 VMR(Video Mixing Renderer) 또는 EVR( Enhanced Video Renderer )에 대한 플러그 인 할당자-발표자를 작성하는 것이 좋습니다. 이 방법은 DXVA(DirectX Video Acceleration), 하드웨어 디인터레이싱 및 프레임 스테핑 지원을 포함하여 VMR/EVR의 모든 이점을 제공하며 사용자 지정 비디오 렌더러보다 더 강력할 수 있습니다. 자세한 내용은 아래 항목을 참조하세요.

 

대체 렌더러 작성

Microsoft DirectShow는 창 기반 비디오 렌더러를 제공합니다. 또한 런타임 설치에서 전체 화면 렌더러를 제공합니다. DirectShow 기본 클래스를 사용하여 대체 비디오 렌더러를 작성할 수 있습니다. 대체 렌더러가 DirectShow 기반 애플리케이션과 올바르게 상호 작용하려면 렌더러가 이 문서에 설명된 지침을 준수해야 합니다. CBaseRendererCBaseVideoRenderer 클래스를 사용하여 대체 비디오 렌더링을 구현할 때 이러한 지침을 따를 수 있습니다. DirectShow의 지속적인 개발로 인해 정기적으로 구현을 검토하여 렌더러가 최신 버전의 DirectShow와 호환되는지 확인합니다.

이 항목에서는 렌더러가 처리를 담당한다는 많은 알림에 대해 설명합니다. DirectShow 알림을 간략하게 검토하면 스테이지를 설정하는 데 도움이 될 수 있습니다. 기본적으로 DirectShow에는 다음과 같은 세 가지 종류의 알림이 발생합니다.

  • 스트림 알림- 미디어 스트림에서 발생하고 한 필터에서 다음 필터로 전달되는 이벤트입니다. 이러한 알림은 시작 플러시, 끝 플러시 또는 스트림 종료 알림일 수 있으며 다운스트림 필터의 입력 핀(예: IPin::BeginFlush)에서 적절한 메서드를 호출하여 전송됩니다.
  • 필터 그래프 알림- 필터에서 필터 그래프 관리자(예: EC_COMPLETE)로 전송되는 이벤트입니다. 필터 그래프 관리자에서 IMediaEventSink::Notify 메서드를 호출하여 이 작업을 수행합니다.
  • 애플리케이션 알림 - 제어 애플리케이션에 의해 Filter Graph Manager에서 검색됩니다. 애플리케이션은 Filter Graph Manager에서 IMediaEvent::GetEvent 메서드를 호출하여 이러한 이벤트를 검색합니다. 종종 Filter Graph Manager는 수신하는 이벤트를 애플리케이션에 전달합니다.

이 항목에서는 수신하는 스트림 알림을 처리하고 적절한 필터 그래프 알림을 보내는 렌더러 필터의 책임에 대해 설명합니다.

스트림 종료 및 플러시 알림 처리

스트림 종료 알림은 해당 필터가 더 이상 데이터를 보낼 수 없음을 감지하면 업스트림 필터(예: 원본 필터)에서 시작됩니다. 그래프의 모든 필터를 통해 전달되고 결국 렌더러에서 종료되며, 이후에 필터 그래프 관리자에 EC_COMPLETE 알림을 보냅니다. 렌더러에는 이러한 알림 처리와 관련하여 특별한 책임이 있습니다.

렌더러는 입력 핀의 IPin::EndOfStream 메서드가 업스트림 필터에 의해 호출될 때 스트림 종료 알림을 받습니다. 렌더러는 이 알림을 기록하고 이미 받은 데이터를 계속 렌더링해야 합니다. 나머지 데이터가 모두 수신되면 렌더러는 필터 그래프 관리자에 EC_COMPLETE 알림을 보내야 합니다. EC_COMPLETE 알림은 스트림의 끝에 도달할 때마다 렌더러에서 한 번만 보내야 합니다. 또한 필터 그래프가 실행되는 경우를 제외하고 EC_COMPLETE 알림을 전송해서는 안 됩니다. 따라서 원본 필터가 스트림 종료 알림을 보낼 때 필터 그래프가 일시 중지된 경우 필터 그래프가 마지막으로 실행될 때까지 EC_COMPLETE 보내지 않아야 합니다.

스트림 종료 알림이 신호를 받은 후 IMemInputPin::Receive 또는 IMemInputPin::ReceiveMultiple 메서드에 대한 모든 호출은 거부되어야 합니다. E_UNEXPECTED 이 경우에 반환할 가장 적절한 오류 메시지입니다.

필터 그래프가 중지되면 캐시된 스트림 끝 알림을 지워야 하며 다음이 시작될 때 다시 전송되지 않아야 합니다. 필터 그래프 관리자가 실행하기 직전에 항상 모든 필터를 일시 중지하여 적절한 플러시가 발생하기 때문입니다. 예를 들어 필터 그래프가 일시 중지되고 스트림 종료 알림이 수신되고 필터 그래프가 중지된 경우 렌더러는 이후에 실행될 때 EC_COMPLETE 알림을 보내지 않아야 합니다. 검색이 발생하지 않은 경우 소스 필터는 실행 상태 이전의 일시 중지 상태 중에 다른 스트림 종료 알림을 자동으로 보냅니다. 반면 필터 그래프가 중지되는 동안 검색이 발생한 경우 원본 필터에 보낼 데이터가 있을 수 있으므로 스트림 종료 알림을 보내지 않습니다.

비디오 렌더러가 EC_COMPLETE 알림을 보내는 것보다 더 많은 스트림 끝 알림에 의존하는 경우가 많습니다. 예를 들어 스트림 재생이 완료되고(즉, 스트림 종료 알림이 전송됨) 다른 창이 비디오 렌더러 창 위로 끌면 여러 WM_PAINT 창 메시지가 생성됩니다. 비디오 렌더러를 실행하는 일반적인 방법은 WM_PAINT 메시지를 수신할 때 현재 프레임을 다시 그리는 것을 자제하는 것입니다(그릴 다른 프레임이 수신될 것이라는 가정 하에). 그러나 스트림 종료 알림이 전송되면 렌더러는 대기 상태에 있습니다. 여전히 실행 중이지만 추가 데이터를 수신하지 않는다는 것을 알고 있습니다. 이러한 상황에서 렌더러는 관례적으로 재생 영역을 검은색으로 그립니다.

플러시 처리는 렌더러에 추가적인 복잡성입니다. 플러시는 BeginFlushEndFlush라는 IPin 메서드 쌍을 통해 수행됩니다. 플러시 는 기본적으로 렌더러가 처리해야 하는 추가 상태입니다. 원본 필터가 EndFlush를 호출하지 않고 BeginFlush를 호출하는 것은 불법이므로 상태가 짧고 불연속적입니다. 그러나 렌더러는 플러시 전환 중에 수신하는 데이터 또는 알림을 올바르게 처리해야 합니다.

BeginFlush를 호출한 후 받은 모든 데이터는 S_FALSE 반환하여 즉시 거부되어야 합니다. 또한 렌더러가 플러시될 때 캐시된 스트림 종료 알림도 지워야 합니다. 렌더러는 일반적으로 검색에 대한 응답으로 플러시됩니다. 플러시를 통해 새 샘플이 전송되기 전에 필터 그래프에서 이전 데이터가 지워집니다. (일반적으로 스트림의 두 섹션을 하나씩 재생하는 것은 한 섹션이 완료될 때까지 기다린 다음 seek 명령을 실행하는 것보다 지연된 명령을 통해 처리하는 것이 가장 좋습니다.)

상태 변경 처리 및 완료 일시 중지

렌더러 필터는 다음 예외를 제외하고 상태가 변경되면 필터 그래프의 다른 필터와 동일하게 동작합니다. 일시 중지된 후 렌더러는 일부 데이터를 큐에 대기하고 이후에 실행할 때 렌더링할 준비가 됩니다. 비디오 렌더러가 중지되면 대기 중인 이 데이터를 유지합니다. 필터 그래프가 중지되는 동안 필터에서 리소스를 보유하지 않아야 한다는 DirectShow 규칙의 예외입니다.

이 예외의 이유는 리소스를 보유하면 렌더러에 항상 WM_PAINT 메시지를 수신하는 경우 창을 다시 칠할 이미지가 있기 때문입니다. 또한 현재 이미지의 복사본을 요청하는 CBaseControlVideo::GetStaticImage와 같은 메서드를 충족하는 이미지가 있습니다. 리소스를 보유하는 또 다른 효과는 이미지를 유지하면 할당자가 커밋 해제되지 않으므로 이미지 버퍼가 이미 할당되었기 때문에 다음 상태 변경이 훨씬 더 빠르게 발생한다는 것입니다.

비디오 렌더러는 실행하는 동안에만 샘플을 렌더링하고 릴리스해야 합니다. 일시 중지된 상태에서 필터는 렌더링할 수 있지만(예: 창에 정적 포스터 이미지를 그릴 때) 해제해서는 안 됩니다. 오디오 렌더러가 일시 중지된 동안 렌더링을 수행하지 않습니다(예를 들어 웨이브 디바이스 준비와 같은 다른 작업을 수행할 수 있지만). 샘플의 스트림 시간을 IMediaControl::Run 메서드에 매개 변수로 전달된 참조 시간과 결합하여 샘플을 렌더링해야 하는 시간을 가져옵니다. 렌더러가 시작 시간이 종료 시간보다 작거나 같은 샘플을 거부해야 합니다.

애플리케이션이 필터 그래프를 일시 중지하면 필터 그래프는 렌더러에 대기 중인 데이터가 있을 때까지 IMediaControl::P ause 메서드에서 반환되지 않습니다. 이를 위해 렌더러가 일시 중지되면 렌더링 대기 중인 데이터가 없으면 S_FALSE 반환해야 합니다. 큐에 데이터가 있는 경우 S_OK 반환할 수 있습니다.

Filter Graph Manager는 필터 그래프를 일시 중지할 때 모든 반환 값을 검사하여 렌더러에 데이터가 큐에 대기되었는지 확인합니다. 하나 이상의 필터가 준비되지 않은 경우 Filter Graph Manager는 IMediaFilter::GetState를 호출하여 그래프의 필터를 폴링합니다. GetState 메서드는 시간 제한 매개 변수를 사용합니다. 상태 변경을 완료하기 전에 데이터가 도착하기를 기다리는 필터(일반적으로 렌더러)는 GetState 메서드가 만료되면 VFW_S_STATE_INTERMEDIATE 반환합니다. 데이터가 렌더러에 도착하면 getStateS_OK 함께 즉시 반환되어야 합니다.

중간 상태와 완료된 상태 모두에서 보고된 필터 상태가 State_Paused. 반환 값만 필터가 실제로 준비되었는지 여부를 나타냅니다. 렌더러가 데이터가 도착하기를 기다리는 동안 원본 필터가 스트림 종료 알림을 보내는 경우 상태 변경도 완료해야 합니다.

모든 필터에 실제로 렌더링 대기 중인 데이터가 있으면 필터 그래프가 일시 중지 상태 변경을 완료합니다.

종료 처리

비디오 렌더러가 사용자의 종료 이벤트를 올바르게 처리해야 합니다. 이는 창을 올바르게 숨기고 이후에 창을 표시해야 하는 경우 수행할 작업을 알고 있음을 의미합니다. 또한 비디오 렌더러는 창이 제거될 때(또는 필터 그래프에서 렌더러가 제거될 때 더 정확하게) 필터 그래프 관리자에 알려 리소스를 해제해야 합니다.

사용자가 ALT+F4를 눌러 비디오 창을 닫는 경우(instance 경우) 규칙은 창을 즉시 숨기고 필터 그래프 관리자에 EC_USERABORT 알림을 보내는 것입니다. 이 알림은 그래프 재생을 중지하는 애플리케이션으로 전달됩니다. EC_USERABORT 보낸 후 비디오 렌더러는 전송된 추가 샘플을 거부해야 합니다.

그래프 중지 플래그는 이후에 중지될 때까지 렌더러에 의해 유지되어야 하며, 이때 애플리케이션이 사용자 작업을 재정의하고 원하는 경우 그래프를 계속 재생할 수 있도록 다시 설정해야 합니다. 비디오가 실행되는 동안 ALT+F4를 누르면 창이 숨겨지고 전달된 모든 추가 샘플이 거부됩니다. 이후에 창이 표시되는 경우( 아마도 IVideoWindow::p ut_Visible를 통해) EC_REPAINT 알림이 생성되지 않아야 합니다.

또한 비디오 렌더러는 비디오 렌더러가 종료되면 필터 그래프에 EC_WINDOW_DESTROYED 알림을 보내야 합니다. 실제로 실제 비디오 창이 제거될 때까지 기다리지 않고 렌더러의 IBaseFilter::JoinFilterGraph 메서드가 null 매개 변수(렌더러가 필터 그래프에서 제거될 예정임을 나타낸)로 호출될 때 이를 처리하는 것이 가장 좋습니다. 이 알림을 보내면 Filter Graph Manager의 플러그 인 배포자가 창 포커스에 의존하는 리소스를 오디오 디바이스와 같은 다른 필터에 전달할 수 있습니다.

동적 형식 변경 처리

경우에 따라 렌더러의 업스트림 필터가 비디오를 재생하는 동안 비디오 형식을 변경하려고 할 수 있습니다. 동적 형식 변경을 시작하는 것은 대부분 비디오 압축 해제기입니다.

형식을 동적으로 변경하려는 업스트림 필터는 항상 렌더러 입력 핀에서 IPin::QueryAccept 메서드를 호출해야 합니다. 비디오 렌더러는 지원해야 하는 동적 형식 변경의 종류에 대해 약간의 여유를 가지고 있습니다. 최소한 업스트림 필터가 팔레트를 변경할 수 있도록 허용해야 합니다. 업스트림 필터가 미디어 형식을 변경하면 미디어 형식을 새 형식으로 전달된 첫 번째 샘플에 연결합니다. 렌더러가 렌더링을 위해 큐에 샘플을 보관하는 경우 형식이 변경된 샘플을 렌더링할 때까지 형식을 변경하지 않아야 합니다.

비디오 렌더러는 디코더에서 형식 변경을 요청할 수도 있습니다. 예를 들어 디코더에 음의 biHeight를 사용하여 DirectDraw 호환 형식을 제공하도록 요청할 수 있습니다. 렌더러가 일시 중지되면 업스트림 핀에서 QueryAccept를 호출하여 디코더가 제공할 수 있는 형식을 확인해야 합니다. 그러나 디코더는 허용할 수 있는 모든 형식을 열거하지 않을 수 있으므로 렌더러는 디코더가 이를 보급하지 않더라도 일부 형식을 제공해야 합니다.

디코더가 요청된 형식으로 전환할 수 있으면 QueryAccept에서 S_OK 반환합니다. 그런 다음 렌더러는 새 미디어 형식을 업스트림 할당자의 다음 미디어 샘플에 연결합니다. 이렇게 하려면 렌더러는 미디어 형식을 다음 샘플에 연결하기 위한 프라이빗 메서드를 구현하는 사용자 지정 할당자를 제공해야 합니다. (이 프라이빗 메서드 내에서 IMediaSample::SetMediaType 을 호출하여 형식을 설정합니다.)

렌더러의 입력 핀은 IMemInputPin::GetAllocator 메서드에서 렌더러의 사용자 지정 할당자를 반환해야 합니다. 업스트림 필터가 렌더러의 할당자를 사용하지 않는 경우 실패하도록 IMemInputPin::NotifyAllocator를 재정의합니다.

일부 디코더에서 biHeight 를 YUV 형식의 양수로 설정하면 디코더가 이미지를 거꾸로 그립니다. (이는 올바르지 않으며 디코더에서 버그로 간주되어야 합니다.)

비디오 렌더러에서 형식 변경이 감지될 때마다 EC_DISPLAY_CHANGED 알림을 보내야 합니다. 대부분의 비디오 렌더러에서는 GDI를 통해 형식을 효율적으로 그릴 수 있도록 연결 중에 형식을 선택합니다. 사용자가 컴퓨터를 다시 시작하지 않고 현재 디스플레이 모드를 변경하는 경우 렌더러가 잘못된 이미지 형식 연결로 자신을 발견할 수 있으며 이 알림을 보내야 합니다. 첫 번째 매개 변수는 다시 연결해야 하는 핀이어야 합니다. 필터 그래프 관리자는 필터 그래프를 중지하고 핀을 다시 연결하도록 정렬합니다. 후속 다시 연결하는 동안 렌더러는 보다 적절한 형식을 허용할 수 있습니다.

비디오 렌더러가 스트림에서 색상표 변경을 감지할 때마다 필터 그래프 관리자에 EC_PALETTE_CHANGED 알림을 보내야 합니다. DirectShow 비디오 렌더러에서는 색상표가 실제로 동적 형식으로 변경되었는지 여부를 감지합니다. 비디오 렌더러에서는 전송된 EC_PALETTE_CHANGED 알림 수를 필터링할 뿐만 아니라 필요한 팔레트 만들기, 설치 및 삭제의 양을 줄이기 위해 이 작업을 수행합니다.

마지막으로 비디오 렌더러는 비디오 크기가 변경되었음을 감지할 수도 있습니다. 이 경우 EC_VIDEO_SIZE_CHANGED 알림을 보내야 합니다. 애플리케이션은 이 알림을 사용하여 복합 문서의 공간을 협상할 수 있습니다. 실제 비디오 차원은 IBasicVideo 컨트롤 인터페이스를 통해 사용할 수 있습니다. DirectShow 렌더러에서는 이러한 이벤트를 보내기 전에 비디오가 실제로 크기가 변경되었는지 여부를 감지합니다.

영구 속성 처리

IBasicVideoIVideoWindow 인터페이스를 통해 설정된 모든 속성은 연결 간에 영구적이어야 합니다. 따라서 렌더러의 연결을 끊고 다시 연결하면 창 크기, 위치 또는 스타일에 영향을 주지 않습니다. 그러나 연결 간에 비디오 크기가 변경되면 렌더러는 원본 및 대상 사각형을 기본값으로 다시 설정해야 합니다. 원본 및 대상 위치는 IBasicVideo 인터페이스를 통해 설정됩니다.

IBasicVideoIVideoWindow는 모두 애플리케이션이 인터페이스의 모든 데이터를 영구 형식으로 저장하고 복원할 수 있도록 속성에 대한 충분한 액세스를 제공합니다. 이는 편집 세션 중에 필터 그래프의 정확한 구성과 속성을 저장하고 나중에 복원해야 하는 애플리케이션에 유용합니다.

EC_REPAINT 알림 처리

EC_REPAINT 알림은 렌더러가 일시 중지되거나 중지된 경우에만 전송됩니다. 이 알림은 필터 그래프 관리자에게 렌더러에 데이터가 필요하다는 신호를 보냅니다. 이러한 알림 중 하나를 수신할 때 필터 그래프가 중지되면 필터 그래프를 일시 중지하고 모든 필터가 데이터를 받을 때까지 기다린 다음( GetState를 호출하여) 다시 중지합니다. 중지되면 후속 WM_PAINT 메시지를 처리할 수 있도록 비디오 렌더러가 이미지를 유지해야 합니다.

따라서 비디오 렌더러가 중지되거나 일시 중지될 때 WM_PAINT 메시지를 수신하고 창을 그릴 아무 것도 없는 경우 필터 그래프 관리자에 EC_REPAINT 보내야 합니다. 일시 중지하는 동안 EC_REPAINT 알림이 수신되면 Filter Graph Manager는 현재 위치(즉, 현재 위치를 찾음)를 사용하여 IMediaPosition::p ut_CurrentPosition 을 호출합니다. 이렇게 하면 원본 필터가 필터 그래프를 플러시하고 필터 그래프를 통해 새 데이터가 전송됩니다.

렌더러는 한 번에 이러한 알림 중 하나만 보내야 합니다. 따라서 렌더러가 알림을 보내면 일부 샘플이 배달될 때까지 더 이상 전송되지 않도록 해야 합니다. 이 작업을 수행하는 기존의 방법은 EC_REPAINT 알림이 전송된 후 해제된 다시 그리기를 보낼 수 있음을 나타내는 플래그를 갖는 것입니다. 데이터가 전달되거나 입력 핀이 플러시되면 이 플래그를 다시 설정해야 하지만 입력 핀에 스트림 끝 신호가 전송되는 경우에는 다시 설정되지 않습니다.

렌더러가 EC_REPAINT 알림을 모니터링하지 않으면 필터 그래프 관리자에 EC_REPAINT 요청(처리 비용이 상대적으로 비싸다)으로 넘쳐나게 됩니다. 예를 들어 렌더러에 그릴 이미지가 없고 다른 창이 전체 끌기 작업에서 렌더러의 창을 가로질러 끌면 렌더러는 여러 WM_PAINT 메시지를 받습니다. 이 중 첫 번째 항목만 렌더러에서 필터 그래프 관리자로 EC_REPAINT 이벤트 알림을 생성해야 합니다.

렌더러는 입력 핀을 EC_REPAINT 알림에 첫 번째 매개 변수로 보내야 합니다. 이렇게 하면 연결된 출력 핀이 IMediaEventSink에 대해 쿼리되고 지원되는 경우 EC_REPAINT 알림이 먼저 전송됩니다. 이렇게 하면 필터 그래프를 터치하기 전에 출력 핀이 다시 칠을 처리할 수 있습니다. 커밋되지 않은 렌더러 할당자에서 버퍼를 사용할 수 없으므로 필터 그래프가 중지된 경우에는 이 작업이 수행되지 않습니다.

출력 핀이 요청을 처리할 수 없고 필터 그래프가 실행 중인 경우 EC_REPAINT 알림이 무시됩니다. 출력 핀은 IMediaEventSink::Notify에서 S_OK 반환하여 다시 그리기 요청을 성공적으로 처리했음을 알려야 합니다. 출력 핀은 Filter Graph Manager 작업자 스레드에서 호출되므로 렌더러가 출력 핀을 직접 호출하지 않도록 하여 교착 상태 문제를 피합니다. 필터 그래프가 중지되거나 일시 중지되고 출력이 요청을 처리하지 않으면 기본 처리가 수행됩니다.

Full-Screen 모드에서 알림 처리

필터 그래프의 IVideoWindow PID(플러그 인 배포자)는 전체 화면 재생을 관리합니다. 전문 전체 화면 렌더러를 위해 비디오 렌더러를 교체하거나, 렌더러 창을 전체 화면으로 늘이거나, 렌더러가 전체 화면 재생을 직접 구현하도록 합니다. 전체 화면 프로토콜에서 상호 작용하려면 비디오 렌더러는 창이 활성화되거나 비활성화될 때마다 EC_ACTIVATE 알림을 보내야 합니다. 즉, 렌더러가 수신하는 각 WM_ACTIVATEAPP 메시지에 대해 EC_ACTIVATE 알림을 보내야 합니다.

렌더러가 전체 화면 모드에서 사용되는 경우 이러한 알림은 해당 전체 화면 모드로 전환 및 해제를 관리합니다. 창 비활성화는 일반적으로 사용자가 ALT+TAB을 눌러 다른 창으로 전환할 때 발생하며, DirectShow 전체 화면 렌더러는 일반적인 렌더링 모드로 돌아가기 위해 큐로 사용합니다.

전체 화면 모드에서 전환할 때 EC_ACTIVATE 알림이 Filter Graph Manager로 전송되면 Filter Graph Manager는 제어 애플리케이션에 EC_FULLSCREEN_LOST 알림을 보냅니다. 예를 들어 애플리케이션은 이 알림을 사용하여 전체 화면 단추의 상태를 복원할 수 있습니다. EC_ACTIVATE 알림은 DirectShow에서 내부적으로 비디오 렌더러의 신호에 대한 전체 화면 전환을 관리하는 데 사용됩니다.

알림 요약

이 섹션에서는 렌더러가 보낼 수 있는 필터 그래프 알림을 나열합니다.

이벤트 알림 Description
EC_ACTIVATE 수신된 각 WM_ACTIVATEAPP 메시지에 대해 전체 화면 렌더링 모드로 비디오 렌더러가 보냅니다.
EC_COMPLETE 모든 데이터가 렌더링된 후 렌더러에서 전송됩니다.
EC_DISPLAY_CHANGED 표시 형식이 변경되면 비디오 렌더러에서 전송됩니다.
EC_PALETTE_CHANGED 비디오 렌더러가 스트림에서 색상표 변경을 감지할 때마다 전송됩니다.
EC_REPAINT WM_PAINT 메시지가 수신되고 표시할 데이터가 없을 때 중지되거나 일시 중지된 비디오 렌더러에서 전송됩니다. 이로 인해 필터 그래프 관리자가 디스플레이에 그릴 프레임을 생성합니다.
EC_USERABORT 비디오 렌더러가 사용자가 요청한 닫기를 신호로 보냅니다(예: 비디오 창을 닫는 사용자).
EC_VIDEO_SIZE_CHANGED 네이티브 비디오 크기 변경이 감지될 때마다 비디오 렌더러에서 전송됩니다.
EC_WINDOW_DESTROYED 창 포커스에 의존하는 리소스를 다른 필터에 전달할 수 있도록 필터가 제거되거나 제거될 때 비디오 렌더러에서 전송됩니다.

 

비디오 렌더러 작성