CD image を可逆圧縮して保存する

この手の開発をしていると CD image を HDD に大量に保存する必要がありまして、結構容量を食います. 圧縮するにも可逆圧縮でないとデバッグが不完全になってしまいます.

これらは全てコマンドラインシェルスクリプト経由で運用する流れです.

chdman で固める

chdman は MAME に付属するディスクイメージを固めるソフトだと思います. CD image の場合、DATA は deflate (たぶんzlib), Audio は flac で固めますので可逆圧縮です.
MAME なら固めた chd ファイルからも起動できます. (しかし,家庭用ゲームを遊びたい人が MAME を選択するのはないでしょうね... PCE のエミュレーション精度も理由があってあんまよくないですし)

前回の cdmanipulator で作ったファイルも固められます. .cue と .img が必要です.

 chdman createcd -i hoehoe.cue -o hoehoe.chd

7za で固める

.img はこの段階で削除可能なので、.chd .sub .cdm を 7za.exe で固めます.

 7za a hoehoe.7z hoehoe.cue hoehoe.cdm hoehoe.sub -mx=7
 7za a hoehoe.7z hoehoe.chd -mx=0

.sub と .cdm は圧縮率が高いデータになりますので -mx=7 で固めます. .chd はすでに圧縮したファイルですので圧縮しない -mx=0 で 7z ファイルに入れ込みます.

この行程で元のファイルからの中身にもよりますがファイルサイズが 50% 程度になります.
ys1&2 の img ファイル(766,702,608 byte)を zip,7z,chdへ圧縮した場合の処理時間と圧縮率比較です.値は共に少ない方が優秀です.

 zip 37sec 91%
 7z  53sec 86%
 chd 93sec 62%

圧縮ファイルから戻す

 7za x hoehoe.7z
 chdman extractcd -i hoehoge.chd -o hoehoe.chd.cue -ob hoehoe.img

chdman の -o オプションで .cue の文字列を含める必要があります. これをしないと audio の byteorder が圧縮前と逆になります. これはドキュメントには書いてなくてソースコードから確認しました.
-ob は付けないと拡張子が .bin になりますので全く同じにしたいなら .img にしたほうがいいでしょう.
cue 自体は別途ありますので .chd.cue にしてます. おそらく一緒の中身がでてくると思いますが詳しくは知りません.

補足:Audio の byteorder

.img のフォーマットは CDRWIN 発祥でそこで Audio の byteorder は little endian と決められたようです. イメージを作るソフトも多分それにならって little endian に統一されています.
実際の CDDA では bigendian で書き込まれているようです. CD の多バイトデータは bigendian で構成されているのがほとんどで CDDA だけ little endian にするのはちょっと考えられないです.
そこらへんがあって少し混乱があったようです.