以下、本発明を図示する実施形態に基づいて説明する。
<<< §1. JPEG方式の符号化手順 >>>
本発明に係る画像符号化処理の技術は、特定の符号化方式に限定されるものではないが、実用上は、JPEG方式を採用した画像符号化に最適の技術と言える。また、現在、画像データを圧縮する方法としては、JPEG方式を採用した符号化方法が最も一般化した方法になっている。そこで、ここでは、一般的なJPEG方式の符号化手順を簡単に説明しておく。
図1は、RGB表色系で表現されたカラー原画像を構成する画像データPに対して、JPEG方式の符号化処理を行う手順の前半段階を示す平面図である。RGB表色系で表現されたカラー原画像は、図の上段左に示すように、R色プレーンP(R)、G色プレーンP(G)、B色プレーンP(B)の3枚の原色プレーンから構成されており、個々の原色プレーンは、それぞれ所定の画素値をもった画素の配列によって構成されている。
JPEG方式では、まず、このカラー原画像の表色系をRGB表色系からYCbCr表色系に変換して、図1の上段右に示すように、輝度プレーンP(Y)、Cb色プレーンP(Cb)、Cr色プレーンP(Cr)の3枚の原色プレーンから構成される画像データP′を生成した上で、これら各原色プレーンをそれぞれブロック分割する前処理が行われる。通常、1つのブロックが8×8の画素配列によって構成されるように分割処理が行われ、ブロック画素配列Bが生成される。図1の中段には、輝度プレーンP(Y)の左上部分(ハッチング部分)を構成するブロック画素配列Bの構成が例示されている。この例の場合、ブロック画素配列Bは、8行8列の画素配列によって構成され、個々の画素には、8ビットで表現される256段階の画素値が定義されている。
続いて、個々のブロック画素配列Bごとに、それぞれDCT(離散コサイン変換:Discrete Cosine Transform)処理が施され、図1の下段左に示すように、DCT係数配列Kが得られる。8ビットの画素値をもつブロック画素配列Bに対してDCT処理を施すと、理論的に11ビットのDCT係数(1ビットは符号ビット)が得られることになる。したがって、DCT係数配列Kは、11ビットの符号付きDCT係数を8行8列に並べた配列ということになる。
更に、このDCT係数配列Kに対して、所定の量子化テーブルを用いた量子化処理を行い、図1の下段右に示すような量子化データ配列Qを得る。具体的には、8行8列からなる量子化テーブルを用意し、DCT係数配列Kの各配列要素を量子化テーブルの対応する配列要素で除する除算演算を行い、得られた商を量子化データとして配列することにより、量子化データ配列Qが得られる。ここで、量子化データ配列Qを構成する個々の量子化データは11ビットの符号付きデータになる。
結局、図1の中段に示すブロック画素配列Bが、8ビットの画素値をもった64個のデータによって構成されていたのに対して、図1の下段右に示す量子化データ配列Qは、11ビットの画素値をもった64個のデータによって構成されていることになり、この時点でビット数だけに着目すれば、一見したところ、情報量が増えているように見える。しかしながら、実際には、量子化データ配列Qを構成する64個のデータの多くは「0」になるため、後述するゼロランレングスを用いた符号化および可変長ハフマン符号化を行うことにより、全体の情報量を大幅に削減することができる。
すなわち、DCT係数配列K内の各DCT係数は、もとのブロック画素配列Bの空間周波数成分を示す値になっており、1行1列目(左上隅のセル)の係数がDC成分を表し、他の63個の係数がAC成分を表している。しかも、左上のセルへゆくほど低周波成分、右下のセルへゆくほど高周波成分の係数が配置されるようになっているため、一般的なデジタル静止画像に対してDCT処理を施すと、右下付近の高周波成分の係数の大部分は「0」もしくは「0に近い値」になる。このため、更に量子化処理を施して得られる量子化データ配列Qの右下付近のデータの大多数は「0」になるので、ゼロランレングスを用いた符号化を行うことにより、全体の情報量を大幅に削減することができる。
ゼロランレングスは、連続して出現する「0」の数を示すものであるので、データ列をゼロランレングスを利用して符号化する場合、なるべく「0」が連続して出現するデータ列を符号化対象とした方が情報量の圧縮効率は高まることになる。このため、JPEG方式では、図1の下段右に示すような量子化データ配列Qの構成要素となる64個の量子化データを、左上隅のセルから右下隅のセルに向けてジグザグに抽出しながら並び替える処理が行われる。
図2は、量子化データ配列Qについて、ジグザグにデータ抽出を行って並び替えることにより、データ順序列Q′を生成する手順を示す平面図である。前述したとおり、量子化データ配列Qは、DCT係数配列Kに基づいて得られた配列であるため、図2(a) に示すとおり、左上のセルへゆくほど低周波成分、右下のセルへゆくほど高周波成分のデータが並べられている。このため、元の原画像が一般的なデジタル静止画像の場合、高周波成分の値は小さくなり、右下のセルへゆくほど「0」が増える傾向にある。
そこで、図2(a) に矢印で示すように、1行1列目(左上隅のセル)のデータを起点として、配列の左上隅のセルから右下隅のセルに向けてジグザグに各配列要素を順序づける並び順を定め、量子化データ配列Qを構成する各量子化データを、当該並び順に応じて並べ替えるようにすれば、順番が後ろになるほど、「0」が連続して出現する可能性が高まることになる。図2(b) は、上述した並び順を数字で示したものであり、1〜64の数字が各配列要素の並び順を示している。
ここでは、この図2(b) に示す64個のセルを、それぞれセル内の数字を用いて呼ぶことにする。たとえば、1行1列目のセルは「セル1」、1行2列目のセルは「セル2」、... 、8行8列目のセルは「セル64」ということになる。ここで行う並べ替えは、セル1、セル2、セル3、... 、セル63、セル64というように、セルの番号順に当該セル内のデータを並べる処理ということになる。図2(c) は、このような並べ替えを行った結果を示しており、各セル内の数字は、図2(b) の各セル内の数字に対応しており、数字1〜64を、そのまま昇順に並べたものになっている。
図2(b) に示す64個のセルが、8行8列の二次元配列を構成しているのに対して、図2(c) に示す64個のセルは、単に、一次元の順序列を構成している。そこで、ここでは、この並べ替え後のデータ群をデータ順序列Q′と呼ぶことにする。なお、図2(c) では、図示の便宜上、データ順序列Q′を構成する64個のセルを、4行16列の形式に並べて示しているが、下方に矢印で示すとおり、この64個のセルは、1〜64まで連続する一連の順序列であり、二次元配列を構成するものではない。
上述したとおり、図2(b) に示す量子化データ配列Qを構成する量子化データの値は、右下のセルへゆくほど「0」である可能性が高くなる。したがって、図2(c) に示すデータ順序列Q′では、後ろになるほど、「0」が連続して出現する可能性が高まることになる。これは、ゼロランレングスを用いた符号化を行う上では都合がよい。
図3は、具体的な数値をもった量子化データ配列Qについて、図2に示す手順を実行することによりデータ順序列Q′を生成し、更に、ランレングス処理データRを生成した例を示す平面図である。図3(a) に示す量子化データ配列Qは、8行8列からなる配列に量子化データを収容したものである。前述したとおり、個々の量子化データは、理論的には、符号付きの11ビットのデータで表現されることになるが、通常は、図示の例のように、比較的「0」に近い数値をとることが多い。これは、量子化テーブル内の値で割り算する量子化処理が行われているためである。また、DCT処理が施されているため、右下へゆくほど、「0」の出現確率が高くなっている。
一方、図3(b) に示すデータ順序列Q′は、図3(a) に示す量子化データ配列Qを、図2(a) に示すジグザグ順に並び替えたものである。ここでも、図示の便宜上、データ順序列Q′を、4行16列の形式に並べて示しているが、実際には、64個のデータによる一連の一次元順序列が構成されていることになる。このデータ順序列Q′を先頭から順に眺めてゆくと、最初のうちは「0」が離散的に出現しているが、徐々に連続した「0」群が増えてゆき、第48番目のセル以降はすべてが「0」になっている。このように「0」の連続が続くと、ゼロランレングスを用いた符号化をより効率的に行うことができるようになり、データの圧縮効率は向上する。
図3(c) は、図3(b) に示すデータ順序列Q′に対してランレングス処理(「0」の連続をゼロランレングスに置き換えて表現する処理)を行うことによって得られるデータRの概念図である。ここで、四角で囲った数値は、「0以外」のデータを示しており、(0×k)という形式の括弧書きの記号は「0がk個連続するゼロランレングス」を示す記号である。実際には、ゼロランレングスの部分は、所定のフォーマットで記述されることになるが、いずれにしても、「0がk個並んでいる」ことを示せればよいので、情報としては、「ゼロランレングス」であることと「k個」であることが表現できれば十分である。このため、ゼロランレングスを利用した符号化を行えば、全体のデータ容量を大幅に低減させる圧縮効果が得られることになる。
JPEG方式の符号化の場合、このようなゼロランレングス処理を行った後、更に、可変長ハフマン処理を施すことにより、最終的なJPEG方式の符号化データが生成されることになる。
このJPEG方式の符号化処理において、処理速度を向上させる上でのボトルネックとなるのが、ゼロランレングスの検出処理である。たとえば、図3(b) に示すデータ順序列Q′に基づいて、図3(c) に示すようなランレングス処理データRを生成するためには、データ順序列Q′を構成する個々のデータを先頭から1個ずつ読み出してチェックしてゆき、合計64個のデータのそれぞれについて、「0」か「0でない」かを判定する必要がある。そのためには、64サイクル分の処理時間が必要になり、処理の高速化を阻む要因になっていた。
本発明は、このような問題を解決するために案出されたものであり、ゼロランレングスの検出処理がボトルネックになることを解消し、より高速な符号化を実現するための新技術を提案するものである。以下、§2以降において、その内容を詳述する。
<<< §2. 本発明に係る符号化装置の基本構成 >>>
図4は、本発明の基本的な実施形態に係る画像符号化装置の構成を示すブロック図である。この装置は、画像データPとして与えられた二次元画像を符号化して、符号化データCとして出力する機能を果たす画像符号化装置であり、図示のとおり、前処理部11、DCT処理部12、量子化部13、量子化バッファ部20、ゼロフラグ生成部25、順序列生成部30、順序列バッファ部40、ランレングス処理部50、ランレングスバッファ部60、ハフマン符号化部70によって構成される。実際には、これらの各構成要素は、半導体集積回路によって構成することができる。以下、これら各構成要素の機能を順に説明する。
前処理部11の基本機能は、符号化の対象となる二次元画像を複数のブロックに分割し、それぞれ所定の画素値をもった合計n個の画素を縦横に並べてなるブロック画素配列Bを生成する機能である。モノクロ画像が符号化対象として与えられた場合は、ブロック分割処理を行うだけでよいが、カラー画像が符号化対象となる原画像として与えられた場合は、必要に応じて表色系の変換を行い、個々の原色プレーンごとにブロック分割を行うことになる。
たとえば、図1に示す例では、RGB表色系のカラー原画像が画像データPとして与えられており、これをYCbCr表色系に変換した上で、個々の原色プレーンごとにブロック分割を行い、ブロック画素配列Bを得ている。
このような前処理を行う場合には、前処理部11を、三原色R,G,Bのそれぞれについての画素値が定義された二次元画素配列からなるカラー原画像を画像データPとして入力するカラー原画像入力部と、入力したカラー原画像の色空間をRGB表色系からYCbCr表色系に変換し、Y,Cb,Crのそれぞれについて、画素値が定義された二次元画素配列を生成する表色系変換部と、この表色系変換部による変換で得られたY,Cb,Crの各二次元画素配列を、それぞれ複数のブロックに分割し、I行J列に並べられたn個(n=I×J)の画素の配列からなるブロック画素配列Bを生成するブロック分割部と、によって構成すればよい。図1に示す例は、I=8、J=8、n=64とした例である。
こうして、前処理部11によって、各原色プレーンについて、それぞれ複数のブロック画素配列Bが生成されることになるが、これらのブロック画素配列Bは、順次、DCT処理部12に与えられることになる。したがって、DCT処理部12およびこれに後続する各構成要素では、個々のブロック画素配列Bを単位処理対象とした処理(以下、ブロック処理と呼ぶことにする)が順次繰り返されることになる。そして、最後にハフマン符号化部70において、ブロック単位のデータをまとめることにより、与えられた画像データPに対応する符号化データCが生成される。
DCT処理部12は、図1の中段から下段左に示すように、前処理部11から与えられるブロック画素配列Bに対して、離散コサイン変換を行い、得られるn個のDCT係数を縦横に並べてなるDCT係数配列Kを生成する処理を行う。JPEG方式で採用されている離散コサイン変換処理を行うと、図2(a) に示すように、配列の左上へゆくほど低周波成分、右下へゆくほど高周波成分が配置されるようにDCT係数を縦横に並べてなるDCT係数配列Kが生成される。§1で述べたとおり、ブロック画素配列Bを構成する個々の画素が8ビットの画素値を有する一般的な例の場合、離散コサイン変換を行うことにより、符号を含めて11ビットで表現されるDCT係数が得られることになる。
量子化処理部13は、DCT処理部12から与えられるDCT係数配列Kに対して、図1の下段に示すとおり量子化処理を行い、得られるn個の量子化データを縦横に並べてなる量子化データ配列Qを生成する処理を行う。具体的には、量子化処理部13は、DCT係数配列Kと同じサイズの配列からなる量子化テーブルを用いて、DCT係数配列Kの各配列要素を量子化テーブルの対応する配列要素で除する除算演算を行い、得られた商を量子化データとして量子化データ配列Qを生成することになる。用いる量子化テーブルの内容は、JPEGの規格によって定められているため、ここでは詳しい説明は省略する。§1で述べた例の場合、量子化処理を行うことにより、11ビットで表現される64個の量子化データを8行8列に並べた量子化データ配列Qが生成される。
量子化バッファ部20は、こうして生成された量子化データ配列Qを格納する機能を果たす構成要素である。この量子化バッファ部20は、図示のとおり、量子化データ配列Qとともに、ゼロフラグ配列Zを格納する機能を果たす。ゼロフラグ配列Zは、ゼロフラグ生成部25によって生成された、量子化データ配列Qと同じサイズをもった配列であり、ここに示す例の場合、量子化データ配列Qと同様に、8行8列の行列によって構成される。ただ、ゼロフラグ配列Zは、1ビットのゼロフラグを要素とする配列であるため、この例の場合、全体で64ビットの情報量をもった配列ということになる。
ゼロフラグは、対応する量子化データが「0」か「0でない」かを示すフラグである。ここでは、「0である」場合を「零状態」、「0でない」場合を「非零状態」と呼ぶことにする。フラグ自身は、0または1のいずれかの論理値をとる1ビットの情報であるので、ここでは、ゼロフラグを、「零状態」には論理値「0」、「非零状態」には論理値「1」を対応させた1ビットで表現することにする。もちろん、「零状態」には論理値「1」、「非零状態」には論理値「0」を対応させることも可能であるが、後述するように、実用上は、「零状態」には論理値「0」、「非零状態」には論理値「1」を対応させるのが好ましい。
ゼロフラグの実体は、図5に示す対応関係を参照すれば容易に理解できよう。図5の左に示す量子化データ配列Qは、図3(a) に示す具体的な量子化データ配列Qと同じものであり、8行8列の二次元配列に並べられた64個の量子化データによって構成されており、個々の量子化データは、符号を含めて11ビットのデータによって構成されている。一方、図5の右に示すゼロフラグ配列Zも、8行8列の二次元配列に並べられた64個のゼロフラグによって構成されているが、各ゼロフラグは1ビットからなるフラグであり、論理値0または1のいずれかを示す役割を果たす。
ここに示す例の場合、上述したとおり、ゼロフラグの論理値が0の場合は、対応データ(配列上の同じ位置にある量子化データ)がゼロであること(零状態)を示し、ゼロフラグの論理値が1の場合は、対応データがゼロでないこと(非零状態)を示している。すなわち、図5左に示す量子化データ配列の各セルの数字が0の場合には、図5右に示すゼロフラグ配列の対応するセルの数値は0になり、図5左に示す量子化データ配列の各セルの数字が0でない場合には、その数値や符号にかかわらず、図5右に示すゼロフラグ配列の対応するセルの数値は1になる。
結局、図4に示すゼロフラグ生成部25は、量子化データ配列Qを構成するn個の量子化データのそれぞれについて、「0である」場合には「零状態」、「0でない」場合には「非零状態」を示すゼロフラグを生成し、生成したゼロフラグを量子化データ配列に対応する配列に収容することによりゼロフラグ配列Zを生成し、これを量子化バッファ部20に格納する処理を行うことになる。
なお、実用上は、上述したように、「零状態」を論理値「0」、「非零状態」を論理値「1」で表現する1ビットのゼロフラグを用いるようにするのが好ましい。これは、そのような定義を行えば、ゼロフラグ生成部25を単純な論理和演算回路によって構成することができるためである。
図6は、ゼロフラグ生成部25を64組の「11入力1出力タイプの論理和演算回路」によって構成した例を示す回路図である。図では、便宜上、1組の論理和演算回路25−1のみの回路図を示すが、論理和演算回路25−2,25−3,... ,25−64も全く同様の回路によって構成されている。論理和演算回路25−1の入力段には、量子化処理部13から出力される第1番目の量子化データ(量子化データ配列Qの第1行第1列目のデータ)を示す11本のビット信号線が接続され、論理和演算回路25−1の出力段は、量子化バッファ部20内のゼロフラグ配列Zの第1番目のゼロフラグ(ゼロフラグ配列Zの第1行第1列目のフラグ)の格納場所に接続される。
後述するように、ここに示す実施形態の場合、量子化バッファ部20は、個々のビットを格納するためのフリップフロップによって構成されているため、論理和演算回路25−1の出力段は、対応するゼロフラグを格納するためのフリップフロップの入力段に接続されることになる。結局、図6に示す64組の論理和演算回路25−1〜25−64は、図5左に示す量子化データ配列Qの各セルに記載されたデータ(符号付きの11ビットのデータ)を示す11ビットの論理値について、論理和演算を行い、その結果を各データに対応するゼロフラグとして出力する処理を行うことになる。
たとえば、図5左に示す量子化データ配列Qの場合、1行1列目のセルのデータ「−3」が11ビットのデータとして、図6に示す論理和演算回路25−1に入力され、その結果として論理和演算回路25−1から出力される論理値「1」が、図5右に示すゼロフラグ配列Zの1行1列目のセルのフラグとして格納されることになる。論理和演算回路25−1は、入力した11ビットがすべて論理値「0」であった場合にのみ論理値「0」を出力し、入力した11ビットの中に1つでも論理値「1」が含まれていた場合は論理値「1」を出力することになるので、量子化データが「0」か、「0でない」かを示すゼロフラグを生成することができる。
このように、11ビットからなる量子化データの全ビットについての論理和演算を行う論理和演算回路を、個々の量子化データについてのゼロフラグを生成する構成要素として用いるようにすれば、図6に示すように、合計64組の論理和演算回路25−1〜25−64によってゼロフラグ生成部25を構成することができ、比較的単純な回路構成でゼロフラグ生成部25を実現できるようになる。
なお、図5には、説明の便宜上、量子化データ配列Qに基づいてゼロフラグ配列Zを生成する概念図が示されているが、実用上は、ゼロフラグ生成部25は、量子化処理部13の信号出力に基づいてゼロフラグ配列Zを生成するようにするのが好ましい。
図4に示すとおり、量子化処理部13で生成された量子化データは、量子化バッファ部20内に量子化データ配列Qとして格納される。したがって、ゼロフラグ生成部25は、量子化バッファ部20内に格納されている量子化データ配列Q内の各量子化データを読み出してゼロフラグを生成することも可能であるが、実用上は、図示のとおり、量子化処理部13から量子化バッファ部20への信号線を分岐させてゼロフラグ生成部25(論理和演算回路25−1〜25−64)に与え、生成したゼロフラグを量子化バッファ部20に格納する処理を行うようにすればよい。そうすれば、量子化バッファ部20内に量子化データ配列Qを格納するのとほぼ同じタイミングで(厳密には、論理和演算回路による論理和演算処理サイクルだけ遅れて)、ゼロフラグ配列Zを格納することができ、処理の高速化を図ることができる。
ここに示す実施形態の場合、量子化バッファ部20は、フリップフロップによって構成されており、量子化データ配列Q内の各量子化データを構成する個々のビットや、ゼロフラグ配列Z内の各ゼロフラグを示す個々のビットは、いずれもフリップフロップによる二値情報として記録されることになる。したがって、量子化処理部13からの各ビット線やゼロフラグ生成部25からの各ビット線は、これらフリップフロップの入力段に接続されることになる。同様に、量子化バッファ部20から量子化データやゼロフラグを読み出す場合は、各フリップフロップの出力段から二値情報が読み出されることになる。
このように、量子化バッファ部20をメモリではなく、フリップフロップによって構成しておけば、メモリに対するアドレス指定などは不要になり、各フリップフロップの入出力段に適切な配線を施しておけば足りるので、回路構成の単純化を図るとともに、処理の高速化を図ることができる。
一方、順序列生成部30の役割は、こうして量子化バッファ部20内に格納された量子化データ配列Qおよびゼロフラグ配列Zについて並べ替えを行い、その結果を、順序列バッファ部40にデータ順序列Q′およびゼロフラグ順序列Z′として格納することと、ゼロフラグ配列Zに基づいて、EOBフラグ順序列E′を生成し、これを順序列バッファ部40に格納することである。そのため、順序列生成部30には、図4に示されているとおり、データ順序列生成部31、ゼロフラグ順序列生成部32、EOBフラグ順序列生成部33が設けられている。
データ順序列生成部31は、量子化バッファ部20内に格納されている量子化データ配列Qについて、空間周波数分布に応じた所定の並び順を定め、n個のデータを当該並び順に応じて並べたデータ順序列Q′を生成する機能を果たす。ここで述べる実施形態の場合、量子化データ配列Q内には、64個の量子化データ(n=64)が格納されており、データ順序列生成部31は、図2(a) に矢印で示すように、配列の左上隅から右下隅に向けてジグザグに各配列要素を順序づける並び順を定め、量子化データ配列Qを構成する各量子化データを、この並び順に応じて並べ替えることによりデータ順序列Q′を生成し、これを順序列バッファ部40に格納する処理を行う。量子化データ配列Qに基づいてデータ順序列Q′を生成する具体例は、図3(a) ,(b) に例示したとおりである。
ゼロフラグ順序列生成部32も同様に、量子化バッファ部20内に格納されているゼロフラグ配列Zに基づいて、n個のゼロフラグを上記並び順(この実施形態の場合、64個のゼロフラグについて、図2(a) に矢印で示すジグザグの並び順)に応じて並べたゼロフラグ順序列Z′を生成し、これを順序列バッファ部40に格納する処理を行う。
一方、EOBフラグ順序列生成部33は、量子化バッファ部20内に格納されているゼロフラグ配列Zに基づいて、EOBフラグ順序列E′を生成し、これを順序列バッファ部40に格納する処理を行う。ここで、「EOB」とは、「End of Block」の頭文字をとったものであり、EOBフラグは、ブロック処理を継続して行うべきであることを示す「ブロック継続状態」か、ブロック処理を終了してよい「ブロック終了状態」か、のいずれかを示すフラグとして機能する。
具体的には、EOBフラグ順序列生成部33は、ゼロフラグ順序列Z′を構成するn個のゼロフラグのそれぞれについて、自己を含めて後続するゼロフラグが、すべて「零状態」を示している場合には「ブロック終了状態」、そうでない場合には「ブロック継続状態」を示すEOBフラグを生成し、生成したn個のEOBフラグをゼロフラグ順序列Z′の並び順に応じて並べたEOBフラグ順序列E′を生成する機能を有している。「ブロック終了状態」であれば、以後のゼロフラグがすべて「零状態」を示していることになり、以後の量子化データがすべて「0」であることを示していることになる。
したがって、「ブロック終了状態」であれば、その時点で、以後に後続するデータ「0」をゼロランレングスとして出力し、ブロック処理を終了してよいことになる。このように、EOBフラグは、「ブロック終了状態」か否かを示すフラグであるため、本来は、「ブロック終了状態」には論理値「1」、「ブロック継続状態」には論理値「0」を対応させるべきであるが、ここに示す実施形態の場合、EOBフラグ順序列生成部33は、EOBフラグを、「ブロック終了状態」には論理値「0」、「ブロック継続状態」には論理値「1」を対応させた1ビットで表現している。その理由については後述する。
かくして、順序列生成部30を構成するデータ順序列生成部31からはデータ順序列Q′が出力され、ゼロフラグ順序列生成部32からはゼロフラグ順序列Z′が出力され、EOBフラグ順序列生成部33からはEOBフラグ順序列E′が出力されることになる。順序列バッファ部40は、こうして出力されたデータ順序列Q′と、ゼロフラグ順序列Z′と、EOBフラグ順序列E′と、を格納する機能を有する。
図7は、図4に示す順序列生成部30の処理機能を、具体的なデータ配列について説明したブロック図である。図の上段に示す量子化バッファ部20に格納されている量子化データ配列Qおよびゼロフラグ配列Zは、図5に例示したものと同じものである。順序列生成部30は、これら量子化データ配列Qおよびゼロフラグ配列Zに基づいて、データ順序列Q′、ゼロフラグ順序列Z′、EOBフラグ順序列E′を生成し、順序列バッファ部40に格納する処理を行う。なお、順序列バッファ部40に格納されている各順序列Q′,Z′,E′は、データやフラグを所定の並び順で並べた一次元の順序列であり、二次元配列ではないが、ここでは図示の便宜上、4行16列の形式に並べて示すことにする。
データ順序列生成部31は、量子化バッファ部20に格納されている量子化データ配列Q内の64個のデータを、図2(a) に矢印で示す並び順で並び替えることにより、データ順序列Q′を生成し、これを順序列バッファ部40に格納する処理を行う。データ順序列Q′は、それぞれが11ビットからなるデータを64個、所定の並び順で並べたものである。
ゼロフラグ順序列生成部32は、量子化バッファ部20に格納されているゼロフラグ配列Z内の64個のフラグを、図2(a) に矢印で示す並び順で並び替えることにより、ゼロフラグ順序列Z′を生成し、これを順序列バッファ部40に格納する処理を行う。ゼロフラグ順序列Z′は、それぞれが1ビットからなるフラグを64個、所定の並び順で並べたものである。
EOBフラグ順序列生成部33は、ゼロフラグ順序列Z′を構成する64個のゼロフラグのそれぞれについて、自己を含めて後続するゼロフラグが、すべて「零状態」を示している場合には「ブロック終了状態」、そうでない場合には「ブロック継続状態」を示すEOBフラグを生成し、生成した64個のEOBフラグをゼロフラグ順序列Z′の並び順に応じて並べたEOBフラグ順序列E′を生成し、これを順序列バッファ部40に格納する処理を行う。EOBフラグ順序列E′は、それぞれが1ビットからなるフラグを64個、所定の並び順で並べたものである。
前述したように、ここに示す実施形態の場合、「ブロック終了状態」を示すEOBフラグには論理値「0」、「ブロック継続状態」を示すEOBフラグには論理値「1」を対応させている。したがって、図7の最下段に示すEOBフラグ順序列E′の場合、全64個のEOBフラグのうち、第1番目〜第47番目のEOBフラグは論理値「1」(ブロック継続状態)を示しており、第48番目〜第64番目のEOBフラグ(図ではセルの枠を太線で囲って示してある)は論理値「0」(ブロック終了状態)を示している。
このEOBフラグ順序列E′は、その上に示されているゼロフラグ順序列Z′に対応するものである。すなわち、EOBフラグ順序列E′内の第i番目のEOBフラグは、ゼロフラグ順序列Z′内の第i番目およびこれに後続する第(i+1)番目,第(i+2)番目,... ,第64番目のゼロフラグがすべてが「0」である場合には論理値「0」(ブロック終了状態)を示し、そうでない場合には論理値「1」(ブロック継続状態)を示している。
実際、ゼロフラグ順序列Z′を構成する各ゼロフラグを第1番目から第64番目に向かって1つずつ順番に着目してゆくと、第48番目のゼロフラグ(図ではセルの枠を太線で囲って示してある)に着目した時点で初めて「自己を含めて後続するゼロフラグが、すべて『0』を示している」という条件が満足されることになる。したがって、EOBフラグ順序列E′では、第1番目〜第47番目までのEOBフラグは「1」、第48番目〜第64番目のEOBフラグは「0」になっている。
このように、EOBフラグ順序列E′は、ゼロフラグ順序列Z′に対応しており、第i番目のEOBフラグの値を決定するには、ゼロフラグ順序列Z′の第i番目以降のすべてのゼロフラグの値を参照して、上記条件が満足されているか否かを判定する必要がある。したがって、EOBフラグ順序列生成部33は、原理的には、順序列バッファ部40内に格納されているゼロフラグ順序列Z′から、判定に必要なゼロフラグを読み出して、上記条件が満足されているか否かを判定し、その結果に基づいてEOBフラグの値を決定すればよい。
しかしながら、実用上、EOBフラグ順序列生成部33は、順序列バッファ部40内に格納されているゼロフラグ順序列Z′を参照してEOBフラグ順序列E′を生成する代わりに、図7に示すように、量子化バッファ部20内に格納されているゼロフラグ配列Zを参照してEOBフラグ順序列E′を生成し、これを順序列バッファ部40内に格納する処理を行うようにするのが好ましい。そうすれば、順序列バッファ部40内にゼロフラグ順序列Z′を格納するのとほぼ同じタイミングで(厳密には、後述するように、論理和回路の演算時間だけ遅延した程度のタイミングで)、EOBフラグ順序列E′を格納することができ、処理の高速化を図ることができる。このような方法でEOBフラグ順序列E′を生成する機能をもったEOBフラグ順序列生成部33の具体的構成例は後述する。
ここに示す実施形態の場合、順序列バッファ部40も、フリップフロップによって構成されており、データ順序列Q′内の各データを構成する個々のビット、ゼロフラグ順序列Z′内の各ゼロフラグを示す個々のビット、EOBフラグ順序列E′内の各EOBフラグを示す個々のビットは、いずれもフリップフロップによる二値情報として記録される。したがって、順序列生成部30からデータやフラグを出力するための各ビット線は、これらフリップフロップの入力段に接続されることになる。同様に、順序列バッファ部40からデータやフラグを読み出す場合は、各フリップフロップの出力段から二値情報が読み出されることになる。
このように、順序列バッファ部40をメモリではなく、フリップフロップによって構成しておけば、メモリに対するアドレス指定などは不要になり、各フリップフロップの入出力段に適切な配線を施しておけば足りるので、回路構成の単純化を図るとともに、処理の高速化を図ることができる。
ここに示す実施形態の場合、量子化バッファ部20と順序列バッファ部40との双方がフリップフロップによって構成されている。すなわち、量子化バッファ部20は、量子化データ配列Q内の個々の量子化データを示す各ビットを格納するためのフリップフロップと、ゼロフラグ配列Z内の個々のゼロフラグを示すビットを格納するためのフリップフロップとを有している。一方、順序列バッファ部40は、データ順序列Q′内の個々のデータを示す各ビットを格納するためのフリップフロップと、ゼロフラグ順序列Z′内の個々のゼロフラグを示すビットを格納するためのフリップフロップと、EOBフラグ順序列E′内の個々のEOBフラグを示すビットを格納するためのフリップフロップとを有している。このように量子化バッファ部20と順序列バッファ部40との双方をフリップフロップによって構成しておけば、これらの間に設けられた順序列生成部30の回路構成を単純化し、処理の高速化を図るメリットも得られるようになる。以下、この点を順に説明しよう。
まず、データ順序列生成部31は、量子化バッファ部20内の量子化データ配列Qを格納するためのフリップフロップの出力段と順序列バッファ部40内のデータ順序列Q′を格納するためのフリップフロップの入力段とを接続する信号線によって構成することができる。データ順序列Q′は、量子化データ配列Q内の量子化データを、図2(a) の矢印に示す並び順で並べ替えたものであるので、量子化データ配列Qを格納するための11ビット×64組のフリップフロップの出力段と、データ順序列Q′を格納するための11ビット×64組のフリップフロップの入力段とを接続する単なる信号線(配線)によって、データ順序列生成部31を構成することができる。
もちろん、個々の信号線は、量子化データ配列Qを構成する64個のデータを上記並び順に応じて並べ替えることができるように、量子化バッファ部20内で特定のデータが格納されたフリップフロップと順序列バッファ部40内で当該特定のデータを格納すべきフリップフロップとを接続する配線を構成する必要がある。たとえば、量子化データ配列Qの第2行第3列目のデータ「−4」を格納するための11ビット分のフリップフロップの出力段は、データ順序列Q′の第8番目のデータを格納すべき11ビット分のフリップフロップの入力段に接続されるような配線が行われる。
ゼロフラグ順序列生成部32も、同様に、量子化バッファ部20内のゼロフラグ配列Zを格納するためのフリップフロップの出力段と順序列バッファ部40内のゼロフラグ順序列Z′を格納するためのフリップフロップの入力段とを接続する信号線によって構成することができる。ゼロフラグ順序列Z′は、ゼロフラグ配列Z内のゼロフラグを、図2(a) の矢印に示す並び順で並べ替えたものであるので、ゼロフラグ配列Zを格納するための64組のフリップフロップの出力段と、ゼロフラグ順序列Z′を格納するための64組のフリップフロップの入力段とを接続する単なる信号線(配線)によって、ゼロフラグ順序列生成部32を構成することができる。
もちろん、個々の信号線は、ゼロフラグ配列Zを構成する64個のフラグを上記並び順に応じて並べ替えることができるように、量子化バッファ部20内で特定のフラグが格納されたフリップフロップと順序列バッファ部40内で当該特定のフラグを格納すべきフリップフロップとを接続する配線を構成する必要がある。たとえば、ゼロフラグ配列Zの第2行第3列目のフラグを格納するためのフリップフロップの出力段は、ゼロフラグ順序列Z′の第8番目のデータを格納すべきフリップフロップの入力段に接続されるような配線が行われる。
一方、EOBフラグ順序列生成部33は、単なる信号線(配線)だけで構成することはできないので、若干の工夫が必要である。具体的には、EOBフラグ順序列生成部33は、量子化バッファ部20内のゼロフラグ配列Zを格納するためのフリップフロップの出力段と順序列バッファ部40内のEOBフラグ順序列E′を格納するためのフリップフロップの入力段とを接続する複数組の信号線と、これら信号線上に設けられた合計(n−1)個(この例の場合、n=64)の論理和演算回路と、によって構成することができる。
図8および図9に、63組の論理和演算回路33−1〜33−63と、1組の信号線33−64と、によってEOBフラグ順序列生成部33を構成した具体的な回路図を示す。
まず、図8の上段に示されている第1番目の論理和演算回路33−1は、「64入力1出力タイプの論理和演算回路」であり、量子化バッファ部20に格納されているゼロフラグ配列Zを構成する第1番目〜第64番目の並び順(図2(b) の各セル内に記載された並び順に基づく順番、以下同様)のゼロフラグを示す64本の信号線(64個のフリップフロップの出力段に接続された信号線)を入力とし、入力した64ビットの論理値についての論理和を、1本の信号線から1ビットの出力として出力する回路である。当該1ビットの出力は、順序列バッファ部40に格納されるべきEOBフラグ順序列E′の第1番目のEOBフラグ格納用のフリップフロップの入力段に与えられる。
また、図8の2段目に示されている第2番目の論理和演算回路33−2は、「63入力1出力タイプの論理和演算回路」であり、量子化バッファ部20に格納されているゼロフラグ配列Zを構成する第2番目〜第64番目の並び順のゼロフラグを示す63本の信号線(63個のフリップフロップの出力段に接続された信号線)を入力とし、入力した63ビットの論理値についての論理和を、1本の信号線から1ビットの出力として出力する回路である。当該1ビットの出力は、順序列バッファ部40に格納されるべきEOBフラグ順序列E′の第2番目のEOBフラグ格納用のフリップフロップの入力段に与えられる。
更に、図8の3段目に示されている第3番目の論理和演算回路33−3は、「62入力1出力タイプの論理和演算回路」であり、量子化バッファ部20に格納されているゼロフラグ配列Zを構成する第3番目〜第64番目の並び順のゼロフラグを示す62本の信号線(62個のフリップフロップの出力段に接続された信号線)を入力とし、入力した62ビットの論理値についての論理和を、1本の信号線から1ビットの出力として出力する回路である。当該1ビットの出力は、順序列バッファ部40に格納されるべきEOBフラグ順序列E′の第3番目のEOBフラグ格納用のフリップフロップの入力段に与えられる。
以下、同様にして、たとえば、図9に示されている第62番目の論理和演算回路33−62は、「3入力1出力タイプの論理和演算回路」であり、量子化バッファ部20に格納されているゼロフラグ配列Zを構成する第62番目〜第64番目の並び順のゼロフラグを示す3本の信号線(3個のフリップフロップの出力段に接続された信号線)を入力とし、入力した3ビットの論理値についての論理和を、1本の信号線から1ビットの出力として出力する回路である。当該1ビットの出力は、順序列バッファ部40に格納されるべきEOBフラグ順序列E′の第62番目のEOBフラグ格納用のフリップフロップの入力段に与えられる。
また、図9に示されている第63番目の論理和演算回路33−63は、「2入力1出力タイプの論理和演算回路」であり、量子化バッファ部20に格納されているゼロフラグ配列Zを構成する第63番目および第64番目の並び順のゼロフラグを示す2本の信号線(2個のフリップフロップの出力段に接続された信号線)を入力とし、入力した2ビットの論理値についての論理和を、1本の信号線から1ビットの出力として出力する回路である。当該1ビットの出力は、順序列バッファ部40に格納されるべきEOBフラグ順序列E′の第63番目のEOBフラグ格納用のフリップフロップの入力段に与えられる。
以上、63組の論理和演算回路33−1〜33−63についての説明を行ったが、図9の最下段に示す第64番目の回路33−64は、論理和演算回路ではなく、単なる信号線である。この信号線は、量子化バッファ部20に格納されているゼロフラグ配列Zを構成する第64番目の並び順のゼロフラグを示す1本の信号線(1個のフリップフロップの出力段に接続された信号線)を順序列バッファ部40に格納されるべきEOBフラグ順序列E′の第64番目のEOBフラグ格納用のフリップフロップの入力段に接続する役割を果たす。
結局、ブロック画素配列の画素数をnとすれば(ここに示す実施形態の場合は、n=64)、EOBフラグ順序列生成部33は、合計(n−1)組の論理和演算回路33−1〜33−(n−1)と、1組の信号線33−nと、によって構成することができる。
ここで、(n−1)組の論理和演算回路33−1〜33−(n−1)のうち、第i番目(i=1〜n−1)の論理和演算回路を33−iと呼べば、この論理和演算回路を33−iは、図9の上段に示すように、量子化バッファ部20内で第i番目〜第n番目の並び順に対応するゼロフラグを格納している合計(n−i+1)個のフリップフロップの各出力段に接続された(n−i+1)本の信号線を入力とし、順序列バッファ部40内で第i番目(i=1〜n−1)の並び順に対応するEOBフラグを格納すべきフリップフロップの入力段に接続される1本の信号線を出力とする「(n−i+1)入力1出力論理和演算回路」ということになる。
また、1組の信号線33−nは、量子化バッファ部20内で第n番目の並び順に対応するゼロフラグを格納しているフリップフロップの出力段と、量子化バッファ部20内で第n番目の並び順に対応するEOBフラグを格納すべきフリップフロップの入力段と、を接続する信号線ということになる。
このように、図4に示す符号化装置において、量子化バッファ部20および順序列バッファ部40を必要な数のフリップフロップによって構成しておけば、順序列生成部30内のデータ順序列生成部31、ゼロフラグ順序列生成部32、EOBフラグ順序列生成部33は、これらフリップフロップ間を接続する信号線(単なる配線)、もしくは当該信号線とその上に設けられた論理和演算回路との組合わせによって構成することができるので、比較的単純な回路構成で実現することができ、しかも処理速度の向上を図ることができるようになる。
こうして、順序列バッファ部40内に、データ順序列Q′、ゼロフラグ順序列Z′、EOBフラグ順序列E′が格納されたら、ランレングス処理部50によるランレングス処理が行われる。このランレングス処理は、たとえば、図3(b) に示すデータ順序列Q′に対して、「0」の連続をゼロランレングスに置き換えて表現する処理であり、その結果、図3(c) に示すようなランレングス処理データRが得られることになる。ここで、(0×k)という形式の括弧書きの記号は、「0がk個連続するゼロランレングス」を示す記号である。ランレングス処理部50で行われる具体的なランレングス処理の内容については、§3で詳述する。
図4に示す実施形態では、ランレングス処理部50の後段にランレングスバッファ部60が設けられており、ランレングス処理部50からの出力は、このランレングスバッファ部60に一時的に格納される。そして、このランレングスバッファ部60の更に後段には、ハフマン符号化部70が設けられている。ハフマン符号化部70は、ランレングスバッファ部60に格納されている情報に対して、可変長ハフマン符号化処理を行う。このハフマン符号化処理自体は、公知の技術であるため、ここでは詳しい説明は省略する。
以上、前処理部11で用意された1組のブロック画素配列Bについての符号化を行うブロック処理の手順を述べたが、実際には、前処理部11で用意された複数のブロック画素配列Bについて、同様のブロック処理が繰り返し実行されることになる。ハフマン符号化部70からは、こうして個々のブロック画素配列Bについて得られたハフマン符号を連結することにより、最終的な符号化データCが出力されることになる。こうして出力される符号化データCは、元の画像データPをJPEG方式で圧縮した圧縮画像データということになる。
<<< §3. 本発明に係るランレングス処理 >>>
§2では、図4に示す基本的な実施形態に係る画像符号化装置の全体構成および順序列生成部30の具体的な構成例を述べ、順序列バッファ部40内に、データ順序列Q′、ゼロフラグ順序列Z′、EOBフラグ順序列E′が格納されることを説明した。ここでは、これら各順序列に基づいて、ランレングス処理部50において実行されるランレングス処理の内容を説明する。
順序列バッファ部40内に格納されるデータ順序列Q′、ゼロフラグ順序列Z′、EOBフラグ順序列E′は、たとえば、図7の下段に示すような情報になる。すなわち、この例の場合、データ順序列Q′は、11ビットで表現される符号付きのデータを64個並べたものであり、ゼロフラグ順序列Z′は、1ビットのゼロフラグを64個並べたものであり、EOBフラグ順序列E′は、1ビットのEOBフラグを64個並べたものである。
一方、ランレングス処理部50が行うランレングス処理は、データ順序列Q′を構成する64個のデータを、「0」の連続部分をゼロランレングスに置き換えて表現する処理ということができる。別言すれば、データ順序列Q′を構成する64個のデータを、図3(c) に示すようなランレングス処理データRの形式で表現することにより、全体のデータ容量を低減させる処理ということになる。したがって、原理的には、順序列バッファ部40内にデータ順序列Q′さえ用意できていれば、ランレングス処理を実行することができる。すなわち、図3(b) に示すデータ順序列Q′が与えられれば、先頭から順番に個々のデータをチェックしてゆき、「0」が出現したときに、連続する「0」の数をカウントしてゼロランレングスに置き換える操作を行えばよい。
しかしながら、データ順序列Q′を構成する個々のデータを先頭から1個ずつ読み出してチェックしてゆくと、図示の例のようにn=64の場合、64サイクル分の処理時間が必要になり、処理の高速化を阻む要因になる。順序列バッファ部40に用意されたゼロフラグ順序列Z′およびEOBフラグ順序列E′は、このようなランレングス処理を高速化する役割を果たすことになる。
別言すれば、本発明の特徴は、予め、ゼロフラグ順序列Z′およびEOBフラグ順序列E′を用意しておき、ランレングス処理部50がランレングス処理を実行する際には、これらゼロフラグ順序列Z′およびEOBフラグ順序列E′を利用することにより、データ順序列Q′に対して効率的なランレングス処理を施す点にある。
もちろん、本発明では、ランレングス処理を実行する前に、ゼロフラグ順序列Z′およびEOBフラグ順序列E′を用意しておく必要があるので、そのための準備時間が余分に必要になる。しかしながら、実際には、§2で述べたとおり、ゼロフラグ生成部25、ゼロフラグ順序列生成部32、EOBフラグ順序列生成部33は、単なる配線や単純な論理和回路によって構成することができるため、順序列バッファ部40内にデータ順序列Q′を用意するのとほぼ同時に(論理和回路の演算時間だけ遅延した程度のタイミングで)、順序列バッファ部40内に、ゼロフラグ順序列Z′およびEOBフラグ順序列E′を用意することができる。
したがって、本発明の採用により、ゼロフラグ順序列Z′およびEOBフラグ順序列E′を用意するための準備時間が余分にかかったとしても、符号化処理に必要なトータルの時間を比較すれば、本発明により、処理時間を短縮する効果が得られることになる。以下、ゼロフラグ順序列Z′およびEOBフラグ順序列E′を利用したランレングス処理のメリットを説明する。
まず、ゼロフラグ順序列Z′を利用する効用を説明しよう。前述したとおり、ゼロフラグは、対応するデータが「0(零状態)」か、「0でない(非零状態)」かを示すフラグであり、ここで述べる実施形態の場合、零状態の場合はゼロフラグを論理値「0」とし、「非零状態」の場合はゼロフラグを論理値「1」としている。このようなゼロフラグの集合からなるゼロフラグ順序列Z′を予め用意しておき、データ順序列Q′と共に順序列バッファ部40内に格納しておけば、ランレングス処理部50は、データ順序列Q′から1個のデータを読み出しながら、ゼロフラグ順序列Z′からは先行して複数m個のゼロフラグを読み出すことが可能になる。ここでは、同時に読み出される複数m個のゼロフラグを「単位ゼロフラグ群」と呼ぶことにする。
たとえば、ランレングス処理部50が、データ順序列Q′内の第i番目のデータを読み出すとともに、ゼロフラグ順序列Z′内の第i番目〜第(i+m−1)番目までの複数m個のゼロフラグを単位ゼロフラグ群として読み出した場合を考えてみよう。この場合、もし、読み出した単位ゼロフラグ群の先頭のゼロフラグ(すなわち、ゼロフラグ順序列Z′内の第i番目のゼロフラグ)が論理値「0」であれば、当然、読み出した第i番目のデータは「0」ということになる。そして、もし読み出した単位ゼロフラグ群の第2番目のゼロフラグ(すなわち、ゼロフラグ順序列Z′内の第(i+1)番目のゼロフラグ)も論理値「0」であったとすれば、まだ読み出されていない第(i+1)番目のデータも「0」であることが認識できる。同様に、もし読み出した単位ゼロフラグ群の第3番目のゼロフラグ(すなわち、ゼロフラグ順序列Z′内の第(i+2)番目のゼロフラグ)も論理値「0」であったとすれば、まだ読み出されていない第(i+2)番目のデータも「0」であることが認識できる。
このように、データについては、第i番目のデータを1個だけ読み出すようにしつつ、ゼロフラグについては、第i番目のゼロフラグを先頭として複数m個分のゼロフラグを単位ゼロフラグ群として読み出すようにすれば、まだ読み出していない第(i+1)番目以降のデータが「0か否か」を先行して認識することができる。たとえば、読み出した単位ゼロフラグ群が「000010... 」であったとすると、現在読み出されている第i番目のデータを含めて、合計4個の連続したデータが「0」であることを先行して認識することができるので、その時点で、「0」が4個連続することを示すゼロランレングスを生成することができる。
しかも、こうして先行してランレングスの生成ができれば、まだ読み出されていないデータ「0」については、実際には読出処理をスキップして読み飛ばしてしまうことができる。たとえば、上例のように、読み出した単位ゼロフラグ群が「000010... 」であった場合は、現在読み出されている第i番目のデータを含めて、合計4個の連続したデータが「0」であることが認識できる。すなわち、まだ読み出されていない第(i+1)番目のデータ、第(i+2)番目のデータ、第(i+3)番目のデータは、いずれも「0」であることが認識できるので、これら3個のデータについては読み飛ばしを行い、次は、第(i+4)番目のデータを読み出せばよい。
要するに、ランレングス処理部50は、順序列バッファ部40から、データ順序列Q′の第i番目のデータと、ゼロフラグ順序列Z′の第i番目〜第(i+m−1)番目までの複数m個のゼロフラグからなる単位ゼロフラグ群と、を読み出す読出処理を、パラメータiを1から所定ステップ数ずつ順次増加させながら繰り返し実行し、読み出した単位ゼロフラグ群を参照することによりデータ順序列Q′内において0が連続して出現する数を示すゼロランレングス値をカウントし、読み出したデータ順序列Q′内のデータおよびカウントしたゼロランレングス値を出力する処理を行うようにすればよい。
こうして、データ順序列Q′内のデータ「0」をゼロランレングスとしてカウントしてゼロランレングス値の形式で出力し、データ順序列Q′内の「0」以外のデータをデータの形式で出力すれば、ランレングス処理部50から出力される情報は、図3(c) に示すようなランレングス処理データRの形式になる。しかも、カウントしたゼロランレングス値に応じた数だけデータを読み飛ばすことができるように、パラメータiを増加させるステップ数を設定すれば、ゼロランレングスとして先行してカウントされたデータ「0」については読出処理がスキップされ、読出処理に必要なサイクルを省略することができる。
なお、データについては、データ順序列Q′から1個ずつ読み出すのに対して、ゼロフラグについては、ゼロフラグ順序列Z′からm個分のゼロフラグを単位ゼロフラグ群としてまとめて読み出すことになるので、読出対象がゼロフラグ順序列Z′の末尾に近づいてくると、ゼロフラグが枯渇して、m個分のゼロフラグを読み出すことができなくなる。
具体的には、ゼロフラグ順序列Z′に収容されているゼロフラグの総数がnである場合、i=n−m+1の場合は、ゼロフラグ順序列Z′の第i番目〜第(i+m−1)番目までの複数m個のゼロフラグからなる単位ゼロフラグ群を読み出すことができるが、i=n−m+2の場合は、(m−1)個のゼロフラグしか残っていないので、m個のゼロフラグを読み出すことはできない。このようにゼロフラグ順序列Z′内のゼロフラグが枯渇してしまう場合は、すなわち、i>n−m+1の場合は、合計m個のゼロフラグではなく、第i番目〜第n番目までのゼロフラグを単位ゼロフラグ群として読み出すようにすればよい。
もっとも、実用上は、枯渇したゼロフラグの部分にダミーフラグを補填することにより、常に、m個のフラグを単位ゼロフラグ群として読み出すことが可能になる。このような取り扱いを行う方法についての詳細は、§4で述べる。
続いて、ランレングス処理部50が行うゼロランレングス値のカウント処理およびパラメータiの更新処理をもう少し詳しく説明しよう。前述したとおり、ランレングス処理部50は、1回の読出処理において、データ順序列Q′から第i番目のデータを1個読み出すとともに、ゼロフラグ順序列Z′の第i番目〜第(i+m−1)番目までの複数m個のゼロフラグ(但し、i>n−m+1の場合は、第i番目〜第n番目までのゼロフラグ)からなる単位ゼロフラグ群を読み出すことになる。
ランレングス処理部50は、こうして読み出した単位ゼロフラグ群について、先頭から現れる「零状態」のフラグ(ここに示す実施形態の場合は論理値「0」のフラグ)の連続数を求める連続数算出処理を行う。ここでいう「連続数」とは、あくまでも「先頭から現れる『零状態』のフラグが連続する数」である。たとえば、単位ゼロフラグ群が「00001000」であった場合、先頭から連続して出現する0の数は4個であるので、連続数は4ということになる。後半に、0が3個並んでいるが、先頭から連続して出現しているわけではないので、連続数にはカウントされない。また、単位ゼロフラグ群が「10000000」であった場合は、先頭から連続して出現する0は1個もないので、連続数は0ということになる。
ランレングス処理部50は、こうして求めた連続数が0の場合、別言すれば、単位ゼロフラグ群の先頭のゼロフラグが論理値「1」であった場合、パラメータiを増加させるステップ数を1に設定し、新たなパラメータi(前回の読出処理におけるiに1を加えた数)を用いて次の読出処理を行う。一方、求めた連続数が1以上の場合、別言すれば、単位ゼロフラグ群の少なくとも先頭のゼロフラグが論理値「0」であった場合、パラメータiを増加させるステップ数を当該連続数に設定し、新たなパラメータi(前回の読出処理におけるiに当該連続数を加えた数)を用いて次の読出処理を行う。
要するに、ランレングス処理部50は、読み出した単位ゼロフラグ群について、先頭から現れる「零状態」のフラグの連続数を求める連続数算出処理を行い、当該連続数が0の場合にはステップ数を1とし、当該連続数が1以上の場合には当該連続数をステップ数として、パラメータiをこのステップ数だけ増加させながら読出処理を繰り返し実行することになる。
一方、ランレングス処理部50は、次のような方法で、ゼロランレングスのカウントを行う。まず、読み出した単位ゼロフラグ群の先頭のゼロフラグが「零状態」のフラグ(ここに示す実施形態の場合は論理値「0」のフラグ)であった場合には、上述した連続数算出処理で求めた連続数を累積加算する処理を行う。たとえば、単位ゼロフラグ群が「00001000」であった場合は、先頭のゼロフラグが0なので、連続数算出処理で求めた連続数4がゼロランレングス値に累積加算される。後半に並んでいる3個の0は、この時点では、まだカウントされない。なお、先頭のゼロフラグが0の場合は、ゼロランレングスのカウントアップ(累積加算)が行われるだけで、データやゼロランレングス値の出力は一切行われない。これは、単位ゼロフラグ群の先頭のゼロフラグが0の場合は、読み出したデータが「0」であるため、データとして出力する必要がないためである。
これに対して、読み出した単位ゼロフラグ群の先頭のゼロフラグが「非零状態」のフラグ(ここに示す実施形態の場合は論理値「1」のフラグ)であった場合には、連続数算出処理で求まる連続数は0であるから、ゼロランレングスのカウントアップは行われない。たとえば、単位ゼロフラグ群が「10000000」であった場合は、2番目以降のゼロフラグがすべて0になっているが、先頭のゼロフラグが1であるため、連続数は0であり、この時点では、2番目以降のゼロフラグがゼロランレングスとしてカウントアップされることはない。一方、読み出したデータは「0」ではないので、当該データを出力する必要がある。
そこで、単位ゼロフラグ群の先頭のゼロフラグが1であった場合、ランレングス処理部50は、データ順序列Q′から読み出したデータと現時点での連続数の累積値からなるゼロランレングス値とを組にして出力する処理を行う。すなわち、読み出したデータが「0」ではなかった場合、当該データをそのまま出力するとともに、その時点でのゼロランレングスの累積値(ゼロランレングス値)を併せて出力することになる。このように、ランレングス処理部50からの出力は、基本的には、読出処理を行った結果、単位ゼロフラグ群の先頭のゼロフラグが1であった場合に生じ、読み出したデータとゼロランレングス値とを組にした形で行われる。
なお、単位ゼロフラグ群の先頭のゼロフラグが1であった場合、上述したように、その時点でのゼロランレングスの累積値がゼロランレングス値として出力されるので、その後、ゼロランレングスの累積値を初期値0にリセットする処理を行うようにする。したがって、次に読み出された単位ゼロフラグ群の先頭のゼロフラグが0であった場合に行われる連続数の累積処理は、初期値0に対して行われることになる。
以上述べたとおり、ランレングス処理部50は、データ順序列Q′から第i番目のデータを読み出すとともに、ゼロフラグ順序列Z′から第i番目を先頭とする複数m個のゼロフラグからなる単位ゼロフラグ群を読み出し、この単位ゼロフラグ群の先頭から現れる「零状態」のフラグの連続数を求める処理を行う。そして、連続数が1以上である場合には、当該連続数をゼロランレングスとしてカウントし、連続数が0である場合には、データおよびこれまでのゼロランレングスのカウント値を出力することになる。このため、データとともに、適切なゼロランレングス値の出力を行うことができる。また、パラメータiの更新ステップ数を、連続数が0の場合には1とし、連続数が1以上の場合には当該連続数としたため、ゼロランレングスとしてカウント済みのデータ「0」については読み飛ばしを行い、読出処理のサイクル数を削減することができる。これが、ランレングス処理を行う前に、予めゼロフラグ順序列Z′を用意しておくことによって得られる効用である。
次に、EOBフラグ順序列E′を予め用意しておく効用を説明しよう。EOBフラグは、前述したとおり、「ブロック終了状態」か「ブロック継続状態」かを示すフラグである。そして、ここで述べる実施形態の場合、EOBフラグは、「ブロック終了状態」には論理値「0」、「ブロック継続状態」には論理値「1」を対応させた1ビットのフラグとして定義される。このような定義を行うのは、§2で述べたとおり、EOBフラグ順序列生成部33を、図8および図9に例示するように、単純な論理和演算回路の組合わせによって構成することができるためである。
ここで、EOBフラグの「ブロック終了状態」とは、対応するゼロフラグおよびこれに後続するゼロフラグが、すべて「零状態」であることを示すものである。たとえば、図7の下段に示す例の場合、EOBフラグ順序列E′内の第1番目〜第47番目のEOBフラグは1、第48番目〜第64番目のEOBフラグ(図に太枠で囲って示すフラグ)は0になっているが、これは、対応するゼロフラグ順序列Z′内の第1番目〜第47番目のゼロフラグについては、「自己を含めて後続するゼロフラグが、すべて0である」という条件を満たしていないが、第48番目〜第64番目のゼロフラグについては、「自己を含めて後続するゼロフラグが、すべて0である」という条件を満たしていることを示している。
したがって、ランレングス処理部50が、上述した読出処理において、データ順序列Q′内の第i番目のデータおよびゼロフラグ順序列Z′内の第i番目のゼロフラグを先頭とする単位ゼロフラグ群を読み出す際に、EOBフラグ順序列E′内の第i番目のEOBフラグも併せて読み出すようにすれば、「ブロック終了状態」になっているか否かを認識することができる。そして、もし「ブロック終了状態」になっていた場合には、現在読み出した第i番目のデータを含めて、後続するデータはすべて「0」ということになるので、その旨を示す情報を出力することにより、以後の処理を中止できる。
たとえば、図7の下段に示す例の場合、ランレングス処理部50は、パラメータi=48とする読出処理において、データ順序列Q′から第48番目のデータ「0」を読み出し、ゼロフラグ順序列Z′から第48番目を先頭とする複数m個のゼロフラグからなる単位ゼロフラグ群「000000....」を読み出し、EOBフラグ順序列E′から第48番目のEOBフラグ「0」を読み出すことになる。そして、読み出したEOBフラグ「0」により、「ブロック終了状態」になっていることを認識できる。すなわち、第48番目のデータを含めて、後続する第64番目までのデータがすべて「0」であることを認識することができる。そこで、ランレングス処理部50は、処理対象となるブロック画素配列に関する以後のブロック処理を中止し、「後続するデータはすべて0であることを示す情報(「ブロック終了状態」を示す情報)」を出力すればよい。
この「後続するデータはすべて0であることを示す情報(「ブロック終了状態」を示す情報)」としては、EOBフラグ自身をそのまま利用すればよい。上述したように、ランレングス処理部50は、読出処理を行った結果、単位ゼロフラグ群の先頭のゼロフラグが1であった場合に、読み出したデータとゼロランレングス値とを組にして出力する。そこで、この出力を行う際に、併せてEOBフラグも出力するようにする。別言すれば、ランレングス処理部50からの出力は、データ、ゼロランレングス値、EOBフラグという3要素を組にして行うようにする。ランレングス処理部50からの出力が生じる際には、毎回、EOBフラグも出力されることになるが、その論理値によって、「ブロック継続状態」か「ブロック終了状態」かを示すことができる。
上述の説明では、ランレングス処理部50は、読み出した単位ゼロフラグ群の先頭のゼロフラグが1であった場合(すなわち、読み出したデータが「0」でなかった場合)に出力を行うことになっているが、読み出したEOBフラグが0であった場合にも、例外的な出力(以下、「ブロック最終出力」という)を行うようにする。EOBフラグが0であった場合、処理対象となるブロック画素配列に関する以後のブロック処理は中止されるので、上記「ブロック最終出力」が、文字通り、当該ブロック画素配列に関する最終的な出力になる。
結局、ランレングス処理部50は、データ順序列Q′の第i番目のデータおよびゼロフラグ順序列Z′の第i番目のフラグを先頭とする単位ゼロフラグ群を読み出す際に、EOBフラグ順序列E′の第i番目のEOBフラグも併せて読み出し、読み出したEOBフラグが「ブロック終了状態(ここに示す実施形態の場合は論理値「0」)」を示している場合には、当該EOBフラグを「ブロック終了状態」を示す情報として出力し、処理対象となるブロック画素配列に関する以後の処理を中止すればよい。
なお、ここに示す実施形態の場合、前述したように、EOBフラグ順序列生成部33を単純な論理和演算回路の組合わせによって構成することができるように、EOBフラグを、「ブロック終了状態」には論理値「0」、「ブロック継続状態」には論理値「1」を対応させた1ビットのフラグとして定義している。しかしながら、EOBフラグは、本来、「ブロック終了状態」を示すためのフラグであり、JPEGなどの汎用規格では、「ブロック終了状態」には論理値「1」、「ブロック継続状態」には論理値「0」を対応させたフラグとして定義されるのが一般的である。
そこで、ここに示す実施形態の場合、ランレングス処理部50が、EOBフラグを出力する際に、当該フラグの論理値を反転して出力するようにしている。すなわち、ランレングス処理部50から出力されるEOBフラグ(反転されたEOBフラグ)が論理値「0」である場合には「ブロック継続状態」を示し、論理値「1」である場合には「ブロック終了状態」を示すことになる。
<<< §4. ランレングス処理部の具体的な構成 >>>
図4では、ランレングス処理部50を1つの機能ブロックとして示し、このランレングス処理部50で実施されるランレングス処理の内容を§3で説明した。ここでは、§3で述べたランレングス処理を実施するのに適したランレングス処理部50の具体的な構成を説明する。
図10は、図4に示す順序列バッファ部40およびランレングス処理部50の詳細構成を示すブロック図である。§2で述べたとおり、ここに示す実施形態の場合、順序列バッファ部40はフリップフロップによって構成されており、データ順序列Q′、ゼロフラグ順序列Z′、EOBフラグ順序列E′が格納されている。
ここでは、一般的なJPEG方式の規格に基づいて、前処理部11において、8ビットの画素値を有する64個の画素(n=64)を8行8列に並べたブロック画素配列Bが作成された場合を例にとって説明する。この場合、DCT処理により、個々のデータは11ビットの情報量をもつことになるので、順序列バッファ部40に格納されているデータ順序列Q′は、11ビットのデータを64個並べた順序列ということになる。一方、ゼロフラグ順序列Z′およびEOBフラグ順序列E′は、いずれも1ビットのフラグを64個並べた順序列になる。
§3では、ランレングス処理部50の基本的な機能として、順序列バッファ部40から、第i番目のデータと、第i番目を先頭とする複数m個のゼロフラグからなる単位ゼロフラグ群と、第i番目のEOBフラグと、をまとめて読み出す読出処理を説明した。このような読出処理を、パラメータiを1から所定ステップ数ずつ順次増加させながら繰り返し実行することにより、ランレングス処理部50内部でランレングス処理が実行されることになる。
一般に、任意のパラメータiを定めて、何らかの順序列から第i番目の要素を読み出す処理は、様々な分野で利用されている汎用処理である。たとえば、メモリ上に格納されたデジタルデータをアクセスする場合、通常、所定のアドレス値をパラメータとして指定し、当該アドレス場所からデータを読み出す処理が行われる。ただ、本発明の目的は、符号化処理の高速化にあるので、順序列バッファ部40からの読出処理も、できるだけ高速化が図れる方法を採用するのが好ましい。
そこで、ここで述べる実施形態では、順序列バッファ部40にシフト機能をもたせ、格納されている順序列の各要素(データやフラグ)自体を順序列バッファ部40内でシフトさせることにより、実質的に、第i番目の要素の読み込みが可能になるような構成を採っている。たとえば、データ順序列Q′の中の第i番目のデータを読み出す際には、順序列バッファ部40内で当該第i番目のデータが先頭にくるようなシフト動作を行い、先頭のデータを読み出すようにすればよい。前述したとおり、順序列バッファ部40をフリップフロップで構成しておけば、いわゆる「バレルシフタ」と呼ばれる仕組を利用して、任意のシフト量によるシフト動作を1サイクルで行うことができる。
そこで、図10に示す順序列バッファ部40は、格納しているデータ順序列Q′内のデータ、格納しているゼロフラグ順序列Z′内のゼロフラグ、格納しているEOBフラグ順序列E′内のEOBフラグを、ランレングス処理部50から与えられたシフト指示に基づいて、指定されたシフト量だけ先頭側にシフトさせるシフト機能を有している。
図10において、ランレングス処理部50から順序列バッファ部40に向かう「シフト」と記述された矢印は、シフト動作を指示するシフト指示信号の流れを示し、「シフト量」と記述された矢印は、シフト量を指定する信号の流れを示している。シフト量の上限値は、単位ゼロフラグ群に含まれるゼロフラグの数mになる。ここに示す実施形態は、m=8に設定した例であるため、シフト量は1〜8の範囲内の値をとる。
図示のとおり、ランレングス処理部50から順序列バッファ部40に対して、シフト信号およびシフト量が伝達されると、順序列バッファ部40は、データ順序列Q′内のデータ、ゼロフラグ順序列Z′内のゼロフラグ、EOBフラグ順序列E′内のEOBフラグに対して、指定されたシフト量だけ先頭側にシフトさせるシフト処理を行う。すなわち、シフト量をSとするシフト処理は、概念的には、順序列を構成する第x番目のセルの内容が、第(x+S)番目のセルの内容に置き換えられる処理、ということができる。
このシフト処理により、先頭側のセル(第1番目のセル)から押し出されたデータやフラグは、そのまま消滅させてしまってかまわない。一方、シフト処理によって空いた末尾側のセルは、概念的には空白セルとしておいてかまわないが、フリップフロップ等の回路でセルを構成した場合、「0」または「1」のいずれかの論理値を補填しておく必要があるので、実用上は、何らかのダミーデータやダミーフラグを補填すればよい。
ここに示す実施形態の場合、ゼロフラグ順序列Z′については、シフト処理によって空いた末尾側のセルに、「非零状態」を示すダミーフラグ(すなわち、論理値「1」を示すフラグ)を補填するようにしている。そうすれば、データ順序列Q′やEOBフラグ順序列E′については、任意の値を補填しても、ゼロランレングス処理を行う上では支障は生じない。
一方、ランレングス処理部50は、図示のとおり、制御部51と、ゼロランカウンタ部52と、データカウンタ部53と、出力部54とを有している。制御部51は、このランレングス処理部50で実行されるランレングス処理を統括制御する役割を果たす。ゼロランカウンタ部52は、順序列バッファ部40から読み出した単位ゼロフラグ群について、先頭から現れる「零状態」のフラグ(論理値「0」のフラグ)の連続数を累積してゼロランレングス値を計数するカウンタとしての機能を果たす。データカウンタ部53は、順序列バッファ部40から読み出したもしくは読み飛ばされたデータの数を累積して計数するカウンタとしての機能を果たす。出力部54は、制御部51からの指示に基づいて、データ、ゼロランレングス、反転EOBフラグを組にして出力し、後段に接続されたランレングスバッファ部60に書き込みを行う機能を果たす。以下、これらの構成要素の処理機能を順に説明する。
はじめに、制御部51の処理機能の概略を、他の構成要素との関連において説明する。図に矢印で示されているとおり、制御部51は、他の構成要素との間で信号やデータのやりとりを行う基本機能を有している。
具体的には、まず、順序列バッファ部40に対しては、シフト指示およびシフト量を与える処理を行うとともに、データ順序列Q′の先頭データ(11ビットのデータ1個)と、ゼロフラグ順序列Z′の先頭からm個(ここに示す例の場合は、m=8)のゼロフラグ(但し、シフトによりゼロフラグの数がm個未満の数になっていた場合は、当該数に相当する個数のゼロフラグおよびその末尾に補填されたダミーフラグ)と、EOBフラグ順序列E′の先頭のEOBフラグと、を読み込む処理を行う。
一方、ゼロカウンタ部52に対しては、図に矢印で示されているとおり、ゼロカウントアップ指示、ゼロカウントアップ量、ゼロカウンタクリア指示、中間出力補正指示を与える処理を行う。ゼロカウントアップ指示は、連続数算出処理で求めた連続数を累積加算するための指示であり、ゼロカウントアップ量は、累積対象となる数値(すなわち、連続数算出処理で求めた連続数。この例の場合は、m=8であるため、連続数は1〜8の範囲の数値になる)である。ゼロカウンタクリア指示は、ブロック処理を開始する初期時点やゼロランレングス値が出力された時点で、ゼロランカウンタ部52が保持しているカウント値を初期値0に設定するための指示である。また、中間出力補正指示は、例外的に、中間時点でゼロランレングス値の出力を行う中間出力処理を行った場合に、カウント値を補正するための指示である。この中間出力処理については後述する。なお、ゼロカウンタ部52が保持している現時点のカウント値は、ゼロランレングス値として制御部51に戻される。
また、データカウンタ部53に対しては、図に矢印で示されているとおり、データカウントアップ指示、データカウントアップ量、データカウンタクリア指示を与える処理を行うとともに、データカウント値を入力する処理を行う。データカウントアップ指示は、順序列バッファ部40内のデータ順序列Q′から読み出したもしくは読み飛ばされたデータの総数を累積加算するための指示であり、データカウントアップ量は、累積対象となる数値(この例の場合は、m=8であるため、当該数値は1〜8の範囲の数値になる)である。データカウンタクリア指示は、ブロック処理を開始する初期時点で、データカウンタ部53が保持しているカウント値を初期値0に設定するための指示である。データカウンタ部53が保持している現時点のカウント値は、データカウント値として制御部51に戻される。
そして、出力部54に対しては、図に矢印で示されているとおり、出力イネーブル指示、11ビットのデータ、中間出力イネーブル指示、EOBフラグを与える処理を行う。出力イネーブル指示は、出力部54に対して、与えた11ビットのデータと、その時点でゼロランカウンタ部52が保持しているゼロランレングス値と、与えたEOBフラグを反転させた反転EOBフラグと、を出力させるための指示である。また、中間出力イネーブル指示は、例外的に、上述した中間出力処理を行わせるための指示であり、その内容については後述する。
一方、ゼロランカウンタ部52は、ゼロランレングス値を計数するための累積計数機能を有する構成要素であり、制御部51からゼロカウンタクリア指示が与えられたときに、カウント値として保持しているゼロランレングス値を初期値0に設定する処理を行う。また、制御部51から、所定のゼロカウントアップ量を指定したゼロカウントアップ指示が与えられたときには、カウント値として保持しているゼロランレングス値を、与えられたゼロカウントアップ量だけ増加させて累積するとともに、その時点のゼロランレングス値を制御部51に返す処理を行う。
また、データカウンタ部53は、データカウント値を計数するための累積計数機能を有する構成要素であり、制御部51から、データカウンタクリア指示が与えられたときに、カウント値として保持しているデータカウント値を初期値0に設定する処理を行う。また、制御部51から、所定のデータカウントアップ量を指定したデータカウントアップ指示が与えられたときには、カウント値として保持しているデータカウント値を、与えられたデータカウントアップ量だけ増加させて累積するとともに、その時点の累積値をデータカウント値として、制御部51に返す処理を行う。
そして、出力部54は、制御部51から、所定のデータを伴う出力イネーブル指示およびEOBフラグが与えられたときに、与えられたデータ(この例の場合、11ビットのデータ)と、その時点でゼロランカウンタ部52に累積されているゼロランレングス値(後述するように、ここに示す実施形態の場合は、JPEGの規格に合致するように、0〜15の範囲内の数値となる)と、与えられたEOBフラグとを組にして出力する。また、これらを後段のランレングスバッファ部60に書き込むため、「ランレングスバッファ書き込み信号」を併せて出力する。
なお、出力部54は、与えられたEOBフラグをそのままの形で出力してもかまわないが、ここに示す実施形態の場合、前述したように、EOBフラグを、「ブロック終了状態」には論理値「0」、「ブロック継続状態」には論理値「1」を対応させた1ビットのフラグとして定義しているため、出力部54は、与えられたEOBフラグを反転させて、反転EOBフラグという形式(論理値「1」が「ブロック終了状態」を示す形式)で出力している。
<<< §5. ランレングス処理部の具体的な処理動作 >>>
続いて、制御部51の内部処理動作を、図11の流れ図を参照しながら詳細に説明する。この流れ図は、制御部51によって実施されるブロック処理の手順、すなわち、図1に例示するような1組のブロック画素配列Bを元に生成されたn個のデータ(ここに示す例では、n=64)を所定の並び順で並べたデータ順序列Q′を処理対象とする処理の手順を示すものである。実際には、この1組のブロック画素配列Bに関するブロック処理が完了すると、順序列バッファ部40には、次の1組のブロック画素配列Bに基づいて作成された新たなデータ順序列Q′が格納されることになり、図11に示すブロック処理が繰り返されることになる。
まず、ステップS1では、ゼロランカウンタ部52に対してゼロカウンタクリア指示を与えるとともに、データカウンタ部53に対してデータカウンタクリア指示を与える初期設定処理が行われる。これにより、ブロック処理の開始時点において、ゼロランカウンタ部52のカウント値およびデータカウンタ部53のカウント値は、いずれも初期値0に設定されることになる。
続くステップS2では、順序列バッファ部40から、データ順序列Q′の先頭データと、ゼロフラグ順序列Z′の先頭からm個のゼロフラグ(単位ゼロフラグ群)と、EOBフラグ順序列E′の先頭のEOBフラグと、を読み込む読込処理が行われる。ここに示す実施形態の場合、データは11ビットから構成されており、m=8に設定されているため、11ビットのデータが1個、1ビットからなるゼロフラグが8個、1ビットからなるEOBフラグが1個が、制御部51によって読み込まれることになる。
なお、前述したとおり、順序列バッファ部40はシフト機能を有しているため、シフト動作を行うたびに、データ順序列Q′内のデータ数、ゼロフラグ順序列Z′内のゼロフラグ数、EOBフラグ順序列内のEOBフラグ数は減少してゆくことになる。しかも、ゼロフラグに関しては、先頭の1個だけではなく、m個(8個)のフラグが単位ゼロフラグ群としてまとめて読み込まれることになるため、シフトによりゼロフラグの数がm個未満の数になっていた場合は、ゼロフラグの枯渇により、m個のゼロフラグを読み込むことはできなくなる。その場合には、残存数に相当する個数のゼロフラグを読み込むようにすればよい。
もっとも、実際には、前述したとおり、順序列バッファ部40が、ゼロフラグ順序列Z′内のゼロフラグを、先頭側に、指定されたシフト量だけシフトさせるシフト処理を行う際に、末尾側に、当該シフト量に対応する数の「非零状態」を示すダミーフラグ(この例の場合、論理値「1」のフラグ)を追加する処理を行うため、制御部51は、読込処理を実行する際に、常に、ゼロフラグ順序列Z′の先頭からm個(8個)のフラグを読み込むようにすれば問題は生じない。ゼロフラグが枯渇していた場合、読み込んだm個のフラグのうちの末尾のいくつかは、ゼロフラグではなく、ダミーフラグということになるが、ダミーフラグが「非零状態」を示すフラグである限り、動作に支障は生じない。結局、ステップS2で読み込まれる単位ゼロフラグ群は、1乃至m個のゼロフラグと、必要に応じてこれに付加されたダミーフラグによって構成される合計m個のフラグ群ということになる。
続くステップS3では、読み込んだEOBフラグの値をチェックする処理が行われる。ここに示す実施形態では、EOBフラグが「1」であれば、「ブロック継続状態」を示していることになるため、そのままブロック処理は続行されることになるが、EOBフラグが「0」であれば、「ブロック終了状態」であるため、ブロック処理は中止されることになる。ここでは、EOBフラグが「1」であった場合(ブロック継続状態であった場合)について、以下の説明を続けることにする。
ステップS3において、EOBフラグが「1」と判定されると、ステップS4において、シフト量、データカウントアップ量、ゼロカウントアップ量の算出が行われる。これらを算出するためには、ステップS2で読み込んだ単位ゼロフラグ群について、先頭から現れる「零状態」のフラグ(この例の場合は、論理値「0」のフラグ)の連続数を求める連続数算出処理が必要である。連続数が求まると、図12の表に示す算出ルールに基づいて、シフト量、データカウントアップ量、ゼロカウントアップ量を決定することができる。
図12の表の第1欄には、単位ゼロフラグ群を構成する8個のゼロフラグの論理値のバリエーションが示されている。各単位ゼロフラグ群は、左側が先頭であり、Xはドントケア(0/1どちらでもよい)を示す。表の第2欄には、各バリエーションについての連続数が示されている。連続数は、論理値「0」のゼロフラグが先頭から現れる場合に、先頭から何個の「0」が連続しているかを示す数値として定義されるので、先頭のゼロフラグが「1」の場合の連続数は0になる。また、論理値「1」が出現してしまった場合は、単位ゼロフラグ群内において、それ以降に出現する「0」は連続数としてはカウントされないので、表の第1欄に示すバリエーションでは、単位ゼロフラグ群において「1」に後続するゼロフラグは、ドントケア(X)として示されている。
したがって、「1XXXXXXX」のように先頭から「1」が出現した場合の連続数は0、「01XXXXXX」のように先頭の「0」の次に「1」が出現した場合の連続数は1、「001XXXXX」のように先頭から2個の「0」が連続出現する場合の連続数は2、「0001XXXX」のように先頭から3個の「0」が連続出現する場合の連続数は3、... 、「00000000」のように8個のゼロフラグが全部「0」の場合の連続数は8ということになる。ここでは、m=8の場合の例を示すが、もちろん、mが8以外の任意の数値に設定されていた場合も、同様にして連続数が定義される。
こうして、ステップS2で読み込んだ単位ゼロフラグ群について、連続数が決定されたら、当該連続数に基づいて、図12の表に従って、シフト量、データカウントアップ量、ゼロカウントアップ量が決定される。まず、シフト量に関しては、連続数が0の場合はシフト量=1とし、それ以外の場合はシフト量=連続数とすればよい。また、データカウントアップ量は、常に、シフト量と同じ値に設定すればよい。一方、ゼロカウントアップ量は、常に、連続数と同じ値に設定すればよい。
この図12に示す表において、各行に記載された数値の意味合いは、次のとおりである。まず、連続数が0の場合の行は、現在読み出されたデータが「0以外」であるため、ゼロランレングスに関するカウントアップ量は0とすべきであるが、次回の読出処理では次のデータを読み出す必要があるためシフト量を1とし、また、既に1個のデータが読み出されているのでデータカウントアップ量も1とすべきであることを示している。
一方、連続数が1の場合の行は、現在読み出されたデータが「0」であるため、ゼロランレングスに関するカウントアップ量は1とすべきであり、次回の読出処理では次のデータを読み出す必要があるためシフト量を1とし、また、既に1個のデータが読み出されているのでデータカウントアップ量も1とすべきであることを示している。
また、連続数が2の場合の行は、現在読み出されたデータが「0」であり、更に、まだ読み出しを行っていない次に後続するデータも「0」であることが先行して認識できるため、ゼロランレングスに関するカウントアップ量は2とすべきであり、次回の読出処理では次のデータを1個読み飛ばして、その次のデータを読み出す必要があるためシフト量を2とし、また、既に1個のデータが読み出され、次の1個のデータが読み飛ばされるので、データカウントアップ量は2とすべきであることを示している。
同様に、連続数が3の場合の行は、現在読み出されたデータが「0」であり、更に、まだ読み出しを行っていない後続する2個のデータも「0」であることが先行して認識できるため、ゼロランレングスに関するカウントアップ量は3とすべきであり、次回の読出処理では後続データを2個読み飛ばして、その次のデータを読み出す必要があるためシフト量を3とし、また、既に1個のデータが読み出され、後続する2個のデータが読み飛ばされるので、データカウントアップ量は3とすべきであることを示している。
そして、連続数が8の場合の行は、現在読み出されたデータが「0」であり、更に、まだ読み出しを行っていない後続する7個のデータも「0」であることが先行して認識できるため、ゼロランレングスに関するカウントアップ量は8とすべきであり、次回の読出処理では後続データを7個読み飛ばして、その次のデータを読み出す必要があるためシフト量を8とし、また、既に1個のデータが読み出され、後続する7個のデータが読み飛ばされるので、データカウントアップ量は8とすべきであることを示している。
こうして、ステップS4において、シフト量、データカウントアップ量、ゼロカウントアップ量が算出されたら、続くステップS5において、ステップS2で読み出した単位ゼロフラグ群の先頭のゼロフラグの値をチェックする処理が行われる。先頭のゼロフラグが論理値「0」であった場合、すなわち、「零状態」を示していた場合は、ステップS2で読み込んだ1個のデータが「0」であることになるので、ゼロランレングス値をカウントアップするためにステップS6へと分岐する。これに対して、先頭のゼロフラグが論理値「1」であった場合、すなわち、「非零状態」を示していた場合は、ステップS2で読み込んだ1個のデータが「0以外」であることになるので、当該「0以外」のデータを出力するためにステップS7へと分岐する。
ここでは、まず、ステップS6へ分岐した場合の処理を説明する。ステップS6は、ゼロランレングス値をカウントアップするための処理であり、ゼロランカウンタ部52に対して、ゼロカウントアップ指示とともに、ゼロカウントアップ量を与える処理が行われる。このゼロカウントアップ量は、ステップS4で算出された値であり、単位ゼロフラグ群の先頭から現れる「0」の連続数に一致する。したがって、連続数が2以上であった場合は、まだ読み出されていないデータ「0」について、先行して、ゼロランレングスとしてのカウントが行われることになる。
また、順序列バッファ部40に対しては、所定のシフト量を指定したシフト指示が与えられる。ステップS6が完了すると、再びステップS2へ戻り、次回の読出処理が行われることになるが、その際には、上記シフト量に応じたシフト処理が行われているため、新たなデータやフラグの読み出しが行われることになる。ステップS6で指定されるシフト量は、ステップS4で算出された値であり、単位ゼロフラグ群の先頭から現れる「0」の連続数(ステップS6の場合は、必ず1以上になる)に一致する。したがって、連続数が1であった場合は、シフト量=1とするシフト処理が行われるが、連続数が2以上であった場合は、シフト量を2以上とするシフト処理が行われ、ゼロランレングスとしてのカウントが先行して行われているデータ「0」は読み飛ばされることになる。
更に、データカウンタ部53に対しては、上記シフト量をデータカウントアップ量として指定したデータカウントアップ指示を与えることになる。データ「0」の読み飛ばしが行われた場合は、シフト量として反映されるため、シフト量をデータカウントアップ量としてデータのカウントアップを行えば、データカウンタ部53は、実際に読み出されたデータとともに読み飛ばされたデータについてもカウントすることができる。
このように、制御部51は、ステップS2で読み出した単位ゼロフラグ群の先頭のゼロフラグが「零状態」(論理値「0」)を示していた場合には、ステップS6において、ゼロランカウンタ部52に対して、ステップS4で求めた連続数をゼロカウントアップ量として指定したゼロカウントアップ指示を与え、順序列バッファ部40に対して、当該連続数をシフト量として指定したシフト指示を与え、データカウンタ部53に対して、当該シフト量をデータカウントアップ量として指定したデータカウントアップ指示を与える処理を行うことになる。
かくして、ステップS2で読み出した単位ゼロフラグ群の先頭のゼロフラグが論理値「0」であった場合(「零状態」を示していた場合)は、ステップS5からステップS6へと分岐して、ゼロランレングス値のカウントアップが行われ、0が連続して出現する個数は、ゼロカウンタ部52におけるカウント値(ゼロランレングス値)として累積されてゆくことになる。これに対して、ステップS2で読み出した単位ゼロフラグ群の先頭のゼロフラグが論理値「1」であった場合(「非零状態」を示していた場合)は、ステップS5からステップS7へと分岐して、データを出力する処理が行われる。
まず、ステップS7では、ゼロランカウンタ部52に現時点で保存されているカウント値(すなわち、その時点のゼロランレングス値)が16以上であるか否かが判定される。図10に示すとおり、ゼロランカウンタ部52から制御部51には、その時点のゼロランレングス値が伝達されており、制御部51は、この値を用いて、ステップS7の判定処理を行うことができる。当該判定処理は、後述する中間出力処理(ステップS8)を行うべきか否かを決めるためのものである。すなわち、ゼロランレングス値が16以上になっていた場合には、ステップS7からステップS8に分岐して、中間出力処理が実行されることになるが、ここでは、まず、ゼロランレングス値が16未満であった場合についての処理を説明する。
ステップS7でゼロランレングス値が16未満であると判定されると、ステップS9へと進み、出力処理が実行される。まず、制御部51は、出力部54に対して、ステップS2で読み出した11ビットのデータを伴う出力イネーブル指示と、ステップS2で読み出したEOBフラグと、を与える。既に述べたとおり、出力部54は、このような出力イネーブル指示を受けて、与えられた11ビットのデータと、ゼロランカウンタ部52に保持されていたゼロランレングス値と、与えられたEOBフラグを反転させた反転EOBフラグと、ランレングスバッファ書き込み信号と、を後段のランレングスバッファ部60に対して出力することになる。
また、ゼロランカウンタ部52に対しては、ゼロカウンタクリア指示を与え、カウント値を初期値0に設定する処理が行われる。これは、ゼロランカウンタ部52がこれまで累積保持していたカウント値が、ゼロランレングス値として出力されてしまったため、ゼロランレングス値の以後のカウントを初期値0から行うためである。
一方、順序列バッファ部40に対しては、シフト量を1に指定したシフト指示が与えられる。前述したとおり、シフト量は、ステップS4において算出されるが、ステップS9が実行される場合は、先頭ゼロフラグが「1」の場合、すなわち、連続数が0の場合であるため、図12の表に示すとおり、シフト量は必ず1になる。そこで、順序列バッファ部40に対しては、シフト量を1に指定したシフト指示が与えられることになる。ステップS9が完了すると、ステップS10を経て、再びステップS2へ戻り、次回の読出処理が行われることになるが、その際には、シフト量を1に指定したシフト処理が行われているため、後続する次のデータが新たなデータとして読み出されることになる。
また、データカウンタ部53に対しては、上記シフト量1をデータカウントアップ量として指定したデータカウントアップ指示が与えられる。
このように、制御部51は、ステップS2で読み出した単位ゼロフラグ群の先頭のゼロフラグが「非零状態」(論理値「1」)を示していた場合には、ステップS9において、出力部54に対して、出力イネーブル指示と、ステップS2で読み込んだデータおよびEOBフラグと、を与え、ゼロランカウンタ部52に対してゼロカウンタクリア指示を与え、データカウンタ部53に対して、シフト量をデータカウントアップ量として指定したデータカウントアップ指示を与え、順序列バッファ部40に対して、シフト量を1に指定したシフト指示を与える処理を行うことになる。
こうして、ステップS9の処理が完了すると、続くステップS10において、データカウンタ部53に累積されているデータカウント値が、処理対象となるブロック画素配列に含まれる画素数n(この例の場合、n=64)に達しているか否かが判定される。図10に示すとおり、制御部51には、データカウンタ部53から、その時点におけるデータカウント値が戻されるので、制御部51は、このデータカウント値を値n(=64)と比較することにより、ステップS10の判定を行うことができる。データカウント値がnに達していない場合には、ステップS10からステップS2へと戻り、上述した各手順が、「ブロック終了状態」を示すEOBフラグが読み込まれるまで繰り返されることになる。一方、ステップS10の判定において、データカウント値がnに達していた場合には、処理対象となるブロック画素配列に関するブロック処理は完了することになる。
続いて、ステップS7から分岐したステップS8で行われる中間出力処理について説明を行う。この中間出力処理は、本発明を実施する上で必ずしも必要な処理ではないが、ゼロランレングス値に上限が設けられている規格に応じた符号化を行う場合には必要になる。たとえば、JPEG規格では、ゼロランレングス値の最大値を15とする上限が設けられている。この規格に従うと、データとしての1個の「0」とランレングスとしての15個の「0」という形式により、最大16個までの連続するデータ「0」を1回の符号化用出力として出すことができる。
換言すれば、データ順序列Q′内に、データ「0」が17個以上並んでいた場合、1回の符号化用出力として取り扱うことはできない。図10において、出力部54から出力されるゼロランレングス値の数値範囲が0〜15となっているのは、このようなJPEG規格に応じたランレングス処理を行ったためである。
図11の流れ図におけるステップS7は、ゼロランカウンタ部52に保持されている現時点のゼロランレングス値が、所定の許容値M以上となっているか否かを判定するための処理である。ここでは、上述したJPEG規格に対応するため、M=16に設定し、ゼロランカウンタ部52のカウント値が16以上になっているか否かの判定が行われる。カウント値が16未満であれば、ステップS9へと進み、これまで述べたように、出力部54に対して出力イネーブル指示を与えるなどの通常の出力指示処理が実行される。ところが、カウント値が16以上になっていた場合には、ステップS7からステップS8へと進み、中間出力処理が実行される。
この中間出力処理は、ゼロランカウンタ部52に累積されている16個分の「0」の情報を、データとしての1個の「0」とランレングスとしての15個の「0」という形式により出力することを目的としたものである。
データ順序列Q′内に多数の「0」が連続していた場合、図11の流れ図に示す手順では、ステップS2→S3→S4→S5→S6→S2→というループにより、ゼロランカウンタ部52がカウントアップを続けることになるが、出力部54からの出力は「0以外」のデータが読み出されるまで(すなわち、ステップS5において、先頭ゼロフラグ=1と判定されるまで)は生じないので、カウント値は16を超えても増え続けることになる。
そこで、ステップS5からステップS7へと分岐したときに、ステップS9による通常の出力指示処理を行う前に、ステップS8において、16個分の「0」の情報を中間的に出力し、ゼロランカウンタ部52のカウント値が16未満となるようにしてからステップS9へと進み、通常の出力指示処理が実行されるようにしているのである。
すなわち、制御部51は、ステップS9の出力指示処理を実行する前に、ステップS7において、ゼロランカウンタ部52に累積されているゼロランレングス値が、所定の許容値M(この例の場合、M=16)以上になっているか否かを判定し、M以上になっていた場合には、ステップS9の出力指示処理を実行する前に、ステップS8における中間出力指示処理を実行することになる。具体的には、この中間出力指示処理では、制御部51から出力部54に対して、中間出力イネーブル指示を与えるとともに、ゼロランカウンタ部52に対して中間出力補正指示を与える処理が行われる。
出力部54は、このような中間出力イネーブル指示が与えられると、0を示すデータと(M−1)個の0が連続することを示すゼロランレングス値とを組にして出力する中間出力処理を実行する。ここに示す例では、M=16であるので、中間出力イネーブル指示を受けた出力部54は、上述したとおり、0を示すデータと15個の0が連続することを示すゼロランレングス値とを組にして出力することになり(このとき、「ブロック継続状態」を示す反転EOBフラグも併せて出力される。)、合計16個の「0」が連続するという情報がランレングスバッファ部60へ書き込まれることになる。
一方、制御部51から中間出力補正指示が与えられたゼロランカウンタ部52は、保持しているゼロランレングス値を許容値Mだけ減少させる補正処理を行う。ここに示す例では、M=16であるので、中間出力補正指示を受けたゼロランカウンタ部52は、カウント値を16だけ減少させる補正処理を行うことになる。
図11の流れ図に示すとおり、ステップS8が完了した後、再びステップS7へと戻ることになるので、ステップS8の中間出力指示処理は、ゼロランカウンタ部52に累積されているゼロランレングス値が、許容値M未満になるまで繰り返し実行されることになる。
たとえば、ステップS5からステップS7へ進んだ時点で、ゼロランカウンタ部52に累積されているゼロランレングス値が36であった場合は、まず、ステップS8における第1回目の中間出力指示処理により、出力部54から合計16個の「0」が連続するという情報が出力され、中間出力補正指示により、累積されているゼロランレングス値は20に補正される。続いて、再びステップS7を経てステップS8へと進み、第2回目の中間出力指示処理により、出力部54から合計16個の「0」が連続するという情報が出力され、中間出力補正指示により、累積されているゼロランレングス値は4に補正される。かくして、ステップS9による通常の出力指示処理では、データとともに、補正後のゼロランレングス値4が出力されることになる。
最後に、ステップS3において、EOBフラグが「0」と判定された場合、すなわち「ブロック終了状態」を示すEOBフラグが読み込まれた場合の処理を説明する。この場合、ステップS2で読み込んだデータは必ず「0」であり、しかも後続するデータもすべて「0」であることになる。そこで、ステップS3からステップS11へと進み、出力部54に対して、出力イネーブル指示を与える処理が行われる。このとき、ステップS2で読み込んだデータおよびEOBフラグも出力イネーブル指示とともに出力部54に与えられる。
この場合に、出力部54が行う出力処理は、ステップS9において出力イネーブル指示が与えられた場合と全く同じ処理である。すなわち、制御部51から与えられたデータ(この場合、「0」)と、その時点でゼロランカウンタ部52が保持していたゼロランレングス値と、制御部51から与えられたEOBフラグ(この場合、「0」)を反転させた反転EOBフラグ(すなわち、「1」)と、を組にして、ランレングスバッファ書き込み信号とともに、ランレングスバッファ部60へと出力する処理が行われる。
こうして、ステップS11の処理が完了したら、ブロック処理はそこで中止される。この場合、データ順序列Q′に、まだ読み出されていないデータが残っていたとしても、これらの残存データはいずれもデータ「0」であるから、読出処理を省略しても問題は生じない。
また、これら残存するデータ「0」の中には、ゼロランレングスとしてまだカウントされていないデータが含まれている可能性もあるが、反転EOBフラグとして、論理値「1」を示すフラグが出力されているため、処理対象となるブロック画素配列に関するデータは、この論理値「1」を示す反転EOBフラグが出力された時点で終了し、これ以降に後続するデータは、次のブロック画素配列に関するデータであることが認識可能であるので、ハフマン符号化部70で行われるハフマン符号化処理には何ら支障は生じない。
<<< §6. ランレングス処理の具体的な実例 >>>
ここでは、図10に示すランレングス処理部50を用いた実施形態において、制御部51が図11の流れ図に示す処理を実行した場合に、どのようなランレングス処理が行われるかを、具体的な実例に即して説明する。
いま、図10に示す順序列バッファ部40内に、図13に例示するようなデータ順序列Q′、ゼロフラグ順序列Z′、EOBフラグ順序列E′が格納されていたものとしよう。これらの各順序列Q′,Z′,E′の内容は、図7の下段に示したものと同じものである。一方、図14は、図10に示す順序列バッファ部40内に図13に例示するような各順序列Q′,Z′,E′が格納されているという前提において、図10に示すランレングス処理部50によって実行される処理プロセスを示すチャートである。
この図14に示すチャートにおいて、「サイクル」欄に記載された1〜31の数字は、ランレングス処理部50の処理サイクルを示す番号である。ランレングス処理部50は、1サイクルの間に、順序列バッファ部40からデータやフラグを読み出す入力処理と、ランレングスバッファ60に対してデータやフラグを書き出す出力処理と、を実行することができる。なお、「サイクル」欄に記載された黒い星印は、当該サイクルが、読み飛ばし後のサイクルであることを示している。
一方、このチャートの「入力」欄には、各サイクルにおいて、順序列バッファ部40から入力されるデータ、単位ゼロフラグ群、EOBフラグの内容(具体的な数値)が記載されており、「出力」欄には、各サイクルにおいて、ランレングスバッファ60に対して出力されるデータ、ゼロランレングス値、反転EOBフラグの内容(具体的な数値)が記載されている。また、「次のシフト量」欄には、各サイクルにおいて、順序列バッファ部40に対して与えられるシフト量の内容(具体的な数値)が記載されている。順序列バッファ部40は、次のサイクルの入力が行われるまでに、当該シフト量に応じたシフト処理を実行することになる。
それでは、図13に例示した各順序列Q′,Z′,E′と、図11の流れ図と、図14に示すチャートを参照しながら、ランレングス処理部50の処理プロセスをサイクルごとに順に説明していこう。なお、ここに示す実例は、JPEG形式の画像符号化を行うプロセスであり、処理対象となるブロック画素配列の画素数n=64、単位ゼロフラグ群のフラグ数m=8、ゼロランレングスの許容値M=16(1個のデータ「0」+ランレングス値15)の例である。はじめに、図11の流れ図のステップS1において、ゼロランカウンタ部52およびデータカウンタ部53のカウント値が初期値0に設定され、一連のブロック処理が開始される。
まず、第1サイクルにおいて、ステップS2の読込処理が実行され、図13に示すデータ順序列Q′の第1セル内のデータ「−3」と、ゼロフラグ順序列Z′の第1〜第8セル内のフラグからなる単位ゼロフラグ群「10111101」と、EOBフラグ順序列E′の第1セル内のフラグ「1」と、が読み込まれる。これらの数値は、図14のチャートの第1サイクルの「入力」欄に記載されているとおりである。
続くステップS3の判定では、EOBフラグ=1であるため、ステップS4へと進み、シフト量、データカウントアップ量、ゼロカウントアップ量の算出が行われる。図12の表によれば、今回読み込まれた単位ゼロフラグ群「10111101」は、1行目のバリエーション「1XXXXXXX」に対応するので、連続数=0となり、シフト量=1、データカウントアップ量=1、ゼロカウントアップ量=0なる算出が行われる。
次のステップS5の判定では、読み込まれた単位ゼロフラグ群の先頭ゼロフラグは「1」であるため、ステップS7の判定を経て、S9の出力処理が行われることになる。すなわち、出力部54から、データ「−3」と、ゼロランレングス値「0」と、反転EOBフラグ「0」とが出力される。これらの数値は、図14のチャートの第1サイクルの「出力」欄に記載されているとおりである。また、このとき、ゼロカウントクリア指示およびデータカウントアップ指示が与えられるため、ゼロランカウンタ部52のカウント値は初期値0にクリアされ、データカウンタ部53のカウント値は、データカウントアップ量1だけ増加して1になる。
このとき、順序列バッファ部40に対しては、シフト量=1を指定したシフト指示が与えられるので、順序列バッファ部40によるシフト処理により、図13に示す各順序列Q′,Z′,E′のセルの内容が、1つずつ繰り上げられる。すなわち、各順序列Q′,Z′,E′の第1セル内の数値は押し出されて廃棄され、第2セル内の数値が第1セルに移動し、第3セル内の数値が第2セルに移動し、... 、第64セル内の数値が第63セルに移動する。第64セルは、概念的には空白になるが、実際には、ダミーデータもしくはダミーフラグによって補填される。前述したとおり、ゼロフラグ順序列Z′内には、ダミーフラグとして論理値「1」を示すフラグが補填される。
このように、ここに示す実施形態の場合、順序列バッファ部40に格納されている各順序列Q′,Z′,E′内のデータやフラグは、シフト指示によってシフトされ、ステップS2の読込処理は、常に、順序列の先頭から行われることになるが、ここでは、便宜上、図13に示す各順序列Q′,Z′,E′内のデータやフラグはそのままの状態とし、ステップS2の読込処理を行う際に、読込先のセルをシフト量だけ後方に移動させたものとして、説明を行うことにする。
したがって、第2サイクルでは、ステップS2の読込処理により、図13に示すデータ順序列Q′の第2セル内のデータ「0」と、ゼロフラグ順序列Z′の第2〜第9セル内のフラグからなる単位ゼロフラグ群「01111011」と、EOBフラグ順序列E′の第2セル内のフラグ「1」と、が読み込まれる。これらの数値は、図14のチャートの第2サイクルの「入力」欄に記載されているとおりである。
続くステップS3の判定では、EOBフラグ=1であるため、ステップS4へと進み、シフト量、データカウントアップ量、ゼロカウントアップ量の算出が行われる。図12の表によれば、今回読み込まれた単位ゼロフラグ群「01111011」は、2行目のバリエーション「01XXXXXX」に対応するので、連続数=1となり、シフト量=1、データカウントアップ量=1、ゼロカウントアップ量=1なる算出が行われる。
次のステップS5の判定では、読み込まれた単位ゼロフラグ群の先頭ゼロフラグは「0」であるため、ステップS6の処理が行われる。すなわち、ゼロカウンタ部52のカウンタ値(ゼロランレングス値)は、ゼロカウントアップ量1だけ増加して1になり、データカウンタ部53のカウント値は、データカウントアップ量1だけ増加して2になる。なお、ステップS6の処理では、出力は行われないため、図14のチャートの第2サイクルの「出力」欄は空欄になっている。
このとき、順序列バッファ部40に対しては、シフト量=1を指定したシフト指示が与えられるので、順序列バッファ部40によるシフト処理により、図13に示す各順序列Q′,Z′,E′のセルの内容が、1つずつ前方にシフトする。
次の第3サイクルの処理は、第1サイクルの処理と同様である。すなわち、図13に示すデータ順序列Q′の第3セル内のデータ「−4」と、ゼロフラグ順序列Z′の第3〜第10セル内のフラグからなる単位ゼロフラグ群「11110111」と、EOBフラグ順序列E′の第3セル内のフラグ「1」と、が読み込まれる。これらの数値は、図14のチャートの第3サイクルの「入力」欄に記載されているとおりである。
続くステップS3の判定では、EOBフラグ=1であるため、ステップS4へと進み、連続数=0、シフト量=1、データカウントアップ量=1、ゼロカウントアップ量=0なる算出が行われる。そして、ステップS5,S7の判定を経てS9の出力処理が行われる。すなわち、出力部54から、データ「−4」と、ゼロランレングス値「1」と、反転EOBフラグ「0」とが出力される。これらの数値は、図14のチャートの第3サイクルの「出力」欄に記載されているとおりである。
また、このとき、ゼロカウントクリア指示およびデータカウントアップ指示が与えられるため、ゼロランカウンタ部52のカウント値は初期値0にクリアされ、データカウンタ部53のカウント値は、データカウントアップ量1だけ増加して3になる。一方、順序列バッファ部40に対しては、シフト量=1を指定したシフト指示が与えられるので、各順序列Q′,Z′,E′のセルの内容が、1つずつ繰り上げられる。
以下、第4サイクル〜第6サイクルも、第3サイクルと同様に出力処理が行われることになり、第7サイクルでは、データ「0」がゼロランレングスとしてカウントアップされる。続く第8サイクル〜第10サイクルも、第3サイクルと同様に出力処理が行われることになり、第11サイクルでは、データ「0」がゼロランレングスとしてカウントアップされる。更に、第12サイクル〜第14サイクルも、第3サイクルと同様に出力処理が行われることになる。
この第14サイクルまでは、単位ゼロフラグ群の先頭フラグが「0」であっても、次のフラグが「1」であったため、連続数は1止まりである。ところが、第15サイクルでは、連続数が5になるため、サイクルの読み飛ばしが生じることになる。
すなわち、第15サイクルでは、図13に示すデータ順序列Q′の第15セル内のデータ「0」と、ゼロフラグ順序列Z′の第15〜第22セル内のフラグからなる単位ゼロフラグ群「00000100」と、EOBフラグ順序列E′の第15セル内のフラグ「1」と、が読み込まれる。これらの数値は、図14のチャートの第15サイクルの「入力」欄に記載されているとおりである。
続くステップS3の判定では、EOBフラグ=1であるため、ステップS4へと進み、シフト量、データカウントアップ量、ゼロカウントアップ量の算出が行われる。図12の表によれば、今回読み込まれた単位ゼロフラグ群「00000100」は、6行目のバリエーション「000001XX」に対応するので、連続数=5となり、シフト量=5、データカウントアップ量=5、ゼロカウントアップ量=5なる算出が行われる。
なお、図13のゼロフラグ順序列Z′の第15〜第19セル内の数値「00000」を囲う太線枠は、これら5個の連続するゼロフラグ「00000」が、単位ゼロフラグ群の先頭から連続して現れる「0」として認識されることを示し、この太線枠の左端上部に記述された[5]なる記号は、認識される連続数が5であることを示している。別言すれば、図13のゼロフラグ順序列Z′に記載されている太線枠は、0が2個以上並んで出現する箇所を示しており、[x]の形式で記述されている数値は、0の連続数を示している。
次のステップS5の判定では、読み込まれた単位ゼロフラグ群の先頭ゼロフラグは「0」であるため、ステップS6の処理が行われる。すなわち、ゼロカウンタ部52のカウンタ値(ゼロランレングス値)は、ゼロカウントアップ量5だけ増加して5になり、データカウンタ部53のカウント値は、データカウントアップ量5だけ増加して19になる。なお、ステップS6の処理では、出力は行われないため、図14のチャートの第15サイクルの「出力」欄は空欄になっている。
このとき、順序列バッファ部40に対しては、シフト量=5を指定したシフト指示が与えられるので、順序列バッファ部40によるシフト処理により、図13に示す各順序列Q′,Z′,E′のセルの内容が、5つずつ前方にシフトする。このため、図示されている第15セル内の数値だけでなく、第16セル、第17セル、第18セル、第19セル内の数値もシフトにより押し出されて廃棄される。すなわち、第16〜第19セル内の数値は読み飛ばされてしまい、第20セル内の数値が先頭位置にシフトされることになる。
次の第16サイクルの処理は、サイクル番号に星印が付されているように、読み飛ばし後のサイクルである。すなわち、第16サイクルの処理で読み込まれる数値は、各順序列Q′,Z′,E′の第16セル内の数値ではなく、第20セル内の数値ということになる。このため、図13に示すデータ順序列Q′の第20セル内のデータ「−2」と、ゼロフラグ順序列Z′の第20〜第27セル内のフラグからなる単位ゼロフラグ群「10001110」と、EOBフラグ順序列E′の第1セル内のフラグ「1」と、が読み込まれる。これらの数値は、図14のチャートの第16サイクルの「入力」欄に記載されているとおりである。
続くステップS3の判定では、EOBフラグ=1であるため、ステップS4へと進み、連続数=0、シフト量=1、データカウントアップ量=1、ゼロカウントアップ量=0なる算出が行われる。そして、ステップS5,S7の判定を経てS9の出力処理が行われる。すなわち、出力部54から、データ「−2」と、ゼロランレングス値「5」と、反転EOBフラグ「0」とが出力される。これらの数値は、図14のチャートの第16サイクルの「出力」欄に記載されているとおりである。
また、このとき、ゼロカウントクリア指示およびデータカウントアップ指示が与えられるため、ゼロランカウンタ部52のカウント値は初期値0にクリアされ、データカウンタ部53のカウント値は、データカウントアップ量1だけ増加して20になる。一方、順序列バッファ部40に対しては、シフト量=1を指定したシフト指示が与えられるので、各順序列Q′,Z′,E′のセルの内容が、1つずつ繰り上げられる。
第17サイクル以降の処理も、これまで述べてきた処理と同様のプロセスが実行されることになるので、個別の説明は省略するが、図14のチャートにおいて、サイクル番号に星印が付されたサイクルの直前には、それぞれ読み飛ばしが行われることになる。別言すれば、「次のシフト量」欄の数字が2以上になっている場合、その次のサイクルの直前に読み飛ばしが行われることになり、「次のシフト量」欄の数字から1を減じた数に相当するデータが、読み出されずに廃棄されることになる。
このような読み飛ばしの対象となるセルは、図13のゼロフラグ順序列に描かれた太線枠によっても示されている。すなわち、この太線枠の先頭にあるセルの位置に対応するデータに対しては読み込みが行われるが、それに後続する太線枠内のセルの位置に対応するデータは読み飛ばされることになる。別言すれば、太線枠内の複数個のセルに対しては、先頭のセルに対応するデータが代表として1回だけ読み込まれ、これに後続する太線枠内のセルに対応するデータについては、読み込みが省略されることになる。各太線枠の左端上部に記述された[5]等の記号に示された数字は、連続数すなわちシフト量を示しており、当該シフト量に応じたシフト処理が行われるため、次回の読み込みは、太線枠が終了した次のセルから行われることになる。
なお、図14のチャートを見ればわかるとおり、この例に示すブロック処理は、第31サイクルで終了している。すなわち、第31サイクルでは、ステップS2において、図13に示すデータ順序列Q′の第48セル内のデータ「0」と、ゼロフラグ順序列Z′の第48〜第55セル内のフラグからなる単位ゼロフラグ群「00000000」と、EOBフラグ順序列E′の第48セル内のフラグ「0」と、が読み込まれる。これらの数値は、図14のチャートの第31サイクルの「入力」欄に記載されているとおりである。
続くステップS3の判定では、EOBフラグ=0であるため、ステップS11へと進み、出力部54から、データ「0」と、ゼロランレングス値「0」と、反転EOBフラグ「1」とが、「ブロック最終出力」として出力される。これらの数値は、図14のチャートの第31サイクルの「出力」欄に記載されているとおりである。
かくして、処理対象となるブロック画素配列に関するブロック処理は、全31サイクルで完了する。従来の方法であれば、全64サイクルの処理時間が必要であるので、大幅な時間短縮が図られていることになる。全31サイクルのうち、21サイクルにおいて出力処理が行われており、ランレングスバッファ部60には、合計21組の出力情報、すなわち、11ビットのデータ、ゼロランレングス値(0〜15の範囲内の数値を示す4ビットデータ)、反転EOBフラグ(1ビットのフラグ)という組合わせを21組並べた情報が書き込まれることになる。
こうして、ランレングスバッファ部60に書き込まれた21組の出力情報は、図3(c) に示すランレングス処理データRと同等の情報になる。すなわち、図14に示すチャートの「出力」欄に示されているデータの数値をD、ゼロランレングスの数値をLとして、個々のサイクルごとに、(0×L),「D」の順に配置して並べ、(0×0)の項を省略して記述すれば、第1サイクルの出力は「−3」、第2サイクルの出力はなし、第3サイクルの出力は(0×1),「−4」、第4サイクルの出力は「−2」、第5サイクルの出力は「3」、第6サイクルの出力は「8」、第7サイクルの出力はなし、第8サイクルの出力は(0×1),「−4」、... となるので、これらを並べてゆくと、「−3」,(0×1),「−4」,「−2」,「3」,「8」,(0×1),「−4」,... となり、図3(c) に示すランレングス処理データRと同等の情報になる。
なお、図3(c) に示すランレングス処理データRの最後の情報は(0×17)になっているが、当該情報は、図14のチャートの第31サイクルにおける反転EOBフラグ「1」に対応する情報ということになる。すなわち、第30サイクルまでの出力情報により、47個のデータが符号化されていることが認識でき、第31サイクルにおける反転EOBフラグ「1」により、以後のデータがすべて「0」であることが示されているので、ブロック内のデータ総数nがn=64であることを鑑みれば、64−47=17なる演算により、最後の情報として(0×17)を得ることができる。
以上の説明により、§4,§5で述べた具体的な画像符号化装置によるランレングス処理が、正しく機能していることが理解できよう。
<<< §7. 本発明の変形例 >>>
これまで、本発明に係る画像符号化装置を、その基本的な実施形態について述べてきたが、ここでは、この基本的な実施形態のいくつかの変形例を述べておくことにする。
(1) ランレングス処理の並列化
既に述べたとおり、従来の画像符号化装置では、ゼロランレングス処理がボトルネックとなり、符号化処理全体の高速化を阻む原因になっていた。本発明では、ゼロランレングスの検出を行う前に、予め、量子化データ配列内の各データについて零か否かを示すゼロフラグを作成しておき、このゼロフラグを参照することにより、まだ読み出していないデータについてのランレングス処理を先行して行うようにしている。このため、一部のデータについては読み飛ばしを行って、ランレングス処理のサイクル数を低減することができるので、符号化処理全体の高速化を図ることができるようになる。
符号化処理全体を更に高速化するには、ランレングス処理を並列化すればよい。図11に示す流れ図はブロック処理、すなわち、1つのブロックに関してのランレングス処理の手順を示すものであるが、実際には、前処理部11からは、複数のブロック画素配列Bが順番に出力され、個々のブロックに関して、これまで述べた処理が順番に実行されることになる。そこで、ランレングス処理に必要な構成部分を並列化すれば、複数のブロックに関するランレングス処理を並行して同時に実行することができるようになり、符号化処理全体を更に高速化することが可能になる。
図15は、このような考え方に基づいて、ランレングス処理を並行して実行できる構成を採用した変形例を示すブロック図である。この変形例は、図4に示す基本的な実施形態の一部を並列化したものであり、全体的な構成は、図4に示す基本的な実施形態と変わりはない。
すなわち、前処理部11、DCT処理部12、量子化処理部13、量子化バッファ部20、ゼロフラグ生成部25については、図4に示す符号化装置の対応する構成要素と全く同じである。また、順序列生成部30については、出力を複数の順序列バッファ部に分岐させる点を除いて、図4に示す順序列生成部30と同じものであり、ハフマン符号化部70については、入力を複数のランレングスバッファ部から行う点を除いて図4に示すハフマン符号化部70と同じものである。
この図15に示す変形例の大きな特徴は、図4に示す符号化装置における順序列バッファ部40、ランレングス処理部50、ランレングスバッファ部60をそれぞれ複数K組並列させて設けた点である。なお、図示の例は、K=2として、それぞれ2組ずつ並列させて設けているが、もちろん、Kを3以上に設定して、より多数の組を並列させて設けるようにしてもかまわない。
図15に示す変形例の場合、2組の順序列バッファ部40A,40B、2組のランレングス処理部50A,50B、2組のランレングスバッファ部60A,60Bが、それぞれ並列して設けられている。ここで、順序列バッファ部40A,40Bは、図4に示す順序列バッファ部40と全く同一の機能をもった構成要素であり、ランレングス処理部50A,50Bは、図4に示すランレングス処理部50と全く同一の機能をもった構成要素であり、ランレングスバッファ部60A,60Bは、図4に示すランレングスバッファ部60と全く同一の機能をもった構成要素である。
この変形例の場合、順序列生成部30は、生成した順序列を格納する際に、処理対象となるブロック画素配列ごとにK組の順序列バッファ部を切り替えて格納する機能を有している。図示するK=2の例では、順序列生成部30は、ブロック単位で各順序列を生成したら、その格納先として、第1の順序列バッファ部40Aと第2の順序列バッファ部40Bとを交互に選択するようにすればよい。たとえば、奇数番目のブロックに関する順序列は第1の順序列バッファ部40Aに格納し、偶数番目のブロックに関する順序列は第2の順序列バッファ部40Bに格納する、というような切替動作が行われることになる。
ここで、第k番目(k=1〜K)の順序列バッファ部に格納されている順序列に対して、第k番目のランレングス処理部による処理が行われ、第k番目のランレングス処理部からの出力が第k番目のランレングスバッファ部に格納される、という点に関しては、これまで述べてきた基本的な実施形態と全く同様であるので、順序列生成部30によって生成された個々のブロック単位の順序列に対して、合計K系統のランレングス処理が並行して行われることになる。たとえば、図示のようにK=2の例では、奇数番目のブロックに関するランレングス処理は、第1の順序列バッファ部40A、第1のランレングス処理部50A、第1のランレングスバッファ部60Aという第1の系統で実行され、偶数番目のブロックに関するランレングス処理は、第2の順序列バッファ部40B、第2のランレングス処理部50B、第2のランレングスバッファ部60Bという第2の系統で実行される。
一方、ハフマン符号化部70は、K組のランレングスバッファ部に格納されている情報を順に読み出しながらハフマン符号化処理を行えばよい。図示のようにK=2の例では、第1のランレングスバッファ部60Aに格納されている1ブロック分のランレングス処理データと第2のランレングスバッファ部60Bに格納されている1ブロック分のランレングス処理データとを交互に読み出して連結し、ハフマン符号化処理を行えばよい。
こうして、処理のボトルネックとなっていたランレングス処理を実行する部分を複数の系統に分けて並列処理させれば、符号化処理全体の処理速度を大幅に向上させることができる。
図16は、図15に示す変形例における処理動作を示すタイミングチャートであり、横軸は左から右へ流れる時間軸を示している。ここで、「block1」,「block2」,「block3」,... と記述された矩形は、8行8列の行列からなる単位ブロックについての処理を表している。まず、前処理部11では、原画像をブロック画素配列Bに分割して、これを順次出力する処理が行われ、これに後続するDCT処理部12および量子化処理部13では、それぞれDCT処理および量子化処理が実行される。
ここでは、前処理部11、DCT処理部12、量子化処理部13の各スループットを、3データ/1サイクルとした場合を前提として、サイクル数を表記してある。1ブロックのデータ数は64個であるから、64/3=約22となり、前処理、DCT処理、量子化処理は、いずれも約22サイクル必要な処理になるが、DCT処理および量子化処理は、64個のデータがすべて揃わなくても実行可能であるため、図示のとおり、同一のブロックに対する前処理、DCT処理、量子化処理は、時間軸上では部分的に重複して実施することができる。
一方、順序列生成部30では、全64個のデータをジグザク順に並び替えて順序列を生成する処理を行う必要があるため、全64個のデータが揃ってから、処理を開始する必要がある。もっとも、§2で述べたとおり、順序列生成部30は、単なる配線や論理和演算回路によって構成することができるので、図示の例では、1サイクルで、全64個のデータの並び替えが行われ、各順序列が生成されている。このように、ランレングス処理の前に、予め、ゼロフラグ順序列Z′およびEOBフラグ順序列E′を用意しておく構成を採ったとしても、それが原因で生じる処理時間の遅延は無視しうる程度である。
こうして生成された各順序列に対して、ランレングス処理が行われることになるが、図15に示す変形例の場合、第1のランレングス処理部50Aと第2のランレングス処理部50Bによる並列処理が可能である。そこで、図16に示すタイミングチャートでは、まず、第1のランレングス処理部50Aにより「block1」に対するランレングス処理を実行し、続いて、第2のランレングス処理部50Bにより「block2」に対するランレングス処理を実行し、... というように、交互にランレングス処理を実行している。
個々のブロックに対するランレングス処理に必要なサイクル数は、当該ブロック内のデータ値によって様々であるが、ここでは便宜上、図14に例示した実例のケースを代表例として採用し、いずれのブロックについても31サイクルを要するという仮定でチャートを作成してある。従来の方法では、64サイクルを要していたので、大幅な時間短縮が図られている。なお、順序列バッファ部40で行われるシフト処理は、たとえば「バレルシフタ」等の仕組を利用することにより、シフト量にかかわらず1サイクルの時間で完了するため、図16のタイミングチャートには現われてこない。
ハフマン符号化部70は、ランレングス処理が完了したデータに対して順次ハフマン符号化処理を行うことになるが、第1のランレングス処理部50Aによる処理結果と、第2のランレングス処理部50Bによる処理結果とを交互に入力しながら処理を進めることができる。このように、ランレングス処理を並列化する変形例を採用すれば、処理速度を大幅に向上させることが可能になる。
(2) EOBフラグを省略した簡略型の実施形態
図4に示す基本的な実施形態では、順序列生成部30内にEOBフラグ順序列生成部33を設け、EOBフラグ順序列E′を生成し、ランレングス処理部50が、このEOBフラグ順序列E′を参照することにより、処理を途中で中止し、必要なサイクル数の低減を図っていた。図13に示す実例の場合、EOBフラグは、第48番目のセルにおいて、ブロック継続状態「1」からブロック終了状態「0」に転じているため、それ以降のセルに関する処理を省略することができる。
このように、EOBフラグを利用すると、後半部分のセルに関する処理を省略することができるので、実用上は、これまで述べてきた実施形態どおり、EOBフラグを利用したランレングス処理を行うのが好ましい。
ただ、このEOBフラグを利用して途中で処理を中止するという原理と、複数m個のゼロフラグからなる単位ゼロフラグ群を読み込んで、まだ読み出していないデータについてのランレングス処理を先行して行うようにし、一部のデータについては読み飛ばしを行う、という原理とは、直接的に関係するものではないので、前者の原理を採用せず、後者の原理のみを採用する、という変形例も可能である。
このような変形例では、順序列バッファ部40内にEOBフラグ順序列E′を用意する必要はないので、EOBフラグ順序列生成部33を省略することができる。また、ランレングス処理部50についても、EOBフラグに関連する処理を省略することができる。
(3) 中間出力処理を省略した簡略型の実施形態
図11の流れ図において、ステップS8で中間出力処理を行う理由は、前述したとおり、JPEG等の規格によってゼロランレングス値に上限が定められている場合にも柔軟に対処できるようにするためである。別言すれば、本発明の原理上は、必ずしもこの中間出力処理を行う必要はない。
もちろん、ゼロランレングス値に上限が全くないと、ハードウエア構成上、問題が生じることになるが、8行8列のデータからなるブロックごとの処理で生じるゼロランレングス値は、最大でも64であるので、ステップS8の中間出力処理を行わなくても、ブロック処理終了時にゼロランレングスの出力を行うようにすれば、出力されるゼロランレングス値は所定範囲内に抑えられる。したがって、符号化の規格等によりゼロランレングス値に特別な上限が設けられていない場合には、ステップS8の中間出力処理を省略してもかまわない。この場合、ステップS7の判定処理も不要になり、中間出力イネーブル指示や中間出力補正指示を行うための機能を省略することができる。
(4) データカウンタ部を省略した簡略型の実施形態
§1で説明したとおり、ブロック画素配列Bに対して、DCT処理および量子化処理を施すことにより得られる量子化データ配列Qの右下隅付近には、通常、データ「0」が集まることになる。したがって、これに対してジグザグの並び順で並べ替えを行ったデータ順序列Q′の末尾付近にはデータ「0」が集まることになり、通常は、末尾付近のデータやフラグを読み出すうちに、やがて論理値「0」をもったEOBフラグ(「ブロック終了状態」を示すEOBフラグ)が読み出され、図11の流れ図において、ステップS3からステップS11へと分岐することになる。
すなわち、比較的低い空間周波数成分しか含んでいない画像を符号化対象とする場合には、データ順序列Q′の後半部分には多数のデータ「0」が集まることになるので、ステップS10において、データカウント値が最終値n(この例の場合、n=64)に達する前に、EOBフラグが「ブロック終了状態」を示すことになり、ステップS3からステップS11へと分岐してしまうことになる。
したがって、比較的低い空間周波数成分しか含んでいない画像を符号化対象とするケースでは、図10に示すデータカウンタ部53を省略し、図11の流れ図において、ステップS10を省略して、ステップS9から常にステップS2へと進むようにしてもかまわない。この場合、もちろん、データカウンタ部53に対する入出力も省略することになる。
<<< §8. 画像符号化方法としての把握 >>>
これまで、本発明を画像符号化装置として捉え、その構成および動作を説明したが、ここでは、本発明を画像符号化方法として捉え、その処理手順を説明する。
本発明に係る画像符号化方法は、所定の画素値をもったn個の画素をI行J列に並べることによって構成されるブロック画素配列を有する二次元画像を符号化する画像符号化方法であり、その基本手順は、DCT処理段階、量子化処理段階、ゼロフラグ生成段階、データ順序列生成段階、ゼロフラグ順序列生成段階、ランレングス処理段階によって構成される。これらの各段階は、たとえば、半導体集積回路上に形成された回路素子によって実行される。
DCT処理段階では、処理対象となるブロック画素配列に対して、離散コサイン変換を行い、得られたn個のDCT係数をI行J列に並べてなるDCT係数配列を生成する処理が行われ、量子化処理段階では、DCT係数配列に対して、所定の量子化テーブルを用いた量子化処理を行い、得られたn個の量子化データをI行J列に並べてなる量子化データ配列を生成する処理が行われる。
ゼロフラグ生成段階では、この量子化データ配列を構成するn個の量子化データのそれぞれについて、「0である」場合には「零状態」、「0でない」場合には「非零状態」を示すゼロフラグを生成し、生成したゼロフラグを量子化データ配列に対応するI行J列の配列に収容することによりゼロフラグ配列を生成する処理が行われる。
データ順序列生成段階では、量子化データ配列について、空間周波数分布に応じた所定の並び順を定め、量子化データ配列内のn個のデータをこの並び順に応じて並べることによりデータ順序列を生成して格納する処理が行われ、ゼロフラグ順序列生成段階では、ゼロフラグ配列内のn個のゼロフラグを上記並び順に応じて並べることによりゼロフラグ順序列を生成して格納する処理が行われる。
そして、ランレングス処理段階では、データ順序列の第i番目のデータと、ゼロフラグ順序列の第i番目〜第(i+m−1)番目までの複数m個のゼロフラグ(但し、i>n−m+1の場合は、第i番目〜第n番目までのゼロフラグ)からなる単位ゼロフラグ群と、を読み出す処理を、パラメータiを1から所定ステップ数ずつ順次増加させながら繰り返し実行し、読み出した単位ゼロフラグ群を参照することによりデータ順序列内において0が連続して出現する数を示すゼロランレングス値をカウントし、読み出したデータ順序列内のデータおよびカウントしたゼロランレングス値を出力する処理が行われる。このとき、カウントしたゼロランレングス値に応じた数だけデータを読み飛ばすことができるように、上記所定ステップ数の設定が行われる。
なお、ランレングス処理段階では、読み出した単位ゼロフラグ群について、先頭から現れる「零状態」のフラグの連続数を求める連続数算出処理を行い、この連続数が0の場合にはステップ数を1とし、連続数が1以上の場合には当該連続数をステップ数として、パラメータiをこのステップ数だけ増加させながら読出処理を繰り返し実行すればよい。また、読み出した単位ゼロフラグ群の先頭のゼロフラグが「零状態」のフラグであった場合には、連続数算出処理で求めた連続数を累積加算する処理を行い、読み出した単位ゼロフラグ群の先頭のゼロフラグが「非零状態」のフラグであった場合には、データ順序列から読み出したデータと現時点での連続数の累積値からなるゼロランレングス値とを組にして出力するとともに、累積値を初期値0に設定する処理を行うようにすればよい。
また、符号化の規格などにより、ランレングス値に上限が設けられているため、中間出力処理を行う必要がある場合には、ランレングス処理段階において、読み出した単位ゼロフラグ群の先頭のゼロフラグが「非零状態」のフラグであった場合に、連続数の累積値が所定の許容値M以上になっていたときには、0を示すデータと(M−1)個の0が連続することを示すゼロランレングス値とを組にして出力するとともに、累積値を許容値Mだけ減少させる中間出力処理を、累積値が許容値M未満になるまで繰り返し実行し、その後、データ順序列から読み出したデータと現時点での連続数の累積値からなるゼロランレングス値とを組にして出力するとともに、累積値を初期値0に設定する処理を行うようにすればよい。
一方、データの総数を計数して、ブロック処理の完了を認識する方法を採用する場合には、ランレングス処理段階において、データ順序列から読み出したもしくは読み飛ばしたデータの総数を計数する処理を行い、計数された総数が処理対象となるブロック画素配列に含まれる画素数nに達していた場合には、処理対象となるブロック画素配列に関する処理を完了すればよい。
また、EOBフラグを利用して、ブロック処理の中止を行い、より効率的な処理を行うようにすることもできる。この場合は、ゼロフラグ順序列を構成するn個のゼロフラグのそれぞれについて、自己を含めて後続するゼロフラグが、すべて「零状態」を示している場合には「ブロック終了状態」、そうでない場合には「ブロック継続状態」を示すEOBフラグを生成し、生成したn個のEOBフラグをゼロフラグ順序列の並び順に応じて並べたEOBフラグ順序列を生成して格納するEOBフラグ順序列生成段階を更に行うようにする。そして、ランレングス処理段階では、データ順序列の第i番目のデータおよび単位ゼロフラグ群を読み出す際に、EOBフラグ順序列の第i番目のEOBフラグも併せて読み出し、読み出したEOBフラグが「ブロック終了状態」を示している場合には、当該EOBフラグを出力して、処理対象となるブロック画素配列に関する以後の処理を中止すればよい。