2011年4月28日木曜日

avs2pipemod その2

バグ修正、および新機能の追加等を行いました。

*'packedraw'オプションを追加
入力がpacked format(RGB32/24、YUY2、Y8)のときのみ使える限定機能。
RAW(非圧縮)データをそのままなんのヘッダーも付けずに標準出力します。
RGBをYUVに変換せずに出力したい、及びavisynth2.5でYUY2をYV12に変換せずに出力したい場合に使います。
YV24/YV16/YV411/YV12はY4Mで出力できるので、あえてRAWで出力する必要はないかと思い対象から除外。
実際にこれを使うとすれば、*nix+wineでavisynthを使っていて、これらのデータをネイティブなFFmpeg/MEncoderに入力したい場合くらいでしょうかね。

しかし我ながら、なんとも間の抜けた響きのオプション名ですな…orz

バイナリはこちら
更新したので削除

ソースはこちらへ
https://github.com/chikuzen/avs2pipemod

2011年4月26日火曜日

avs2pipemod

ここ最近、avs2pipeのコードをずっといじっておりました。

最初はavisynth2.6用にYUV444やYUV422でYUV4MPEG2出力出来る機能を追加するだけのつもりだったのが、ついでに自分のほしい機能を幾つか追加したり既存の機能を自分向けに改造したり色々試していたらこうなった。

オリジナルとの違い

*'audio'オプションの他に'aud16''aud24'というオプションを作った
aud16はConvertAudioTo16bit、aud24はConvertAudioTo24bitを入力音声に追加して出力を行う機能。
avs2pipeの売りの一つはvfwインターフェイスを通さないから音声の16bit整数自動変換を避けられることなんだけど、世の中にはあえて32bit浮動小数点を16bit/24bit整数で出力したいということもあるだろうと思い追加した。
スクリプトにConvertAudioTo16bit/24bitを書けばいいだけなのだが、こっちのほうが多分楽である。

*'video'オプションを'y4mp''y4mt''y4mb'の3種類に変更
avs2pipeの'video'オプションは、avsがフィールドベースだったらインタレと判定し、さらにAssumeBFFしていればBFF、それ以外はTFFとして扱うようになっている。
しかし、この判定を利用するためにわざわざスクリプトにAssumeFieldBased().AssumeBFF()とか書くのはどうも煩雑に感じる。
ということで、あえてオプションでフィールドオーダーを指定することにした。
y4mpを指定すれば問答無用でプログレ、y4mtならTFFなインタレ、y4mbならBFFなインタレとしてY4M出力を行う。

*入力がフィールドベースだったときのフレームベースへの変換
上記のvideoオプションの変更を行ったことで、あえてフィールドベースでの入力を許容する意味が無くなってしまったので、強制的にフレームベースにしてしまうことにした。
もしY4M出力時に入力がフィールドベースだったら、AssumeFrameBased()かWeave()を行う(手動選択)。

*'info'の出力情報を変更
pixel_type(色空間)を16進数表示って手抜きすぎるだろってことで、ちゃんとRGB32とかYUY2とか表示するようにした。

*経過時間の表示
音声/Y4M出力終了時に総経過時間を表示するようにした(途中経過はなし)。
bashなりを使っていればtimeコマンドがあるので本当は不要だが、まあ、'time 'と5文字打つ手間が省けるということで。

*'benchmark'オプションを追加
いままで筆者はフィルタのスピードを計測するのにavs2aviかx264cliをNULL出力で使っていたが不満な点があった。
avs2aviはvfwインターフェースを通してavsを読むため、読み込み時に余分な処理が入る。
x264はCインターフェースを使うからavs2aviよりも速いが、たとえpreset ultrafastでも必ずエンコード処理が入る。
そしてどちらもNULL出力とはいえ、書き込み処理も一応入る。
そういう不満を解消すべく作ったのがこのbenchmarkモードである。
処理内容はひたすらavs_get_frame()とavs_release_frame()だけを繰り返し、50フレームごとに途中経過を報告する。
時間計算/表示以外の余分な処理は一切入らないから、理論上はこれが最速だろうし、実際x264よりもわずかながら速い(環境によっては遅いかも知れないけど)。
つーかx264速すぎだろ…こっちも時間計算はdoubleではなくint64で行うべきなのかなぁ…
ちなみにCインターフェースなので、SetMTModeとか使ってる人はDistributor()が当然要ります。

*Y4M出力時のstdoutのバッファを拡張
これはもともとオリジナルの作者のdoobry氏がすでに実装しているようなのだが、現時点ではそれをリリースしていない。
参考:http://forum.doom9.org/showpost.php?p=1490576&postcount=59
つーか、何をもったいつけてるのか知らんが一向にリリースしないので、待ちきれずに自分で実装してしまった。
なるほど、彼の言うとおり随分速くなりますね。


ここまでやったところで、一旦公開してみることにします。

追記:試しに時間計算でx264を真似てみたら、本当にわずかながら速くなりました。
追記:ひどいバグを見つけたので公開停止。
追記:更新しました

ソースコードが欲しい人はこちらへ。
https://github.com/chikuzen/avs2pipemod

とりあえずひと月ほど待っても彼が新バージョンをリリースしないようなら、Doom9でも発表してしまおうかな。