プログラマのつれづれなるままにプログラマのつれづれなるままに音宮志久が思ったことなどをネタにします。プログラムネタ・数学ネタがメインです。(3)コメントを残すというわけで、今回から実装に入ります。いっても今回の部分では簡単な部分を見ていきます。これ以降クラスメンバ変数として必要となる変数はすべてm_をつけていきなり出します。本来はクラスメンバとして必要なものなので前回のprivateの宣言部に追加していってください。・・・これまでのDirectShowの説明でも似たような部分はありましたが・・・。hr;}・・・わかっています。変数の初期化の部分を完全になくしていますの必要な変数はすべてちゃんとゼロ初期化(NULL初期化)を行ってください。コンストラクタの動作は内部変数の初期化が主です。Direct3D9との関連性の関係上、IDirect3D9とIDirect3DDevice9をSurfaceAllocator側でも所有状態とします。NULL;}}内部オブジェクトのうち、Direct3Dに関わる要素をアロケータが解放される瞬間に解放して終了します。DirectShowに関わる部分は主にTerminateDeviceなどで解放します。CUnknown::NonDelegatingQueryInterface(refiid,lplpInterface);}見ればわかりますが、IStreamの実装でやった実装と類似すると思います。今回は実装しているインターフェイスがIVMRSurfaceAllocator9とIVMRImagePresenter9の二つになっているのでそのいずれでも自分自身をキャストして返しています。m_lpSurfaceAllocNotify->SetD3DDevice(m_lpDirect3DDevice,hMonitor);}VMR9から渡されるSurfaceAllocatorNotifyと自分自身を関連づける動作で、IVMRSurfaceAllocator9で実装すべき処理です。処理の要点はIVMRSurfaceAllocatorNotify9を自分自身に設定する(参照カウントをあげると自己参照に陥るのであげない方がいい)IVMRSurfaceAllocatorNotify9のSetD3DDeviceを呼び出して、描画に使用するDirect3DDevice(とモニタハンドル)を設定するです。モニタハンドルを取得するときのGetAdapterMonitorですが、Direct3DDeviceをD3DADAPTER_DEFAULTで初期化しているときはそちらを渡してください。ちなみに、この処理があるため、コンストラクタでIDirect3DDevice9を渡して初期化してAdviceNotifyを設定するという順序をとっています。受け取ったIVMRSurfaceAllocatorNotify9は常にVMR9のフィルタ内で有効となるので参照カウントはあげなくてもいいです。いうかあげると、処理の状態によっては自己参照(VMR9(IVMRSurfaceAllocatorNotify9)がCVMRSurfaceAllocatorの参照を持ち、CVMRSurfaceAllocatorがIVMRSurfaceAllocatorNotify9の参照を持つという状態)になるのでそれぞれのオブジェクトが解放できなくなってしまいます。S_OK;}本来ならdwUserID(VMR9内部での識別子)を判別して・・・とかいるんですが、今回オブジェクトは一つだけという保証の中で行いますので無視します。今回の処理ではこの2つの処理で行うことはありません。オブジェクトがちゃんとあるかどうかを確認する程度です。いうわけで簡単なものを実装してみました。これ以降が大変なんです・・・。・・・で、本当は今日この記事書く気がなかったんですが・・・。コメントをキャンセルメールアドレスが公開されることはありません。志久プログラムネタや思いついたり世間で話題になっている数学ネタを解説したりしています。プログラマとしては今年度(つまり2020年3月)までの復帰となるか、完全復帰となるか、別の仕事に戻るかは運と実力次第。ちなみに教育系のプログラムでもOKです。アクセスカウンタアクセス数:スポンサーリンク。