Ut Video Codec Suite は、開発初期の目標はともかくとして、「そこそこの圧縮率でかなりの速度の編集用コーデック」という方向にバージョンアップを重ねています。「かなりの速度」という点に関しては、アルゴリズムレベルや実装(アセンブラ)レベルでの継続的な改良により、満足できるレベルを達成できていると思っています。

さて、エゴサーチしていると、たまに「デコード速度優先より圧縮率優先の方がデコードが速い」と言っている人がいます。デコードアルゴリズム的にはそのようなことはありえないので、おそらく HDD がボトルネックになってそうなっているのでしょう。一般論としては、データ量が絶対的に大きい分野で CPU ではなく HDD で律速するというのはよくある話です。特に、最近はマルチコア化によって CPU 側の性能は飛躍的に伸びたので、相対的に HDD が遅く感じられるかもしれません(RAIDなりSSDなりにすればいいんですが)。個人的にも、昔 Huffyuv で単発の HDD にキャプチャしていた時は、書き込み速度が微妙に足りず Predict Left だとフレームドロップするので、CPU で多くの処理を行う代わりに圧縮率が良い Predict Median を常用していたことがありました。

というわけで、CPU をより多く使う代わりに圧縮率を向上させることを考えてみます。

今後も編集用コーデックであることを前提とするならば、フレーム間圧縮は一般にランダムアクセス性能を低下させるので、採用するのは難しいところです。そうするとフレーム内圧縮に限ることになりますが、フレーム内予測を複雑にしても可逆である限りそれほど圧縮率は向上せず、コード量は確実に大幅に増えるので及び腰です。また、そのような処理はエンコード速度を大幅に低下させることになるので、編集用コーデックとしてはやはり使いづらいものになりそうです。(保存用コーデックとしてならアリだと思います)

さて、ある程度大きなデータであるならば、ハフマン符号を(広い意味で)算術符号の一種である Range Coder に置き換えることで大抵の場合圧縮率が多少向上する(その代わり速度は結構低下する)わけで、その実装例が Lagarith です。ハフマン符号処理部分を Range Coder にすると Lagarith とほぼ同じ圧縮特性になり、しかも頑張ってマルチスレッド化されているので比較的速いものができます(というか Lagarith の並列性が低いのが謎)。

手っ取り早い圧縮率改善方法として Range Coder は検討に値するわけですが、Range Coder 自体の学習であるとか、高速なエンコード/デコードの実装を考え付かなければならないとかあって、検討しているだけのところで止まっているのが実際です。まとまった時間が必要ですねぇ。

Trackback

4 comments untill now

  1. 順三朗P @ 2010-12-02 17:25

    IRCでいつもお世話になってます。

    フレーム間予測についてですが、データバックアップで例えると増分式ではなくて差分式にするのはいかがでしょう。
    http://www.atmarkit.co.jp/fwin2k/win2ktips/305butype/butype.html

    つまり[1],[2],[3],[4]というフレームに対して、
    [1],[1→2],[2→3],[3→4] という形ではなく、
    [1],[1→2],[1→3],[1→4] というデータを用意します。
    すると、どのフレームのデコードでも1枚+α程度の
    データ量になるのでペナルティーが大きくなりません。
    時間経過ごとに効率が落ちるので通常のフレーム間予測よりも
    キーフレームを多めに入れる必要はあるでしょうが、いかがでしょうか。

  2. 梅澤 威志 @ 2010-12-02 18:23

    どうもどうも。

    「データバックアップで言うところの増分式ではなく差分式のような方法にする」というのは一見うまくいきそうですが、VCM (VfW) インターフェースを使う限りうまくいきません。

    VCM インターフェースの場合、(キーフレームではない)あるフレームをデコードしたい場合、直前のキーフレーム(をエンコードしたデータ)から目的のフレーム(をエンコードしたデータ)まで1フレームずつデコーダに入力して、最終的に目的のフレームを入手することになります。で、VCM インターフェースでは毎フレームちゃんとデコードしてフレームを出力しなければならない(デコードしたフレームは要らないのでエンコードしたデータだけ渡しておく、ということはできない)ことになっているので、増分式でも差分式でも結局処理量が多いことには変わりがありません。

  3. 順三朗P @ 2010-12-03 15:30

    あれ、午前中に書き込んだのに反映されてない……のでもう一度。

    いわゆる、Video for WindowsのBフレーム問題のことでしょうか。

    xvidがやっているような方法をとれば解決できるんでしょうか。ややこしそうですが。

  4. 梅澤 威志 @ 2010-12-05 16:23

    Bフレーム問題とは直接は関係ありませんね。問題を起こしている仕様は同じですけど。

Add your comment now