フィールドオーダーの明示
フィールドオーダーを明示する理由 †
AviSynth では、次の 2 つのフィールドオーダーを区別して考える必要があります。
- ソースクリップ本来のフィールドオーダー
- AviSynth が仮定するフィールドオーダー
本来ならば両者が一致すればいいのでしょうが、現状*1では、すべてのケースにおいて必ずしも一致するとは限らないようです。このため、ソースクリップの種類とそのソースを開くフィルタによっては、AviSynth スクリプトの中でフィールドオーダーを明示する必要が出てきます。
DGMPGDec を使って MPEG ファイルを開く場合 †
Donald Graft 氏作*2の DGMPGDec*3 では、ソースストリームのフィールドオーダーフラグを AviSynth に渡します。このため、DGMPGDec を使って MPEG ソースを開く場合、AviSynth のスクリプトでフィールドオーダーを明示する必要はありません。*4
その他の場合 †
AviSynth は、ソースクリップ本来のフィールドオーダーがどちらであるかに関わらず、
- AviSource フィルタで AVI ファイルを読み込むとボトムフィールドファースト
- MPEG2DEC(MPEG2DEC2、MPEG2Dec3)プラグインで MPEG-2 ファイルを読み込むとトップフィールドファースト*5
と仮定すると言われています(その他のソース/フィルタについては不明)。
このため、MPEG 以外のソース、または DGMPGDec 以外のフィルタを使って MPEG ファイルを開く場合、「ソースクリップ本来のフィールドオーダー」と「AviSynth が仮定するフィールドオーダー」とが必ずしも一致しない可能性があると言えます。このようなケースでは、フィールドオーダーの確認を行って、スクリプトの中でフィールドオーダーを明示した方が無難と言えるでしょう。
このページでは、スクリプトの中でフィールドオーダーを明示する方法を紹介します。フィールドオーダーを確認する方法ついては、フィールドオーダーの確認を参照してください。
フィールドオーダーを明示する方法 †
AviSynth でフィールドオーダーを明示する方法は、2 つあります。1 つは「AssumeFrameBasedとComplementParityを組み合わせる方法」、もう 1 つは「AssumeTFFまたはAssumeBFFを使う方法」です。
どちらの方法を使ってもかまいませんが、その違いについては把握しておく必要があるでしょう。両者の違いについては、2つの方法の違いを参考にしてください。
AssumeFrameBasedとComplementParityを組み合わせる †
AssumeFrameBased は、本来、クリップがフレームベースであると仮定するフィルタです。ただし、その際、クリップのパリティが false に設定されるため、単独で使用するとボトムフィールドファーストに設定したのと同じことになります。
そしてパリティを反転する ComplementParity を AssumeFrameBased の後に適用することで、結果的にトップフィールドファーストに設定することが可能となるのです。
トップファーストの場合 †
- 使用例
AviSource("example.avi") AssumeFrameBased().ComplementParity()
またはAviSource("example.avi") AssumeFrameBased() ComplementParity()
ボトムファーストの場合 †
- 使用例
AviSource("example.avi") AssumeFrameBased()
AssumeTFFまたはAssumeBFFを使う †
TFF は TopFieldFirst (トップフィールドファースト)、BFF は BottomFieldFirst (ボトムフィールドファースト)の略です。そして、AssumeTFF と AssumeBFF は、その名の通り、クリップのフィールドオーダーをそれぞれ TFF または BFFと仮定(assume)するフィルタです。
トップファーストの場合 †
- 使用例
AviSource("example.avi") AssumeTFF()
ボトムファーストの場合 †
- 使用例
AviSource("example.avi") AssumeBFF()
フィールドオーダーを明示する位置 †
インターレースの処理に関連するフィルタ(インターレース解除や逆テレシネなど)よりも前に、フィールドオーダーを明示する必要があります。
AviSource("example.avi") YourDeinterlacer() # インターレース解除フィルタ AssumeTFF()
もしこのようにインターレース解除フィルタより後にフィールドオーダーを明示すると、AviSynth が仮定するフィールドオーダーがそのまま使われることになります。
2つの方法の違い †
- AssumeTFF/AssumeBFFは、AviSynth v2.0.5以降に内蔵されている。
- AssumeFrameBasedは本来クリップがフレームベースであると仮定するためのフィルタ。ComplementParityと組み合わせることによって、結果的にフィールドオーダーの指定が可能となる。
- クリップがフレームベースであると仮定されていないと、SeparateFieldsなどのフィルタが使えない。このため、AssumeTFF/AssumeBFFを使う場合も、AssumeFrameBased()は必要となる可能性がある。
*1 v2.5.7 現在
*2 元は DVD2AVI から派生したソフトですが、現在ではそのソースコードのほとんどがオリジナルのものに置き換えられているそうです。
*3 DGIndex と DGDecode プラグインなどからなるパッケージ。ソースの読み込みには MPEG2Source フィルタを使用する。ビデオ入力も参照。
*4 もちろん、念のため、フィールドオーダーを明示してもかまいません。
*5 Stuttering PAL source (previously: Quick MVbob problem) - Doom9's Forum には、「MPEG2Source フィルタを使用する場合はフィールドオーダーの設定は不要」という話がでており、DGMPGDec 同様、フィールドオーダーが正確に反映される可能性もあります。ただし、この話が MPEG2DEC の MPEG2Source フィルタも含めた話なのか、DGMPGDec の MPEG2Source フィルタを使用した場合のみの話なのかは不明です。念のため、フィールドオーダーを明示した方が無難と言えるでしょう。