2016年5月27日金曜日

CombMask

Avisynth2.6/Avisynth+用のプラグイン、CombMask.dllの配布を開始しました。

ソースコード

バイナリ

このフィルタ、元々は3年くらい前に書いてそのままバイナリ配布とかせずにほっぽってたものなのですが、誰か別の人がビルドして配布していたようです。

書いたきっかけはたしかvapoursynthのVIVTCがオリジナルのTIVTCと違ってedeintオプションを使えないし、かといってTDeintとの連携もできない残念な仕様だったので、少しはましになるかと思ったんでしたかね。

なんでavisynth版も書いたかといえば、avisynthプラグインのほうがテストしやすく、サポートしているフォーマットも少なくて書きやすいからです。
まずavisynthプラグインを書いてみて、処理の全体的な流れや具体的な内容等のロジックを決めてある程度テストしてからでないと、なかなかvapoursynthプラグインは書けません。

で、結局作りこまずにそのまま…というのが真相なんですが、このたび誰かさんが配布してたバイナリが消えちゃったので自分のGithubレポのほうでバイナリ配布してくれないかとお願いメールが来まして、正式に配布することにしたついでにコードの見直しや機能追加もしました。

具体的には
・Avisynth+MT対応で、SetFilterMTModeが使える環境では自動的にMT_NICE_FILTERとして登録されます。
・AVX2も使えるようにしました(メモリアライメント等の都合上、Avisynth+MTのみ)。
・縞検出にTIVTC等のmetric1も使えるようにしました。
・コードがちょっと綺麗になりました(と、自分では思っている)。
といった感じです。

縞検出のmetric1は、そもそもTIVTC以前のdecombパッケージやMaskTools1のCombMask()で使われているものなんですが、はっきりいってインタレ縞検出用だと誤爆しまくって使えないんじゃないかと思います。
しかし、世の中には単に縦方向のみのノイズ検出フィルタとしていまだにMaskTools1を使っている人がいるようなので追加しました。
MaskTools1のはSIMD化されてないのでクソ遅いですし。

MaskTools版の
CombMask(clip, thY1=x, thY2=x, Y=3, U=1, V=1)
と、こっちの
CombMask(clip, cthresh=x, mthresh=0, chroma=false)
で、同じになります。
UやVだけに使いたい場合はUToY8/VToY8を併用してください。

それにしてもAVX2、なかなか速くなりませんね(HaswellではSSE2比120%弱くらいかな)。
SSE2がPen4で登場してCore2でまともになるまでに6年くらいかかったので、5年後くらいには180%くらいにはなってるんじゃないかとは思うんですが…。

4 件のコメント:

  1. 初めまして。
    最近Avisynthのフィルタを作ってみようと思いたち、
    記事やソースコードを参考にさせていただいております。
    その際疑問に思ったのですが、

    > const uint8_t* sc = srcp;
    > const uint8_t* sb = sc + spitch;
    > const uint8_t* sa = sb + spitch;
    > const uint8_t* sd = sc + spitch;
    > const uint8_t* se = sd + spitch;

    この部分で、sbとsdは同じものになってしまうのではないでしょうか。
    まだポインタやピッチも十分に理解していないので、頓珍漢な質問かもしれませんが。

    返信削除
    返信
    1. これは画像上端の処理ですね。
      これはわざとこうしています。
      これについての記事を書いたので、そちらを読んでみてください。
      http://csbarn.blogspot.jp/2016/08/blog-post.html

      削除
  2. ConditionalFilterからIsCombedを使用するとエラーが発生しますIsCombedTIVTCでは発生しませんでした

    SetLogParams(level = LOG_WARNING)
    SetMemoryMax(1024)
    MPEG2Source()
    c = TDeint(tryWeave = True).SelectEvery(5, 1, 2, 3, 4)
    DoubleWeave().SelectEvery(10, 1, 4, 6, 8).AssumeTFF()
    ConditionalFilter(last, c, last, "Crop(0, 816, 0, 0).IsCombed()", "=", "True")

    ---------------------------------------------------------------------
    WARNING: TDeint_TDeint() has no MT-mode set and will use the default MT-mode. This might be dangerous.
    ---------------------------------------------------------------------
    ERROR: System exception - Illegal Instruction
    ---------------------------------------------------------------------
    ERROR: System exception - Illegal Instruction
    ([Conditional Filter, Expresion 1], line 1)
    ---------------------------------------------------------------------
    ERROR: System exception - Illegal Instruction
    ---------------------------------------------------------------------
    ERROR: System exception - Illegal Instruction
    ([Conditional Filter, Expresion 1], line 1)
    ---------------------------------------------------------------------
    ERROR: System exception - Illegal Instruction
    ---------------------------------------------------------------------
    ERROR: System exception - Illegal Instruction
    ([Conditional Filter, Expresion 1], line 1)
    ---------------------------------------------------------------------
    WARNING: A plugin or the host application might be causing memory leaks.

    Avisynth+ r2172 x86
    CombMask 1.1.0

    返信削除
    返信
    1. んー、どうやらIsCombedのような実装はAVS+MTにとっては想定外みたいですね。
      内部的にはCombMaskをいったん作ってからMaskedMergeの縞判定関数にかけ、そこで処理を終了となるわけですが。
      IsCombedTIVTCとは似てるようで全く違う処理なので、直すのはちょっと時間がかかりそうです。

      削除