[リストへもどる]
一括表示
タイトルムービー拡張 組み込み進捗状況
記事No33
投稿日: 2004/11/28(Sun) 23:36
投稿者W.Dee   <dee@kikyou.info>
参照先http://kikyou.info/
こんにちは。

W.Deeです。

いまムービー拡張を吉里吉里本体に組み込ませて頂いています。
大変ありがとうございます。

trunk に組み込んでいます。アドレスは https://sv.kikyou.info/svn/kirikiri2/trunk です。

当方、VC++6.0しか持っていないのでVC++6.0でコンパイルするために
DShowException.cpp / DShowException.h に少し変更を加えました。
(詳しくはコミットログを見て頂けると幸いです)

----------------------

コンパイルはうまくいったのですが、問題が発生しました。
openメソッドで

krmovie.dll/krflash.dll 内でエラーが発生しました/Unknown error

というエラーが出ます。

こちらで配布されているサンプル内のlake.mpgでこのエラーが発生します (エラーが出ないムービーも
あります)。

こちらで試したのは ( MediaPlayer では全て再生できます )
[1] lake.mpg MPEG1 320x240 30.00fps 1:1 1843.20kb/s MPEG1-LayerII 44.10kHz 128.00kb/s CBR Stereo 00:00:04
[2] 某ゲームのOP MPEG1 640x480 29.97fps 1:1 4000.00kb/s MPEG1-LayerII 44.10kHz 192.00kb/s CBR Stereo 00:01:30
[3] 某昔のMADビデオ AVI1.0 640x240 24Bit Radius Cinepak 15.00fps 1377f 3877.48kb/s PCM 22.05kHz 8Bit 2ch 352.80kb/s 00:01:31
[4] AVI1.0 640x480 24Bit DivX3/MS MPEG4-V3(DIV3) 30.00fps 22909f 603.99kb/s PCM 44.10kHz 16Bit 2ch 1411.20kb/s 00:12:43
です。

krmovie.dll では
[1] × [2] ○ [3] ○ [4] ○

krlmovie.dll では
[1] × [2] ○ [3] △ [4] ×

となりました。
×は全て同様のエラーとなります。
( △は、再生はできるが、画像にブロック状の残像のようなノイズが乗る )

ちなみに、krlmovie.dll で lake.mpg が再生できないのは、こちらで
配布されているサンプルでも同様です。


krmovie.dll でエラーの出る箇所を追うと、tTVPDSMovie::BuildMPEGGraph の

if( FAILED(hr = ConnectFilters( pMPEG1Splitter, pMPEGVideoCodec )) )
return L"Failed to call ConnectFilters.";

の箇所で例外が発生しています。

tTVPDSMovie::ConnectFilters を追うと、upstream の Audio と downstream の
Input をつなごうとしてエラーが発生しています ( ループ内で
PinInfoUpstream.achName が L"Audio" で、PinInfoDownstream.achName が
L"Input" のとき、 m_GraphBuilder->Connect を行っている
最中にこのエラーが出ているようです )。

ログ(VC++の「デバッグ」ペイン)を見ると

'C:\af\npp1\Qn.dll' をロードしました、合致するシンボル情報は見つかりませんでした。
'C:\af\npp1\Waves.dll' をロードしました、合致するシンボル情報は見つかりませんでした。
'C:\WINDOWS\system32\comdlg32.dll' をロードしました、合致するシンボル情報は見つかりませんでした。
例外処理 (初回) は tvpwin32.exe (QN.DLL) にあります: 0xC0000005: Access Violation。
例外処理 (初回) は tvpwin32.exe (QN.DLL) にあります: 0xC0000005: Access Violation。
'C:\af\npp1\Qn.dll' をロードしました、合致するシンボル情報は見つかりませんでした。
例外処理 (初回) は tvpwin32.exe (C1.DLL) にあります: 0xC0000005: Access Violation。
例外処理 (初回) は tvpwin32.exe (C1.DLL) にあります: 0xC0000005: Access Violation。
(略)
'C:\Program Files\illiminable\oggcodecs\vorbis.dll' をロードしました、合致するシンボル情報は見つかりませんでした。
'C:\Program Files\illiminable\oggcodecs\ogg.dll' をロードしました、合致するシンボル情報は見つかりませんでした。
例外処理 (初回) は tvpwin32.exe (LIBFISHSOUND.DLL) にあります: 0xC0000005: Access Violation。
例外処理 (初回) は tvpwin32.exe (KERNEL32.DLL) にあります: 0x0EEFFACE: (名前がありません)。
例外処理 (初回) は tvpwin32.exe (KERNEL32.DLL) にあります: 0x0EEFFACE: (名前がありません)。
(略)

のようなエラーが大量に記録されています。
QN.DLL とか C1.DLL は DirectShow のオーディオ系のエフェクトフィルタで、
illiminable\oggcodecs\vorbis.dll などは http://www.illiminable.com/ogg/ ここのフィルタです。


ビデオデコーダをスプリッタにつなぎたいのに、スプリッタのオーディオ出力と
ビデオデコーダの入力をつなごうとしておかしくなってるんでしょうか...

ちなみに tTVPDSMovie::BuildMPEGGraph 内での順序を変え、オーディオをビデオよりも先に
接続するようにするとエラーは起きなくなりますが、根本的な解決になってなさそうなので
やるのはやめています。

# Radius Cinepak コーデックでノイズが乗るのは デコーダ側の問題のような気がます
# いまさら使われることもなさそうなので非サポートにしてしまおうかと思います

----------------------

で、すこし探っていくと うちの環境では、標準で MPEG1 スプリッタに
"MainConcept MPEG Splitter"が使われてしまうことがわかりました。
SoundForge という音声編集系ソフトウェアについてくるものです。
これのメリット値を
http://hp.vector.co.jp/authors/VA032094/DFTool.html
ここのツールで下げ、標準のスプリッタが選ばれるようにすると
状況が以下のように変わりました。

krmovie.dll では
[1] ○ [2] ○ [3] ○ [4] ○

krlmovie.dll では
[1] × [2] ○ [3] △ [4] ×

となりました (krmovie.dll での lake.mpg の再生が可能になった )。


うちの環境が悪いと言えば悪いのですが、より多くの環境での安定動作を
求めるならばスプリッタも標準の物を指定してフィルタグラフを構築する
べきなのかもしれません。

----------------------

現状はこんなところです。
こちらでも引き続き調査しますが、なにかご助言をいただければ幸いです。


では長くなり読みづらいかも知れませんが申し訳ありません。
よろしくお願い致します。

タイトルRe: ムービー拡張 組み込み進捗状況
記事No34
投稿日: 2004/11/29(Mon) 01:31
投稿者管理人
こんばんは。
IRCの方におじゃましたんですが、すでに寝てしまっていたようですので、こちらに思い付いたことを書かせていただきます。

まず、私のHPに置いてある、実行ファイルを使っても、同様の結果になりますか?

----------------------

問題の、
m_GraphBuilder->Connect( pIPinUpstream, pIPinDownstream)
で返ってきている、hr値はなんでしょう?
すぐ下の
#if _DEBUG 〜 #endif
で囲われた部分、
OutputDebugString( DShowException(hr).what() );
で、デバッガにエラー文字列か表示されると思うのですが。
いや、違うのか。
そのスプリッターが、そのように接続要求が来ることを想定していない(面倒だから例外にしてる?)ので、例外を出しているのか。
その接続前のグラフが見たいですね。
DLLをデバッグビルドすると、ROTに登録するようになるで、GraphEditから接続されているフィルタを見ることが出来ます。
GraphEditでFile -> Connect to remore Graphとしたら、ROT登録されている物の一覧が出る(たぶん、1つしか出ません)ので、そこで今回のものを選択してください。
ただし、この時にグラフが作られていて、プログラムが動作していないといけないはずですので、問題の接続前でopenが返るようにソースに変更を加える必要があります。なので、ちょっと面倒ですから、下に書いていることを先に確認してください。
ちなみにGraphEditは私の環境ではC:\DXSDK\bin\DXUtils\graphedt.exeです。

----------------------

スプリッターもCLSID_MPEG1Splitterで生成しているので、標準のが使われると思っていたのですが、違うのでしょうか? って、現に違うんですよね。
CLSID_MPEG1SplitterのクラスIDはどうなっているでしょうか?
私の環境では 336475d0-942a-11ce-a870-00aa002feab5 です。
CLSID_MPEG1Splitterはuuids.hにあると思います。
で、そのクラスIDをレジストリエディタで検索すると、私の環境ではMPEG-I Stream Splitterとなっています。
後、oleviewでAll Objectsを開いて、MPEG-I Stream Splitterを探し、Implementationタグを見ると、C:\WINNT\system32\quartz.dllとなっています。クラスIDは上述の物と同じです。
ここは、どうなっていますでしょうか?
oleviewはファイル名を指定して実行で、起動されると思います。(標準ではなかったかも・・・)
後、変にいじるとエクスプローラーとかがおかしくなって、直らなくなってしまいます。見るだけなら大丈夫なはずです。レジストリの時点で違っていれば、ここはどうでもいいです。

AVIファイルの時は自動でやっているので、環境によって使われるスプリッターが異なると思います。(AVIファイルはあまり気にしなくてもよさそうだったので)
しかし、レイヤー描画の結果を見ると、スプリッターやデコーダーとレンダーがうまくつながってなさそうですね。

----------------------

GraphEditで問題のファイルをFile -> Render Media File...で読み込ませた時、どのようなグラフが構築されますか?
"MainConcept MPEG Splitter"が使われてますか?

----------------------

いろいろとお願いを書いてしまいましたが、よろしくお願いします。
また明日、IRCの方へお伺いします。
それでは。

タイトルRe^2: ムービー拡張 組み込み進捗状況
記事No35
投稿日: 2004/11/29(Mon) 13:26
投稿者W.Dee   <dee@kikyou.info>
参照先http://kikyou.info/
不在のときにいらしたようで申し訳ありません。
今日は休みなので(食事などで離席していなければ)深夜まで居ると思います。

> > まず、私のHPに置いてある、実行ファイルを使っても、同様の結果になりますか?

MPEG I Splitter のメリット値を元に戻した場合 (つまり、標準で
"MainConcept MPEG Splitter" が使われる状態 )

krmovie.dll では
[1] × [2] ○ [3] ○ [4] ○

krlmovie.dll では
[1] × [2] ○ [3] △ [4] ×


MPEG I Splitter のメリット値を換え、標準のスプリッタが
標準で使われるようにした場合 )

krmovie.dll では
[1] × [2] ○ [3] ○ [4] ○

krlmovie.dll では
[1] × [2] ○ [3] △ [4] ×

MPEG I Splitter のメリット値による状況の変化はありませんでした。

あれ、とおもってこちらでビルドした物でもやってみましたが...
メリット値による状況の変化はありませんでした (上記と同じになりました)。

> スプリッターもCLSID_MPEG1Splitterで生成しているので、標準のが使われると思っていたのですが、違うのでしょうか? って、現に違うんですよね。

そうですね、おかしいと思っていましたが...
確かに前回の実験ではkrmovie.dllによる再生ができていたので、
もしかしたら何か別の要因(スプリッタとは別の)が影響しているのかも知れません。

あるいは私の勘違いという可能性もあります。でしたらスミマセン。
うーん、眠い頭でやったのが悪かったか


> > 問題の、
> m_GraphBuilder->Connect( pIPinUpstream, pIPinDownstream)
> で返ってきている、hr値はなんでしょう?

ここで例外が発生しているのでこの関数は戻っていません。
# それで "Unknown error" となるようです

> そのスプリッターが、そのように接続要求が来ることを想定していない(面倒だから例外にしてる?)ので、例外を出しているのか。
> その接続前のグラフが見たいですね。
> DLLをデバッグビルドすると、ROTに登録するようになるで、GraphEditから接続されているフィルタを見ることが出来ます。
> GraphEditでFile -> Connect to remore Graphとしたら、ROT登録されている物の一覧が出る(たぶん、1つしか出ません)ので、そこで今回のものを選択してください。
> ただし、この時にグラフが作られていて、プログラムが動作していないといけないはずですので、問題の接続前でopenが返るようにソースに変更を加える必要があります。なので、ちょっと面倒ですから、下に書いていることを先に確認してください。
> ちなみにGraphEditは私の環境ではC:\DXSDK\bin\DXUtils\graphedt.exeです。

なるほど。

とりあえず、krmovie.dll のほうで、"MainConcept MPEG Splitter" の方が
使われるようなメリット値の状態で、例の

	if( FAILED(hr = ConnectFilters( pMPEG1Splitter, pMPEGVideoCodec )) )
		return L"Failed to call ConnectFilters.";

の前で強制的に return NULL; で帰るようにしてやってみましたが

+-------------+    +-------------------------------------+
|[0001] Output| -> |Input [MPEG-I Stream Splitter]  Audio|
+-------------+    |                                Video|
                   +-------------------------------------+
+---------------------------------+
|Input [MPEG Video Decoder] Output|
+---------------------------------+
+----------------------+
|Input [Video Renderer]|
+----------------------+

となっていました。[0001] から [MPEG-I Stream Splitter] は接続されていますが、他は接続されていません。
"MainConcept MPEG Splitter" ではなく ちゃんと "MPEG-I Stream Splitter" がフィルタとして
登録されていました。


> CLSID_MPEG1SplitterのクラスIDはどうなっているでしょうか?
> 私の環境では 336475d0-942a-11ce-a870-00aa002feab5 です。

同じです。336475d0-942a-11ce-a870-00aa002feab5 となっています。

> CLSID_MPEG1Splitterはuuids.hにあると思います。
> で、そのクラスIDをレジストリエディタで検索すると、私の環境ではMPEG-I Stream Splitterとなっています。
これも同じです。"MPEG-I Stream Splitter" となっています。

> 後、oleviewでAll Objectsを開いて、MPEG-I Stream Splitterを探し、Implementationタグを見ると、C:\WINNT\system32\quartz.dllとなっています。クラスIDは上述の物と同じです。

はい
うちでは「C:\WINDOWS\system32\quartz.dll」になっていますが、quartz.dll を挿していますね。

> > GraphEditで問題のファイルをFile -> Render Media File...で読み込ませた時、どのようなグラフが構築されますか?
> "MainConcept MPEG Splitter"が使われてますか?

ちょっと図で書きにくいですが

+-----------------+  +---------------------------------------+       +---------------------------------+  +---------------------------+
|[lake.mpg] Output|->|Input [MainConcept MPEG Splitter] Video|-----> |Input [MPEG Video Decoder] Output|->|VMR Input0 [Video Renderer]|
+-----------------+  |                                  Audio|--+    +---------------------------------+  +---------------------------+
                     +---------------------------------------+  |    +---------------------------------------+  +---------------------------------------+  +----------------------------------------------------------------------+
                                                                +--> |XForm In [MPEG Audio Decoder] XForm Out|->|Input01 [Morgan Stream Switcher] Output|->|Audio Input pin (rendered) [Default DirectSound Device] (clock source)|
                                                                     +---------------------------------------+  |Input02                                |  +----------------------------------------------------------------------+
                                                                                                                +---------------------------------------+


となっています。標準の "MPEG-I Stream Splitter" を使うようにメリット値を変更すると、
上記の "MainConcept MPEG Splitter" が "MPEG-I Stream Splitter" に変わります。

Morgan Stream Switcher って前から気になっていたんですがなんなんでしょうね...
標準で入る物でしょうか。C:\WINDOWS\system32\MMSwitch.ax にあって、説明は

   This filter allows you to use multiple-language AVIs in
   Windows Media Player and to switch the audio stream
   on the fly.

   Go in the "Language" menu of Windows Media Player to select
   the active audio stream.

   http://www.morgan-multimedia.com

となっています。

# Nimo Codec pack というコーデック詰め合わせ (キワモノ) をインストールしたときに
# 入ったのかも知れません http://nimo.titanesk.com/

タイトルRe^3: ムービー拡張 組み込み進捗状況
記事No36
投稿日: 2004/12/01(Wed) 22:47
投稿者W.Dee   <dee@kikyou.info>
参照先http://kikyou.info/
この間はIRCにお越しいただきありがとうございました。

エラー関連を吉里吉里の例外として投げるように改良しましたのでコミットしました。

お手すきの時に、VC++2003用のプロジェクトファイルの更新もお願い致します。
(krlmovieの方はバージョン情報用にkrlmovie.rcも追加しました)

よろしくお願いします。

# いまはオプションでROTに登録できるようにする作業中です

タイトルRe^4: ムービー拡張 組み込み進捗状況
記事No37
投稿日: 2004/12/02(Thu) 00:00
投稿者W.Dee   <dee@kikyou.info>
参照先http://kikyou.info/
たびたびスミマセン

> > # いまはオプションでROTに登録できるようにする作業中です

これはコミットしました。

「吉里吉里設定」(吉里吉里のオプション設定ツール)が
オプションの情報を認識するために、
リンカオプションを弄る必要があります。

/COMMENT:"(--has-option--)"

をリンカのオプションとして追加してください。

詳細はこちら:

	// 吉里吉里設定などは、そのプラグインに設定可能な項目があるかどうかを
	// プラグインDLLの
	// 先頭2KB以内に "(--has-option--)" という文字列があるかどうか
	// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
	// (2重引用符は含めず)
	// で判断するため、先頭2KB以内にこれを書かなければならない。
	(略)
	// VC++ の場合もリンカオプション /COMMENT で
	// /COMMENT:"(--has-option--)" と記述する。



今度はウィンドウ内に複数のムービーオブジェクトを保持できる
ようにします...

タイトルRe^5: ムービー拡張 組み込み進捗状況
記事No39
投稿日: 2004/12/02(Thu) 01:53
投稿者管理人
レスする場所間違った。
一応こちらにも同じことを書いておきます。

VC++2003用のプロジェクトファイルの更新を行い、コミットしました。
修正内容はログを見てください。
と言っても、書かれている通りにやっただけですけど。

タイトルRe^6: ムービー拡張 組み込み進捗状況
記事No40
投稿日: 2004/12/05(Sun) 00:38
投稿者W.Dee   <dee@kikyou.info>
参照先http://kikyou.info/
どうもです。
なかなか時間が合わなくてIRCでお会いできなく、申し訳ありません。

先ほど、ウィンドウ内に生成できるVideoOverlayクラスの
オブジェクトは1つだけという制限を無くしたものを
コミットしました。

とりあえず、一般に配布してテストしてもらうための
簡単なムービープレーヤを作ろうとしましたが、
ムービーのオリジナルのサイズを得るプロパティが
無いことに気づきました。

vomLayerの場合はレイヤのサイズが自動的に変更されるので
良いのですが、vomOverlay の場合はあらかじめVideoOverlay
に指定したサイズで再生されるので、オリジナルのビデオの
サイズが分かりません。

もともとのオーバーレイ方式での再生では、320x240のムービーを
640x480に拡大して再生するとかいう用途が結構あったので
ムービーの実際のサイズと表示サイズを変えられるようにして
あったうえ、プログラマの責任でサイズを考慮してくれよ、
ということで元のサイズが分からないようになってます。

とりあえず vomLayerでの拡大縮小はおいておいて、
現状 width プロパティと height プロパティは
表示サイズを表しているのでこのままにし、
読み出し専用のプロパティとして
originalWidth と originalHeight を付けようかと思います。

現状はそんなところです。

タイトルRe^7: ムービー拡張 組み込み進捗状況
記事No41
投稿日: 2004/12/05(Sun) 21:55
投稿者管理人
どうもこんばんは。
IRCで時間が合わないのは仕方のないことです。
私の都合でお邪魔していますし。

昨日の夕方から夜と今朝から昼間は用事があったのでIRCへ顔を出せませんでした。
今日の夜は、昨日あんまり寝ていないので、もうそろそろ寝ます。
すいませんが、明日の夜にでもまたIRCへ顔を出します。

読み出し専用のサイズプロパティの件了解しました。

では。

タイトルRe^4: ムービー拡張 組み込み進捗状況
記事No38
投稿日: 2004/12/02(Thu) 01:52
投稿者管理人
VC++2003用のプロジェクトファイルの更新を行い、コミットしました。
修正内容はログを見てください。
と言っても、書かれている通りにやっただけですけど。