新バージョンです。変更点は逆量子化処理の高速化だけでバグ修正が入っている訳ではありませんから、速度よりも安定性重視の方は落とさない方が良いでしょう。最適化時にバグを入れている可能性もあるので。
今回の逆量子化最適化は AAN IDCT の処理を眺めているときに思いついたものです。0.6.18 以前のバージョンでは逆量子化の際に「量子化重み=量子化行列×量子化スケール」と「DCT 係数=VLC レベル×量子化重み」の2回の乗算を行っていたのですが、0.6.19 では量子化スケールが決定した時点であらかじめ量子化重みを計算しておくことで、逆量子化処理単体での乗算の数を1つ減らすことにしました。
通常、量子化スケールの更新頻度はさほど高くないために量子化重みを逐次作り直す処理が加わっても逆量子化で乗算を一つ削除できた高速化の効果が確認できるのですが、量子化スケールの更新頻度が高いファイルでは遅くなる可能性があります。
ファイルのビットレートにもよりますが、量子化スケールを持つマクロブロックの割合が 20 % 以下であれば今回の更新による速度の改善効果が得られるはずです。
追加更新です。Ver. 0.6.19 では Ver. 0.6.18 と比較してデコードが遅くなる MPEG ファイルが存在するようなので、逆量子化処理の高速化方法をさらに変更してみました。
Ver. 0.6.19 では、量子化スケール付きの MB の出現率はさほど高くないだろうという予想を元に量子化スケールが変更された時点で重みテーブルを作り直していました。実際テストした範囲では十分な高速化効果が確認できたので 0.6.19 として公開したのですが、その後さらに別のファイルでも調べてみると、デコードが遅くなるファイルが存在したのです。
そこで、実際に量子化スケール付き MB の出現率を調べて見ると、5% 以下のもの(SONY C1MR 内臓エンコーダ)や 10〜25% 前後(NHK Digital BS や Canopus MTV シリーズ、TMPGEnc 等)さらに 45 〜 70% のもの(エンコーダ詳細不明)等、MPEG エンコーダによって出現率が全然違うことが判明したのです。このうち、Ver. 0.6.19 でデコードが遅くなるのは量子化スケール付き MB の出現率が 66% とかいう素敵な MPEG ファイルでした。
HD 映像で 66% も量子化スケール付き MB があれば、量子化スケール情報だけで 807 kbps も使ってる事になるわけ(量子化スケールは 5 bit 占有するため (1920/16)*(1088/16)*0.66*29.97*5 で計算可能)なので、明らかにレートコントロールとしてはやりすぎのように思えるのですが、そのようなファイルが存在する以上仕方がありません。テーブルのサイズが大きくなるのは嫌だったのですが、量子化スケールコードの 32 パターン全てを網羅する量子化重みテーブルをピクチャヘッダのタイミングで作成し、逆量子化処理ではそのテーブルを参照するように作り変えました。
度々ダウンロードを強いて申し訳ありません。バグ修正です。0.6.19 で追加した SSE2 逆量子化テーブル作成コードにバグがありました。2ch / DTV 板 / AviUtl スレッド 10 / 370&386&398 さん、サンプルありがとうございます。
0.6.19/0.6.20 を Pentium 4 で利用されている方は、0.6.21 に更新してください。0.6.19/0.6.20 で SSE2 有効にしているとシーンチェンジ等で色ノイズが発生することがあります。
referrer に入ってた dvdrhelp.com や doom9.org の forum のスレッド(これ とか これ)を見ると、MPEG-2 VIDEO VFAPI Plug-In が原因で、アクセス違反やゼロ除算が発生しているように見えるのですが、そういったバグを発症させることができるファイルを持っている方、サンプル提供していただけないでしょうか。
エラーメッセージを見ると不正なオーディオデータへの対応が不十分なためにエラーを起こしているように見えるのですが、それでも対象範囲が広すぎてそこから先の原因特定ができずにいます。エラーを発生させるサンプルさえあれば原因は一発で特定できるので、すぐに修正できると判断しています。
ftp://www.marumo.ne.jp/incoming/ で 2G 以下のファイルでしたら受け取れますので、おねがいします。
なので昼休みに立ち読みを済ませてなごんでいる。「Honey」の連載誌の発売日な為。土日は西尾維新「戯言使い」シリーズ5冊を読んだり「MELTY BLOOD」を真・最強の敵まで見たりしてたので寝不足だったけど、多少仕事をする気力が復活。
えーと情報やサンプルを提供してくれるのはとっても嬉しいのですけど、もう少し詳細な再現方法とかも教えていただけるともっと嬉しかったりします。
それ Fraunhofer のバグだろうとか。アーカイブが壊れてますと言われる lame-3.92.lzh を渡されてどうしろというのだろうとか。落ちる m2p ファイルが頂けたと思ったら、私の環境だと再現しなくて、何か設定がまずいのかと設定をしらみつぶしに変更しながら試してそれでも再現できなくて、結局サンプル提供者にエラーが発生する環境の情報を教えてくださいとお願いしたりとか……。
ちょっと疲れてます。ええ、寝不足なのは遊んでいたからだけという訳ではないのです。
この話の後日談。std::string と std::list を排除したものを先月末に渡してたのだけど、今日になってから「new した瞬間に落ちるから C++ 止めて C だけにできないか」という相談が。
せめて C++ ぐらい使わせてください坂村先生。組み込み向けでファイルシステム付きで C プログラミングができるだけ感謝しろとか言われそうな気もするんだけど。
Advance-3rd Software Licensing Org で公開されている MRS 1.41 が非常に使いにくかった為、代用品としてゴミを作成。投棄。
以下、MRS 1.41 の不満点。
もっとも、今回投棄したものも普通の人にとっては大幅に使いにくいものだろうから、あまり強いことは言えない。普通の人でも使える形にしとかなきゃと思ってはいるのだけど、それよりも先に MPEG のファイルチェッカを作りたい気分。
基本的にはバグ修正です。MPEG ファイルにエラーが存在した場合、ピクチャのデコード中に、次のピクチャのスタートコードを通り越してしまい、結果フレーム落ちを発生させることがあったので回避用のコードを追加しました。
後は怪しげな英語もどきの readme.en.txt を追加しただけで、それ以上のことはしてません。0.6.18 で特に不具合が出ていない場合はダウンロードする必要は無いと思います。
「アセンブリで読む桃太郎」って…… 22 世紀にも Intel MMX コードは生き残っているのか。
avisynth.h の新ライセンス「バイナリだけで配布しても OK よ」というだけで「avisynth.h を不自由なプログラムと同じアーカイブで配布しても良い」とは読めなかったのですが、間違ってるでしょうか。
現状 Intel C 専用(手抜きして __declspec とか使ってるため)になってしまっていますが、コンパイルする場合は avisynth.h を foo.bar.baz から落としてソースフォルダと同じ場所において make してくださいとか説明書きをするのもばかばかしいし、GPL だと書いてあるのをどーどーと不自由なプログラムのアーカイブに含めて配布するのも怖いので様子見してます。
LoadAviUtlInputPlugin 経由で YUY2 読み込みも avisynth のネイティブインタフェース経由も速度差はそれほど無いので、強いて搭載する必要はないかと。引数をスタックにつんで関数を一回呼ぶステップが入るだけなので、数百万フレームでやっと 1 秒違いが出る程度の差しかないはずですから。
あー偉そうなこと書いた端からとある事実発覚。これの時に avisynth 用のコードが失われていた。mpeg2/old/ のも消してしまったから残ってないし、家サーバからにはそもそもコピーすらしてない。再公開しようと思ったら作らなきゃいけないみたい。
そういえばインタレース解除関連で実験してたコードも失われてしまったのか。頓挫のあげく作り直し決定してたとはいえ結構惜しい。定期バックアップ重要。やっぱり月に一度はソースディレクトリ DVD-R に焼いておくことにしよう。
う、まじめに読み直すと全然違うことが書いてある。「GPL+追加条項の avisynth 全ソースと共にであれば avisynth とリンクする独立モジュールを好きなライセンスで公開してよい」ですか。……なんか複雑な気分。
真・女神転生 III を最優先タスクとして起動中。土日を潰して、昨日も寝ていなかったりするのだけど……。交渉会話がつまらないよう。アクマはただアレよこせ、コレよこせと要求してくるだけだし、こちらはただひたすらに応じるだけ。デビルサマナーシリーズ並みの会話を期待してた私が間違ってたのかな。
えーっと今はイケブクロ坑道で分身ボス相手に1時間ほど闘ったところで時間切れ。思い切り死にやすいのはどうにかして欲しいところなんだけど、まあこういうゲームなのかと思えばそれまでか。
MPEG-2 VIDEO VFAPI Plug-In 0.6.24 公開してます。オーディオの PES パケットの途中で終わっているファイルを開こうとした場合に無限ループに入って帰ってこなくなるバグの修正をしてます。
一部の USB キャプチャデバイスは MPEG のシンタックスを気にせずに単純にボタンを押した瞬間でストリームをぶった切るだけらしく、この問題が発生させるファイルが作成されることがあります。