年度始めからバグ修正です。VFAPI 動作時など、ラジオボタンで直接 SIMD を指定した場合以外の時に「MMX 整数/SSE2 実数」が「非 SIMD」として扱われるバグが存在したので修正しました。
特に「MMX 整数」の辺りが致命的です。非 P4 ユーザで lanczos3 が遅いと悩まれていた方、申し訳ありませんでした。また、報告してくださった方、ありがとうございます。
3月後半からはじまった某 DirectShow のお仕事にはまりこんでからというもの、時間が飛ぶように過ぎ去ってしまい気が付けば4月ももう半ば。断片的で不十分なドキュメント。パブリックメソッドが定義されているにもかかわらず friend 宣言して protected メンバーに直接アクセスしてる基底クラス。中の処理が見えない IGraphBuilder と IMediaControl に追加で Video Render。作れば作るほどに理解不能なトラブルが発生し、そのたびにあちこち修正して挙動の変化からあるべき仕様を類推する日々。
今は、ビデオデコーダの出力ピンのクラスを CBaseOutputPin から CDynamicOutputPin に変更したところオーバーレイが使われなくなってしまってどうしようかと悩んでいるところ。baseclasses のソースを見た限りでは CompleteConnect() をオーバライドしていないので CBaseOutputPin と同じに VideoRenderer 側のアロケータを使ってるはずなのに何故だろう。
既に解決したトラブルとはいえ、AMOVIESETUP_FILTER に出力ピンを三つ登録してるとフィルタマッパが発狂して最初の一回しか RenderFile 成功しなくなるとか、ドキュメントのとおりにパーサフィルタの出力ピンで一つ以外は IMediaSeeking::Hoge() で E_NOTIMPL 返すようにしてたらシーク操作が不能になってたとか、本当に最低。
つーか DirectShow が不安定でトラブルが絶えないのも実際にフィルタを作り出すと非常によく理解できる。フィルタの開発者みんながこんな苦労してるんじゃ安定させられる訳がない。
4/1 付けで公開されていた Intel C/C++ 7.1。当日にダウンロードしたけど、暇がなくて放置していたのをやっと試すことができた。
HT 対応が目玉らしいけど、初代 P4 を使っている身にはそんなものが関係するはずもなく。とりあえず /Gr オプション(fastcall 関数呼び出しを標準に)を付けてコンパイルしても落ちなくなってくれたのはありがたい。
m2v.vfp では VLC のデコードで関数呼び出しをかなり頻繁に行ってるから fastcall で少しは速くなるはず。とりあえずコンパイラのバージョン変更だけじゃプログラムのバージョン上げられないけど、何かバグ修正か機能追加があれば次からは Intel C 7.1 でコンパイルしてリリースの予定。
……Intel C 6.0 でユーザ登録したのは去年の 6/22 だから……追加投資なしで使える Intel C は 7.1 で最後になるのかな〜。
何となく ISO のサイトを眺めていたところ、ISO/IEC 14496-2 (MPEG-4 Visual) と ISO/IEC 14496-3 (MPEG-4 Audio) の値段が ISO/IEC 11172 (MPEG-1) 並みに下がっていたので衝動的に購入してしまった。ひょっとしたら ISO/IEC 13818-7 (MPEG-2 AAC Audio) も値下がりしてるかなと期待したのだけど、こちらは相不変 200 CHF を越えていたので購入を断念。
14496-2 には上のウォーターマークが入ってたのだけど、14496-3 や以前購入した 11172-3 にはこんなものは入ってなかったので、どうやら通常の PDF (イメージ形式でない PDF, ZIP でまとめられてない PDF) にしかこれは入らないらしい。
てなわけで、MPEG-4 Visual と MPEG-4 Audio の規格書にのってる内容については、職務上知りえた秘密ではなくなった。これで面白そうなネタがあったのに、書くことができなくてストレスをためることは減りそう。
バグ報告およびサンプル提供が行われたので、バグ調査と修正と検証して公開。おまけツールで切り出す際のバグ修正なので、通常のプラグインモードで使ってる場合は影響ないはずです。コンパイラの更新で多少の高速化があるかもしれませんけど。
一応5月の連休中に音ズレの補正機能を組み込んでやろうかとたくらんでいたので、どんな風に実装しようかと考えているところなんだけど。最初に PS/TS ファイルを VIDEO ES ファイルとして読めるように実装してしまったことの弊害がかなり大きいことを痛感している。
今の構造のままでも無理をすれば音ズレ補正機能を組み込むこともできなくはないのだけど、既に見通しが悪くなってる現在のコードをよりいっそう汚いコードにしてしまうのにはためらいがある。かといって、基礎構造の改変に手を出してしまうと、確実に連休中に終わらせることはできなくなってしまう。
まあいいや、しばらく悩んでから決めることにしよう。実作業に入るにはまだ間があることだし。
やばい。GNB さんの所の掲示板と ごうさんの日記の ATL を読んでいたら作りたくなってきてしまった。m2v.vfp の音ズレ補正は大仕事になりそうだし、GW の現実逃避はこっちにしてしまおうかしら。
とりあえず絵だけなら何とかなりそうだけど、問題は音だよな。ちょっと調べてみて音も取れそうならやって見ることにしよう。ATL なら IWebBrowser2 使って WEB ページ BMP 保存するテストプログラム書いたときに触ったことがあるし、何とかなるだろう。
むー flash.tlh を見る限り、音を ocx から受けるのは無理か。しかし、SWF File Format Spec も手に入ってしまったことだし、MP3/ADPCM/PCM だけなら直接読むことも不可能ではないなぁ。
MPEG-2 VIDEO VFAPI Plug-In Ver. 0.6.29 にバグが発見されました。「GOP タイムコードを使わない」にチェックして、強制的に GOP リストを作成している場合、GOP ヘッダの closed_gop フラグが無視され、先頭の2フレーム(mme.exe で Bc と表示されるフレーム)が欠けることがあります。
別件のバグ報告(B フレームから開始してるファイルを開こうとすると落ちる)を検証している際にこのバグに気がつきました。一応こちらのバグは修正済みなのですが、報告いただいたバグの確認がまだできていないため、0.6.30 のリリースはそちらが解決してからの予定になっています。
……あー。これからまた excite 翻訳の助けを借りて英文メールでっちあげなきゃならないのか……気が重い……。
Flash.ocx の話。ありがたいことに窓とメッセージループ無しでも動かせそうな感触。とりあえずメッセージループ前で IShockwaveFlash::GotoFrame() して ::OleDraw() で任意の HDC に絵を描いてくれた。
イベントサウンドが設定されてると、GotoFrame() の度に妙な音が出るけど、それはそれということで。とりあえず絵だけ版なら明日にでもできあがりそうな勢いだな〜。
MD22292C2 などというキチガイアイテムを購入してしまった。だって 1000kYEN の品が未開封中古で 250kYEN なんだよ。普通気絶しちゃうよね?
といいつつ、2ch UXGA 液晶スレッドに最初の書き込みがあってから延々 3 日ほど悩んで、購入者のレポートが出た時点で購入を決意。やー Parhelia で 3840x2400 が出せるとは思えないけど、せめて 1920x1200 は出せると信じたい。
という訳でめっちゃ貧乏になりました。当分無駄遣いはできません。商品到着と支払いは 4/26 の予定。
一応絵だけなら aviutl に表示できるようになったけど、ファイルを閉じるところで例外が発生してしまう。メッセージループ無しでもいけそうだからといって close の時に WM_CLOSE を PostMessage() してそれからメッセージポンプを回すのは駄目だったのか。
やっぱりスレッド起こして、その中でウインドウ起こさなきゃ駄目なのかも。手間が数倍に増えるのがいやで手を抜いたのだけど、とりあえずスレッド化を試してみるか。
なお、swf では YUY2 のメリットが存在しないため、swf.aui の開発予定は消滅してる。とりあえず今度の土日で絵だけでまともに動くところまで持ってって、来週から音声取り出しに手を出す予定。
物欲バカで書いた QUXGA-W (3840x2400) の液晶ディスプレイが到着。接続および動作テストも完了。素の Matrox Parhelia 128MB で、シングルモニタの 1290x1200@40Hz およびデュアルモニタでの 3840x1200@40Hz に成功。
とりあえず、3840x1200 を見た時点で、これは読めない(現在の視力 0.1 以下)と判断して 1920x1200 (W-UXGA) での使用を決意。ただ、ネタの為に一度は 3840x2400 解像度も拝んでおきたいので、Parhelia の Tweek ツールで 1920x2400@20Hz が作れないか試してみる予定。
あと 40Hz では 60fps 動画 (某 saturn さん作) のフレーム落ちが目立つので、デュアルモニタで(片方の解像度を 960x1200 にして)1920x1200@60Hz が実現できないかも試してみる予定。
今まで使っていたモニタは EIZO FlexScan T761 だったのだけど、色に関して違和感を感じてない。多分 ICM とかがうまく働いてくれてるんじゃないかと思ってる。後、ドット欠け(常時点灯 - 白)が一個あったけど、これはまあ仕方がないかと納得済み。
ようやく HDTV フル解像度 (1920x1080) を表示できる環境ができたか……うふふふふふ。
広いデスクトップで快適プログラミング。だったはずなんだけど、実際コードを書くのはたいそう快適な環境になったのだけど。どうして CreateWindow したスレッドとは別のスレッドから OleDraw 呼ぶと真っ黒な画面しか描画されなくなるのだろう。
いやまあ OCX を窓を出さずに使おうという腐った性根がいかんといわれればその通りで、スペックはオープンなんだから自力でデコードすればウィンドウやメッセージに悩まされることもなくなるというのは判ってるんだけど。
OleDraw とスレッドの問題については、勘違いだったということが判明。無理やりメッセージループで処理するようにしても改善しなかったので調べてみたところ、OleDraw に渡す RECT の初期化を忘れていた。
が、公式ページからダウンロードしてきたファイルフォーマット仕様書が間違ってるのはどういうわけなんだろー。圧縮 SWF だとシグネチャは FWC だとか書いてあったのに、実際にファイルを覗いてみると CWS が圧縮ファイルのシグネチャだし。
後ヘッダぐらいは無圧縮で入れててくれないものなのかね。OCX 経由だとフレームレートが取れなかったのでヘッダを読むことにしたのだけど、圧縮 SWF フォーマットだと、ファイルサイズ以降が全部 zlib で圧縮されてるせいで全展開しなきゃいけないし。音を止める方法がさっぱり見つからないしで swfdec をウィンドウズに移植した方が楽かもとか考え出してしまう。
問題が完全に解決した訳じゃないけど、これ以上調べても解決する見込みがないので、現状のまま swf_vfp-0.1.0.lzh を公開。
わたなべごうさんの日記の ATL のソースをほぼそのまま使わせてもらっています。また圧縮 SWF ファイルのヘッダ展開に zlib-1.1.4 も使用しています。
利用に際して必要な条件がいくつかあって、かなり人柱向けアイテムとなっているので、その辺、覚悟完了された方だけ手を出すようにしてください。詳しくはアーカイブ内の readme.txt を呼んでください。
Windows XP Driver Development Kit CD-ROM が到着。2ch で YC 伸張スレッドが盛り上がってたときに、YUY2 の DirectDraw での扱い方について DDK ではどー記述されてるのだろうと調べてみたくなり、送料のみで $25 で買えるらしいから買っとくかと注文したものだったり。
メールを確認してみたところ、出荷が 4/14 日で到着は今日。異様に時間がかかっているけど、まあこんなものなのかもしれない。これから中身を確認するところ。
大体想像がついてる人もいるかもしれませんが、48, 53, 67, 72, 164, 170, 189, 192, 235, 239, 244, 248, 250 は私の書き込みだったりします。それ以外では書いてません。
私は AviUtl の YUY2 出力での飽和処理に気づいてなかった人間だったりするので、214 さんを私扱いすると失礼ですよと。こちらでも確認しましたが、この処理は弁護の余地がないですね。ここだけでも直して GW 中に 0.98e をリリースして欲しい(SSE2 対応/内部 YUY2 化は後回しでいいから)ところです。
まず swf.vfp ver. 0.1.1 から。とりあえず変換中に落ちないようにしてみました。結局 GotoFrame() および OleDraw はメッセージループの中に押し込めることになってしまいました。
こんなことならソース判りやすくするためとか言って一度中に入れたのを出さなきゃ良かったと思いつつ、この修正で AviUtl の再生ウィンドウで流しても例外が発生しないようになってくれたので結果オーライという感じで 0.1.1 としてリリースします。
とりあえずこの辺で寝ます。起きた後の予定は m2v.vfp に連番ファイル名読み込み機能追加、mme.exe の出力ダイアログでの拡張子付加、MPEG-2 PS ファイルのストリーム単位ズレ量報告ツール作成ってな優先順になってます。swf.vfp 側での出力サイズ指定機能はその次で、音声対応はそのさらに先〜。
m2v_vfp-0.6.31.lzh です。連番ファイルの読み込み機能他を追加しました。それなりにテストはしたのであからさまなバグは残ってないと思いますが、変更箇所が(ファイルの読み込みという)かなり根っこの部分になっているので、バグが残っていた場合致命的なことになります。
一応 0.6.30 と比較して問題がないか調べてから使うようにしてください。問題があった場合は、はやめに知らせてくれると嬉しいです。
MPEG PS のストリームズレ調査ツールは必要なくなったみたいなのだけど、その代わりに 0.6.30/0.6.31 のバグ報告メール到着。GOP List 作成時にランダムアクセスで表示されるフレームがずれてしまうらしい。
AviUtl で手動 24fps 化をされてる方らしいので、まず誤報の可能性は低いだろうと原因の調査中。だけど、2時ごろまで調べて判らなければ寝てしまう予定。今年は暦通りの休みしか取れなかったので。
後は 95/98 系だと swf.vfp が GDI リソースリークで動かなくなってしまうそうなので、OleDraw 周りの GDI リソースの解放をもっと厳密にやって見る予定。手元に 95/98 系 OS がないから確実に修正できたか判らないのが問題なんだよなー。
MPEG-2 VIDEO VFAPI 0.6.32 を公開しました。0.6.30 でのエンバグの修正がメインです。0.6.30 で closed GOP フラグを読むために gop header をパースするように修正したのですが、その際ファイル先頭で broken_link フラグを立てていたのを落としてしまっていました。
非 closed GOP なファイルで、無視すべき先頭の B ピクチャをカウントしてしまい、そのため、シーク時にフレームのファイル先頭の B ピクチャの数だけズレが発生します。0.6.30 を使っている方は更新されることを勧めます。