次に本発明の実施の形態について図面を参照して詳細に説明する。
図1は、本発明の実施の形態における復号装置の一構成例を示す図である。この復号装置は、命令キャッシュ110と、プロセッサ120と、データキャッシュ130と、メモリ140と、DMACユニット150と、バス160とを備えている。命令キャッシュ110は、メモリ140における命令記憶空間に記憶されているプログラムの命令列を保持するキャッシュメモリである。プロセッサ120は、命令キャッシュ110から供給されたプログラムの命令列に従って、復号処理を行う処理装置である。データキャッシュ130は、メモリ140におけるデータ記憶空間に対応するデータを保持するキャッシュメモリである。メモリ140は、プロセッサ120によって実行されるプログラムの命令列を記憶する命令記憶空間およびプロセッサ120の作業データ領域であるデータ記憶空間を有するメモリである。DMACユニット150は、プロセッサ120とメモリ140との間のDMA(Direct Memory Access)転送を制御するDMAC(Direct Memory Access Controller)である。このDMACユニット150は、符号データのストリームの入力処理を行う。バス160は、命令キャッシュ110、DMACユニット150およびデータキャッシュ130と、メモリ140との間を接続するバスである。
プロセッサ120は、可変長符号復号処理用の命令を命令セットとして備えるプロセッサである。このプロセッサ120が扱う命令の命令長は32ビットの固定長を想定する。このプロセッサ120は、命令フェッチユニット121と、命令デコードユニット122と、実行部200とを備える。命令フェッチユニット121は、命令キャッシュ110からプログラムの命令列を読み出すものである。命令デコードユニット122は、命令フェッチユニット121によって読み出されたプログラムの命令列を解釈して、実行部200およびDMACユニット150に制御信号を供給するものである。
実行部200は、命令デコードユニット122によって解釈された命令の処理内容に従って、その命令の実行に必要なリソース(レジスタや演算器など)の競合の調停と各ユニットの制御を行いながら、順次命令を実行するものである。この実行部200は、プログラムカウンタ210と、汎用レジスタファイル220と、算術論理演算ユニット230と、ロードストアユニット240と、分岐ユニット250と、条件コードレジスタ260と、構成情報レジスタファイル270と、ストリーム参照ユニット280と、復号ユニット290とを備える。
プログラムカウンタ210は、実行部200において実行されている命令の命令アドレスを保持するものである。このプログラムカウンタ210は、32ビット幅を備えることを想定する。このプログラムカウンタ210の値は、命令フェッチユニット121に供給される。命令フェッチユニット121は、このプログラムカウンタ210の値に従って、後続命令を命令キャッシュ110から読み出すことになる。
汎用レジスタファイル220は、プロセッサ120における処理に用いられる汎用レジスタ群である。この汎用レジスタファイル220は、32ビット幅の汎用レジスタを32個備える。したがって、この汎用レジスタファイル220のアドレスは5ビットで表現できる。そのため、後述するC言語プログラムの整数型(int)は4バイトを表す。
算術論理演算ユニット230は、算術演算または論理演算を行う演算器である。この算術論理演算ユニット230は、汎用レジスタファイル220から読み出されたオペランドを用いて算術演算または論理演算を行い、その結果を汎用レジスタファイル220に書き込む。
ロードストアユニット240は、データキャッシュ130と各レジスタファイル(汎用レジスタファイル220および構成情報レジスタファイル270)との間でデータの受け渡しを行うものである。すなわち、データキャッシュ130を介してメモリ140から各レジスタファイルへのロード(読出し)と各レジスタファイルからメモリ140へのストア(書込み)を行う。汎用レジスタファイル220のための32ビット幅のロードストアと、構成情報レジスタファイル270のための128ビット幅のロードストアが可能である。
分岐ユニット250は、分岐命令を処理してプログラムカウンタ210を制御するものである。分岐方向の決定方法としては、汎用レジスタファイル220の値を比較する分岐命令、条件コードレジスタ260の各ビットの値が「0」か「1」かで分岐する分岐命令、無条件に分岐する分岐命令などのように、命令によって異なる。分岐先アドレスとしては、命令コードに含まれる即値をオフセットとしてプログラムカウンタ210に加算するものや、汎用レジスタファイル220の値をプログラムカウンタ210に設定するものなどが想定される。分岐命令以外の命令が実行された時は、プログラムカウンタ210に「4」を加算して、次の命令をフェッチして実行することになる。
条件コードレジスタ260は、分岐命令によって参照される条件コードを保持するレジスタである。条件コードは復号ユニット290から供給され、条件コードの各ビットは分岐するか否かを表す。この条件コードレジスタ260は8ビット幅を有し、その各ビットを指示するビットアドレスは3ビットで表現できる。
構成情報レジスタファイル270は、復号ユニット290における構成情報を保持するものである。この構成情報レジスタファイル270は、128ビット幅のレジスタを8個備える。また、各レジスタのアドレスは3ビットで表現できる。この構成情報レジスタファイル270は、特許請求の範囲に記載の構成情報保持部の一例である。なお、構成情報については後述する。
ストリーム参照ユニット280は、DMACユニット150から供給されるストリームデータをシーケンシャルに参照するものである。このストリーム参照ユニット280は、内部に32ビットの符号バッファを有し、最大32ビットまでのビット単位でストリームデータの参照が可能である。この符号バッファは、例えば16ビットを単位として2組を備え、それぞれ16ビットが揃うまで新たな命令を実行しないように制御される。参照されたデータは汎用レジスタファイル220および復号ユニット290に供給される。DMACユニット150はストリームの先頭アドレスとサイズを設定されることで、メモリ140上のその先頭アドレスから始まるデータをシーケンシャルに読み出して、符号バッファを満たすまで取り込んで保持する。演算器からのデータ要求があれば符号バッファの内容を演算器に出力して、出力した分を符号バッファから破棄する。そして、それにより生成された符号バッファの空き領域に残りのストリームを新たにメモリ140からシーケンシャルに取り込んで、符号バッファを満たすようにする。ここで、演算器とは、例えば復号ユニット290に相当するが、別に設けられた復号演算器などであってもよく、また、ストリーム参照ユニット280自身であってもよい。設定されたサイズのストリームを全てメモリ140から読み出した後には、メモリ140からのデータ読出しは行わない。その代わり、符号バッファに空きができた時にはダミーのデータ(例えば「0」)を充填する。
復号ユニット290は、ストリーム参照ユニット280から供給されたストリームデータを復号するものである。この復号ユニット290は、後述するように複数の符号語検出器を備え、それぞれの機能は構成情報レジスタファイル270に保持される構成情報により定義される。復号ユニット290は、復号符号語の決定と条件コードの決定を行うvld_decode命令、復号符号番号を後述する復号情報テーブル内の対応するデータのアドレス(以下、テーブルアドレスと称する。)へと変換するvld_show命令、vld_showの処理と併せて復号符号長分ストリームを読み進める処理を行うvld_get命令などを実行する。これら各命令の詳細については後述する。この復号ユニット290において生成された条件コードは条件コードレジスタ260に供給される。また、この復号ユニット290において生成されたテーブルアドレスは汎用レジスタファイル220に供給される。また、この復号ユニット290は、復号情報テーブルのベースアドレスを表す内部レジスタbase_addrを備え、テーブルアドレスの算出に用いる。
図2は、本発明の実施の形態における復号ユニット290とその周辺の機能構成例を示す図である。復号ユニット290は、符号語検出部320と、復号符号語決定部330とを備える。
符号語検出部320は、ストリーム参照ユニット280内の符号バッファ281から供給されるストリームデータにおいて、符号語を検出するものである。この符号語検出部320は、N個の符号語検出器321−0乃至321−(N−1)(以下、符号語検出器321と総称する。)を備え、検出された符号の符号番号および符号長を出力する。
符号語検出器321は、ストリーム参照ユニット280における符号バッファ281から入力されたストリームデータに含まれる符号語を検出するものである。この実施の形態では、符号語検出器321として17個の符号語検出器321−0乃至321−16を想定している。符号語検出器321の数を17個に想定したのは、構成情報を128ビットに収めるためである。符号語検出器321の各々は、符号表の1つの符号語に対応し、その対応する符号語との一致をそれぞれ並列に検出する。この符号語検出器321は、4つのグループに分類されており、後述するように、検出すべき符号語の一部のビットがグループ毎に共通するように構成される。ただし、これらは一例であり、システム固有の条件により適宜変更可能であることはいうまでもない。
復号符号語決定部330は、符号語検出部320において検出された符号語の中から1つを決定するものである。この復号符号語決定部330は、プライオリティエンコーダ332と、符号長供給部333と、セレクタ334と、復号情報供給部335とを備えている。
プライオリティエンコーダ332は、複数の符号語検出器321の検出結果の中から優先順位に従って何れか一つを選択するものである。符号語検出器321は、対応する符号語と他の符号語とが同じであるか、または、対応する符号語が他の符号語の接頭語(プリフィックス)になることを許すこととする。すなわち、複数の符号語検出器321の結果が同時に一致を示すことが起こり得る。このため、符号語検出器321の各々には優先順位が設けられ、一致を示すものの中から優先順位のより高いものの符号語が選択されることとする。プライオリティエンコーダ322は、このような機能を奏するものであり、符号語検出器321において一致が検出されたものの中から最も優先順位の高い符号語検出器321の符号番号IDを出力する。ただし、何れの符号語検出器321においても一致が検出されない場合には、不検出を意味する符号番号EIDが出力される。
符号長供給部333は、符号語検出器321の各々に対応する符号長を供給するものである。ただし、何れの符号語検出器321においても一致が検出されない場合には、符号長は「0」となる。
セレクタ334は、プライオリティエンコーダ332から出力された符号番号に従って、符号長供給部333から供給される符号長を選択するものである。これにより、符号語の符号番号IDとその符号長CL(ID)が検出結果として出力される。符号長は、信号線297を介してストリーム参照ユニット280に出力される。
なお、上述のように、対応する符号語と他の符号語とが同じであるか、または、対応する符号語が他の符号語の接頭語になることを許すことを前提としている。これについては、同じ符号語もしくは接頭語になっている符号語の符号語検出器321よりも優先順位の高いものが必ず選択されるように割り当てることによって、それより低い優先順位の符号語検出器321が全く選択されないようにすることが可能となる。これを利用して、符号語の数が符号語検出器321の数よりも少ないときに、余った符号語検出器321を優先順位の低いものとして割り当てて、必ず選択されないようにする。これにより、余分な制御信号を用いることなく、符号語の数が符号語検出器321の数よりも少ない場合に対応することができる。すなわち、使用しない符号語検出器321を指定するための構成情報を新たに用意する必要がなく、符号語の数の異なる符号表に柔軟に対応することができる。
復号情報供給部335は、復号に必要な情報を取得するための情報を供給するものである。この復号情報供給部335は、復号情報テーブルのベースアドレスを表す内部レジスタbase_addrを備えており、これに基づいて、プライオリティエンコーダ332によって得られた符号番号をテーブルアドレス(復号情報テーブル内の対応するデータのアドレス)に変換する。このテーブルアドレスは、信号線298を介して汎用レジスタファイル220に出力される。
また、復号情報供給部335は、構成情報レジスタファイル270から取得した条件コードビットマップに基づいて、プライオリティエンコーダ332によって得られた符号番号に対応する条件コードを生成する。この条件コードは、信号線299を介して条件コードレジスタ260に出力される。
図3は、本発明の実施の形態における復号情報テーブルの一構成例を示す図である。この復号情報テーブルは、符号番号に対応して復号情報を保持するテーブルである。符号番号は構成情報に対応するものであるのに対して、復号情報は符号語に1対1に対応する番号である。
この復号情報テーブルはメモリ140上に格納されるものであり、メモリ140における先頭アドレス(ベースアドレス)は、復号ユニット290の復号符号語決定部330における復号情報供給部335内の内部レジスタbase_addrに保持されている。
この復号情報テーブルは、復号情報を4バイトずつ記憶することを想定すると、復号情報テーブル内にアクセスする際には、インデックス値v_idxを4倍した値を内部レジスタbase_addrの値に加算することにより、目的の復号情報を参照することができる。
図4は、本発明の実施の形態における符号値CWの形式例を示す図である。まず、2進記号を以下のように定義して、
UCi(ID),GCi(ID),GP(ID),Si∈{0,1},
i=0,1,…,∞
本発明の実施の形態では、符号番号IDの符号値CW(ID)を、2進記号列によって以下のように表現できるものに限定するものとする。
CW(ID)={GP(ID)}∞{GC(ID)}{UC(ID)}
={…CWFP+FU(ID)}
{CWFP+FU−1(ID)…CWFU(ID)}
{CWFU−1(ID)…CW0(ID)}
ただし、
GC(ID)=GCFP−1(ID)…GC0(ID)
UC(ID)=UCFU−1(ID)…UC0(ID)
である。また、{X}YはXがY個連接した記号列を表すものとする。これにより、全ての記号を与えることなく無限の長さの記号列を定義することができる。
符号値CW(ID)に符号長CL(ID)を与えることで、符号番号IDの符号語CODE(ID)を、
CODE(ID)=CWCL(ID)−1(ID)…CW0(ID)
と定義することができる。
図4の例では、UCを4ビットとし、GCを2ビットとしている。また、それらの上位(MSB側)にGPが連続するものとしている。このような前提としたのは、MSB側のビット列が他の符号語と等しい部分が長く、さらにMSB側から「0」または「1」が連続する符号語から構成される符号表が多いからである。その原因としては、符号木を葉の高さが左右どちらかに偏った木にすることで単純に符号長に偏りがある可変長符号を設計できるからなどの理由が考えられる。ここで、符号長Lの符号語Cは、その出現確率の推定値P(C)=2−Lと想定している。実際のCの出現確率がP(C)であるならば、ほぼエントロピーまで圧縮できる。つまり、符号の圧縮性能は符号長のみで決まる。葉の高さはその符号語の符号長と等しく、葉の高さだけが重要であり、葉の分布がばらばらに偏っていても、左右どちらかに偏っていても、葉の高さの数が同じならば圧縮性能は変わらない。したがって、左右どちらかに偏った木の方が符号表の設計が簡単である。
そのような符号表が設計されることが多いことが予想されるため、グループ分けしてグループ毎に共通のデータをまとめて定義すれば構成情報を小さくすることができる。その上、グループ毎に共通のデータをまとめることによって符号表を定義することが著しく困難になることはない。このことは、符号表を符号木として表現したときに根から葉に向かう途中のパスは、異なる葉へのパスにおいても共通なパスがあり、枝の高さが低いほどより多くの葉へ向かうパスの共通部分となっていることからも容易に推測できる。
そこで、この例では、符号語検出器321−0乃至321−4の5個を第1のグループ、符号語検出器321−5乃至321−8の4個を第2のグループ、符号語検出器321−9乃至321−12の4個を第3のグループ、符号語検出器321−13乃至321−16の4個を第4のグループとして、それぞれのグループにおいてGPおよびGCについては共通の符号が割り当てられる。これに対し、UCについては符号語検出器321毎に独自の符号が割り当てられる。
ここで、符号番号IDの比較用符号語記号列CMPCODE(ID)を、
CMPCODE(ID)=CODE(ID){0}∞
={CWCL(ID)−1(ID)…CW0(ID)}{0}∞
と定義する。また、比較用マスク記号列CMPMASK(ID)を、
CMPMASK(ID)={1}CL(ID){0}∞
と定義する。
符号語が符号化された順番に連接された記号列である符号列S0S1…StSt+1…のt番目の記号からの記号列STREAM(t)を、
STREAM(t)=StSt+1…
として、記号ごとに論理積∧をとったCMPSTREAM(ID)は、
CMPSTREAM(ID)=CMPMASK(ID)∧STREAM(t)
={StSt+1…St+CL(ID)−1}{0}∞
と表すことができる。これにより、符号番号IDの符号語CODE(ID)を検出したか否かの判定CODEDETECT(ID)は、
CODEDETECT(ID)=(CMPSTREAM(ID)==
CMPCODE(ID))?Yes:No
によって表される。すなわち、CMPSTREAM(ID)とCMPCODE(ID)が一致すれば「Yes」が出力され、一致しなければ「No」が出力される。このように、構成情報によって検出符号語CODE(ID)を定義して、判定CODEDETECT(ID)により検出を行うのが符号語検出器321である。
図5は、本発明の実施の形態における構成情報の一例を示す図である。この構成情報は、構成情報レジスタファイル270に保持され、復号ユニット290の符号語検出器321の構成VLDCTXと、復号符号語決定部330の条件コードビットマップCCMAPを定義するものである。
ここでは、17個の符号語検出器321に対して「0」乃至「16」の符号番号IDが付与される。EIDの場合は「32」として扱われる。グループ分けはIDが「0」乃至「4」、「5」乃至「8」、「9」乃至「12」、「13」乃至「16」の4つを想定している。各構成情報のビット数は、UC(ID)が4ビットずつ、GC(ID)が2ビットずつ、CL(ID)が4ビットずつ、D(2)、D(3)、D(5)およびD(7)が2ビットずつで、その他IDのD(ID)が1ビットずつである。また、CCMAP(ID)は1ビットずつである。
符号長CL(ID)は、「1」減じた値を構成情報として、1ビット乃至16ビットの長さを4ビットで表現する。差分D(ID)は、符号番号が1つ若い番号の符号語検出器321の符号長からの差分である。
UC(ID)を4ビットとしたのは、同じ符号長の符号語を17個より1個少ない16個まで区別できるからであり、葉の高さの偏りが少ない符号木に対してもうまく対応するためである。ただし、すべてが同じ長さの固定長符号ならばテーブルで1対1の変換をすれば済むため、符号語検出器321は16個より多めにして17個にしてある。なお、17個より増やさないのは、構成情報を128ビットに収めるには17個が限界と思われるからである。この例では、符号番号IDが小さいものほど優先順位が高くなるように設定している。
条件コードビットマップCCMAPは、17個の符号語検出器321に対応した17ビットと 符号語が検出できなかったときの符号番号EIDに対応する1ビットからなる。この条件コードビットマップCCMAPにおいて、復号符号番号DIDに従ってCCMAP(DID)が条件コードレジスタ260に供給される。
図6は、本発明の実施の形態における符号語検出器321の構成例を示す図である。符号語検出器321の各々は、符号語レジスタ301と、マスクレジスタ302と、論理積演算部303と、一致検出部304とを備えている。
符号語レジスタ301は、この符号語検出器321において検出すべき符号語が設定されるレジスタである。この符号語レジスタ301は16ビット構成であり、MSB側に符号長CLの符号語が設定され、それ以外のビットには「0」が設定される。
マスクレジスタ302は、ストリームデータのマスクパターンが設定されるレジスタである。このマスクレジスタ302は16ビット構成であり、MSB側に符号長CLの「1」が設定され、それ以外のビットには「0」が設定される。
論理積演算部303は、符号バッファ281から供給されるストリームデータとマスクレジスタ302に設定されるマスクパターンとの論理積を生成するものである。これにより、ストリームデータのうち先頭から符号長CLの部分がMSB側から出力され、以降は「0」が出力される。
一致検出部304は、符号語レジスタ301の設定内容と論理積演算部303の出力との間の一致を検出するものである。すなわち、符号バッファ281からのストリームデータと符号語レジスタ301に設定された符号語とが一致すると、その旨が一致検出部304によって出力される。
図7は、本発明の実施の形態における符号語検出器321の各々における符号語レジスタ301の構成情報の例を示す図である。17個の符号語検出器321−0乃至321−16の符号語レジスタ301の各々には、構成情報レジスタファイル270に保持される構成情報に従って値が設定される。
UCの4ビットには、符号語検出器321毎に特有の値が設定される。すなわち、構成情報の第0ビット乃至第3ビットが符号語検出器321−0、構成情報の第4ビット乃至第7ビットが符号語検出器321−1、構成情報の第8ビット乃至第11ビットが符号語検出器321−2、構成情報の第12ビット乃至第15ビットが符号語検出器321−3、構成情報の第16ビット乃至第19ビットが符号語検出器321−4、構成情報の第20ビット乃至第23ビットが符号語検出器321−5、構成情報の第24ビット乃至第27ビットが符号語検出器321−6、構成情報の第28ビット乃至第31ビットが符号語検出器321−7、構成情報の第32ビット乃至第35ビットが符号語検出器321−8、構成情報の第36ビット乃至第39ビットが符号語検出器321−9、構成情報の第40ビット乃至第43ビットが符号語検出器321−10、構成情報の第44ビット乃至第47ビットが符号語検出器321−11、構成情報の第48ビット乃至第51ビットが符号語検出器321−12、構成情報の第52ビット乃至第55ビットが符号語検出器321−13、構成情報の第56ビット乃至第59ビットが符号語検出器321−14、構成情報の第60ビット乃至第63ビットが符号語検出器321−15、構成情報の第64ビット乃至第67ビットが符号語検出器321−16の、それぞれの符号語レジスタ301のUCに設定される。
GCの2ビットおよびGPの1ビットは、グループ毎に共通の値が設定される。すなわち、構成情報の第68ビット乃至第70ビットが符号語検出器321−0乃至321−4、構成情報の第71ビット乃至第73ビットが符号語検出器321−5乃至321−8、構成情報の第74ビット乃至第76ビットが符号語検出器321−9乃至321−12、構成情報の第77ビット乃至第79ビットが符号語検出器321−13乃至321−16の、それぞれの符号語レジスタ301のGCおよびGPに設定される。ただし、設定される符号語の長さは符号長に従う。すなわち、符号長が8ビット以上の場合にはMSB側にGPが繰り返し設定される。一方、符号長が6ビット以下の場合には、LSB側に符号語がつめられて、MSB側の符号語は設定されない。
上述のように、符号語検出器321−0乃至321−16は、符号番号の若い順に検索の優先順位が高く設定されており、ある符号語検出器321において一致が検出された場合にはそれより符号番号の大きい符号語検出器321の結果は無視される。また、何れの符号語検出器321においても一致が検出されなかった場合には、不一致を示すEIDが出力される。
図8は、本発明の実施の形態における符号間の関係を示す例である。ここで、符号番号IDがIよりも1つ若い番号(I−1)の符号語検出器321の符号長CL(I−1)からの差分D(I)によって、符号番号Iの符号長CL(I)を相対的に定義することを考える。符号長は小さいものから順番に並べると差が小さい場合がほとんどであるため、このように符号長の短いものから順番に、差分D(I)によって相対的に符号長を定義するとCL(I)よりも少ないビット数で差分D(I)を表すことができる。CL(I)を直接定義するものと、相対的に定義するものとを組み合わせることで、全ての符号語検出器321の符号長CL(I)をより少ないビット数の構成情報として表現することができる。
図5の例では、符号語検出器321−0、321−1および321−9における符号長を4ビットで表現し、これ以外の符号語検出器321においては差分Dを用いることにより符号長の表現を短縮している。符号番号0と1との間では符号長が大きく異なることが多く、また、17個のうちのほぼ中心となるのが符号番号9であるため、符号語検出器321−1およびでは321−9符号長そのものを保持することとしたものである。また、符号語検出器321−2、321−3、321−5および321−7については差分Dを2ビットとし、それ以外では差分Dを1ビットとしている。これは、符号番号が小さいほど符号長の変化が大きく、符号番号が大きいほど符号長の変化が少なくなるという可変長符号の特徴を利用したものである。
このように、N個の符号語検出器321と復号符号語決定部330とを組み合わせて使用することにより、ストリームデータSTREAM(t)の先頭にある符号語(復号符号番号DID、復号符号値DCW、復号符号長DCL)を1つ決定することができる。そして、その符号語に対応した復号情報を生成することにより、その符号語を復号したことになる。その後、ストリームデータの読出し位置tをDCLビット分読み進めて「t+DCL」に更新することにより、その次の符号語がSTREAM(t)の先頭となる。この要領で、それ以降の符号語も同様に繰り返すことにより、ストリームデータの全てを復号することができる。これらの処理を復号処理RVLD(Reconfigurable Variable Length Decoding)と称する。
復号符号番号DIDがEIDのときは符号長DCLが「0」であるため、復号処理RVLDにおいてストリームデータを読み進めることはない。そのため、EIDのときは、符号表の残りの符号語を定義した新たな構成情報を用意して、それに設定し直した上で同様の復号処理RVLDを行うか、別の方法により符号語を決定して符号長分のビット数を読み進める復号処理を行う。本発明の実施の形態によるプロセッサ120は、復号処理RVLDを実行する命令とその他の「可変長符号の復号処理に有効な命令」を命令セットとして有し、構成情報を1つ以上格納する構成情報レジスタファイル270を備える。
ここで、符号語検出器321に複数の符号語の接頭語を符号語として割り当て、それが複数の符号語を代表している場合を考える。この場合、各符号語の接頭語を除いた接尾語は接頭語ごとに長さがほとんど同じか1ビット程度の差しかない2種類程度の長さの固定長符号として扱うことができることが多い。そのような場合には、一番長いビット数分の2進記号列を符号バッファ281から読み出して、その2進記号列に基づいて実際の長さを算出し、その長さだけ符号バッファ281を読み進めることにより、重複の少ないテーブルと単純な処理によって復号処理を実現できることが多い。そのため、指定したビット数を符号バッファ281から取り出す処理SHOWBITSを実行する命令と、SHOWBITSと併せて符号バッファ281をそのビット数分読み進める処理GETBITSを実行する命令を「可変長符号の復号処理に有効な命令」として備えることを想定する。
さらに、プロセッサ120は、条件コードレジスタ260を参照して、指定された条件が満たされれば指定したメモリアドレスへ分岐する分岐命令を「可変長符号の復号処理に有効な命令」として備えているものとする。条件コードマップCCMAPは、上述のように、(N+1)個の条件コード情報を格納したレジスタであり、N個の各符号番号に対応したN個の条件コード情報と、検出されなかった場合の例外符号番号EIDに対応した1個の条件コード情報とからなる。各条件コード情報は条件コードレジスタ260へ値を設定するために用いられる。CCMAP(ID)によって各条件コード情報を表すものとする。復号処理RVLDを行う命令が実行された際、DIDの条件コード情報CCMAP(DID)に基づいて、条件コードレジスタ260へ値が設定される。単純なCCMAPの実装方法としては、ID毎に分岐するかしないかの情報を各1ビットずつの(N+1)ビット分格納しておいて、条件コードレジスタ260へCCMAP(ID)が書き込まれるようにすることが考えられる。このように復号処理RVLDと同時に分岐のための条件コードを設定する命令(後述するvld_decode命令)を用意することにより、プロセッサ120において符号番号を比較する処理がある場合の比較処理のための命令を削減することができる。条件コードレジスタ260は1ビット以上でもよく、その場合には条件コードを設定する命令はどのビットに設定するかを指定し、参照する分岐命令においても何れのビットを参照して分岐するかを指定することになる。また、条件コードレジスタ260は同時に複数のビットを設定することが可能であることとしてもよい。この場合、CCMAPで設定された条件コード情報とは無関係に、EIDであったときにその旨を示す情報を条件コードレジスタ260の別のビットに設定するなどの応用が考えられる。
次に、符号表がN個以上の符号語からなり、1つの構成情報では収まらないときの解決方法としては、大きく分けて以下の2種類が考えられる。第1の方法は、復号処理RVLDを1回行った後に、残りの部分を別の手法により復号する方法である。第2の方法は、復号処理RVLDを異なる構成情報によって複数回実行することにより、復号する方法である。
まず、第1の方法について説明する。復号処理RVLDにおいて設定された構成情報によって定義された記号列が、実際の符号語そのものであるCODELEAFと、複数の符号語の接頭語となる記号列であるCODENODEとが混在して構成される場合を考える。CODELEAFの場合は、復号符号番号DIDに従って、別途用意された復号情報テーブルを参照することにより復号情報が出力される。CODENODEの場合は、符号語の途中までしか確定していないため、もう少し先の符号列を参照して決定する必要がある。この場合はSHOWBITSによってある程度の長さの記号列を取得して、その記号列から符号語の残りの部分である接尾語の長さ(符号長残差)が、別途用意された符号長残差テーブルを参照することにより決定される。そして、その長さをGETBITSで読み進めて、SHOWBITSで得た記号列に従って、別途用意された復号情報テーブルを参照することにより復号情報が出力される。CODENODEについては、符号長残差が全て同じ値となるように構成情報記号列を定義できる場合があり、このような場合はCODENODEによって瞬時に符号長残差が決定するため、その符号長残差でGETBITSをするだけでよい。
このように、第1の方法では、復号処理RVLDの後にCODELEAFかCODENODEかで処理が分かれるため、分岐命令が必要になる。このCODELEAFかCODENODEかの判別を単純に行う場合には、何れの処理を行うかを記述したテーブルをDIDに基づいて参照して、それにより得た値を比較する処理が必要になる。そこで、本発明の実施の形態においては、CCMAPに分岐するかしないかの情報を設定しておいて、復号処理RVLDと同時に分岐条件を計算できるようにしておくことにより、比較処理や比較用テーブルを不要とすることができる。
次に、第2の方法について説明する。複数の構成情報によって復号処理RVLDを実行するためには、カスケード機能が利用される。カスケード機能とは、異なる構成情報により復号処理RVLDを複数回連続して実行する機能であり、先に実行された復号処理RVLDでEID以外の符号語が復号された時は、それ以降のカスケード機能を有効にした復号処理RVLDは無視されるようになっている。すなわち、異なる構成情報による符号語検出器321によって連続して検出結果が得られた際には、先に得られた検出結果において一致が検出されていない場合にのみ、後に得られた検出結果に基づいて復号された符号語が決定される。これにより、分岐命令を使用せずに分岐処理を実現することができる。また、分岐命令を使用する場合であっても、分岐命令よりも先に復号処理RVLDを発行することができる。
復号処理RVLD毎に異なるオフセット値を符号番号に加算することができれば、複数の復号処理RVLDの結果の符号番号を互いに区別できるようになる。そこで、復号処理RVLDを、復号符号番号DIDの決定および条件コード情報の生成を行うVLD_DECODEと、復号符号番号DIDにオフセット値を加算するVLD_SHOWと、VLD_SHOWと併せて符号長DCLビット分のストリームデータを読み進めるVLD_GETの各処理に分解する。VLD_SHOWおよびVLD_GETは、復号符号番号DIDがEIDであったときには特定の値に設定するように設定できる。これらにより、複数の構成情報を用いてN個以上の符号語検出器321があるかのように処理することができる。
オフセットした符号番号は符号を区別するための単なる番号として使うこともできるが、復号情報をテーブルにしておきオフセットした符号番号でテーブルを索引して、その符号語に対応する復号情報が参照できるようにすると効率がよい。復号情報が4バイト以内で表現できるものとし、4バイト単位の復号情報テーブルを考える。テーブルの最初の要素のアドレスをベースアドレスとして、符号番号を4倍した値にベースアドレスを加算することにより、符号番号に対応したテーブルの要素のアドレスを求めることができる。4倍するためのシフト命令とベースアドレスに加算するための加算命令が必要である。これをVLD_SHOWおよびVLD_GETによって行うようにすることで、2命令を削減することができる。
また、符号語の最後の1ビットにおいて復号情報の正負を表すような符号表がMPEGなどの規格にある。このような符号表に対しては最後の1ビットを削除した符号語のみの符号表を考慮して構成情報を設定し、VLD_SHOWおよびVLD_GETにおいては、最後の1ビットを参照して、その値に基づいて符号番号を加工して、区別がつくようにするとよい(後述のVLD_SHOW_SおよびVLD_GET_S)。たとえば、符号番号を2倍して、最後の1ビットとして参照した値を加算すると、偶数と奇数で正負の区別がつくようになる。VLD_GETにより1ビット余分に読み進めるようにすると、GETBITSにおいて1ビットを読み進める必要がなくなる。
また、最後の1ビットだけでなく、最後の2ビットを参照した値に符号番号を4倍して加算するようなVLD_SHOWおよびVLD_GETも考えることができる(後述のVLD_SHOW_SSおよびVLD_GET_SS)。符号木の末端に高さ2の完全木が多数あるような場合に適している。この場合、VLD_GETは2ビットを余分に読み進める。
図9は、本発明の実施の形態におけるプロセッサ120の命令セットのうち可変長符号を復号するための命令を抜粋したものである。通常の命令の説明は省略するが、C言語などの高級言語を効率よく実行するのに十分な命令セットが別途用意されていることを想定する。たとえば、R3000やARM7などのRISCプロセッサの命令セットがこれに相当する。
「vld_decode」命令は、カスケード機能を用いることなく、復号符号番号の決定および条件コード情報の生成を行うための命令である。「vld_decode」命令のオペランドとしては、3ビットのccおよび3ビットのvrsが用いられる。ccは条件コードレジスタ260のアドレスを示すために用いられるパラメータである。vrsは、構成情報レジスタファイル270のアドレスを示すために用いられるパラメータである。この「vld_decode」命令のオペレーションとしては、cascadeをしない旨(「No」)を設定した上で処理「VLD_DECODE」を行った後に、プログラムカウンタ210に「4」を加算するという動作を行う。
「vld_decode_cascade」命令は、カスケード機能を用いて、復号符号番号の決定および条件コード情報の生成を行うための命令である。「vld_decode_cascade」命令のオペランドとしては、「vld_decode」命令と同様に、3ビットのccおよび3ビットのvrsが用いられる。この「vld_decode_cascade」命令のオペレーションとしては、cascadeをする旨(「Yes」)を設定した上で処理「VLD_DECODE」を行った後に、プログラムカウンタ210に「4」を加算するという動作を行う。
「vld_baseaddr」命令は、復号情報テーブルのベースアドレスを設定するための命令である。「vld_baseaddr」命令のオペランドとしては、5ビットのrsが用いられる。rsは、汎用レジスタファイル220のアドレスを示すために用いられるパラメータである。この「vld_baseaddr」命令のオペレーションとしては、汎用レジスタファイル220のうちrsにより示されるレジスタの内容をtable_baseに代入した後に、プログラムカウンタ210に「4」を加算するという動作を行う。
「vld_show」命令は、復号符号番号にオフセット値を加算するための命令である。「vld_show」命令のオペランドとしては、5ビットのrd、8ビットのoffset、8ビットのexceptが用いられる。rdは、汎用レジスタファイル220のアドレスを示すために用いられるパラメータである。offsetは、復号情報テーブルにおけるオフセット値を示すために用いられるパラメータである。exceptは、符号語の一致が検出されなかった場合の復号情報テーブル内の相対位置を示すために用いられるパラメータである。この「vld_show」命令のオペレーションとしては、処理「VLD_SHOW」を行った後に、プログラムカウンタ210に「4」を加算するという動作を行う。
「vld_show_s」命令は、符号語の最後の1ビットを考慮して復号符号番号にオフセット値を加算するための命令である。「vld_show_s」命令のオペランドとしては、「vld_show」命令と同様に、5ビットのrd、8ビットのoffset、8ビットのexceptが用いられる。この「vld_show_s」命令のオペレーションとしては、処理「VLD_SHOW_S」を行った後に、プログラムカウンタ210に「4」を加算するという動作を行う。
「vld_show_ss」命令は、符号語の最後の2ビットを考慮して復号符号番号にオフセット値を加算するための命令である。「vld_show_ss」命令のオペランドとしては、「vld_show」命令と同様に、5ビットのrd、8ビットのoffset、8ビットのexceptが用いられる。この「vld_show_ss」命令のオペレーションとしては、処理「VLD_SHOW_SS」を行った後に、プログラムカウンタ210に「4」を加算するという動作を行う。
「vld_get」命令は、「vld_show」命令の動作と併せて符号長相当のストリームデータを読み進めるための命令である。「vld_get」命令のオペランドとしては、「vld_show」命令と同様に、5ビットのrd、8ビットのoffset、8ビットのexceptが用いられる。この「vld_get」命令のオペレーションとしては、処理「VLD_GET」を行った後に、プログラムカウンタ210に「4」を加算するという動作を行う。
「vld_get_s」命令は、「vld_show_s」命令の動作と併せて符号長相当のストリームデータを読み進めるための命令である。「vld_get_s」命令のオペランドとしては、「vld_show」命令と同様に、5ビットのrd、8ビットのoffset、8ビットのexceptが用いられる。この「vld_get_s」命令のオペレーションとしては、処理「VLD_GET_S」を行った後に、プログラムカウンタ210に「4」を加算するという動作を行う。
「vld_get_ss」命令は、「vld_show_ss」命令の動作と併せて符号長相当のストリームデータを読み進めるための命令である。「vld_get_ss」命令のオペランドとしては、「vld_show」命令と同様に、5ビットのrd、8ビットのoffset、8ビットのexceptが用いられる。この「vld_get_ss」命令のオペレーションとしては、処理「VLD_GET_SS」を行った後に、プログラムカウンタ210に「4」を加算するという動作を行う。
「showbits」命令は、指定したビット数を符号バッファ281から取り出すための命令である。「showbits」命令のオペランドとしては、5ビットのrdと、5ビットのrsが用いられる。rdおよびrsは、汎用レジスタファイル220のアドレスを示すために用いられるパラメータである。この「showbits」命令のオペレーションとしては、処理「SHOWBITS」を行った後に、プログラムカウンタ210に「4」を加算するという動作を行う。
「getbits」命令は、処理「SHOWBITS」と併せて符号バッファ281をそのビット数分読み進めるための命令である。「getbits」命令のオペランドとしては、「showbits」命令と同様に、5ビットのrdと、5ビットのrsが用いられる。この「getbits」命令のオペレーションとしては、処理「GETBITS」を行った後に、プログラムカウンタ210に「4」を加算するという動作を行う。
「get_stream」命令は、符号バッファ281にストリームデータを転送するための命令である。「get_stream」命令のオペランドとしては、5ビットのrsと、5ビットのrtが用いられる。rsおよびrtは、汎用レジスタファイル220のアドレスを示すために用いられるパラメータである。この「get_stream」命令のオペレーションとしては、符号バッファ281をクリアし、ストリームデータの先頭アドレスを汎用レジスタR[rs]、サイズを汎用レジスタR[rt]としてDMACを設定して、ストリームデータの符号バッファ281への充填を開始する。その後、プログラムカウンタ210に「4」を加算するという動作を行う。
「load_v」命令は、メモリ140から構成情報レジスタファイル270にデータを読み出すための命令である。「load_v」命令のオペランドとしては、5ビットのvrdと、5ビットのrsと、16ビットのoffsetが用いられる。vrdは、構成情報レジスタファイル270のアドレスを示すために用いられるパラメータである。rsは、汎用レジスタファイル220のアドレスを示すために用いられるパラメータである。offsetは、メモリ140のアドレスのオフセット値を示すために用いられるパラメータである。この「load_v」命令のオペレーションとしては、メモリ140上の(offset+R[rs])番地から16バイトのデータを読み出して、構成情報レジスタファイル270のVR[vrd]に格納するという動作を行う。その後、プログラムカウンタ210に「4」を加算するという動作を行う。
「store_v」命令は、構成情報レジスタファイル270からメモリ140にデータを書き込むための命令である。「store_v」命令のオペランドとしては、「load_v」命令と同様に、5ビットのvrdと、5ビットのrsと、16ビットのoffsetが用いられる。この「store_v」命令のオペレーションとしては、構成情報レジスタファイル270のVR[vrs]の内容を参照して、メモリ140上の(offset+R[base])番地から始まる16バイトの領域に書き込むという動作を行う。その後、プログラムカウンタ210に「4」を加算するという動作を行う。
「vld_br」命令は、条件コードレジスタ260の値に応じて分岐処理を行うための命令である。「vld_br」命令のオペランドとしては、1ビットのtfと、3ビットのccと、符号付16ビットのoffsetが用いられる。tfは、条件コードレジスタ260の値が「0」または「1」の何れの場合に分岐するかを指定するパラメータである。ccは、条件コードレジスタ260のアドレスを示すために用いられるパラメータである。offsetは、分岐先のオフセットを示すために用いられるパラメータである。この「vld_br」命令オペレーションとしては、条件コードレジスタ260CCR[cc]がtfと一致していればoffsetに「4」を乗じた数をプログラムカウンタ210に加算して分岐し、一致していなければプログラムカウンタ210に「4」を加算するという動作を行う。
以下に、各処理の処理手順例について説明するが、これらは電子回路として実装することができる。逐次処理やループとして記述されている場合でも、並列に動作可能な部分は電子回路により並列に動作するように実装されることを想定する。
図10は、本発明の実施の形態における処理「INIT」の処理手順例を示す図である。この処理「INIT」は、プロセッサ120の初期化などの際に実行される処理である。
この処理「INIT」では、カスケード機能の有無を示す変数flag_cascadeに「No」が設定されるとともに、符号語の検出の有無を示す変数idx_validに「No」が設定される(ステップS811)。また、符号バッファ281の読出し先頭位置を示すtが「0」にリセットされる(ステップS812)。
図11は、本発明の実施の形態における処理「VLD_DECODE」の処理手順例を示す図である。この処理「VLD_DECODE」のオペランドとしては、ccと、vrsと、cascadeが用いられる。ccは条件コードレジスタ260のアドレスを示すために用いられるパラメータである。vrsは、構成情報レジスタファイル270のアドレスを示すために用いられるパラメータである。cascadeは、カスケード機能を用いるか否を示すために用いられるパラメータである。「vld_decode」命令では、cascadeは「No」であり、「vld_decode_cascade」命令では、cascadeは「Yes」である。
まず、構成情報レジスタファイル270の1つのレジスタの内容(128ビット)が図5のように変数CCMAPおよびVLDCTXとして割り当てられる(ステップS821)。そして、VLDCTXをパラメータとして処理「VLD_DEC」が実行される。その結果、戻り値として符号番号IDおよび符号長lenが得られる(ステップS822)。
また、符号番号IDに対応するCCMAPが変数condに設定されるとともに、符号番号IDが一致の不検出を意味する符号番号EIDであれば変数condexに「1」が、符号番号EIDでなければ「0」が設定される(ステップS823)。
パラメータcascadeが「Yes」かつ変数idx_validが「Yes」である場合以外、すなわち、パラメータcascadeが「No」または変数idx_validが「No」である場合、変数v_lenに符号長lenの値が設定される(ステップS825)。この変数v_lenは、有効な符号長を保持する変数である。
そして、(len+2)をパラメータとして、処理「SHOWBITS」が実行される(ステップS826)。これにより、検出された符号長のさらに2ビット先まで参照されて、ビットデータret_bitsが戻り値として得られる。
また、変数flag_cascadeにパラメータcascadeの値が設定されるとともに、変数xbitにはビットデータret_bitsの下2桁の値が設定される(ステップS827)。すなわち、変数xbitには、検出された符号長のさらに2ビット先の分が保持される。
また、戻り値として、条件コードレジスタ260のccにより示されるレジスタに変数condの値が設定され、条件コードレジスタ260の(cc+1)により示されるレジスタに変数condexの値が設定される(ステップS828)。
図12は、本発明の実施の形態における処理「VLD_DEC」の処理手順例を示す図である。この処理「VLD_DEC」のオペランドとしては、変数VLDCTXが用いられる。変数VLDCTXは、構成情報のうち符号語検出器321の構成を示す情報である。
まず、「16」をパラメータとして処理「SHOWBITS」が実行される(ステップS831)。その結果、戻り値として16ビット分のストリームデータが変数STREAM16BITに得られる。また、変数VLDCTXをパラメータとして処理「VLD_CONFIG」が実行される(ステップS832)。これにより、符号語検出器321の構成が設定される。そして、符号番号を示す変数DIDに一致の不検出を意味する符号番号EIDが設定され、符号長を示す変数DCLに「0」が設定され、符号番号のカウンタIDに「16」が設定される(ステップS833)。
その後、カウンタIDが「0」以下になるまで以下の処理が繰り返される(ステップS834)。変数STREAM16BITとCMPMASK(ID)の論理積演算の結果が比較対象ストリームデータを示す変数CMPSTREAM(ID)に設定される(ステップS835)。ID番目の符号語検出器321で検出される符号語を示す変数CMPCODE(ID)の値が変数CMPSTREAM(ID)の値と一致すると(ステップS836)、そのときの変数IDの値が変数DIDに設定されるとともに、変数IDに対応する符号長CL(ID)が変数DCLに設定される(ステップS837)。その後、変数IDの値が「1」減算される(ステップS838)。
この処理「VLD_DEC」の戻り値として、符号番号を示す変数DIDおよび符号長を示す変数DCLの値が出力される(ステップS822参照)。
図13は、本発明の実施の形態における処理「SHOWBITS」の処理手順例を示す図である。この処理「SHOWBITS」のオペランドとしては、変数lengthが用いられる。変数lengthは符号バッファ281から読み出すビット数を示す変数である。
まず、ビット数を計数するカウンタiおよび読み出されたストリームデータを保持する変数ret_bitsがそれぞれ「0」にリセットされる(ステップS851)。そして、カウンタiを「1」ずつ増加させながら(ステップS854)、カウンタiが変数lengthの値よりも小さい間(ステップS852)、以下の処理を繰り返す。すなわち、符号バッファ281からストリームデータの第(t+i)ビット目が読み出されるとともに、変数ret_bitsを1ビット左シフトさせて空いた最下位ビットにその読み出されたストリームデータが補填される(ステップS853)。なお、符号バッファ281におけるストリームデータの先頭データは第0ビットとする。
この処理「SHOWBITS」の戻り値として、変数ret_bitsの値が出力される(ステップS831参照)。
図14は、本発明の実施の形態における処理「VLD_CONFIG」の処理手順例を示す図である。この処理「VLD_CONFIG」のオペランドとしては、変数VLDCTXが用いられる。変数VLDCTXは、構成情報のうち符号語検出器321の構成を示す情報である。
まず、変数VLDCTXの値が、D(16)〜D(10)、D(8)〜D(2)、CL(9)、CL(1)、CL(0)、GP(13)、GC(13)、GP(9)、GC(9)、GP(5)、GC(5)、GP(0)、GC(0)、UC(16)〜UC(0)の各変数に設定される(ステップS841)。これは、図5の構成情報を、変数として展開することに相当する。変数Dは差分を示す変数である。変数CLは符号長を示す変数である。変数GP、GC、UCは、それぞれ図4により説明した符号語を示す変数である。
そして、変数CL(0)、CL(1)およびCL(9)には「1」が加算される(ステップS842)。構成情報においては記憶領域を短縮するために、(符号長−1)の形式で保持しているからである。また、それ以外の変数CLには差分を考慮して変数Dが加算される(ステップS843)。構成情報においては記憶領域を短縮するために、第0、1および9番目以外の符号長としては差分のみを保持しているからである。これにより、差分から符号長が復元されることになる。
また、変数GPおよび変数GCには、グループ毎に共通の値が設定される(ステップS844)。構成情報においては記憶領域を短縮するために、変数GPおよび変数GCについてはグループを代表する値のみを保持しているからである。
その後、符号番号を示すカウンタIDが「0」にリセットされた後に(ステップS845)、カウンタIDが「1」ずつ加算されて(ステップS849)、カウンタIDが「16」以下である間(ステップS846)、以下の処理が行われる。すなわち、符号語を示す変数CW(ID)において、GP(ID)が「1」であればMSB側に「0xffc0」が設定され、GP(ID)が「0」であればMSB側に「0」が設定される。これにより、GP(ID)から連続するビット値が復元される。また、GC(ID)が4ビット左シフトされて空いた下位4ビットの位置にUC(ID)が設定されて、変数CW(ID)に加算される(ステップS847)。また、「16」から変数CL(ID)を減じた値の示す回数分、変数CW(ID)が左シフトされ、16ビット幅のデータとして変数CMPCODE(ID)に設定される(ステップS848)。また、「16」から変数CL(ID)を減じた値の示す回数分、「0xffff」(「0x」以降の数字は16進数を表す。以下同様)が左シフトされ、16ビット幅のデータとして変数CMPMASK(ID)に設定される(ステップS848)。
図15は、本発明の実施の形態における処理「VLD_SHOW」の処理手順例を示す図である。この処理「VLD_SHOW」のオペランドとしては、変数rdと、変数baseと、変数offsetと、変数exceptが用いられる。変数rdは、汎用レジスタファイル220のアドレスを示すためのパラメータである。変数baseは、復号情報テーブルのベースアドレスを示すためのパラメータである。変数offsetは、復号情報テーブルにおけるオフセット値を示すためのパラメータである。変数exceptは、符号語の一致が検出されなかった場合の復号情報テーブル内の相対位置を示すために用いられるパラメータである。
まず、変数flag_cascadeの値が「Yes」かつ変数idx_validの値が「Yes」であれば(ステップS911)、ステップS912乃至S915の処理がスキップされる。
変数IDがEIDであれば(ステップS912)、変数v_idxには変数exceptの値が設定されるとともに、変数idx_validには「No」が設定される(ステップS914)。一方、変数IDがEIDでなければ(ステップS912)、変数v_idxには変数IDの値に変数offsetの値を加算した値が設定されるとともに、変数idx_validには「Yes」が設定される(ステップS913)。
また、変数v_idxを「4」倍した値に変数baseの値を加算した値が、変数addressに設定される(ステップS915)。すなわち、変数addressには、復号情報テーブルの符号語に対応するメモリ140上のアドレス(テーブルアドレス)が保持される。
そして、変数get_lenに変数v_lenの値が設定されるとともに、汎用レジスタファイル220のうちアドレスrdの示すレジスタに変数addressの値が設定される(ステップS916)。
図16は、本発明の実施の形態における処理「VLD_SHOW_S」の処理手順例を示す図である。この処理「VLD_SHOW_S」のオペランドとしては、処理「VLD_SHOW」と同様に、変数rdと、変数baseと、変数offsetと、変数exceptが用いられる。
まず、変数flag_cascadeの値が「Yes」かつ変数idx_validの値が「Yes」であれば(ステップS921)、ステップS922乃至S925の処理がスキップされる。
変数IDがEIDであれば(ステップS922)、変数v_idxには変数exceptの値が設定されるとともに、変数idx_validには「No」が設定される(ステップS924)。一方、変数IDがEIDでなければ(ステップS922)、変数v_idxには変数IDの値に変数offsetの値を加算した値が設定されるとともに、変数idx_validには「Yes」が設定される(ステップS923)。ここまでの処理は、処理「VLD_SHOW」と同様である。
また、変数v_idxを1ビット左シフトして空いた下位1ビットにおいて変数xbitの下位1ビットを設定したものを「4」倍して、変数baseの値を加算した値が、変数addressに設定される(ステップS925)。すなわち、変数addressには、1ビット読み進めた際の、復号情報テーブルの符号語に対応するメモリ140上のアドレス(テーブルアドレス)が保持される。
そして、変数v_lenに「1」を加算した値が変数get_lenに設定されるとともに、汎用レジスタファイル220のうちアドレスrdの示すレジスタに変数addressの値が設定される(ステップS926)。
図17は、本発明の実施の形態における処理「VLD_SHOW_SS」の処理手順例を示す図である。この処理「VLD_SHOW_SS」のオペランドとしては、処理「VLD_SHOW」と同様に、変数rdと、変数baseと、変数offsetと、変数exceptが用いられる。
まず、変数flag_cascadeの値が「Yes」かつ変数idx_validの値が「Yes」であれば(ステップS931)、ステップS932乃至S935の処理がスキップされる。
変数IDがEIDであれば(ステップS932)、変数v_idxには変数exceptの値が設定されるとともに、変数idx_validには「No」が設定される(ステップS934)。一方、変数IDがEIDでなければ(ステップS932)、変数v_idxには変数IDの値に変数offsetの値を加算した値が設定されるとともに、変数idx_validには「Yes」が設定される(ステップS933)。ここまでの処理は、処理「VLD_SHOW」と同様である。
また、変数v_idxを2ビット左シフトして空いた下位2ビットにおいて変数xbitの下位2ビットを設定したものを「4」倍して、変数baseの値を加算した値が、変数addressに設定される(ステップS935)。すなわち、変数addressには、2ビット読み進めた際の、復号情報テーブルの符号語に対応するメモリ140上のアドレス(テーブルアドレス)が保持される。
そして、変数v_lenに「2」を加算した値が変数get_lenに設定されるとともに、汎用レジスタファイル220のうちアドレスrdの示すレジスタに変数addressの値が設定される(ステップS936)。
図18は、本発明の実施の形態における処理「VLD_GET」の処理手順例を示す図である。この処理「VLD_GET」のオペランドとしては、処理「VLD_SHOW」と同様に、変数rdと、変数baseと、変数offsetと、変数exceptが用いられる。
この処理「VLD_GET」では、図15により説明した処理「VLD_SHOW」が実行されるとともに(ステップS941)、処理「GETBITS」が実行される(ステップS942)。
図19は、本発明の実施の形態における処理「GETBITS」の処理手順例を示す図である。この処理「GETBITS」のオペランドとしては、変数lengthが用いられる。変数lengthは符号長を示すためのパラメータである。
この処理「GETBITS」では、図13により説明した処理「SHOWBITS」が実行されるとともに(ステップS861)、ストリームデータの読出し位置tに変数lengthの値が加算される(ステップS862)。すなわち、処理「SHOWBITS」によってストリームデータが読み出されるだけでなく、読出し位置の更新も行われることになる。
図20は、本発明の実施の形態における処理「VLD_GET_S」の処理手順例を示す図である。この処理「VLD_GET_S」のオペランドとしては、処理「VLD_SHOW」と同様に、変数rdと、変数baseと、変数offsetと、変数exceptが用いられる。
この処理「VLD_GET_S」では、図16により説明した処理「VLD_SHOW_S」が実行されるとともに(ステップS951)、処理「GETBITS」が実行される(ステップS952)。
図21は、本発明の実施の形態における処理「VLD_GET_SS」の処理手順例を示す図である。この処理「VLD_GET_SS」のオペランドとしては、処理「VLD_SHOW」と同様に、変数rdと、変数baseと、変数offsetと、変数exceptが用いられる。
この処理「VLD_GET_SS」では、図17により説明した処理「VLD_SHOW_SS」が実行されるとともに(ステップS961)、処理「GETBITS」が実行される(ステップS962)。
図22は、本発明の実施の形態における命令セットを想定したC言語コンパイラのビルトイン関数の一例を示す図である。これらのビルトイン関数は、レジスタの自動割り当てがなされた後に、対応するアセンブラ命令に置き換えられる。また、条件コードレジスタ260に基づいて分岐するif文に対しては、vld_br命令が生成されることを想定している。プログラム中のint型変数cond0およびcond2は、条件コードレジスタ260のCC[0]とCC[2]であると、コンパイラが自動的に解釈することを想定する。
関数「void vld_baseaddr(int * addr)」は、変数addrを汎用レジスタファイル220のR[rs]に格納した後に、命令「vld_baseaddr rs」を実行するものである。
関数「int vld_decode(int ctx)」は、変数ctxの示すレジスタ番号をvrsとして、命令「vld_decode cc,vrs」を実行するものである。この関数は、CCR[cc]およびCCR[cc+1]を戻り値として返す。
関数「int vld_decode_cascade(int ctx)」は、変数ctxの示すレジスタ番号をvrsとして命令「vld_decode_cascade cc,vrs」を実行するものである。この関数は、CCR[cc]およびCCR[cc+1]を戻り値として返す。
関数「int vld_get(int offset, int except)」は、命令「vld_get rd,offset,except」を実行するものである。この関数は、汎用レジスタファイル220のR[rd]の値を戻り値として返す。
関数「int vld_get_s(int offset, int except)」は、命令「vld_get_s rd,offset,except」を実行するものである。この関数は、汎用レジスタファイル220のR[rd]の値を戻り値として返す。
関数「int vld_show(int offset, int except)」は、命令「vld_show rd,offset,except」を実行するものである。この関数は、汎用レジスタファイル220のR[rd]の値を戻り値として返す。
関数「int vld_show_s(int offset, int except)」は、命令「vld_show_s rd,offset,except」を実行するものである。この関数は、汎用レジスタファイル220のR[rd]の値を戻り値として返す。
関数「int showbits(int len)」は、変数lenを汎用レジスタファイル220のR[rs]に格納した後に、命令「showbits rd,rs」を実行するものである。この関数は、汎用レジスタファイル220のR[rd]の値を戻り値として返す。
関数「int getbits(int len)」は、変数lenを汎用レジスタファイル220のR[rs]に格納した後に、命令「getbits rd,rs」を実行するものである。この関数は、汎用レジスタファイル220のR[rd]の値を戻り値として返す。
関数「void load_v(int ctx, int * addr)」は、変数ctxの示すレジスタ番号をvrdとして、(offset+R[rs])の値の値が変数addrの値と等しくなるように変数offsetと汎用レジスタファイル220のR[rs]を設定して、命令「load_v vrd,offset(rs)」を実行するものである。
関数「void store_v(int ctx, int * addr)」は、変数ctxの示すレジスタ番号をvrsとして、(offset+R[rs])が変数addrの値と等しくなるように変数offsetと汎用レジスタファイル220のR[rs]を設定して、命令「store_v vrs,offset(rs)」を実行するものである。
これらビルトイン関数を利用することにより、図9に示した機械語命令を意識したプログラミングをC言語において行うことが可能となる。
図23は、本発明の実施の形態における復号対象となる符号の一例として、MPEG規格において定義されたMBAI(MacroBlock Address Increment)の符号表を示す図である。MBAIは、マクロブロックの位置として、1つ前のマクロブロックとの絶対アドレスの差(インクリメント値)を表すものである。この符号表には、MBAIを表す復号情報とその符号語との対応関係が示されている。ただし、MS(Macroblock Stuffing)とME(Macroblock Escape)は、それぞれ「34」と「35」という復号情報に割り当てられる。
図24は、図23の符号表を表現する符号木の一例を示す図である。根(root)は長さ「0」の空の記号列であり、根から始まり、長さが1つ増える毎に2進記号{0,1}が増えるため、その2通りを子のノード(node)として増やす。符号表によっては子が一つのノードもある。そして、符号表の符号語と等しい記号列は、子ノードがない葉(leaf)となる。ここで、ノードは円形で表し、葉は特別に七角形で表すものとする。このように符号表は符号木で表現することができる。
ここで、2進木を表現するための情報量はどの程度必要であるかを考える。全てのノードについて、そのノードが子を持つかどうか不明であるとき、その確率は「0.5」である。したがって、「ノードが子を持つかどうか」の情報は、「−log(0.5)/log2=1」ビットでエントロピーに等しい最小の表現ができる。たとえば、ノードが子を持てば「1」を、葉であれば「0」を符号として割り当てることとする。根ノードから順番にその子ノードの符号化を行っていく。「1」であれば、左の枝の子ノードの子ノードを符号化していく。左の枝の子ノード以下の部分木すべての符号化が終われれば、右の枝の子ノード以下の部分木を符号化する。つまり、木を左の枝から順番に左手探索して全てのノードを順番に符号化することになる。
そのような考え方により、図24の符号木を何ビットで表現できるかを検討する。同図には子ノードが1つしかないノードがあるため、そのような場合にはもう1つの枝の子ノードとして葉を補うことによって、符号化することとする。ノードと葉の数は75個で、6個の葉を補うため、計81ビットで表現できることになる。つまり、理想的には図23の符号表は、81ビット程度で定義することができるということを意味する。
ところが、単純に固定長の符号で、符号値と符号長を表現すると、符号値は11ビット、符号長は最大の11を表すのに4ビット必要になるため、1つの符号語に対して15ビットが必要になる。符号語が35個あるため、15×35=525ビットを要することになる。一方、上述の81ビットの表現では、木の全てを復号しないと符号語が分からず、また、木の復号処理は複雑なためハードウェア化しても高速に処理することは困難である。その点、525ビットの表現では、符号語は符号表を表すテーブルを参照することにより速やかに判明するため、そのようなテーブルを探索するだけで済む。
これに対し、図5に示した構成情報の表現では、構成VLDCTXは110ビットである。本発明はハードウェア化しても高速に処理することが可能であるため、1つの構成情報で図23の大半を表現できるのであれば無駄が少ない表現ができたと考えることができる。
図25は、図23の符号表により定義される符号を復号する際の、構成情報と復号符号値、復号情報および符号語との対応関係の一例を示す図である。図25(a)が構成情報であり、復号処理RVLDにおける処理対象となる。図25(a)の構成情報で復号されなかった符号語は、ノード(CODENODE)として接頭語のみが復号されて、残りの部分は図25(b)乃至(d)により処理される。すなわち、復号符号番号が「7」の場合には、図25(b)により、復号情報「16」乃至「25」の何れであるかが決定される。また、復号符号番号が「10」の場合には、図25(c)により、復号情報「26」乃至「33」の何れであるかが決定される。また、復号符号番号が「32」の場合には、図25(d)により、復号情報「34」または「35」の何れであるかが決定される。
図26は、図25(a)に対応する符号木の一例である。図27は、図25(b)および(d)に対応する符号木の一例である。図28は、図25(c)に対応する符号木の一例である。
図29は、図23の符号表により定義される符号を復号するC言語プログラムの一例である。このプログラム例では、図25に示す1つの構成情報で大半の木を表現し、残りを単純な処理で復号する。
このプログラム例において、関数vldが、図23の符号表の符号語を復号するメインの関数である。この関数vldは、葉(CODELEAF)に分類された場合には復号情報テーブルの値を返し、ノード(CODENODE)または不一致(EID)に分類された場合には別途関数コールによって接尾語を復号する。「if(cond0)」の部分において、CCMAPから生成された条件コードに基づいて分岐することによって葉(CODELEAF)か否かの判定を行う。この部分の機械語命令としては、分岐命令であるvld_br命令が用いられる。
関数decEIDは、復号符号番号が「32」の場合に、図25(d)によって復号を行う関数である。すなわち、関数decEIDは、8ビット読み進めて、「0x0f」と一致すれば「34」を関数値として返し、それ以外の場合には「35」を関数値として返す。
関数dec7は、復号符号番号が「7」の場合に、図25(b)によって復号を行う関数である。すなわち、「25」から3ビットの接尾語の2倍を減算した上で、3ビットの接尾語が「000」であれば2ビット読み進め、それ以外の場合には1ビット読み進めて、その読み進められた数をさらに減算する。その結果、関数dec7は、「16」乃至「25」の何れかを関数値として返す。
関数dec10は、復号符号番号が「10」の場合に、図25(c)によって復号を行う関数である。すなわち、関数dec10は、「33」から3ビットの接尾語を減算した値を関数値として返す。
変数VCTX0は、図5の構成情報が格納されるメモリ140上のアドレスを保持する変数である。なお、この変数VCTX0の値は、4つの定数C0、C1、C2およびC3により与えられる。
変数VLDTBLは、共用体として定義される変数であり、整数または関数のポインタを要素として有する配列vld_table[18]と同じメモリ領域に割り当てられる。配列vld_table[18]は、復号情報テーブルであり、図25(a)の左から2番目の列の復号情報または関数のポインタを保持する。これにより、ノード(CODENODE)または不一致(EID)に分類された場合には関数decEID、dec7またはdec10が呼び出され、葉(CODELEAF)に分類された場合には復号情報(整数値)が関数値として出力される。
関数vld_baseaddrは、復号情報テーブルのベースアドレスを設定するビルトイン関数である。関数load_vは、構成情報を構成情報レジスタファイル270に読み出すビルトイン関数である。
関数vld_decodeは、復号符号番号の決定および条件コード情報の生成を行うビルトイン関数である。変数cond0には、対応する復号符号番号IDのCCMAP(ID)の値が関数値として出力される。
関数vld_getは、復号符号番号にオフセット値(この例の場合は「1」)を加算して復号情報テーブルにおけるアドレスを取得するとともに、符号長相当のストリームデータを読み進めるビルトイン関数である。変数tblpには、復号情報テーブルにおけるアドレス(ポインタ)が関数値として出力される。
このように、簡単なプログラムと1つの構成情報によって、図23の符号表の符号語を復号することができることがわかる。
図30は、図23の符号表により定義される符号を復号する際の、構成情報と復号符号値、復号情報および符号語との対応関係の他の例を示す図である。この例では、図30(a)および(c)の2つの構成情報を用いて大半の木を表現し、残りの符号語の接尾語を全て同じビット数(1ビット)にするように工夫している。接尾語を全て同じ長さにすることにより後処理を共通化できるため、図29の復号情報テーブルのように関数をテーブル化する必要はなく、単純な分岐処理で済ませることができる。
図30(a)は、通常の構成情報であり、vld_decode命令を用いて処理される。図30(c)は、カスケード機能を想定した構成情報であり、vld_decode_cascade命令を用いて処理される。この2つの構成情報により34個のテーブルを連続してインデックスできるように、オフセットの設定が工夫されている。
図30(b)、(d)乃至(h)は、ノード(CODENODE)に分類された符号語と接尾語の対応関係を示すものである。復号符号番号が「16」の場合には、図30(b)が用いられる。通常の構成情報において、復号符号番号が「16」の場合には図30(b)が用いられる。カスケード機能を想定した構成情報において、復号符号番号が「0」の場合には図30(d)が用いられる。カスケード機能を想定した構成情報において、復号符号番号が「1」の場合には図30(e)が用いられる。カスケード機能を想定した構成情報において、復号符号番号が「2」の場合には図30(f)が用いられる。カスケード機能を想定した構成情報において、復号符号番号が「3」の場合には図30(g)が用いられる。カスケード機能を想定した構成情報において、復号符号番号が「4」の場合には図30(h)が用いられる。これらにおいては、残差符号長は全て「1」になっている。これは、構成情報を1つ多く使用することによりプログラムがより単純になる場合の、良い一例を示している。
図31は、図23の符号表により定義される符号を復号するC言語プログラムの他の例である。このプログラム例では、図30に示す2つの構成情報で大半の木を表現し、残りを単純な処理で復号する。
変数VCTX0およびVCTX1は、2つの構成情報が格納されるメモリ140上のアドレスをそれぞれ保持する変数である。なお、変数VCTX0の値は4つの定数C0、C1、C2およびC3により与えられ、変数VCTX1の値は4つの定数C4、C5、C6およびC7により与えられる。
配列vld_table[17+17]は、復号情報テーブルであり、図30(a)および(c)の2つの復号情報をつなげるように工夫されている。
関数vldがメインの関数である点は図29と同様である。この関数vldでは、関数vld_baseaddrによって復号情報テーブルのベースアドレスが設定され、2つの関数load_vによって2つの構成情報が構成情報レジスタファイル270に読み出される。
この例では、カスケード機能が用いられており、符号語検出器321の構成情報の内容が異なるものに変更された上で、連続して復号処理が行われている。1つ目の構成情報を用いて関数vld_decodeが実行されて、変数cond0には対応する復号符号番号IDのCCMAP(ID)の値が関数値として出力される。2つ目の構成情報を用いて関数vld_decode_cascadeが実行されて、変数cond2には対応する復号符号番号IDのCCMAP(ID)の値が関数値として出力される。「if(cond1||cond2)」は条件コードレジスタ260の2つのビットを使用して、2つのvld_br命令によって処理される。
すなわち、CCMAPが「0」の場合には復号情報が関数値として出力され、それ以外の場合にはさらに1ビット読み進められた接尾語を復号情報から減じた数が関数値として出力される。このように、残差符号の接尾語を工夫することにより、処理を単純化することが可能である。
図32は、本発明の実施の形態における復号対象となる符号の第2の例を示す図である。この例では、符号語が16個で、最大符号長も6ビットであるため、図5の構成情報によりうまく表現でき、符号木の全体を1つの構成情報でカバーすることができる。固定長でテーブルを作った場合には、(6+3)×16=144ビットとなる例である。
図33は、図32の符号表を表現する符号木の一例を示す図である。この木を符号化すると、30ビットで表現できる。
図34は、図32の符号表により定義される符号を復号する際の、構成情報と復号符号値、復号情報および符号語との対応関係の一例を示す図である。この例では符号語が16個であるため、符号語検出器321を17個設けた場合には、1個分が余ってしまうことになる。そのため、復号符号番号が「16」の符号語検出器321の構成は、それより優先順位の高い復号符号番号が「15」の符号語検出器321と同じ構成にすることによって、復号符号番号が「16」の符号語検出器321が選択されないようにしている。
図35は、図32の符号表により定義される符号を復号するC言語プログラムの例である。この例では、符号語の数が少なく、全てを葉(CODELEAF)に分類することができるため、CCMAPも使用することなく、単純なプログラムにより実現することができる。
図36は、本発明の実施の形態における復号対象となる符号の第3の例を示す図である。この例においても符号語が16個であるが、最大符号長は9ビットとなっている。符号木は図37のようになり、これも30ビットで表現できるが、固定長でテーブルを作った場合には、(9+4)×16=208ビットとなる。図32の符号表と比べて、同じビット数で符号化できていても、固定長ビットのテーブルでは44%多くなってしまう。
また、この例ではMSB側のビットにおいて「0」が連続するものと「1」が連続するものの両者が混ざっているため、GPおよびGCをグループ毎に変えて対応することが有効になる。ただし、MSB側の連続するビットを除いた残りの接尾語は最大7ビットであり、GCが2ビット、UCが4ビットの計6ビットでは足りないことになる。
図37は、図36の符号表を表現する符号木の一例を示す図である。
図38は、図36の符号表により定義される符号を復号する際の、構成情報と復号符号値、復号情報および符号語との対応関係の一例を示す図である。図38(a)が構成情報であり、復号処理RVLDにおける処理対象となる。図38(a)の構成情報で復号されなかった符号語は、ノード(CODENODE)として接頭語のみが復号されて、接尾語は図38(b)または(c)により処理される。すなわち、復号符号番号が「11」の場合には、図38(b)により、復号情報「11」または「13」の何れであるかが決定される。また、復号符号番号が「14」の場合には、図38(c)により、復号情報「9」または「10」の何れであるかが決定される。ノード(CODENODE)に割り当てられた部分は、図37において四角形により囲まれている。
この構成情報では、2つをノード(CODENODE)にしたことにより、符号語検出器321が3個余ってしまうため、復号符号番号「12」、「15」および「16」は優先順位を使ったダミーの設定にしている。
図39は、図36の符号表により定義される符号を復号するC言語プログラムの例である。このプログラムは、図38の1つの構成情報と2つの関数によって復号処理を行う。図36の符号表による符号では、GCとUCのビット数が足りないため、符号語の数が符号語検出器321の数より少ないにもかかわらず、この構成情報によって木全体を表現することができない。そのため、この例では、ノード(CODENODE)に分類したものを別の関数で別途処理している。別の関数で処理するか否かについて、CCMAPを使って分岐する処理を行っているのが、「if(cond0)」の部分である。
図40は、本発明の実施の形態における復号対象となる符号の第4の例を示す図である。この例では、復号情報が「0」であるものを除いた全てにおいて、最後の1ビットが復号情報の正負を表わしている。木を符号化すると130ビットであり、固定長テーブルで表すと(13+4)×65=1105ビットである。
図41は、図40の符号表により定義される符号を復号する際の、構成情報と復号符号値、復号情報および符号語との対応関係の一例を示す図である。図41(a)が通常の構成情報であり、図41(b)がカスケード機能を想定した構成情報である。この例では、接尾語が1ビットである符号語の接頭語が多数を占めるように構成情報が工夫されており、vld_show_s命令やvld_get_s命令によって効率良く処理できるようになっている。この構成情報において、「CODENODE1」は接尾語が1ビットであり、「CODENODE2」は接尾語が2ビットのものを意味している。
図42および図43は、図40の符号表を表現する符号木の一例を示す図である。図42が、図41(a)の構成情報によってカバーされる符号語の符号木である。カバーできなかったものは、同図において三角形で表している4つのノードcascade1、cascade2、cascade3およびcascade4である。cascade1、cascade2、cascade3、cascade4は、図43の4つの符号木が対応しており、図41(b)の構成情報でほぼ全てがカバーされている。
図44は、図40の符号表により定義される符号を復号するC言語プログラムの例である。このプログラムでは、カスケード機能により2つの構成情報用いるとともに、構成情報ごとにCCMAPの使い方を変えて、「if(cond0)」と「if(cond2)」のような分岐のネストによって処理を実現している。上述のように、接尾語が1ビットである符号語の接頭語が多数を占めるように構成情報が工夫されているが、1つだけ接尾語が2ビットであるものがあるため、それをif(cond2)で別に処理するように分岐している。
CODENODE2に分類されているのは、図43のcascade3から始まる符号木であり、四角形で囲まれた部分が構成情報に含まれない接尾語に対応する。その接尾語は2ビットであるため、vld_get_s命令およびgetbits命令によって1ビットずつ処理している。
図42と図43において四角形で囲まれたもののうち、cascade3以外のものは接尾語が1ビットのものに対応しており、vld_show_s命令またはvld_get_s命令によって処理される。vld_show_s命令およびvld_get_s命令があるため、高さの大きな符号木にも十分対応できる。他のプログラムと比べても、分岐の数もそれほど増えず、あまり複雑な処理もないため、より少ないサイクル数で処理できることが期待できる。2つの構成情報で大半をカバーしているのにもかかわらず、17個の4倍近い65個の符号語に対応できている。
このように、本発明の実施の形態によれば、複数の符号語検出器321を備える復号装置において、それぞれの符号語検出器312の構成情報を圧縮して構成情報レジスタファイル270に保持するとともに、平均的な復号時間を短縮することができる。
本発明の実施の形態では、100ビット程度の少ない構成情報で符号木を表現するが、復号処理が複雑にならずにプログラムをより効率良く記述することができる。MPEG1、MPEG2、MPEG4、H.263、VC−1など動画圧縮規格では、17個以下の符号語で構成される符号表が少なくないため、そのような小さな符号表のほとんどが17個の符号語検出器321に基づいて1、2命令(vld_decode命令やvld_show命令など)で処理できるようになる。符号語検出器321は、シフタ、論理積演算器、比較器、加算器などの単純な演算器を少数組み合わせた回路で実現できるため、高周波数でも低レイテンシの回路で実装できる。
本発明の実施の形態では、符号語が沢山ある符号表や、符号木全体を1つの構成情報ではうまく表現できない符号表を扱う場合には、カスケード機能で複数の構成情報を用いる方法や、接頭語の符号木を1つの構成情報で処理し、接尾語の処理はCCMAPによる分岐を使って対応するなどの方法で対応することができる。その上、プログラムも簡素なまま実現することができる。出現頻度が高いために符号長が短く設計された符号語を接頭語の符号木の葉に入れることで、符号長の短い符号語は接尾語の処理をしなくてよいようにすると、符号長の短い符号語の復号処理サイクル数を符号長の長い符号語の復号処理サイクル数よりも小さくすることができる。これにより、平均的な処理サイクルを少なくすることができる。
本発明の実施の形態では、図29のC言語プログラムのように共用体unionを使った復号情報テーブルを用いることによって、後処理のための関数ポインタと後処理の要らない復号情報の整数値とを混在して記述することができる。この復号情報テーブルの参照の際には、CCMAPを用いることにより、関数コールかデータ参照かを判定することができる。これにより、プログラムを非常に簡潔に記述することができる。復号情報テーブルにおいても、関数ポインタと整数値を別々に保持する必要がなくなる。vld_get系の命令において復号情報テーブルのベースアドレスとインデックスの加算を行うことによって、汎用命令の加算命令、シフト命令、ロード命令を減らすことができる。また、カスケード機能によって分岐処理を少なくできる。
符号長を短いものからの順番に割り当てることを想定して、構成情報の符号語の長さを相対的な差によって定義するようにすれば相対的な差は短いビット数で表現することができる。これを利用することにより、本発明の実施の形態では、構成情報をより小さく表現することができる。
本発明の実施の形態では、グループ分けをして上位ビットをグループで共通に定義することで、構成情報をより小さく表現することができる。
本発明の実施の形態では、汎用のプロセッサに僅かな回路と命令の追加によって、プロセッサに元々備えられている汎用の命令やデータキャッシュをうまく利用しながら復号処理を効率良く処理することができる。また、再構成が可能なことから複数のコーデックへの対応も構成情報とプログラムの変更で容易に実現することができる。
なお、本発明の実施の形態は本発明を具現化するための一例を示したものであり、以下に示すように特許請求の範囲における発明特定事項とそれぞれ対応関係を有するが、これに限定されるものではなく本発明の要旨を逸脱しない範囲において種々の変形を施すことができる。
また、本発明の実施の形態では、復号ユニット290を備えるプロセッサ120について説明したが、本発明はこれに限定されるものではなく、復号ユニット290の処理をソフトウェアにより実現してもよい。
また、本発明の実施の形態において説明した処理手順は、これら一連の手順を有する方法として捉えてもよく、また、これら一連の手順をコンピュータに実行させるためのプログラム乃至そのプログラムを記憶する記録媒体として捉えてもよい。このような記録媒体として、例えば、CD(Compact Disc)、MD(MiniDisc)、DVD(Digital Versatile Disk)、メモリカード(memory card)、ブルーレイディスク(Blu-ray Disc(登録商標))等の記録媒体を用いることができる。