2011年12月31日土曜日

avs2pipemod その9

更新しました。

avs2pipemod-20111230.zip
https://github.com/chikuzen/avs2pipemod

*ビデオ出力処理をavs2pipeの最新のものから移植。

久しぶりにdoobry氏がDoom9に現れgithubのレポを公開しました。
さっそく最新のコードを見てみると…うーむ、こんな手があったのか。
手元のベンチマーク結果をみてもこれのほうが速かったので、早速パクりました。
つくづく彼のコードは自分にとって素晴らしい教材です。

追記
たくあん氏から、以前のバージョンより遅くなっているとの報告を受けたので、検証して見ました。
#sample.avs
LoadPlugin("DGDecode.dll")
MPEG2Source("1400x1080x2990frames.d2v", idct=3)

これを前回(20110911)と今回(20111230)で比較
pattern1:
 $ time avs2pipemod -y4mp sample.avs > sample.y4m
pattern2:
 $ time avs2pipemod -y4mp sample.avs | x264 - --demuxer y4m --preset ultrafast -o sample.264
pattern3:
 $ time avs2pipemod -y4mp sample.avs | x264 - --demuxer y4m --preset medium -o sample.264

それぞれを3回ずつ回すと(数値はエンコード終了までの時間)
              pattern 1      |      pattern2      |      pattern3
          20110911  20111230 | 20110911  20111230 | 20110911  20111230
1st(sec)   122.094   112.451 |   39.919    42.416 |  181.153   183.238
2nd(sec)   122.200   113.405 |   40.099    42.426 |  183.994   182.490
3rd(sec)   118.490   114.094 |   39.976    42.716 |  184.112   182.664
avg(sec)   120.928   113.317 |   39.998    42.519 |  183.086   182.797
他のエンコーダにpipeせず、直接y4mやrawで保存する場合は20111230のほうが速いです。
そして、他のエンコーダにpipeした場合は、以前の方が速くなります。
エンコーダ側の設定がある程度重くなると律速する…どうしようかなぁ…。

現実的な使用例を考えるとpattern2よりも1か3の使い方のほうが多いと思いますので、このまま行くことにします。

2011年12月9日金曜日

AviSynth Script Reader for AviUtl

VFR_maniac改めMP4_maniac氏がlsmashinput.aui(L-SMASHとLibavを利用したAviUtl用入力プラグイン)を発作的に書き始めてしまったのに付き合っていた流れで、AviUtlの入力プラグインの書き方が少しだけ理解できるようになった。

AviUtlといえば前から不思議に思っていたのが「なぜavsを読むのにわざわざ別に入力プラグインが必要なのか」である。
そもそもAviSynthはスクリプトをAVIに偽装するソフトウェアである。
もし任意のソフトウェアがVFWのAVIFileOpen関数を使って拡張子がavsのファイルを開こうとすれば、レジストリ登録情報によりavisynth.dllが動いて、ただのテキストはAVIとして扱われるような仕組みになっている。
AviUtlにはVFWを使用する入力プラグイン(AVI File Reader)が内蔵されているのだから、本来外部プラグイン(avsinp.aui)は必要ないはずなのだ。

で、このたびPluginSDKのサンプルコード(avi_input.cpp)を読んでみたら、疑問はすぐに解決した。
AviUtlは、まずファイルの拡張子を見てプラグインが対応しているかどうかを判別するため、*.avsというファイルはAVI File Readerには渡されないというだけのことだった。

てなわけで、ちょっと実験。
まず、avi_input.cppのINPUT_PLUGIN_TABLE構造体のfilefilter変数の中身を*.aviから*.avsに変更。
入力プラグイン名をAviSynth Script Reader (VFW)にして、コメント以外の日本語文字を除去(CP932は色々面倒)、ついでにファイル名を.cppから.cにして(avi_input.cppはC++ではなくCで書かれている)、あとはGCCでコンパイルしてやれば…
gcc -c avi_input.c -o avsread.o
gcc -o avsread.aui -shared -Wl,--dll,--add-stdcall-alias avsread.o -lavifil32
ああ、読めた。

つまり、KENくん氏が内蔵のAVI File Readerに拡張子*.avsを追加してくれれば、avsinp.auiは要らなくなるんだよなぁ…。