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 を参照してください。