C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[3]: DirectShowLIB-2005


(過去ログ 113 を表示中)

[トピック内 4 記事 (1 - 4 表示)]  << 0 >>

■66819 / inTopicNo.1)  DirectShowLIB-2005
  
□投稿者/ 納豆 (9回)-(2013/05/29(Wed) 16:47:28)

分類:[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>

引用返信 編集キー/
■66821 / inTopicNo.2)  Re[1]: DirectShowLIB-2005
□投稿者/ 納豆 (10回)-(2013/05/29(Wed) 17:26:48)
Invoke を非同期呼び出しに変更したら、不具合が発生しなくなりました。
しかし、原因がわからずです。
基本的な事がわかっていない為の事だとは思いますが、ご指摘して頂けるとありがたいです。


引用返信 編集キー/
■66828 / inTopicNo.3)  Re[2]: DirectShowLIB-2005
□投稿者/ Azulean (171回)-(2013/05/29(Wed) 23:10:32)
2013/05/29(Wed) 23:11:38 編集(投稿者)

古いドキュメントですが、こういった内容がありますね。
http://msdn.microsoft.com/ja-jp/library/cc369545.aspx

> コールバックは動作を停止させる可能性のある処理を実行してはならない。これには、クリティカル セクションの保持や、他のスレッド待ちが含まれる。

Invoke は PostMessage でメインスレッドに処理を依頼しつつ、その処理の完了を待ちます。
このため、上述のルールに違反するため、デッドロックを引き起こすようなことは起こりうるのではないかと思います。


// 具体的にどういったロックがあって、競合しているかまでは調査していません。

-----
このあたりの内容は参考になるかも?
http://social.msdn.microsoft.com/Forums/ja-JP/windowsdirectshowdevelopment/thread/f9430f17-6274-45fc-abd1-11ef14ef4c6a
引用返信 編集キー/
■66840 / inTopicNo.4)  Re[3]: DirectShowLIB-2005
□投稿者/ 納豆 (11回)-(2013/05/30(Thu) 15:31:03)
Azulean さん

返信ありがとうございます。

>このあたりの内容は参考になるかも?
>http://social.msdn.microsoft.com/Forums/ja-JP/windowsdirectshowdevelopment/thread/f9430f17-6274-45fc-abd1-11ef14ef4c6a

これはまさに…同じ問題ですね。
大変参考になりました。

知らないことが多すぎますね…。精進します。

解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -