2010年7月26日月曜日

EVRPresenterサンプルを動かすと例外が発生する

Windows SDK には、EVR Custom Presenter の実装サンプルである EVRPresenter がある。Standard EVR Presenter のように Direct3D9 を初期化し、サーフェイスにデコード済フレームをレンダリングし、画面に表示する。

しかし、そのままのコードでは正常に動作しない。メディアタイプのネゴシエーションを行っている途中で、MediaType::CopyFromで例外が発生してしまう。

例外メッセージ

MFPlayer.exe の 0x5956bdc2 (mfplat.dll) でハンドルされていない例外が発生しました: 0xC0000005: 場所 0x00000000 を読み込み中にアクセス違反が発生しました。

スタックトレース

>EVRPresenter.dll!MediaFoundationSamples::MediaType::CopyFrom(IMFMediaType * pType)  行 182 + 0x1a バイト
EVRPresenter.dll!EVRCustomPresenter::CreateOptimalVideoType(IMFMediaType * pProposedType, IMFMediaType * * ppOptimalType)  行 1414 + 0xc バイト
EVRPresenter.dll!EVRCustomPresenter::RenegotiateMediaType()  行 1071 + 0x10 バイト
EVRPresenter.dll!EVRCustomPresenter::ProcessMessage(MFVP_MESSAGE_TYPE eMessage, unsigned long ulParam)  行 334 + 0xb バイト

正しく動作させるには、以下のようにCreateEmptyTypeを呼び出すように直す。

Presenter.cpp 1400行目付近
HRESULT EVRCustomPresenter::CreateOptimalVideoType(IMFMediaType* pProposedType, IMFMediaType **ppOptimalType)
{
 HRESULT hr = S_OK;

 RECT rcOutput;
 ZeroMemory(&rcOutput, sizeof(rcOutput));

 MFVideoArea displayArea;
 ZeroMemory(&displayArea, sizeof(displayArea));

 // Helper object to manipulate the optimal type.
 VideoType mtOptimal;
 mtOptimal.CreateEmptyType(); // ★追加★ 内部で MFCreateMediaType を呼び出す.
 // Clone the proposed type.
 CHECK_HR(hr = mtOptimal.CopyFrom(pProposedType));
(以下略)

これは Windows SDK v7.1 でも発生する。

0 コメント:

コメントを投稿