« SQLiteでレコードの削除 | メイン | SQLiteとSenna »

2006年02月15日

吉里吉里 ムービー拡張日誌2:: VMR9とWMV対応をコミット

    

VMR9とWMVに対応したムービー部をコミットした。
TJSから使える。(ドキュメント)
KAGは入れていない。
そもそもKAGから操作するものはほとんど作ってない。
確かモードの指定ぐらいだった気がする。
そのうちいろいろ入れたら入れよう。

他にMPEGのマルチビデオにも対応しているけど、使えないのでドキュメントには書いていない。
マルチオーディオはまだしも、マルチビデオはなぁ……
タイムラグあるし。


今回、WMVに対応したもののWMVはしばらく使わないことになりそう。
かなり苦労したけど。
VMR9は使う予定。



投稿者 Takenori : 2006年02月15日 23:25



コメント

すみません、マシンを新しくした際にVC++のコンパイル環境を失ってしまって構築に時間がかかるかもしれないのですが、
コンパイル済みバイナリをいただけますでしょうか。
よろしくお願い致します。

投稿者 W,Dee : 2006年02月18日 20:03

こんにちは。お世話になっております。

いま、吉里吉里の掲示板で
http://kikyou.info/tvp/bbs/bbs.cgi?mode=&action=disp&num=9552#9552
という症状が報告されているのですが、なにか思い当たる
節などありますでしょうか。

お手数をおかけします。よろしくお願い致します。

投稿者 W.Dee : 2006年07月28日 12:59

こんばんは。

だいぶ前のことなので、既に記憶にないです。
昔のソースとdiffとって見てみないことにはなんとも言えないです。
時間のある時に見てみます。

では。

投稿者 Takenori : 2006年07月28日 23:08

こんにちは。
原因を探っていたところ、dsoverlay.cpp の tTVPDSVideoOverlay::ReleaseAll() にて

VideoWindow()->put_Owner(NULL);

として、ビデオウィンドウの親ウィンドウを切り離しているのが原因であると分かりました。
親ウィンドウを切り離すと、ビデオウィンドウは単独のウィンドウを作成しようとします。
それが「一瞬吉里吉里のウィンドウ外にビデオが表示される」の原因のようです。
この put_Owner で NULL を指定する、というのは
リビジョン 1386 で追加されています。
https://sv.kikyou.info/trac/kirikiri/changeset/1386

「一瞬吉里吉里のウィンドウ外にビデオが表示される」はあまり好ましくない
(さらにそれでフォーカスが一瞬、そのウィンドウに移ってしまうのがまずい)
と思いますので、なんとか改善したいのですが、この動作をコメントアウトし
ても問題がないならばそうしたいとおもいます。なにか、この動作を入れた
理由などありますでしょうか。

お忙しいところ本当に申し訳ありません。お時間のあるときにご回答いただけると
幸いです。

あとついでで誠に申し訳ないのですが、Visual C++ 2005 Express Edition と
各種 SDK を入れて当方でもムービー拡張のビルド環境を整えました。
しかしきわめて難航し、結局 Platform SDK 付属のいくつかのソースを書き換えて
ようやくビルドに成功しました。したがって、こちらのビルド環境にかなり不安があります。
この(上記の「一瞬吉里吉里のウィンドウ外にビデオが表示される」)問題が解決後、
Takenori氏の方でビルドしたDLLをくださいますでしょうか。これまたお忙しいところ
申し訳ありません。


投稿者 W.Dee : 2006年07月29日 12:51

こんにちは。

解析ありがとうございます。
確かDXのドキュメントの推奨にしたがって、そのようにした記憶があったので、調べてみました。
以下のIVideoWindow::put_Ownerについてのページの注意を見ると――
http://msdn.microsoft.com/library/ja/directx9_c/directx/htm/ivideowindowput_owner.asp

注意
フィルタ グラフ マネージャを解放する前に、オーナーを NULL にリセットすること。リセットしないと、引き続きこのウィンドウにメッセージが送られ、アプリケーション終了時にエラーが発生する可能性が高い。

と書かれていたので、確かその通りに終了時にリセットする処理を追加したと記憶しています。
IVideoWindow::put_Visible で事前に非表示にすれば何とかなるかと思ったのですが、ウィンドウは出ないもののフォーカスが一度どこかに行って戻ってきますね。

VideoWindow()->put_Owner(NULL); をコメントアウトすれば確かにきちんと動きます。
これまではなくても動いていたようなので、とりあえずコメントアウトしてビルドしました。

http://kaede-software.com/krlm/krmovie.zip
ここに置いておきます。

dsoverlay.cpp もコミットしました。

投稿者 Takenori : 2006年07月29日 14:19

ありがとうございます。
手元での動作を確認しました。

>フィルタ グラフ マネージャを解放する前に、オーナーを
>NULL にリセットすること。リセットしないと、引き続き
>このウィンドウにメッセージが送られ、アプリケーション
>終了時にエラーが発生する可能性が高い。

ああ、こちらは見落としていたかも。

いまのところこれで (ownerWindowをNULLに設定しないで)問題が起こったことはないです。

# そういえばDirectShow付属のサンプルのPlaywndも
# よく観察してるとムービーを閉じる時に
# 一瞬だけフォーカスを失ってるのが分かります

たぶん今日中に次の2.27代のベータ版を出します。

ありがとうございました。

投稿者 W.Dee : 2006年07月30日 02:52


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