« IWMCodecAMVideoAcceleratorの取得 | メイン | インターフェイスの取得順 »

2005年10月26日

吉里吉里 ムービー拡張日誌2:: デッドロック

    

スレッドがイベント待ちのせいで再生されないのではなく、デッドロックが発生しているのではないか?と気付いた。
フィルタはさまざまな場所でクリティカルセクションでロックするような構造になっているが、そのどこかでデッドロックが起こっている可能性がある。
そこで、少し前に書いたIWMReaderを使うソースを見てみると…… OnSample内でCBaseOutputPin::Deliverをコールする部分だけわざとロックされないようにしていた。
はて? なぜそういう風に書いたのだろう?
たぶん、何かのソースを参考にしたからだと思うが…… と考えていて気付いた。(思い出したわけではない)
PushSourceサンプルを参考にしたのではないか? と。
見てみると、FillBuffer内のみロックしている。
FillBufferは、CSourceStreamのものをオーバーライドして使うようになっている。
で、FillBuffer後にDeliverがコールされるような構造になっている。
今回の場合、CSourceStreamは使っていないので、FillBufferはない。
そこで、前に書いた時はFillBufferの処理に相当する部分のみロックするように書いたのだろう。

ま、それはいいとして、Deliverをロックしないようにしたら再生が開始されるようになって絵も出た。
良かった、良かった。
と、終了させても終了しない。
他にもデッドロック?
でも、これはすぐに気付いた。
IMediaFilter::Stop内だろうと思って、前のソースを見るとそこはロックしておらず、今回のはロックしていた。
で、今回もロックしないようにしたらきちんと終了されるようになった。

最初に書いたものはサンプルを参考にきちんと書いていたんだな。
今回はだいたいわかっていたから、サンプルはほとんど参照せずに書いたせいかいろいろと不備があったようだ。
クリティカルセクションを使用している場所はもう一度確認しておいたほうが良いな。
また、流れを追ってきちんとロックすべき場所を特定しよう。

と言うことで、次はやっとDirectX VAのネゴシエーション処理だな。



投稿者 Takenori : 2005年10月26日 23:24




comments powered by Disqus
Total : Today : Yesterday : なかのひと