2008/03/25

FilterRange

AviSynthでFilterRange関数を使うと指定範囲のみにフィルタを適用出来るというのがあります。
FilterRangeを使ってクリップの最終フレームを含んだ範囲に適用させると
最終フレームの後に1フレーム追加されるバグがあるようです。

にーやん氏の改造した関数をメモ

function FilterRange(clip clip, int "start", int "end", string "filter")
{
final_frame = clip.FrameCount()-1
Assert(end <= final_frame, "end が最終フレームよりも大きい")
c1 = start < 2 ? clip.trim(0, -1) : clip.trim(0, start - 1)
c2 = Eval("clip.trim(start, end)." + filter)
c3 = clip.trim(end + 1, 0)
c = start == 0 ? c2 : c1 + c2
c = ((end == 0) || (end == final_frame)) ? c : c + c3
return c
}


3/26追記
にーやん氏が更に改造を加えたようなのでそっちもメモ
# FilterRange 改造版
function FilterRange(clip clip, int "start", int "end", string "filter") {
# 最終フレーム番号の取得
final_frame = clip.FrameCount() - 1
# デフォルト値の設定
start = default(start, 0) # 指定なしなら先頭フレーム
end = default(end, final_frame) # 指定なしなら最終フレーム
filter = default(filter, "") # あとで例外処理に使う
# 例外処理
Assert(end <= final_frame, "'end' should be less than or equal to " + String(final_frame) + ".")
Assert(filter != "", "'filter' should be specified.")
# start から end までを選択してフィルタを適用し c に代入
c = Eval("clip.trim(start, end)." + filter)
# start が 0 ならそのまま c のみ、1 ならフレーム 0 と c を結合、それ以外は start より前の範囲と c を結合
c = (start == 0) ? c
\ : (start == 1) ? clip.trim(0, -1) + c
\ : clip.trim(0, start - 1) + c
# end が 0 か最終フレームなら c のみ、さもなければ c と end より後ろの範囲を結合
c = ((end == 0) || (end == final_frame)) ? c
\ : c + clip.trim(end + 1, 0)
# c を返す
return c
}

2 Comment(s):

niiyan さんのコメント...

さらに手直ししたものをAviSynth Wikiにアップしました。リンク先の記事にも説明があります。

Karlheinz さんのコメント...

いらっしゃいませ
まさか本人がいらっしゃるとは夢にも思いませんでしたよ(笑
記事の方も追記して修正しておきました。

コメントを投稿