ページへ戻る

− Links

 印刷 

tek1​/adv1 のバックアップソース(No.2) :: OSASK計画

osaskwiki:tek1/adv1 のバックアップソース(No.2)

« Prev[4]  Next »[5]
* [[tek1]]の続き
-ここではtek0からのアイデアの連続性について書く

* UC0のアイデア
-UC0符号は、tek0でのdfの発展型である。
--ここで少しおさらいしておくと、dfはd3の発展型であった。つまりd3→df→UC0ということになる。
-dfはその名のとおりd3などよりもずっとフレキシブルであり、ファイルごとに適切なパラメータを選択できるところがとてもよかった。これをぜひ他の3つのパラメータ(by、lz、cp)にも応用したいと考えたわけである。
-そこでよりいっそうフレキシブルにして、パラメータ次第でL1aやL1bにもなれるような、そんなものに拡張して、それで名前を汎用符号(ユニバーサルコード)のバージョン0ということで、UC0としたわけである。

-また展開速度の高速化にも配慮した。符号中に分散したストップビット・継続ビットは、デコードの際に取り除いて結合しなければならず、これは大きな負担である。そこでこれらの制御用ビットをざざーと先頭に集めて以下のようにした。
    1dd0dd0ddd → ddddddd100        (ビットストリームは右から左へ書いている)
//-以下はbim2bin4hで直ったので削除
//-なお、ほんの気まぐれで継続・ストップの意味が反転してしまったので、
//    ddddddd011
//-となっているが、これはもし継続ビット個数を数えるのにASKAのBSFを使うのであれば少々不便であるなと今は少し後悔している。
//--まあBSFは遅いので使うべきではないし、どうしても使いたければNOTしてからBSFすれば済むことではあるが。
//--いや、やっぱりフォーマットを変えよう。今しかフォーマットはいじれないわけだし(2004.06.03)。
-これはまさにUC0である。そして先頭にまとめることで100が先行したときのdの数と1000が先行したときのdの数との大小関係を、あえて逆転することもできるようになった(今まではもっぱらdの個数は増やしていくしかなかった)。この先行形式にしたとたんにベース値という考えも思いつけるようになった。
-思えばl2d3からtek0へ進化したときも同じような発想だった。つまり、無圧縮ヘッダ"1"と圧縮ヘッダ"0"のbitを全部前に集めてしまおうと考えて、それをL0a符号に置き換えたのである。L0aにしたことで無圧縮領域が長くなるときに"0"を並べるのではなくもっと短くすることができるようになり、tek0の圧縮率はl2d3よりもほぼ全てのケースでよくなったわけである。

-ちなみに符号寿命という考え方は、LHAがたまに静的ハフマン符号を作り直しているらしいという話を聞き、なるほど効果がありそうだと思って入れた。実験したらいろいろ分かったので、全部を一気に切り替えるのではなく、複数の寿命を扱えるようにした。

* こめんと欄

#comment

« Prev[4]  Next »[5]