Ut Video Codec Suite ではフレーム内予測方式に Predict Left と Predict Median を実装しています。Predict Left とは、予測値としてすぐ左のピクセルを使って残差を計算する(つまり、今のピクセルの値からすぐ左のピクセルの値を引く)方式です。(Predict Median の説明は割愛)
左のピクセルを使うのは、あるピクセルの値は近くのピクセルの値に近い、ということから来ているわけですが、それなら別に左でなくてもいいわけで、上のピクセルを予測値として使う方式も考えられます。これを Predict Above と呼ぶことにします。英語として正しいかどうかは…よく分かりません。
左と上という違いはあるものの、方向が90度変わっただけで本質的には同じことをやっています。だから、圧縮比はあまり変わらないことが予想されます。
というわけで計測です。6年ぐらい前(つまり Ut Video Codec Suite を作り始めた頃)に試したはずなんですが、記録が残ってないので再び、です。
ソース | Left | Above | Median |
crowd_run | 1.87 1.70 |
2.02 1.73 |
2.26 1.95 |
ducks_take_off | 2.03 1.72 |
1.69 1.48 |
2.15 1.80 |
in_to_tree | 2.11 1.81 |
2.23 1.80 |
2.48 2.03 |
old_town_cross | 2.16 1.79 |
2.20 1.78 |
2.48 1.98 |
park_joy | 1.79 1.59 |
1.86 1.57 |
2.06 1.76 |
Big Buck Bunny | 2.64 2.45 |
2.99 2.56 |
3.39 2.97 |
アイマス2のステージPV | 2.21 | 2.24 | 2.38 |
crowd_run から park_joy は 2160p のソースを色変換してから縦横半分に縮小、Big Buck Bunny は 1080p を同様に処理(2160p の圧縮前のものが見つからなかった)、アイマスは 720p を録ったそのものです。上段が YUY2/ULY2 で、下段が RGB24/ULRG です。キャプボが YUV422 でしか録れないので、アイマスの RGB は省略します。
Predict Above は Predict Left と比較して、おおむね同じか若干良いことが多いが、時々極端に悪いことがある、という結果になりました。なぜそうなるのかまでは今回は追究しないことにします。
Predict Above の圧縮比以外の特徴ですが、逆演算を SIMD 化しやすい点が挙げられます。Predict Left や Predict Median の逆演算は、各要素の計算がメモリ上で直前に配置されている要素の計算結果に依存するため、ちょっとした工夫をしないと効率的に計算できません。Predict Above ではメモリ上で離れた要素にしか依存しないため、単に SIMD レジスタにロードして加算してストアするだけでよく、またレジスタが長くなると単純にそのまま高速化されます。Predict Left ではたとえば xmm レジスタに16要素保持している場合はシャッフル&加算を4回する必要があり、ymm レジスタだとさらに面倒になります。
現状では Predict Left の逆演算はハフマンデコード時についでにやっているため、SIMD 化しづらい点に関しては全く影響がなく、むしろ Predict Left の方が高速です。将来複数シンボルを同時にデコードするアルゴリズム(たとえばこれ)を導入した場合には、Predict Above の利点が活きてくるかもしれません。
no comment untill now