Museum

Home

Lab Overview

Retrotechnology Articles

Online Manuals

⇒ ibs_compress_open(3X) — NEWS-os 4.1C

Media Vault

Software Library

Restoration Projects

Artifacts Sought

Related Articles

libibs(3X)

ibs_encode(3X)

ibs_getioerror(3X)

IBS_COMPRESS(3X)  —  NEWS-OS Programmer’s Manual

名称

ibs_compress_open, ibs_mhcompress, ibs_mrcompress, ibs_put1d_eol, ibs_put2d_eol, ibs_put_fill, ibs_put1d_rtc, ibs_put2d_rtc, ibs_put_eofb, ibs_comp_flush, ibs_comp_align, ibs_comp_getworksize − 2 値イメージデータの圧縮を行なうための関数

形式

ibs_compress_open(iw, x, w, flag, mode, work, inf, inarg, outf, outarg, outbuf, outsize)
int iw, x, w, flag;
int mode;
int ∗work;
int (∗inf)();
int inarg;
int (∗outf)();
int outarg;
char ∗outbuf;
int outsize;

ibs_mhcompress(imgadr, work)
char ∗imgadr;
int ∗work;

ibs_mrcompress(imgadr, work)
char ∗imgadr;
int ∗work;

ibs_put1d_eol(work)
int ∗work;

ibs_put2d_eol(next, work)
int next;
int ∗work;

ibs_put_fill(n, work)
int n;
int ∗work;

ibs_put1d_rtc(work)
int ∗work;

ibs_put2d_rtc(work)
int ∗work;

ibs_put_eofb(work)
int ∗work;

ibs_comp_flush(work)
int ∗work;

ibs_comp_align(work)
int ∗work;

ibs_comp_getworksize(w, flag, mode)
int w, flag, mode;

解説

これらの関数はファクシミリ G3 および、G4 の圧縮を行うためのものです。
まず、 ibs_compress_open で必要な変数を設定したのちに、 ibs_mhcompress または、 ibs_mrcompress で 1 行ごとに圧縮を行います。
圧縮に際しては、 ibs_compress_open でセットされた入力関数 inf が呼ばれ、1 行分のイメージデータを読み込んで圧縮します。 圧縮された符号データは 出力バッファに蓄積され、バッファがいっぱいになるたびに、出力関数 outf によって書き出されます。

ibs_compress_open は、圧縮を行なうために必要な変数をセットします。
iw 、 x 、w は圧縮するデータが格納されている領域の大きさを指示します。
iw はイメージ幅(ドット)で、16 の倍数でなければなりません。
x は行の中で左側の使用されない部分をドット単位で指示します。
w は圧縮するデータの長さ(ドット)です。
x + w が iw をこえるとパラメータエラーになります。
flag は圧縮されたデータのビットオーダの指定を行ないます。 flag の下位 16 ビットに 0x0001 が指定されれば MSB (Most Significant Bit) ファースト、 0x0000 が指定されれば LSB (Least Significant Bit) ファーストです。 なお、ファクシミリのデータは LSB ファーストです。
mode は負の圧縮を許すかどうかを指示します。 ディザ表現されたイメージのように 1/0 の変動が 縦横各方向に長く連続していないイメージでは、 圧縮できずに逆に元のデータよりも大きくなってしまうものがあります。 こうした状況を負の圧縮と呼びます。 0 を指定すると、 ibs_mhcompress 、 ibs_mrcompress は負の圧縮の検出によってエラーを返します。 1 を指定すると、負の圧縮が検出されても無視します。 それ以外の値はパラメータエラーになります。
work は内部で使う作業領域で、 関数 ibs_comp_getworksize によって得られる値より大きな 領域を確保しておかなければなりません。
この作業領域 は圧縮がすべて終わるまで変更してはいけません。
inf 、 outf は、実際に圧縮を行うときに使用するデータの入出力関数へのポインタです。 inf には NULL を指定することができ、その場合には デフォルトの入力関数が使われます。 この場合、入力関数の形式や内部表現についての知識は必要有りません。
inarg 、 outarg はそれぞれ入力出力関数 inf 、 outf にそのまま渡されます。
outbuf は符号データを作るときに使うバッファを指示します。 また、 outbuf は偶数アドレスになければなりません。
outsize は outbuf の長さです。

ibs_mhcompress  、 ibs_mrcompress は実際に 1 行のイメージデータの圧縮を行います。 ibs_mhcompress は、CCITT T.4、T.6 の一次元符号化方式による圧縮を行います。
ibs_mrcompress は、CCITT T.4、T.6 の二次元符号化方式、あるいは CCITT T.6 の基本符号化方式のうちの高能率二次元符号化手法 による圧縮を行うものです。
非圧縮符号化手法はサポートしていません。
ここでは、まずはじめに入力関数 inf によって、イメージデータが読み込まれ、2 値イメージライブラリの 内部表現である変化点の配列が生成されます。 次に符号化が行われ符号データが出力バッファに蓄積されます。 そして、符号データでバッファがいっぱいになるか、関数 ibs_comp_flush が呼ばれると出力関数 outf が呼ばれます。
imgadr はイメージデータを指します。 イメージデータは iw / 8 バイトの長さがなければなりません。 イメージデータが破壊されることはありません。
imgadr は偶数アドレスになければなりません。

inf はイメージデータを読み込んで変化点の配列に変換する ための入力関数です。
inf に NULL が指定された場合、 デフォルトの関数 ibs_encode が呼ばれます。 入力関数 inf は次のような形をしていて、 エラーなら負となるようなリターン値をもたなくてはなりません。

int (∗inf)(inarg, imgadr, iw, w, x, sline, flag)
int inarg;
char ∗imgadr;
int iw, w, x;
int ∗sline;
int flag;

inarg 、 iw 、 w 、 x 、 flag は ibs_compress_open で設定されたものが渡されます。 imgadr は ibs_mhcompress  、 ibs_mrcompress で設定されたものが渡されます。 この関数の中で、 imgadr で示されるイメージデータ を変更してはいけません。
sline は変化点の配列です。 ( w + 2 ) ∗ 4 バイトの大きさを持っています。
変化点については ibs_encode あるいは、 ibs_decode を参照してください。

outf は符号データを書き出すための出力関数です。
ここで、出力関数 outf は次のような形をしていて、リターン値は書き出した長さでなければなりません。 エラーなら負となるようなリターン値をもたなくてはなりません。

int (∗outf)(arg, buf, size)
int arg;
char ∗buf;
int size;

arg には outarg が渡されます。
buf には outbuf が渡されます。
size には outbuf にある符号データの長さが渡されます。
この関数が呼ばれた時点で、 buf から size バイトの長さの符号データがあります。

ibs_put1d_eol  、  ibs_put2d_eol は一次元、および二次元符号化方式における EOL (走査線同期信号) を付加します。
二次元符号化方式のときには ibs_put2d_eol の next に 1 を指定することによって、次の行が一次元圧縮であることを、 また、2 を指定することによって、次の行が二次元圧縮であることを 指示します。

ibs_put_fill は一次元、および二次元符号化方式におけるフィルビット(0 の可変長信号列) を付加します。
各行の符号データ、フィルビット、EOL の 伝送時間が CCITT T.30 の プレメッセージ制御手順で 定めた符号データの最小伝送時間より小さくならないように フィルビットは付加されます。
n は最小伝送時間とデータ信号速度の積(ビット)を指定します。

ibs_put1d_rtc  、 ibs_put2d_rtc  、 ibs_put_eofb はそれぞれの圧縮方式において、最後に RTC (制御復帰信号)、 または EOFB (ファクシミリブロックの終端符号) を付加します。
また、 outbuf がいっぱいになっていなくても、 中の符号データをすべて書き出します。

ibs_comp_flush は outbuf がいっぱいになっていなくても、 中の符号データをなにも付加せずに書き出します。

ibs_comp_align は次のバイト境界までフィルビット 0 を符号データに付加します。 ただし、符号データは書き出しません。

ibs_comp_getworksize は work に必要な領域の大きさを返します。 たとえば、大きさの異なるイメージを扱うときには得られた値の最大値を 使用しなければなりません。 現在のバージョンでは (( w + 2) ∗ 8) + 256 が返されます。

符号化方式について

各種符号化方式について簡単に説明します。 詳しいことは、 CCITT T.4、 CCITT T.6 を参照してください。

一次元符号化方式
この方式では次のような構成の符号を生成されます。

EOL(一次元)
一次元符号化データ
EOL(一次元)
一次元符号化データ
.
.
.
EOL(一次元)
一次元符号化データ
RTC(一次元)

実際には、 ibs_compress_open を呼んだあとに ibs_put1d_eol と ibs_mhcompress とを交互に呼んで符号化を行います。 最後の行の符号化のあとに、 ibs_put1d_rtc を呼んで RTC を付加するとともに outbuf に残っている符号データを書き出します。

この方式にはいくつかの変種がありますが、例えば TIFF の Data Compression Scheme 2 の圧縮方式は次のようになります。

一次元符号化データ
一次元符号化データ
.
.
.
一次元符号化データ

この場合、それぞれの行を圧縮したデータは、 バイト境界に置かれなければなりません。 そのため、 ibs_compress_open を呼んだあとに ibs_mhcompress と ibs_comp_align とを交互に呼ぶことになります。 最後の行の符号化のあとに、まだ outbuf に残っている符号データを ibs_comp_flush で書き出します。

二次元符号化方式
この方式には、 K パラメータとよばれるものがあり、 一次元符号化されたデータのあと、最大 K − 1 の連続した行が 二次元で符号化されます。 一次元符号化は K 行ごとよりも頻繁に行われてもかまいません。

K = 2 の場合。

EOL (二次元、 next = 1)
一次元符号化データ
EOL (二次元、 next = 2)
二次元符号化データ
EOL (二次元、 next = 1)
一次元符号化データ
EOL (二次元、 next = 2)
二次元符号化データ
.
.
.
RTC (二次元)

基本的には一次元のときと同じですが、 次の行を一次元、二次元のどちらで符号化するかによって ibs_put2d_eol の next を 1 にするか 2 にするかが決まります。
そのあとで、一次元なら ibs_mhcompress 、二次元なら ibs_mrcompress を呼ぶことになります。
最後の行の符号化のあとに、 ibs_put2d_rtc を呼んで RTC を付加するとともに outbuf に残っている符号データを書き出します。

高能率二次元符号化手法
この方式は次のような構成の符号を生成します。

二次元符号化データ
.
.
.
EOFB

最初に ibs_compress_open を呼び、そのあとに ibs_mrcompress を行の数だけ呼んで、符号化します。 最後に ibs_put_eofb を呼んで EOFB を付加するとともに outbuf に残っている符号データを書き出します。

リターン値

パラメータエラーがあったときは −1 が返されます。

ibs_mhcompress  、 ibs_mrcompress では、 mode が 0 のとき、負の圧縮が検出された場合は −5 が返されます。
inf にエラーが生じたときは −2 が、 outf にエラーが生じたときは −3 が返されます。
また、作業領域 が破壊されている場合は −4 を返します。

エラーがなかったときはその時点で書き出されたバイト数を返します。

ibs_comp_align は常に 0 を返します。

inf 、 outf が返すエラーについては ibs_getioerror を呼ぶことによって何が返ったか知ることができます。

関連ファイル

/usr/sony/lib/libibs.a

関連事項

libibs(3X), ibs_encode(3X), ibs_getioerror(3X)

NEWS-OSRelease 4.1C

Typewritten Software • bear@typewritten.org • Edmonds, WA 98026