Post date: Nov 30, 2016 3:50:32 AM
VMR 윈도우레스모드
애플리케이션이 애플리케이션 윈도우내에서 비디오를 렌더링 하는 방법으로서는, 윈도우레스모드의 사용을 추천 한다. 윈도우레스모드로, Video Mixing Renderer 는 윈도우 매니저 구성 요소를 로드하지 않기 때문에,IBasicVideo 인터페이스 또는 IVideoWindow 인터페이스는 지원 하지 않는다. 대신에, 애플리케이션은 재생 윈도우를 제공해, VMR 가 비디오를 드로잉(Drawing) 하는 목적지 직사각형을 클라이언트 영역으로 설정한다. VMR 는 DirectDraw 의 클립퍼 개체를 사용해, 비디오가 애플리케이션의 윈도우에 맞추어 클립 되어 다른 윈도우상에 표시되지 않게 한다. VMR 는 애플리케이션의 윈도우를 서브 클래스화하지 않고, 시스템/프로세스 훅은 인스톨 하지 않는다.
윈도우레스모드로, 접속과 실행 상태에의 처리은, 다음과 같이 행해진다.
업 스트림 필터는 미디어 타입을 제시한다. VMR 는 그 타입을 받아들이는지 거부한다.
미디어 타입을 받아들였을 경우, VMR 는 DirectDraw 표면을 얻어온다 모아 두어 얼로케이터 프리젠터를 호출한다. 표면이 올바르고 생성 되면 핀을 접속해, VMR 는 실행 상태로 처리할 준비가 완료한다.
필터 그래프가 실행되면 디코더는 GetBuffer 를 호출해, 할당자로부터 미디어 샘플을 얻어온다. VMR 는 얼로케이터 프리젠터에 문의해 DirectDraw 표면의 픽셀 깊이, 직사각형 사이즈등의 파라미터가 수신 비디오와 호환성이 있을지 어떨지를 확인한다. 호환성이 있는 경우, VMR 는 DirectDraw 표면을 디코더에 돌려준다. 디코더가 표면에 디코드한 후, VMR 의 코어 동기 유니트는 타임 스탬프를 확인한다. 이 유니트는, 프레젠테이션 타임이 될 때까지 Receive 호출을 정지시킨다. 프레젠테이션 타임이 되면 VMR 는 얼로케이터 프리젠터의 PresentImage 를 호출해, 그래픽 카드로 표면의 표시를 실시한다.
다음 그림은 윈도우레스모드로 복수의 입력 스트림을 가지는 VMR 를 나타내고 있다.
윈도우레스모드용의 VMR-7 의 설정
윈도우레스모드용으로 VMR-7 를 설정하려면 , VMR 의 입력 핀을 접속하기 전에, 다음의 순서를 모두 실행하는 것.
필터를 생성 해, 그래프에 추가한다.
VMRMode_Windowless 플래그를 사용해 IVMRFilterConfig::SetRenderingMode 메서드를 호출한다.
옵션으로서 복수의 입력 스트림에 대해서 VMR 를 설정하려면 ,IVMRFilterConfig::SetNumberOfStreams 를 호출한다. VMR 는 스트림 마다 1 개의 입력 핀을 생성 한다. IVMRMixerControl 인터페이스를 사용해, 스트림의 Z 순서 및 그 외의 파라미터를 설정한다. 더 자세한 정보는, 「복수의 스트림을 가지는 VMR (믹싱 모드)」를 참조할것.
SetNumberOfStreams 를 호출하지 않는 경우, VMR-7 는 디폴트로 1 개의 입력 핀을 사용한다. 입력 핀을 접속한 후, 핀의 수는 변경할 수 없다.
IVMRWindowlessControl::SetVideoClippingWindow 를 호출해, 렌더링 된 비디오를 표시하는 윈도우를 지정한다.
이상의 순서가 완료하면 VMR 필터의 입력 핀을 접속할 수 있다. 핀의 직접 접속,IGraphBuilder::RenderFile 등의 인텔리전트 접속의 사용, 캡춰 그래프 빌더의 ICaptureGraphBuilder2::RenderStream 메서드의 사용 등, 그래프의 생성에는 다양한 방법이 있다. 더 자세한 정보는, 「그래프 생성의 일반적 기법」을 참조할것.
애플리케이션 윈도우내에서 비디오의 위치를 설정하려면 ,IVMRWindowlessControl::SetVideoPosition 메서드를 호출한다. IVMRWindowlessControl::GetNativeVideoSize 메서드는 네이티브 비디오 사이즈를 돌려준다. 재생중, 애플리케이션은 VMR 에 다음의 Windows 메시지를 통지할 필요가 있다.
WM_PAINT: IVMRWindowlessControl::RepaintVideo 를 호출해, 이미지를 재드로잉(Drawing) 한다.
WM_DISPLAYCHANGE: IVMRWindowlessControl::DisplayModeChanged 를 호출한다. VMR 는 새로운 해상도나 색깊이로 비디오를 표시하는데 필요한 처리를 실시한다.
WM_SIZE: 비디오의 위치를 재계산해, 필요에 따라서 한번 더 SetVideoPosition 를 호출한다.
주 : MFC 애플리케이션은 하늘의 WM_ERASEBKGND 메시지 핸들러를 정의할 필요가 있다. 그렇지 않으면, 비디오 표시 영역은 올바르고 재드로잉(Drawing) 되지 않는다.
윈도우레스모드용의 VMR-9 의 설정
윈도우레스모드용으로 VMR-9 를 설정하려면 , 윈도우레스모드의 VMR-7 에 대해 설명한 순서를 사용하지만,IVMRFilterConfig9 인터페이스와 IVMRWindowlessControl9 인터페이스를 사용하는 것. 유일한 큰 차이는, VMR-9 에서는 디폴트로 1 개의 입력 핀은 아니고 4 개의 입력 핀을 생성 하는 것이다. 따라서, 5 개 이상의 비디오 스트림을 믹싱 하는 경우에만,SetNumberOfStreams 를 호출할 필요가 있다.
샘플 코드
다음 코드는, VMR-7 필터를 생성 해, DirectShow 필터 그래프에 추가해, VMR 를 윈도우레스모드로 하는 방법을 나타내고 있다. VMR-9 의 경우는,CoCreateInstance 로 CLSID_VideoMixingRenderer9 를 사용해, 대응하는 VMR-9 의 인터페이스를 사용한다.