« Theora のインラインアセンブラをイントリンシックで | メイン | Theora の MMX の IDCT その2 »

2007年11月27日

動画再生エンジン開発日誌:: Theora の MMX の IDCT その1

    

アセンブリのソースを見ていて不思議に思っていたのだが、なぜか上の左 4x4 と上の右 4x4 を使って計算している。
普通に考えると、MMX だから 4個単位でしか出来ないとしても、左の4列で計算して、その後右の4列でとなるはずなのだが……
転置が関係あるのか? と考えていてふと気付く。
ジグザク配列をいじって、事前に転置しているんじゃないか? と。
SMPEG のソースを眺めていた時、ジグザク配列が MMX 用に別に用意してあって、なんだろうこれ? と思っていたのだが、事前に転置するためだったんじゃないのか?

---- ジグザク配列 について ----
二次元の係数行列をそのままファイルに保存することは出来ないので、これは一度一次元に直す必要がある。
画像の場合は単純に上からか下から1行ずつ記録していくが、MPEG などの DCT 係数行列は、ジグザクに記憶していく。
例えば、4x4 の時……
00 01 02 03
10 11 12 13
20 21 22 23
30 31 32 33
のようになっているとすると、00 01 10 20 11 02 03 12 21 30 31 …… とジグザクに斜めに記録していく。
何でこんな面倒なことをしているかというと、圧縮のため。
画像を離散コサイン変換 ( DCT ) すると、周波数領域に変換される。
で、右下に行くにしたがって高周波成分になっていく。
画像の非可逆圧縮の多くは、この高周波成分を間引くことで圧縮を実現している ( 高周波成分は削っても画質への影響は少ないらしい ) 。
つまり、左上に比べて右下の方が値は小さく、圧縮率が高い時はほとんどが 0 になる。
ブロックのサイズは固定なので、係数の個数はわかっているから、0 のところは打ち切ってしまえばそのまま削れる。
大雑把に言うと以上のような理由からジグザクに記録されている。
で、これをどういう順で符号、復号化するのかがジグザク配列に書かれている。
---- 脱線終わり ----

ジグザク配列をいじれば、復号化する時にあらかじめ転置した状態で復元できるはず。
Theora のソースを探すとやはりあった。
で、配列を元にどう言う形になっているのか復元してみる。
結果、4x4 で転置され、その 4x4 の位置は変わっていなかった ( Theora のブロックサイズは 8x8 ) 。
本来転置行列は、4x4 単位で表した場合、元の行列が……
01 02
03 04
以上のようだったとすると
01 03
02 04
となるはず。
だけど、これらの位置は変わっていない。
なるほど、そういうことだったのか。
転置が少ない理由や上の左 4x4 と上の右 4x4 を使っている理由がわかった。
と言うことで、そのようにしてみるもまだおかしい。
なんだかほとんどのブロックが1色で塗りつぶされていたり、縞々だったりする。
IDCT の計算がおかしいのかなぁと何度も見直すが、Cのソースと変わりないように思える。
つづく……



投稿者 Takenori : 2007年11月27日 00:50




comments powered by Disqus
Total : Today : Yesterday : なかのひと