GetParity のバックアップソース(No.1)

#contents

* GetParityとは? [#sedd6255]

GetParity は、フィールドオーダーがトップフィールドファースト(TFF)であるかボトムフィールドファースト(BFF)であるかを判別するための関数です。パリティ(parity)は「偶奇性」(偶数か奇数か、0 か 1 かを示すもの)で、GetParity では、返り値が true なら TFF、false なら BFF とみなされていることになります([[SourceForge.net Repository - [avisynth2] View of /avisynth/src/filters/field.h:http://avisynth2.cvs.sourceforge.net/avisynth2/avisynth/src/filters/field.h?revision=1.3&view=markup]]より)。

ただし、これは AviSynth がそのように仮定しているというだけです。ソース本来のフィールドオーダーがTFFであっても、GetParity が返す値は false である可能性もあります。詳しくは、[[フィールドオーダーの明示]]を参照。

* 使用例 [#i5a7027d]

** 基本編 [#p8dd2c66]

GetParity 関数の返り値は、true または false です。たとえばこの返り値を [[Subtitle]] フィルタを使ってクリップ上に表示したいなら、前もって String 関数を使って文字列に変換する必要があります((Subtitle フィルタの text パラメータが string 型であるため。))。

-使用例 1
--スクリプト
#code{{
AviSource("example.avi") # ソース
parity = GetParity() # パリティを取得
parity = String(parity) # parity を文字列に変換
Subtitle(parity) # Subtitle フィルタでクリップ上に表示
}}
--出力画像(一部)
#ref(fieldorder_parity_default.png)

GetParity 関数は、実引数として指定されたクリップのパリティを返します。このため、同じスクリプトでも、GetParity 関数を挿入する位置によって返り値が異なる可能性があります。

-使用例 2
--スクリプト
#code{{
AviSource("example.avi") # ソース
AssumeTFF() # TFF と仮定 => true
parity = GetParity() # パリティを取得
parity = String(parity) # parity を文字列に変換
Subtitle(parity) # Subtitle フィルタでクリップ上に表示
}}
--出力画像(一部)
#ref(fieldorder_parity_assumetff.png)

上の例では、直前に挿入された AssumeTFF によってパリティが強制的に true に設定されるため、GetParity の返り値はソースのパリティに関係なく true になります。

** 応用編1  [#afa40786]

true や false ではわかりにくいなら、GetParity 関数の返り値が true なら "TFF"、false なら "BFF" を返すような関数をつくって見るといいかもしれません。

-例
--スクリプト
#code{{
AviSource("example.avi") # ソース
fieldorder = GetFieldOrder() # GetFieldOrder 関数(下記参照)でフィールドオーダーを取得
Subtitle("フィールドオーダー: " + fieldorder, font="MS Pゴシック") # 日本語対応フォントに設定

function GetFieldOrder(clip clip)
{
    parity = GetParity(clip) # clip のパリティを取得
    return (parity == true) ? "TFF" : "BFF" # parity が true なら "TFF" を、さもなければ "BFF" を返す
}
}}
--出力画像
#ref(fieldorder_parity_customized.png)

** 応用編2 [#q8c89038]

上記の応用例 1 では、三項演算子を使って、GetParity の返り値(true または false)による処理の振り分けを行っています。これは、以下のように応用可能です。

#code{{
parity = GetParity() # パリティを取得
(parity == true) ? TDeint(order=1) : TDeint(order=0) # parity が true なら order=1 に、false なら order=0 に設定
}}

この例では、GetParity の返り値が true なら TDeint(order=1) 、false なら TDeint(order=0) が適用されます ((厳密には「false なら」ではなく、「'''true ではない'''なら(さもなければ)」とした方がいいのかもしれませんが、GetParity の返り値は true か false のいずれかしかないため、このような書き方をしました。))。

これは一例です。実際には、TDeint の order パラメータには AviSynth のパリティを利用するオプションが用意されているため、このようなスクリプトを使う必要はありません。下記のように order=-1 に設定すれば、AviSynth のパリティが利用されるようになります。

#code{{
TDeint(order=-1)
}}