Alalf / SCFF-DirectShow-Filter

"ScreenCapture for FFmpeg" DirectShow Filter
GNU Lesser General Public License v3.0
53 stars 22 forks source link

Windows 8/Windows 8.1でのDSFの動作を調査する #86

Closed Alalf closed 11 years ago

Alalf commented 11 years ago

いやな予感がするのでIssueに

Alalf commented 11 years ago

いろいろありましてそろそろ更新します 0.2.0完成のモチベは多分新生のアレが盛り上げてくれるハズ・・・・・・

Alalf commented 11 years ago

現状8を取るかXPを取るかという二者択一を迫られてる感じ まさかここまでXP切捨てでこられるとは思わなかった あまりのことにgccへの移植を考えるレベル・・・・・・どうしたものやら

Alalf commented 11 years ago

Visual Studio 2012のUpdate1が出たのでいろいろ調査中。 ついにx64=amd64になったのかPlatformShortnameが変わってた。amd64を全部x64に書き直さないと駄目かなーこれ。

Alalf commented 11 years ago

いまさらだけどVirtualBoxといういいものを知ったので、XPでの動作確認ができそうだ

Alalf commented 11 years ago

ffmpeg側のリファクタリングに合わせて調整中。AVPixelFormatができて、VCでもpixdesc.hの書き換えが必要なくなったようだ。これはありがたい。

Alalf commented 11 years ago

やっぱりやらかしてくれたのはC#/.NETだった・・・ Drag Hereボタンが動かなくなってる。画面のDCに書き込みができなくなった・・・?あとマウス座標からウィンドウを取得できない。これはまずい…

Alalf commented 11 years ago

問題の切り分け完了。Any CPU向けビルドにすると一部Win32APIが使えなくなる。んで32bit優先付けると使えるようになる。.NETは4.0CPでも4.5でも動いた。 要するにAny CPU使わなきゃいいかんじ。ちなみに4.5は正式にXP非対応宣言済み。さて、どうしたものやら・・・

Alalf commented 11 years ago

結論から言うと某B社と某新生がWindows XPをサポートし続ける限り、SCFFもWindows XPを切り捨てるという選択肢はありえない。よって、Visual Studio 2012に移行はするけれどもコンパイラはv110_xp、.NETは4.0CP/x86で固定しよう…

Alalf commented 11 years ago

ふときになってGoogle C++ Style Guide見に行ったらかなり更新されてた!(英語版本家のみ) C++11のautoとnullptr/nullptr_tはがんがん使っていくようにしないとなー。range_based_forもスクリプト言語でおなじみなので使いやすそう。

Alalf commented 11 years ago

enumの前方宣言が便利すぎて鼻血が出そう・・・

Alalf commented 11 years ago

GetDesktopWindow()を排除したほうがいいかもしれない。Windows 8ではメトロアプリよりも階層が上のHWNDなのでコレを取り込もうとするとAeroOn取り込みと同じぐらい動作が遅くなる。Windows 7では:

になってるが、おそらくXP/8では違うはず・・・要調査

Alalf commented 11 years ago

VirtualBox上のXPで試したところ(VBox独自の可能性もあり)

Alalf commented 11 years ago

どうやら上はActive Desktopを付けてたときだけか?おそらくWindows 8ではかなり異なるはず。要調査。

Alalf commented 11 years ago

ついでに各種DirectXフック系キャプチャプログラムの調査。いちおうWindows 8に対応してるっぽいが、デスクトップ取り込みに対応しているかどうかはわからない。 SCFFは最初からSCFHの置き換えを狙って作り始めたものだからフックは使わないと決めているが、Windows 8でまともなパフォーマンスでデスクトップキャプチャができないとなると代替案を導入せざるを得ないかもしれない・・・。でも知識も大量のdllにひとつひとつフックプログラムを書く気力もない・・・。困ったもんです。

Alalf commented 11 years ago

そして収穫が。なんとDirect 3Dはテクスチャの画像形式としてYUV形式をサポートしていることが判明!ただし全部16bit。 どうりでYUV2のWMVがGPU支援付きで再生されるわけだ。しかしネットの動画の大半は12bit YUV・・・。 なんかちぐはぐだなあ・・・。

Alalf commented 11 years ago

Windows 8で高速なキャプチャをしたい場合はGDI(DC)を使わずにDXGI Duplicationを使えばいいのかも… http://code.msdn.microsoft.com/windowsdesktop/Desktop-Duplication-Sample-da4c696a/view/Discussions#content

Alalf commented 11 years ago

自分用メモ

Alalf commented 11 years ago

ぼーっと眺めていたら面白いものを発見。 http://msdn.microsoft.com/en-us/library/hh448029(v=vs.85).aspx このDXGIManagerからDesktopDuplicationできないかな・・・。

Alalf commented 11 years ago

MFMEDIASOURCE_IS_LIVEのサンプルが2013年になっても一つもないというのはいったいどういうことなの

Alalf commented 11 years ago

D3D10/10.1/11のキャプチャ機能を考え中。コレが実現できればDXGI Desktop Duplication対応も可能なはず。

Alalf commented 11 years ago
Alalf commented 11 years ago

OpenProcess()を直接呼んだらAntiVirusソフトに誤検出されるらしい。Injectionなかなか奥が深い…。

Alalf commented 11 years ago

OBSの基本的な流れとしては:

Alalf commented 11 years ago
Alalf commented 11 years ago

InjectorでLoadLibraryされたDLLのスレッドの生存期間をOBSのHWNDで判断しているので、そのまま使おうとするとOBSと併用できなくなる可能性がある。 となると書き換えが必要だが、OBSのソースはGPLなのでややこしいことになる。

やはり参考にしながら書くのが正解か

Alalf commented 11 years ago

InjectHelper.exeが独立したexeである必要はないが、GraphicsCaptureHook.dllは独立したdllではなければならない。 つまり

ここにきてSCFF DSFからProfile機能を取っ払って共有メモリの中身を書くだけのフィルタにしたくなってきた

Alalf commented 11 years ago

知れば知るほどグレーゾーンに突入している感じ。これ「実行中のプログラムを書き換えてはならない」とかゲームの規約に入ってたらどうなるんだろう。

スクリーンキャプチャ機能はOSの標準機能ですとお茶を濁せるのはキャプチャプログラムの利点か

Alalf commented 11 years ago

Desktop Duplicationはアリだが、Injectorを利用したDirectXキャプチャはナシの方向で だが、結局IDXGIResourceに対する処理(CalcSubresource/CopySubresourceRegion)は一緒なので知識は無駄にはならなそう

Alalf commented 11 years ago

別のIssueに移動