niiyan's blog

niiyanの個人ブログ。

Bob リサイズ -> AssumeTFF/BFF -> SelectEvery(4,0,3)

インターレース素材に対してインターレース未対応のフィルタを適用したい場合に、Bob デインターレースしてからフィルタを適用し、またインターレースに戻すという方法があります。古いもので動作の保証はありませんが、拙作のiFilterB 関数 でもこの方法を使っています。

ところで、このインターレースに戻す過程では、SelectEvery フィルタを使ってフレーム(フィールド)を選択します。その際注意しなければいけないのは、AssumeTFF/AssumeBFF 関数でフィールドオーダー(優先度)を指定してから、SelectEvery の引数を "4,0,3" にすることです。

具体的には、下のような感じになります:

# フィールドオーダーを指定
AssumeTFF() # または AssumeBFF()
# Bob デインターレース
Bob() # またはその他の Bob フィルタ
/*
 お好みのフィルタを適用
 */
# フィールドオーダーを再指定
AssumeTFF() # または AssumeBFF()
# フィールド分離
SeparateFields()
# フレーム(フィールド)選択
SelectEvery(4, 0, 3)
# 結合
Weave()

とくに AviSynth 内蔵の Bob フィルタなど一部のフィルタでは、Bob 適用後にボトムフィールドファースト(BFF)に強制されるため注意が必要です(少し前に確認したものなので、最新版の AviSynth ではどうなっているか未確認です)。AssumeTFF/AssumeBFF で再指定してやらないと、SelectEvery による結果が期待したのとは異なるものになることがあります。

ちなみに、SelectEvery(4, 1, 2) にすると、フィールドオーダーが逆になります。昔、私が書いた記事では、「トップフィールドファースト(TFF)の場合は "SelectEvery(4, 1, 2)" にする」と書いていたと思います。これは、Bob フィルタで TFF -> BFF となったクリップが、結果的に SelectEvery(4, 1, 2) によって TFF になるというものでした。ただし、Bob フィルタの挙動によっても変わってきますので、やはり AssumeTFF/AssumeBFF -> SelectEvery(4, 0, 3) とした方がより確実だと思われます。

なお、技術的な説明に関しては、deinterlacing BFF/TFF - which SelectEvery setting ? - Doom9's Forum を参照してください。