-
Notifications
You must be signed in to change notification settings - Fork 10
Deblocking
ソースQP連動型デブロッキングフィルタ
KDeblock(clip, int "quality", float "str", float "thr", float "bratio", clip "qpclip", int "qp", bool "soft", int "show")
ソースQP連動型デブロッキングフィルタ。
デブロッキング処理の仕方はJPEG Post-Processingで紹介されているもので、FFmpegのsppやAviSynthのSmoothDと同じアルゴリズムのフィルタである。
SmoothDとの違いは、quantを全体に一律に適用するのではなく、MPEG2ソースのQPテーブルから、ブロック単位で適用する強さを可変にしているところ。元論文では、quantはソースと同じ値にするのが最もきれいになると書かれており、FFmpegのsppはそのように実装されているが、AviSynthのSmoothDやその派生フィルタは、ソースのQP値を使わないで一律に適用してしまうため、ノイズの少ないところにも強く適用してボケてしまうというような、いわば"不完全なフィルタ"となっている。KDeblockは、ソースのQP値を使って圧縮具合に応じて適用する強さを変える"完全なフィルタ"である。
FFmpegのsppも同様にソースのQP値を使う"完全なフィルタ"だが、パラメータが少ない。KDeblockはBフレームのQP値考慮割合や、適用するQP値のしきい値、全体的な強度などがパラメータで設定できるようになっている。
このフィルタはCUDA版の他にAVX版も実装されていて、CPUでも高速に処理できるようになっている。(もちろん速度はCUDA版にはかなわないが)
なお、ソースのQP値を取得するには、ソースフィルタがQP値の出力に対応している必要があり、現在これに対応しているのがAmatsukazeのAMTSourceしか存在しないので、Amatsukaze以外では、ソースのQP値を利用した処理ができない。(つまり、Amatsukazeを使わないと"不完全なフィルタ"となってしまう)
- CUDA対応: Yes
- clip
- ソースクリップ。下の"qpclip"が指定されていない場合は、このクリップからQPテーブルが取得される。
- int quality = 3
- DCT/IDCTの適用回数。(2 << quality)回適用する。有効な値は1~6。
- float str = 0
- 適用する強さ。0だとソースQP値と同じ値で再量子化する。小さくすると弱くなり、大きくすると強く適用される。-4.0で量子化レベルが0になるので、最低値は-4.0である。
- float thr = 0
- 適用するQP下限しきい値。QP値がこれ以上のブロックのみ適用する。QP値は正の値なので、有効な値は0以上である。QP値が小さいところ(低圧縮のところ)は元々のアルゴリズムから弱くフィルタが適用されることになるが、このしきい値を設定することで、QP値がしきい値より小さいブロックはフィルタを全く適用しないようにできる。しきい値を大きくすれば、QP値の大きいところ(つまり、高圧縮されてブロックノイズが出まくっているところ)だけにフィルタを適用することができる。
- float bratio = 0.5
- BフレームのQP値の考慮比率。元論文はJPEGという画像圧縮コーデックをターゲットにしていたので、参照するQPテーブルは1つしかなかったが、MPEG2の映像では、PフレームやBフレームは他のフレームとの差分が記録されているので、参照フレームの品質も考慮しなければならない。一般的に、Bフレームの差分画像は高いQP値で圧縮されるので、そのフレームのQP値だけを見ていると、BフレームとBフレーム以外で、QP値に差が出てしまって、不安定なフィルタとなってしまう。そこで、KDeblockでは、Bフレームの場合は、そのBフレームのQP値と、直前のBフレーム以外のフレームのQP値の2つを見て、以下の計算式に沿って、適用するQP値を算出している。
- (適用するQP値) = (BフレームのQP値) * bratio + (前のBフレーム以外のフレームのQP値) * (1 - bratio)
- clip qpclip
- QP値ソース用クリップ。QP値をソースクリップとは別に入力したいときに使う。(ソースフィルタとKDeblockの間にフレームプロパティを維持しないフィルタがある場合など)
- int qp = -1
- QP値をソースからではなく、全体に一律に適用したい場合に使用する。なお、ソースにQP値がなく、qp指定もされていない場合、フィルタは無効化されることに注意。
- bool soft = false
- 再量子化の適用の仕方がsoftになる。FFmpegのsppに実装されていたアルゴリズムだが、全体がボケるだけなので、あまり意味はない。
- int show = 0
- デバッグ用表示を追加する。以下のモードがある
- 1: ソースのQP値を使っているか、qp指定されたか、無効化されたかを左上に表示する
- 2: QP値がしきい値以上のブロックを青く表示する。
- デバッグ用表示を追加する。以下のモードがある
ソースクリップからQP値だけを取り出したクリップを返す。QP値はデータ量が小さいので、使い方によっては使用メモリ量を削減できる。
- CUDA対応: Yes
ソースクリップのQP値をフレームデータに変換する。QPテーブルを画像として見ることができる。QP値は16x16ブロックごとに値が1つあるので、クリップのサイズは、ソースクリップのサイズが(width,height)だと(ceil(width/16),ceil(height/16))になる。
- CUDA対応: Yes
- clip
- ソースクリップ
- bool nonb = false
- trueにすると、直前のBフレーム以外のフレームのQP値をフレームデータに変換する。(falseだと、Bフレームも含めそのフレームのQP値)
I,P,B等のフレームタイプを返す。ScriptClip等で使う実行時フィルタである。タイプはFFmpegのAVPictureTypeに準拠。(I=1,P=2,B=3)
※これらのフィルタはAmatsukazeのAMTSourceが返すフレームのプロパティに依存しているので、AmatsukazeのAMTSourceが返すクリップ以外では使えないことに注意