以下、添付図面に従って本発明に係る実施形態を詳細に説明する。
実施形態の画像復号装置が復号する対象は、2値画像(1画素1ビット)の符号化データである。そして、複数画素で構成される画素ブロック(実施形態では8×8画素)を単位とする符号化データを順次復号するものである。
そこで先ず、実施形態における画像復号装置の説明に先立ち、画像符号化装置による符号化データ生成処理について説明する。
画像符号化装置は、2値画像データを8×8画素のブロック単位にランレングス符号化する。符号化対象は、イメージスキャナから読取った2値画像データとするが、ネットワーク上に存在する無圧縮の2値画像データファイルや、コンピュータにより処理された2値画像データをその対象としても良く、その入力源の種類は問わない。2値画像の場合、8×8画素のブロック内をラスタースキャンすると、画素値が“1”のランと、画素値“0”のランが必ず交互に出現することになる。従って、ブロックの先頭の画素値の値が決まれば、最初のランレングス符号語はその画素値のランを示し、それに後続するランの符号語は、直前のランで示される画素の値に“1”を排他論理和した画素値を示す符号語となる。
図1は、ランレングス符号語とラン長との対応を示している。すなわち、画像符号化装置は、ラン長が0の場合(同じ値を持つ画素が1つのみの場合)は符号語として2ビットの“00”を出力する。また、ラン長が“1”の場合(同じ画素が2つ連続する場合)は、符号語として2ビットの“01”を出力する。また、ラン長が“2”(同じ値の画素が3個連続する場合)や“3”(同じ値の画素が4個連続すする場合)の場合には、図示の如く3ビットの符号語を出力する。そして、ラン長が4乃至63である場合(同じ画素が5乃至64個連続する場合)には、図示の如く、固定の8ビットの符号語“11000100”乃至“11111111”を出力する。なお、実施形態では、8×8画素のブロックを単位に符号化するものであるので、ラン長が63を超えることはない。
また、画像符号化装置は、着目ブロックを符号化している最中に、或る画素から最後の画素まで同じであり、且つ、そのラン長が“4”以上である場合、そのランの符号語を生成せず、符号化データの最後を示す符号語(EOB;End Of Block)を示す6ビットの符号語“110000”を出力する。EOBを示す符号語の直前のランの画素値が仮に“1”であった場合、その直後の画素から最後の画素までは“0”の値を持つ画素が連続することが約束される。また、このEOBの符号語“110000”は、ラン長が4乃至63のいずれの符号語にも一致しないので、復号装置ではEOBを検出できる。
また、1ブロックの2値画像データの符号化して得られた符号化データ量が64ビット以上になってしまうことが起こり得る。本来、2値画像中の8×8画素は64ビットで構成されるので、これでは圧縮されているとは言えない。そこで、画像符号化装置は、1ブロックの符号化データが64ビット以上になった場合、その符号化データを破棄し、先頭に非符号化を示す1ビットの識別データ“0”を出力し、それに後続して64画素(64ビット)のデータをそのまま出力する。図15(a)は、この場合の符号化データのデータ構造を示している。
一方、1ブロックの符号化データ量が64ビット未満であった場合、画像符号化装置は、符号化されていることを示す1ビットの識別データ“1”を先ず出力し、その次に先頭画素の値を決定するための1ビットを出力する。そして、その後に符号化データを出力する。図15(b)はこの場合の符号化データのデータ構造を示している。
以上が実施形態における復号対象の符号化データの生成処理の概要である。次に、実施形態における画像復号装置のブロック構成図を図14に示す。図示の如く、この装置は、符号化データ入力部101、判定部102、セレクタ103、105、及び、復号部104で構成される。
このうち、復号部104は、符号データから符号語の先頭ビットを頭だしするためのシフタ(301)と、1つのアドレスに複数のシンボルデータのデコード値を格納するの第1のテーブルとして機能するテーブル303と、シフタのシフト量を格納する為の第2のテーブルとして機能するテーブル308と、複数のシンボルデータのデコード値のデータ長を生成する為の第3のテーブルとして機能するテーブル307と、前記符号データから前記第1のテーブルのアドレスを生成する為の第1のデコーダ(もしくは第1のデコード工程)として機能するデコーダ302と、前記符号データから前記第2及び第3のテーブルのアドレスを生成する為の第2のデコーダ(もしくは第2のデコード工程)として機能するデコーダ306と、前記複数のシンボルデータのデコード値を一定の固定ビット数分のデータに結合又は分割して出力する為の出力部として機能するパッカ304とを有する。以下、各構成要素について更に詳しく説明する。
符号化データ入力部101は、内部にバッファメモリを有し、符号化データのビットストリームを順次入力しては、そのビットストリームをセレクタ103に出力する。
判定部102は、1ブロック分の符号化データの符号化データの先頭の識別ビットを判定するものであり、初期段階ではアクティブになっている。そして、判定部102は、符号化データの先頭の1ビットが、“0”であるのか“1”であるのかを判定する。すなわち、判定部102は、着目ブロックの符号化データが、図15(a)、(b)のいずれであるのかを判定し、その判定結果を制御信号(1ビットで良い)をセレクタ103、105に出力する。
この結果、着目ブロックが図15(a)の符号化データであると判定した場合、セレクタ103は、先頭の識別ビットを除く64ビットをそのままセレクタ105に出力する。そして、セレクタ105は、入力した64ビットのデータを復号結果として出力する。従って、着目ブロックの識別ビットが“0”である場合、セレクタ105からは1クロックサイクルで64ビットのデータを復号結果として出力することができる。
なお、セレクタ105は、1ブロックを構成する2値画素の個数をカウントし、1ブロックを構成する64画素の復号が完了する度に、判定部102に対してアクティブにする制御信号を出力する。
一方、判定部102が、着目ブロックの符号化データの先頭の識別ビットが“1”である、すなわち、着目ブロックが図15(a)の符号化データであると判定した場合、先頭の識別ビットを除く符号化データを、復号部104に供給させるための制御信号をセレクタ103に出力する。また、判定部102は、セレクタ105に対しても、復号部104からのデータを選択するように制御信号を供給する。セレクタ105は復号部104から、出力された2値画素のデータ(詳細は後述するように16ビット単位となる)をカウントし、64画素の出力が終えたと判定した場合、判定部102をアクティブにする制御信号を出力する。従って、復号部104にて64画素の復号処理中は、判定部102はインアクティブな状態であり、セレクタ103は符号化データ入力部101からの符号化データを復号部104に出力しつづける。
上記の通り、図15(a)に示す構造の符号化データについては、1クロックサイクルにて復号できることは容易に理解できよう。そこで、以下では、図15(b)のデータ構造の符号化データを復号する復号部104について更に詳細に説明する。
本実施形態の画像復号装置の復号部104は、1ブロックの符号化データを、最大でも16クロックサイクルで復号するものである。これは、本実施形態の画像符号化装置を利用(内蔵)する複合装置やプリンタ等を設計する設計者等に向けて、本装置は最低でも1クロックサイクル当たり4画素を復号することを保証するものとも言い換えることができる。
以下、本実施形態の第1及び後述する第2の実施形態の復号装置が速度保証を行なうスループットの指標に関して説明する。
ここで実施形態における復号部104が復号しようとしている符号化データにおいて、ブロックの先頭の1画素の値(1ビット)を除く符号化データのデータ量は64ビット未満であることが約束されている点に注意されたい(図15(b)参照)。
処理単位(ここではブロック)の画素数をN個(実施形態ではN=64)とする。そして、1ブロック分の符号化データ量をPビットとする。目標スループットをT画素/クロックサイクル(実施形態では4画素/クロックサイクル)とする。この場合、P/Nは1画素当りの平均符号量である。従って、上記目標スループットTを満足するには、1クロックサイクル当り、Pビット中、(P/N)×Tビットの符号語について復号処理すればよい。
一方、目標スループットがT画素/クロックサイクルであるので、1クロックサイクル当りT画素以上処理すれば、上記目標スループットを達成できる。よって、1クロックサイクルあたりの処理符号量をxビット/クロックサイクル、1クロックサイクルあたりの処理画素数をy画素/クロックサイクルとしたとき、目標スループットT画素/クロックサイクルを満足する為には、以下に示す式(1)又は式(2)のいずれかを満たせばよいことがわかる。
x ≧ (P/N)×T …(1)
または、
y ≧ T …(2)
[第1の実施形態]
復号部104が復号する1ブロックの符号量はP(64ビット未満)である。従って、1クロックサイクル当たり4画素をデコードするためには、上記(1)から、
x≧(P/64)×4>64/64×4=4
となり、1クロックサイクル当たり4ビット以上を復号処理すればよいことになる。一方、図1に示すように、4ビット以下の符号語(2ビット、3ビットの符号語)が含まれており、これらを1クロックサイクルで復号してしまうと、上記の条件に合致しない。そこで、4ビット未満の符号語については、その次の符号語と連結することで、見かけ上4ビットを超える符号語と見なし、復号処理を行なうものとした。換言すれば、単体で4ビット以上の符号語同士は連結しない。以降、この2つの符号語を結合した符号語を、連結符号語と呼ぶことにする。また、もともとの符号語や、連結符号語を構成する個々の符号語を、連結符号語と区別するため、以降、単体符号語と称することとする。
実施形態の復号処理を理解しやすくため、図2のデコードテーブルについて説明する。同図において、“連結符号語”は先に説明したように複数の符号語を連結したものである。“連結シンボル”は、直前にデコードされた画素の値が“0”であった場合の複数シンボルのデコード値である(以下、連結シンボルデータと称する)。また、説明のためにそれぞれの連結符号語に対して符号語番号を付与している。
図示の如く、符号語番号“0”の連結符号語は、単体符号語“00”が2つ連続する場合と、それをデコードした場合の連結シンボルデータ“10”を示している。符号語“00”はラン長が0(同じ値を持つ画素が1つのみの場合)を示している。図2は、直前の符号化データが“0”である例を想定しているので、単体符号語“00”が2つ連続する場合の復号結果は、“10”となる。つまり、連結符号語“0000”を復号すると、その復号結果は2画素であり、その値は“1”、“0”の順になる。
また、符号語番号“1”の連結符号語は単体符号語“00”と単体符号語“01”が続けてデコードされる場合であり、デコードされた連結シンボルデータは“100”となる。つまり、連結符号語“0001”を復号した場合、その符号化結果は3画素であり、値“1”の画素が1つ、その後に値“0”の画素が2つが生成される。
また、符号語番号“2”の連結符号語は、単体符号語“00”と単体符号語“100”が続けてデコードされる場合であり、デコードされた連結シンボルデータは“1000”となる(4画素復号)。また、符号語番号“3”の連結符号語は単体符号語“00”と単体符号語“101”が続けてデコードされる場合であり、デコードされた連結シンボルデータは“10000”となる(5画素復号)。
さらに、符号語番号“4”連結符号語は単体符号語“00”と単体符号語“11******”(ここで“******”は“000100”(十進数で“4”)乃至“111110”(十進数で“62”))が続けてデコードされる場合であり、デコードされた連結シンボルデータは1個の“1”の後、“0”が5乃至63個だけ続く連結シンボルデータとなる。
同様な方法で、図2には連結シンボルデータを構成する2つの連続する単体符号語に対して単体符号語“00”、“01”、“100”、“101”、“11******”がそれぞれ出現した場合の組み合わせが列挙されている。但し、符号語番号“20”においては、“連結符号語”は単体符号語“11******”のみで構成されている。
尚、図示していない例外処理として、単体符号語EOB(図1で示す単体符号語“110000”)が連結符号語の途中で出現した場合は、1ブロックの残りの画素全てに関して、直前にデコードされたシンボルの値が“0”であった場合は“1”として連結シンボルデータを出力する。また、直前にデコードされたシンボルの値が“1”であった場合は“0”として連結シンボルデータを出力する。
さらに、単体符号語EOBが連結符号語の先頭で出現した場合(連結符号語自身がEOBの場合)は、直前の画素の値を“1”で排他論理和した結果を、最後の画素まで出力する。図2のテーブルでは、直前の画素データを0と仮定しているため、全て1を出力するようことになる。
また、図2のデコードテーブルにおいては連結符号語の符号長が全て4ビット以上となるように設定してある。従って、1クロックサイクルサイクル当りの処理符号量xは4ビット以上となる。復号部104が復号する着目ブロックの符号量Pは64ビット未満であることが約束されているわけであるから、1ブロック分の符号化データは毎クロックサイクル当たり4ビット以上の符号語を処理するわけであるから、64/4=16となり、最大でも16クロックサイクルで着目ブロックの復号処理を終えることになる。すなわち、本復号部104を外部から見た場合、目標スループットT=4画素/クロックサイクルを満たす処理を行なうことが可能となる。
図2のテーブルにおいて、“*”のビットは0、1、のいずれでも良くなり、アドレスのエントリ数は無視できなく大きい。また、各アドレスに対して格納される連結シンボルのビット数も最大で63ビット必要になるので、そのテーブルを構築するメモリサイズは大きなものは必要になる。
そこで、本第1の実施形態では、装置に必要なメモリ容量を更に削減する例を説明する。
図3は実施形態における復号部104のブロック構成図である。
図示において、300はセレクタ103からの符号データを入力する入力端子であり、301は符号データから連結符号語を頭出しするためのシフタである。302は連結符号語をデコードして、後述のデコードテーブル303にアドレスを出力する為のデコーダであり、303は図2のデコードテーブルを実現する為のテーブルである。304はデコードされた連結シンボルデータを16ビット単位でパックする為のパッカであり、305は16ビットパック後の画素データを出力する為の出力端子である。また、306は連結符号語をデコードして、後述のテーブル307及びテーブル308にアドレスと供給する為のデコーダであり、テーブル307はデコードされた画素数を示すデータ長(以下、パック長と称す)を算出する為のオフセット値(以下、ベース値と称す)を出力する為のテーブルであり、テーブル308は符号データの頭だしをする為のシフト量(以下、シフト量と称す)を出力する為のテーブルである。また、309はテーブル307からのベース値と複数符号データからパック長を算出する為の演算部であり、310はブロックの最初の画素値(初期値)を入力する為の1ビットの入力端子である。
次に図3の復号装置の動作を説明する。先ず入力端子300から入力された符号データはシフタ301を介してデコーダ302、306に供給される。ここで、図2の例では連結符号語の最大ビット数は11ビットである為、11ビット分の符号データがデコーダ302、306に供給される。デコーダ302では図2の連結符号語のデコードを行い、デコード結果をテーブルのアドレスとしてテーブル303に出力する。ここで、テーブル303は図2に示した連結符号語の数としては21個必要であるが、後述するように本第1の実施形態ではテーブルのエントリー数を5個に減らして、デコーダ302及びテーブル303の回路規模の削減を図っている。その後、テーブル303はデコーダ302からのアドレスに従って連結シンボルデータをパッカ304に出力する。ここで、後述するようにテーブル303から出力する連結シンボルデータは、最後の変化点(2つのランの境界ビット位置)の位置と次画素の値がわかれば良いので、最後の変化点の次画素まで格納されている。即ち、図2の符号語番号“15”乃至“19”に対応する連結シンボルデータの時が最大のビット幅となり、このときの最後の変化点の次画素である5ビットのバス幅でパッカ304に対して出力される。
一方、デコーダ306は、入力された符号データから図2の連結符号語のデコードを行い、デコード結果をテーブルのアドレスとしてテーブル307及びテーブル308に出力する。ここで、テーブル307のエントリー数は、通常、図2に示した連結符号語の数と同等の数が必要であるが、後述するように本第1の実施形態では10個に減らして、デコーダ306、テーブル307及びテーブル308の回路規模の削減を図っている。
また、図5で説明するように、シフト量の算出に連結符号語の所定のビットを用いる為、演算部309に、シフタ301から出力された連結符号語が供給されている。その後、テーブル307はデコーダ306からのアドレスに従ってベース値を演算部309へ出力する。演算部309では後述するようにベース値と、連結符号語の所定のビット位置の値の総和からパック長を算出し、パッカ304に出力する。また、テーブル308はデコーダ306からのアドレスに従って、シフト量をシフタ301に出力する。そして、パッカ304ではパック長と、入力端子310から入力されるブロックの初期値に従って、連結シンボルデータの内、1番最後の符号語の単体シンボルデータ(以下、最終単体シンボルデータと称す)の生成、及び、出力端子305に対する16ビットにパックした画素データの出力を行なう。又、シフタ301はシフト量に従って、次の連結符号語の頭出しを行なう。以上の繰り返しにより、デコード動作を行なう。
次に図4を用いてデコーダ302及びテーブル303の動作を説明する。符号番号、連結符号語に関しては、図2と同一である。相違点は、デコーダ302のアドレス値が追加されている点と、連結シンボルデータが、4ビット目まで拡張されている点である。例えば、図2の符号語番号0の連結シンボルデータは“10”であったが、図4では最終単体シンボルのデコード値である2つ目のシンボルのデコード値“0”が拡張されて、連結シンボルデータが“10000”となっている。これは、後段のパッカ304にて、デコードされた画素数を示すパック長を用いて連結シンボルデータのビット幅を決定し、最終単体シンボルのデコード値の開始位置がわかれば、連結シンボルデータの値を決定することが可能である為、最終単体シンボルのデコード値の開始位置が最も長い連結符号語(符号語番号15乃至19)の5ビットにバス幅を合わせているためである。つまり、本実施形態で用いている符号化がランレングス符号化であるため、初期値と変化点が分かればデコード可能であり、また、最終変化点以降は同じ値が連続するため、最終変化点、即ち最終単体シンボルのデコード値の開始位置が最も遠くなる位置を含むビット列をテーブルとして保持し、最終ビット以降は最終ビットと同じ値が連続しているものとして取り扱えばよい。このような操作により、連結シンボルデータが同一になるものに対して、デコーダ302の出力のアドレスを割り振ることにより、図2にて元々必要であったエントリー数21個を5個に削減することが可能となる。これにより、デコーダ302とテーブル303の回路規模の削減を図っている。
次に図5を用いてデコーダ306、テーブル307及びテーブル308の動作を説明する。先ず、単体符号語を識別する為に、各単体符号語の先頭1又は2ビット(以下、ヘッダと称する)を以下の様に定義する。
単体符号語“00”及び“01”のヘッダは“0”、
単体符号語“100”及び“101”のヘッダは“10”、
単体符号語“11******”(ここで、“******”は000100乃至111111(十進数で4乃至63の値)のヘッダは“11”、
単体符号語“110000”(EOB)のヘッダは無し。
デコーダ306は上記ヘッダに着目して、連結符号語のデコードを行なう。図5はデコーダ306の出力であるアドレス毎に図4のデコードテーブルを並び替えた表である。又、“シフト量”はテーブル307の出力であるシフト量を示し、“ベース値”はテーブル307の出力であり、シフト量を計算する為の各アドレス毎に共通なオフセット値を示している。また“1の数”は各連結符号語のヘッダ以外のビットが“1”になっている数を示す。ここで説明のために符号番号を付与しているが、これは図4のものとは異なる。
次にアドレス及びシフト量のデコード方法とパック長の計算方法に関して図5を用いて説明する。
先ず、符号番号0乃至3に関しては、連結符号語を構成する単体符号語のヘッダが全て“0”である為、“0*0*”(*は0又は1)の連結符号語としてデコードを行い、デコーダ306はアドレス“0”を出力する。この時、連結符号語の符号長は“4”である為、シフタ301へシフト量“4”を出力する。また、パック長に関してはベースを“2”として、1の数との和により算出する。即ち、符号語番号0の場合は、1の数が0である為、パック長は2+0=2となり、符号語番号1,2の場合は、1の数が1である為、パック長は2+1=3となる。また、符号語番号3の場合は、1の数が2である為、パック長は2+2=4。つまり、連結符号語をcode[0:10](符号データの先頭を0ビット目とする)とすると、パック長=2+code[1]+code[3]で算出され、パッカ304へ出力される。
以下同様に、符号番号4乃至7に関しては、連結符号語を構成する単体符号語のヘッダが同一である為、“0*10”(*は0又は1)の連結符号語としてデコードを行い、デコーダ306はアドレス“1”を出力する。この時、連結符号語の符号長は“5”である為、シフタ301へシフト量“5”を出力する。また、パック長に関してはベース“4”+“1の数”として、パック長=4+code[1]+code[4]で算出され、パッカ304へ出力される。
符号番号8は、連結符号語の最後の単体符号語がEOBの場合であり、“0*110000”(*は0又は1)の連結符号語としてデコードを行い、デコーダ306はアドレス“2”を出力する。この時、連結符号語の符号長は“8”である為、シフタ301へシフト量“8”を出力する。また、パック長としてはブロックエンドまで(EOB)を示す“64”が、パッカ304へ出力される。
符号番号9、10に関しては、連結符号語を構成する単体符号語のヘッダが同一である為、“0*11######”(*は0又は1であり、######は000100乃至111111(十進数の4乃至62)であり、この値をnとする)の連結符号語としてデコードを行い、デコーダ306はアドレス“3”を出力する。この時、連結符号語の符号長は“10”である為、シフタ301へシフト量“10”を出力する。また、パック長に関してはベース“2”+ “1の数”+nとして、パック長=2+code[1]+nで算出され、パッカ304へ出力される。
符号番号11乃至14に関しては、連結符号語を構成する単体符号語のヘッダが同一である為、“10*0*”(*は0又は1)の連結符号語としてデコードを行い、デコーダ306はアドレス“4”を出力する。この時、連結符号語の符号長は“5”である為、シフタ301へシフト量“5”を出力する。また、パック長に関してはベース“4”+“1の数”として、パック長=4+code[2]+code[4]で算出され、パッカ304へ出力される。
符号番号15乃至18に関しては、連結符号語を構成する単体符号語のヘッダが同一である為、“10*10*”(*は0又は1)の連結符号語としてデコードを行い、デコーダ306はアドレス“5”を出力する。この時、連結符号語の符号長は“6”である為、シフタ301へシフト量“6”を出力する。また、パック長に関してはベース“6”+ “1の数”として、パック長=6+code[2]+code[5]で算出され、パッカ304へ出力される。
符号番号19は符号番号20、21に関して連結符号語の最後の単体符号語がEOBの場合であり、“10*110000”(*は0又は1)の連結符号語としてデコードを行い、デコーダ306はアドレス“6”を出力する。この時、連結符号語の符号長は“9”である為、シフタ301へシフト量“9”を出力する。また、パック長としてはブロックエンドまで(EOB)を示す“64”が、パッカ304へ出力される。
符号番号20、21に関しては、連結符号語を構成する単体符号語のヘッダが同一である為、“10*11######”(*は0又は1であり、######は000100乃至111100(十進数で4乃至60)であり、この値をnとする)の連結符号語としてデコードを行い、デコーダ306はアドレス“7”を出力する。この時、連結符号語の符号長は“11”である為、シフタ301へシフト量“11”を出力する。また、パック長に関してはベース“4”+ “1の数”+nとして、パック長=4+code[2] +nで算出され、パッカ304へ出力される。
符号番号22に関しては、連結符号語は単体符号語がEOBそのものである為、そのままデコードを行い、デコーダ306はアドレス“8”を出力する。この時、連結符号語の符号長は“6”である為、シフタ301へシフト量“6”を出力する。また、パック長としては“64”が、パッカ304へ出力される。
符号番号23に関しては、連結符号語は単体符号“11******”(******は000100乃至111111(十進数で4乃至63)の値であり、この値をnとする)そのものである為、そのままデコードを行い、デコーダ306はアドレス“9”を出力する。この時、連結符号語の符号長は“8”である為、シフタ301へシフト量“8”を出力する。また、パック長に関してはベース“1”として、パック長=1+nで算出され、パッカ304へ出力される。
以上説明したように、デコーダ306、テーブル307及びテーブル308において、連結符号語のデコードをヘッダ構成に着目してデコードし、かつパック長を連結符号語のヘッダ以外のビットの1の数を用いて算出することにより、24個のエントリー数を10個に減らす事が可能となり、デコーダ306、テーブル307及びテーブル308の回路規模の削減が可能となる。
なお、上記実施形態ではEOBを検出した場合、パック長=64とし、シフタ301は固定長端(即ちブロックエンド)まで読み飛ばすものとし、パッカ304はテーブル303のビット4(最後の画素値)をブロックエンドまで継続するものとして動作する。また、上記実施形態ではEOBのコードそのものを検出しているが、単体符号“11******”として復号し、n<4となった場合をEOBとしても良い。
次に図6を用いてパッカ304の動作を説明する。ここで、パッカ304は1ブロック64ビット分のバッファとカウンタ等の制御回路で構成され、テーブル303からの連結シンボルデータを16ビット単位に出力端子305に出力する。
図6の表の行(縦軸)は処理サイクル番号を示し、列(横軸)の項目についているサフィックスnは各信号のnサイクル目の状態を示す。例えば、“sdatan”はサイクルnでテーブル303入力される連結シンボルデータである。“endn”は一つ前のサイクルn−1で入力された連結シンボルデータsdatan-1の最終ビット位置の値であり、以下の式(3)で値が決まる。但し、1ブロックの最初の数シンボルデータに関しては、一つ前のサイクルの連結シンボルデータの最終ビット位置の値として、入力端子310から与えられた初期値の値を用いて設定される。即ち、初期値が“0”の場合は、一つ前のサイクルの連結シンボルデータが“1”で終わったものと考え、最終ビット位置を“1”に設定する。また、初期値が“1”の場合は、ひとつ前のサイクルの連結シンボルデータが“0”で終わったものと考え、最終ビット位置を“1”に設定する。
endn=sdatan-1(4) …(3)
また、図6の“sumn”はサイクルnまでに1ブロックの処理内で入力されたパック長の和であり、以下の式(4)及び式(5)にて算出される。但し、以下の式(6)に示すように、sumnが“64”より大きい場合は次のサイクルで値は保持される。また、後述するサイクルnまでに出力された16ビット単位のデータ数(以下、出力パック数と称す)ocntnが“4”の時、値が“0”に設定される。
sumn-1≦64 かつ ocntn≠4の時 sumn = sumn-1 + plenn …(4)
sumn-1>64 かつ ocntn≠4の時 sumn = sumn-1 …(5)
ocntn=4の時 sumn = 0 …(6)
図6の“sptrn”は次のサイクルn+1において、連結シンボルデータsdatanを前記バッファに格納する際の先頭ビット位置を示し、以下の式(7)により算出される。但し、以下の式(7−1)、式(8)に示すようにsumn>64の時はsptrnを一つ前のサイクルn-1の値sptrn-1にクリップする。後述する出力パック数ocntnが“4”の時、“0”に設定される。
sumn≦64 かつ ocntn≠4の時 sptrn = sumn-1 …(7)
sumn>64 かつ ocntn≠4の時 sptrn= sptrn-1 …(7−1)
ocntn= 4の時 sptrn = 0 …(8)
図6の“eptrn”は次のサイクルn+1において、連結シンボルデータsdatanを前記バッファに格納する際の終了ビット位置を示し、以下の式(9)により算出される。但し、以下の式(10)、(11)に示すように、sumn>64の場合は前記バッファの最大ビット位置である“63”に値がクリップされ、後述する出力パック数ocntnが“4”の時、“0”に設定される。
sumn≦64 かつ ocntn≠4の時 eptrn = sumn - 1 …(9)
sumn>64 かつ ocntn≠4の時 eptrn = 63 …(10)
ocntn= 4の時 eptrn = 0 …(11)
図6の“extn”はパック長plennが連結シンボルデータsdatanのデータ長5ビットを超える時“1”となるフラグであり、以下の式(12)、(13)にて算出される。
plenn ≦5の時 extn= 0 …(12)
plenn >5の時 extn= 1 …(13)
図6の“extptrn”はパック長plennが連結シンボルデータsdatanのデータ長5ビットを超える場合(extn= 1の時)、最終ビット位置の値endnを超えたビット数だけ拡張する必要があるため、次のサイクルn+1において、連結シンボルデータsdatanを前記バッファに格納する際のビット拡張の開始位置を示す。よって以下の式(14)、(15)に示すように、extn= 1の時にsumnから前記越えたビット数分だけ減算することにより算出される。また、以下の式(16)に示すように、後述する出力パック数ocntnが“4”の時、値が“0”に設定される。
extn=0 かつocntn≠4の時 extptrn= sumn …(14)
extn =1かつocntn≠4の時 extptrn = sumn - (plenn- 5) …(15)
ocntn=4の時 extptrn = 0 …(16)
図6の“pcntn”はサイクルnにおいて、1ブロックの処理内で入力されたパック長の累計が何個のパック数に相当するか(以下、入力パック数と称す)を示し、以下の式(17)で算出される。ここで、式(17)の割り算は、小数点以下ビットは切り捨てて演算する。以下の式(18)に示すように、sumn>64の場合は“4”に値がクリップされ、以下の式(19)に示すように、後述する出力パック数ocntnが“4”の時、“0”に設定される。
sumn ≦64 かつ ocntn ≠4の時 pcntn = sumn /16 …(17)
sumn >64 かつ ocntn ≠4の時 pcntn = 4 …(18)
ocntn = 4の時 pcntn = 0 …(19)
図6の“busyn”は図3に図示していない信号であり、サイクルn-1において、次のサイクルnにて前記バッファに空き無くなると判断した場合、テーブル303及び演算部309に対して、連結シンボルデータ及びパック長の入力を停止させる為の停止信号である。パック長の和sumn-1が64以上の場合、サイクルnでは前記バッファに空きが無くなる為、1ブロック分のパックデータの出力が終了するまで、値“1”をテーブル303及び演算部309に対して出力する。よって、以下の式(20)、(21)で算出される。また、式(22)、(23)、(24)、(25)に示すようにテーブル303及び演算部309は、サイクルnでの連結シンボルデータsdatan 及び、パック長plennはサイクルn-1でのbusyn-1の値が“1”の時にサイクルn-1の値を保持し、“0”の時は値を変更が可能となる。
sumn-1≦64の時 busyn-1 = 0 …(20)
sumn-1>64の時 busyn-1 = 1 …(21)
busyn-1= 1 の時 sdatan = sdatan-1 …(22)
busyn-1= 0 の時 sdatan は変更可能 …(23)
busyn-1= 1 の時 plenn = plenn-1 …(24)
busyn-1= 0 の時 plenn は変更可能 …(25)
図6の“restn”はサイクルnにおいて、前記入力パック数に対して出力されていないデータのパック数(以下、未出力パック数と称す)を示し、以下の式(26)に示すように入力パック数pcntnと、後述する出力パック数ocntnの差分となる。但し、以下の式(27)に示すように、後述する出力パック数ocntnが“4”の時、“0”に設定される。
ocntn≠4の時 restn = pcntn - ocntn …(26)
ocntn=4の時 restn = 0 …(27)
図6の“vaildn”は図3に図示していない信号であり、値を後述するパッカ304の出力が出力端子305に対して有効データであることを示す有効信号であり、“1”の時有効、“0”の時無効を示す。ここで、一つ前のサイクルn-1において、出力されていないパック数“restn-1が“0”より大きければ、パックされたデータを出力することが可能である為、以下の式(28)に示すように有効信号vaildnの値が“1”に設定される。また、“restn-1の値が“0”であれば、以下の式(29)に示すように有効信号vaildnの値が“0”に設定される。
restn-1 > 0 の時 vaildn = 1 …(28)
restn-1 = 0 の時 vaildn = 0 …(29)
図6の“ocntn”は、サイクルnにおける出力パック数を示し、有効信号vaildnと同様に、前のサイクルn+1にて出力されていないパック数“restn-1”が“0”より大きければ、“1”カウントアップを行い、“restn-1”の値が“0”であれば、値を保持する。以下の式(30)、(31)にその動作を示す。但し、前のサイクルの出力パック数ocntn-1が“4”の時、以下の式(32)に示すように、“0”に値をクリアされる。
restn-1>0 かつ ocntn-1≠4の時 ocntn = ocntn-1 + 1 …(30)
restn-1=0 かつ ocntn-1≠4の時 ocntn = ocntn-1 …(31)
ocntn-1=4 の時 ocntn = 0 …(32)
図6の“bufn”は、サイクルn-1における前記1ブロック64ビット分のバッファの値を示し、図6では、パックされる単位である16ビットづつ分けて示している。“bufn”の0乃至15ビット目は“bufn(0:15)”と表わす。また、“bufn(16:31)”は“bufn”の16乃至31ビット目を示し、“bufn(32:47)” は“bufn”の32乃至47ビット目を示す。そして、“bufn(48:63)”は“bufn”の48乃至63ビット目を示す。ここで、サイクルnにおいて、バッファbufnに連結シンボルデータsdatan-1を格納する場合、最終ビット位置の値endn-1により、バッファbufnに格納する値をビット反転させて格納する。
また、サイクルn-1においてフラグextn-1が“0”の時は、最終ビット位置の値endn-1がビット拡張されずに、データ幅plenn-1の連結シンボルデータsdatan-1(0: plenn-1-1)が次のサイクルnにてバッファbufnに格納される。このとき、連結シンボルデータsdatan-1は先頭ビット位置sptrn-1から終了ビット位置eptrn-1の領域に格納される為、最終ビット位置の値endn-1 が“0”の時は以下の式(33)、“1”の時は式(34)となる。ここで“not()”は各ビットのビット反転を示す。
endn-1=0 かつ extn-1=0の時 bufn(sptrn-1: eptrn-1) = sdatan-1(0: plenn-1-1) …(33)
endn-1=1 かつ extn-1=0の時 bufn(sptrn-1: eptrn-1) = not(sdatan-1(0: plenn-1-1)) …(34)
また、サイクルn-1においてフラグextn-1が“1”の時は、データ幅plenn-1は“5”より大きい為、連結シンボルデータsdatan-1(0:4)が次のサイクルnにてバッファbufnに格納される。このとき、連結シンボルデータsdatan-1は先頭ビット位置sptrn-1からビット拡張の開始位置extptrn-1の1ビット手前の領域に格納される為、最終ビット位置の値endn-1 が“0”の時は以下の式(35)、“1”の時は式(36)となる。
endn-1=0 かつ extn-1=1の時 bufn(sptrn-1: extptrn-1-1) = sdatan-1(0:4) …(35)
endn-1=1 かつ extn-1=1の時 bufn(sptrn-1: extptrn-1-1) = not(sdatan-1(0:4)) …(36)
同時に、フラグextn-1が“1”の時は、連結シンボルデータsdatan-1(4)の値がビット拡張の開始位置extptrn-1から終了ビット位置eptrn-1の間に拡張されて、次のサイクルnにてバッファbufnに格納される為、最終ビット位置の値endn-1 が“0”の時は以下の式(37)、“1”の時は式(38)となる。
endn-1=0 かつ extn-1=1の時:
bufn(extptrn-1:eptrn-1)= sdatan-1(4), sdatan-1(4),…,sdatan-1(4) …(37)
endn-1=1 かつ extn-1=1の時:
bufn(extptrn-1:eptrn-1)= not(sdatan-1(4), sdatan-1(4),…,sdatan-1(4)) …(38)
また、図6の“出力”はパッカ304のパックされてたデータの出力であり、それぞれのサイクルにて、出力パック数ocntnの値に従って、バッファ“bufn(0:15)”、“bufn(16:31)”、“bufn(32:47)”、“bufn(48:63)”のそれぞれ16ビットの領域を選択して出力する。以下の式(39)、(40、(41)、(42)に選択動作を示す。
ocntn=1の時 出力 = bufn(0:15) …(39)
ocntn=2の時 出力 = bufn(16:31) …(40)
ocntn=3の時 出力 = bufn(32:47) …(41)
ocntn=4の時 出力 = bufn(47:63) …(42)
次に、パッカ304に、1ブロック64ビット分の連結シンボルデータが、パック長2、5、7、17、19、EOB(64)の順で入力され、かつ入力端子310に初期値“1”が設定された場合の動作を例にあげて説明する。
先ず、サイクル0では、リセット動作等の初期化手段により、パック長の和sum0、先頭ビット位置sptr0、終了ビット位置eptr0、フラグext0、ビット拡張の開始位置extptr0、入力パック数pcnt0、未出力パック数rest0、出力パック数ocnt0に“0”が設定される。また、入力端子310より入力されたブロックの最初の画素値が“1”であるので、前のサイクルの連結シンボルデータの最終ビット(即ち、直前の画素値)が“0”であったとみなし最終ビット位置の値end0 に“0”が設定される。このとき、有効信号vaild0は停止信号busy0も初期化されてともに“0”を出力する。
次にサイクル1では、n=1であり、busy0= 0より、式(23)の条件が成り立ち、連結シンボルデータsdata1として図5の符号番号0の値“10000”が入力される。同様にbusy0= 0より式(25)の条件が成り立ち、パック長plen1として“2”が入力される。
また、最終ビット位置の値end1は式(3)より通常はサイクル0で入力された連結シンボルデータの4ビット目を格納するが、サイクル0では入力されていないので、end0の値“0”を保持する。
同様に、サイクル0にて連結シンボルデータが入力されていない為、式(33)乃至(38)は成り立たない為、バッファbuf1へのデータの格納は行なわれない。
出力パック数ocnt1はrest0=0かつocnt0=0より式(31)の条件が成り立ち“0”(ocnt1= ocnt0=0)に設定される。
パック長の和sum1はsum0 =0かつocnt1=0より、式(4)の条件が成り立つ為“2”(sum1 = sum0 + plen1 = 0+2 = 2)に設定される。
先頭ビット位置sptr1はsum1 =2かつocnt1=0 より、式(7)の条件が成り立つ為、“0”(sptr1 = sum0 = 0)に設定される。
終了ビット位置eptr1はsum1=2かつocnt1=0 より、式(9)の条件が成り立つ為、“1”(eptr1 = sum1 - 1=2-1=1)に設定される。
フラグext1はパック長plen1 =2より、式(12)の条件が成り立つ為、“0”に設定される。
ビット拡張の開始位置extptr1はext1=0かつocnt1=0より式(14)の条件が成り立つ為、“2”(extptr1= sum1=2)に設定される。
入力パック数pcnt1はsum1 =2かつocnt1=0 より、式(17)の条件が成り立つ為“0”(pcnt1 = sum1 /16 = 2/16=0)が設定される。
未出力パック数rest1はocnt1=0より式(26)の条件が成り立つ為、“0”(rest1 = pcnt1 - ocnt1=0-0=0)に設定される。
valid1はrest0=0より式(29)の条件が成り立ち、“0”が出力される。
さらに、停止信号busy1はsum1=2より式(20)の条件が成り立ち“0”が出力される。
次にサイクル2では、n=2であり、busy1= 0より、式(23)の条件が成り立ち、連結シンボルデータsdata1として図5の符号番号5の値“10000”が入力される。同様にbusy2= 0より式(25)の条件が成り立ち、パック長plen2として“5”が入力される。
また、最終ビット位置の値end2は式(3)より連結シンボルデータsdata1(4)の値“0”が入力される。
さらに、バッファbuf2にはend1=0かつext1=0であり、式(33)の条件が成り立つ。式(33)において、sptr1=0、eptr1=1、plen1=2より、式(38)の左辺は、buf2(sptr1: etptr1) = buf2(0:1)となり、右辺はsdata1(0: plen1-1)=sdata1(0: 2-1)= sdata1(0:1)=“10”となる為、buf2(0:1)=“10”となり、バッファbufの0〜1ビット目に“10”が格納される。
また、出力パック数ocnt2はrest1=0かつocnt1=0より式(31)の条件が成り立ち、“0”(ocnt2= ocnt1=0)に設定される。
パック長の和sum2はsum1 =2かつocnt2=0より式(4)の条件が成り立つ為、“7”(sum2 = sum1 + plen2 = 2+5 = 7)に設定される。
先頭ビット位置sptr2はsum2 =7かつocnt2=0 より式(7)の条件が成り立つ為“2”(sptr2 = sum1 = 2)に設定される。
終了ビット位置eptr2はsum2=7かつocnt2=0 より式(9)の条件が成り立つ為“6”(eptr2 = sum2 - 1=7-1=6)に設定される。
フラグext2はパック長plen2 =5より式(12)の条件が成り立つ為“0”に設定される。
ビット拡張の開始位置extptr2はext2=0かつocnt2=0より式(14)の条件が成り立つ為“7”(extptr2= sum2=7)に設定される。
入力パック数pcnt2はsum2 =7かつocnt2=0 より式(17)の条件が成り立つ為、“0”(pcnt2 = sum2/16 = 7/16=0)が設定される。
未出力パック数rest2はocnt2=0より式(26)の条件が成り立つ為、“0”(rest2 = pcnt2 - ocnt2=0-0=0)に設定される。
有効信号valid2はrest1=0より式(29)の条件が成り立ち、“0”が出力される。
さらに、停止信号busy2はsum2=7より式(20)の条件が成り立ち“0”が出力される。
次にサイクル3では、n=3であり、busy2= 0より、式(23)の条件が成り立ち、連結シンボルデータsdata3として図5の符号番号16の値“11100”が入力される。同様にbusy2= 0より式(25)の条件が成り立ち、パック長plen3として“7”が入力される。
また、最終ビット位置の値end3は式(3)より連結シンボルデータsdata2(4)の値“0”が入力される。
さらに、バッファbuf3にはend2=0かつext2=0であり、式(33)の条件が成り立つ。式(33)において、sptr2=2、eptr2=6、plen2=5より、式(33)の左辺は、buf3(sptr2: etptr2) = buf3(2:6)となる。そして、右辺はsdata2(0: plen2-1)=sdata2(0: 4)= sdata2(0:4)=“10000”となる為、buf2(2:6)=“10000”となり、バッファbufの2〜6ビット目に“10000”が格納される。よって、サイクル2で格納されたものと合わせて、buf3(0:6)=“1010000”となる。
また、出力パック数ocnt3はrest2=0かつocnt2=0より式(31)の条件が成り立ち、“0”(ocnt3= ocnt2=0)に設定される。
パック長の和sum3はsum2 =7かつocnt3=0より式(4)の条件が成り立つ為“14”(sum3 = sum2 + plen3 = 7+7 = 14)に設定される。
先頭ビット位置sptr3はsum3 =14かつocnt3=0 より式(7)の条件が成り立つ為、“7”(sptr3 = sum2 = 7)に設定される。
終了ビット位置eptr3はsum3=14かつocnt3=0 より式(9)の条件が成り立つ為“13”(eptr3 = sum3 - 1=14-1=13)に設定される。
フラグext3はパック長plen3 =7より式(13)の条件が成り立つ為“1”に設定される。
ビット拡張の開始位置extptr3はext3=1かつocnt3=0より式(15)の条件が成り立つ為“12”(extptr3= sum3 - (plen3- 5)=14-(7-5)=12)に設定される。
入力パック数pcnt3はsum3 =14かつocnt3=0 より式(17)の条件が成り立つ為“0”(pcnt3 = sum3/16 = 14/16=0)が設定される。
未出力パック数rest3はocnt3=0より式(26)の条件が成り立つ為、“0”(rest3 = pcnt3 - ocnt3=0-0=0)に設定される。
有効信号valid3はrest2=0より式(29)の条件が成り立ち、“0”が出力される。
さらに、停止信号busy3はsum3=14より式(20)の条件が成り立ち“0”が出力される。
次にサイクル4では、n=4であり、busy3= 0より、式(23)の条件が成り立ち、連結シンボルデータsdata4として図5の符号番号10の値“11000”が入力される。同様にbusy3= 0より式(25)の条件が成り立ち、パック長plen4として“17”が入力される。
また、最終ビット位置の値end4は式(3)より連結シンボルデータsdata3(4)の値“0”が入力される。
さらに、バッファbuf4にはend3=0かつext3=1であり、式(35)の条件が成り立つ。式(35)において、sptr3=7、extptr3=12、plen3=7より、式(35)の左辺は、buf4(sptr3: extptr3-1) = buf4(7:12-1)= buf4(7:11)となり、右辺はsdata3(0:4)=“11100”となる為、buf4(7:11)=“11100”となる。従ってバッファbufの7〜11ビット目に“11100”が格納される。また、式(37)の条件が成り立つ。式(37)において、extptr3=12、eptr3=13より、式(37)の左辺は、buf4(extptr3: eptr3) = buf4(12:13)となり、右辺はsdata3(4)が2ビット拡張され、“00”となる為、buf4(12:13)=“00”となる。従って、バッファbufの12〜13ビット目に“00”が格納される。よって、サイクル2及び3で格納されたものと合わせて、buf4(0:13)=“10100001110000”となる。
また、出力パック数ocnt4はrest3=0かつocnt3=0より、式(31)の条件が成り立ち“0”(ocnt4= ocnt3=0)に設定される。
パック長の和sum4は、sum3 =14かつocnt3=0より式(4)の条件が成り立つ為、“31”(sum4 = sum3+ plen4 = 14+17 = 31)に設定される。
先頭ビット位置sptr4はsum4 =31かつocnt4=0 より式(7)の条件が成り立つ為“14”(sptr4= sum3 = 14)に設定される。
終了ビット位置eptr4は、sum4=31かつocnt4=0 より式(9)の条件が成り立つ為、“30”(eptr4= sum4 - 1=31-1=30)に設定される。
フラグext4は、パック長plen4 =17より式(13)の条件が成り立つ為“1”に設定される。
ビット拡張の開始位置extptr4は、ext4=1かつocnt4=0より式(15)の条件が成り立つ為、“19”(extptr4= sum4 - (plen4- 5)=31-(17-5)=19)に設定される。
入力パック数pcnt4は、sum4 =31かつocnt4=0 より式(17)の条件が成り立つ為、“1”(pcnt4 = sum4/16 = 31/16=1)が設定される。
未出力パック数rest4は、ocnt4=0より式(26)の条件が成り立つ為、“1”(rest4 = pcnt4 - ocnt4=1-0=1)に設定される。
有効信号valid4は、rest3=0より式(29)の条件が成り立ち、“0”が出力される。
さらに、停止信号busy4は、sum4=31より式(20)の条件が成り立ち、“0”が出力される。
次にサイクル5では、n=5であり、busy4= 0より、式(23)の条件が成り立ち、連結シンボルデータsdata5として図5の符号番号20の値“11100”が入力される。同様にbusy4= 0より式(25)の条件が成り立ち、パック長plen5として“19”が入力される。
また、最終ビット位置の値end5は式(3)より連結シンボルデータsdata4(4)の値“0”が入力される。
さらに、バッファbuf5にはend4=0かつext4=1であり、式(35)の条件が成り立つ。式(35)において、sptr4=14、extptr4=19より、式(35)の左辺は、buf5(sptr4: extptr4-1) = buf5(14:19-1)= buf5(14:18)となり、右辺はsdata4(0:4)=“11000”となる為、buf5(14:18)=“11000”となる。従って、バッファbufの14〜18ビット目に“11000”が格納される。また、式(37)の条件が成り立つ。式(37)において、extptr4=19、eptr4=30より式(37)の左辺は、buf5(extptr4: eptr4) = buf5(19:30)となり、右辺はsdata4(4)が12ビット拡張され、“000000000000”となる為、buf5(19:30)=“000000000000”となる。従って、バッファbufの19〜30ビット目に“000000000000”が格納される。よって、サイクル2,3及び4で格納されたものと合わせて、buf5(0:15)=“1010000111000011”及びbuf5(16:30)=“000000000000000”となる。
また、出力パック数ocnt5は、rest4=1かつocnt4=0より式(30)の条件が成り立ち、“1”(ocnt5= ocnt4+1=0+1=1)に設定される。
パック長の和sum5は、sum4 =31かつocnt5=1より式(4)の条件が成り立つ為、“50”(sum5= sum4+ plen5 = 31+19 = 50)に設定される。
先頭ビット位置sptr5は、sum5 =50かつocnt5=1 より式(7)の条件が成り立つ為、“31”(sptr5 = sum4 = 31)に設定される。
終了ビット位置eptr5は、sum5=50かつocnt5=1より式(9)の条件が成り立つ為、“49”(eptr5= sum5 - 1=50-1=49)に設定される。
フラグext5は、パック長plen5 =19より式(13)の条件が成り立つ為“1”に設定される。
ビット拡張の開始位置extptr5は、ext5=1かつocnt5=1より式(15)の条件が成り立つ為、“36”(extptr5= sum5 - (plen5- 5)=50-(19-5)=36)に設定される。
入力パック数pcnt5は、sum5 =50かつocnt5=1 より式(17)の条件が成り立つ為、“3”(pcnt5 = sum5/16 = 50/16=3)が設定される。
未出力パック数rest5は、ocnt5=1より式(26)の条件が成り立つ為、“2”(rest5 = pcnt5 - ocnt5=3-1=2)に設定される。
有効信号valid5は、rest4=1より式(28)の条件が成り立ち、“1”が出力される。このとき、出力パック数ocnt5が“1”である為、式(39)が成り立ち、パックされた出力データとしてバッファbuf5(0:15)の値“1010000111000011”選択されて出力される。
さらに、停止信号busy5はsum5=50より式(20))の条件が成り立ち“0”が出力される。
次にサイクル6では、n=6であり、busy5= 0より、式(23)の条件が成り立ち、連結シンボルデータsdata6として図5の符号番号9の連結シンボルデータで、最終単体符号語としてEOB(64)が入力されているものとする。即ち、“10000”が入力される。同様にbusy5= 0より式(25)の条件が成り立ち、パック長plen6として“EOB”すなわち64が入力される。
また、最終ビット位置の値end6は式(3)より、連結シンボルデータsdata5(4)の値“0”が入力される。
さらに、バッファbuf6にはend5=0かつext5=1であり、式(35)の条件が成り立つ。式(35)において、sptr5=31、extptr5=36より、式(35)の左辺は、buf6(sptr5: extptr5-1) = buf6(31:36-1)= buf6(31:35)となる。右辺はsdata5(0:4)=“11100”となる為、buf6(31:35)=“11100”となる。従って、バッファbufの31〜35ビット目に“11100”が格納される。また、式(37)の条件が成り立つ。式(37)において、extptr5=36、eptr5=49より、式(37)の左辺は、buf6(extptr5: eptr5) = buf6(36:49)となる。また右辺のsdata5(4)が14ビット拡張され、“00000000000000”となる為、buf6(36:49)=“00000000000000”となる。従って、バッファbufの36〜49ビット目に“00000000000000”が格納される。よって、サイクル2,3,4及び5で格納されたものと合わせて、buf6(0:15)=“1010000111000011”, buf6(16:31)=“0000000000000001”, buf6(32:47)=“1110000000000001”,及びbuf6(48:49)=“00”となる。
また、出力パック数ocnt6は、rest5=2かつocnt5=1より式(30)の条件が成り立ち、“2”(ocnt6= ocnt5+1=1+1=2)に設定される。
パック長の和sum6は、sum5 =50かつocnt6=2より式(4)の条件が成り立つ為、“114”(sum6= sum5+ plen6 = 50+64 = 114)に設定される。
先頭ビット位置sptr6は、sum6 =114かつocnt6=2 より式(7)の条件が成り立つ為、“50”(sptr6 = sum5 = 50)に設定される。
終了ビット位置eptr6は、sum6=114かつocnt6=2より式(10)の条件が成り立つ為、“63”に設定される。
フラグext6は、パック長plen6 =64より式(13)の条件が成り立つ為、“1”に設定される。
ビット拡張の開始位置extptr6は、ext6=1かつocnt6=2より式(15)の条件が成り立つ為、“55”(extptr6= sum6 - (plen6- 5)=114-(64-5)=55)に設定される。
入力パック数pcnt6は、sum6 =114かつocnt6=2 より式(18)の条件が成り立つ為、“4”に設定される。
未出力パック数rest6は、ocnt6=2より式(26)の条件が成り立つ為、“2”(rest6 = pcnt6- ocnt6=4-2=2)に設定される。
有効信号valid6はr、est5=2より式(28)の条件が成り立ち、“1”が出力される。このとき、出力パック数ocnt6が“2”である為、式(40)が成り立ち、パックされた出力データとしてバッファbuf5(16:31)の値“0000000000000001”が選択されて出力される。
さらに、停止信号busy6は、sum6=114より式(21)の条件が成り立ち“1”が出力される。
次にサイクル7では、n=7であり、busy6= 1より、式(22)の条件が成り立ち、テーブル303に対して連結シンボルデータの入力を停止する(サイクル6のデータを保持させる)。同様にbusy6= 0より式(24)の条件が成り立ち、演算部309に対してパック長の入力を停止する(サイクル6のデータを保持させる)。
また、最終ビット位置の値end7は式(3)より、連結シンボルデータsdata6(4)の値“0”が入力される。
さらに、バッファbuf7にはend6=0かつext6=1であり、式(35)の条件が成り立つ。式(35)において、sptr6=50、extptr6=55より、式(35)の左辺は、buf7(sptr7: extptr7-1) = buf7(50:55-1)= buf7(50:54)となる。また、右辺はsdata6(0:4)=“10000”となる為、buf7(50:54)=“10000”となる。従って、バッファbufの50〜54ビット目に“10000”が格納される。また、式(37)の条件が成り立つ。式(37)において、extptr6=55、eptr6=63より、式(37)の左辺は、buf7(extptr6: eptr6) = buf6(55:63)となる。また、右辺はsdata6(4)が9ビット拡張され、“000000000”となる為、buf7(55:63)= 000000000”となる。従って、バッファbufの55〜63ビット目に000000000”が格納される。よって、サイクル2,3,4,5及び6で格納されたものと合わせて、buf7(0:15)=“1010000111000011”, buf7(16:31)=“0000000000000001”, buf7(32:47)=“1110000000000001”,及びbuf7(48:63)=“ 0010000000000000”となる。
また、出力パック数ocnt7は、rest6=2かつocnt6=2より式(30)の条件が成り立ち、“3”(ocnt7= ocnt6+1=2+1=3)に設定される。
パック長の和sum7は、sum6 =114かつocnt7=3より式(5)の条件が成り立つ為、“114”(sum7= sum6= 114)に設定される。
先頭ビット位置sptr7は、sum7 =114かつocnt7=3 より式(7−1)の条件が成り立つ為、“50”(sptr7 = sptr6= 50)に設定される。
終了ビット位置eptr7は、sum7=114かつocnt7=3より式(10)の条件が成り立つ為、“63”に設定される。
フラグext7は、パック長plen7 =64より式(13)の条件が成り立つ為、“1”に設定される。
ビット拡張の開始位置extptr7は、ext7=1かつocnt7=3より式(15)の条件が成り立つ為、“55”(extptr7= sum7 - (plen7- 5)=114-(64-5)=55)に設定される。
入力パック数pcnt7は、sum7=114かつocnt7=3 より式(18)の条件が成り立つ為“4”に設定される。
未出力パック数rest7は、ocnt7=3より式(26)の条件が成り立つ為、“1”(rest7 = pcnt7- ocnt7=4-3=1)に設定される。
有効信号valid7は、rest7=1より式(28)の条件が成り立ち、“1”が出力される。このとき、出力パック数ocnt7が“3”である為、式(41)が成り立ち、パックされた出力データとしてバッファbuf7(32:47)の値“1110000000000001”選択されて出力される。
さらに、停止信号busy7は、sum7=114より式(21)の条件が成り立ち、“1”が出力される。
次にサイクル8では、n=8であり、サイクル7と同様にbusy7= 1より式(22)の条件が成り立ち、テーブル303に対して連結シンボルデータの入力を停止する(サイクル7のデータを保持させる)。同様にbusy7= 0より式(24)の条件が成り立ち、演算部309に対してパック長の入力を停止する(サイクル7のデータを保持させる)。
また、最終ビット位置の値end8は、サイクル7と同様に式(3)より連結シンボルデータsdata7(4)の値“0”が入力される。
さらに、バッファbuf8は、サイクル7において、end7、ext7、sptr7、extptr7、eptr7等の値が、サイクル6の時と変化していないため、バッファbuf8のデータはバッファbuf7と同等である。
また、出力パック数ocnt8は、rest7=1かつocnt7=3より式(30)の条件が成り立ち、“4”(ocnt8= ocnt7+1=3+1=4)に設定される。
パック長の和sum8は、ocnt8=4より式(6)の条件が成り立つ為、“0”に設定される。
先頭ビット位置sptr8も同様に、ocnt8=4 より式(8)の条件が成り立つ為、“0”設定される。
終了ビット位置eptr7も同様にo、cnt8=4より式(11)の条件が成り立つ為“0”に設定される。
フラグext8は、パック長plen8 =64より式(13)の条件が成り立つ為、“1”に設定される。
ビット拡張の開始位置extptr8も同様に、ocnt8=4より式(16)の条件が成り立つ為“0”に設定される。
入力パック数pcnt7も同様に、ocnt8=4 より式(19)の条件が成り立つ為“0”に設定される。
未出力パック数rest8も同様に、ocnt8=4より式(27)の条件が成り立つ為“0”に設定される。
有効信号valid7は、rest7=1より式(28)の条件が成り立ち、“1”が出力される。このとき、出力パック数ocnt8が“4”である為、式(42)が成り立ち、パックされた出力データとしてバッファbuf8(48:63)の値“0010000000000000”が選択されて出力される。
さらに、停止信号busy8は、sum8=0より式(20)の条件が成り立ち、“0”が出力される。
以上のサイクル1〜サイクル8の動作により、1ブロック64ビットのパック動作が完了する。次のサイクルでは、出力パック数ocnt9は、ocnt8=4より式(32)の条件が成り立ち、“0”にクリアされ、前記サイクル0と同様な、初期状態に移行する。
[第2の実施形態]
次に、図7A、7Bを用いて第2の実施形態のデコードテーブルを説明する。ここで図2と同様に説明のためにそれぞれの連結符号語に対して符号語番号を付与している。
符号語番号0の連結符号語は、単体符号語“00”が3つ続けてデコードされる場合であり、デコードされた連結シンボルデータは“101”(3画素が復号される)となる。また、符号語番号1の連結符号語は単体符号語“00”が2つ続き、その後に単体符号語“01”が続けてデコードされる場合であり、デコードされた連結シンボルデータは“1011”となる。また、符号語番号2の連結符号語は単体符号語“00”が2つ続き、その後に単体符号語“100”が続けてデコードされる場合であり、デコードされた連結シンボルデータは“10111”となる。また、符号語番号3の連結符号語は単体符号語“00”が2つ続き、その後に単体符号語“101”が続けてデコードされる場合であり、デコードされた連結シンボルデータは“101111”となる。さらに、符号語番号4の連結符号語は単体符号語“00”が2つ続き、その後に単体符号語“11******”(ここで、******は000100-111101(十進数で4乃至61)のいずれかの値)が続けてデコードされる場合であり、デコードされた連結シンボルデータは“10”の後、5乃至62個の“1”が続く連結シンボルデータとなる。
同様な方法で、図7A,7Bには連結シンボルデータを構成する4つの連続する単体符号語に対して単体符号語“00”, “01”, “100”, “101”, “11******”がそれぞれ出現した場合の組み合わせが列挙されている。但し、符号語番号20,41,62,83においては、連結符号語は2番目の単体符号語を“11******”とする2つの単体符号語で構成されている。また、符号語番号84においては、連結符号語は単体符号語“11******”のみで構成されている。
尚、図示していない例外処理として、単体符号語“EOB”が連結符号語の途中で出現した場合は、1ブロックの残りの画素全てに関して、直前にデコードされたシンボルの値が0だった場合は1を連結シンボルデータを出力する。また、直前にデコードされたシンボルの値が1だった場合は0を連結シンボルデータを出力する。さらに、単体符号語“EOB”が連結符号語の先頭で出現した場合(連結符号語自身がEOBの場合)は、直前の画素データが0の場合には、1ブロックの残りの画素全てを1として出力する。また、直前の画素データが1の場合は1ブロック残りの画素全て0を出力する。
図8は、第2の実施形態の復号部104のブロック構成図である。図中、800は符号データの入力端子であり、801は符号データから連結符号語を頭出しするためのシフタであり、802は連結符号語をデコードして、後述のデコードテーブル803にアドレスを出力する為のデコーダである。803は図7A,7Bのデコードテーブルを実現する為のテーブルであり、804はデコードされた連結シンボルデータを16ビット単位でパックする為のパッカである。805は16ビットパック後の画素データを出力する為の出力端子である。また、806は連結符号語をデコードして、後述のテーブル807及びテーブル808にアドレスを供給する為のデコーダである。807はデコードされた画素数を示すデータ長(以下、パック長と称す)を算出する為のオフセット値(以下、ベース値と称す)を出力する為のテーブルである。808は符号データの頭だしをする為のシフト量(以下、シフト量と称す)を出力する為のテーブルである。また、809はテーブル807からのベース値と複数符号データからパック長を算出する為の演算部であり、810はブロックの最初の画素値(初期値)を入力する為の1ビットの入力端子である。
次に図8の復号部の処理内容を説明する。先ず入力端子800から入力された符号データはシフタ801を介してデコーダ802、808に入力される。ここで、図7A,7Bの例では連結符号語の最大ビット数は14ビットである為、14ビット分の符号データがデコーダ802、806及びテーブル807に入力される。デコーダ802では図7A,7Bの連結符号語のデコードを行い、デコード結果をテーブルのアドレスとしてテーブル803に出力する。
ここで、テーブル803は図7A,7Bに示した連結符号語の数として85個必要であるが、後述するように第2の実施形態ではテーブルのエントリー数を21個に減らして、デコーダ802及びテーブル803の回路規模の削減を図っている。
その後、テーブル803はデコーダ802からのアドレスに従って連結シンボルデータをパッカ804に出力する。ここで、後述するようにテーブル803から出力する連結シンボルデータは、図3で説明したのと同様に、最後の変化点の位置と次画素の値がわかれば良いので、最後の変化点の次画素まで格納されている。即ち、図7A,7Bの符号語番号78〜82に対応する連結シンボルデータの時、最大のビット幅となり、このときの最後の変化点の次画素である9ビットのバス幅でパッカ804に対して出力される。
一方、デコーダ806に入力された符号データは、図7A,7Bの連結符号語のデコードを行い、デコード結果をテーブルのアドレスとしてテーブル807及びテーブル808に出力する。ここで、テーブル807のエントリー数は、図7A,7Bに示した連結符号語の数と同等の数が必要であるが、後述するように第2の実施形態では22個に減らして、デコーダ806、テーブル807及びテーブル808の回路規模の削減を図っている。
また、図10A,10Bで説明するように、シフト量の算出に連結符号語の所定のビットを用いる為、演算部809に、シフタ801から出力された連結符号語が入力されている。その後、テーブル807はデコーダ806からのアドレスに従ってベース値を演算部809に出力する。演算部809では後述するようにベース値と、連結符号語の所定のビット位置の値の総和からパック長を算出し、パッカ804に出力し、かつシフト量をシフタ801に出力する。その後、パッカ804ではパック長と、入力端子810から入力されるブロックの初期値に従って、連結シンボルデータの最終単体シンボルデータの生成、及び、出力端子805に対する16ビットにパックした画素データの出力を行なう。又、シフタ801はシフト量に従って、次の連結符号語の頭出しを行なう。以上の繰り返しにより、デコード動作を行なう。
次に図9A,9Bを用いてデコーダ802及びテーブル803の動作を説明する。符号番号、連結符号語に関しては、図7A,7Bと同一である。相違点は、デコーダ802のアドレス値が追加されている点と、連結シンボルデータが、8ビット目まで拡張されている点である。例えば、図7A,7Bの符号語番号0の連結シンボルデータは“101”であったが、図9A,9Bでは最終単体シンボルのデコード値である3つ目のシンボルのデコード値“1”が拡張されて、連結シンボルデータが“101111111”となっている。これは、後段のパッカ804にて、デコードされた画素数を示すパック長を用いて連結シンボルデータのビット幅を決定し、最終単体シンボルのデコード値の開始位置と値がわかれば、連結シンボルデータの値が決定することが可能である為、最終単体シンボルのデコード値の開始位置が最も長い連結符号語(符号語番号78乃至82)の9ビットにバス幅を合わせているためである。これらのビット拡張により、連結シンボルデータが同一になるものに対して、デコーダ302の出力のアドレスを割り振ることにより、図7A,7Bにて元々必要であったエントリー数85個を21個に削減することが可能となる。これにより、デコーダ802とテーブル803の回路規模の削減を図っている。
次に図10A,10Bを用いてデコーダ806、テーブル807及びテーブル808の動作を説明する。先ず、単体符号語を識別する為のヘッダの使用は、図5で説明したものと同等である。
デコーダ806は単体符号のヘッダに着目して、連結符号語のデコードを行なう。図10A,10Bはデコーダ806の出力であるアドレス毎に図9A,9Bのデコードテーブルを並び替えた表である。又、“シフト量”はテーブル807の出力であるシフト量を示し、“ベース値”はシフト量を計算する為の各アドレス毎に共通なオフセット値を示し、“1の数”は各連結符号語のヘッダ以外のビットが“1”になっている数を示す。ここで説明のために符号番号を付与しているが、これは図9A,9Bのものとは異なる。
次にアドレス及びシフト量のデコード方法とパック長の計算方法に関して図10A,10Bを用いて説明する。
先ず、符号番号0乃至7に関しては、連結符号語を構成する単体符号語のヘッダが全て“0”である為、“0*0*0*”(*は0又は1)の連結符号語としてデコードを行い、デコーダ806はアドレス“0”を出力する。この時、連結符号語の符号長は“6”である為、シフタ801へシフト量“6”を出力する。また、パック長に関してはベースを“3”として、1の数との和により算出する。即ち、符号語番号0の時は、1の数が0である為、パック長は3+0=3となる。符号語番号1,2,4の時は、1の数が1つである為、パック長は3+1=4となる。また、符号語番号3,5,6の時は、1の数が2つである為、パック長は3+2=5となる。符号語番号7の時は、1の数が3つである為、パック長は3+3=6となる。つまり、連結符号語をcode[0:13](符号データの先頭を0ビット目とする)とすると、パック長=3+code[1]+code[3]+code[5]で算出され、パッカ804へ出力される。
以下同様に、符号番号8乃至15に関しては、連結符号語を構成する単体符号語のヘッダが同一である為、“0*0*0*”(*は0又は1)の連結符号語としてデコードを行い、デコーダ806はアドレス“1”を出力する。この時、連結符号語の符号長は“7”である為、シフタ801へシフト量“7”を出力する。また、パック長に関してはベース“5”+ “1の数”として、パック長=5+code[1]+code[3] +code[6]で算出され、パッカ804へ出力される。
符号番号16は、連結符号語の最後の単体符号語がEOBの場合であり、“0*0*110000”(*は0又は1)の連結符号語としてデコードを行い、デコーダ806はアドレス“3”を出力する。この時、連結符号語の符号長は“10”である為、シフタ801へシフト量“10”を出力する。また、パック長に関してはブロックエンドまで(EOB)を示す“64”として、パッカ804へ出力される。
符号番号17乃至20に関しては、連結符号語を構成する単体符号語のヘッダが同一である為、“0*0*11######”(*は0又は1、######は000100-111101(十進数で4-61)であり、この数字をnとする)の連結符号語としてデコードを行い、デコーダ806はアドレス“3”を出力する。この時、連結符号語の符号長は“12”である為、シフタ801へシフト量“12”を出力する。また、パック長に関してはベース“3”+ “1の数”+nとして、パック長=3+code[1]+code[3]+nで算出され、パッカ804へ出力される。
符号番号21乃至28に関しては、連結符号語を構成する単体符号語のヘッダが同一である為、“0*10*0*”(*は0又は1)の連結符号語としてデコードを行い、デコーダ806はアドレス“4”を出力する。この時、連結符号語の符号長は“7”である為、シフタ801へシフト量“7”を出力する。また、パック長に関してはベース“5”+ “1の数”として、パック長=5+code[1]+code[4] +code[6]で算出され、パッカ804へ出力される。
符号番号29無し36に関しては、連結符号語を構成する単体符号語のヘッダが同一である為、“0*10*10*”(*は0又は1)の連結符号語としてデコードを行い、デコーダ806はアドレス“5”を出力する。この時、連結符号語の符号長は“8”である為、シフタ801へシフト量“8”を出力する。また、パック長に関してはベース“7”+ “1の数”として、パック長=7+code[1]+code[4] +code[7]で算出され、パッカ804へ出力される。
符号番号37は符号番号38乃至41に関して連結符号語の最後の単体符号語がEOBの場合であり、“0*10*110000”(*は0又は1)の連結符号語としてデコードを行い、デコーダ806はアドレス“6”を出力する。この時、連結符号語の符号長は“11”である為、シフタ801へシフト量“11”を出力する。また、パック長に関してはブロックエンドまで(EOB)を示す“64”として、パッカ8804へ出力される。
符号番号38乃至41に関しては、連結符号語を構成する単体符号語のヘッダが同一である為、“0*10*11######”(*は0又は1、######は000100-111011(十進数で4乃至59)であり、この数字をnとする)の連結符号語としてデコードを行い、デコーダ806はアドレス“7”を出力する。この時、連結符号語の符号長は“13”である為、シフタ801へシフト量“13”を出力する。また、パック長に関してはベース“5”+ “1の数”+nとして、パック長=5+code[1]+code[4]+nで算出され、パッカ804へ出力される。
符号番号42は符号番号43、44に関して連結符号語の最後の単体符号語がEOBの場合であり、“0*110000”(*は0又は1)の連結符号語としてデコードを行うことになる。デコーダ806はアドレス“8”を出力する。この時、連結符号語の符号長は“8”である為、シフタ801へシフト量“8”を出力する。また、パック長に関してはブロックエンドまで(EOB)を示す“64”として、パッカ804へ出力される。
符号番号43、44に関しては、連結符号語を構成する単体符号語のヘッダが同一である為、“0*11######”(*は0又は1、######は000100-111110(十進数で4-62)であり、この数字をnとする)の連結符号語としてデコードを行い、デコーダ806はアドレス“9”を出力する。この時、連結符号語の符号長は“10”である為、シフタ801へシフト量“10”を出力する。また、パック長に関してはベース“2”+ “1の数”+nとして、パック長=2+code[1]+nで算出され、パッカ804へ出力される。
符号番号45乃至52に関しては、連結符号語を構成する単体符号語のヘッダが同一である為、“10*0*0*”(*は0又は1)の連結符号語としてデコードを行い、デコーダ806はアドレス“10”を出力する。この時、連結符号語の符号長は“7”である為、シフタ801へシフト量“7”を出力する。また、パック長に関してはベース“5”+ “1の数”として、パック長=5+code[2]+code[4] +code[6]で算出され、パッカ804へ出力される。
符号番号53乃至60に関しては、連結符号語を構成する単体符号語のヘッダが同一である為、“10*0*10*”(*は0又は1)の連結符号語としてデコードを行い、デコーダ806はアドレス“11”を出力する。この時、連結符号語の符号長は“8”である為、シフタ801へシフト量“8”を出力する。また、パック長に関してはベース“7”+ “1の数”として、パック長=7+code[2]+code[4] +code[7]で算出され、パッカ804へ出力される。
符号番号61は符号番号62乃至65に関して連結符号語の最後の単体符号語がEOBの場合であり、“10*0*110000”(*は0又は1)の連結符号語としてデコードを行う。デコーダ806はアドレス“12”を出力する。この時、連結符号語の符号長は“11”である為、シフタ801へシフト量“11”を出力する。また、パック長に関してはブロックエンドまで(EOB)を示す“64”となり、パッカ804へ出力される。
符号番号62乃至65に関しては、連結符号語を構成する単体符号語のヘッダが同一である為、“10*0*11######”(*は0又は1、######は000100-111011(十進数で4-59)であり、この数字をnとする)の連結符号語としてデコードを行い、デコーダ806はアドレス“13”を出力する。この時、連結符号語の符号長は“13”である為、シフタ801へシフト量“13”を出力する。また、パック長に関してはベース“5”+ “1の数”+nとして、パック長=5+code[2]+code[4]+nで算出され、パッカ804へ出力される。
符号番号66乃至73に関しては、連結符号語を構成する単体符号語のヘッダが同一である為、“10*10*0*”(*は0又は1)の連結符号語としてデコードを行い、デコーダ806はアドレス“14”を出力する。この時、連結符号語の符号長は“8”である為、シフタ801へシフト量“8”を出力する。また、パック長に関してはベース“7”+ “1の数”として、パック長=7+code[2]+code[5] +code[7]で算出され、パッカ804へ出力される。
符号番号74乃至81に関しては、連結符号語を構成する単体符号語のヘッダが同一である為、“10*10*10*”(*は0又は1)の連結符号語としてデコードを行い、デコーダ806はアドレス“15”を出力する。この時、連結符号語の符号長は“9”である為、シフタ801へシフト量“9”を出力する。また、パック長に関してはベース“9”+ “1の数”として、パック長=9+code[2]+code[5] +code[8]で算出され、パッカ804へ出力される。
符号番号82は符号番号83乃至86に関して連結符号語の最後の単体符号語がEOBの場合であり、“10*10*110000”(*は0又は1)の連結符号語としてデコードを行い、デコーダ806はアドレス“16”を出力する。この時、連結符号語の符号長は“12”である為、シフタ801へシフト量“12”を出力する。また、パック長に関してはブロックエンドまで(EOB)を示す“64”として、パッカ804へ出力される。
符号番号83乃至86に関しては、連結符号語を構成する単体符号語のヘッダが同一である為、“10*10*11######”(*は0又は1、######は000100-111001(十進数で4-57)であり、この数字をnとする)の連結符号語としてデコードを行い、デコーダ806はアドレス“17”を出力する。この時、連結符号語の符号長は“14”である為、シフタ801へシフト量“14”を出力する。また、パック長に関してはベース“7”+ “1の数”+nとして、パック長=7+code[2]+code[5]+nで算出され、パッカ804へ出力される。
符号番号87は符号番号88、89に関して連結符号語の最後の単体符号語がEOBの場合であり、“10*110000”(*は0又は1)の連結符号語としてデコードを行う。デコーダ806はアドレス“18”を出力する。この時、連結符号語の符号長は“9”である為、シフタ801へシフト量“9”を出力する。また、パック長に関してはブロックエンドまで(EOB)を示す“64”として、パッカ804へ出力される。
符号番号88乃至89に関しては、連結符号語を構成する単体符号語のヘッダが同一である為、“10*11######”(*は0又は1、######は000100-111100(十進数で4-60)であり、この数字をnとする)の連結符号語としてデコードを行う。デコーダ806はアドレス“19”を出力する。この時、連結符号語の符号長は“11”である為、シフタ801へシフト量“11”を出力する。また、パック長に関してはベース“4”+ “1の数”+nとして、パック長=4+code[2]+nで算出され、パッカ804へ出力される。
符号番号90に関しては、連結符号語は単体符号語がEOBそのものである為、そのままデコードを行い、デコーダ806はアドレス“20”を出力する。この時、連結符号語の符号長は“6”である為、シフタ801へシフト量“6”を出力する。また、パック長に関してはブロックエンドまで(EOB)を示す“64”として、パッカ804へ出力される。
符号番号91に関しては、連結符号語は単体符号“11******”(******は000100-111111(十進数で4-63)の値であり、この数字をnとする)そのものである為、そのままデコードを行う。デコーダ806はアドレス“21”を出力する。この時、連結符号語の符号長は“8”である為、シフタ801へシフト量“8”を出力する。また、パック長に関してはベース“1”として、パック長=1+nで算出され、パッカ804へ出力される。
以上説明したように、デコーダ806及びテーブル807において、連結符号語のデコードをヘッダ構成に着目してデコードし、かつパック長を連結符号語のヘッダ以外のビットの1の数を用いて算出することにより、92個のエントリー数を22個に減らす事が可能となり、デコーダ806とテーブル807の回路規模の削減が可能となる。
次にパッカ84の動作を説明する。パッカ804はパッカ304に対して入力される連結シンボルデータのビット幅が異なり、パッカ304の5ビットに対して、パッカ804は9ビットであるため、前記の式(3)、(12)、(13)、(15)、(35)、(36)、(37)、及び、(38)のの演算及び条件式が異なる。夫々を式(3−2)、(13−2)、(15−2)、(35−2)、(36−2)、(37ー2)、及び(38−2)として以下に示す。
endn=sdatan-1(8) … (3−2)
plenn≦9の時 extn= 0 …(12−2)
plenn>9の時 extn= 1 …(13−2)
extn =1 かつ ocntn≠4の時 extptrn = sumn - (plenn - 5) …(15−2)
endn-1=0 かつ extn-1=1の時 bufn(sptrn-1: extptrn-1-1) = sdatan-1(0:8) …(35−2)
endn-1=1 かつ extn-1=1の時 bufn(sptrn-1: extptrn-1-1) = not(sdatan-1(0:8)) …(36−2)
endn-1=0 かつ extn-1=1の時 bufn(extptrn-1:eptrn-1)= sdatan-1(8), sdatan-1(8),…,sdatan-1(8) …(37ー2)
endn-1=1かつextn-1=1の時 bufn(extptrn-1:eptrn-1)= not(sdatan-1(8), sdatan-1(8),…,sdatan-1(8)) …(38−2)
これらの演算式及び条件式を除けば、パッカ804の動作は図6で示したパッカ304の動作と同等であるため、説明を省略する。
以上説明したように、連結シンボルデータに関しては1シンボルのみのデコード時を除き、デコードテーブルに最後の変化点の次の画素まで格納し、パッカにてパック長分、前記最後の変化点の次の画素値を拡張することにした。これにより、連結シンボルデータのデコードテーブルのエントリー数の削減による、連結シンボルデータ用デコーダ及びテーブルの回路規模の削減が可能となる。また、シフト量及びパック長に関しては、連結符号語のヘッダ部分をデコードすることにより、シフト量及びパック長を算出するベース値を決定し、パック長を前記ベース値と、前記ヘッダ部分以外のビットとの総和で算出した。これにより、シフト量及びパック長用のデコードテーブルのエントリー数の削減による、シフト量及びパック長用デコーダ及びテーブルの回路規模の削減が可能になる。
これにより、小さな回路規模で連結シンボル同時デコードが可能な、可変長復号化装置を提供することが可能となる。
[第3の実施形態]
前記第1及び第2の実施形態における可変長符号化は1ビット/画素としてランレングス符号化を行っていた。しかしながら、多値の画素データにおいても(例えば8ビット/画素)、1ブロックを2色化し、入力画像が2色の代表色のどちらに属するかを識別する識別信号(2色の識別であるので1ビット/画素)と2色の代表色を符号化する構成においても適用できる。この場合は、図11に示すように上記識別信号にランレングス符号化を用い、2色の代表色をブロックの先頭(または後端(EOBの直後))に配置すればよい。ランレングス符号化された識別信号は、前記第1及び第2の実施形態に示した方法にて復号化することで、高速、且つ、低コストに構成することができる。
また、1ブロック2色以上の場合は、色の変化点をランレングス符号化し、ブロックの後端(ランレングス符号化のEOBの直後)に変化点毎の色を連結しておけばよい。例えば、図12(a)に示すブロックデータを図12(b)に示すように横方向にジグザグに走査した場合、3箇所の色の境界(変化点)が発生する。図13に上記図12(b)における符号化コードのパッキング例を示す。その境界までのラン長をランレングス符号化し(符号語数はEOBを含め4つ)、4色(境界+1色)のデータをその後にパックする。但し、境界毎にEOB以降にパックする色は増えるので、ブロック内の色数に関らず(境界+1色)分のパックが必要となる。
[他の実施形態]
前記した各実施形態の機能を、パーソナルコンピュータ等のプロセッサを内蔵する情報処理装置や、マイコンを内蔵する装置が実行するコンピュータプログラムでもって実現させても構わない。また、通常、コンピュータプログラムは、CD−ROM等のコンピュータ可読記憶媒体に格納されており、それをコンピュータが有する読取り装置(CD−ROMドライブ等)にセットし、システムにコピー若しくはインストールするとで実行可能になる。従って、かかるコンピュータ可読記憶媒体も本発明の範疇に入ることも明らかである。