FRExtでは、MPEG-2の大黒柱だった機能を追加した。すなわち、人間の認識に基づいた量子化スケーリングマトリクス(perceptual - based quantization scaling matrices)である。エンコーダは、各トランスフォーム・ブロックサイズごとに、そして、イントラ/インター予測では個別に、カスタマイズされたスケーリング因数を指定出来る。これはデコーダが逆量子化スケーリングに使うものだ。これにより、人間の視覚認識システムの弱点(様々なタイプがある)に従って、量子化の忠実度をチューンできる。
一般的には、この方法でmean-squared error(*不詳だが恐らく全ての値を一律の基準で評価するという程の意味*)やPSNRに現れる客観的な忠実度は向上しない。しかし主観的な忠実度は向上する。これはより重要な基準だ。
量子化スケーリングマトリクスのデフォルト値は規格上に定義されている。エンコーダはこれに置き換わる値をコデックに送り込んでシークエンスやピクチャレベルでこの値を変更できる。
CQMはカスタム量子化マトリクス(Custom Quantisation Matrix)。
量子化マトリクスは格子状にならんだ数字(*数学で言う行列*)で、個々の数字をquantum(*量子/量子化マトリクスの値*)として扱う。この個々
の数字が元の映像データをどのくらい破棄するかを決める。個々の数字が大きなマトリクスは映像がソフトになり、小さなマトリクスは映像のディテイル保持率
があがる。x264のデフォルトは "flat 16"
マトリクスを使う。これは全ての数字が16で埋まっているもので、デコードの際に特別な扱いが不要なものだ(*Main
Profile以下*)。カスタム量子化マトリクスはHigh
Profileの機能で、実際にはデコード負荷は増えも減りもしないのだが、デコーダ側のサポートが必要となる。XviDのカスタム量子化マトリクスを覚
えている人もあるだろう。大半のケースでデフォルトのH.263量子化で充分だったが[*1]、x264でもflat
16で充分な場合が多いと思われる。しかし中には高周波領域に高い係数が入ったマトリクスを使いたい事があるかもしれない。細かいディテイルがややスムー
スになり圧縮しやすくなる(*ノイズなどの細かい部分を潰せる*)。
--cqmはデフォルトのflatマトリクスか、jvtマトリクスの選択。
flatマトリクスは数字が全て16で埋まっているもので、jvtマトリクスはH.264規格の技術的な作業に当ったJoint Video
Teamが作ったものだ。このコマンドは外部ファイルを用意する必要が無いので使い易い。
*手許ではXviDのMPEG量子化マトリクスはブロックノイズが激減した記憶があるが、x264の cqm=jvt
はそこまでの差はない。
全ての--cqm系オプションに優先。
カスタム量子化マトリクスを使うならおそらくこのオプションが最も実用的で、マトリクスを外部ファイルから読み込むものだ。読み込むファイルはJM(リ
ファレンス・エンコーダ)互換形式でなければならない。マトリクスファイルはDoom9で入手できる。
事前に定義済みのカスタム量子化マトリクスか、JMフォーマットのマトリクスファイルを使う。
flat 事前に定義済みのflat 16 matrixを使う (default)。
jvt 事前に定義済みの JVT matrixを使う。
<filename> JMフォーマットのmatrixファイルを使う
NOTE:
WindowsのCMD.EXEユーザは、全てのCQMリストを使おうとする場合、コマンドラインの構文解析で問題が起こり得る。これはコマンドラインに最大長制限があるため。そうした場合、リストをJMフォーマットCQMファイルに入れて上記の設定でロードする事を推奨。
16 | 16 | 16 | 16 |
16 | 16 | 16 | 16 |
16 | 16 | 16 | 16 |
16 | 16 | 16 | 16 |
16 | 16 | 16 | 16 | 16 | 16 | 16 | 16 |
16 | 16 | 16 | 16 | 16 | 16 | 16 | 16 |
16 | 16 | 16 | 16 | 16 | 16 | 16 | 16 |
16 | 16 | 16 | 16 | 16 | 16 | 16 | 16 |
16 | 16 | 16 | 16 | 16 | 16 | 16 | 16 |
16 | 16 | 16 | 16 | 16 | 16 | 16 | 16 |
16 | 16 | 16 | 16 | 16 | 16 | 16 | 16 |
16 | 16 | 16 | 16 | 16 | 16 | 16 | 16 |
自分の理解では:MPEG系規格の空間軸圧縮は次の手順を踏む(以下輝度 のみ)。
1)ブロック分割:映像を圧縮し易いサイズに小分けする。DCT変換の段階で各ピクセルの輝度値をDCT係数というものに変換する。目標は短くて・似たような数字に 変換すること。こうするとファイルサイズが減るが、この段階ではまだ逆DCT変換という計算をすれば無劣化。DCTの過程で輝度値は-1とか+2のように 0付近に収束するが、それでも収束しきらないピクセルが残る。
MPEG系規格における量子化は、この収束しきらない輝度値を、なんらかの除数で割り算して余りを丸めるものだ。丸めちゃうから、後で 逆量子化という計算をしても元通りにはならない(画質劣化)。その代わり0付近に収束する(圧縮できる)。除数が小さいほど、割り算ででる余りが少なくな り、丸めで捨てちゃう部分が減る。 画質が良くなり、ファイルサイズがでかくなる。除数(割る数)はqp指定値を元に決まるが、これは任意の値に固定することも(--qp)、指定ビットレー トに見合うように変動させる事もできる(ABRやマルチパス)。
カスタムマトリクスは、さらに映像の周波数成分ごとに除数を変更できるようにするものだ。
・表の左上が低周波数成分用:人間の目では画質劣化が目立ち易い部分用
・右下が高周波数成分用:画質劣化が目立ちにくい部分用
"劣化が目立ち易い部分とそうでもない部分に分解する"
というからには、上の表は恐らく画面内の輝度値の位置とは関係ないように思う。見た目似てっけど。
いずれにせよflatでは表の通り、低周波も高周波もおなじように「画像を省略」
する。ぶっちゃけMPEG-1でも周波数成分に応じて除数を変えるシカケは存在していたようなので、いーのかそれでとゆーカンジだ。
またこれはMain以前のH.264/AVCが体感画質でMPEG-2に劣るとされた理由の一つでもある。 High プロファイル非対応のデコーダは再生時の「逆量子化」にこの表しか使えない。2007年秋現在、全てのApple製品(ソフト・ハード問わず)が該当す る。
6 | 13 | 20 | 28 |
13 | 20 | 28 | 32 |
20 | 28 | 32 | 37 |
28 | 32 | 37 | 42 |
6 | 10 | 13 | 16 | 18 | 23 | 25 | 27 |
10 | 11 | 16 | 18 | 23 | 25 | 27 | 29 |
13 | 16 | 18 | 23 | 25 | 27 | 29 | 31 |
16 | 18 | 23 | 25 | 27 | 29 | 31 | 33 |
18 | 23 | 25 | 27 | 29 | 31 | 33 | 36 |
23 | 25 | 27 | 29 | 31 | 33 | 36 | 38 |
25 | 27 | 29 | 31 | 33 | 36 | 38 | 40 |
27 | 29 | 31 | 33 | 36 | 38 | 40 | 42 |
10 | 14 | 20 | 24 |
14 | 20 | 24 | 27 |
20 | 24 | 27 | 30 |
24 | 27 | 30 | 34 |
9 | 13 | 15 | 17 | 19 | 21 | 22 | 24 |
13 | 13 | 17 | 19 | 21 | 22 | 24 | 25 |
15 | 17 | 19 | 21 | 22 | 24 | 25 | 27 |
17 | 19 | 21 | 22 | 24 | 25 | 27 | 28 |
19 | 21 | 22 | 24 | 25 | 27 | 28 | 30 |
21 | 22 | 24 | 25 | 27 | 28 | 30 | 32 |
22 | 24 | 25 | 27 | 28 | 30 | 32 | 33 |
24 | 25 | 27 | 28 | 30 | 32 | 33 | 35 |
一番左上は、DC成分用なので一番小さい数字になっている。
・左上が低周波数成分用:人間の目では画質劣化が目立ち易い → 画質劣化を抑える小さな数字
・右下が高周波数成分用:画質劣化が目立ちにくい → うんと画質劣化する大きな数字
インターとイントラは別の表になっている。動き補償で動きの滑らかさを維持するには高周波数成分を維持する必要があるので、インターの 方が右下領域の数字が小さい。
High プロファイルでは映像ストリームにカスタム量子化マトリクスを埋め込む事ができる。cqm=jvtはこの表を映像データに埋め込んでいるわけだ。
こうしたマトリクスは自作できる。その場合は彩度用に別のマトリクスを用意する事もできる。個人的にはjvtで充分なのだけど、白黒 映画用に一個作ってみたい気もします。
ただし、適切な量子化マトリクスは映像の内容によって大きく異なる。ノイズだらけとかまったくノイズが無いとかディテイルだらけとか アニメ塗りとかアニメでも攻殻機動隊とバグスバニーは別だとか…。
とりあえず潰しの効きそうなTips。
極端に小さな matrix を使うことは、qp を下げるのと同じ量子化効果を持つので、圧縮に伴う画質劣化は減少する。しかし、デブロックフィルタはオリジナル qp と同じ画質劣化があることを前提にした強いフィルタをかけるので、デブロックフィルタでの画質劣化が上昇する。また、オリジナル qp と同等の画質劣化が発生することを前提にモード選択がおこなれてしまい、適切な RD 最適化が行われなくなる。さらに、エンコーダの実装によっては m が 16 bit の表現可能範囲をオーバーフローして、正しい演算結果が得られなくなる可能性すらある。
以上 3 点が極端に値の小さな matrix を使うことの弊害だ。個人的にはそんなことをするぐらいなら素直に qp を下げた方が仕合せになれると考えている。
まるも製作所:2007/06/22(金) H.264 での量子化処理とか量子化行列とか