(57)【要約】【課題】  可変長符号化において、所定単位の復号速度を保証する復号化装置を提供する。【解決手段】  本装置の復号部は、符号データから符号語の先頭ビットを頭だしするためのシフタ３０１と、１つのアドレスに複数のシンボルデータのデコード値を格納するテーブル３０３と、シフタのシフト量を格納する為のテーブル３０８と、複数のシンボルデータのデコード値のデータ長を生成するテーブル３０７と、前記符号データから前記第１のテーブルのアドレスを生成する為のデコーダ３０２と、前記符号データから前記第２及び第３のテーブルのアドレスを生成する為のデコーダ３０６と、前記複数のシンボルデータのデコード値を一定の固定ビット数分のデータに結合又は分割して出力する為のパッカ３０４とを有し、１クロックサイクルあたりの符号量または復号処理画素数の下限を保証する。【選択図】  図３
2010166444.tif 000002
【特許請求の範囲】
【請求項１】
複数画素で構成される画素ブロック（画素数Ｎ）を単位に可変長符号化することで生成された符号化データを復号する復号装置であって、
前記画素ブロックの符号量をＰビット、目標スループットをＴ 画素/クロックサイクル、１クロックサイクルあたりの処理符号量をｘビット/クロックサイクル、１クロックサイクルあたりの処理画素数をｙ画素/クロックサイクルとしたとき、
ｘ ≧（Ｐ／Ｎ）×Ｔ
または、
ｙ ≧ T
の少なくともいずれか一方を満たすことを特徴とする復号装置。
【請求項２】
前記復号装置は、
符号データから符号語の先頭ビットを頭だしするためのシフタと、
１つのアドレスに複数のシンボルデータのデコード値を格納するの第１のテーブルと、
前記シフタのシフト量を格納する為の第２のテーブルと、
前記複数のシンボルデータのデコード値のデータ長を生成する為の第３のテーブルと、
前記符号データから前記第１のテーブルのアドレスを生成する為の第１のデコーダと、
前記符号データから前記第２及び第３のテーブルのアドレスを生成する為の第２のデコーダと、
前記複数のシンボルデータのデコード値を一定の固定ビット数分のデータに結合又は分割して出力する為の出力部と
を有することを特徴とする請求項１記載の復号装置。
【請求項３】
前記可変長符号化はランレングス符号化であることを特徴とする請求項１又は２に記載の復号装置。
【請求項４】
複数画素で構成される画素ブロックを単位に可変長符号化することで生成された符号化データを復号する復号装置の制御方法であって、
前記画素ブロック（画素数Ｎ）の符号量をＰビット、目標スループットをＴ画素/クロックサイクル、１クロックサイクルあたりの処理符号量をｘビット/クロックサイクル、１クロックサイクルあたりの処理画素数をｙ画素/クロックサイクルとしたとき、
ｘ ≧（Ｐ／Ｎ）×Ｔ
または、
ｙ ≧ T
の少なくともいずれか一方を満たすことを特徴とする復号装置の制御方法。
【請求項５】
コンピュータが読み込み実行することで、前記コンピュータを、請求項１乃至３のいずれか１項に記載の復号装置として機能させるコンピュータプログラム。
【請求項６】
請求項５に記載のコンピュータプログラムを格納したことを特徴とするコンピュータ可読記憶媒体。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、符号化データを復号する技術に関するものである。
【背景技術】
【０００２】
可変長符号化データの復号処理速度を向上する提案がなされている。その１つに、通常のシンボルデコーダと、頻度の高い特定シンボル用のデコーダを備え、符号語が特定シンボルにヒットした場合は２シンボル同時デコードを行なう提案がある（例えば、特許文献１）。この技術によると、１クロックサイクルあたり最大２シンボルのデコードを行なうことが可能である。
【特許文献１】特開２００３−１７４３６５号公報
【発明の開示】
【発明が解決しようとする課題】
【０００３】
しかしながら従来技術では、符号語が特定シンボルにヒットした場合は、上記に示したように１クロックサイクルあたり２シンボルデコードする高スループットが実現できるが、ヒットしなかった場合は、１クロックサイクル当たり１シンボルのみしかデコードできず、常時、高スループットが実現できるわけではない。また、ＪＰＥＧのハフマンデコーダ等、可変長符号化においては、従来技術では符号化速度は符号量に依存しており、所定単位の復号速度を保証することもできない。
【０００４】
本発明はかかる課題に鑑みなされたものであり、更に高速に復号することを可能にする技術を提供しようとするものである。
【課題を解決するための手段】
【０００５】
かかる課題を解決するため、例えば本発明の復号装置は以下の構成を備える。すなわち、
複数画素で構成される画素ブロック（画素数Ｎ）を単位に可変長符号化することで生成された符号化データを復号する復号装置であって、
前記画素ブロックの符号量をＰビット、目標スループットをＴ 画素/クロックサイクル、１クロックサイクルあたりの処理符号量をｘビット/クロックサイクル、１クロックサイクルあたりの処理画素数をｙ画素/クロックサイクルとしたとき、
ｘ ≧（Ｐ／Ｎ）×Ｔ
または、
ｙ ≧ T
の少なくともいずれか一方を満たすことを特徴とする。
【発明の効果】
【０００６】
本発明によれば、復号時の処理サイクル数を所定値以下に制限することが可能となり、復号の処理速度が保証できるようになるため、処理速度平滑化のためのバッファが不要となるばかりでなく、２を超えるスループットを保証できるようになる。
【発明を実施するための最良の形態】
【０００７】
以下、添付図面に従って本発明に係る実施形態を詳細に説明する。
【０００８】
実施形態の画像復号装置が復号する対象は、２値画像（１画素１ビット）の符号化データである。そして、複数画素で構成される画素ブロック（実施形態では８×８画素）を単位とする符号化データを順次復号するものである。
【０００９】
そこで先ず、実施形態における画像復号装置の説明に先立ち、画像符号化装置による符号化データ生成処理について説明する。
【００１０】
画像符号化装置は、２値画像データを８×８画素のブロック単位にランレングス符号化する。符号化対象は、イメージスキャナから読取った２値画像データとするが、ネットワーク上に存在する無圧縮の２値画像データファイルや、コンピュータにより処理された２値画像データをその対象としても良く、その入力源の種類は問わない。２値画像の場合、８×８画素のブロック内をラスタースキャンすると、画素値が“１”のランと、画素値“０”のランが必ず交互に出現することになる。従って、ブロックの先頭の画素値の値が決まれば、最初のランレングス符号語はその画素値のランを示し、それに後続するランの符号語は、直前のランで示される画素の値に“１”を排他論理和した画素値を示す符号語となる。
【００１１】
図１は、ランレングス符号語とラン長との対応を示している。すなわち、画像符号化装置は、ラン長が０の場合（同じ値を持つ画素が１つのみの場合）は符号語として２ビットの“００”を出力する。また、ラン長が“１”の場合（同じ画素が２つ連続する場合）は、符号語として２ビットの“０１”を出力する。また、ラン長が“２”（同じ値の画素が３個連続する場合）や“３”（同じ値の画素が４個連続すする場合）の場合には、図示の如く３ビットの符号語を出力する。そして、ラン長が４乃至６３である場合（同じ画素が５乃至６４個連続する場合）には、図示の如く、固定の８ビットの符号語“１１０００１００”乃至“１１１１１１１１”を出力する。なお、実施形態では、８×８画素のブロックを単位に符号化するものであるので、ラン長が６３を超えることはない。
【００１２】
また、画像符号化装置は、着目ブロックを符号化している最中に、或る画素から最後の画素まで同じであり、且つ、そのラン長が“４”以上である場合、そのランの符号語を生成せず、符号化データの最後を示す符号語（ＥＯＢ；End Of Block）を示す６ビットの符号語“１１００００”を出力する。ＥＯＢを示す符号語の直前のランの画素値が仮に“１”であった場合、その直後の画素から最後の画素までは“０”の値を持つ画素が連続することが約束される。また、このＥＯＢの符号語“１１００００”は、ラン長が４乃至６３のいずれの符号語にも一致しないので、復号装置ではＥＯＢを検出できる。
【００１３】
また、１ブロックの２値画像データの符号化して得られた符号化データ量が６４ビット以上になってしまうことが起こり得る。本来、２値画像中の８×８画素は６４ビットで構成されるので、これでは圧縮されているとは言えない。そこで、画像符号化装置は、１ブロックの符号化データが６４ビット以上になった場合、その符号化データを破棄し、先頭に非符号化を示す１ビットの識別データ“０”を出力し、それに後続して６４画素（６４ビット）のデータをそのまま出力する。図１５（ａ）は、この場合の符号化データのデータ構造を示している。
【００１４】
一方、１ブロックの符号化データ量が６４ビット未満であった場合、画像符号化装置は、符号化されていることを示す１ビットの識別データ“１”を先ず出力し、その次に先頭画素の値を決定するための１ビットを出力する。そして、その後に符号化データを出力する。図１５（ｂ）はこの場合の符号化データのデータ構造を示している。
【００１５】
以上が実施形態における復号対象の符号化データの生成処理の概要である。次に、実施形態における画像復号装置のブロック構成図を図１４に示す。図示の如く、この装置は、符号化データ入力部１０１、判定部１０２、セレクタ１０３、１０５、及び、復号部１０４で構成される。
【００１６】
このうち、復号部１０４は、符号データから符号語の先頭ビットを頭だしするためのシフタ（３０１）と、１つのアドレスに複数のシンボルデータのデコード値を格納するの第１のテーブルとして機能するテーブル３０３と、シフタのシフト量を格納する為の第２のテーブルとして機能するテーブル３０８と、複数のシンボルデータのデコード値のデータ長を生成する為の第３のテーブルとして機能するテーブル３０７と、前記符号データから前記第１のテーブルのアドレスを生成する為の第１のデコーダ（もしくは第１のデコード工程）として機能するデコーダ３０２と、前記符号データから前記第２及び第３のテーブルのアドレスを生成する為の第２のデコーダ（もしくは第２のデコード工程）として機能するデコーダ３０６と、前記複数のシンボルデータのデコード値を一定の固定ビット数分のデータに結合又は分割して出力する為の出力部として機能するパッカ３０４とを有する。以下、各構成要素について更に詳しく説明する。
【００１７】
符号化データ入力部１０１は、内部にバッファメモリを有し、符号化データのビットストリームを順次入力しては、そのビットストリームをセレクタ１０３に出力する。
【００１８】
判定部１０２は、１ブロック分の符号化データの符号化データの先頭の識別ビットを判定するものであり、初期段階ではアクティブになっている。そして、判定部１０２は、符号化データの先頭の１ビットが、“０”であるのか“１”であるのかを判定する。すなわち、判定部１０２は、着目ブロックの符号化データが、図１５（ａ）、（ｂ）のいずれであるのかを判定し、その判定結果を制御信号（１ビットで良い）をセレクタ１０３、１０５に出力する。
【００１９】
この結果、着目ブロックが図１５（ａ）の符号化データであると判定した場合、セレクタ１０３は、先頭の識別ビットを除く６４ビットをそのままセレクタ１０５に出力する。そして、セレクタ１０５は、入力した６４ビットのデータを復号結果として出力する。従って、着目ブロックの識別ビットが“０”である場合、セレクタ１０５からは１クロックサイクルで６４ビットのデータを復号結果として出力することができる。
【００２０】
なお、セレクタ１０５は、１ブロックを構成する２値画素の個数をカウントし、１ブロックを構成する６４画素の復号が完了する度に、判定部１０２に対してアクティブにする制御信号を出力する。
【００２１】
一方、判定部１０２が、着目ブロックの符号化データの先頭の識別ビットが“１”である、すなわち、着目ブロックが図１５（ａ）の符号化データであると判定した場合、先頭の識別ビットを除く符号化データを、復号部１０４に供給させるための制御信号をセレクタ１０３に出力する。また、判定部１０２は、セレクタ１０５に対しても、復号部１０４からのデータを選択するように制御信号を供給する。セレクタ１０５は復号部１０４から、出力された２値画素のデータ（詳細は後述するように１６ビット単位となる）をカウントし、６４画素の出力が終えたと判定した場合、判定部１０２をアクティブにする制御信号を出力する。従って、復号部１０４にて６４画素の復号処理中は、判定部１０２はインアクティブな状態であり、セレクタ１０３は符号化データ入力部１０１からの符号化データを復号部１０４に出力しつづける。
【００２２】
上記の通り、図１５（ａ）に示す構造の符号化データについては、１クロックサイクルにて復号できることは容易に理解できよう。そこで、以下では、図１５（ｂ）のデータ構造の符号化データを復号する復号部１０４について更に詳細に説明する。
【００２３】
本実施形態の画像復号装置の復号部１０４は、１ブロックの符号化データを、最大でも１６クロックサイクルで復号するものである。これは、本実施形態の画像符号化装置を利用（内蔵）する複合装置やプリンタ等を設計する設計者等に向けて、本装置は最低でも１クロックサイクル当たり４画素を復号することを保証するものとも言い換えることができる。
【００２４】
以下、本実施形態の第１及び後述する第２の実施形態の復号装置が速度保証を行なうスループットの指標に関して説明する。
【００２５】
ここで実施形態における復号部１０４が復号しようとしている符号化データにおいて、ブロックの先頭の１画素の値（１ビット）を除く符号化データのデータ量は６４ビット未満であることが約束されている点に注意されたい（図１５（ｂ）参照）。
【００２６】
処理単位（ここではブロック）の画素数をＮ個（実施形態ではＮ＝６４）とする。そして、１ブロック分の符号化データ量をＰビットとする。目標スループットをＴ画素/クロックサイクル（実施形態では４画素／クロックサイクル）とする。この場合、Ｐ／Ｎは１画素当りの平均符号量である。従って、上記目標スループットＴを満足するには、１クロックサイクル当り、Ｐビット中、（Ｐ／Ｎ）×Ｔビットの符号語について復号処理すればよい。
【００２７】
一方、目標スループットがＴ画素/クロックサイクルであるので、１クロックサイクル当りＴ画素以上処理すれば、上記目標スループットを達成できる。よって、１クロックサイクルあたりの処理符号量をｘビット/クロックサイクル、１クロックサイクルあたりの処理画素数をｙ画素/クロックサイクルとしたとき、目標スループットＴ画素/クロックサイクルを満足する為には、以下に示す式（１）又は式（２）のいずれかを満たせばよいことがわかる。
ｘ ≧ （Ｐ／Ｎ）×Ｔ  …（１）
または、
ｙ ≧ Ｔ              …（２）
【００２８】
［第１の実施形態］
復号部１０４が復号する１ブロックの符号量はＰ（６４ビット未満）である。従って、１クロックサイクル当たり４画素をデコードするためには、上記（１）から、
ｘ≧（Ｐ／６４）×４＞６４／６４×４＝４
となり、１クロックサイクル当たり４ビット以上を復号処理すればよいことになる。一方、図１に示すように、４ビット以下の符号語（２ビット、３ビットの符号語）が含まれており、これらを１クロックサイクルで復号してしまうと、上記の条件に合致しない。そこで、４ビット未満の符号語については、その次の符号語と連結することで、見かけ上４ビットを超える符号語と見なし、復号処理を行なうものとした。換言すれば、単体で４ビット以上の符号語同士は連結しない。以降、この２つの符号語を結合した符号語を、連結符号語と呼ぶことにする。また、もともとの符号語や、連結符号語を構成する個々の符号語を、連結符号語と区別するため、以降、単体符号語と称することとする。
【００２９】
実施形態の復号処理を理解しやすくため、図２のデコードテーブルについて説明する。同図において、“連結符号語”は先に説明したように複数の符号語を連結したものである。“連結シンボル”は、直前にデコードされた画素の値が“０”であった場合の複数シンボルのデコード値である（以下、連結シンボルデータと称する）。また、説明のためにそれぞれの連結符号語に対して符号語番号を付与している。
【００３０】
図示の如く、符号語番号“０”の連結符号語は、単体符号語“００”が２つ連続する場合と、それをデコードした場合の連結シンボルデータ“１０”を示している。符号語“００”はラン長が０（同じ値を持つ画素が１つのみの場合）を示している。図２は、直前の符号化データが“０”である例を想定しているので、単体符号語“００”が２つ連続する場合の復号結果は、“１０”となる。つまり、連結符号語“００００”を復号すると、その復号結果は２画素であり、その値は“１”、“０”の順になる。
【００３１】
また、符号語番号“１”の連結符号語は単体符号語“００”と単体符号語“０１”が続けてデコードされる場合であり、デコードされた連結シンボルデータは“１００”となる。つまり、連結符号語“０００１”を復号した場合、その符号化結果は３画素であり、値“１”の画素が１つ、その後に値“０”の画素が２つが生成される。
【００３２】
また、符号語番号“２”の連結符号語は、単体符号語“００”と単体符号語“１００”が続けてデコードされる場合であり、デコードされた連結シンボルデータは“１０００”となる（４画素復号）。また、符号語番号“３”の連結符号語は単体符号語“００”と単体符号語“１０１”が続けてデコードされる場合であり、デコードされた連結シンボルデータは“１００００”となる（５画素復号）。
【００３３】
さらに、符号語番号“４”連結符号語は単体符号語“００”と単体符号語“１１＊＊＊＊＊＊”(ここで“＊＊＊＊＊＊”は“０００１００”（十進数で“４”）乃至“１１１１１０”（十進数で“６２”））が続けてデコードされる場合であり、デコードされた連結シンボルデータは１個の“１”の後、“０”が５乃至６３個だけ続く連結シンボルデータとなる。
【００３４】
同様な方法で、図２には連結シンボルデータを構成する２つの連続する単体符号語に対して単体符号語“００”、“０１”、“１００”、“１０１”、“１１＊＊＊＊＊＊”がそれぞれ出現した場合の組み合わせが列挙されている。但し、符号語番号“２０”においては、“連結符号語”は単体符号語“１１＊＊＊＊＊＊”のみで構成されている。
【００３５】
尚、図示していない例外処理として、単体符号語ＥＯＢ（図１で示す単体符号語“１１００００”）が連結符号語の途中で出現した場合は、１ブロックの残りの画素全てに関して、直前にデコードされたシンボルの値が“０”であった場合は“１”として連結シンボルデータを出力する。また、直前にデコードされたシンボルの値が“１”であった場合は“０”として連結シンボルデータを出力する。
【００３６】
さらに、単体符号語ＥＯＢが連結符号語の先頭で出現した場合(連結符号語自身がＥＯＢの場合)は、直前の画素の値を“１”で排他論理和した結果を、最後の画素まで出力する。図２のテーブルでは、直前の画素データを０と仮定しているため、全て１を出力するようことになる。
【００３７】
また、図２のデコードテーブルにおいては連結符号語の符号長が全て４ビット以上となるように設定してある。従って、１クロックサイクルサイクル当りの処理符号量ｘは４ビット以上となる。復号部１０４が復号する着目ブロックの符号量Ｐは６４ビット未満であることが約束されているわけであるから、１ブロック分の符号化データは毎クロックサイクル当たり４ビット以上の符号語を処理するわけであるから、６４／４＝１６となり、最大でも１６クロックサイクルで着目ブロックの復号処理を終えることになる。すなわち、本復号部１０４を外部から見た場合、目標スループットＴ＝４画素/クロックサイクルを満たす処理を行なうことが可能となる。
【００３８】
図２のテーブルにおいて、“＊”のビットは０、１、のいずれでも良くなり、アドレスのエントリ数は無視できなく大きい。また、各アドレスに対して格納される連結シンボルのビット数も最大で６３ビット必要になるので、そのテーブルを構築するメモリサイズは大きなものは必要になる。
【００３９】
そこで、本第１の実施形態では、装置に必要なメモリ容量を更に削減する例を説明する。
【００４０】
図３は実施形態における復号部１０４のブロック構成図である。
【００４１】
図示において、３００はセレクタ１０３からの符号データを入力する入力端子であり、３０１は符号データから連結符号語を頭出しするためのシフタである。３０２は連結符号語をデコードして、後述のデコードテーブル３０３にアドレスを出力する為のデコーダであり、３０３は図２のデコードテーブルを実現する為のテーブルである。３０４はデコードされた連結シンボルデータを１６ビット単位でパックする為のパッカであり、３０５は１６ビットパック後の画素データを出力する為の出力端子である。また、３０６は連結符号語をデコードして、後述のテーブル３０７及びテーブル３０８にアドレスと供給する為のデコーダであり、テーブル３０７はデコードされた画素数を示すデータ長（以下、パック長と称す）を算出する為のオフセット値（以下、ベース値と称す）を出力する為のテーブルであり、テーブル３０８は符号データの頭だしをする為のシフト量（以下、シフト量と称す）を出力する為のテーブルである。また、３０９はテーブル３０７からのベース値と複数符号データからパック長を算出する為の演算部であり、３１０はブロックの最初の画素値（初期値）を入力する為の１ビットの入力端子である。
【００４２】
次に図３の復号装置の動作を説明する。先ず入力端子３００から入力された符号データはシフタ３０１を介してデコーダ３０２、３０６に供給される。ここで、図２の例では連結符号語の最大ビット数は１１ビットである為、１１ビット分の符号データがデコーダ３０２、３０６に供給される。デコーダ３０２では図２の連結符号語のデコードを行い、デコード結果をテーブルのアドレスとしてテーブル３０３に出力する。ここで、テーブル３０３は図２に示した連結符号語の数としては２１個必要であるが、後述するように本第１の実施形態ではテーブルのエントリー数を５個に減らして、デコーダ３０２及びテーブル３０３の回路規模の削減を図っている。その後、テーブル３０３はデコーダ３０２からのアドレスに従って連結シンボルデータをパッカ３０４に出力する。ここで、後述するようにテーブル３０３から出力する連結シンボルデータは、最後の変化点（２つのランの境界ビット位置）の位置と次画素の値がわかれば良いので、最後の変化点の次画素まで格納されている。即ち、図２の符号語番号“１５”乃至“１９”に対応する連結シンボルデータの時が最大のビット幅となり、このときの最後の変化点の次画素である５ビットのバス幅でパッカ３０４に対して出力される。
【００４３】
一方、デコーダ３０６は、入力された符号データから図２の連結符号語のデコードを行い、デコード結果をテーブルのアドレスとしてテーブル３０７及びテーブル３０８に出力する。ここで、テーブル３０７のエントリー数は、通常、図２に示した連結符号語の数と同等の数が必要であるが、後述するように本第１の実施形態では１０個に減らして、デコーダ３０６、テーブル３０７及びテーブル３０８の回路規模の削減を図っている。
【００４４】
また、図５で説明するように、シフト量の算出に連結符号語の所定のビットを用いる為、演算部３０９に、シフタ３０１から出力された連結符号語が供給されている。その後、テーブル３０７はデコーダ３０６からのアドレスに従ってベース値を演算部３０９へ出力する。演算部３０９では後述するようにベース値と、連結符号語の所定のビット位置の値の総和からパック長を算出し、パッカ３０４に出力する。また、テーブル３０８はデコーダ３０６からのアドレスに従って、シフト量をシフタ３０１に出力する。そして、パッカ３０４ではパック長と、入力端子３１０から入力されるブロックの初期値に従って、連結シンボルデータの内、１番最後の符号語の単体シンボルデータ（以下、最終単体シンボルデータと称す）の生成、及び、出力端子３０５に対する１６ビットにパックした画素データの出力を行なう。又、シフタ３０１はシフト量に従って、次の連結符号語の頭出しを行なう。以上の繰り返しにより、デコード動作を行なう。
【００４５】
次に図４を用いてデコーダ３０２及びテーブル３０３の動作を説明する。符号番号、連結符号語に関しては、図２と同一である。相違点は、デコーダ３０２のアドレス値が追加されている点と、連結シンボルデータが、４ビット目まで拡張されている点である。例えば、図２の符号語番号０の連結シンボルデータは“１０”であったが、図４では最終単体シンボルのデコード値である２つ目のシンボルのデコード値“０”が拡張されて、連結シンボルデータが“１００００”となっている。これは、後段のパッカ３０４にて、デコードされた画素数を示すパック長を用いて連結シンボルデータのビット幅を決定し、最終単体シンボルのデコード値の開始位置がわかれば、連結シンボルデータの値を決定することが可能である為、最終単体シンボルのデコード値の開始位置が最も長い連結符号語（符号語番号１５乃至１９）の５ビットにバス幅を合わせているためである。つまり、本実施形態で用いている符号化がランレングス符号化であるため、初期値と変化点が分かればデコード可能であり、また、最終変化点以降は同じ値が連続するため、最終変化点、即ち最終単体シンボルのデコード値の開始位置が最も遠くなる位置を含むビット列をテーブルとして保持し、最終ビット以降は最終ビットと同じ値が連続しているものとして取り扱えばよい。このような操作により、連結シンボルデータが同一になるものに対して、デコーダ３０２の出力のアドレスを割り振ることにより、図２にて元々必要であったエントリー数２１個を５個に削減することが可能となる。これにより、デコーダ３０２とテーブル３０３の回路規模の削減を図っている。
【００４６】
次に図５を用いてデコーダ３０６、テーブル３０７及びテーブル３０８の動作を説明する。先ず、単体符号語を識別する為に、各単体符号語の先頭１又は２ビット（以下、ヘッダと称する）を以下の様に定義する。
単体符号語“００”及び“０１”のヘッダは“０”、
単体符号語“１００”及び“１０１”のヘッダは“１０”、
単体符号語“１１＊＊＊＊＊＊”(ここで、“＊＊＊＊＊＊”は０００１００乃至１１１１１１（十進数で４乃至６３の値)のヘッダは“１１”、
単体符号語“１１００００”（ＥＯＢ）のヘッダは無し。
【００４７】
デコーダ３０６は上記ヘッダに着目して、連結符号語のデコードを行なう。図５はデコーダ３０６の出力であるアドレス毎に図４のデコードテーブルを並び替えた表である。又、“シフト量”はテーブル３０７の出力であるシフト量を示し、“ベース値”はテーブル３０７の出力であり、シフト量を計算する為の各アドレス毎に共通なオフセット値を示している。また“１の数”は各連結符号語のヘッダ以外のビットが“１”になっている数を示す。ここで説明のために符号番号を付与しているが、これは図４のものとは異なる。
【００４８】
次にアドレス及びシフト量のデコード方法とパック長の計算方法に関して図５を用いて説明する。
【００４９】
先ず、符号番号０乃至３に関しては、連結符号語を構成する単体符号語のヘッダが全て“０”である為、“０＊０＊”(＊は０又は１)の連結符号語としてデコードを行い、デコーダ３０６はアドレス“０”を出力する。この時、連結符号語の符号長は“４”である為、シフタ３０１へシフト量“４”を出力する。また、パック長に関してはベースを“２”として、１の数との和により算出する。即ち、符号語番号０の場合は、１の数が０である為、パック長は２＋０＝２となり、符号語番号１,２の場合は、１の数が１である為、パック長は２＋１＝３となる。また、符号語番号３の場合は、１の数が２である為、パック長は２＋２＝４。つまり、連結符号語をcode[0:10]（符号データの先頭を0ビット目とする）とすると、パック長=2+code[1]+code[3]で算出され、パッカ３０４へ出力される。
【００５０】
以下同様に、符号番号４乃至７に関しては、連結符号語を構成する単体符号語のヘッダが同一である為、“０＊１０”（＊は０又は１）の連結符号語としてデコードを行い、デコーダ３０６はアドレス“１”を出力する。この時、連結符号語の符号長は“５”である為、シフタ３０１へシフト量“５”を出力する。また、パック長に関してはベース“４”＋“１の数”として、パック長=4+code[1]+code[4]で算出され、パッカ３０４へ出力される。
【００５１】
符号番号８は、連結符号語の最後の単体符号語がＥＯＢの場合であり、“０＊１１００００”（＊は０又は１）の連結符号語としてデコードを行い、デコーダ３０６はアドレス“２”を出力する。この時、連結符号語の符号長は“８”である為、シフタ３０１へシフト量“８”を出力する。また、パック長としてはブロックエンドまで（EOB）を示す“６４”が、パッカ３０４へ出力される。
【００５２】
符号番号９、１０に関しては、連結符号語を構成する単体符号語のヘッダが同一である為、“０＊１１＃＃＃＃＃＃”（＊は０又は１であり、＃＃＃＃＃＃は０００１００乃至１１１１１１(十進数の４乃至６２）であり、この値をnとする)の連結符号語としてデコードを行い、デコーダ３０６はアドレス“３”を出力する。この時、連結符号語の符号長は“１０”である為、シフタ３０１へシフト量“１０”を出力する。また、パック長に関してはベース“２”+ “１の数”＋ｎとして、パック長=2+code[1]+nで算出され、パッカ３０４へ出力される。
【００５３】
符号番号１１乃至１４に関しては、連結符号語を構成する単体符号語のヘッダが同一である為、“１０＊０＊”（＊は０又は１)の連結符号語としてデコードを行い、デコーダ３０６はアドレス“４”を出力する。この時、連結符号語の符号長は“５”である為、シフタ３０１へシフト量“５”を出力する。また、パック長に関してはベース“４”＋“１の数”として、パック長=4+code[2]+code[4]で算出され、パッカ３０４へ出力される。
【００５４】
符号番号１５乃至１８に関しては、連結符号語を構成する単体符号語のヘッダが同一である為、“１０＊１０＊”(＊は０又は１)の連結符号語としてデコードを行い、デコーダ３０６はアドレス“５”を出力する。この時、連結符号語の符号長は“６”である為、シフタ３０１へシフト量“６”を出力する。また、パック長に関してはベース“６”+ “１の数”として、パック長=6+code[2]+code[5]で算出され、パッカ３０４へ出力される。
【００５５】
符号番号１９は符号番号２０、２１に関して連結符号語の最後の単体符号語がEOBの場合であり、“１０＊１１００００”（＊は０又は１）の連結符号語としてデコードを行い、デコーダ３０６はアドレス“６”を出力する。この時、連結符号語の符号長は“９”である為、シフタ３０１へシフト量“９”を出力する。また、パック長としてはブロックエンドまで（EOB）を示す“６４”が、パッカ３０４へ出力される。
【００５６】
符号番号２０、２１に関しては、連結符号語を構成する単体符号語のヘッダが同一である為、“１０＊１１＃＃＃＃＃＃”（*は０又は１であり、＃＃＃＃＃＃は０００１００乃至１１１１００（十進数で４乃至６０）であり、この値をｎとする）の連結符号語としてデコードを行い、デコーダ３０６はアドレス“７”を出力する。この時、連結符号語の符号長は“１１”である為、シフタ３０１へシフト量“１１”を出力する。また、パック長に関してはベース“４”+ “１の数”＋ｎとして、パック長=4+code[2] +nで算出され、パッカ３０４へ出力される。
【００５７】
符号番号２２に関しては、連結符号語は単体符号語がEOBそのものである為、そのままデコードを行い、デコーダ３０６はアドレス“８”を出力する。この時、連結符号語の符号長は“６”である為、シフタ３０１へシフト量“６”を出力する。また、パック長としては“６４”が、パッカ３０４へ出力される。
【００５８】
符号番号２３に関しては、連結符号語は単体符号“１１＊＊＊＊＊＊”（＊＊＊＊＊＊は０００１００乃至１１１１１１（十進数で４乃至６３）の値であり、この値をｎとする）そのものである為、そのままデコードを行い、デコーダ３０６はアドレス“９”を出力する。この時、連結符号語の符号長は“８”である為、シフタ３０１へシフト量“８”を出力する。また、パック長に関してはベース“１”として、パック長=1+nで算出され、パッカ３０４へ出力される。
【００５９】
以上説明したように、デコーダ３０６、テーブル３０７及びテーブル３０８において、連結符号語のデコードをヘッダ構成に着目してデコードし、かつパック長を連結符号語のヘッダ以外のビットの１の数を用いて算出することにより、２４個のエントリー数を１０個に減らす事が可能となり、デコーダ３０６、テーブル３０７及びテーブル３０８の回路規模の削減が可能となる。
【００６０】
なお、上記実施形態ではＥＯＢを検出した場合、パック長＝６４とし、シフタ３０１は固定長端（即ちブロックエンド）まで読み飛ばすものとし、パッカ３０４はテーブル３０３のビット４（最後の画素値）をブロックエンドまで継続するものとして動作する。また、上記実施形態ではＥＯＢのコードそのものを検出しているが、単体符号“１１＊＊＊＊＊＊”として復号し、ｎ＜４となった場合をＥＯＢとしても良い。
【００６１】
次に図６を用いてパッカ３０４の動作を説明する。ここで、パッカ３０４は１ブロック６４ビット分のバッファとカウンタ等の制御回路で構成され、テーブル３０３からの連結シンボルデータを１６ビット単位に出力端子３０５に出力する。
【００６２】
図６の表の行（縦軸）は処理サイクル番号を示し、列（横軸）の項目についているサフィックスｎは各信号のｎサイクル目の状態を示す。例えば、“sdatan”はサイクルｎでテーブル３０３入力される連結シンボルデータである。“endn”は一つ前のサイクルｎ−１で入力された連結シンボルデータsdatan-1の最終ビット位置の値であり、以下の式（３）で値が決まる。但し、１ブロックの最初の数シンボルデータに関しては、一つ前のサイクルの連結シンボルデータの最終ビット位置の値として、入力端子３１０から与えられた初期値の値を用いて設定される。即ち、初期値が“０”の場合は、一つ前のサイクルの連結シンボルデータが“１”で終わったものと考え、最終ビット位置を“１”に設定する。また、初期値が“１”の場合は、ひとつ前のサイクルの連結シンボルデータが“０”で終わったものと考え、最終ビット位置を“１”に設定する。
endn=sdatan-1(4)    …（３）
【００６３】
また、図６の“sumn”はサイクルｎまでに１ブロックの処理内で入力されたパック長の和であり、以下の式（４）及び式（５）にて算出される。但し、以下の式（６）に示すように、sumnが“６４”より大きい場合は次のサイクルで値は保持される。また、後述するサイクルｎまでに出力された１６ビット単位のデータ数（以下、出力パック数と称す）ocntnが“４”の時、値が“０”に設定される。
sumn-1≦64 かつ  ocntn≠4の時  sumn = sumn-1  + plenn   …（４）
sumn-1＞64 かつ  ocntn≠4の時   sumn = sumn-1            …（５）
ocntn=4の時                    sumn = 0                 …（６）
【００６４】
図６の“sptrn”は次のサイクルn+1において、連結シンボルデータsdatanを前記バッファに格納する際の先頭ビット位置を示し、以下の式（７）により算出される。但し、以下の式（７−１）、式（８）に示すようにsumn＞64の時はsptrnを一つ前のサイクルn-1の値sptrn-1にクリップする。後述する出力パック数ocntnが“４”の時、“０”に設定される。
sumn≦64 かつ ocntn≠4の時  sptrn = sumn-1  …（７）
sumn＞64 かつ ocntn≠4の時 sptrn= sptrn-1   …（７−１）
ocntn= 4の時  sptrn = 0                     …（８）
【００６５】
図６の“eptrn”は次のサイクルn+1において、連結シンボルデータsdatanを前記バッファに格納する際の終了ビット位置を示し、以下の式（９）により算出される。但し、以下の式（１０）、（１１）に示すように、sumn＞64の場合は前記バッファの最大ビット位置である“６３”に値がクリップされ、後述する出力パック数ocntnが“４”の時、“０”に設定される。
sumn≦64 かつ  ocntn≠4の時    eptrn = sumn - 1    …（９）
sumn＞64 かつ   ocntn≠4の時    eptrn = 63          …（１０）
ocntn= 4の時                   eptrn = 0           …（１１）
【００６６】
図６の“extn”はパック長plennが連結シンボルデータsdatanのデータ長5ビットを超える時“１”となるフラグであり、以下の式（１２）、（１３）にて算出される。
plenn ≦5の時   extn= 0    …（１２）
plenn ＞5の時   extn= 1    …（１３）
【００６７】
図６の“extptrn”はパック長plennが連結シンボルデータsdatanのデータ長5ビットを超える場合(extn= 1の時)、最終ビット位置の値endnを超えたビット数だけ拡張する必要があるため、次のサイクルn+1において、連結シンボルデータsdatanを前記バッファに格納する際のビット拡張の開始位置を示す。よって以下の式（１４）、（１５）に示すように、extn= 1の時にsumnから前記越えたビット数分だけ減算することにより算出される。また、以下の式（１６）に示すように、後述する出力パック数ocntnが“４”の時、値が“０”に設定される。
extn=0 かつocntn≠4の時    extptrn=  sumn                 …（１４）
extn =1かつocntn≠4の時    extptrn = sumn - (plenn- 5)    …（１５）
ocntn=4の時                  extptrn = 0                  …（１６）
【００６８】
図６の“pcntn”はサイクルnにおいて、１ブロックの処理内で入力されたパック長の累計が何個のパック数に相当するか（以下、入力パック数と称す）を示し、以下の式（１７）で算出される。ここで、式（１７）の割り算は、小数点以下ビットは切り捨てて演算する。以下の式（１８）に示すように、sumn＞64の場合は“４”に値がクリップされ、以下の式（１９）に示すように、後述する出力パック数ocntnが“４”の時、“０”に設定される。
sumn  ≦64 かつ ocntn ≠4の時  pcntn = sumn /16   …（１７）
sumn  ＞64 かつ ocntn ≠4の時  pcntn = 4           …（１８）
ocntn = 4の時    pcntn = 0                         …（１９）
【００６９】
図６の“busyn”は図３に図示していない信号であり、サイクルn-1において、次のサイクルnにて前記バッファに空き無くなると判断した場合、テーブル３０３及び演算部３０９に対して、連結シンボルデータ及びパック長の入力を停止させる為の停止信号である。パック長の和sumn-1が６４以上の場合、サイクルnでは前記バッファに空きが無くなる為、１ブロック分のパックデータの出力が終了するまで、値“１”をテーブル３０３及び演算部３０９に対して出力する。よって、以下の式（２０）、（２１）で算出される。また、式（２２）、（２３）、（２４）、（２５）に示すようにテーブル３０３及び演算部３０９は、サイクルnでの連結シンボルデータsdatan 及び、パック長plennはサイクルn-1でのbusyn-1の値が“１”の時にサイクルn-1の値を保持し、“０”の時は値を変更が可能となる。
sumn-1≦64の時  busyn-1 = 0         …（２０）
sumn-1＞64の時  busyn-1 = 1         …（２１）
busyn-1= 1 の時  sdatan  = sdatan-1 …（２２）
busyn-1= 0 の時  sdatan は変更可能  …（２３）
busyn-1= 1 の時  plenn  = plenn-1   …（２４）
busyn-1= 0 の時  plenn は変更可能   …（２５）
【００７０】
図６の“restn”はサイクルnにおいて、前記入力パック数に対して出力されていないデータのパック数（以下、未出力パック数と称す）を示し、以下の式（２６）に示すように入力パック数pcntnと、後述する出力パック数ocntnの差分となる。但し、以下の式（２７）に示すように、後述する出力パック数ocntnが“４”の時、“０”に設定される。
ocntn≠4の時   restn = pcntn - ocntn …（２６）
ocntn＝4の時   restn = 0             …（２７）
【００７１】
図６の“vaildn”は図３に図示していない信号であり、値を後述するパッカ３０４の出力が出力端子３０５に対して有効データであることを示す有効信号であり、“１”の時有効、“０”の時無効を示す。ここで、一つ前のサイクルn-1において、出力されていないパック数“restn-1が“０”より大きければ、パックされたデータを出力することが可能である為、以下の式（２８）に示すように有効信号vaildnの値が“１”に設定される。また、“restn-1の値が“０”であれば、以下の式（２９）に示すように有効信号vaildnの値が“０”に設定される。
restn-1  ＞ 0 の時  vaildn   = 1   …（２８）
restn-1  ＝ 0 の時  vaildn   = 0   …（２９）
【００７２】
図6の“ocntn”は、サイクルnにおける出力パック数を示し、有効信号vaildnと同様に、前のサイクルn+1にて出力されていないパック数“restn-1”が“０”より大きければ、“１”カウントアップを行い、“restn-1”の値が“０”であれば、値を保持する。以下の式（３０）、（３１）にその動作を示す。但し、前のサイクルの出力パック数ocntn-1が“４”の時、以下の式（３２）に示すように、“０”に値をクリアされる。
restn-1＞0 かつ ocntn-1≠4の時  ocntn  = ocntn-1 + 1    …（３０）
restn-1＝0 かつ ocntn-1≠4の時  ocntn  = ocntn-1        …（３１）
ocntn-1＝4  の時                ocntn  = 0              …（３２）
【００７３】
図６の“bufn”は、サイクルn-1における前記１ブロック64ビット分のバッファの値を示し、図６では、パックされる単位である１６ビットづつ分けて示している。“bufn”の０乃至１５ビット目は“bufn(0:15)”と表わす。また、“bufn(16:31)”は“bufn”の１６乃至３１ビット目を示し、“bufn(32:47)” は“bufn”の３２乃至４７ビット目を示す。そして、“bufn(48:63)”は“bufn”の４８乃至６３ビット目を示す。ここで、サイクルnにおいて、バッファbufnに連結シンボルデータsdatan-1を格納する場合、最終ビット位置の値endn-1により、バッファbufnに格納する値をビット反転させて格納する。
【００７４】
また、サイクルn-1においてフラグextn-1が“０”の時は、最終ビット位置の値endn-1がビット拡張されずに、データ幅plenn-1の連結シンボルデータsdatan-1(0: plenn-1-1)が次のサイクルnにてバッファbufnに格納される。このとき、連結シンボルデータsdatan-1は先頭ビット位置sptrn-1から終了ビット位置eptrn-1の領域に格納される為、最終ビット位置の値endn-1 が“０”の時は以下の式（３３）、“１”の時は式（３４）となる。ここで“not()”は各ビットのビット反転を示す。
endn-1=0 かつ extn-1=0の時  bufn(sptrn-1: eptrn-1) = sdatan-1(0: plenn-1-1)         …（３３）
endn-1=1 かつ extn-1=0の時  bufn(sptrn-1: eptrn-1) = not(sdatan-1(0: plenn-1-1))    …（３４）
【００７５】
また、サイクルn-1においてフラグextn-1が“１”の時は、データ幅plenn-1は“５”より大きい為、連結シンボルデータsdatan-1(0:4)が次のサイクルnにてバッファbufnに格納される。このとき、連結シンボルデータsdatan-1は先頭ビット位置sptrn-1からビット拡張の開始位置extptrn-1の１ビット手前の領域に格納される為、最終ビット位置の値endn-1 が“０”の時は以下の式（３５）、“１”の時は式（３６）となる。
endn-1=0 かつ extn-1=1の時  bufn(sptrn-1: extptrn-1-1) = sdatan-1(0:4)       …（３５）
endn-1=1 かつ extn-1=1の時  bufn(sptrn-1: extptrn-1-1) = not(sdatan-1(0:4))  …（３６）
【００７６】
同時に、フラグextn-1が“１”の時は、連結シンボルデータsdatan-1(4)の値がビット拡張の開始位置extptrn-1から終了ビット位置eptrn-1の間に拡張されて、次のサイクルnにてバッファbufnに格納される為、最終ビット位置の値endn-1 が“０”の時は以下の式（３７）、“１”の時は式（３８）となる。
endn-1=0 かつ extn-1=1の時:
bufn(extptrn-1:eptrn-1)= sdatan-1(4), sdatan-1(4),…,sdatan-1(4)       …（３７）
endn-1=1 かつ extn-1=1の時:
bufn(extptrn-1:eptrn-1)= not(sdatan-1(4), sdatan-1(4),…,sdatan-1(4))  …（３８）
【００７７】
また、図６の“出力”はパッカ３０４のパックされてたデータの出力であり、それぞれのサイクルにて、出力パック数ocntnの値に従って、バッファ“bufn(0:15)”、“bufn(16:31)”、“bufn(32:47)”、“bufn(48:63)”のそれぞれ１６ビットの領域を選択して出力する。以下の式（３９）、（４０、（４１）、（４２）に選択動作を示す。
ocntn=1の時  出力 = bufn(0:15)    …（３９）
ocntn=2の時  出力 = bufn(16:31)   …（４０）
ocntn=3の時  出力 = bufn(32:47)   …（４１）
ocntn=4の時  出力 = bufn(47:63)   …（４２）
【００７８】
次に、パッカ３０４に、１ブロック６４ビット分の連結シンボルデータが、パック長２、５、７、１７、１９、ＥＯＢ（６４）の順で入力され、かつ入力端子３１０に初期値“１”が設定された場合の動作を例にあげて説明する。
【００７９】
先ず、サイクル0では、リセット動作等の初期化手段により、パック長の和sum0、先頭ビット位置sptr0、終了ビット位置eptr0、フラグext0、ビット拡張の開始位置extptr0、入力パック数pcnt0、未出力パック数rest0、出力パック数ocnt0に“０”が設定される。また、入力端子３１０より入力されたブロックの最初の画素値が“１”であるので、前のサイクルの連結シンボルデータの最終ビット（即ち、直前の画素値）が“０”であったとみなし最終ビット位置の値end0 に“０”が設定される。このとき、有効信号vaild0は停止信号busy0も初期化されてともに“０”を出力する。
【００８０】
次にサイクル１では、n=1であり、busy0= 0より、式（２３）の条件が成り立ち、連結シンボルデータsdata1として図５の符号番号０の値“10000”が入力される。同様にbusy0= 0より式（２５）の条件が成り立ち、パック長plen1として“２”が入力される。
【００８１】
また、最終ビット位置の値end1は式（３）より通常はサイクル０で入力された連結シンボルデータの４ビット目を格納するが、サイクル０では入力されていないので、end0の値“０”を保持する。
【００８２】
同様に、サイクル０にて連結シンボルデータが入力されていない為、式（３３）乃至（３８）は成り立たない為、バッファbuf1へのデータの格納は行なわれない。
【００８３】
出力パック数ocnt1はrest0=0かつocnt0=0より式（３１）の条件が成り立ち“０”(ocnt1= ocnt0=0)に設定される。
【００８４】
パック長の和sum1はsum0 =0かつocnt1=0より、式（４）の条件が成り立つ為“２”（sum1 = sum0  + plen1 = 0+2 = 2）に設定される。
【００８５】
先頭ビット位置sptr1はsum1 =2かつocnt1=0 より、式（７）の条件が成り立つ為、“０”(sptr1 = sum0 = 0)に設定される。
【００８６】
終了ビット位置eptr1はsum1=2かつocnt1=0 より、式（９）の条件が成り立つ為、“１”(eptr1 = sum1 - 1=2-1=1)に設定される。
【００８７】
フラグext1はパック長plen1 =2より、式（１２）の条件が成り立つ為、“０”に設定される。
【００８８】
ビット拡張の開始位置extptr1はext1=0かつocnt1=0より式（１４）の条件が成り立つ為、“２”(extptr1=  sum1=2)に設定される。
【００８９】
入力パック数pcnt1はsum1 =2かつocnt1=0 より、式（１７）の条件が成り立つ為“０”(pcnt1 = sum1  /16 = 2/16=0)が設定される。
【００９０】
未出力パック数rest1はocnt1=0より式（２６）の条件が成り立つ為、“０”(rest1 = pcnt1 - ocnt1=0-0=0)に設定される。
【００９１】
valid1はrest0=0より式（２９）の条件が成り立ち、“０”が出力される。
【００９２】
さらに、停止信号busy1はsum1=2より式（２０）の条件が成り立ち“０”が出力される。
【００９３】
次にサイクル２では、n=2であり、busy1= 0より、式（２３）の条件が成り立ち、連結シンボルデータsdata1として図５の符号番号５の値“10000”が入力される。同様にbusy2= 0より式（２５）の条件が成り立ち、パック長plen2として“５”が入力される。
【００９４】
また、最終ビット位置の値end2は式（３）より連結シンボルデータsdata1(4)の値“0”が入力される。
【００９５】
さらに、バッファbuf2にはend1=0かつext1=0であり、式（３３）の条件が成り立つ。式（３３）において、sptr1=0、eptr1=1、plen1=2より、式（３８）の左辺は、buf2(sptr1: etptr1) = buf2(0:1)となり、右辺はsdata1(0: plen1-1)=sdata1(0: 2-1)= sdata1(0:1)=“１０”となる為、buf2(0:1)=“１０”となり、バッファbufの０〜１ビット目に“１０”が格納される。
【００９６】
また、出力パック数ocnt2はrest1=0かつocnt1=0より式（３１）の条件が成り立ち、“０”(ocnt2= ocnt1=0)に設定される。
【００９７】
パック長の和sum2はsum1 =2かつocnt2=0より式（４）の条件が成り立つ為、“７”（sum2 = sum1  + plen2 = 2+5 = 7）に設定される。
【００９８】
先頭ビット位置sptr2はsum2 =7かつocnt2=0 より式（７）の条件が成り立つ為“２”(sptr2 = sum1 = 2)に設定される。
【００９９】
終了ビット位置eptr2はsum2=7かつocnt2=0 より式（９）の条件が成り立つ為“６”(eptr2 = sum2 - 1=7-1=6)に設定される。
【０１００】
フラグext2はパック長plen2 =5より式（１２）の条件が成り立つ為“０”に設定される。
【０１０１】
ビット拡張の開始位置extptr2はext2=0かつocnt2=0より式（１４）の条件が成り立つ為“７”(extptr2=  sum2=7)に設定される。
【０１０２】
入力パック数pcnt2はsum2 =7かつocnt2=0 より式（１７）の条件が成り立つ為、“０”(pcnt2 = sum2/16 = 7/16=0)が設定される。
【０１０３】
未出力パック数rest2はocnt2=0より式（２６）の条件が成り立つ為、“０”(rest2 = pcnt2 - ocnt2=0-0=0)に設定される。
【０１０４】
有効信号valid2はrest1=0より式（２９）の条件が成り立ち、“０”が出力される。
【０１０５】
さらに、停止信号busy2はsum2=7より式（２０）の条件が成り立ち“０”が出力される。
【０１０６】
次にサイクル３では、n=3であり、busy2= 0より、式（２３）の条件が成り立ち、連結シンボルデータsdata3として図５の符号番号１６の値“11100”が入力される。同様にbusy2= 0より式（２５）の条件が成り立ち、パック長plen3として“７”が入力される。
【０１０７】
また、最終ビット位置の値end3は式（３）より連結シンボルデータsdata2(4)の値“０”が入力される。
【０１０８】
さらに、バッファbuf3にはend2=0かつext2=0であり、式（３３）の条件が成り立つ。式（３３）において、sptr2=2、eptr2=6、plen2=5より、式（３３）の左辺は、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より式（３１）の条件が成り立ち、“０”(ocnt3= ocnt2=0)に設定される。
【０１１０】
パック長の和sum3はsum2 =7かつocnt3=0より式（４）の条件が成り立つ為“１４”（sum3 = sum2  + plen3 = 7+7 = 14）に設定される。
【０１１１】
先頭ビット位置sptr3はsum3 =14かつocnt3=0 より式（７）の条件が成り立つ為、“７”(sptr3 = sum2 = 7)に設定される。
【０１１２】
終了ビット位置eptr3はsum3=14かつocnt3=0 より式（９）の条件が成り立つ為“１３”(eptr3 = sum3 - 1=14-1=13)に設定される。
【０１１３】
フラグext3はパック長plen3 =7より式（１３）の条件が成り立つ為“１”に設定される。
【０１１４】
ビット拡張の開始位置extptr3はext3=1かつocnt3=0より式（１５）の条件が成り立つ為“１２”(extptr3= sum3 - (plen3- 5)=14-(7-5)=12)に設定される。
【０１１５】
入力パック数pcnt3はsum3 =14かつocnt3=0 より式（１７）の条件が成り立つ為“０”(pcnt3 = sum3/16 = 14/16=0)が設定される。
【０１１６】
未出力パック数rest3はocnt3=0より式（２６）の条件が成り立つ為、“０”(rest3 = pcnt3 - ocnt3=0-0=0)に設定される。
【０１１７】
有効信号valid3はrest2=0より式（２９）の条件が成り立ち、“０”が出力される。
【０１１８】
さらに、停止信号busy3はsum3=14より式（２０）の条件が成り立ち“０”が出力される。
【０１１９】
次にサイクル4では、n=4であり、busy3= 0より、式（２３）の条件が成り立ち、連結シンボルデータsdata4として図５の符号番号１０の値“11000”が入力される。同様にbusy3= 0より式（２５）の条件が成り立ち、パック長plen4として“１７”が入力される。
【０１２０】
また、最終ビット位置の値end4は式（３）より連結シンボルデータsdata3(4)の値“０”が入力される。
【０１２１】
さらに、バッファbuf4にはend3=0かつext3=1であり、式（３５）の条件が成り立つ。式（３５）において、sptr3=7、extptr3=12、plen3=7より、式（３５）の左辺は、buf4(sptr3: extptr3-1) = buf4(7:12-1)= buf4(7:11)となり、右辺はsdata3(0:4)=“11100”となる為、buf4(7:11)=“11100”となる。従ってバッファbufの7〜11ビット目に“11100”が格納される。また、式（３７）の条件が成り立つ。式（３７）において、extptr3=12、eptr3=13より、式（３７）の左辺は、buf4(extptr3: eptr3) = buf4(12:13)となり、右辺はsdata3(4)が2ビット拡張され、“00”となる為、buf4(12:13)=“00”となる。従って、バッファbufの12〜13ビット目に“00”が格納される。よって、サイクル２及び３で格納されたものと合わせて、buf4(0:13)=“10100001110000”となる。
【０１２２】
また、出力パック数ocnt4はrest3=0かつocnt3=0より、式（３１）の条件が成り立ち“０”(ocnt4= ocnt3=0)に設定される。
【０１２３】
パック長の和sum4は、sum3 =14かつocnt3=0より式（４）の条件が成り立つ為、“３１”（sum4 = sum3+ plen4 = 14+17 = 31）に設定される。
【０１２４】
先頭ビット位置sptr4はsum4 =31かつocnt4=0 より式（７）の条件が成り立つ為“１４”(sptr4= sum3 = 14)に設定される。
【０１２５】
終了ビット位置eptr4は、sum4=31かつocnt4=0 より式（９）の条件が成り立つ為、“３０”(eptr4= sum4 - 1=31-1=30)に設定される。
【０１２６】
フラグext4は、パック長plen4 =17より式（１３）の条件が成り立つ為“１”に設定される。
【０１２７】
ビット拡張の開始位置extptr4は、ext4=1かつocnt4=0より式（１５）の条件が成り立つ為、“１９”(extptr4= sum4 - (plen4- 5)=31-(17-5)=19)に設定される。
【０１２８】
入力パック数pcnt4は、sum4 =31かつocnt4=0 より式（１７）の条件が成り立つ為、“１”(pcnt4 = sum4/16 = 31/16=1)が設定される。
【０１２９】
未出力パック数rest4は、ocnt4=0より式（２６）の条件が成り立つ為、“１”(rest4 = pcnt4 - ocnt4=1-0=1)に設定される。
【０１３０】
有効信号valid4は、rest3=0より式（２９）の条件が成り立ち、“０”が出力される。
【０１３１】
さらに、停止信号busy4は、sum4=31より式（２０）の条件が成り立ち、“０”が出力される。
【０１３２】
次にサイクル5では、n=5であり、busy4= 0より、式（２３）の条件が成り立ち、連結シンボルデータsdata5として図５の符号番号２０の値“11100”が入力される。同様にbusy4= 0より式（２５）の条件が成り立ち、パック長plen5として“１９”が入力される。
【０１３３】
また、最終ビット位置の値end5は式（３）より連結シンボルデータsdata4(4)の値“０”が入力される。
【０１３４】
さらに、バッファbuf5にはend4=0かつext4=1であり、式（３５）の条件が成り立つ。式（３５）において、sptr4=14、extptr4=19より、式（３５）の左辺は、buf5(sptr4: extptr4-1) = buf5(14:19-1)= buf5(14:18)となり、右辺はsdata4(0:4)=“11000”となる為、buf5(14:18)=“11000”となる。従って、バッファbufの14〜18ビット目に“11000”が格納される。また、式（３７）の条件が成り立つ。式（３７）において、extptr4=19、eptr4=30より式（３７）の左辺は、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より式（３０）の条件が成り立ち、“１”(ocnt5= ocnt4+1=0+1=1)に設定される。
【０１３６】
パック長の和sum5は、sum4 =31かつocnt5=1より式（４）の条件が成り立つ為、“５０”（sum5= sum4+ plen5 = 31+19 = 50）に設定される。
【０１３７】
先頭ビット位置sptr5は、sum5 =50かつocnt5=1 より式（７）の条件が成り立つ為、“３１”(sptr5 = sum4 = 31)に設定される。
【０１３８】
終了ビット位置eptr5は、sum5=50かつocnt5=1より式（９）の条件が成り立つ為、“４９”(eptr5= sum5 - 1=50-1=49)に設定される。
【０１３９】
フラグext5は、パック長plen5 =19より式（１３）の条件が成り立つ為“１”に設定される。
【０１４０】
ビット拡張の開始位置extptr5は、ext5=1かつocnt5=1より式（１５）の条件が成り立つ為、“３６”(extptr5= sum5 - (plen5- 5)=50-(19-5)=36)に設定される。
【０１４１】
入力パック数pcnt5は、sum5 =50かつocnt5=1 より式（１７）の条件が成り立つ為、“３”(pcnt5 = sum5/16 = 50/16=3)が設定される。
【０１４２】
未出力パック数rest5は、ocnt5=1より式（２６）の条件が成り立つ為、“２”(rest5 = pcnt5 - ocnt5=3-1=2)に設定される。
【０１４３】
有効信号valid5は、rest4=1より式（２８）の条件が成り立ち、“１”が出力される。このとき、出力パック数ocnt5が“１”である為、式（３９）が成り立ち、パックされた出力データとしてバッファbuf5(0:15)の値“1010000111000011”選択されて出力される。
【０１４４】
さらに、停止信号busy5はsum5=50より式（２０）)の条件が成り立ち“０”が出力される。
【０１４５】
次にサイクル６では、n=6であり、busy5= 0より、式（２３）の条件が成り立ち、連結シンボルデータsdata6として図５の符号番号９の連結シンボルデータで、最終単体符号語としてEOB(64)が入力されているものとする。即ち、“10000”が入力される。同様にbusy5= 0より式（２５）の条件が成り立ち、パック長plen6として“EOB”すなわち64が入力される。
【０１４６】
また、最終ビット位置の値end6は式（３）より、連結シンボルデータsdata5(4)の値“０”が入力される。
【０１４７】
さらに、バッファbuf6にはend5=0かつext5=1であり、式（３５）の条件が成り立つ。式（３５）において、sptr5=31、extptr5=36より、式（３５）の左辺は、buf6(sptr5: extptr5-1) = buf6(31:36-1)= buf6(31:35)となる。右辺はsdata5(0:4)=“11100”となる為、buf6(31:35)=“11100”となる。従って、バッファbufの31〜35ビット目に“11100”が格納される。また、式（３７）の条件が成り立つ。式（３７）において、extptr5=36、eptr5=49より、式（３７）の左辺は、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より式（３０）の条件が成り立ち、“２”(ocnt6= ocnt5+1=1+1=2)に設定される。
【０１４９】
パック長の和sum6は、sum5 =50かつocnt6=2より式（４）の条件が成り立つ為、“１１４”（sum6= sum5+ plen6 = 50+64 = 114）に設定される。
【０１５０】
先頭ビット位置sptr6は、sum6 =114かつocnt6=2 より式（７）の条件が成り立つ為、“５０”(sptr6 = sum5 = 50)に設定される。
【０１５１】
終了ビット位置eptr6は、sum6=114かつocnt6=2より式（１０）の条件が成り立つ為、“６３”に設定される。
【０１５２】
フラグext6は、パック長plen6 =64より式（１３）の条件が成り立つ為、“１”に設定される。
【０１５３】
ビット拡張の開始位置extptr6は、ext6=1かつocnt6=2より式（１５）の条件が成り立つ為、“５５”(extptr6= sum6 - (plen6- 5)=114-(64-5)=55)に設定される。
【０１５４】
入力パック数pcnt6は、sum6 =114かつocnt6=2 より式（１８）の条件が成り立つ為、“４”に設定される。
【０１５５】
未出力パック数rest6は、ocnt6=2より式（２６）の条件が成り立つ為、“２”(rest6 = pcnt6- ocnt6=4-2=2)に設定される。
【０１５６】
有効信号valid6はr、est5=2より式（２８）の条件が成り立ち、“１”が出力される。このとき、出力パック数ocnt6が“２”である為、式（４０）が成り立ち、パックされた出力データとしてバッファbuf5(16:31)の値“0000000000000001”が選択されて出力される。
【０１５７】
さらに、停止信号busy6は、sum6=114より式（２１）の条件が成り立ち“１”が出力される。
【０１５８】
次にサイクル７では、n=7であり、busy6= 1より、式（２２）の条件が成り立ち、テーブル３０３に対して連結シンボルデータの入力を停止する（サイクル６のデータを保持させる）。同様にbusy6= 0より式（２４）の条件が成り立ち、演算部３０９に対してパック長の入力を停止する（サイクル6のデータを保持させる）。
【０１５９】
また、最終ビット位置の値end7は式（３）より、連結シンボルデータsdata6(4)の値“0”が入力される。
【０１６０】
さらに、バッファbuf7にはend6=0かつext6=1であり、式（３５）の条件が成り立つ。式（３５）において、sptr6=50、extptr6=55より、式（３５）の左辺は、buf7(sptr7: extptr7-1) = buf7(50:55-1)= buf7(50:54)となる。また、右辺はsdata6(0:4)=“10000”となる為、buf7(50:54)=“10000”となる。従って、バッファbufの50〜54ビット目に“10000”が格納される。また、式（３７）の条件が成り立つ。式（３７）において、extptr6=55、eptr6=63より、式（３７）の左辺は、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より式（３０）の条件が成り立ち、“３”(ocnt7= ocnt6+1=2+1=3)に設定される。
【０１６２】
パック長の和sum7は、sum6 =114かつocnt7=3より式（５）の条件が成り立つ為、“１１４”（sum7= sum6= 114）に設定される。
【０１６３】
先頭ビット位置sptr7は、sum7 =114かつocnt7=3 より式（７−１）の条件が成り立つ為、“５０”(sptr7 = sptr6= 50)に設定される。
【０１６４】
終了ビット位置eptr7は、sum7=114かつocnt7=3より式（１０）の条件が成り立つ為、“６３”に設定される。
【０１６５】
フラグext7は、パック長plen7 =64より式（１３）の条件が成り立つ為、“１”に設定される。
【０１６６】
ビット拡張の開始位置extptr7は、ext7=1かつocnt7=3より式（１５）の条件が成り立つ為、“５５”(extptr7= sum7 - (plen7- 5)=114-(64-5)=55)に設定される。
【０１６７】
入力パック数pcnt7は、sum7=114かつocnt7=3 より式（１８）の条件が成り立つ為“４”に設定される。
【０１６８】
未出力パック数rest7は、ocnt7=3より式（２６）の条件が成り立つ為、“１”(rest7 = pcnt7- ocnt7=4-3=1)に設定される。
【０１６９】
有効信号valid7は、rest7=1より式（２８）の条件が成り立ち、“１”が出力される。このとき、出力パック数ocnt7が“３”である為、式（４１）が成り立ち、パックされた出力データとしてバッファbuf7(32:47)の値“1110000000000001”選択されて出力される。
さらに、停止信号busy7は、sum7=114より式（２１）の条件が成り立ち、“１”が出力される。
【０１７０】
次にサイクル８では、n=8であり、サイクル７と同様にbusy7= 1より式（２２）の条件が成り立ち、テーブル３０３に対して連結シンボルデータの入力を停止する（サイクル７のデータを保持させる）。同様にbusy7= 0より式（２４）の条件が成り立ち、演算部３０９に対してパック長の入力を停止する（サイクル７のデータを保持させる）。
【０１７１】
また、最終ビット位置の値end8は、サイクル７と同様に式（３）より連結シンボルデータsdata7(4)の値“０”が入力される。
【０１７２】
さらに、バッファbuf8は、サイクル７において、end7、ext7、sptr7、extptr7、eptr7等の値が、サイクル６の時と変化していないため、バッファbuf8のデータはバッファbuf7と同等である。
【０１７３】
また、出力パック数ocnt8は、rest7=1かつocnt7=3より式（３０）の条件が成り立ち、“４”(ocnt8= ocnt7+1=3+1=4)に設定される。
【０１７４】
パック長の和sum8は、ocnt8=4より式（６）の条件が成り立つ為、“０”に設定される。
【０１７５】
先頭ビット位置sptr8も同様に、ocnt8=4 より式（８）の条件が成り立つ為、“０”設定される。
【０１７６】
終了ビット位置eptr7も同様にo、cnt8=4より式（１１）の条件が成り立つ為“０”に設定される。
【０１７７】
フラグext8は、パック長plen8 =64より式（１３）の条件が成り立つ為、“１”に設定される。
【０１７８】
ビット拡張の開始位置extptr8も同様に、ocnt8=4より式（１６）の条件が成り立つ為“０”に設定される。
【０１７９】
入力パック数pcnt7も同様に、ocnt8=4 より式（１９）の条件が成り立つ為“０”に設定される。
【０１８０】
未出力パック数rest8も同様に、ocnt8=4より式（２７）の条件が成り立つ為“0”に設定される。
【０１８１】
有効信号valid7は、rest7=1より式（２８）の条件が成り立ち、“１”が出力される。このとき、出力パック数ocnt8が“4”である為、式（４２）が成り立ち、パックされた出力データとしてバッファbuf8(48:63)の値“0010000000000000”が選択されて出力される。
【０１８２】
さらに、停止信号busy8は、sum8=0より式（２０）の条件が成り立ち、“０”が出力される。
【０１８３】
以上のサイクル１〜サイクル８の動作により、１ブロック６４ビットのパック動作が完了する。次のサイクルでは、出力パック数ocnt9は、ocnt8=4より式（３２）の条件が成り立ち、“０”にクリアされ、前記サイクル０と同様な、初期状態に移行する。
【０１８４】
［第２の実施形態］
次に、図７Ａ、７Ｂを用いて第２の実施形態のデコードテーブルを説明する。ここで図２と同様に説明のためにそれぞれの連結符号語に対して符号語番号を付与している。
【０１８５】
符号語番号０の連結符号語は、単体符号語“００”が３つ続けてデコードされる場合であり、デコードされた連結シンボルデータは“１０１”（３画素が復号される）となる。また、符号語番号１の連結符号語は単体符号語“００”が２つ続き、その後に単体符号語“０１”が続けてデコードされる場合であり、デコードされた連結シンボルデータは“１０１１”となる。また、符号語番号２の連結符号語は単体符号語“００”が２つ続き、その後に単体符号語“１００”が続けてデコードされる場合であり、デコードされた連結シンボルデータは“１０１１１”となる。また、符号語番号３の連結符号語は単体符号語“００”が２つ続き、その後に単体符号語“１０１”が続けてデコードされる場合であり、デコードされた連結シンボルデータは“１０１１１１”となる。さらに、符号語番号４の連結符号語は単体符号語“００”が２つ続き、その後に単体符号語“１１＊＊＊＊＊＊”(ここで、＊＊＊＊＊＊は000100-111101(十進数で４乃至６１）のいずれかの値)が続けてデコードされる場合であり、デコードされた連結シンボルデータは“１０”の後、５乃至６２個の“１”が続く連結シンボルデータとなる。
【０１８６】
同様な方法で、図７Ａ，７Ｂには連結シンボルデータを構成する４つの連続する単体符号語に対して単体符号語“００”, “０１”, “１００”, “１０１”, “１１＊＊＊＊＊＊”がそれぞれ出現した場合の組み合わせが列挙されている。但し、符号語番号２０,４１，６２，８３においては、連結符号語は２番目の単体符号語を“１１＊＊＊＊＊＊”とする２つの単体符号語で構成されている。また、符号語番号８４においては、連結符号語は単体符号語“１１＊＊＊＊＊＊”のみで構成されている。
【０１８７】
尚、図示していない例外処理として、単体符号語“ＥＯＢ”が連結符号語の途中で出現した場合は、１ブロックの残りの画素全てに関して、直前にデコードされたシンボルの値が０だった場合は１を連結シンボルデータを出力する。また、直前にデコードされたシンボルの値が１だった場合は０を連結シンボルデータを出力する。さらに、単体符号語“ＥＯＢ”が連結符号語の先頭で出現した場合(連結符号語自身がＥＯＢの場合)は、直前の画素データが０の場合には、１ブロックの残りの画素全てを１として出力する。また、直前の画素データが１の場合は１ブロック残りの画素全て０を出力する。
【０１８８】
図８は、第２の実施形態の復号部１０４のブロック構成図である。図中、８００は符号データの入力端子であり、８０１は符号データから連結符号語を頭出しするためのシフタであり、８０２は連結符号語をデコードして、後述のデコードテーブル８０３にアドレスを出力する為のデコーダである。８０３は図７Ａ，７Ｂのデコードテーブルを実現する為のテーブルであり、８０４はデコードされた連結シンボルデータを１６ビット単位でパックする為のパッカである。８０５は１６ビットパック後の画素データを出力する為の出力端子である。また、８０６は連結符号語をデコードして、後述のテーブル８０７及びテーブル８０８にアドレスを供給する為のデコーダである。８０７はデコードされた画素数を示すデータ長（以下、パック長と称す）を算出する為のオフセット値（以下、ベース値と称す）を出力する為のテーブルである。８０８は符号データの頭だしをする為のシフト量（以下、シフト量と称す）を出力する為のテーブルである。また、８０９はテーブル８０７からのベース値と複数符号データからパック長を算出する為の演算部であり、８１０はブロックの最初の画素値（初期値）を入力する為の１ビットの入力端子である。
【０１８９】
次に図８の復号部の処理内容を説明する。先ず入力端子８００から入力された符号データはシフタ８０１を介してデコーダ８０２、８０８に入力される。ここで、図７Ａ，７Ｂの例では連結符号語の最大ビット数は１４ビットである為、１４ビット分の符号データがデコーダ８０２、８０６及びテーブル８０７に入力される。デコーダ８０２では図７Ａ，７Ｂの連結符号語のデコードを行い、デコード結果をテーブルのアドレスとしてテーブル８０３に出力する。
【０１９０】
ここで、テーブル８０３は図７Ａ，７Ｂに示した連結符号語の数として８５個必要であるが、後述するように第２の実施形態ではテーブルのエントリー数を２１個に減らして、デコーダ８０２及びテーブル８０３の回路規模の削減を図っている。
【０１９１】
その後、テーブル８０３はデコーダ８０２からのアドレスに従って連結シンボルデータをパッカ８０４に出力する。ここで、後述するようにテーブル８０３から出力する連結シンボルデータは、図３で説明したのと同様に、最後の変化点の位置と次画素の値がわかれば良いので、最後の変化点の次画素まで格納されている。即ち、図７Ａ，７Ｂの符号語番号７８〜８２に対応する連結シンボルデータの時、最大のビット幅となり、このときの最後の変化点の次画素である９ビットのバス幅でパッカ８０４に対して出力される。
【０１９２】
一方、デコーダ８０６に入力された符号データは、図７Ａ，７Ｂの連結符号語のデコードを行い、デコード結果をテーブルのアドレスとしてテーブル８０７及びテーブル８０８に出力する。ここで、テーブル８０７のエントリー数は、図７Ａ，７Ｂに示した連結符号語の数と同等の数が必要であるが、後述するように第２の実施形態では２２個に減らして、デコーダ８０６、テーブル８０７及びテーブル８０８の回路規模の削減を図っている。
【０１９３】
また、図１０Ａ，１０Ｂで説明するように、シフト量の算出に連結符号語の所定のビットを用いる為、演算部８０９に、シフタ８０１から出力された連結符号語が入力されている。その後、テーブル８０７はデコーダ８０６からのアドレスに従ってベース値を演算部８０９に出力する。演算部８０９では後述するようにベース値と、連結符号語の所定のビット位置の値の総和からパック長を算出し、パッカ８０４に出力し、かつシフト量をシフタ８０１に出力する。その後、パッカ８０４ではパック長と、入力端子８１０から入力されるブロックの初期値に従って、連結シンボルデータの最終単体シンボルデータの生成、及び、出力端子８０５に対する１６ビットにパックした画素データの出力を行なう。又、シフタ８０１はシフト量に従って、次の連結符号語の頭出しを行なう。以上の繰り返しにより、デコード動作を行なう。
【０１９４】
次に図９Ａ，９Ｂを用いてデコーダ８０２及びテーブル８０３の動作を説明する。符号番号、連結符号語に関しては、図７Ａ，７Ｂと同一である。相違点は、デコーダ８０２のアドレス値が追加されている点と、連結シンボルデータが、８ビット目まで拡張されている点である。例えば、図７Ａ，７Ｂの符号語番号０の連結シンボルデータは“１０１”であったが、図９Ａ，９Ｂでは最終単体シンボルのデコード値である３つ目のシンボルのデコード値“１”が拡張されて、連結シンボルデータが“101111111”となっている。これは、後段のパッカ８０４にて、デコードされた画素数を示すパック長を用いて連結シンボルデータのビット幅を決定し、最終単体シンボルのデコード値の開始位置と値がわかれば、連結シンボルデータの値が決定することが可能である為、最終単体シンボルのデコード値の開始位置が最も長い連結符号語（符号語番号７８乃至８２）の９ビットにバス幅を合わせているためである。これらのビット拡張により、連結シンボルデータが同一になるものに対して、デコーダ３０２の出力のアドレスを割り振ることにより、図７Ａ，７Ｂにて元々必要であったエントリー数８５個を２１個に削減することが可能となる。これにより、デコーダ８０２とテーブル８０３の回路規模の削減を図っている。
【０１９５】
次に図１０Ａ，１０Ｂを用いてデコーダ８０６、テーブル８０７及びテーブル８０８の動作を説明する。先ず、単体符号語を識別する為のヘッダの使用は、図５で説明したものと同等である。
【０１９６】
デコーダ８０６は単体符号のヘッダに着目して、連結符号語のデコードを行なう。図１０Ａ，１０Ｂはデコーダ８０６の出力であるアドレス毎に図９Ａ，９Ｂのデコードテーブルを並び替えた表である。又、“シフト量”はテーブル８０７の出力であるシフト量を示し、“ベース値”はシフト量を計算する為の各アドレス毎に共通なオフセット値を示し、“１の数”は各連結符号語のヘッダ以外のビットが“１”になっている数を示す。ここで説明のために符号番号を付与しているが、これは図９Ａ，９Ｂのものとは異なる。
【０１９７】
次にアドレス及びシフト量のデコード方法とパック長の計算方法に関して図１０Ａ，１０Ｂを用いて説明する。
【０１９８】
先ず、符号番号０乃至７に関しては、連結符号語を構成する単体符号語のヘッダが全て“０”である為、“0*0*0*”(*は０又は１)の連結符号語としてデコードを行い、デコーダ８０６はアドレス“０”を出力する。この時、連結符号語の符号長は“６”である為、シフタ８０１へシフト量“６”を出力する。また、パック長に関してはベースを“３”として、１の数との和により算出する。即ち、符号語番号０の時は、１の数が０である為、パック長は3+0=3となる。符号語番号１，２，４の時は、１の数が１つである為、パック長は3+1=4となる。また、符号語番号３，５，６の時は、１の数が２つである為、パック長は3+2=5となる。符号語番号７の時は、１の数が３つである為、パック長は3+3=6となる。つまり、連結符号語をcode[0:13]（符号データの先頭を0ビット目とする）とすると、パック長=3+code[1]+code[3]+code[5]で算出され、パッカ８０４へ出力される。
【０１９９】
以下同様に、符号番号８乃至１５に関しては、連結符号語を構成する単体符号語のヘッダが同一である為、“0*0*0*”(*は０又は１)の連結符号語としてデコードを行い、デコーダ８０６はアドレス“１”を出力する。この時、連結符号語の符号長は“７”である為、シフタ８０１へシフト量“７”を出力する。また、パック長に関してはベース“５”+ “１の数”として、パック長=5+code[1]+code[3] +code[6]で算出され、パッカ８０４へ出力される。
【０２００】
符号番号１６は、連結符号語の最後の単体符号語がEOBの場合であり、“0*0*110000”(*は0又は1)の連結符号語としてデコードを行い、デコーダ８０６はアドレス“３”を出力する。この時、連結符号語の符号長は“１０”である為、シフタ８０１へシフト量“１０”を出力する。また、パック長に関してはブロックエンドまで(EOB)を示す“６４”として、パッカ８０４へ出力される。
【０２０１】
符号番号１７乃至２０に関しては、連結符号語を構成する単体符号語のヘッダが同一である為、“0*0*11######”(*は0又は1、######は000100-111101(十進数で4-61)であり、この数字をnとする)の連結符号語としてデコードを行い、デコーダ８０６はアドレス“３”を出力する。この時、連結符号語の符号長は“１２”である為、シフタ８０１へシフト量“１２”を出力する。また、パック長に関してはベース“３”+ “１の数”+ｎとして、パック長=3+code[1]+code[3]+nで算出され、パッカ８０４へ出力される。
【０２０２】
符号番号２１乃至２８に関しては、連結符号語を構成する単体符号語のヘッダが同一である為、“0*10*0*”(*は0又は1)の連結符号語としてデコードを行い、デコーダ８０６はアドレス“４”を出力する。この時、連結符号語の符号長は“７”である為、シフタ８０１へシフト量“７”を出力する。また、パック長に関してはベース“５”+ “１の数”として、パック長=5+code[1]+code[4] +code[6]で算出され、パッカ８０４へ出力される。
【０２０３】
符号番号２９無し３６に関しては、連結符号語を構成する単体符号語のヘッダが同一である為、“0*10*10*”(*は0又は1)の連結符号語としてデコードを行い、デコーダ８０６はアドレス“５”を出力する。この時、連結符号語の符号長は“８”である為、シフタ８０１へシフト量“８”を出力する。また、パック長に関してはベース“７”+ “１の数”として、パック長=7+code[1]+code[4] +code[7]で算出され、パッカ８０４へ出力される。
【０２０４】
符号番号３７は符号番号３８乃至４１に関して連結符号語の最後の単体符号語がEOBの場合であり、“0*10*110000”(*は0又は1)の連結符号語としてデコードを行い、デコーダ８０６はアドレス“６”を出力する。この時、連結符号語の符号長は“１１”である為、シフタ８０１へシフト量“１１”を出力する。また、パック長に関してはブロックエンドまで(EOB)を示す“６４”として、パッカ8８０４へ出力される。
【０２０５】
符号番号３８乃至４１に関しては、連結符号語を構成する単体符号語のヘッダが同一である為、“0*10*11######”(*は0又は1、######は000100-111011(十進数で4乃至59)であり、この数字をnとする)の連結符号語としてデコードを行い、デコーダ８０６はアドレス“７”を出力する。この時、連結符号語の符号長は“１３”である為、シフタ８０１へシフト量“１３”を出力する。また、パック長に関してはベース“５”+ “１の数”+nとして、パック長=5+code[1]+code[4]+nで算出され、パッカ８０４へ出力される。
【０２０６】
符号番号４２は符号番号４３、４４に関して連結符号語の最後の単体符号語がEOBの場合であり、“0*110000”(*は0又は1)の連結符号語としてデコードを行うことになる。デコーダ８０６はアドレス“８”を出力する。この時、連結符号語の符号長は“８”である為、シフタ８０１へシフト量“８”を出力する。また、パック長に関してはブロックエンドまで(EOB)を示す“６４”として、パッカ８０４へ出力される。
【０２０７】
符号番号４３、４４に関しては、連結符号語を構成する単体符号語のヘッダが同一である為、“0*11######”(*は0又は1、######は000100-111110(十進数で4-62)であり、この数字をnとする)の連結符号語としてデコードを行い、デコーダ８０６はアドレス“９”を出力する。この時、連結符号語の符号長は“１０”である為、シフタ８０１へシフト量“１０”を出力する。また、パック長に関してはベース“２”+ “１の数”+nとして、パック長=2+code[1]+nで算出され、パッカ８０４へ出力される。
【０２０８】
符号番号４５乃至５２に関しては、連結符号語を構成する単体符号語のヘッダが同一である為、“10*0*0*”(*は0又は1)の連結符号語としてデコードを行い、デコーダ８０６はアドレス“１０”を出力する。この時、連結符号語の符号長は“７”である為、シフタ８０１へシフト量“７”を出力する。また、パック長に関してはベース“５”+ “１の数”として、パック長=5+code[2]+code[4] +code[6]で算出され、パッカ８０４へ出力される。
【０２０９】
符号番号５３乃至６０に関しては、連結符号語を構成する単体符号語のヘッダが同一である為、“10*0*10*”(*は0又は1)の連結符号語としてデコードを行い、デコーダ８０６はアドレス“１１”を出力する。この時、連結符号語の符号長は“８”である為、シフタ８０１へシフト量“８”を出力する。また、パック長に関してはベース“７”+ “１の数”として、パック長=7+code[2]+code[4] +code[7]で算出され、パッカ８０４へ出力される。
【０２１０】
符号番号６１は符号番号６２乃至６５に関して連結符号語の最後の単体符号語がEOBの場合であり、“10*0*110000”(*は0又は1)の連結符号語としてデコードを行う。デコーダ８０６はアドレス“１２”を出力する。この時、連結符号語の符号長は“１１”である為、シフタ８０１へシフト量“１１”を出力する。また、パック長に関してはブロックエンドまで(EOB)を示す“６４”となり、パッカ８０４へ出力される。
【０２１１】
符号番号６２乃至６５に関しては、連結符号語を構成する単体符号語のヘッダが同一である為、“10*0*11######”(*は0又は1、######は000100-111011(十進数で4-59)であり、この数字をnとする)の連結符号語としてデコードを行い、デコーダ８０６はアドレス“１３”を出力する。この時、連結符号語の符号長は“１３”である為、シフタ８０１へシフト量“１３”を出力する。また、パック長に関してはベース“５”+ “１の数”+nとして、パック長=5+code[2]+code[4]+nで算出され、パッカ８０４へ出力される。
【０２１２】
符号番号６６乃至７３に関しては、連結符号語を構成する単体符号語のヘッダが同一である為、“10*10*0*”(*は0又は1)の連結符号語としてデコードを行い、デコーダ８０６はアドレス“１４”を出力する。この時、連結符号語の符号長は“８”である為、シフタ８０１へシフト量“８”を出力する。また、パック長に関してはベース“７”+ “１の数”として、パック長=7+code[2]+code[5] +code[7]で算出され、パッカ８０４へ出力される。
【０２１３】
符号番号７４乃至８１に関しては、連結符号語を構成する単体符号語のヘッダが同一である為、“10*10*10*”(*は0又は1)の連結符号語としてデコードを行い、デコーダ８０６はアドレス“１５”を出力する。この時、連結符号語の符号長は“９”である為、シフタ８０１へシフト量“９”を出力する。また、パック長に関してはベース“９”+ “１の数”として、パック長=9+code[2]+code[5] +code[8]で算出され、パッカ８０４へ出力される。
【０２１４】
符号番号８２は符号番号８３乃至８６に関して連結符号語の最後の単体符号語がEOBの場合であり、“10*10*110000”(*は0又は1)の連結符号語としてデコードを行い、デコーダ８０６はアドレス“１６”を出力する。この時、連結符号語の符号長は“１２”である為、シフタ８０１へシフト量“１２”を出力する。また、パック長に関してはブロックエンドまで(EOB)を示す“６４”として、パッカ８０４へ出力される。
【０２１５】
符号番号８３乃至８６に関しては、連結符号語を構成する単体符号語のヘッダが同一である為、“10*10*11######”(*は0又は1、######は000100-111001(十進数で4-57)であり、この数字をnとする)の連結符号語としてデコードを行い、デコーダ８０６はアドレス“１７”を出力する。この時、連結符号語の符号長は“１４”である為、シフタ８０１へシフト量“１４”を出力する。また、パック長に関してはベース“７”+ “１の数”+nとして、パック長=7+code[2]+code[5]+nで算出され、パッカ８０４へ出力される。
【０２１６】
符号番号８７は符号番号８８、８９に関して連結符号語の最後の単体符号語がEOBの場合であり、“10*110000”(*は0又は1)の連結符号語としてデコードを行う。デコーダ８０６はアドレス“１８”を出力する。この時、連結符号語の符号長は“９”である為、シフタ８０１へシフト量“９”を出力する。また、パック長に関してはブロックエンドまで(EOB)を示す“６４”として、パッカ８０４へ出力される。
【０２１７】
符号番号８８乃至８９に関しては、連結符号語を構成する単体符号語のヘッダが同一である為、“10*11######”(*は0又は1、######は000100-111100(十進数で4-60)であり、この数字をnとする)の連結符号語としてデコードを行う。デコーダ８０６はアドレス“１９”を出力する。この時、連結符号語の符号長は“１１”である為、シフタ８０１へシフト量“１１”を出力する。また、パック長に関してはベース“４”+ “１の数”+nとして、パック長=4+code[2]+nで算出され、パッカ８０４へ出力される。
【０２１８】
符号番号９０に関しては、連結符号語は単体符号語がEOBそのものである為、そのままデコードを行い、デコーダ８０６はアドレス“２０”を出力する。この時、連結符号語の符号長は“６”である為、シフタ８０１へシフト量“６”を出力する。また、パック長に関してはブロックエンドまで(EOB)を示す“６４”として、パッカ８０４へ出力される。
【０２１９】
符号番号９１に関しては、連結符号語は単体符号“11******”(******は000100-111111(十進数で4-63)の値であり、この数字をnとする)そのものである為、そのままデコードを行う。デコーダ８０６はアドレス“２１”を出力する。この時、連結符号語の符号長は“８”である為、シフタ８０１へシフト量“８”を出力する。また、パック長に関してはベース“１”として、パック長=1+nで算出され、パッカ８０４へ出力される。
【０２２０】
以上説明したように、デコーダ８０６及びテーブル８０７において、連結符号語のデコードをヘッダ構成に着目してデコードし、かつパック長を連結符号語のヘッダ以外のビットの１の数を用いて算出することにより、９２個のエントリー数を２２個に減らす事が可能となり、デコーダ８０６とテーブル８０７の回路規模の削減が可能となる。
【０２２１】
次にパッカ８４の動作を説明する。パッカ８０４はパッカ３０４に対して入力される連結シンボルデータのビット幅が異なり、パッカ３０４の５ビットに対して、パッカ８０４は９ビットであるため、前記の式（３）、（１２）、（１３）、（１５）、（３５）、（３６）、（３７）、及び、（３８）のの演算及び条件式が異なる。夫々を式（３−２）、（１３−２）、（１５−２）、（３５−２）、（３６−２）、（３７ー２）、及び（３８−２）として以下に示す。
endn=sdatan-1(8)    … （３−２）
plenn≦9の時   extn= 0    …（１２−２）
plenn＞9の時   extn= 1    …（１３−２）
extn =1 かつ ocntn≠4の時    extptrn = sumn - (plenn - 5)    …（１５−２）
endn-1=0 かつ extn-1=1の時  bufn(sptrn-1: extptrn-1-1) = sdatan-1(0:8)  …（３５−２）
endn-1=1 かつ extn-1=1の時  bufn(sptrn-1: extptrn-1-1) = not(sdatan-1(0:8))  …（３６−２）
endn-1=0 かつ extn-1=1の時  bufn(extptrn-1:eptrn-1)= sdatan-1(8), sdatan-1(8),…,sdatan-1(8)  …（３７ー２）
endn-1=1かつextn-1=1の時  bufn(extptrn-1:eptrn-1)= not(sdatan-1(8), sdatan-1(8),…,sdatan-1(8))    …（３８−２）
【０２２２】
これらの演算式及び条件式を除けば、パッカ８０４の動作は図６で示したパッカ３０４の動作と同等であるため、説明を省略する。
【０２２３】
以上説明したように、連結シンボルデータに関しては１シンボルのみのデコード時を除き、デコードテーブルに最後の変化点の次の画素まで格納し、パッカにてパック長分、前記最後の変化点の次の画素値を拡張することにした。これにより、連結シンボルデータのデコードテーブルのエントリー数の削減による、連結シンボルデータ用デコーダ及びテーブルの回路規模の削減が可能となる。また、シフト量及びパック長に関しては、連結符号語のヘッダ部分をデコードすることにより、シフト量及びパック長を算出するベース値を決定し、パック長を前記ベース値と、前記ヘッダ部分以外のビットとの総和で算出した。これにより、シフト量及びパック長用のデコードテーブルのエントリー数の削減による、シフト量及びパック長用デコーダ及びテーブルの回路規模の削減が可能になる。
【０２２４】
これにより、小さな回路規模で連結シンボル同時デコードが可能な、可変長復号化装置を提供することが可能となる。
【０２２５】
［第３の実施形態］
前記第１及び第２の実施形態における可変長符号化は１ビット／画素としてランレングス符号化を行っていた。しかしながら、多値の画素データにおいても（例えば８ビット／画素）、１ブロックを２色化し、入力画像が２色の代表色のどちらに属するかを識別する識別信号（２色の識別であるので１ビット／画素）と２色の代表色を符号化する構成においても適用できる。この場合は、図１１に示すように上記識別信号にランレングス符号化を用い、２色の代表色をブロックの先頭（または後端（EOBの直後））に配置すればよい。ランレングス符号化された識別信号は、前記第１及び第２の実施形態に示した方法にて復号化することで、高速、且つ、低コストに構成することができる。
【０２２６】
また、１ブロック２色以上の場合は、色の変化点をランレングス符号化し、ブロックの後端（ランレングス符号化のEOBの直後）に変化点毎の色を連結しておけばよい。例えば、図１２（ａ）に示すブロックデータを図１２（ｂ）に示すように横方向にジグザグに走査した場合、３箇所の色の境界（変化点）が発生する。図１３に上記図１２（ｂ）における符号化コードのパッキング例を示す。その境界までのラン長をランレングス符号化し（符号語数はEOBを含め４つ）、４色（境界＋１色）のデータをその後にパックする。但し、境界毎にEOB以降にパックする色は増えるので、ブロック内の色数に関らず（境界＋１色）分のパックが必要となる。
【０２２７】
［他の実施形態］
前記した各実施形態の機能を、パーソナルコンピュータ等のプロセッサを内蔵する情報処理装置や、マイコンを内蔵する装置が実行するコンピュータプログラムでもって実現させても構わない。また、通常、コンピュータプログラムは、ＣＤ−ＲＯＭ等のコンピュータ可読記憶媒体に格納されており、それをコンピュータが有する読取り装置（ＣＤ−ＲＯＭドライブ等）にセットし、システムにコピー若しくはインストールするとで実行可能になる。従って、かかるコンピュータ可読記憶媒体も本発明の範疇に入ることも明らかである。
【図面の簡単な説明】
【０２２８】
【図１】第１及び第２の実施形態における、単体シンボルの符号表である。
【図２】第１の実施形態における、デコードテーブルである。
【図３】第１の実施形態における、復号化装置の構成図である。
【図４】第１の実施形態における、連結シンボルデータ用デコーダ及びテーブルの動作を説明する図である。
【図５】第１の実施形態における、シフト量及びパック長用のデコーダ及びテーブルの動作を説明する図である。
【図６】第１の実施形態における、パッカの動作を説明する図である。
【図７Ａ】、
【図７Ｂ】第２の実施形態における、デコードテーブルである。
【図８】第２の実施形態における、復号化装置の構成図である。
【図９Ａ】、
【図９Ｂ】第２の実施形態における、連結シンボルデータ用デコーダ及びテーブルの動作を説明する図である。
【図１０Ａ】、
【図１０Ｂ】第２の実施形態における、シフト量及びパック長用のデコーダ及びテーブルの動作を説明する図である。
【図１１】第３の実施形態における、符号化コードのフォーマット例である。
【図１２】第３の実施形態における、多色データの入力例である。
【図１３】第３の実施形態における、多色データの符号化コードのフォーマット例である。
【図１４】実施形態における画像復号装置のブロック構成図である。
【図１５】１画素ブロックの符号化データのデータ構造を示す図である。
【図１】
2010166444.tif 000003
【図２】
2010166444.tif 000004
【図３】
2010166444.tif 000005
【図４】
2010166444.tif 000006
【図５】
2010166444.tif 000007
【図６】
2010166444.tif 000008
【図７Ａ】
2010166444.tif 000009
【図７Ｂ】
2010166444.tif 000010
【図８】
2010166444.tif 000011
【図９Ａ】
2010166444.tif 000012
【図９Ｂ】
2010166444.tif 000013
【図１０Ａ】
2010166444.tif 000014
【図１０Ｂ】
2010166444.tif 000015
【図１１】
2010166444.tif 000016
【図１２】
2010166444.tif 000017
【図１３】
2010166444.tif 000018
【図１４】
2010166444.tif 000019
【図１５】
2010166444.tif 000020