はじめに
Windows XP以前ではDirectShowにおける静止画や動画の表示に使われるレンダラーとして、Video Renderer、Overlay Mixer、Video Mixing Renderer(以下、VMR)、VMR9が使われてきました。Windows Vistaでは、これらは引き続き使用可能ではありますが、新たにEnhanced Video Renderer(以下、EVR)と呼ばれるコンポーネントがインストールされています。
本稿では、EVRの概要を説明します。それから、実際にEVRを使って動画をウォーターマークと共に再生する方法を説明します。
対象読者
- C++言語、ATLが分かる方
- DirectShowを使ったアプリケーションを作成したことのある方
本稿のサンプルコードはATLを使っていますが、EVRを使うための必須条件ではありません。
必要な環境
- Windows Vista
- Visual Studio 2008
- Windows SDK for Windows Server 2008 and .NET Framework 3.5
EVRとは?
EVRは、入力したフレームを画面に表示するビデオレンダラーコンポーネントです。
EVRは、従来のレンダラーのようにDirectShowフィルタとして機能するだけでなく、新たな映像・音声プラットフォームであるMedia Foundationのメディアシンクとしても機能します。これはEVRというコンポーネントがDirectShowとMedia Foundationの両方のインターフェイスを持っているからです。
EVRを構成しているコンポーネント
EVRは「ミキサー」と「プレゼンタ」と呼ばれる2つのコンポーネントで構成されています。ミキサーは入力したフレームを合成し、プレゼンタはミキサーから合成したフレームを受け取り、レンダリングします(図1)。
これら2つのコンポーネントは独自のものに置き換えることができます。例えば、EVRに既定で割り当てられている標準プレゼンタは指定したウィンドウにフレームを表示するだけですが、独自のプレゼンタをEVRに割り当てることにより、自前で用意したDirect3Dサーフェイスなどへレンダリングすることもできます。
EVRにおける操作モード
EVRにはVMRにおける「操作モード」がないという大きな違いがあります。
VMRには、3つの表示モード「ウィンドウモード」「ウィンドウレスモード」「レンダリングレス再生モード」と、複数の入力ストリームの合成を行う「ミキシングモード」という、「操作モード」と呼ばれる仕組みがありました。アプリケーションは、必要に応じて、これらのモードを選択していました。
EVRには、このような区別がありません。あえて言うと、常にミキシングモードが有効であり、レンダリングレス再生モードです。
EVRではミキサーが常にロードされた状態となっています。VMRでは入力ストリームの数が1であった場合、ミキサーはロードされませんでしたが、EVRでは常にロードされます。
また、レンダリングレス再生モードなので、何らかのプレゼンタが常に使われます。EVRでは標準プレゼンタが用意されていて、既定ではこれがロードされています。これはウィンドウレスモードのように動作をします。つまり、プレゼンタ自身がウィンドウを作成しないので、アプリケーション側で表示先となるウィンドウを用意し、それを指定します。
EVRの準備とインスタンスの作成
では実装に入っていきましょう。DirectShowとEVRを使うには、次のファイルをインクルードし、ライブラリをリンクします。
- dshow.h
- strmiids.lib
- evr.h
ウォーターマークを表示するために必要なIMFVideoMixerBitmap
インターフェイスを使うために、次のファイルを追加でインクルードします。
- evr9.h
- d3d9.h
EVRのインスタンスを作成します。CLSIDとしてCLSID_EnhancedVideoRenderer
を指定します。DirectShowで使うために、インターフェイスはIBaseFilter
とします。
CComPtr<IBaseFilter> m_Evr; hr=m_Evr.CoCreateInstance(CLSID_EnhancedVideoRenderer);