分類:[C#]
2013/05/29(Wed) 17:03:00 編集(投稿者)
2013/05/29(Wed) 17:02:17 編集(投稿者)
2013/05/29(Wed) 17:00:10 編集(投稿者)
<pre><pre>こんにちわ。
DirectShowLib-2005 を用いて、ISampleGrabberCB を使って動画から画像のサンプリングをするプログラムを作成しているのですが、
IMediaControl の Stop() と Run() を繰り返すと、Stop() でデッドロックしてしまいます。
ISampleGrabberCB を使用しないで、IVideoWindow にレンダリングしている状態ではデッドロックしない事から、
グラバのコールバックに不具合があるのかなと思っています。
コールバックの中身では、画像のバッファをBitmapにコピーしているだけですが、正直、皆目見当つかず困っています…。
見て頂けるなら、サンプルにISampleGrabberCBを追加して不具合を再現してあるプログラムをアップロードする準備があります。
どうかよろしくお願いします。
編集:
コールバックの中身をちょこちょこ変えて、原因をしぼっていくと、悪いところが判明しました…。
public int BufferCB(double SampleTime, IntPtr pBuffer, int BufferLen)
{
if(buffBusy) return 0;
buffBusy = true;
Bitmap bmp = new Bitmap(VideoWidth, VideoHeight, VideoWidth * (BitCount / 8), System.Drawing.Imaging.PixelFormat.Format24bppRgb, pBuffer);
bmp.RotateFlip(RotateFlipType.RotateNoneFlipY);
bmp.Dispose(); // 下の Invokeコメントアウトによる追加行
// Invoke(new SetFrame(drawForm.SetTexture), bmp, VideoWidth, VideoHeight);
buffBusy = false;
return 0;
}
このようなコールバックなのですが、Invokeで処理している部分がこのようにコメントアウトしていると
不具合は発生しませんでした。
public void SetTexture(Bitmap img, float w, float h)
{
DisposeTexture();
this.Image = img;
this.ImageW = w;
this.ImageH = h;
Invalidate();
}
public void DisposeTexture()
{
if(this.Image != null)
{
this.Image.Dispose();
this.Image = null;
}
}
呼んでいる先はこうなっていますが、
それでも、この処理の不具合が見当付きません…。
きっと、やってはいけないことをしていると思うのですが、
ご指摘、よろしくお願いいたします。</pre></pre>