フィールドオーダーの明示

フィールドオーダーを明示する理由

AviSynth では、次の 2 つのフィールドオーダーを区別して考える必要があります。

  • ソースクリップ本来のフィールドオーダー
  • AviSynth が仮定するフィールドオーダー

本来ならば両者が一致すればいいのでしょうが、現状*1では、すべてのケースにおいて必ずしも一致するとは限らないようです。このため、ソースクリップの種類とそのソースを開くフィルタによっては、AviSynth スクリプトの中でフィールドオーダーを明示する必要が出てきます。

DGMPGDec を使って MPEG ファイルを開く場合

Donald Graft 氏作*2DGMPGDec*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 (ボトムフィールドファースト)の略です。そして、AssumeTFFAssumeBFF は、その名の通り、クリップのフィールドオーダーをそれぞれ 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 フィルタを使用した場合のみの話なのかは不明です。念のため、フィールドオーダーを明示した方が無難と言えるでしょう。

最終更新日時: 2014-03-11 (火) 03:51:25 (3698d)