2011年6月5日日曜日

FCollections.dll

RawSource.dllの改造も一段落ついたような気がしたので、なにか新しいものを書いてみたくなりました。

あまり難しいものは書けそうにないし、そもそもネタもない。
なにか簡単そうなやつがいいということで、あれこれ考えているうちに目をつけたのがfilter script用関数。
つまりint()とかstring()とかIsClip()とかの類のことですね。
すでに役に立ちそうな関数はあらかた本体の方に揃っているので、それほど役に立つものは書けないだろうけど、初心者の学習用には調度良いような気がしたのでやってみました。

FCollections-20110604.zip
https://github.com/chikuzen/FCollections

以下、説明。

必要なもの:
AviSynth2.5x or later
SSEが使えるマシン(拡張命令セットでSSE有効にしています)
msvcr100.dll

TimeStringToMilliSecond(string "time string"):
時間をあらわす文字列"xx:xx:xx.xxx"をミリ秒単位の整数に変換します。
関数名がやたら長いのでTS2MS()でも使えるようにしてあります。
最初は秒単位の浮動小数点に変換するつもりだったのですが、AviSynthスクリプトはdouble(倍精度浮動小数点)をfloat(単精度浮動小数点)にキャストしてしまうようで、仕方なく整数で返すようにしました(floatの精度では酷い誤差が出てしまう…orz)
SSE搭載マシン(PentiumIII)の発売が1999年、AviSynth2.5の開発はavisynth.hによれば2002年ですから、倍精度をサポートしてないのは首をひねってしまうところですが…。

GCD(int val1, int val2, ...):
最大公約数を返します。

LCM(int val1, int val2, ...):
最小公倍数を返します。

Fibo(int n):
フィボナッチ数を返します。
AviSynthスクリプトの扱える整数は(今のところ)int32_t(-2147483648から2147483647)なので、フィボナッチ数は46(1836311903)までしか扱えません(47は2971215073でout of range)。
0を含めて全部で47しかないなら、わざわざその場で計算させることもなかろうということで、テーブル化してしまいました。
はたしてこれに使い途があるのかどうかはさっぱりわかりません。

IsEven(int n):
nが偶数ならtrue、奇数ならfalseを返します。
(n % 2 == 0)と同じですね。

Clamp(val, low, high):
StickBoy氏のMinMax.dllのやつと全く同じです。
valがlowより小さければlowを、highより大きければhighを、lowとhighの間の値だったらvalをそのまま返します。
FCollectionsを書くに当たって参考にしたのがまさにMinMax.dllのコードだったわけですが、Min()とMax()はAviSynth2.5.8で本体にも入ったのにClamp()は入ってないのでついでに入れてしまいました。

なにか追加してみたい関数が見つかったら、更新するつもりです。

0 件のコメント:

コメントを投稿