2011年5月7日土曜日

avs2pipemod その5

しつこく更新。
一つ一つの関数が長すぎるのをなんとかしようと、分割したり色々していたら、いつの間にか一部の機能が変わってしまった。

 *'packedraw'を廃止して'rawvideo'に変更
 これまでは映像のraw出力はpacked formatのみでしたが、planar formatでも出来るようにしました。
 planar YUVの出力部はYUV4MPEG2と共通なので、planeの並び方はY->U->Vに限定されています。
 この並び方はffmpeg/libavのpix_fmt(YUV444pとかYUV422pとか)と同じなので、使用上の都合はYV16やYV24(並び方がY->V->U)より良いのですが、いくら探してもFourCCみたいなものが見つかりません。
 x264のfullhelpでは、これをi422とかi444と書いていますが…そんな呼び方、他所では聞いたことがない。
 どうもkemuri_-9氏が、i420を真似て自分で作ってしまったのではないだろうか…。

追記:Y8の処理でバグがあったので修正、バイナリを更新しました。

バイナリ
更新しました

ソース
http://github.com/chikuzen/avs2pipemod

2011年5月4日水曜日

avs2pipemod その4

更新。 いろいろオプションを増やしすぎた感じがしたのでgetoptを使うことにしました。
その他、いろいろ書きなおしたりヘッダーファイルを追加したりあれこれ…かえってカオスな感じになったような…

使い方は以下のようになります。
avs2pipemod -audio=24bit input.avs | neroAacEnc -q 0.3 -if - -of output.mp4
avs2pipemod -y4mt=40:33 input.avs | x264 - --demuxer y4m -o output.mkv
aud16やrawaud24とかはなくなり、かわりにオプションの後ろに'=16bit'とかを付けるようにしました。
付けない場合は、音声出力なら変更なし、y4m出力ならアスペクト比の指定なし(0:0)として扱われます。

あと、x264bdの出力をx264のr1936以降(--bluray-compatあり)用に変更(正直、自分にはほとんど興味のない分野だけど…この機能、使ってる人いるのかな?)。
こちらもこれまでのように、avsのフィールドベース/フレームベースによる判定ではなく、'=tff(bff)'で、インタレの判定を行います(ところでBDでbottom firstってありえるのかいな?)。

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

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

2011年5月1日日曜日

avs2pipemod その3

更新しました。

 *YUV4MPEG2出力時の色空間変換を改良
 これまでの色空間変換はインタレやBT.709は特に考慮されていませんでしたが、今回の更新で対応しました。
 高さが720以上のRGBはRec.709でYUVに、またy4mt/y4mbの際に他の色空間からYUV420で出力する場合はConvertToYV12(interlaced=True)の処理が入ります(これまではすべてinterlaced=falseで処理されています)。

追記:
さらに更新。

 *新オプション'rawaudio''rawaud16''rawaud24'を追加
 このツールの音声出力はwav extensible formatという、RIFF-WAVE(いわゆる.wav)の拡張形式を使います。
 ただのwavよりもいいところも色々あるのですが、あまり一般的ではないため、いくつかのオーディオエンコーダー(例:LAME、oggenc2等)はこれを入力として受け取ることが出来ません。
 今回の新規オプションはこの対策のため、ヘッダーの全くない生のPCMとして出力します。

バイナリ
更新したので削除

ソース
https://github.com/chikuzen/avs2pipemod

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でも発表してしまおうかな。

2011年3月5日土曜日

AviSynth2.6.0α on *nix

以前やったベンチマークがWindowsだけであることに、某フランス人が不満そうだったので。
#benchmark.avs
ImageSource("Z:\home\chikuzen\Pictures\1920x1080.bmp", 0, 999)
BlackmanResize(720, 480)  
Spline64Resize(1920, 1080)  
GaussResize(512, 384)  
 
$ for i in {1..3}; do wine avs2avi benchmark.avs -c null -o n; done
 
            2.5.8                 2.6.0α(JEEB's)
1st   00:03:40.414 (4.54fps)   00:01:56.483 (8.58fps)
2nd   00:03:32.149 (4.71fps)   00:01:56.722 (8.57fps)
3rd   00:03:31.894 (4.72fps)   00:01:56.471 (8.59fps)
 
Ubuntu 10.10 / wine 1.3.14
Core2Duo T7300@2GHz / 2GB RAM
やっぱり速いよ、2.6.0。