(57)【特許請求の範囲】
【請求項１】
上位ビット側から同じビット値が所定数連続する可変長符号を保持する符号バッファと、
前記符号バッファから前記可変長符号を読み出して所定の符号語と一致するか否かを検出する複数の符号語検出器と、
前記複数の符号語検出器の検出結果に基づいて復号された符号語を決定する復号符号語決定部と、
前記複数の符号語検出器の各々において検出すべき前記所定の符号語とその符号長を符号長の昇順に構成情報として保持する構成情報保持部と
を具備し、
前記構成情報は、前記所定数連続するビット値については１ビットのみを保持し、前記符号長の少なくとも１つを他の符号長との差分として定義する可変長符号復号装置。
【請求項２】
前記構成情報は、前記複数の符号語検出器を複数のグループに分けて、前記所定数連続するビット値を前記グループ毎に１ビットずつ保持する請求項１記載の可変長符号復号装置。
【請求項３】
前記構成情報は、前記所定数連続するビット値に続く他の所定数のビット値を前記グループ毎に保持する請求項２記載の可変長符号復号装置。
【請求項４】
前記復号符号語決定部は、前記複数の符号語検出器に付与された優先順位に従って前記復号された符号語を決定する請求項１記載の可変長符号復号装置。
【請求項５】
前記復号符号語決定部は、前記複数の符号語検出器の何れにおいても前記所定の符号語と一致しなかった場合にはその旨を出力する請求項１記載の可変長符号復号装置。
【請求項６】
前記復号符号語決定部は、前記構成情報が異なる前記複数の符号語検出器により連続して検出結果が得られた際には、先に得られた検出結果において前記一致が検出されていない場合にのみ、後に得られた検出結果に基づいて復号された符号語を決定する請求項１記載の可変長符号復号装置。
【請求項７】
前記構成情報保持部は、前記複数の符号語検出器の各々に対応して前記所定の符号語が検出された際の処理の分岐の有無を記憶するとともに前記複数の符号語検出器の何れにおいても前記所定の符号語が検出されなかった際の処理の分岐の有無を記憶する条件コードビットマップをさらに保持する請求項１記載の可変長符号復号装置。
【請求項８】
上位ビット側から同じビット値が所定数連続する可変長符号を保持する符号バッファと、
前記符号バッファから前記可変長符号を読み出して所定の符号語と一致するか否かを検出する複数の符号語検出器と、
前記複数の符号語検出器の検出結果に基づいて復号された符号語を決定する復号符号語決定部と、
前記複数の符号語検出器の各々において検出すべき前記所定の符号語とその符号長を符号長の昇順に構成情報として保持する構成情報保持部と
を具備し、
前記構成情報において、他の符号長との差分として定義された前記符号長を復元し、前記所定数連続するビット値について保持された１ビットから前記符号長に応じて前記所定数連続するビット値を復元した後に、前記複数の符号語検出器に前記検出を行わせる命令を実行するコンピュータ。
【請求項９】
上位ビット側から同じビット値が所定数連続する可変長符号を保持する符号バッファと、前記符号バッファから前記可変長符号を読み出して所定の符号語と一致するか否かを検出する複数の符号語検出器と、前記複数の符号語検出器の検出結果に基づいて復号された符号語を決定する復号符号語決定部と、前記複数の符号語検出器の各々において検出すべき前記所定の符号語とその符号長を符号長の昇順に構成情報として保持する構成情報保持部とを具備するコンピュータにおいて、
前記構成情報において他の符号長との差分として定義された前記符号長を復元する手順と、
前記構成情報において前記所定数連続するビット値について保持された１ビットから前記符号長に応じて前記所定数連続するビット値を復元する手順と、
前記複数の符号語検出器に前記検出を行わせる手順と
をコンピュータに実行させるプログラム。
【請求項１０】
上位ビット側から同じビット値が所定数連続する可変長符号を保持する符号バッファと、前記符号バッファから前記可変長符号を読み出して所定の符号語と一致するか否かを検出する複数の符号語検出器と、前記複数の符号語検出器の検出結果に基づいて復号された符号語を決定する復号符号語決定部と、前記複数の符号語検出器の各々において検出すべき前記所定の符号語とその符号長を符号長の昇順に構成情報として保持する構成情報保持部とを具備する可変長符号復号装置における可変長符号の復号方法であって、
前記構成情報において他の符号長との差分として定義された前記符号長を復元する手順と、
前記構成情報において前記所定数連続するビット値について保持された１ビットから前記符号長に応じて前記所定数連続するビット値を復元する手順と、
前記複数の符号語検出器に前記検出を行わせる手順と
を具備する可変長符号の復号方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、符号の復号装置に関し、特に可変長符号の復号装置、および、その処理方法ならびに当該方法をコンピュータに実行させるプログラムに関する。
【背景技術】
【０００２】
圧縮を目的とした可変長符号は、ハフマン符号のように出現頻度の高い情報に対してより短い符号長の符号語を割り当てるように設計されている。多く出現する情報がより短い符号で表現でき、長い符号で表現されるデータの数が少なくなるため、平均すると元のデータより符号化後のデータが小さくなり、データ圧縮が実現される。このため、可変長符号は出現頻度の高い符号の復号時間を短く、出現頻度の低い符号の復号時間を長くかけて処理することにより、平均的な復号時間を短縮することができる。さらに、出現頻度の高い符号は短い符号長になるため、より少ないビット数で表現することができる。
【０００３】
可変長符号の復号装置は、符号表を組み合わせ回路で実現すると非常に小さく実現できる。しかし、組み合わせ回路で実現するためには、符号表が固定的に決まっている必要がある。これに対し、様々な符号表に後で対応するために、符号表をメモリに格納しておくものがある。符号表をメモリに格納する態様としては、符号値と符号長のペアを全て記憶するものが最も単純である。しかし、符号値と符号長の両方に固定長のビットを割り当てると、比較的多くの容量を必要とする上に、１つ１つを読み出して調べて探索をする必要がある。データを符号長などでソートしておくことにより探索時間を短縮することは可能であるが、数サイクルは必要である。より少ないサイクルで探索をするためには、連想メモリなどを用いることが考えられるが、回路面積が大きくなってしまうという問題がある。
【０００４】
符号値をメモリのオフセットアドレスに一致させて、メモリに符号語の符号長のみを格納する態様も考えられる。アドレスのビット数よりも短い符号長の符号値はＭＳＢ（Most Significant Bit）側に詰めて、下位ビットは関係なく全てその符号語を表すアドレスとして同じ符号長を冗長に記憶する。探索は符号値で瞬時に行えるのが利点であるが、最大符号長と同じだけのアドレスビットをもったメモリが必要になる。アドレスビットが長ければ長いほど冗長に持つデータ量が膨大になる。
【０００５】
そこで、符号表を全て記憶することなく、符号長ごとに、符号値の最大値およびそれに対応する復号情報へのオフセットアドレスを記憶する復号装置が提案されている（例えば、特許文献１参照。）。この従来技術では、符号長を記憶せずに、符号長をユニット番号またはアドレスとした場所に、符号長の最大値を格納している。そして、複数の符号長に対応する復号動作を同時に行うことにより、復号時間の短縮を図っている。
【特許文献１】特開平６−１０４７６９号公報（図１）
【発明の開示】
【発明が解決しようとする課題】
【０００６】
しかしながら、従来技術のような構成を採用した場合、並列に動作する各ユニットにおいてそれぞれ符号語を記憶するため、全体としての情報量が多くなってしまうという問題がある。
【０００７】
本発明はこのような状況に鑑みてなされたものであり、複数の符号語検出器を備える復号装置において、それぞれの符号語検出器の構成情報を圧縮するとともに、平均的な復号時間を短縮することを目的とする。
【課題を解決するための手段】
【０００８】
本発明は、上記課題を解決するためになされたものであり、その第１の側面は、上位ビット側から同じビット値が所定数連続する可変長符号を保持する符号バッファと、上記符号バッファから上記可変長符号を読み出して所定の符号語と一致するか否かを検出する複数の符号語検出器と、上記複数の符号語検出器の検出結果に基づいて復号された符号語を決定する復号符号語決定部と、上記複数の符号語検出器の各々において検出すべき上記所定の符号語とその符号長を符号長の昇順に構成情報として保持する構成情報保持部とを具備し、上記構成情報は、上記所定数連続するビット値については１ビットのみを保持し、上記符号長の少なくとも１つを他の符号長との差分として定義する可変長符号復号装置である。これにより、符号語検出器の構成情報を圧縮して構成情報保持部に保持させるという作用をもたらす。
【０００９】
また、この第１の側面において、上記構成情報は、上記複数の符号語検出器を複数のグループに分けて、上記所定数連続するビット値を上記グループ毎に１ビットずつ保持してもよい。これにより、符号語検出器の構成情報をさらに圧縮して構成情報保持部に保持させるという作用をもたらす。この場合において、上記構成情報は、上記所定数連続するビット値に続く他の所定数のビット値を上記グループ毎に保持してもよい。これにより、符号語検出器の構成情報をさらに圧縮して構成情報保持部に保持させるという作用をもたらす。
【００１０】
また、この第１の側面において、上記復号符号語決定部は、上記複数の符号語検出器に付与された優先順位に従って上記復号された符号語を決定してもよい。これにより、符号語検出器において、対応する符号語と他の符号語とが同じであるか、または、対応する符号語が他の符号語の接頭語になることを許容させるという作用をもたらす。
【００１１】
また、この第１の側面において、上記復号符号語決定部は、上記複数の符号語検出器の何れにおいても上記所定の符号語と一致しなかった場合にはその旨を出力してもよい。これにより、所定の符号語と一致しない場合の処理への移行を促すという作用をもたらす。
【００１２】
また、この第１の側面において、上記復号符号語決定部は、上記構成情報が異なる上記複数の符号語検出器により連続して検出結果が得られた際には、先に得られた検出結果において上記一致が検出されていない場合にのみ、後に得られた検出結果に基づいて復号された符号語を決定してもよい。これにより、カスケード機能を用いて復号処理を連続して起動した際に正しい検出結果に基づいて符号語を決定させるという作用をもたらす。
【００１３】
また、この第１の側面において、上記構成情報保持部は、上記複数の符号語検出器の各々に対応して上記所定の符号語が検出された際の処理の分岐の有無を記憶するとともに上記複数の符号語検出器の何れにおいても上記所定の符号語が検出されなかった際の処理の分岐の有無を記憶する条件コードビットマップをさらに保持してもよい。これにより、符号語検出器の検出結果に応じて処理の流れを分岐させるという作用をもたらす。
【００１４】
また、本発明の第２の側面は、上位ビット側から同じビット値が所定数連続する可変長符号を保持する符号バッファと、上記符号バッファから上記可変長符号を読み出して所定の符号語と一致するか否かを検出する複数の符号語検出器と、上記複数の符号語検出器の検出結果に基づいて復号された符号語を決定する復号符号語決定部と、上記複数の符号語検出器の各々において検出すべき上記所定の符号語とその符号長を符号長の昇順に構成情報として保持する構成情報保持部とを具備し、上記構成情報において、上記所定数連続するビット値について保持された１ビットから上記符号長に応じて上記所定数連続するビット値を復元し、他の符号長との差分として定義された上記符号長を復元した後に、上記複数の符号語検出器に上記検出を行わせる命令を実行するコンピュータである。これにより、符号語検出器の構成情報を圧縮して構成情報保持部に保持させて、機械語命令により復号処理を行わせるという作用をもたらす。
【００１５】
また、本発明の第３の側面は、上位ビット側から同じビット値が所定数連続する可変長符号を保持する符号バッファと、上記符号バッファから上記可変長符号を読み出して所定の符号語と一致するか否かを検出する複数の符号語検出器と、上記複数の符号語検出器の検出結果に基づいて復号された符号語を決定する復号符号語決定部と、上記複数の符号語検出器の各々において検出すべき上記所定の符号語とその符号長を符号長の昇順に構成情報として保持する構成情報保持部とを具備するコンピュータにおいて、上記構成情報において上記所定数連続するビット値について保持された１ビットから上記符号長に応じて上記所定数連続するビット値を復元する手順と、上記構成情報において他の符号長との差分として定義された上記符号長を復元する手順と、上記複数の符号語検出器に上記検出を行わせる手順とをコンピュータに実行させるプログラムまたはこれら手順を具備する可変長符号の復号方法である。これにより、符号語検出器の構成情報を圧縮して構成情報保持部に保持させるという作用をもたらす。
【発明の効果】
【００１６】
本発明によれば、複数の符号語検出器を備える復号装置において、それぞれの符号語検出器の構成情報を圧縮するとともに、平均的な復号時間を短縮することができるという優れた効果を奏し得る。
【発明を実施するための最良の形態】
【００１７】
次に本発明の実施の形態について図面を参照して詳細に説明する。
【００１８】
図１は、本発明の実施の形態における復号装置の一構成例を示す図である。この復号装置は、命令キャッシュ１１０と、プロセッサ１２０と、データキャッシュ１３０と、メモリ１４０と、ＤＭＡＣユニット１５０と、バス１６０とを備えている。命令キャッシュ１１０は、メモリ１４０における命令記憶空間に記憶されているプログラムの命令列を保持するキャッシュメモリである。プロセッサ１２０は、命令キャッシュ１１０から供給されたプログラムの命令列に従って、復号処理を行う処理装置である。データキャッシュ１３０は、メモリ１４０におけるデータ記憶空間に対応するデータを保持するキャッシュメモリである。メモリ１４０は、プロセッサ１２０によって実行されるプログラムの命令列を記憶する命令記憶空間およびプロセッサ１２０の作業データ領域であるデータ記憶空間を有するメモリである。ＤＭＡＣユニット１５０は、プロセッサ１２０とメモリ１４０との間のＤＭＡ（Direct Memory Access）転送を制御するＤＭＡＣ（Direct Memory Access Controller）である。このＤＭＡＣユニット１５０は、符号データのストリームの入力処理を行う。バス１６０は、命令キャッシュ１１０、ＤＭＡＣユニット１５０およびデータキャッシュ１３０と、メモリ１４０との間を接続するバスである。
【００１９】
プロセッサ１２０は、可変長符号復号処理用の命令を命令セットとして備えるプロセッサである。このプロセッサ１２０が扱う命令の命令長は３２ビットの固定長を想定する。このプロセッサ１２０は、命令フェッチユニット１２１と、命令デコードユニット１２２と、実行部２００とを備える。命令フェッチユニット１２１は、命令キャッシュ１１０からプログラムの命令列を読み出すものである。命令デコードユニット１２２は、命令フェッチユニット１２１によって読み出されたプログラムの命令列を解釈して、実行部２００およびＤＭＡＣユニット１５０に制御信号を供給するものである。
【００２０】
実行部２００は、命令デコードユニット１２２によって解釈された命令の処理内容に従って、その命令の実行に必要なリソース（レジスタや演算器など）の競合の調停と各ユニットの制御を行いながら、順次命令を実行するものである。この実行部２００は、プログラムカウンタ２１０と、汎用レジスタファイル２２０と、算術論理演算ユニット２３０と、ロードストアユニット２４０と、分岐ユニット２５０と、条件コードレジスタ２６０と、構成情報レジスタファイル２７０と、ストリーム参照ユニット２８０と、復号ユニット２９０とを備える。
【００２１】
プログラムカウンタ２１０は、実行部２００において実行されている命令の命令アドレスを保持するものである。このプログラムカウンタ２１０は、３２ビット幅を備えることを想定する。このプログラムカウンタ２１０の値は、命令フェッチユニット１２１に供給される。命令フェッチユニット１２１は、このプログラムカウンタ２１０の値に従って、後続命令を命令キャッシュ１１０から読み出すことになる。
【００２２】
汎用レジスタファイル２２０は、プロセッサ１２０における処理に用いられる汎用レジスタ群である。この汎用レジスタファイル２２０は、３２ビット幅の汎用レジスタを３２個備える。したがって、この汎用レジスタファイル２２０のアドレスは５ビットで表現できる。そのため、後述するＣ言語プログラムの整数型（ｉｎｔ）は４バイトを表す。
【００２３】
算術論理演算ユニット２３０は、算術演算または論理演算を行う演算器である。この算術論理演算ユニット２３０は、汎用レジスタファイル２２０から読み出されたオペランドを用いて算術演算または論理演算を行い、その結果を汎用レジスタファイル２２０に書き込む。
【００２４】
ロードストアユニット２４０は、データキャッシュ１３０と各レジスタファイル（汎用レジスタファイル２２０および構成情報レジスタファイル２７０）との間でデータの受け渡しを行うものである。すなわち、データキャッシュ１３０を介してメモリ１４０から各レジスタファイルへのロード（読出し）と各レジスタファイルからメモリ１４０へのストア（書込み）を行う。汎用レジスタファイル２２０のための３２ビット幅のロードストアと、構成情報レジスタファイル２７０のための１２８ビット幅のロードストアが可能である。
【００２５】
分岐ユニット２５０は、分岐命令を処理してプログラムカウンタ２１０を制御するものである。分岐方向の決定方法としては、汎用レジスタファイル２２０の値を比較する分岐命令、条件コードレジスタ２６０の各ビットの値が「０」か「１」かで分岐する分岐命令、無条件に分岐する分岐命令などのように、命令によって異なる。分岐先アドレスとしては、命令コードに含まれる即値をオフセットとしてプログラムカウンタ２１０に加算するものや、汎用レジスタファイル２２０の値をプログラムカウンタ２１０に設定するものなどが想定される。分岐命令以外の命令が実行された時は、プログラムカウンタ２１０に「４」を加算して、次の命令をフェッチして実行することになる。
【００２６】
条件コードレジスタ２６０は、分岐命令によって参照される条件コードを保持するレジスタである。条件コードは復号ユニット２９０から供給され、条件コードの各ビットは分岐するか否かを表す。この条件コードレジスタ２６０は８ビット幅を有し、その各ビットを指示するビットアドレスは３ビットで表現できる。
【００２７】
構成情報レジスタファイル２７０は、復号ユニット２９０における構成情報を保持するものである。この構成情報レジスタファイル２７０は、１２８ビット幅のレジスタを８個備える。また、各レジスタのアドレスは３ビットで表現できる。この構成情報レジスタファイル２７０は、特許請求の範囲に記載の構成情報保持部の一例である。なお、構成情報については後述する。
【００２８】
ストリーム参照ユニット２８０は、ＤＭＡＣユニット１５０から供給されるストリームデータをシーケンシャルに参照するものである。このストリーム参照ユニット２８０は、内部に３２ビットの符号バッファを有し、最大３２ビットまでのビット単位でストリームデータの参照が可能である。この符号バッファは、例えば１６ビットを単位として２組を備え、それぞれ１６ビットが揃うまで新たな命令を実行しないように制御される。参照されたデータは汎用レジスタファイル２２０および復号ユニット２９０に供給される。ＤＭＡＣユニット１５０はストリームの先頭アドレスとサイズを設定されることで、メモリ１４０上のその先頭アドレスから始まるデータをシーケンシャルに読み出して、符号バッファを満たすまで取り込んで保持する。演算器からのデータ要求があれば符号バッファの内容を演算器に出力して、出力した分を符号バッファから破棄する。そして、それにより生成された符号バッファの空き領域に残りのストリームを新たにメモリ１４０からシーケンシャルに取り込んで、符号バッファを満たすようにする。ここで、演算器とは、例えば復号ユニット２９０に相当するが、別に設けられた復号演算器などであってもよく、また、ストリーム参照ユニット２８０自身であってもよい。設定されたサイズのストリームを全てメモリ１４０から読み出した後には、メモリ１４０からのデータ読出しは行わない。その代わり、符号バッファに空きができた時にはダミーのデータ（例えば「０」）を充填する。
【００２９】
復号ユニット２９０は、ストリーム参照ユニット２８０から供給されたストリームデータを復号するものである。この復号ユニット２９０は、後述するように複数の符号語検出器を備え、それぞれの機能は構成情報レジスタファイル２７０に保持される構成情報により定義される。復号ユニット２９０は、復号符号語の決定と条件コードの決定を行うｖｌｄ＿ｄｅｃｏｄｅ命令、復号符号番号を後述する復号情報テーブル内の対応するデータのアドレス（以下、テーブルアドレスと称する。）へと変換するｖｌｄ＿ｓｈｏｗ命令、ｖｌｄ＿ｓｈｏｗの処理と併せて復号符号長分ストリームを読み進める処理を行うｖｌｄ＿ｇｅｔ命令などを実行する。これら各命令の詳細については後述する。この復号ユニット２９０において生成された条件コードは条件コードレジスタ２６０に供給される。また、この復号ユニット２９０において生成されたテーブルアドレスは汎用レジスタファイル２２０に供給される。また、この復号ユニット２９０は、復号情報テーブルのベースアドレスを表す内部レジスタｂａｓｅ＿ａｄｄｒを備え、テーブルアドレスの算出に用いる。
【００３０】
図２は、本発明の実施の形態における復号ユニット２９０とその周辺の機能構成例を示す図である。復号ユニット２９０は、符号語検出部３２０と、復号符号語決定部３３０とを備える。
【００３１】
符号語検出部３２０は、ストリーム参照ユニット２８０内の符号バッファ２８１から供給されるストリームデータにおいて、符号語を検出するものである。この符号語検出部３２０は、Ｎ個の符号語検出器３２１−０乃至３２１−（Ｎ−１）（以下、符号語検出器３２１と総称する。）を備え、検出された符号の符号番号および符号長を出力する。
【００３２】
符号語検出器３２１は、ストリーム参照ユニット２８０における符号バッファ２８１から入力されたストリームデータに含まれる符号語を検出するものである。この実施の形態では、符号語検出器３２１として１７個の符号語検出器３２１−０乃至３２１−１６を想定している。符号語検出器３２１の数を１７個に想定したのは、構成情報を１２８ビットに収めるためである。符号語検出器３２１の各々は、符号表の１つの符号語に対応し、その対応する符号語との一致をそれぞれ並列に検出する。この符号語検出器３２１は、４つのグループに分類されており、後述するように、検出すべき符号語の一部のビットがグループ毎に共通するように構成される。ただし、これらは一例であり、システム固有の条件により適宜変更可能であることはいうまでもない。
【００３３】
復号符号語決定部３３０は、符号語検出部３２０において検出された符号語の中から１つを決定するものである。この復号符号語決定部３３０は、プライオリティエンコーダ３３２と、符号長供給部３３３と、セレクタ３３４と、復号情報供給部３３５とを備えている。
【００３４】
プライオリティエンコーダ３３２は、複数の符号語検出器３２１の検出結果の中から優先順位に従って何れか一つを選択するものである。符号語検出器３２１は、対応する符号語と他の符号語とが同じであるか、または、対応する符号語が他の符号語の接頭語（プリフィックス）になることを許すこととする。すなわち、複数の符号語検出器３２１の結果が同時に一致を示すことが起こり得る。このため、符号語検出器３２１の各々には優先順位が設けられ、一致を示すものの中から優先順位のより高いものの符号語が選択されることとする。プライオリティエンコーダ３２２は、このような機能を奏するものであり、符号語検出器３２１において一致が検出されたものの中から最も優先順位の高い符号語検出器３２１の符号番号ＩＤを出力する。ただし、何れの符号語検出器３２１においても一致が検出されない場合には、不検出を意味する符号番号ＥＩＤが出力される。
【００３５】
符号長供給部３３３は、符号語検出器３２１の各々に対応する符号長を供給するものである。ただし、何れの符号語検出器３２１においても一致が検出されない場合には、符号長は「０」となる。
【００３６】
セレクタ３３４は、プライオリティエンコーダ３３２から出力された符号番号に従って、符号長供給部３３３から供給される符号長を選択するものである。これにより、符号語の符号番号ＩＤとその符号長ＣＬ（ＩＤ）が検出結果として出力される。符号長は、信号線２９７を介してストリーム参照ユニット２８０に出力される。
【００３７】
なお、上述のように、対応する符号語と他の符号語とが同じであるか、または、対応する符号語が他の符号語の接頭語になることを許すことを前提としている。これについては、同じ符号語もしくは接頭語になっている符号語の符号語検出器３２１よりも優先順位の高いものが必ず選択されるように割り当てることによって、それより低い優先順位の符号語検出器３２１が全く選択されないようにすることが可能となる。これを利用して、符号語の数が符号語検出器３２１の数よりも少ないときに、余った符号語検出器３２１を優先順位の低いものとして割り当てて、必ず選択されないようにする。これにより、余分な制御信号を用いることなく、符号語の数が符号語検出器３２１の数よりも少ない場合に対応することができる。すなわち、使用しない符号語検出器３２１を指定するための構成情報を新たに用意する必要がなく、符号語の数の異なる符号表に柔軟に対応することができる。
【００３８】
復号情報供給部３３５は、復号に必要な情報を取得するための情報を供給するものである。この復号情報供給部３３５は、復号情報テーブルのベースアドレスを表す内部レジスタｂａｓｅ＿ａｄｄｒを備えており、これに基づいて、プライオリティエンコーダ３３２によって得られた符号番号をテーブルアドレス（復号情報テーブル内の対応するデータのアドレス）に変換する。このテーブルアドレスは、信号線２９８を介して汎用レジスタファイル２２０に出力される。
【００３９】
また、復号情報供給部３３５は、構成情報レジスタファイル２７０から取得した条件コードビットマップに基づいて、プライオリティエンコーダ３３２によって得られた符号番号に対応する条件コードを生成する。この条件コードは、信号線２９９を介して条件コードレジスタ２６０に出力される。
【００４０】
図３は、本発明の実施の形態における復号情報テーブルの一構成例を示す図である。この復号情報テーブルは、符号番号に対応して復号情報を保持するテーブルである。符号番号は構成情報に対応するものであるのに対して、復号情報は符号語に１対１に対応する番号である。
【００４１】
この復号情報テーブルはメモリ１４０上に格納されるものであり、メモリ１４０における先頭アドレス（ベースアドレス）は、復号ユニット２９０の復号符号語決定部３３０における復号情報供給部３３５内の内部レジスタｂａｓｅ＿ａｄｄｒに保持されている。
【００４２】
この復号情報テーブルは、復号情報を４バイトずつ記憶することを想定すると、復号情報テーブル内にアクセスする際には、インデックス値ｖ＿ｉｄｘを４倍した値を内部レジスタｂａｓｅ＿ａｄｄｒの値に加算することにより、目的の復号情報を参照することができる。
【００４３】
図４は、本発明の実施の形態における符号値ＣＷの形式例を示す図である。まず、２進記号を以下のように定義して、
ＵＣｉ（ＩＤ），ＧＣｉ（ＩＤ），ＧＰ（ＩＤ），Ｓｉ∈｛０，１｝，
ｉ＝０，１，…，∞
本発明の実施の形態では、符号番号ＩＤの符号値ＣＷ（ＩＤ）を、２進記号列によって以下のように表現できるものに限定するものとする。
ＣＷ（ＩＤ）＝｛ＧＰ（ＩＤ）｝∞｛ＧＣ（ＩＤ）｝｛ＵＣ（ＩＤ）｝
＝｛…ＣＷＦＰ＋ＦＵ（ＩＤ）｝
｛ＣＷＦＰ＋ＦＵ−１（ＩＤ）…ＣＷＦＵ（ＩＤ）｝
｛ＣＷＦＵ−１（ＩＤ）…ＣＷ０（ＩＤ）｝
【００４４】
ただし、
ＧＣ（ＩＤ）＝ＧＣＦＰ−１（ＩＤ）…ＧＣ０（ＩＤ）
ＵＣ（ＩＤ）＝ＵＣＦＵ−１（ＩＤ）…ＵＣ０（ＩＤ）
である。また、｛Ｘ｝ＹはＸがＹ個連接した記号列を表すものとする。これにより、全ての記号を与えることなく無限の長さの記号列を定義することができる。
【００４５】
符号値ＣＷ（ＩＤ）に符号長ＣＬ（ＩＤ）を与えることで、符号番号ＩＤの符号語ＣＯＤＥ（ＩＤ）を、
ＣＯＤＥ（ＩＤ）＝ＣＷＣＬ（ＩＤ）−１（ＩＤ）…ＣＷ０（ＩＤ）
と定義することができる。
【００４６】
図４の例では、ＵＣを４ビットとし、ＧＣを２ビットとしている。また、それらの上位（ＭＳＢ側）にＧＰが連続するものとしている。このような前提としたのは、ＭＳＢ側のビット列が他の符号語と等しい部分が長く、さらにＭＳＢ側から「０」または「１」が連続する符号語から構成される符号表が多いからである。その原因としては、符号木を葉の高さが左右どちらかに偏った木にすることで単純に符号長に偏りがある可変長符号を設計できるからなどの理由が考えられる。ここで、符号長Ｌの符号語Ｃは、その出現確率の推定値Ｐ（Ｃ）＝２−Ｌと想定している。実際のＣの出現確率がＰ（Ｃ）であるならば、ほぼエントロピーまで圧縮できる。つまり、符号の圧縮性能は符号長のみで決まる。葉の高さはその符号語の符号長と等しく、葉の高さだけが重要であり、葉の分布がばらばらに偏っていても、左右どちらかに偏っていても、葉の高さの数が同じならば圧縮性能は変わらない。したがって、左右どちらかに偏った木の方が符号表の設計が簡単である。
【００４７】
そのような符号表が設計されることが多いことが予想されるため、グループ分けしてグループ毎に共通のデータをまとめて定義すれば構成情報を小さくすることができる。その上、グループ毎に共通のデータをまとめることによって符号表を定義することが著しく困難になることはない。このことは、符号表を符号木として表現したときに根から葉に向かう途中のパスは、異なる葉へのパスにおいても共通なパスがあり、枝の高さが低いほどより多くの葉へ向かうパスの共通部分となっていることからも容易に推測できる。
【００４８】
そこで、この例では、符号語検出器３２１−０乃至３２１−４の５個を第１のグループ、符号語検出器３２１−５乃至３２１−８の４個を第２のグループ、符号語検出器３２１−９乃至３２１−１２の４個を第３のグループ、符号語検出器３２１−１３乃至３２１−１６の４個を第４のグループとして、それぞれのグループにおいてＧＰおよびＧＣについては共通の符号が割り当てられる。これに対し、ＵＣについては符号語検出器３２１毎に独自の符号が割り当てられる。
【００４９】
ここで、符号番号ＩＤの比較用符号語記号列ＣＭＰＣＯＤＥ（ＩＤ）を、
ＣＭＰＣＯＤＥ（ＩＤ）＝ＣＯＤＥ（ＩＤ）｛０｝∞
＝｛ＣＷＣＬ（ＩＤ）−１（ＩＤ）…ＣＷ０（ＩＤ）｝｛０｝∞
と定義する。また、比較用マスク記号列ＣＭＰＭＡＳＫ（ＩＤ）を、
ＣＭＰＭＡＳＫ（ＩＤ）＝｛１｝ＣＬ（ＩＤ）｛０｝∞
と定義する。
【００５０】
符号語が符号化された順番に連接された記号列である符号列Ｓ０Ｓ１…ＳｔＳｔ＋１…のｔ番目の記号からの記号列ＳＴＲＥＡＭ（ｔ）を、
ＳＴＲＥＡＭ（ｔ）＝ＳｔＳｔ＋１…
として、記号ごとに論理積∧をとったＣＭＰＳＴＲＥＡＭ（ＩＤ）は、
ＣＭＰＳＴＲＥＡＭ（ＩＤ）＝ＣＭＰＭＡＳＫ（ＩＤ）∧ＳＴＲＥＡＭ（ｔ）
＝｛ＳｔＳｔ＋１…Ｓｔ＋ＣＬ（ＩＤ）−１｝｛０｝∞
と表すことができる。これにより、符号番号ＩＤの符号語ＣＯＤＥ（ＩＤ）を検出したか否かの判定ＣＯＤＥＤＥＴＥＣＴ（ＩＤ）は、
ＣＯＤＥＤＥＴＥＣＴ（ＩＤ）＝（ＣＭＰＳＴＲＥＡＭ（ＩＤ）＝＝
ＣＭＰＣＯＤＥ（ＩＤ））？Ｙｅｓ：Ｎｏ
によって表される。すなわち、ＣＭＰＳＴＲＥＡＭ（ＩＤ）とＣＭＰＣＯＤＥ（ＩＤ）が一致すれば「Ｙｅｓ」が出力され、一致しなければ「Ｎｏ」が出力される。このように、構成情報によって検出符号語ＣＯＤＥ（ＩＤ）を定義して、判定ＣＯＤＥＤＥＴＥＣＴ（ＩＤ）により検出を行うのが符号語検出器３２１である。
【００５１】
図５は、本発明の実施の形態における構成情報の一例を示す図である。この構成情報は、構成情報レジスタファイル２７０に保持され、復号ユニット２９０の符号語検出器３２１の構成ＶＬＤＣＴＸと、復号符号語決定部３３０の条件コードビットマップＣＣＭＡＰを定義するものである。
【００５２】
ここでは、１７個の符号語検出器３２１に対して「０」乃至「１６」の符号番号ＩＤが付与される。ＥＩＤの場合は「３２」として扱われる。グループ分けはＩＤが「０」乃至「４」、「５」乃至「８」、「９」乃至「１２」、「１３」乃至「１６」の４つを想定している。各構成情報のビット数は、ＵＣ（ＩＤ）が４ビットずつ、ＧＣ（ＩＤ）が２ビットずつ、ＣＬ（ＩＤ）が４ビットずつ、Ｄ（２）、Ｄ（３）、Ｄ（５）およびＤ（７）が２ビットずつで、その他ＩＤのＤ（ＩＤ）が１ビットずつである。また、ＣＣＭＡＰ（ＩＤ）は１ビットずつである。
【００５３】
符号長ＣＬ（ＩＤ）は、「１」減じた値を構成情報として、１ビット乃至１６ビットの長さを４ビットで表現する。差分Ｄ（ＩＤ）は、符号番号が１つ若い番号の符号語検出器３２１の符号長からの差分である。
【００５４】
ＵＣ（ＩＤ）を４ビットとしたのは、同じ符号長の符号語を１７個より１個少ない１６個まで区別できるからであり、葉の高さの偏りが少ない符号木に対してもうまく対応するためである。ただし、すべてが同じ長さの固定長符号ならばテーブルで１対１の変換をすれば済むため、符号語検出器３２１は１６個より多めにして１７個にしてある。なお、１７個より増やさないのは、構成情報を１２８ビットに収めるには１７個が限界と思われるからである。この例では、符号番号ＩＤが小さいものほど優先順位が高くなるように設定している。
【００５５】
条件コードビットマップＣＣＭＡＰは、１７個の符号語検出器３２１に対応した１７ビットと  符号語が検出できなかったときの符号番号ＥＩＤに対応する１ビットからなる。この条件コードビットマップＣＣＭＡＰにおいて、復号符号番号ＤＩＤに従ってＣＣＭＡＰ（ＤＩＤ）が条件コードレジスタ２６０に供給される。
【００５６】
図６は、本発明の実施の形態における符号語検出器３２１の構成例を示す図である。符号語検出器３２１の各々は、符号語レジスタ３０１と、マスクレジスタ３０２と、論理積演算部３０３と、一致検出部３０４とを備えている。
【００５７】
符号語レジスタ３０１は、この符号語検出器３２１において検出すべき符号語が設定されるレジスタである。この符号語レジスタ３０１は１６ビット構成であり、ＭＳＢ側に符号長ＣＬの符号語が設定され、それ以外のビットには「０」が設定される。
【００５８】
マスクレジスタ３０２は、ストリームデータのマスクパターンが設定されるレジスタである。このマスクレジスタ３０２は１６ビット構成であり、ＭＳＢ側に符号長ＣＬの「１」が設定され、それ以外のビットには「０」が設定される。
【００５９】
論理積演算部３０３は、符号バッファ２８１から供給されるストリームデータとマスクレジスタ３０２に設定されるマスクパターンとの論理積を生成するものである。これにより、ストリームデータのうち先頭から符号長ＣＬの部分がＭＳＢ側から出力され、以降は「０」が出力される。
【００６０】
一致検出部３０４は、符号語レジスタ３０１の設定内容と論理積演算部３０３の出力との間の一致を検出するものである。すなわち、符号バッファ２８１からのストリームデータと符号語レジスタ３０１に設定された符号語とが一致すると、その旨が一致検出部３０４によって出力される。
【００６１】
図７は、本発明の実施の形態における符号語検出器３２１の各々における符号語レジスタ３０１の構成情報の例を示す図である。１７個の符号語検出器３２１−０乃至３２１−１６の符号語レジスタ３０１の各々には、構成情報レジスタファイル２７０に保持される構成情報に従って値が設定される。
【００６２】
ＵＣの４ビットには、符号語検出器３２１毎に特有の値が設定される。すなわち、構成情報の第０ビット乃至第３ビットが符号語検出器３２１−０、構成情報の第４ビット乃至第７ビットが符号語検出器３２１−１、構成情報の第８ビット乃至第１１ビットが符号語検出器３２１−２、構成情報の第１２ビット乃至第１５ビットが符号語検出器３２１−３、構成情報の第１６ビット乃至第１９ビットが符号語検出器３２１−４、構成情報の第２０ビット乃至第２３ビットが符号語検出器３２１−５、構成情報の第２４ビット乃至第２７ビットが符号語検出器３２１−６、構成情報の第２８ビット乃至第３１ビットが符号語検出器３２１−７、構成情報の第３２ビット乃至第３５ビットが符号語検出器３２１−８、構成情報の第３６ビット乃至第３９ビットが符号語検出器３２１−９、構成情報の第４０ビット乃至第４３ビットが符号語検出器３２１−１０、構成情報の第４４ビット乃至第４７ビットが符号語検出器３２１−１１、構成情報の第４８ビット乃至第５１ビットが符号語検出器３２１−１２、構成情報の第５２ビット乃至第５５ビットが符号語検出器３２１−１３、構成情報の第５６ビット乃至第５９ビットが符号語検出器３２１−１４、構成情報の第６０ビット乃至第６３ビットが符号語検出器３２１−１５、構成情報の第６４ビット乃至第６７ビットが符号語検出器３２１−１６の、それぞれの符号語レジスタ３０１のＵＣに設定される。
【００６３】
ＧＣの２ビットおよびＧＰの１ビットは、グループ毎に共通の値が設定される。すなわち、構成情報の第６８ビット乃至第７０ビットが符号語検出器３２１−０乃至３２１−４、構成情報の第７１ビット乃至第７３ビットが符号語検出器３２１−５乃至３２１−８、構成情報の第７４ビット乃至第７６ビットが符号語検出器３２１−９乃至３２１−１２、構成情報の第７７ビット乃至第７９ビットが符号語検出器３２１−１３乃至３２１−１６の、それぞれの符号語レジスタ３０１のＧＣおよびＧＰに設定される。ただし、設定される符号語の長さは符号長に従う。すなわち、符号長が８ビット以上の場合にはＭＳＢ側にＧＰが繰り返し設定される。一方、符号長が６ビット以下の場合には、ＬＳＢ側に符号語がつめられて、ＭＳＢ側の符号語は設定されない。
【００６４】
上述のように、符号語検出器３２１−０乃至３２１−１６は、符号番号の若い順に検索の優先順位が高く設定されており、ある符号語検出器３２１において一致が検出された場合にはそれより符号番号の大きい符号語検出器３２１の結果は無視される。また、何れの符号語検出器３２１においても一致が検出されなかった場合には、不一致を示すＥＩＤが出力される。
【００６５】
図８は、本発明の実施の形態における符号間の関係を示す例である。ここで、符号番号ＩＤがＩよりも１つ若い番号（Ｉ−１）の符号語検出器３２１の符号長ＣＬ（Ｉ−１）からの差分Ｄ（Ｉ）によって、符号番号Ｉの符号長ＣＬ（Ｉ）を相対的に定義することを考える。符号長は小さいものから順番に並べると差が小さい場合がほとんどであるため、このように符号長の短いものから順番に、差分Ｄ（Ｉ）によって相対的に符号長を定義するとＣＬ（Ｉ）よりも少ないビット数で差分Ｄ（Ｉ）を表すことができる。ＣＬ（Ｉ）を直接定義するものと、相対的に定義するものとを組み合わせることで、全ての符号語検出器３２１の符号長ＣＬ（Ｉ）をより少ないビット数の構成情報として表現することができる。
【００６６】
図５の例では、符号語検出器３２１−０、３２１−１および３２１−９における符号長を４ビットで表現し、これ以外の符号語検出器３２１においては差分Ｄを用いることにより符号長の表現を短縮している。符号番号０と１との間では符号長が大きく異なることが多く、また、１７個のうちのほぼ中心となるのが符号番号９であるため、符号語検出器３２１−１およびでは３２１−９符号長そのものを保持することとしたものである。また、符号語検出器３２１−２、３２１−３、３２１−５および３２１−７については差分Ｄを２ビットとし、それ以外では差分Ｄを１ビットとしている。これは、符号番号が小さいほど符号長の変化が大きく、符号番号が大きいほど符号長の変化が少なくなるという可変長符号の特徴を利用したものである。
【００６７】
このように、Ｎ個の符号語検出器３２１と復号符号語決定部３３０とを組み合わせて使用することにより、ストリームデータＳＴＲＥＡＭ（ｔ）の先頭にある符号語（復号符号番号ＤＩＤ、復号符号値ＤＣＷ、復号符号長ＤＣＬ）を１つ決定することができる。そして、その符号語に対応した復号情報を生成することにより、その符号語を復号したことになる。その後、ストリームデータの読出し位置ｔをＤＣＬビット分読み進めて「ｔ＋ＤＣＬ」に更新することにより、その次の符号語がＳＴＲＥＡＭ（ｔ）の先頭となる。この要領で、それ以降の符号語も同様に繰り返すことにより、ストリームデータの全てを復号することができる。これらの処理を復号処理ＲＶＬＤ（Reconfigurable Variable Length Decoding）と称する。
【００６８】
復号符号番号ＤＩＤがＥＩＤのときは符号長ＤＣＬが「０」であるため、復号処理ＲＶＬＤにおいてストリームデータを読み進めることはない。そのため、ＥＩＤのときは、符号表の残りの符号語を定義した新たな構成情報を用意して、それに設定し直した上で同様の復号処理ＲＶＬＤを行うか、別の方法により符号語を決定して符号長分のビット数を読み進める復号処理を行う。本発明の実施の形態によるプロセッサ１２０は、復号処理ＲＶＬＤを実行する命令とその他の「可変長符号の復号処理に有効な命令」を命令セットとして有し、構成情報を１つ以上格納する構成情報レジスタファイル２７０を備える。
【００６９】
ここで、符号語検出器３２１に複数の符号語の接頭語を符号語として割り当て、それが複数の符号語を代表している場合を考える。この場合、各符号語の接頭語を除いた接尾語は接頭語ごとに長さがほとんど同じか１ビット程度の差しかない２種類程度の長さの固定長符号として扱うことができることが多い。そのような場合には、一番長いビット数分の２進記号列を符号バッファ２８１から読み出して、その２進記号列に基づいて実際の長さを算出し、その長さだけ符号バッファ２８１を読み進めることにより、重複の少ないテーブルと単純な処理によって復号処理を実現できることが多い。そのため、指定したビット数を符号バッファ２８１から取り出す処理ＳＨＯＷＢＩＴＳを実行する命令と、ＳＨＯＷＢＩＴＳと併せて符号バッファ２８１をそのビット数分読み進める処理ＧＥＴＢＩＴＳを実行する命令を「可変長符号の復号処理に有効な命令」として備えることを想定する。
【００７０】
さらに、プロセッサ１２０は、条件コードレジスタ２６０を参照して、指定された条件が満たされれば指定したメモリアドレスへ分岐する分岐命令を「可変長符号の復号処理に有効な命令」として備えているものとする。条件コードマップＣＣＭＡＰは、上述のように、（Ｎ＋１）個の条件コード情報を格納したレジスタであり、Ｎ個の各符号番号に対応したＮ個の条件コード情報と、検出されなかった場合の例外符号番号ＥＩＤに対応した１個の条件コード情報とからなる。各条件コード情報は条件コードレジスタ２６０へ値を設定するために用いられる。ＣＣＭＡＰ（ＩＤ）によって各条件コード情報を表すものとする。復号処理ＲＶＬＤを行う命令が実行された際、ＤＩＤの条件コード情報ＣＣＭＡＰ（ＤＩＤ）に基づいて、条件コードレジスタ２６０へ値が設定される。単純なＣＣＭＡＰの実装方法としては、ＩＤ毎に分岐するかしないかの情報を各１ビットずつの（Ｎ＋１）ビット分格納しておいて、条件コードレジスタ２６０へＣＣＭＡＰ（ＩＤ）が書き込まれるようにすることが考えられる。このように復号処理ＲＶＬＤと同時に分岐のための条件コードを設定する命令（後述するｖｌｄ＿ｄｅｃｏｄｅ命令）を用意することにより、プロセッサ１２０において符号番号を比較する処理がある場合の比較処理のための命令を削減することができる。条件コードレジスタ２６０は１ビット以上でもよく、その場合には条件コードを設定する命令はどのビットに設定するかを指定し、参照する分岐命令においても何れのビットを参照して分岐するかを指定することになる。また、条件コードレジスタ２６０は同時に複数のビットを設定することが可能であることとしてもよい。この場合、ＣＣＭＡＰで設定された条件コード情報とは無関係に、ＥＩＤであったときにその旨を示す情報を条件コードレジスタ２６０の別のビットに設定するなどの応用が考えられる。
【００７１】
次に、符号表がＮ個以上の符号語からなり、１つの構成情報では収まらないときの解決方法としては、大きく分けて以下の２種類が考えられる。第１の方法は、復号処理ＲＶＬＤを１回行った後に、残りの部分を別の手法により復号する方法である。第２の方法は、復号処理ＲＶＬＤを異なる構成情報によって複数回実行することにより、復号する方法である。
【００７２】
まず、第１の方法について説明する。復号処理ＲＶＬＤにおいて設定された構成情報によって定義された記号列が、実際の符号語そのものであるＣＯＤＥＬＥＡＦと、複数の符号語の接頭語となる記号列であるＣＯＤＥＮＯＤＥとが混在して構成される場合を考える。ＣＯＤＥＬＥＡＦの場合は、復号符号番号ＤＩＤに従って、別途用意された復号情報テーブルを参照することにより復号情報が出力される。ＣＯＤＥＮＯＤＥの場合は、符号語の途中までしか確定していないため、もう少し先の符号列を参照して決定する必要がある。この場合はＳＨＯＷＢＩＴＳによってある程度の長さの記号列を取得して、その記号列から符号語の残りの部分である接尾語の長さ（符号長残差）が、別途用意された符号長残差テーブルを参照することにより決定される。そして、その長さをＧＥＴＢＩＴＳで読み進めて、ＳＨＯＷＢＩＴＳで得た記号列に従って、別途用意された復号情報テーブルを参照することにより復号情報が出力される。ＣＯＤＥＮＯＤＥについては、符号長残差が全て同じ値となるように構成情報記号列を定義できる場合があり、このような場合はＣＯＤＥＮＯＤＥによって瞬時に符号長残差が決定するため、その符号長残差でＧＥＴＢＩＴＳをするだけでよい。
【００７３】
このように、第１の方法では、復号処理ＲＶＬＤの後にＣＯＤＥＬＥＡＦかＣＯＤＥＮＯＤＥかで処理が分かれるため、分岐命令が必要になる。このＣＯＤＥＬＥＡＦかＣＯＤＥＮＯＤＥかの判別を単純に行う場合には、何れの処理を行うかを記述したテーブルをＤＩＤに基づいて参照して、それにより得た値を比較する処理が必要になる。そこで、本発明の実施の形態においては、ＣＣＭＡＰに分岐するかしないかの情報を設定しておいて、復号処理ＲＶＬＤと同時に分岐条件を計算できるようにしておくことにより、比較処理や比較用テーブルを不要とすることができる。
【００７４】
次に、第２の方法について説明する。複数の構成情報によって復号処理ＲＶＬＤを実行するためには、カスケード機能が利用される。カスケード機能とは、異なる構成情報により復号処理ＲＶＬＤを複数回連続して実行する機能であり、先に実行された復号処理ＲＶＬＤでＥＩＤ以外の符号語が復号された時は、それ以降のカスケード機能を有効にした復号処理ＲＶＬＤは無視されるようになっている。すなわち、異なる構成情報による符号語検出器３２１によって連続して検出結果が得られた際には、先に得られた検出結果において一致が検出されていない場合にのみ、後に得られた検出結果に基づいて復号された符号語が決定される。これにより、分岐命令を使用せずに分岐処理を実現することができる。また、分岐命令を使用する場合であっても、分岐命令よりも先に復号処理ＲＶＬＤを発行することができる。
【００７５】
復号処理ＲＶＬＤ毎に異なるオフセット値を符号番号に加算することができれば、複数の復号処理ＲＶＬＤの結果の符号番号を互いに区別できるようになる。そこで、復号処理ＲＶＬＤを、復号符号番号ＤＩＤの決定および条件コード情報の生成を行うＶＬＤ＿ＤＥＣＯＤＥと、復号符号番号ＤＩＤにオフセット値を加算するＶＬＤ＿ＳＨＯＷと、ＶＬＤ＿ＳＨＯＷと併せて符号長ＤＣＬビット分のストリームデータを読み進めるＶＬＤ＿ＧＥＴの各処理に分解する。ＶＬＤ＿ＳＨＯＷおよびＶＬＤ＿ＧＥＴは、復号符号番号ＤＩＤがＥＩＤであったときには特定の値に設定するように設定できる。これらにより、複数の構成情報を用いてＮ個以上の符号語検出器３２１があるかのように処理することができる。
【００７６】
オフセットした符号番号は符号を区別するための単なる番号として使うこともできるが、復号情報をテーブルにしておきオフセットした符号番号でテーブルを索引して、その符号語に対応する復号情報が参照できるようにすると効率がよい。復号情報が４バイト以内で表現できるものとし、４バイト単位の復号情報テーブルを考える。テーブルの最初の要素のアドレスをベースアドレスとして、符号番号を４倍した値にベースアドレスを加算することにより、符号番号に対応したテーブルの要素のアドレスを求めることができる。４倍するためのシフト命令とベースアドレスに加算するための加算命令が必要である。これをＶＬＤ＿ＳＨＯＷおよびＶＬＤ＿ＧＥＴによって行うようにすることで、２命令を削減することができる。
【００７７】
また、符号語の最後の１ビットにおいて復号情報の正負を表すような符号表がＭＰＥＧなどの規格にある。このような符号表に対しては最後の１ビットを削除した符号語のみの符号表を考慮して構成情報を設定し、ＶＬＤ＿ＳＨＯＷおよびＶＬＤ＿ＧＥＴにおいては、最後の１ビットを参照して、その値に基づいて符号番号を加工して、区別がつくようにするとよい（後述のＶＬＤ＿ＳＨＯＷ＿ＳおよびＶＬＤ＿ＧＥＴ＿Ｓ）。たとえば、符号番号を２倍して、最後の１ビットとして参照した値を加算すると、偶数と奇数で正負の区別がつくようになる。ＶＬＤ＿ＧＥＴにより１ビット余分に読み進めるようにすると、ＧＥＴＢＩＴＳにおいて１ビットを読み進める必要がなくなる。
【００７８】
また、最後の１ビットだけでなく、最後の２ビットを参照した値に符号番号を４倍して加算するようなＶＬＤ＿ＳＨＯＷおよびＶＬＤ＿ＧＥＴも考えることができる（後述のＶＬＤ＿ＳＨＯＷ＿ＳＳおよびＶＬＤ＿ＧＥＴ＿ＳＳ）。符号木の末端に高さ２の完全木が多数あるような場合に適している。この場合、ＶＬＤ＿ＧＥＴは２ビットを余分に読み進める。
【００７９】
図９は、本発明の実施の形態におけるプロセッサ１２０の命令セットのうち可変長符号を復号するための命令を抜粋したものである。通常の命令の説明は省略するが、Ｃ言語などの高級言語を効率よく実行するのに十分な命令セットが別途用意されていることを想定する。たとえば、Ｒ３０００やＡＲＭ７などのＲＩＳＣプロセッサの命令セットがこれに相当する。
【００８０】
「ｖｌｄ＿ｄｅｃｏｄｅ」命令は、カスケード機能を用いることなく、復号符号番号の決定および条件コード情報の生成を行うための命令である。「ｖｌｄ＿ｄｅｃｏｄｅ」命令のオペランドとしては、３ビットのｃｃおよび３ビットのｖｒｓが用いられる。ｃｃは条件コードレジスタ２６０のアドレスを示すために用いられるパラメータである。ｖｒｓは、構成情報レジスタファイル２７０のアドレスを示すために用いられるパラメータである。この「ｖｌｄ＿ｄｅｃｏｄｅ」命令のオペレーションとしては、ｃａｓｃａｄｅをしない旨（「Ｎｏ」）を設定した上で処理「ＶＬＤ＿ＤＥＣＯＤＥ」を行った後に、プログラムカウンタ２１０に「４」を加算するという動作を行う。
【００８１】
「ｖｌｄ＿ｄｅｃｏｄｅ＿ｃａｓｃａｄｅ」命令は、カスケード機能を用いて、復号符号番号の決定および条件コード情報の生成を行うための命令である。「ｖｌｄ＿ｄｅｃｏｄｅ＿ｃａｓｃａｄｅ」命令のオペランドとしては、「ｖｌｄ＿ｄｅｃｏｄｅ」命令と同様に、３ビットのｃｃおよび３ビットのｖｒｓが用いられる。この「ｖｌｄ＿ｄｅｃｏｄｅ＿ｃａｓｃａｄｅ」命令のオペレーションとしては、ｃａｓｃａｄｅをする旨（「Ｙｅｓ」）を設定した上で処理「ＶＬＤ＿ＤＥＣＯＤＥ」を行った後に、プログラムカウンタ２１０に「４」を加算するという動作を行う。
【００８２】
「ｖｌｄ＿ｂａｓｅａｄｄｒ」命令は、復号情報テーブルのベースアドレスを設定するための命令である。「ｖｌｄ＿ｂａｓｅａｄｄｒ」命令のオペランドとしては、５ビットのｒｓが用いられる。ｒｓは、汎用レジスタファイル２２０のアドレスを示すために用いられるパラメータである。この「ｖｌｄ＿ｂａｓｅａｄｄｒ」命令のオペレーションとしては、汎用レジスタファイル２２０のうちｒｓにより示されるレジスタの内容をｔａｂｌｅ＿ｂａｓｅに代入した後に、プログラムカウンタ２１０に「４」を加算するという動作を行う。
【００８３】
「ｖｌｄ＿ｓｈｏｗ」命令は、復号符号番号にオフセット値を加算するための命令である。「ｖｌｄ＿ｓｈｏｗ」命令のオペランドとしては、５ビットのｒｄ、８ビットのｏｆｆｓｅｔ、８ビットのｅｘｃｅｐｔが用いられる。ｒｄは、汎用レジスタファイル２２０のアドレスを示すために用いられるパラメータである。ｏｆｆｓｅｔは、復号情報テーブルにおけるオフセット値を示すために用いられるパラメータである。ｅｘｃｅｐｔは、符号語の一致が検出されなかった場合の復号情報テーブル内の相対位置を示すために用いられるパラメータである。この「ｖｌｄ＿ｓｈｏｗ」命令のオペレーションとしては、処理「ＶＬＤ＿ＳＨＯＷ」を行った後に、プログラムカウンタ２１０に「４」を加算するという動作を行う。
【００８４】
「ｖｌｄ＿ｓｈｏｗ＿ｓ」命令は、符号語の最後の１ビットを考慮して復号符号番号にオフセット値を加算するための命令である。「ｖｌｄ＿ｓｈｏｗ＿ｓ」命令のオペランドとしては、「ｖｌｄ＿ｓｈｏｗ」命令と同様に、５ビットのｒｄ、８ビットのｏｆｆｓｅｔ、８ビットのｅｘｃｅｐｔが用いられる。この「ｖｌｄ＿ｓｈｏｗ＿ｓ」命令のオペレーションとしては、処理「ＶＬＤ＿ＳＨＯＷ＿Ｓ」を行った後に、プログラムカウンタ２１０に「４」を加算するという動作を行う。
【００８５】
「ｖｌｄ＿ｓｈｏｗ＿ｓｓ」命令は、符号語の最後の２ビットを考慮して復号符号番号にオフセット値を加算するための命令である。「ｖｌｄ＿ｓｈｏｗ＿ｓｓ」命令のオペランドとしては、「ｖｌｄ＿ｓｈｏｗ」命令と同様に、５ビットのｒｄ、８ビットのｏｆｆｓｅｔ、８ビットのｅｘｃｅｐｔが用いられる。この「ｖｌｄ＿ｓｈｏｗ＿ｓｓ」命令のオペレーションとしては、処理「ＶＬＤ＿ＳＨＯＷ＿ＳＳ」を行った後に、プログラムカウンタ２１０に「４」を加算するという動作を行う。
【００８６】
「ｖｌｄ＿ｇｅｔ」命令は、「ｖｌｄ＿ｓｈｏｗ」命令の動作と併せて符号長相当のストリームデータを読み進めるための命令である。「ｖｌｄ＿ｇｅｔ」命令のオペランドとしては、「ｖｌｄ＿ｓｈｏｗ」命令と同様に、５ビットのｒｄ、８ビットのｏｆｆｓｅｔ、８ビットのｅｘｃｅｐｔが用いられる。この「ｖｌｄ＿ｇｅｔ」命令のオペレーションとしては、処理「ＶＬＤ＿ＧＥＴ」を行った後に、プログラムカウンタ２１０に「４」を加算するという動作を行う。
【００８７】
「ｖｌｄ＿ｇｅｔ＿ｓ」命令は、「ｖｌｄ＿ｓｈｏｗ＿ｓ」命令の動作と併せて符号長相当のストリームデータを読み進めるための命令である。「ｖｌｄ＿ｇｅｔ＿ｓ」命令のオペランドとしては、「ｖｌｄ＿ｓｈｏｗ」命令と同様に、５ビットのｒｄ、８ビットのｏｆｆｓｅｔ、８ビットのｅｘｃｅｐｔが用いられる。この「ｖｌｄ＿ｇｅｔ＿ｓ」命令のオペレーションとしては、処理「ＶＬＤ＿ＧＥＴ＿Ｓ」を行った後に、プログラムカウンタ２１０に「４」を加算するという動作を行う。
【００８８】
「ｖｌｄ＿ｇｅｔ＿ｓｓ」命令は、「ｖｌｄ＿ｓｈｏｗ＿ｓｓ」命令の動作と併せて符号長相当のストリームデータを読み進めるための命令である。「ｖｌｄ＿ｇｅｔ＿ｓｓ」命令のオペランドとしては、「ｖｌｄ＿ｓｈｏｗ」命令と同様に、５ビットのｒｄ、８ビットのｏｆｆｓｅｔ、８ビットのｅｘｃｅｐｔが用いられる。この「ｖｌｄ＿ｇｅｔ＿ｓｓ」命令のオペレーションとしては、処理「ＶＬＤ＿ＧＥＴ＿ＳＳ」を行った後に、プログラムカウンタ２１０に「４」を加算するという動作を行う。
【００８９】
「ｓｈｏｗｂｉｔｓ」命令は、指定したビット数を符号バッファ２８１から取り出すための命令である。「ｓｈｏｗｂｉｔｓ」命令のオペランドとしては、５ビットのｒｄと、５ビットのｒｓが用いられる。ｒｄおよびｒｓは、汎用レジスタファイル２２０のアドレスを示すために用いられるパラメータである。この「ｓｈｏｗｂｉｔｓ」命令のオペレーションとしては、処理「ＳＨＯＷＢＩＴＳ」を行った後に、プログラムカウンタ２１０に「４」を加算するという動作を行う。
【００９０】
「ｇｅｔｂｉｔｓ」命令は、処理「ＳＨＯＷＢＩＴＳ」と併せて符号バッファ２８１をそのビット数分読み進めるための命令である。「ｇｅｔｂｉｔｓ」命令のオペランドとしては、「ｓｈｏｗｂｉｔｓ」命令と同様に、５ビットのｒｄと、５ビットのｒｓが用いられる。この「ｇｅｔｂｉｔｓ」命令のオペレーションとしては、処理「ＧＥＴＢＩＴＳ」を行った後に、プログラムカウンタ２１０に「４」を加算するという動作を行う。
【００９１】
「ｇｅｔ＿ｓｔｒｅａｍ」命令は、符号バッファ２８１にストリームデータを転送するための命令である。「ｇｅｔ＿ｓｔｒｅａｍ」命令のオペランドとしては、５ビットのｒｓと、５ビットのｒｔが用いられる。ｒｓおよびｒｔは、汎用レジスタファイル２２０のアドレスを示すために用いられるパラメータである。この「ｇｅｔ＿ｓｔｒｅａｍ」命令のオペレーションとしては、符号バッファ２８１をクリアし、ストリームデータの先頭アドレスを汎用レジスタＲ［ｒｓ］、サイズを汎用レジスタＲ［ｒｔ］としてＤＭＡＣを設定して、ストリームデータの符号バッファ２８１への充填を開始する。その後、プログラムカウンタ２１０に「４」を加算するという動作を行う。
【００９２】
「ｌｏａｄ＿ｖ」命令は、メモリ１４０から構成情報レジスタファイル２７０にデータを読み出すための命令である。「ｌｏａｄ＿ｖ」命令のオペランドとしては、５ビットのｖｒｄと、５ビットのｒｓと、１６ビットのｏｆｆｓｅｔが用いられる。ｖｒｄは、構成情報レジスタファイル２７０のアドレスを示すために用いられるパラメータである。ｒｓは、汎用レジスタファイル２２０のアドレスを示すために用いられるパラメータである。ｏｆｆｓｅｔは、メモリ１４０のアドレスのオフセット値を示すために用いられるパラメータである。この「ｌｏａｄ＿ｖ」命令のオペレーションとしては、メモリ１４０上の（ｏｆｆｓｅｔ＋Ｒ［ｒｓ］）番地から１６バイトのデータを読み出して、構成情報レジスタファイル２７０のＶＲ［ｖｒｄ］に格納するという動作を行う。その後、プログラムカウンタ２１０に「４」を加算するという動作を行う。
【００９３】
「ｓｔｏｒｅ＿ｖ」命令は、構成情報レジスタファイル２７０からメモリ１４０にデータを書き込むための命令である。「ｓｔｏｒｅ＿ｖ」命令のオペランドとしては、「ｌｏａｄ＿ｖ」命令と同様に、５ビットのｖｒｄと、５ビットのｒｓと、１６ビットのｏｆｆｓｅｔが用いられる。この「ｓｔｏｒｅ＿ｖ」命令のオペレーションとしては、構成情報レジスタファイル２７０のＶＲ［ｖｒｓ］の内容を参照して、メモリ１４０上の（ｏｆｆｓｅｔ＋Ｒ［ｂａｓｅ］）番地から始まる１６バイトの領域に書き込むという動作を行う。その後、プログラムカウンタ２１０に「４」を加算するという動作を行う。
【００９４】
「ｖｌｄ＿ｂｒ」命令は、条件コードレジスタ２６０の値に応じて分岐処理を行うための命令である。「ｖｌｄ＿ｂｒ」命令のオペランドとしては、１ビットのｔｆと、３ビットのｃｃと、符号付１６ビットのｏｆｆｓｅｔが用いられる。ｔｆは、条件コードレジスタ２６０の値が「０」または「１」の何れの場合に分岐するかを指定するパラメータである。ｃｃは、条件コードレジスタ２６０のアドレスを示すために用いられるパラメータである。ｏｆｆｓｅｔは、分岐先のオフセットを示すために用いられるパラメータである。この「ｖｌｄ＿ｂｒ」命令オペレーションとしては、条件コードレジスタ２６０ＣＣＲ［ｃｃ］がｔｆと一致していればｏｆｆｓｅｔに「４」を乗じた数をプログラムカウンタ２１０に加算して分岐し、一致していなければプログラムカウンタ２１０に「４」を加算するという動作を行う。
【００９５】
以下に、各処理の処理手順例について説明するが、これらは電子回路として実装することができる。逐次処理やループとして記述されている場合でも、並列に動作可能な部分は電子回路により並列に動作するように実装されることを想定する。
【００９６】
図１０は、本発明の実施の形態における処理「ＩＮＩＴ」の処理手順例を示す図である。この処理「ＩＮＩＴ」は、プロセッサ１２０の初期化などの際に実行される処理である。
【００９７】
この処理「ＩＮＩＴ」では、カスケード機能の有無を示す変数ｆｌａｇ＿ｃａｓｃａｄｅに「Ｎｏ」が設定されるとともに、符号語の検出の有無を示す変数ｉｄｘ＿ｖａｌｉｄに「Ｎｏ」が設定される（ステップＳ８１１）。また、符号バッファ２８１の読出し先頭位置を示すｔが「０」にリセットされる（ステップＳ８１２）。
【００９８】
図１１は、本発明の実施の形態における処理「ＶＬＤ＿ＤＥＣＯＤＥ」の処理手順例を示す図である。この処理「ＶＬＤ＿ＤＥＣＯＤＥ」のオペランドとしては、ｃｃと、ｖｒｓと、ｃａｓｃａｄｅが用いられる。ｃｃは条件コードレジスタ２６０のアドレスを示すために用いられるパラメータである。ｖｒｓは、構成情報レジスタファイル２７０のアドレスを示すために用いられるパラメータである。ｃａｓｃａｄｅは、カスケード機能を用いるか否を示すために用いられるパラメータである。「ｖｌｄ＿ｄｅｃｏｄｅ」命令では、ｃａｓｃａｄｅは「Ｎｏ」であり、「ｖｌｄ＿ｄｅｃｏｄｅ＿ｃａｓｃａｄｅ」命令では、ｃａｓｃａｄｅは「Ｙｅｓ」である。
【００９９】
まず、構成情報レジスタファイル２７０の１つのレジスタの内容（１２８ビット）が図５のように変数ＣＣＭＡＰおよびＶＬＤＣＴＸとして割り当てられる（ステップＳ８２１）。そして、ＶＬＤＣＴＸをパラメータとして処理「ＶＬＤ＿ＤＥＣ」が実行される。その結果、戻り値として符号番号ＩＤおよび符号長ｌｅｎが得られる（ステップＳ８２２）。
【０１００】
また、符号番号ＩＤに対応するＣＣＭＡＰが変数ｃｏｎｄに設定されるとともに、符号番号ＩＤが一致の不検出を意味する符号番号ＥＩＤであれば変数ｃｏｎｄｅｘに「１」が、符号番号ＥＩＤでなければ「０」が設定される（ステップＳ８２３）。
【０１０１】
パラメータｃａｓｃａｄｅが「Ｙｅｓ」かつ変数ｉｄｘ＿ｖａｌｉｄが「Ｙｅｓ」である場合以外、すなわち、パラメータｃａｓｃａｄｅが「Ｎｏ」または変数ｉｄｘ＿ｖａｌｉｄが「Ｎｏ」である場合、変数ｖ＿ｌｅｎに符号長ｌｅｎの値が設定される（ステップＳ８２５）。この変数ｖ＿ｌｅｎは、有効な符号長を保持する変数である。
【０１０２】
そして、（ｌｅｎ＋２）をパラメータとして、処理「ＳＨＯＷＢＩＴＳ」が実行される（ステップＳ８２６）。これにより、検出された符号長のさらに２ビット先まで参照されて、ビットデータｒｅｔ＿ｂｉｔｓが戻り値として得られる。
【０１０３】
また、変数ｆｌａｇ＿ｃａｓｃａｄｅにパラメータｃａｓｃａｄｅの値が設定されるとともに、変数ｘｂｉｔにはビットデータｒｅｔ＿ｂｉｔｓの下２桁の値が設定される（ステップＳ８２７）。すなわち、変数ｘｂｉｔには、検出された符号長のさらに２ビット先の分が保持される。
【０１０４】
また、戻り値として、条件コードレジスタ２６０のｃｃにより示されるレジスタに変数ｃｏｎｄの値が設定され、条件コードレジスタ２６０の（ｃｃ＋１）により示されるレジスタに変数ｃｏｎｄｅｘの値が設定される（ステップＳ８２８）。
【０１０５】
図１２は、本発明の実施の形態における処理「ＶＬＤ＿ＤＥＣ」の処理手順例を示す図である。この処理「ＶＬＤ＿ＤＥＣ」のオペランドとしては、変数ＶＬＤＣＴＸが用いられる。変数ＶＬＤＣＴＸは、構成情報のうち符号語検出器３２１の構成を示す情報である。
【０１０６】
まず、「１６」をパラメータとして処理「ＳＨＯＷＢＩＴＳ」が実行される（ステップＳ８３１）。その結果、戻り値として１６ビット分のストリームデータが変数ＳＴＲＥＡＭ１６ＢＩＴに得られる。また、変数ＶＬＤＣＴＸをパラメータとして処理「ＶＬＤ＿ＣＯＮＦＩＧ」が実行される（ステップＳ８３２）。これにより、符号語検出器３２１の構成が設定される。そして、符号番号を示す変数ＤＩＤに一致の不検出を意味する符号番号ＥＩＤが設定され、符号長を示す変数ＤＣＬに「０」が設定され、符号番号のカウンタＩＤに「１６」が設定される（ステップＳ８３３）。
【０１０７】
その後、カウンタＩＤが「０」以下になるまで以下の処理が繰り返される（ステップＳ８３４）。変数ＳＴＲＥＡＭ１６ＢＩＴとＣＭＰＭＡＳＫ（ＩＤ）の論理積演算の結果が比較対象ストリームデータを示す変数ＣＭＰＳＴＲＥＡＭ（ＩＤ）に設定される（ステップＳ８３５）。ＩＤ番目の符号語検出器３２１で検出される符号語を示す変数ＣＭＰＣＯＤＥ（ＩＤ）の値が変数ＣＭＰＳＴＲＥＡＭ（ＩＤ）の値と一致すると（ステップＳ８３６）、そのときの変数ＩＤの値が変数ＤＩＤに設定されるとともに、変数ＩＤに対応する符号長ＣＬ（ＩＤ）が変数ＤＣＬに設定される（ステップＳ８３７）。その後、変数ＩＤの値が「１」減算される（ステップＳ８３８）。
【０１０８】
この処理「ＶＬＤ＿ＤＥＣ」の戻り値として、符号番号を示す変数ＤＩＤおよび符号長を示す変数ＤＣＬの値が出力される（ステップＳ８２２参照）。
【０１０９】
図１３は、本発明の実施の形態における処理「ＳＨＯＷＢＩＴＳ」の処理手順例を示す図である。この処理「ＳＨＯＷＢＩＴＳ」のオペランドとしては、変数ｌｅｎｇｔｈが用いられる。変数ｌｅｎｇｔｈは符号バッファ２８１から読み出すビット数を示す変数である。
【０１１０】
まず、ビット数を計数するカウンタｉおよび読み出されたストリームデータを保持する変数ｒｅｔ＿ｂｉｔｓがそれぞれ「０」にリセットされる（ステップＳ８５１）。そして、カウンタｉを「１」ずつ増加させながら（ステップＳ８５４）、カウンタｉが変数ｌｅｎｇｔｈの値よりも小さい間（ステップＳ８５２）、以下の処理を繰り返す。すなわち、符号バッファ２８１からストリームデータの第（ｔ＋ｉ）ビット目が読み出されるとともに、変数ｒｅｔ＿ｂｉｔｓを１ビット左シフトさせて空いた最下位ビットにその読み出されたストリームデータが補填される（ステップＳ８５３）。なお、符号バッファ２８１におけるストリームデータの先頭データは第０ビットとする。
【０１１１】
この処理「ＳＨＯＷＢＩＴＳ」の戻り値として、変数ｒｅｔ＿ｂｉｔｓの値が出力される（ステップＳ８３１参照）。
【０１１２】
図１４は、本発明の実施の形態における処理「ＶＬＤ＿ＣＯＮＦＩＧ」の処理手順例を示す図である。この処理「ＶＬＤ＿ＣＯＮＦＩＧ」のオペランドとしては、変数ＶＬＤＣＴＸが用いられる。変数ＶＬＤＣＴＸは、構成情報のうち符号語検出器３２１の構成を示す情報である。
【０１１３】
まず、変数ＶＬＤＣＴＸの値が、Ｄ（１６）〜Ｄ（１０）、Ｄ（８）〜Ｄ（２）、ＣＬ（９）、ＣＬ（１）、ＣＬ（０）、ＧＰ（１３）、ＧＣ（１３）、ＧＰ（９）、ＧＣ（９）、ＧＰ（５）、ＧＣ（５）、ＧＰ（０）、ＧＣ（０）、ＵＣ（１６）〜ＵＣ（０）の各変数に設定される（ステップＳ８４１）。これは、図５の構成情報を、変数として展開することに相当する。変数Ｄは差分を示す変数である。変数ＣＬは符号長を示す変数である。変数ＧＰ、ＧＣ、ＵＣは、それぞれ図４により説明した符号語を示す変数である。
【０１１４】
そして、変数ＣＬ（０）、ＣＬ（１）およびＣＬ（９）には「１」が加算される（ステップＳ８４２）。構成情報においては記憶領域を短縮するために、（符号長−１）の形式で保持しているからである。また、それ以外の変数ＣＬには差分を考慮して変数Ｄが加算される（ステップＳ８４３）。構成情報においては記憶領域を短縮するために、第０、１および９番目以外の符号長としては差分のみを保持しているからである。これにより、差分から符号長が復元されることになる。
【０１１５】
また、変数ＧＰおよび変数ＧＣには、グループ毎に共通の値が設定される（ステップＳ８４４）。構成情報においては記憶領域を短縮するために、変数ＧＰおよび変数ＧＣについてはグループを代表する値のみを保持しているからである。
【０１１６】
その後、符号番号を示すカウンタＩＤが「０」にリセットされた後に（ステップＳ８４５）、カウンタＩＤが「１」ずつ加算されて（ステップＳ８４９）、カウンタＩＤが「１６」以下である間（ステップＳ８４６）、以下の処理が行われる。すなわち、符号語を示す変数ＣＷ（ＩＤ）において、ＧＰ（ＩＤ）が「１」であればＭＳＢ側に「０ｘｆｆｃ０」が設定され、ＧＰ（ＩＤ）が「０」であればＭＳＢ側に「０」が設定される。これにより、ＧＰ（ＩＤ）から連続するビット値が復元される。また、ＧＣ（ＩＤ）が４ビット左シフトされて空いた下位４ビットの位置にＵＣ（ＩＤ）が設定されて、変数ＣＷ（ＩＤ）に加算される（ステップＳ８４７）。また、「１６」から変数ＣＬ（ＩＤ）を減じた値の示す回数分、変数ＣＷ（ＩＤ）が左シフトされ、１６ビット幅のデータとして変数ＣＭＰＣＯＤＥ（ＩＤ）に設定される（ステップＳ８４８）。また、「１６」から変数ＣＬ（ＩＤ）を減じた値の示す回数分、「０ｘｆｆｆｆ」（「０ｘ」以降の数字は１６進数を表す。以下同様）が左シフトされ、１６ビット幅のデータとして変数ＣＭＰＭＡＳＫ（ＩＤ）に設定される（ステップＳ８４８）。
【０１１７】
図１５は、本発明の実施の形態における処理「ＶＬＤ＿ＳＨＯＷ」の処理手順例を示す図である。この処理「ＶＬＤ＿ＳＨＯＷ」のオペランドとしては、変数ｒｄと、変数ｂａｓｅと、変数ｏｆｆｓｅｔと、変数ｅｘｃｅｐｔが用いられる。変数ｒｄは、汎用レジスタファイル２２０のアドレスを示すためのパラメータである。変数ｂａｓｅは、復号情報テーブルのベースアドレスを示すためのパラメータである。変数ｏｆｆｓｅｔは、復号情報テーブルにおけるオフセット値を示すためのパラメータである。変数ｅｘｃｅｐｔは、符号語の一致が検出されなかった場合の復号情報テーブル内の相対位置を示すために用いられるパラメータである。
【０１１８】
まず、変数ｆｌａｇ＿ｃａｓｃａｄｅの値が「Ｙｅｓ」かつ変数ｉｄｘ＿ｖａｌｉｄの値が「Ｙｅｓ」であれば（ステップＳ９１１）、ステップＳ９１２乃至Ｓ９１５の処理がスキップされる。
【０１１９】
変数ＩＤがＥＩＤであれば（ステップＳ９１２）、変数ｖ＿ｉｄｘには変数ｅｘｃｅｐｔの値が設定されるとともに、変数ｉｄｘ＿ｖａｌｉｄには「Ｎｏ」が設定される（ステップＳ９１４）。一方、変数ＩＤがＥＩＤでなければ（ステップＳ９１２）、変数ｖ＿ｉｄｘには変数ＩＤの値に変数ｏｆｆｓｅｔの値を加算した値が設定されるとともに、変数ｉｄｘ＿ｖａｌｉｄには「Ｙｅｓ」が設定される（ステップＳ９１３）。
【０１２０】
また、変数ｖ＿ｉｄｘを「４」倍した値に変数ｂａｓｅの値を加算した値が、変数ａｄｄｒｅｓｓに設定される（ステップＳ９１５）。すなわち、変数ａｄｄｒｅｓｓには、復号情報テーブルの符号語に対応するメモリ１４０上のアドレス（テーブルアドレス）が保持される。
【０１２１】
そして、変数ｇｅｔ＿ｌｅｎに変数ｖ＿ｌｅｎの値が設定されるとともに、汎用レジスタファイル２２０のうちアドレスｒｄの示すレジスタに変数ａｄｄｒｅｓｓの値が設定される（ステップＳ９１６）。
【０１２２】
図１６は、本発明の実施の形態における処理「ＶＬＤ＿ＳＨＯＷ＿Ｓ」の処理手順例を示す図である。この処理「ＶＬＤ＿ＳＨＯＷ＿Ｓ」のオペランドとしては、処理「ＶＬＤ＿ＳＨＯＷ」と同様に、変数ｒｄと、変数ｂａｓｅと、変数ｏｆｆｓｅｔと、変数ｅｘｃｅｐｔが用いられる。
【０１２３】
まず、変数ｆｌａｇ＿ｃａｓｃａｄｅの値が「Ｙｅｓ」かつ変数ｉｄｘ＿ｖａｌｉｄの値が「Ｙｅｓ」であれば（ステップＳ９２１）、ステップＳ９２２乃至Ｓ９２５の処理がスキップされる。
【０１２４】
変数ＩＤがＥＩＤであれば（ステップＳ９２２）、変数ｖ＿ｉｄｘには変数ｅｘｃｅｐｔの値が設定されるとともに、変数ｉｄｘ＿ｖａｌｉｄには「Ｎｏ」が設定される（ステップＳ９２４）。一方、変数ＩＤがＥＩＤでなければ（ステップＳ９２２）、変数ｖ＿ｉｄｘには変数ＩＤの値に変数ｏｆｆｓｅｔの値を加算した値が設定されるとともに、変数ｉｄｘ＿ｖａｌｉｄには「Ｙｅｓ」が設定される（ステップＳ９２３）。ここまでの処理は、処理「ＶＬＤ＿ＳＨＯＷ」と同様である。
【０１２５】
また、変数ｖ＿ｉｄｘを１ビット左シフトして空いた下位１ビットにおいて変数ｘｂｉｔの下位１ビットを設定したものを「４」倍して、変数ｂａｓｅの値を加算した値が、変数ａｄｄｒｅｓｓに設定される（ステップＳ９２５）。すなわち、変数ａｄｄｒｅｓｓには、１ビット読み進めた際の、復号情報テーブルの符号語に対応するメモリ１４０上のアドレス（テーブルアドレス）が保持される。
【０１２６】
そして、変数ｖ＿ｌｅｎに「１」を加算した値が変数ｇｅｔ＿ｌｅｎに設定されるとともに、汎用レジスタファイル２２０のうちアドレスｒｄの示すレジスタに変数ａｄｄｒｅｓｓの値が設定される（ステップＳ９２６）。
【０１２７】
図１７は、本発明の実施の形態における処理「ＶＬＤ＿ＳＨＯＷ＿ＳＳ」の処理手順例を示す図である。この処理「ＶＬＤ＿ＳＨＯＷ＿ＳＳ」のオペランドとしては、処理「ＶＬＤ＿ＳＨＯＷ」と同様に、変数ｒｄと、変数ｂａｓｅと、変数ｏｆｆｓｅｔと、変数ｅｘｃｅｐｔが用いられる。
【０１２８】
まず、変数ｆｌａｇ＿ｃａｓｃａｄｅの値が「Ｙｅｓ」かつ変数ｉｄｘ＿ｖａｌｉｄの値が「Ｙｅｓ」であれば（ステップＳ９３１）、ステップＳ９３２乃至Ｓ９３５の処理がスキップされる。
【０１２９】
変数ＩＤがＥＩＤであれば（ステップＳ９３２）、変数ｖ＿ｉｄｘには変数ｅｘｃｅｐｔの値が設定されるとともに、変数ｉｄｘ＿ｖａｌｉｄには「Ｎｏ」が設定される（ステップＳ９３４）。一方、変数ＩＤがＥＩＤでなければ（ステップＳ９３２）、変数ｖ＿ｉｄｘには変数ＩＤの値に変数ｏｆｆｓｅｔの値を加算した値が設定されるとともに、変数ｉｄｘ＿ｖａｌｉｄには「Ｙｅｓ」が設定される（ステップＳ９３３）。ここまでの処理は、処理「ＶＬＤ＿ＳＨＯＷ」と同様である。
【０１３０】
また、変数ｖ＿ｉｄｘを２ビット左シフトして空いた下位２ビットにおいて変数ｘｂｉｔの下位２ビットを設定したものを「４」倍して、変数ｂａｓｅの値を加算した値が、変数ａｄｄｒｅｓｓに設定される（ステップＳ９３５）。すなわち、変数ａｄｄｒｅｓｓには、２ビット読み進めた際の、復号情報テーブルの符号語に対応するメモリ１４０上のアドレス（テーブルアドレス）が保持される。
【０１３１】
そして、変数ｖ＿ｌｅｎに「２」を加算した値が変数ｇｅｔ＿ｌｅｎに設定されるとともに、汎用レジスタファイル２２０のうちアドレスｒｄの示すレジスタに変数ａｄｄｒｅｓｓの値が設定される（ステップＳ９３６）。
【０１３２】
図１８は、本発明の実施の形態における処理「ＶＬＤ＿ＧＥＴ」の処理手順例を示す図である。この処理「ＶＬＤ＿ＧＥＴ」のオペランドとしては、処理「ＶＬＤ＿ＳＨＯＷ」と同様に、変数ｒｄと、変数ｂａｓｅと、変数ｏｆｆｓｅｔと、変数ｅｘｃｅｐｔが用いられる。
【０１３３】
この処理「ＶＬＤ＿ＧＥＴ」では、図１５により説明した処理「ＶＬＤ＿ＳＨＯＷ」が実行されるとともに（ステップＳ９４１）、処理「ＧＥＴＢＩＴＳ」が実行される（ステップＳ９４２）。
【０１３４】
図１９は、本発明の実施の形態における処理「ＧＥＴＢＩＴＳ」の処理手順例を示す図である。この処理「ＧＥＴＢＩＴＳ」のオペランドとしては、変数ｌｅｎｇｔｈが用いられる。変数ｌｅｎｇｔｈは符号長を示すためのパラメータである。
【０１３５】
この処理「ＧＥＴＢＩＴＳ」では、図１３により説明した処理「ＳＨＯＷＢＩＴＳ」が実行されるとともに（ステップＳ８６１）、ストリームデータの読出し位置ｔに変数ｌｅｎｇｔｈの値が加算される（ステップＳ８６２）。すなわち、処理「ＳＨＯＷＢＩＴＳ」によってストリームデータが読み出されるだけでなく、読出し位置の更新も行われることになる。
【０１３６】
図２０は、本発明の実施の形態における処理「ＶＬＤ＿ＧＥＴ＿Ｓ」の処理手順例を示す図である。この処理「ＶＬＤ＿ＧＥＴ＿Ｓ」のオペランドとしては、処理「ＶＬＤ＿ＳＨＯＷ」と同様に、変数ｒｄと、変数ｂａｓｅと、変数ｏｆｆｓｅｔと、変数ｅｘｃｅｐｔが用いられる。
【０１３７】
この処理「ＶＬＤ＿ＧＥＴ＿Ｓ」では、図１６により説明した処理「ＶＬＤ＿ＳＨＯＷ＿Ｓ」が実行されるとともに（ステップＳ９５１）、処理「ＧＥＴＢＩＴＳ」が実行される（ステップＳ９５２）。
【０１３８】
図２１は、本発明の実施の形態における処理「ＶＬＤ＿ＧＥＴ＿ＳＳ」の処理手順例を示す図である。この処理「ＶＬＤ＿ＧＥＴ＿ＳＳ」のオペランドとしては、処理「ＶＬＤ＿ＳＨＯＷ」と同様に、変数ｒｄと、変数ｂａｓｅと、変数ｏｆｆｓｅｔと、変数ｅｘｃｅｐｔが用いられる。
【０１３９】
この処理「ＶＬＤ＿ＧＥＴ＿ＳＳ」では、図１７により説明した処理「ＶＬＤ＿ＳＨＯＷ＿ＳＳ」が実行されるとともに（ステップＳ９６１）、処理「ＧＥＴＢＩＴＳ」が実行される（ステップＳ９６２）。
【０１４０】
図２２は、本発明の実施の形態における命令セットを想定したＣ言語コンパイラのビルトイン関数の一例を示す図である。これらのビルトイン関数は、レジスタの自動割り当てがなされた後に、対応するアセンブラ命令に置き換えられる。また、条件コードレジスタ２６０に基づいて分岐するｉｆ文に対しては、ｖｌｄ＿ｂｒ命令が生成されることを想定している。プログラム中のｉｎｔ型変数ｃｏｎｄ０およびｃｏｎｄ２は、条件コードレジスタ２６０のＣＣ［０］とＣＣ［２］であると、コンパイラが自動的に解釈することを想定する。
【０１４１】
関数「void vld_baseaddr(int * addr)」は、変数ａｄｄｒを汎用レジスタファイル２２０のＲ［ｒｓ］に格納した後に、命令「vld_baseaddr rs」を実行するものである。
【０１４２】
関数「int vld_decode(int ctx)」は、変数ｃｔｘの示すレジスタ番号をｖｒｓとして、命令「vld_decode cc,vrs」を実行するものである。この関数は、ＣＣＲ［ｃｃ］およびＣＣＲ［ｃｃ＋１］を戻り値として返す。
【０１４３】
関数「int vld_decode_cascade(int ctx)」は、変数ｃｔｘの示すレジスタ番号をｖｒｓとして命令「vld_decode_cascade cc,vrs」を実行するものである。この関数は、ＣＣＲ［ｃｃ］およびＣＣＲ［ｃｃ＋１］を戻り値として返す。
【０１４４】
関数「int vld_get(int offset, int except)」は、命令「vld_get rd,offset,except」を実行するものである。この関数は、汎用レジスタファイル２２０のＲ［ｒｄ］の値を戻り値として返す。
【０１４５】
関数「int vld_get_s(int offset, int except)」は、命令「vld_get_s rd,offset,except」を実行するものである。この関数は、汎用レジスタファイル２２０のＲ［ｒｄ］の値を戻り値として返す。
【０１４６】
関数「int vld_show(int offset, int except)」は、命令「vld_show rd,offset,except」を実行するものである。この関数は、汎用レジスタファイル２２０のＲ［ｒｄ］の値を戻り値として返す。
【０１４７】
関数「int vld_show_s(int offset, int except)」は、命令「vld_show_s rd,offset,except」を実行するものである。この関数は、汎用レジスタファイル２２０のＲ［ｒｄ］の値を戻り値として返す。
【０１４８】
関数「int showbits(int len)」は、変数ｌｅｎを汎用レジスタファイル２２０のＲ［ｒｓ］に格納した後に、命令「showbits rd,rs」を実行するものである。この関数は、汎用レジスタファイル２２０のＲ［ｒｄ］の値を戻り値として返す。
【０１４９】
関数「int getbits(int len)」は、変数ｌｅｎを汎用レジスタファイル２２０のＲ［ｒｓ］に格納した後に、命令「getbits rd,rs」を実行するものである。この関数は、汎用レジスタファイル２２０のＲ［ｒｄ］の値を戻り値として返す。
【０１５０】
関数「void load_v(int ctx, int * addr)」は、変数ｃｔｘの示すレジスタ番号をｖｒｄとして、（ｏｆｆｓｅｔ＋Ｒ［ｒｓ］）の値の値が変数ａｄｄｒの値と等しくなるように変数ｏｆｆｓｅｔと汎用レジスタファイル２２０のＲ［ｒｓ］を設定して、命令「load_v vrd,offset(rs)」を実行するものである。
【０１５１】
関数「void store_v(int ctx, int * addr)」は、変数ｃｔｘの示すレジスタ番号をｖｒｓとして、（ｏｆｆｓｅｔ＋Ｒ［ｒｓ］）が変数ａｄｄｒの値と等しくなるように変数ｏｆｆｓｅｔと汎用レジスタファイル２２０のＲ［ｒｓ］を設定して、命令「store_v vrs,offset(rs)」を実行するものである。
【０１５２】
これらビルトイン関数を利用することにより、図９に示した機械語命令を意識したプログラミングをＣ言語において行うことが可能となる。
【０１５３】
図２３は、本発明の実施の形態における復号対象となる符号の一例として、ＭＰＥＧ規格において定義されたＭＢＡＩ（MacroBlock Address Increment）の符号表を示す図である。ＭＢＡＩは、マクロブロックの位置として、１つ前のマクロブロックとの絶対アドレスの差（インクリメント値）を表すものである。この符号表には、ＭＢＡＩを表す復号情報とその符号語との対応関係が示されている。ただし、ＭＳ（Macroblock Stuffing）とＭＥ（Macroblock Escape）は、それぞれ「３４」と「３５」という復号情報に割り当てられる。
【０１５４】
図２４は、図２３の符号表を表現する符号木の一例を示す図である。根（ｒｏｏｔ）は長さ「０」の空の記号列であり、根から始まり、長さが１つ増える毎に２進記号｛０，１｝が増えるため、その２通りを子のノード（ｎｏｄｅ）として増やす。符号表によっては子が一つのノードもある。そして、符号表の符号語と等しい記号列は、子ノードがない葉（ｌｅａｆ）となる。ここで、ノードは円形で表し、葉は特別に七角形で表すものとする。このように符号表は符号木で表現することができる。
【０１５５】
ここで、２進木を表現するための情報量はどの程度必要であるかを考える。全てのノードについて、そのノードが子を持つかどうか不明であるとき、その確率は「０．５」である。したがって、「ノードが子を持つかどうか」の情報は、「−ｌｏｇ（０．５）／ｌｏｇ２＝１」ビットでエントロピーに等しい最小の表現ができる。たとえば、ノードが子を持てば「１」を、葉であれば「０」を符号として割り当てることとする。根ノードから順番にその子ノードの符号化を行っていく。「１」であれば、左の枝の子ノードの子ノードを符号化していく。左の枝の子ノード以下の部分木すべての符号化が終われれば、右の枝の子ノード以下の部分木を符号化する。つまり、木を左の枝から順番に左手探索して全てのノードを順番に符号化することになる。
【０１５６】
そのような考え方により、図２４の符号木を何ビットで表現できるかを検討する。同図には子ノードが１つしかないノードがあるため、そのような場合にはもう１つの枝の子ノードとして葉を補うことによって、符号化することとする。ノードと葉の数は７５個で、６個の葉を補うため、計８１ビットで表現できることになる。つまり、理想的には図２３の符号表は、８１ビット程度で定義することができるということを意味する。
【０１５７】
ところが、単純に固定長の符号で、符号値と符号長を表現すると、符号値は１１ビット、符号長は最大の１１を表すのに４ビット必要になるため、１つの符号語に対して１５ビットが必要になる。符号語が３５個あるため、１５×３５＝５２５ビットを要することになる。一方、上述の８１ビットの表現では、木の全てを復号しないと符号語が分からず、また、木の復号処理は複雑なためハードウェア化しても高速に処理することは困難である。その点、５２５ビットの表現では、符号語は符号表を表すテーブルを参照することにより速やかに判明するため、そのようなテーブルを探索するだけで済む。
【０１５８】
これに対し、図５に示した構成情報の表現では、構成ＶＬＤＣＴＸは１１０ビットである。本発明はハードウェア化しても高速に処理することが可能であるため、１つの構成情報で図２３の大半を表現できるのであれば無駄が少ない表現ができたと考えることができる。
【０１５９】
図２５は、図２３の符号表により定義される符号を復号する際の、構成情報と復号符号値、復号情報および符号語との対応関係の一例を示す図である。図２５（ａ）が構成情報であり、復号処理ＲＶＬＤにおける処理対象となる。図２５（ａ）の構成情報で復号されなかった符号語は、ノード（ＣＯＤＥＮＯＤＥ）として接頭語のみが復号されて、残りの部分は図２５（ｂ）乃至（ｄ）により処理される。すなわち、復号符号番号が「７」の場合には、図２５（ｂ）により、復号情報「１６」乃至「２５」の何れであるかが決定される。また、復号符号番号が「１０」の場合には、図２５（ｃ）により、復号情報「２６」乃至「３３」の何れであるかが決定される。また、復号符号番号が「３２」の場合には、図２５（ｄ）により、復号情報「３４」または「３５」の何れであるかが決定される。
【０１６０】
図２６は、図２５（ａ）に対応する符号木の一例である。図２７は、図２５（ｂ）および（ｄ）に対応する符号木の一例である。図２８は、図２５（ｃ）に対応する符号木の一例である。
【０１６１】
図２９は、図２３の符号表により定義される符号を復号するＣ言語プログラムの一例である。このプログラム例では、図２５に示す１つの構成情報で大半の木を表現し、残りを単純な処理で復号する。
【０１６２】
このプログラム例において、関数ｖｌｄが、図２３の符号表の符号語を復号するメインの関数である。この関数ｖｌｄは、葉（ＣＯＤＥＬＥＡＦ）に分類された場合には復号情報テーブルの値を返し、ノード（ＣＯＤＥＮＯＤＥ）または不一致（ＥＩＤ）に分類された場合には別途関数コールによって接尾語を復号する。「ｉｆ（ｃｏｎｄ０）」の部分において、ＣＣＭＡＰから生成された条件コードに基づいて分岐することによって葉（ＣＯＤＥＬＥＡＦ）か否かの判定を行う。この部分の機械語命令としては、分岐命令であるｖｌｄ＿ｂｒ命令が用いられる。
【０１６３】
関数ｄｅｃＥＩＤは、復号符号番号が「３２」の場合に、図２５（ｄ）によって復号を行う関数である。すなわち、関数ｄｅｃＥＩＤは、８ビット読み進めて、「０ｘ０ｆ」と一致すれば「３４」を関数値として返し、それ以外の場合には「３５」を関数値として返す。
【０１６４】
関数ｄｅｃ７は、復号符号番号が「７」の場合に、図２５（ｂ）によって復号を行う関数である。すなわち、「２５」から３ビットの接尾語の２倍を減算した上で、３ビットの接尾語が「０００」であれば２ビット読み進め、それ以外の場合には１ビット読み進めて、その読み進められた数をさらに減算する。その結果、関数ｄｅｃ７は、「１６」乃至「２５」の何れかを関数値として返す。
【０１６５】
関数ｄｅｃ１０は、復号符号番号が「１０」の場合に、図２５（ｃ）によって復号を行う関数である。すなわち、関数ｄｅｃ１０は、「３３」から３ビットの接尾語を減算した値を関数値として返す。
【０１６６】
変数ＶＣＴＸ０は、図５の構成情報が格納されるメモリ１４０上のアドレスを保持する変数である。なお、この変数ＶＣＴＸ０の値は、４つの定数Ｃ０、Ｃ１、Ｃ２およびＣ３により与えられる。
【０１６７】
変数ＶＬＤＴＢＬは、共用体として定義される変数であり、整数または関数のポインタを要素として有する配列ｖｌｄ＿ｔａｂｌｅ［１８］と同じメモリ領域に割り当てられる。配列ｖｌｄ＿ｔａｂｌｅ［１８］は、復号情報テーブルであり、図２５（ａ）の左から２番目の列の復号情報または関数のポインタを保持する。これにより、ノード（ＣＯＤＥＮＯＤＥ）または不一致（ＥＩＤ）に分類された場合には関数ｄｅｃＥＩＤ、ｄｅｃ７またはｄｅｃ１０が呼び出され、葉（ＣＯＤＥＬＥＡＦ）に分類された場合には復号情報（整数値）が関数値として出力される。
【０１６８】
関数ｖｌｄ＿ｂａｓｅａｄｄｒは、復号情報テーブルのベースアドレスを設定するビルトイン関数である。関数ｌｏａｄ＿ｖは、構成情報を構成情報レジスタファイル２７０に読み出すビルトイン関数である。
【０１６９】
関数ｖｌｄ＿ｄｅｃｏｄｅは、復号符号番号の決定および条件コード情報の生成を行うビルトイン関数である。変数ｃｏｎｄ０には、対応する復号符号番号ＩＤのＣＣＭＡＰ（ＩＤ）の値が関数値として出力される。
【０１７０】
関数ｖｌｄ＿ｇｅｔは、復号符号番号にオフセット値（この例の場合は「１」）を加算して復号情報テーブルにおけるアドレスを取得するとともに、符号長相当のストリームデータを読み進めるビルトイン関数である。変数ｔｂｌｐには、復号情報テーブルにおけるアドレス（ポインタ）が関数値として出力される。
【０１７１】
このように、簡単なプログラムと１つの構成情報によって、図２３の符号表の符号語を復号することができることがわかる。
【０１７２】
図３０は、図２３の符号表により定義される符号を復号する際の、構成情報と復号符号値、復号情報および符号語との対応関係の他の例を示す図である。この例では、図３０（ａ）および（ｃ）の２つの構成情報を用いて大半の木を表現し、残りの符号語の接尾語を全て同じビット数（１ビット）にするように工夫している。接尾語を全て同じ長さにすることにより後処理を共通化できるため、図２９の復号情報テーブルのように関数をテーブル化する必要はなく、単純な分岐処理で済ませることができる。
【０１７３】
図３０（ａ）は、通常の構成情報であり、ｖｌｄ＿ｄｅｃｏｄｅ命令を用いて処理される。図３０（ｃ）は、カスケード機能を想定した構成情報であり、ｖｌｄ＿ｄｅｃｏｄｅ＿ｃａｓｃａｄｅ命令を用いて処理される。この２つの構成情報により３４個のテーブルを連続してインデックスできるように、オフセットの設定が工夫されている。
【０１７４】
図３０（ｂ）、（ｄ）乃至（ｈ）は、ノード（ＣＯＤＥＮＯＤＥ）に分類された符号語と接尾語の対応関係を示すものである。復号符号番号が「１６」の場合には、図３０（ｂ）が用いられる。通常の構成情報において、復号符号番号が「１６」の場合には図３０（ｂ）が用いられる。カスケード機能を想定した構成情報において、復号符号番号が「０」の場合には図３０（ｄ）が用いられる。カスケード機能を想定した構成情報において、復号符号番号が「１」の場合には図３０（ｅ）が用いられる。カスケード機能を想定した構成情報において、復号符号番号が「２」の場合には図３０（ｆ）が用いられる。カスケード機能を想定した構成情報において、復号符号番号が「３」の場合には図３０（ｇ）が用いられる。カスケード機能を想定した構成情報において、復号符号番号が「４」の場合には図３０（ｈ）が用いられる。これらにおいては、残差符号長は全て「１」になっている。これは、構成情報を１つ多く使用することによりプログラムがより単純になる場合の、良い一例を示している。
【０１７５】
図３１は、図２３の符号表により定義される符号を復号するＣ言語プログラムの他の例である。このプログラム例では、図３０に示す２つの構成情報で大半の木を表現し、残りを単純な処理で復号する。
【０１７６】
変数ＶＣＴＸ０およびＶＣＴＸ１は、２つの構成情報が格納されるメモリ１４０上のアドレスをそれぞれ保持する変数である。なお、変数ＶＣＴＸ０の値は４つの定数Ｃ０、Ｃ１、Ｃ２およびＣ３により与えられ、変数ＶＣＴＸ１の値は４つの定数Ｃ４、Ｃ５、Ｃ６およびＣ７により与えられる。
【０１７７】
配列ｖｌｄ＿ｔａｂｌｅ［１７＋１７］は、復号情報テーブルであり、図３０（ａ）および（ｃ）の２つの復号情報をつなげるように工夫されている。
【０１７８】
関数ｖｌｄがメインの関数である点は図２９と同様である。この関数ｖｌｄでは、関数ｖｌｄ＿ｂａｓｅａｄｄｒによって復号情報テーブルのベースアドレスが設定され、２つの関数ｌｏａｄ＿ｖによって２つの構成情報が構成情報レジスタファイル２７０に読み出される。
【０１７９】
この例では、カスケード機能が用いられており、符号語検出器３２１の構成情報の内容が異なるものに変更された上で、連続して復号処理が行われている。１つ目の構成情報を用いて関数ｖｌｄ＿ｄｅｃｏｄｅが実行されて、変数ｃｏｎｄ０には対応する復号符号番号ＩＤのＣＣＭＡＰ（ＩＤ）の値が関数値として出力される。２つ目の構成情報を用いて関数ｖｌｄ＿ｄｅｃｏｄｅ＿ｃａｓｃａｄｅが実行されて、変数ｃｏｎｄ２には対応する復号符号番号ＩＤのＣＣＭＡＰ（ＩＤ）の値が関数値として出力される。「ｉｆ（ｃｏｎｄ１｜｜ｃｏｎｄ２）」は条件コードレジスタ２６０の２つのビットを使用して、２つのｖｌｄ＿ｂｒ命令によって処理される。
【０１８０】
すなわち、ＣＣＭＡＰが「０」の場合には復号情報が関数値として出力され、それ以外の場合にはさらに１ビット読み進められた接尾語を復号情報から減じた数が関数値として出力される。このように、残差符号の接尾語を工夫することにより、処理を単純化することが可能である。
【０１８１】
図３２は、本発明の実施の形態における復号対象となる符号の第２の例を示す図である。この例では、符号語が１６個で、最大符号長も６ビットであるため、図５の構成情報によりうまく表現でき、符号木の全体を１つの構成情報でカバーすることができる。固定長でテーブルを作った場合には、（６＋３）×１６＝１４４ビットとなる例である。
【０１８２】
図３３は、図３２の符号表を表現する符号木の一例を示す図である。この木を符号化すると、３０ビットで表現できる。
【０１８３】
図３４は、図３２の符号表により定義される符号を復号する際の、構成情報と復号符号値、復号情報および符号語との対応関係の一例を示す図である。この例では符号語が１６個であるため、符号語検出器３２１を１７個設けた場合には、１個分が余ってしまうことになる。そのため、復号符号番号が「１６」の符号語検出器３２１の構成は、それより優先順位の高い復号符号番号が「１５」の符号語検出器３２１と同じ構成にすることによって、復号符号番号が「１６」の符号語検出器３２１が選択されないようにしている。
【０１８４】
図３５は、図３２の符号表により定義される符号を復号するＣ言語プログラムの例である。この例では、符号語の数が少なく、全てを葉（ＣＯＤＥＬＥＡＦ）に分類することができるため、ＣＣＭＡＰも使用することなく、単純なプログラムにより実現することができる。
【０１８５】
図３６は、本発明の実施の形態における復号対象となる符号の第３の例を示す図である。この例においても符号語が１６個であるが、最大符号長は９ビットとなっている。符号木は図３７のようになり、これも３０ビットで表現できるが、固定長でテーブルを作った場合には、（９＋４）×１６＝２０８ビットとなる。図３２の符号表と比べて、同じビット数で符号化できていても、固定長ビットのテーブルでは４４％多くなってしまう。
【０１８６】
また、この例ではＭＳＢ側のビットにおいて「０」が連続するものと「１」が連続するものの両者が混ざっているため、ＧＰおよびＧＣをグループ毎に変えて対応することが有効になる。ただし、ＭＳＢ側の連続するビットを除いた残りの接尾語は最大７ビットであり、ＧＣが２ビット、ＵＣが４ビットの計６ビットでは足りないことになる。
【０１８７】
図３７は、図３６の符号表を表現する符号木の一例を示す図である。
【０１８８】
図３８は、図３６の符号表により定義される符号を復号する際の、構成情報と復号符号値、復号情報および符号語との対応関係の一例を示す図である。図３８（ａ）が構成情報であり、復号処理ＲＶＬＤにおける処理対象となる。図３８（ａ）の構成情報で復号されなかった符号語は、ノード（ＣＯＤＥＮＯＤＥ）として接頭語のみが復号されて、接尾語は図３８（ｂ）または（ｃ）により処理される。すなわち、復号符号番号が「１１」の場合には、図３８（ｂ）により、復号情報「１１」または「１３」の何れであるかが決定される。また、復号符号番号が「１４」の場合には、図３８（ｃ）により、復号情報「９」または「１０」の何れであるかが決定される。ノード（ＣＯＤＥＮＯＤＥ）に割り当てられた部分は、図３７において四角形により囲まれている。
【０１８９】
この構成情報では、２つをノード（ＣＯＤＥＮＯＤＥ）にしたことにより、符号語検出器３２１が３個余ってしまうため、復号符号番号「１２」、「１５」および「１６」は優先順位を使ったダミーの設定にしている。
【０１９０】
図３９は、図３６の符号表により定義される符号を復号するＣ言語プログラムの例である。このプログラムは、図３８の１つの構成情報と２つの関数によって復号処理を行う。図３６の符号表による符号では、ＧＣとＵＣのビット数が足りないため、符号語の数が符号語検出器３２１の数より少ないにもかかわらず、この構成情報によって木全体を表現することができない。そのため、この例では、ノード（ＣＯＤＥＮＯＤＥ）に分類したものを別の関数で別途処理している。別の関数で処理するか否かについて、ＣＣＭＡＰを使って分岐する処理を行っているのが、「ｉｆ（ｃｏｎｄ０）」の部分である。
【０１９１】
図４０は、本発明の実施の形態における復号対象となる符号の第４の例を示す図である。この例では、復号情報が「０」であるものを除いた全てにおいて、最後の１ビットが復号情報の正負を表わしている。木を符号化すると１３０ビットであり、固定長テーブルで表すと（１３＋４）×６５＝１１０５ビットである。
【０１９２】
図４１は、図４０の符号表により定義される符号を復号する際の、構成情報と復号符号値、復号情報および符号語との対応関係の一例を示す図である。図４１（ａ）が通常の構成情報であり、図４１（ｂ）がカスケード機能を想定した構成情報である。この例では、接尾語が１ビットである符号語の接頭語が多数を占めるように構成情報が工夫されており、ｖｌｄ＿ｓｈｏｗ＿ｓ命令やｖｌｄ＿ｇｅｔ＿ｓ命令によって効率良く処理できるようになっている。この構成情報において、「ＣＯＤＥＮＯＤＥ１」は接尾語が１ビットであり、「ＣＯＤＥＮＯＤＥ２」は接尾語が２ビットのものを意味している。
【０１９３】
図４２および図４３は、図４０の符号表を表現する符号木の一例を示す図である。図４２が、図４１（ａ）の構成情報によってカバーされる符号語の符号木である。カバーできなかったものは、同図において三角形で表している４つのノードｃａｓｃａｄｅ１、ｃａｓｃａｄｅ２、ｃａｓｃａｄｅ３およびｃａｓｃａｄｅ４である。ｃａｓｃａｄｅ１、ｃａｓｃａｄｅ２、ｃａｓｃａｄｅ３、ｃａｓｃａｄｅ４は、図４３の４つの符号木が対応しており、図４１（ｂ）の構成情報でほぼ全てがカバーされている。
【０１９４】
図４４は、図４０の符号表により定義される符号を復号するＣ言語プログラムの例である。このプログラムでは、カスケード機能により２つの構成情報用いるとともに、構成情報ごとにＣＣＭＡＰの使い方を変えて、「ｉｆ（ｃｏｎｄ０）」と「ｉｆ（ｃｏｎｄ２）」のような分岐のネストによって処理を実現している。上述のように、接尾語が１ビットである符号語の接頭語が多数を占めるように構成情報が工夫されているが、１つだけ接尾語が２ビットであるものがあるため、それをｉｆ（ｃｏｎｄ２）で別に処理するように分岐している。
【０１９５】
ＣＯＤＥＮＯＤＥ２に分類されているのは、図４３のｃａｓｃａｄｅ３から始まる符号木であり、四角形で囲まれた部分が構成情報に含まれない接尾語に対応する。その接尾語は２ビットであるため、ｖｌｄ＿ｇｅｔ＿ｓ命令およびｇｅｔｂｉｔｓ命令によって１ビットずつ処理している。
【０１９６】
図４２と図４３において四角形で囲まれたもののうち、ｃａｓｃａｄｅ３以外のものは接尾語が１ビットのものに対応しており、ｖｌｄ＿ｓｈｏｗ＿ｓ命令またはｖｌｄ＿ｇｅｔ＿ｓ命令によって処理される。ｖｌｄ＿ｓｈｏｗ＿ｓ命令およびｖｌｄ＿ｇｅｔ＿ｓ命令があるため、高さの大きな符号木にも十分対応できる。他のプログラムと比べても、分岐の数もそれほど増えず、あまり複雑な処理もないため、より少ないサイクル数で処理できることが期待できる。２つの構成情報で大半をカバーしているのにもかかわらず、１７個の４倍近い６５個の符号語に対応できている。
【０１９７】
このように、本発明の実施の形態によれば、複数の符号語検出器３２１を備える復号装置において、それぞれの符号語検出器３１２の構成情報を圧縮して構成情報レジスタファイル２７０に保持するとともに、平均的な復号時間を短縮することができる。
【０１９８】
本発明の実施の形態では、１００ビット程度の少ない構成情報で符号木を表現するが、復号処理が複雑にならずにプログラムをより効率良く記述することができる。ＭＰＥＧ１、ＭＰＥＧ２、ＭＰＥＧ４、Ｈ．２６３、ＶＣ−１など動画圧縮規格では、１７個以下の符号語で構成される符号表が少なくないため、そのような小さな符号表のほとんどが１７個の符号語検出器３２１に基づいて１、２命令（ｖｌｄ＿ｄｅｃｏｄｅ命令やｖｌｄ＿ｓｈｏｗ命令など）で処理できるようになる。符号語検出器３２１は、シフタ、論理積演算器、比較器、加算器などの単純な演算器を少数組み合わせた回路で実現できるため、高周波数でも低レイテンシの回路で実装できる。
【０１９９】
本発明の実施の形態では、符号語が沢山ある符号表や、符号木全体を１つの構成情報ではうまく表現できない符号表を扱う場合には、カスケード機能で複数の構成情報を用いる方法や、接頭語の符号木を１つの構成情報で処理し、接尾語の処理はＣＣＭＡＰによる分岐を使って対応するなどの方法で対応することができる。その上、プログラムも簡素なまま実現することができる。出現頻度が高いために符号長が短く設計された符号語を接頭語の符号木の葉に入れることで、符号長の短い符号語は接尾語の処理をしなくてよいようにすると、符号長の短い符号語の復号処理サイクル数を符号長の長い符号語の復号処理サイクル数よりも小さくすることができる。これにより、平均的な処理サイクルを少なくすることができる。
【０２００】
本発明の実施の形態では、図２９のＣ言語プログラムのように共用体ｕｎｉｏｎを使った復号情報テーブルを用いることによって、後処理のための関数ポインタと後処理の要らない復号情報の整数値とを混在して記述することができる。この復号情報テーブルの参照の際には、ＣＣＭＡＰを用いることにより、関数コールかデータ参照かを判定することができる。これにより、プログラムを非常に簡潔に記述することができる。復号情報テーブルにおいても、関数ポインタと整数値を別々に保持する必要がなくなる。ｖｌｄ＿ｇｅｔ系の命令において復号情報テーブルのベースアドレスとインデックスの加算を行うことによって、汎用命令の加算命令、シフト命令、ロード命令を減らすことができる。また、カスケード機能によって分岐処理を少なくできる。
【０２０１】
符号長を短いものからの順番に割り当てることを想定して、構成情報の符号語の長さを相対的な差によって定義するようにすれば相対的な差は短いビット数で表現することができる。これを利用することにより、本発明の実施の形態では、構成情報をより小さく表現することができる。
【０２０２】
本発明の実施の形態では、グループ分けをして上位ビットをグループで共通に定義することで、構成情報をより小さく表現することができる。
【０２０３】
本発明の実施の形態では、汎用のプロセッサに僅かな回路と命令の追加によって、プロセッサに元々備えられている汎用の命令やデータキャッシュをうまく利用しながら復号処理を効率良く処理することができる。また、再構成が可能なことから複数のコーデックへの対応も構成情報とプログラムの変更で容易に実現することができる。
【０２０４】
なお、本発明の実施の形態は本発明を具現化するための一例を示したものであり、以下に示すように特許請求の範囲における発明特定事項とそれぞれ対応関係を有するが、これに限定されるものではなく本発明の要旨を逸脱しない範囲において種々の変形を施すことができる。
【０２０５】
また、本発明の実施の形態では、復号ユニット２９０を備えるプロセッサ１２０について説明したが、本発明はこれに限定されるものではなく、復号ユニット２９０の処理をソフトウェアにより実現してもよい。
【０２０６】
また、本発明の実施の形態において説明した処理手順は、これら一連の手順を有する方法として捉えてもよく、また、これら一連の手順をコンピュータに実行させるためのプログラム乃至そのプログラムを記憶する記録媒体として捉えてもよい。このような記録媒体として、例えば、ＣＤ（Compact Disc）、ＭＤ（MiniDisc）、ＤＶＤ（Digital Versatile Disk）、メモリカード（memory card）、ブルーレイディスク（Blu-ray Disc（登録商標））等の記録媒体を用いることができる。
【図面の簡単な説明】
【０２０７】
【図１】本発明の実施の形態における復号装置の一構成例を示す図である。
【図２】本発明の実施の形態における復号ユニット２９０とその周辺の機能構成例を示す図である。
【図３】本発明の実施の形態における復号情報テーブルの一構成例を示す図である。
【図４】本発明の実施の形態における符号値ＣＷの形式例を示す図である。
【図５】本発明の実施の形態における構成情報の一例を示す図である。
【図６】本発明の実施の形態における符号語検出器３２１の構成例を示す図である。
【図７】本発明の実施の形態における符号語検出器３２１の各々における符号語レジスタ３０１の構成情報の例を示す図である。
【図８】本発明の実施の形態における符号間の関係を示す例である。
【図９】本発明の実施の形態におけるプロセッサ１２０の命令セットのうち可変長符号を復号するための命令を抜粋したものである。
【図１０】本発明の実施の形態における処理「ＩＮＩＴ」の処理手順例を示す図である。
【図１１】本発明の実施の形態における処理「ＶＬＤ＿ＤＥＣＯＤＥ」の処理手順例を示す図である。
【図１２】本発明の実施の形態における処理「ＶＬＤ＿ＤＥＣ」の処理手順例を示す図である。
【図１３】本発明の実施の形態における処理「ＳＨＯＷＢＩＴＳ」の処理手順例を示す図である。
【図１４】本発明の実施の形態における処理「ＶＬＤ＿ＣＯＮＦＩＧ」の処理手順例を示す図である。
【図１５】本発明の実施の形態における処理「ＶＬＤ＿ＳＨＯＷ」の処理手順例を示す図である。
【図１６】本発明の実施の形態における処理「ＶＬＤ＿ＳＨＯＷ＿Ｓ」の処理手順例を示す図である。
【図１７】本発明の実施の形態における処理「ＶＬＤ＿ＳＨＯＷ＿ＳＳ」の処理手順例を示す図である。
【図１８】本発明の実施の形態における処理「ＶＬＤ＿ＧＥＴ」の処理手順例を示す図である。
【図１９】本発明の実施の形態における処理「ＧＥＴＢＩＴＳ」の処理手順例を示す図である。
【図２０】本発明の実施の形態における処理「ＶＬＤ＿ＧＥＴ＿Ｓ」の処理手順例を示す図である。
【図２１】本発明の実施の形態における処理「ＶＬＤ＿ＧＥＴ＿ＳＳ」の処理手順例を示す図である。
【図２２】本発明の実施の形態における命令セットを想定したＣ言語コンパイラのビルトイン関数の一例を示す図である。
【図２３】本発明の実施の形態における復号対象となる符号の一例として、ＭＰＥＧ規格において定義されたＭＢＡＩの符号表を示す図である。
【図２４】図２３の符号表を表現する符号木の一例を示す図である。
【図２５】図２３の符号表により定義される符号を復号する際の、構成情報と復号符号値、復号情報および符号語との対応関係の一例を示す図である。
【図２６】図２５（ａ）に対応する符号木の一例である。
【図２７】図２５（ｂ）および（ｄ）に対応する符号木の一例である。
【図２８】図２５（ｃ）に対応する符号木の一例である。
【図２９】図２３の符号表により定義される符号を復号するＣ言語プログラムの一例である。
【図３０】図２３の符号表により定義される符号を復号する際の、構成情報と復号符号値、復号情報および符号語との対応関係の他の例を示す図である。
【図３１】図２３の符号表により定義される符号を復号するＣ言語プログラムの他の例である。
【図３２】本発明の実施の形態における復号対象となる符号の第２の例を示す図である。
【図３３】図３２の符号表を表現する符号木の一例を示す図である。
【図３４】図３２の符号表により定義される符号を復号する際の、構成情報と復号符号値、復号情報および符号語との対応関係の一例を示す図である。
【図３５】図３２の符号表により定義される符号を復号するＣ言語プログラムの例である。
【図３６】本発明の実施の形態における復号対象となる符号の第３の例を示す図である。
【図３７】図３６の符号表を表現する符号木の一例を示す図である。
【図３８】図３６の符号表により定義される符号を復号する際の、構成情報と復号符号値、復号情報および符号語との対応関係の一例を示す図である。
【図３９】図３６の符号表により定義される符号を復号するＣ言語プログラムの例である。
【図４０】本発明の実施の形態における復号対象となる符号の第４の例を示す図である。
【図４１】図４０の符号表により定義される符号を復号する際の、構成情報と復号符号値、復号情報および符号語との対応関係の一例を示す図である。
【図４２】図４０の符号表を表現する符号木の一例の前半を示す図である。
【図４３】図４０の符号表を表現する符号木の一例の後半を示す図である。
【図４４】図４０の符号表により定義される符号を復号するＣ言語プログラムの例である。
【符号の説明】
【０２０８】
１１０  命令キャッシュ
１２０  プロセッサ
１２１  命令フェッチユニット
１２２  命令デコードユニット
１３０  データキャッシュ
１４０  メモリ
１５０  ＤＭＡＣユニット
２００  実行部
２１０  プログラムカウンタ
２２０  汎用レジスタファイル
２３０  算術論理演算ユニット
２４０  ロードストアユニット
２５０  分岐ユニット
２６０  条件コードレジスタ
２７０  構成情報レジスタファイル
２８０  ストリーム参照ユニット
２８１  符号バッファ
２９０  復号ユニット
３０１  符号語レジスタ
３０２  マスクレジスタ
３０３  論理積演算部
３０４  一致検出部
３２０  符号語検出部
３２１  符号語検出器
３２２  プライオリティエンコーダ
３３０  復号符号語決定部
３３２  プライオリティエンコーダ
３３３  符号長供給部
３３４  セレクタ
３３５  復号情報供給部
【図１】
0004930435.tif 000002
【図２】
0004930435.tif 000003
【図３】
0004930435.tif 000004
【図４】
0004930435.tif 000005
【図５】
0004930435.tif 000006
【図６】
0004930435.tif 000007
【図７】
0004930435.tif 000008
【図８】
0004930435.tif 000009
【図９】
0004930435.tif 000010
【図１０】
0004930435.tif 000011
【図１１】
0004930435.tif 000012
【図１２】
0004930435.tif 000013
【図１３】
0004930435.tif 000014
【図１４】
0004930435.tif 000015
【図１５】
0004930435.tif 000016
【図１６】
0004930435.tif 000017
【図１７】
0004930435.tif 000018
【図１８】
0004930435.tif 000019
【図１９】
0004930435.tif 000020
【図２０】
0004930435.tif 000021
【図２１】
0004930435.tif 000022
【図２２】
0004930435.tif 000023
【図２３】
0004930435.tif 000024
【図２４】
0004930435.tif 000025
【図２５】
0004930435.tif 000026
【図２６】
0004930435.tif 000027
【図２７】
0004930435.tif 000028
【図２８】
0004930435.tif 000029
【図２９】
0004930435.tif 000030
【図３０】
0004930435.tif 000031
【図３１】
0004930435.tif 000032
【図３２】
0004930435.tif 000033
【図３３】
0004930435.tif 000034
【図３４】
0004930435.tif 000035
【図３５】
0004930435.tif 000036
【図３６】
0004930435.tif 000037
【図３７】
0004930435.tif 000038
【図３８】
0004930435.tif 000039
【図３９】
0004930435.tif 000040
【図４０】
0004930435.tif 000041
【図４１】
0004930435.tif 000042
【図４２】
0004930435.tif 000043
【図４３】
0004930435.tif 000044
【図４４】
0004930435.tif 000045