2011年5月30日月曜日

RawSource.dll その4

さて、これまで色々RawSourceのコードをいじって遊んできたわけですが、考えてみれば原著作者であるWarpEnterprises氏の許可は一切取っていませんでした。
avs2pipemodの場合はオリジナルがGPLv3だったのでなんの気兼ねもなくいじってよかったわけですが、RawSourceの場合はライセンスに関する記載が全くありません。
AviSynth自体はGPLv2ですが、プラグインに関しては過去の経緯から作者がライセンスを自分で決めてよいことになっています。
まあ、コードも公開されているわけですから多分問題は起きないとは思うけど、ほおっておくのも気持ち悪い。
てなわけで、とりあえずメールで問い合せてみたら、すぐにお返事が来ました。

Hi!
 The code has no explicit license, so I am glad someone uses it or the ideas behind,
as long as it keeps as open as possible (like GPL describes, I think).
 There were also some small contributions by others, if I remember correctly (Wilbert, billou2k),
which I integrated but not mentioned them (shame on me, didn't care and know much about licenses back then).
I hope it's ok for you if I put your version on my filter colllection website occasionally.

Greetings from Austria,
Ernst / WarpEnterprises

結局ライセンスは決まらずじまいですがとりあえず許可は貰えたので、これからも好きにやってよさそうですね。
よかった、よかった。

気を良くしたので更新
RawSource_25_dll_20110529.zip
*widthの最大値を2880から4096に変更
*引数にfpsnumとfpsdenを追加(デフォルトはそれぞれ25と1)
*エラーチェックを強化

2011年5月23日月曜日

RawSource.dll その3

更新。
ABGRとNV12/NV21をサポートしました。

RawSource_25_dll_20110523.zip

ソースコード
https://github.com/chikuzen/RawSource_2.5x

これでAviSynth2.5でサポートできそうな8bitフォーマットはだいたい網羅できたはず。
次は2.6用に書き直してみるかな。

2011年5月21日土曜日

RawSource.dll その2

ここ最近、avs2pipemodを色々いじったおかげで、C/C++及びYUV4MPEG2/RAWデータ、そしてAviSynthの内部処理への理解が自分としては結構進んだように思います。
なんだかようやく初心者といっても良いレベルになれたかも。

さて、今年の1月にやったRawSource.dllの改造は、実は結構まずいものでした(YUV422なY4Mに対応したようでいて、実はUとVがswapしてしまったりとか)。
どーしたもんかとずっと気にはなっていたけど悲しいことに実力不足で手が付けられなかったわけですが…昨日改めてコードを読みなおしてみたらあらびっくり、理解できるようになっていました。
てなわけで早速修正版リリース。
あとついでに、YV411の対応とか、Y4Mのインタレ周りの処理(これは元々WarpEnterprises氏のころから変だった)の修正とかもやりました。

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

RawSource_25_dll_20060728(WarpEnterprises最終版)からの変更点
*64文字以上のYUV4MPEG2ヘッダーに対応(最大128文字)
*I422(YUV422planar)に対応
*I411(YUV411planar)、YV411(YVU411planar)に対応(出力は色差補間なしのYUY2)
*ARGBに対応
*pixel_type指定にYUY2とIYUVを追加(これまではYUYV/I420しか指定できなかった)
*I420以外の色空間のYUV4MPEG2に対応(ただし、YUV444/YUV444alphaを除く)
*YUV4MPEG2ヘッダーのIタグによるフィールドオーダー指定を修正(これまではなぜかItやIbだとフィールドベースになるという謎仕様だった。なお、Imには未対応のまま)
*msvcr100.dllが必要(どーやったらstatic linkに出来るんでしょうね?)

ソースコードはこちら
https://github.com/chikuzen/RawSource_2.5x

2011年5月14日土曜日

contributor

自分が書いたパッチがx264の公式gitレポにコミットされました。

まあ、パッチと言ってもわずか一行、lavf入力時のエラーチェックを増やしただけなんですが。

2011年4月28日、#x264dev@freenode
(Chikuzen) Dark_Shikari: http://pastebin.com/xxxxxxxx
(Dark_Shikari) explain?
(Chikuzen) e.g x264 - --demuxer lavf --input-csp yuyv420 --input-res ... <- go to fail
(Dark_Shikari) what about ffms?
(Dark_Shikari) and why
(Chikuzen) I mistook yuyv420 for yuyv422 a minute ago
(Chikuzen) but encoding was done, and i wasted my time
(saintdev) yuyvvuy444
(Chikuzen) this is a case in raw input
(Chikuzen) ffms can't accept raw
(Dark_Shikari) ok

パッチを書いた理由も効果も取るに足らないものですが、これでもx264のrevは一つ上がり、晴れて自分はcontributorとしてChangelogに名前がのることになったわけです。

何が言いたいかといえば、
・不具合や不満があるなら開発者本人に伝えること。
 英語が苦手? 俺だってそうだよ。
 "All your base are belong to us"レベルの間違いは山ほどやってらぁ
・どんなつまらないパッチでも、そう変更すべき理由があると思うならちゃんと提出すること。
ですかね。

2011年5月11日水曜日

High-bit-depth AVCデコーダ

この度、ついにlibavにH.264/AVCのHigh bit depth対応デコーダがコミットされた。

思い起こせばx264がhigh-bit-depthをサポートしたのがr1666(2010年7月)だから、かれこれ10ヶ月前。
以来、使いたくてもデコーダがないから使う甲斐が無いというなんとももどかしい状態からやっと開放される時がやって来た!(MainConcept? 悪いけど趣味に合わないんで…)

というわけで、以下、色々なところで起こったちょっとしたお祭り騒ぎの記録より。

#x264dev@freenode
(BBB) irock: 10bit pushed

#L-SMASH@freenode
(Chikuzen) うお、10bitデコーダがlibavにも入った?
(JEEB) yes
(Chikuzen) ええい、mplayer2の次のリリースはまだか
(Chikuzen) JEEB: ちょっとuau氏かlachs0r氏をぶん殴って新しいの出させてきてよ
(JEEB) おう

#mplayer2@freenode
(JEEB) 10bit H.264 decoding got into libav \o/
(JEEB) uau, how much work do you think it'd be to add 10bit H.264 support into mplayer2? libswscale seems to handle 10bit 4:2:0 to "your usual" RGB already :3

秘密の某所にて
(JEEB) 10bit support getting into libav patch-by-patch gentlemen!
(JEEB) YEAAAAAAAH
(elenril) all hail BBB
(JEEB) all hail BBB!
(Dark_Shikari) now we need:
(Dark_Shikari) 1) dither
(Dark_Shikari) 2) support in ffdshow
(Dark_Shikari) 3) make sure normal playback does the dither
(elenril) send patches =p
(Dark_Shikari) 4) cccp release
(Dark_Shikari) elenril: dither patches are already sent
(JEEB) also, just kicked uau on the issue :3
(jfs) ooooh I know, patch vsfilter to render subs on 16 bit/plane surfaces!
(jfs) ._.
(Dark_Shikari) when we switch to 10 bit
(Dark_Shikari) THIS MEANS YOU HAVE TO STOP ENCODING AT 5 BILLION MBPS OK?
(Dark_Shikari) crf 22 is now OK. No crf 14.
(Dark_Shikari) Because you can no longer complain about banding.

#libav-devel@freenode
*Dark_Shikari join #libav-devel
*ChanServ mode +o Dark_Shikari
(Dark_Shikari) so, explain to me how this 10-bit h264 templating works
(Dark_Shikari) and how it'll apply to asm
(Dark_Shikari) and I'll submit some asm patches
(kshishkov) Dark_Shikari: it's easy - you just initialize pointer to different functions depending on bits provided
(Dark_Shikari) kshishkov: I meant how do I make it compile a file twice?
(Dark_Shikari) once with 10-bit, once with 8-bit
(Dark_Shikari) also where the fuck did my fate samples folder go
(kshishkov) Dark_Shikari: templating - define things, include file, redefint things, include file again
(Dark_Shikari) in asm?
(kshishkov) why not?
(kshishkov) even Nasm has %include
(Dark_Shikari) where's the rsync command to download fate samples?
(Dark_Shikari) I lost mine
(lu_zero) Dark_Shikari: there is a make target that should work
(lu_zero) make fate-rsync
(lu_zero) rsync -vaLW rsync://fate-suite.libav.org/fate-suite/ $place
(Dark_Shikari) lu_zero: thx, running
(BBB) Dark_Shikari you're awesome if you do the asm
(Jumpyshoes) has 10-bit been pushed?
(Dark_Shikari) yes
(Jumpyshoes) oh
(Jumpyshoes) well there goes my excuse
(Dark_Shikari) wwww
(Dark_Shikari) so yeah, time to asm

#L-SMASH
(Chikuzen) 10bitがコミットされるやいなや#libav-develにjoinするD_S
(Chikuzen) ホント、現金なアンチャンだこと
(JEEB) ですな
(silverfilain) その貪欲さが彼をあそこまでにしてるんだろうなぁ
(Chikuzen) この前#libav-develでわめき散らしたのはなんだったのかと
(Chikuzen) まあ、君子豹変と言えなくもないが…

#mplayer2
(lachs0r) http://**********/mplayer2-high-bit-depth-20110510.7z

#L-SMASH
(Chikuzen) もう来たのか
(JEEB) いぇす
(Chikuzen) やっぱ、みんな待ち焦がれてたのね


なんで騒いでるのかわからない?
ならばあなたはまだ動画エンコードの泥沼に浸かってない(もしくは足を洗った)一般人ってことですね。
それはとても良いことですから、気にしなくてもいいですよ、いやほんとに。

追記、というか登場人物紹介
BBB  Ronald S. Bultje、Libav developerのリーダー格、ffmpeg-mtや今回のデコーダの不具合解消に大活躍中の人
Chikuzen  筆者
Dark_Shikari  Jason Garrett-Glaser、x264 lead developer
elenril  Anton Khirnov、Libav developer/committer
irock  Oskar Arvidsson、x264のhigh-bit-depthエンコーダ、そして今回のデコーダを書いた人
Jumpyshoes  Daniel Kang、x264 / Libav developer
JEEB  アニオタフィンランド人 兼 二代目CCCP maintainer?
jfs  Niels Martin Hansen、Aegisub main developer
kshishkov  Kostya Shishkov、Libav developer/committer
lachs0r  mplayer2 project member、Windows用ビルド担当
lu_zero  Luca Barbato、Gentoo developer、Libav developer/committer
silverfilain  L-SMASH developer、猫科研究所の中の人
uau  Uoti Urpala、mplayer2 project leader

2011年5月10日火曜日

avs2pipemod その6

…更新。

x264のchangelogを眺めていたらr1939でbluray-compat+fake-interlacedのときはpic-structが要らなくなったと書いてあったので、こっちも削っておくかとコードを見直してみたら…なんか色々、avs2pipe0.0.3の時点で間違ってるようです。

とりあえずNTSC/PALのSDでDARが4:3なソースの場合の対応のために、オプションをまた変更。
これまでのx264bd=tffをx264bdtにしてしまい、=4:3を付けた場合はDAR4:3のソースとみなすことにしました。
具体的には`avs2pipemod.exe -x264bdt=4:3 720x480x60i.avs`といった感じです。
それとBD規格ではやはりBFFはないようなので、x264bdbは作りませんでした。
BFFなソースは事前にDoubleWeave().SelectOdd()でもして、フィールドオーダーをTFFにしてください。

バイナリ
追記:バグあったわ…自分の書いたところでorz
最新は20110510.zipです。
avs2pipemod-20110510.zip

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

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