2017-03-28 13 views
1

CaptureGraphBuilderを使用してレンダリングされる独自のソースフィルタで構成されるDirectShowグラフがあります。プレビューモードでは、[Source] - > [SmartTee] - (PreviewPin) - > [Decoder] - > [Renderer]のグラフになります。独自のフィルタにはカスタムアロケータがあり、それについてSmartTeeに通知します。今すぐ終了すると、すべてのオブジェクトが解放されます。カスタムソースとSmartTeeリークの間にフィルタを挿入するCOMオブジェクト

これで、独自のソースフィルタとSmartTeeフィルタの間にフィルタを挿入しようとしています。新しく作成したフィルタをソースフィルタに接続すると、ソースフィルタに新しいアロケータが作成されます。新しいフィルタ(出力ピン自体にカスタムアロケータを提案する)をSmartTeeフィルタに接続すると、SmartTeeは、ソースとSmartTeeの間の最初の接続で作成されたアロケータを提案します。しかし、SmartTeeはBreakConnectのためにこのアロケータを削除する必要がありました。アプリケーションを終了すると、残りの1つのソース・アロケータ・オブジェクトが生成されます。これは、最初の接続で作成されたアロケータです。

ソースフィルタと挿入されたフィルタには、出力ピンにアロケータを提案するInitAllocator関数があります。

答えて

0

CBaseOutputPinクラスのDecideAllocator関数のソースを確認することができます。出力ピンはアロケータを選択します。 https://msdn.microsoft.com/en-us/library/windows/desktop/dd390924(v=vs.85).aspx CBaseOutputPinは、入力ピンのGetAllocatorを呼び出し、その入力が自身のアロケータを提供するかどうかを判断します。 出力ピンのアロケータを提供するには、CBaseOutputPin :: InitAllocatorメソッドをオーバーライドしてアロケータのインスタンスを作成します。https://msdn.microsoft.com/en-us/library/windows/desktop/dd377477(v=vs.85).aspx アロケータを使用し、アウターがIMemInputPin :: NotifyAllocatorを呼び出して、選択。 NotifyAllocatorがエラーを返した場合、アロケータは解放されます。 出力ピンをCBaseOutputPinに基づいて、DecideAllocatorメソッドを置き換えましたか?

+0

私はそれを試しました、私はビデオレンダラによって提案されたアロケータをオーバーライドしていない場合は動作するようです(このアロケータのネゴシエーションはカスタムベースクラスで行われます)。残念ながらこれはプレビューモードでのみ機能します。キャプチャとプレビューの場合、リークは削除されません。 –

+0

アロケータ内にリークが発生する可能性があります。 – VuVirt

+0

もちろん、ref countがゼロに達するとアロケータが解放されないためです。 –

関連する問題