Date

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を呼び出すように直す。

```c++ 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 でも発生する。


Comments

comments powered by Disqus