次に本発明の実施の形態について図面を参照して詳細に説明する。
図1は、本発明の実施の形態における算術復号装置の一例としてのCABAC復号器20の一構成例を示す図である。このCABAC復号器20は、符号列入力部10から符号化データを受け取り、二値信号に復号(デコード)した後に、多値信号に多値化するものである。このCABAC復号器20は、二値算術符号復号処理部21と、コンテキストインデックス計算処理部22と、コンテキスト変数テーブル保持部23と、多値化処理部24とを備えている。
コンテキストインデックス計算処理部22は、コンテキストインデックス(ctxIdx)を計算して、その計算されたctxIdxを二値算術符号復号処理部21に供給するものである。
コンテキスト変数テーブル保持部23は、各コンテキストに対応したコンテキスト変数をコンテキスト変数テーブルとして保持するものである。各コンテキスト変数は、出現確率を示す確率状態インデックスpStateIdxと、出現確率の高い優勢確率シンボル(MPS)を示すvalMPSとから構成される。コンテキスト変数テーブル保持部23に保持されるコンテキスト変数は、ctxIdxによって特定され、context[ctxIdx]と表される。
二値算術符号復号処理部21は、符号列入力部10から入力された符号化データを二値信号に復号するものである。この二値算術符号復号処理部21は、シンボルを1つ復号する際、コンテキストインデックス計算処理部22からctxIdxを受け取り、このctxIdxに基づいてコンテキスト変数テーブル保持部23からコンテキスト変数context[ctxIdx]を取得する。そして、このコンテキスト変数に基づいてシンボルを復号して、二値信号を多値化処理部24に出力する。
多値化処理部24は、二値算術符号復号処理部21から出力された二値信号を元の多値信号に多値化するものである。二値算術符号化の際にはシンタックス要素(SE:Syntax Element)に応じて多値信号から二値信号への変換が行われており、この多値化処理部24ではそのような二値信号を元の多値信号に戻す処理が行われる。ここで、シンタックス要素とは、H.264においてシンタックスで伝送することが規定されている情報である。
図2は、本発明の実施の形態における算術復号装置をCABAC復号コプロセッサ100として実現した場合の一構成例を示す図である。このCABAC復号コプロセッサ100は、CPU(Central Processing Unit)200に接続されるコプロセッサとして動作する。すなわち、CABAC復号コプロセッサ100は、CPU200から発行された命令に従って処理を行う。CPU200は、その作業領域としてメインメモリ300を使用する。メインメモリ300とCPU200との間には、命令を保持する命令キャッシュ310と、データを保持するデータキャッシュ320とが接続される。
CABAC復号コプロセッサ100は、CABAC復号演算器110と、ライトバック処理部115と、レジスタファイル120と、レジスタ転送処理部130と、ロードストア処理部140と、DMA制御部150と、INITIDC制御レジスタ160と、SLICEQPY制御レジスタ170と、命令デコード処理部180と、復号制御部190とを備える。
CABAC復号演算器110は、CABAC符号化方式により符号化されたデータを復号するための処理を行うものである。このCABAC復号演算器110は、復号制御部190からの指示に従って、復号に必要な処理を行う。ライトバック処理部115は、CABAC復号演算器110による処理結果をCPU200のレジスタ(図示しない)へ書き込むものである。なお、CABAC復号演算器110は、特許請求の範囲に記載の算術復号演算器の一例である。
レジスタファイル120は、コンテキスト変数を保持するためのレジスタである。このレジスタファイル120は、128ビット幅のレジスタを8本備えている。これら8本のレジスタをCV0乃至CV7と呼称する。8本のレジスタのうち4本(CV0乃至CV3)は、CABAC復号演算器110に直結された演算レジスタであり、CABAC復号演算器110にコンテキスト変数を供給して、CABAC復号演算器110による演算結果を保持するものである。また、残りの4本(CV4乃至CV7)は、演算レジスタの保持内容を退避するための退避レジスタである。この退避レジスタを利用することにより、特定のシンタックス要素のコンテキスト変数については、演算レジスタの保持内容をメインメモリ300等にストアすることなくレジスタファイル120において管理することができるようになる。なお、レジスタファイル120は、特許請求の範囲に記載の演算レジスタおよび退避レジスタの一例である。
レジスタ転送処理部130は、レジスタファイル120におけるレジスタ間の転送処理を行うものである。このレジスタ転送処理部130は、レジスタ間の転送の際に、後述するように、一部のビットを交換する機能を有する。また、このレジスタ転送処理部130は、後述するように、内部で生成した初期値をレジスタに設定する機能を有する。
ロードストア処理部140は、メインメモリ300からレジスタファイル120に対するロード処理、または、レジスタファイル120からメインメモリ300に対するストア処理を行うものである。なお、メインメモリ300へのアクセスはCPU200およびデータキャッシュ320を介して行われ、メインメモリ300にアクセスすることなくデータキャッシュ320上で処理が行われる場合もある。
DMA制御部150は、CABAC復号演算器110とメインメモリ300との間のDMA(Direct Memory Access)制御を行うものである。このDMA制御部150は、メインメモリ300から読み出したストリームをCABAC復号演算器110へ供給するストリーム入力処理、および、CABAC復号演算器110で復号された逆直交変換係数をメインメモリ300へ書き込む係数出力処理を行う。
INITIDC制御レジスタ160およびSLICEQPY制御レジスタ170は、コンテキスト変数の初期値を生成するための制御レジスタである。INITIDC制御レジスタ160は、初期化テーブルを決定するためのインデックスcabac_init_idcまたはスライスタイプを保持する。SLICEQPY制御レジスタ170は、スライスの量子化パラメータ(SliceQPY:Slice Quantisation Parameter Y)を保持する。なお、INITIDCとSLICEQPYはコンテキスト変数毎に変更する値ではないため、命令のオペランドとしてではなく、制御レジスタにより供給される。
命令デコード処理部180は、CPU200からCABAC復号コプロセッサ100に対して発行されたコプロセッサ命令を解読(命令デコード)するデコーダである。この命令デコード結果は復号制御部190に供給される。
復号制御部190は、命令デコード処理部180から供給された命令デコード結果に従って各部を制御するものである。この復号制御部190の出力は、信号線199を介して各部に供給される。
CABAC復号コプロセッサ100は、CPU200に接続されており、CPU200にはデータキャッシュ320と命令キャッシュ310が接続される。メインメモリ300上のデータはいずれかのキャッシュ経由でCPU200に読み出され、データキャッシュ320から追い出されたデータはメインメモリ300に書き込まれる。メインメモリ300は、例えば2次キャッシュなどを介して接続される場合も想定される。メインメモリ300上のプログラムは、命令キャッシュ310を介してCPU200に読み出されて、CABAC復号コプロセッサ100にも供給される。ここでは図示しないが、CPU200にもレジスタファイルとロードストア処理部が備えられており、ロードストア処理が行われる。データキャッシュ320はCPU200およびCABAC復号コプロセッサ100に共有されているため、CPU200とCABAC復号コプロセッサ100との間でキャッシュアクセスが競合しないように調停する機構がCPU200内に設けられる。CABAC復号コプロセッサ100のロードストア処理部140はCPU200を介してデータキャッシュ320へ接続されている。
各処理部は、接続されている処理部が処理中であって次サイクルで新しい処理が受け付けられなければ、受け付けられるまで待機するようになっている。例えば、CPU200は、命令デコード処理部180が命令を受け取ることができるときにのみ命令を出力し、または、命令が受け取られるまで同じ命令を出力し続ける。命令デコード処理部180は、復号制御部190が次サイクルで新しい処理の制御が可能であれば、復号制御部190に対する制御信号を生成する。復号制御部190は各処理部が次サイクルで新しい制御が可能であれば、命令実行のための制御を各処理部へ指示する。
図3は、本発明の実施の形態におけるシンタックス要素のコンテキストグループの一例を示す図である。本発明の実施の形態では、スライスタイプ毎に使用されるコンテキスト変数が限定されることを考慮するとともに、シンタックス要素が復号される順番を考慮して、コンテキスト変数を5つのコンテキストグループにグループ分けする。
第1のコンテキストグループは、マクロブロック(MB)タイプコンテキストグループである。このマクロブロックタイプコンテキストグループは、マクロブロックに関するシンタックス要素のグループであり、マクロブロック内のスライスのスライスタイプに応じてさらに3つに分類されるが、1つのスライスにおいては対応する1つの分類のみが使用される。
マクロブロックタイプコンテキストグループにおいて、Iスライス用のシンタックス要素としては、「mb_type(SI slices only)」および「mb_type(I slices only)」が分類される。「mb_type」は、マクロブロックタイプを示すシンタックス要素である。
マクロブロックタイプコンテキストグループにおいて、Pスライス用のシンタックス要素としては、「mb_skip_flag(P,SP slices only)」、「mb_type(P,SP slices only)」、および、「sub_mb_type(P,SP slices only)」が分類される。「mb_skip_flag」は、マクロブロックスキップフラグを示すシンタックス要素である。「sub_mb_type」は、サブマクロブロックタイプを示すシンタックス要素である。
マクロブロックタイプコンテキストグループにおいて、Bスライス用のシンタックス要素としては、「mb_skip_flag(B slices only)」、「mb_type(B slices only)」、および、「sub_mb_type(B slices only)」が分類される。
第2のコンテキストグループは、MVD(Motion Vector Difference)コンテキストグループである。このMVDコンテキストグループは、動きベクトル情報に関するシンタックス要素のグループである。このMVDコンテキストグループには、「mvd_l0[][][0]」、「mvd_l1[][][0]」、「mvd_l0[][][1]」、および、「mvd_l1[][][1]」が分類される。これらは、水平方向および垂直方向における動きベクトル情報を示すシンタックス要素である。
第3のコンテキストグループは、予測コンテキストグループである。この予測コンテキストグループは、画素予測に関するシンタックス要素のグループである。この予測コンテキストグループには、「ref_idx_l0」、「ref_idx_l1」、「mb_qp_delta」、「intra_chroma_pred_mode」、「prev_intra4x4_pred_mode_flag」、「prev_intra8x8_pred_mode_flag」、「rem_intra4x4_pred_mode」、および、「rem_intra8x8_pred_mode」が分類される。「ref_idx_l0」および「ref_idx_l1」は、参照インデックスを示すシンタックス要素である。「mb_qp_delta」は、マクロブロック量子化パラメータを示すシンタックス要素である。「intra_chroma_pred_mode」は、画面内色差予測モードを示すシンタックス要素である。「prev_intra4x4_pred_mode_flag」および「prev_intra8x8_pred_mode_flag」は、画面内輝度予測モードフラグを示すシンタックス要素である。「rem_intra4x4_pred_mode」および「rem_intra8x8_pred_mode」は、画面内輝度予測モードを示すシンタックス要素である。
第4のコンテキストグループは、ブロック情報コンテキストグループである。このブロック情報コンテキストグループは、ブロックの符号化方式などのブロック情報に関するシンタックス要素のグループである。このブロック情報コンテキストグループには、「mb_field_decoding_flag」、「coded_block_pattern」、および、「transform_size_8x8_flag」が分類される。「mb_field_decoding_flag」は、マクロブロックフィールド復号フラグを示すシンタックス要素である。「coded_block_pattern」は、符号化ブロックパターンを示すシンタックス要素である。「transform_size_8x8_flag」は、直交変換サイズ8×8フラグを示すシンタックス要素である。
第5のコンテキストグループは、residualコンテキストグループである。このresidualコンテキストグループには、「coded_block_flag」、「significant_coeff_flag」、「last_significant_coeff_flag」および「coeff_abs_level_minus1」が分類される。「coded_block_flag」は、符号化ブロックサイズを示すシンタックス要素である。「significant_coeff_flag」は、有意係数フラグを示すシンタックス要素である。「last_significant_coeff_flag」は、最終有意係数フラグを示すシンタックス要素である。「coeff_abs_level_minus1」は、係数絶対値情報を示すシンタックス要素である。
後述するように、第1乃至第4のコンテキストグループのシンタックス要素は復号処理の前半において復号されるものであり、第5のコンテキストグループのシンタックス要素は復号処理の後半において復号されるものである。すなわち、使用されるコンテキスト変数は、復号処理の進行状況に応じて変化する。以下では、これらコンテキストグループのシンタックス要素のコンテキスト変数とレジスタファイル120のレジスタとの関係について説明する。
図4は、本発明の実施の形態におけるマクロブロックタイプコンテキストグループのコンテキスト変数の割当例を示す図である。「cidx」は、この割当例における先頭からの相対的なコンテキストインデックスを示すものである。「ctxIdx」は、H.264において規定されたコンテキストインデックスを示すものである。以降の図においても同様である。
図4(a)は、Iスライス用のコンテキスト変数を割り当てた場合の例である。ここでは、レジスタの先頭から3個のコンテキスト変数が「mb_type(SI slices only)」に、続く8個のコンテキスト変数が「mb_type(I slices only)」にそれぞれ割り当てられている。
図4(b)は、Iスライス用のコンテキスト変数を割り当てた場合の他の例である。ここでは、レジスタの先頭から3個のコンテキスト変数が「mb_type(SI slices only)」に、続く8個のコンテキスト変数が「mb_type(I slices only)」にそれぞれ割り当てられている点は、図4(a)の場合と同様である。この例では、さらに3個のコンテキスト変数がブロック情報コンテキストグループの「transform_size_8x8_flag」に割り当てられている。
図4(c)は、Pスライス用のコンテキスト変数を割り当てた場合の例である。ここでは、レジスタの先頭から3個のコンテキスト変数が「mb_skip_flag(P,SP slices only)」に、続く7個のコンテキスト変数が「mb_type(P,SP slices only)」に、続く3個のコンテキスト変数が「sub_mb_type(P,SP slices only)」にそれぞれ割り当てられている。
図4(d)は、Bスライス用のコンテキスト変数を割り当てた場合の例である。ここでは、レジスタの先頭から3個のコンテキスト変数が「mb_skip_flag(B slices only)」に、続く9個のコンテキスト変数が「mb_type(B slices only)」に、続く4個のコンテキスト変数が「sub_mb_type(B slices only)」にそれぞれ割り当てられている。
これらのうち、最も多くのコンテキスト変数を含んでいるのが図4(d)である。この図4(d)には、16個のコンテキスト変数が含まれており、8ビット毎にコンテキスト変数を割り当てたとしても、8ビット×16個=128ビットとなり、レジスタファイル120の128ビット幅の1本のレジスタに保持することができることになる。
図5は、本発明の実施の形態におけるMVDコンテキストグループのコンテキスト変数の割当例を示す図である。ここでは、レジスタの先頭から7個のコンテキスト変数が「mvd_l0[][][0]」および「mvd_l1[][][0]」に、続く7個のコンテキスト変数が「mvd_l0[][][1]」および「mvd_l1[][][1]」にそれぞれ割り当てられている。この図5には14個のコンテキスト変数が含まれており、8ビット毎にコンテキスト変数を割り当てたとしても、8ビット×14個=112ビットとなり、レジスタファイル120の128ビット幅の1本のレジスタに保持することができることになる。
図6は、本発明の実施の形態における予測コンテキストグループのコンテキスト変数の割当例を示す図である。ここでは、レジスタの先頭から6個のコンテキスト変数が「ref_idx_l0」および「ref_idx_l1」に、続く4個のコンテキスト変数が「mb_qp_delta」に、続く4個のコンテキスト変数が「intra_chroma_pred_mode」に、続く1個のコンテキスト変数が「prev_intra4x4_pred_mode_flag」および「prev_intra8x8_pred_mode_flag」に、続く1個のコンテキスト変数が「rem_intra4x4_pred_mode」および「rem_intra8x8_pred_mode」にそれぞれ割り当てられている。この図6には16個のコンテキスト変数が含まれており、8ビット毎にコンテキスト変数を割り当てたとしても、8ビット×16個=128ビットとなり、レジスタファイル120の128ビット幅の1本のレジスタに保持することができることになる。
図7は、本発明の実施の形態におけるブロック情報コンテキストグループのコンテキスト変数の割当例を示す図である。ここでは、レジスタの先頭から12個のコンテキスト変数が「coded_block_pattern」に、続く3個のコンテキスト変数が「mb_field_decoding_flag」にそれぞれ割り当てられている。このブロック情報コンテキストグループのシンタックス要素には、3個のコンテキスト変数を要する「transform_size_8x8_flag」が分類されるが、これを合わせると18個のコンテキスト変数が含まれることになり、8ビット毎にコンテキスト変数を割り当てたとすると、8ビット×18個=144ビットとなり、レジスタファイル120の128ビット幅の1本のレジスタに保持することができなくなる。
ただし、「transform_size_8x8_flag」の3個のコンテキスト変数は、メインプロファイル(MP:Main Profile)では使用されないため、メインプロファイルのストリームに限定したCABAC復号器であれば1本のレジスタに保持することができる。一方、ハイプロファイル(HP:High Profile)のストリームを扱うためには、後述する交換転送機能を用いることにより、18個のコンテキスト変数を1本のレジスタ上で操作することになる。
このように、前半に復号される第1乃至第4のコンテキストグループのシンタックス要素については、それぞれのコンテキストグループに1本ずつのレジスタを割り当てることが可能である。したがって、前半の処理が終了した段階で4本の退避レジスタに必要なコンテキスト変数を全て退避することができることがわかる。これにより、第1乃至第4のコンテキストグループのコンテキスト変数については、メインメモリ300へのストア処理およびメインメモリ300からのロード処理が不要になる。
図8乃至図13は、本発明の実施の形態におけるresidualコンテキストグループのコンテキスト変数の割当例を示す図である。ここでは、H.264において規定されたブロックカテゴリー(ctxBlockCat)に従って、各シンタックス要素を6種類に分類することとする。
図8は、本発明の実施の形態におけるresidualコンテキストグループのブロックカテゴリー0のコンテキスト変数の割当例を示す図である。このブロックカテゴリー0では、まずフレーム符号化ブロックとフィールド符号化ブロックに共通するコンテキスト変数として、レジスタの先頭から10個のコンテキスト変数が「coeff_abs_level_minus1」に、第13番目から第16番目(cidx=12〜15)に「coded_block_flag」にそれぞれ割り当てられている。また、フレーム符号化ブロックのためのコンテキスト変数として、一方のレジスタの先頭から15個のコンテキスト変数が「significant_coeff_flag」に、もう一方のレジスタの先頭から15個のコンテキスト変数が「last_significant_coeff_flag」にそれぞれ割り当てられている。一方、フィールド符号化ブロックのためのコンテキスト変数として、一方のレジスタの先頭から15個のコンテキスト変数が「significant_coeff_flag」に、もう一方のレジスタの先頭から15個のコンテキスト変数が「last_significant_coeff_flag」にそれぞれ割り当てられている。
図9は、本発明の実施の形態におけるresidualコンテキストグループのブロックカテゴリー1のコンテキスト変数の割当例を示す図である。このブロックカテゴリー1では、まずフレーム符号化ブロックとフィールド符号化ブロックに共通するコンテキスト変数として、レジスタの先頭から10個のコンテキスト変数が「coeff_abs_level_minus1」に、第13番目から第16番目(cidx=12〜15)に「coded_block_flag」にそれぞれ割り当てられている。また、フレーム符号化ブロックのためのコンテキスト変数として、一方のレジスタの先頭から14個のコンテキスト変数が「significant_coeff_flag」に、もう一方のレジスタの先頭から14個のコンテキスト変数が「last_significant_coeff_flag」にそれぞれ割り当てられている。一方、フィールド符号化ブロックのためのコンテキスト変数として、一方のレジスタの先頭から14個のコンテキスト変数が「significant_coeff_flag」に、もう一方のレジスタの先頭から14個のコンテキスト変数が「last_significant_coeff_flag」にそれぞれ割り当てられている。
図10は、本発明の実施の形態におけるresidualコンテキストグループのブロックカテゴリー2のコンテキスト変数の割当例を示す図である。このブロックカテゴリー2では、まずフレーム符号化ブロックとフィールド符号化ブロックに共通するコンテキスト変数として、レジスタの先頭から10個のコンテキスト変数が「coeff_abs_level_minus1」に、第13番目から第16番目(cidx=12〜15)に「coded_block_flag」にそれぞれ割り当てられている。また、フレーム符号化ブロックのためのコンテキスト変数として、一方のレジスタの先頭から15個のコンテキスト変数が「significant_coeff_flag」に、もう一方のレジスタの先頭から15個のコンテキスト変数が「last_significant_coeff_flag」にそれぞれ割り当てられている。一方、フィールド符号化ブロックのためのコンテキスト変数として、一方のレジスタの先頭から15個のコンテキスト変数が「significant_coeff_flag」に、もう一方のレジスタの先頭から15個のコンテキスト変数が「last_significant_coeff_flag」にそれぞれ割り当てられている。
図11は、本発明の実施の形態におけるresidualコンテキストグループのブロックカテゴリー3のコンテキスト変数の割当例を示す図である。このブロックカテゴリー3では、まずフレーム符号化ブロックとフィールド符号化ブロックに共通するコンテキスト変数として、レジスタの先頭から9個のコンテキスト変数が「coeff_abs_level_minus1」に、第13番目から第16番目(cidx=12〜15)に「coded_block_flag」にそれぞれ割り当てられている。また、フレーム符号化ブロックのためのコンテキスト変数として、一方のレジスタの先頭から3個のコンテキスト変数が「significant_coeff_flag」に、もう一方のレジスタの先頭から3個のコンテキスト変数が「last_significant_coeff_flag」にそれぞれ割り当てられている。一方、フィールド符号化ブロックのためのコンテキスト変数として、一方のレジスタの先頭から3個のコンテキスト変数が「significant_coeff_flag」に、もう一方のレジスタの先頭から3個のコンテキスト変数が「last_significant_coeff_flag」にそれぞれ割り当てられている。
図12は、本発明の実施の形態におけるresidualコンテキストグループのブロックカテゴリー4のコンテキスト変数の割当例を示す図である。このブロックカテゴリー4では、まずフレーム符号化ブロックとフィールド符号化ブロックに共通するコンテキスト変数として、レジスタの先頭から10個のコンテキスト変数が「coeff_abs_level_minus1」に、第13番目から第16番目(cidx=12〜15)に「coded_block_flag」にそれぞれ割り当てられている。また、フレーム符号化ブロックのためのコンテキスト変数として、一方のレジスタの先頭から14個のコンテキスト変数が「significant_coeff_flag」に、もう一方のレジスタの先頭から14個のコンテキスト変数が「last_significant_coeff_flag」にそれぞれ割り当てられている。一方、フィールド符号化ブロックのためのコンテキスト変数として、一方のレジスタの先頭から14個のコンテキスト変数が「significant_coeff_flag」に、もう一方のレジスタの先頭から14個のコンテキスト変数が「last_significant_coeff_flag」にそれぞれ割り当てられている。
図13は、本発明の実施の形態におけるresidualコンテキストグループのブロックカテゴリー5のコンテキスト変数の割当例を示す図である。このブロックカテゴリー5では、まずフレーム符号化ブロックとフィールド符号化ブロックに共通するコンテキスト変数として、レジスタの先頭から10個のコンテキスト変数が「coeff_abs_level_minus1」に割り当てられている。なお、ブロックカテゴリー5では「coded_block_flag」が存在しない。また、フレーム符号化ブロックのためのコンテキスト変数として、一方のレジスタの先頭から15個のコンテキスト変数が「significant_coeff_flag」に、もう一方のレジスタの先頭から9個のコンテキスト変数が「last_significant_coeff_flag」にそれぞれ割り当てられている。一方、フィールド符号化ブロックのためのコンテキスト変数として、一方のレジスタの先頭から15個のコンテキスト変数が「significant_coeff_flag」に、もう一方のレジスタの先頭から9個のコンテキスト変数が「last_significant_coeff_flag」にそれぞれ割り当てられている。
このように、後半に復号される第5のコンテキストグループのシンタックス要素については、ブロックカテゴリーに従って6つに分類することにより、各ブロックカテゴリーにつき3本ずつのレジスタを割り当てることが可能である。
residualコンテキストグループのシンタックス要素は、図47乃至図49から分かるように、460個のコンテキスト変数のうちの約8割を占める。これらをレジスタに全部載せるようなサイズのレジスタファイルをフリップフロップで実装するのであれば、460個全てを載せるようにするのと回路規模上は大差がない。そのため、residualコンテキストグループのコンテキスト変数はSRAMであるメインメモリ300へ格納することを考えるのが自然である。マクロブロックは16×16画素のブロックであり、さらに4つに分割されて8×8画素のサブマクロブロック毎に復号される。Luma(輝度成分Y)とChroma(彩度成分CrおよびCb)の逆直交変換係数はそれぞれ別々に符号化されている。
Lumaについては、16×16画素を4×4画素のブロックで分割した16個のブロックの各直流成分のみを集めた4×4ブロック(ブロックカテゴリー0)の1個と、直流成分を除いた各交流成分のみの4×4ブロック(ブロックカテゴリー1)の16個とによってマクロブロックを符号化する場合と、直流成分と交流成分を含んだ4×4ブロック(ブロックカテゴリー2)の16個によって符号化する場合と、直流成分と交流成分を含んだ8×8ブロック(ブロックカテゴリー5)の4個によって符号化する場合とがある。
Chromaについては、4:2:0フォーマット(NumC8x8は「1」となる)の場合、直流成分のみを集めた2×2ブロック(ブロックカテゴリー3)の1個と、交流成分のみの4×4ブロック(ブロックカテゴリー4)の4個とを、CrとCbのそれぞれについて符号化される。128ビットのレジスタ3本分のコンテキスト変数を一度ロードすると、2×2、4×4、8×8などのサイズのブロック分の係数を復号する間は、そのコンテキスト変数のみを使い続けながら復号を行うことができる。特に、交流成分を含んだブロック(ブロックカテゴリー1、2、4、5)に関しては、さらに複数ブロックの復号の間で同じコンテキスト変数のみを使い続けながら復号を行うことができる。そのため、前半に復号される第1乃至第4のコンテキストグループのシンタックス要素のコンテキスト変数をメモリに配置して使用前にロードするようにした場合と比べると、Bin当たりのロード回数は非常に少ないものとなる。そして、ブロックカテゴリー単位で復号が行われるため、128ビットレジスタへの3回のロードと3回のストアは各ブロックカテゴリーの前後にまとめて行うだけでよい。本発明の実施の形態では、演算レジスタを4本備えるため、レジスタ間で余分な転送を行うことなく、復号処理を実行することができる。
図14は、本発明の実施の形態におけるレジスタファイル120の各レジスタとコンテキスト変数との関係例を示す図である。図14(a)は、128ビット幅の1本のレジスタに対して8ビット毎に7ビットのコンテキスト変数を1個ずつ割り当てて、16個のコンテキスト変数C0乃至C15を格納した場合の例である。図4乃至図6、および、図8乃至図13のケースでは、1本のレジスタに対して最大16個のコンテキスト変数が割り当てられるため、同図(a)のように格納することにより、必要なコンテキスト変数は全て格納することができる。
これに対し、図7のケースのように、最大18個のコンテキスト変数を1本のレジスタに割り当てようとする場合には、以下のような工夫を施す必要がある。図14(b)は、128ビット幅の1本のレジスタに対して8ビット毎に7ビットのコンテキスト変数を1個ずつ割り当てた上で、余剰となった1ビットを集めることにより、さらに2個のコンテキスト変数を格納した場合の例である。すなわち、この例では、コンテキスト変数C0乃至C6において1ビットずつ余った余剰ビットを集めて、その7ビット分の余剰ビットにコンテキスト変数C16を割り当てている。同様に、コンテキスト変数C7乃至C13において1ビットずつ余った余剰ビットを集めて、その7ビット分の余剰ビットにコンテキスト変数C17を割り当てている。また、コンテキスト変数C14の余剰ビットには、交換情報ビットが割り当てられている。この交換情報ビットについては、次図を用いて説明する。
図15は、本発明の実施の形態におけるレジスタファイル120のレジスタ間の交換転送の態様例を示す図である。同図において、上側が転送元レジスタであり、下側が転送先レジスタである。
交換転送の前後において、コンテキスト変数C0乃至C11の12個については、格納位置に変動はない。コンテキスト変数C12は、転送後にはコンテキスト変数C0乃至C6の7ビットの余剰ビットに分配される。同様に、コンテキスト変数C13は、転送後にはコンテキスト変数C7乃至C13の7ビットの余剰ビットに分配される。これに対し、コンテキスト変数C0乃至C6の余剰ビットに格納されていたコンテキスト変数C16は、転送後にはコンテキスト変数C12の位置に格納される。同様に、コンテキスト変数C7乃至C13の余剰ビットに格納されていたコンテキスト変数C17は、転送後にはコンテキスト変数C13の位置に格納される。また、コンテキスト変数C14およびC15は、転送後には互いに入れ換えて格納される。
このような交換転送が行われた場合、コンテキスト変数C14の余剰ビットに当る交換情報ビットは、転送後に反転される。すなわち、同図のように転送前に交換情報ビットが「0」であれば、「1」に設定される。逆に、転送前に交換情報ビットが「1」であれば、「0」に設定される。
このような交換転送を行うことにより、図7の例のように18個のコンテキスト変数を格納する場合、処理に必要なコンテキスト変数をその都度、レジスタ上に8ビット毎に配置することができるようになる。例えば、「mb_field_decoding_flag」を用いる場合には第13番目から第15番目のコンテキスト変数の位置(cidx=12乃至14)に「mb_field_decoding_flag」のコンテキスト変数を格納する。このとき、「transform_size_8x8_flag」のコンテキスト変数は、コンテキスト変数C0乃至C6の余剰ビットと、コンテキスト変数C7乃至C13の余剰ビットと、コンテキスト変数C15にそれぞれ格納されているものとする。
その後、「transform_size_8x8_flag」を用いる場合には、交換転送を行う。これにより、第13番目から第15番目のコンテキスト変数の位置(cidx=12乃至14)に「transform_size_8x8_flag」のコンテキスト変数が格納されるようになる。
このような仕組みを用いることにより、cidxを4ビットに抑えたままの状態で最大18個のコンテキスト変数を1本のレジスタに格納することができる。なお、この交換転送は、後述するコンテキスト交換転送命令により実行される。
図16は、本発明の実施の形態におけるレジスタ転送処理部130の一構成例を示す図である。このレジスタ転送処理部130は、転送バッファ131と、コンテキスト変数初期値生成部132と、初期値パラメータテーブル133と、交換転送処理部134と、セレクタ135とを備えている。
転送バッファ131は、レジスタファイル120の転送元のレジスタからのデータを保持する128ビットのバッファである。この転送バッファ131により、交換転送処理部134による処理をパイプライン処理することが可能となる。また、この転送バッファ131には、後述するコンテキスト初期化命令に従って、初期値が設定される。この場合の初期値は、コンテキスト変数初期値生成部132において生成され、その格納位置は復号制御部190から信号線199を介して指示される。
コンテキスト変数初期値生成部132は、コンテキスト変数の初期値を生成するものである。このコンテキスト変数初期値生成部132は、後述するコンテキスト初期化命令のオペランドによって指定されたcidx(4ビットの値imm_cidx)の位置を先頭として、オペランドで指定されたctxIdx(9ビットの値imm_ctxIdx)から順番に、オペランドで指定された個数(4ビットの値imm_cnum)のコンテキスト変数の初期値を1サイクルにつき1個ずつ生成する。そして、オペランドで指定された転送バッファ(cv_dst)の該当位置の7ビットに書き込む処理をimm_cnum回繰り返す。このコンテキスト変数初期値生成部132によって生成される初期値は、H.264により定義された値であり、初期値パラメータテーブル133から供給される初期値パラメータ(mおよびn)およびSLICEQPY制御レジスタ170から信号線179を介して供給される量子化パラメータ(SliceQPY)によって決定される。
初期値パラメータテーブル133は、初期値パラメータ(mおよびn)を保持するテーブルである。この初期値パラメータテーブル133は、コンテキスト初期化命令のオペランドによって指定されたctxIdxおよびINITIDC制御レジスタ160から信号線169を介して供給される値により索引される。INITIDC制御レジスタ160の値は、「0」乃至「2」のときにはcabac_init_idcとして用いられ、「3」のときにはIスライスまたはSIスライスであることを示す。
初期値パラメータ(mおよびn)は、H.264において、slice_header()に含まれるslice_typeと、cabac_init_idcと、ctxIdxとにより特定できるように、表形式で定義されている。量子化パラメータ(SliceQPY)は、slice_header()に含まれるslice_qp_deltaと、pic_parameter_set_rbsp()に含まれるpic_init_qp_minus26とによりスライス毎に算出される値である。
preCtxState = Clip3( 1, 126, ( ( m ? SliceQPY ) >> 4 ) + n )
if( preCtxState <= 63 ) {
pStateIdx = 63 - preCtxState
valMPS = 0
} else {
pStateIdx = preCtxState - 64
valMPS = 1
}
ただし、Clip3は以下のような関数である。
int Clp3(int x, int y, int x){
if(z>x)r eturn x;
if(z>y) return y;
return z;
}
このような初期化をソフトウェアで行うには、mおよびnをメモリ上に格納してスライス毎に参照する必要がある。ほとんどのコンテキスト変数のmおよびnは4種類用意されていて、slice_typeとcabac_init_idcから選択される。そのため、mおよびnを配列として格納すると数Kバイトの容量になり、4Kバイトや8Kバイトのサイズであることが多いプロセッサの一次データキャッシュの大半を占めてしまう。すなわち、一次データキャッシュにコンテキスト変数を保持しながら処理している場合には、スライス毎にコンテキスト変数がキャッシュから追い出されてしまう可能性が高い。この点、本発明の実施の形態によれば、初期値パラメータテーブル133を別途設けることにより、一次データキャッシュを占有することなく処理を行うことができる。
これら初期値パラメータテーブル133およびコンテキスト変数初期値生成部132によってレジスタに直接初期値を生成することにより、前半に復号される第1乃至第4のコンテキストグループのシンタックス要素については、コンテキスト変数をロードまたはストアする必要がなくなる。また、後半に復号される第5のコンテキストグループのシンタックス要素については、レジスタに生成した初期値をメモリにストアすることにより、コンテキスト変数の初期化を行うことができる。
交換転送処理部134は、図15により説明した交換転送処理を行うものである。すなわち、この交換転送処理部134は、コンテキスト変数C0乃至C13の余剰ビットとコンテキスト変数C12およびC13とを交換し、コンテキスト変数C14およびC15を互いに入れ換えるとともに、交換情報ビットを反転させる。
セレクタ135は、転送バッファ131に保持されているデータ、および、交換転送処理部134により交換転送処理が施されたデータの何れか一方を、選択するセレクタである。このセレクタ135により選択されたデータは、信号線139を介してレジスタファイル120の転送先のレジスタに出力される。何れのデータが選択されるかは、実行された命令により決定される。転送命令であれば。常に転送バッファ131に保持されているデータが選択される。コンテキスト交換転送命令であれば、オペランドおよび交換情報ビットの状態によって何れのデータが選択されるかが決定される。
図17は、H.264におけるslice_dataのシンタックス要素の構文解析(parse)処理を抽出したフローチャートを示す図である。
まず、スライスタイプがIスライスでもなく(slice_type!=I)、かつ、SIスライスでもない(slice_type!=SI)場合(ステップS901)、「mb_skip_flag」が復号される(ステップS902)。このとき使用されるコンテキスト変数は、「mb_skip_flag」のPまたはSPスライス用(ctxIdx=11乃至13)またはBスライス用(ctxIdx=24乃至26)である。「mb_skip_flag」が「1」を示している場合には、続くマクロブロックに関する処理(ステップS904、S905およびS910)はスキップされる(ステップS903)。
「mb_skip_flag」が「1」を示していない場合には、「mb_field_decode_flag」を復号する必要があるか否かが判断される(ステップS904)。「mb_field_decode_flag」を復号する必要がある旨判断された場合には、「mb_field_decode_flag」が復号される(ステップS905)。このとき使用されるコンテキスト変数は、「mb_field_decode_flag」のコンテキスト変数(ctxIdx=70乃至72)である。その後、マクロブロック層の復号が行われる(ステップS910)。
そして、「end_of_slice」が復号され(ステップS907)、「end_of_slice」が「1」を示していれば構文解析処理を終了する(ステップS908)。「end_of_slice」が「1」を示していなければ先頭(ステップS901)から処理を繰り返す。
図18は、マクロブロック層(ステップS910)の復号手順を示す図である。まず、「mb_type」が復号される(ステップS911)。このとき使用されるコンテキスト変数は、「mb_type」のSIスライス用(ctxIdx=0乃至2)、Iスライス用(ctxIdx=3乃至10)、PまたはSPスライス用(ctxIdx=14乃至20)またはBスライス用(ctxIdx=27乃至35)である。
「mb_type」が画面内PCM(Intra-frame Pulse Code Modulation)である(mb_type=I_PCM)場合には(ステップS912)、画面内PCMのための処理が行われる(ステップS913)。
「mb_type」がインターマクロブロックであり、かつ、パーティションが4個である場合には(ステップS914)、「sub_mb_pred」が復号される(ステップS960)。そして、マクロブロックパーティション予測モードが「Intra_16x16」でない場合には(ステップS915)、「coded_block_pattern」が復号される(ステップS916)。このとき使用されるコンテキスト変数は、「coded_block_pattern」のコンテキスト変数(ctxIdx=73乃至84)である。そして、Lumaの非ゼロの逆直交変換係数があり、かつ、8×8サイズ逆直交変換である可能性があれば(ステップS917)、「transform_size_8x8_flag」が復号される(ステップS918)。このとき使用されるコンテキスト変数は、「transform_size_8x8_flag」のコンテキスト変数(ctxIdx=399乃至401)である。
一方、ステップS914において、「mb_type」がインターマクロブロックであり、かつ、パーティションが4個である旨判断されなかった場合には、イントラ予測(「mb_type」が「I_4x4」または「I_8x8」)であり、かつ、8×8サイズ逆直交変換である可能性があれば(ステップS921)、「transform_size_8x8_flag」が復号される(ステップS922)。このとき使用されるコンテキスト変数は、「transform_size_8x8_flag」のコンテキスト変数(ctxIdx=399乃至401)である。また、「mb_pred」が復号された後(ステップS930)、マクロブロックパーティション予測モードが「Intra_16x16」でない場合には(ステップS923)、「coded_block_pattern」が復号される(ステップS924)。このとき使用されるコンテキスト変数は、「coded_block_pattern」のコンテキスト変数(ctxIdx=73乃至84)である。
そして、」residual」の復号が必要であるか否かが判断され(ステップS925)、必要であると判断された場合には、「mb_qp_delta」が復号されて(ステップS926)、「residual」の復号が行われる(ステップS980)。
このマクロブロック層の復号手順から分かるように、「transform_size_8x8_flag」は分岐する経路によって他のシンタックス要素とは復号の順番が逆転する。これに対して、メインプロファイルのように「transform_size_8x8_flag」がない場合には、分岐の経路によらず復号の順番が同じとなる。また、図17の「mb_field_decoding_flag」も、P、SPまたはBスライスのときには、ともに「mb_skip_flag」と「mb_type」との間に復号する必要がある。このような例外的なシンタックス要素である「transform_size_8x8_flag」と「mb_field_decoding_flag」を合わせて使用するために、図7のようにコンテキスト変数を管理する。
もう1つ例外的なシンタックス要素は「mb_qp_delta」である。「residual」の復号が必要ない場合には復号しなくてもよいが、「residual」がある場合には復号する必要がある。そのため、予測コンテキストグループのシンタックス要素を復号した後に、MVDコンテキストグループおよびブロック情報コンテキストグループの復号をして、さらに予測コンテキストグループのシンタックス要素を復号する必要がある。
これら例外的なシンタックス要素が存在するため、仮にCABAC復号器が1本の演算レジスタしかアクセスできない場合には、シンタックス要素のグループが変わるごとに演算レジスタへ転送して入れ替える必要が生じる。もし、「transform_size_8x8_flag」と「mb_field_decoding_flag」と「mb_qp_delta」が存在しなければ、各グループのシンタックス要素をマクロブロック毎に1回だけ演算レジスタに転送(復帰)してグループが変わるときに元のレジスタに転送(退避)するだけでよい。しかし、例外的なシンタックス要素が存在する場合には、マクロブロック毎に同じグループのシンタックス要素について、コンテキスト変数を演算レジスタに復帰および退避のために2回以上の転送をしなくてはならないグループが生じてしまう。これを回避するために、本発明の実施の形態では、演算レジスタを3本以上設けることにより、余分な転送を減らすことができる。なお、演算レジスタを2本設けた場合には、演算レジスタが1本であるよりは転送回数を減らすことができる。
図19および図20は、「mb_pred」(ステップS930)の復号手順を示す図である。
マクロブロックパーティション予測モードが「Intra_4x4」であれば(ステップS932)、以下の処理(ステップS933乃至S935)が16回繰り返し行われる。すなわち、「prev_intra4x4_pred_mode_flag」が復号される(ステップS933)。このとき使用されるコンテキスト変数は、「prev_intra4x4_pred_mode_flag」のコンテキスト変数(ctxIdx=68)である。また、「prev_intra4x4_pred_mode_flag」が「0」を示している場合には(ステップS934)、「rem_intra4x4_pred_mode」が復号される(ステップS935)。このとき使用されるコンテキスト変数は、「rem_intra4x4_pred_mode」のコンテキスト変数(ctxIdx=69)である。
マクロブロックパーティション予測モードが「Intra_8x8」であれば(ステップS936)、以下の処理(ステップS937乃至S939)が4回繰り返し行われる。すなわち、「prev_intra8x8_pred_mode_flag」が復号される(ステップS937)。このとき使用されるコンテキスト変数は、「prev_intra8x8_pred_mode_flag」のコンテキスト変数(ctxIdx=68)である。また、「prev_intra8x8_pred_mode_flag」が「0」を示している場合には(ステップS938)、「rem_intra8x8_pred_mode」が復号される(ステップS939)。このとき使用されるコンテキスト変数は、「rem_intra8x8_pred_mode」のコンテキスト変数(ctxIdx=69)である。
なお、マクロブロックパーティション予測モードがIntra_4x4またはIntra_8x8以外の場合には、以上の処理(ステップS932乃至S939)は行われない(ステップS931)。
Chromaの復号が必要でなければ(ステップS941)、「intra_chroma_pred_mode」が復号される(ステップS942)。このとき使用されるコンテキスト変数は、「intra_chroma_pred_mode」のコンテキスト変数(ctxIdx=64乃至67)である。
マクロブロックパーティション予測モードがDirectである場合には、ここで「mb_pred」の復号は終了する(ステップS943)。マクロブロックパーティション予測モードがDirectでなければ、以下の処理(ステップS944乃至S956)が行われる。各パーティションについて、「ref_idx_l0」の復号が必要であるか否かが判断され(ステップS944)、必要であれば「ref_idx_l0」の復号が行われる(ステップS945)。このとき使用されるコンテキスト変数は、「ref_idx_l0」のコンテキスト変数(ctxIdx=54乃至59)である。同様に、各パーティションについて、「ref_idx_l1」の復号が必要であるか否かが判断され(ステップS946)、必要であれば「ref_idx_l1」の復号が行われる(ステップS947)。このとき使用されるコンテキスト変数は、「ref_idx_l1」のコンテキスト変数(ctxIdx=54乃至59)である。
また、各パーティションについて、「mvd_l0」の復号が必要であるか否かが判断され(ステップS951)、必要であれば「mvd_l0[][][0]」および「mvd_l0[][][1]」の復号が行われる(ステップS952、S953)。このとき使用されるコンテキスト変数は、「mvd_l0[][][0]」および「mvd_l0[][][1]」のコンテキスト変数(ctxIdx=40乃至53)である。同様に、各パーティションについて、「mvd_l1」の復号が必要であるか否かが判断され(ステップS954)、必要であれば「mvd_l1[][][0]」および「mvd_l1[][][1]」の復号が行われる(ステップS955、S956)。このとき使用されるコンテキスト変数は、「mvd_l1[][][0]」および「mvd_l1[][][1]」のコンテキスト変数(ctxIdx=40乃至53)である。
図21および図22は、「sub_mb_pred」(ステップS960)の復号手順を示す図である。
マクロブロック内の4つのサブマクロブロックの各々について、それぞれ「sub_mb_type」が復号される(ステップS961)。このとき使用されるコンテキスト変数は、「sub_mb_type」のPまたはSPスライス用(ctxIdx=21乃至23)またはBスライス用(ctxIdx=36乃至39)である。
また、「ref_idx_l0」の復号が必要であるか否かが判断され(ステップS962)、必要であれば「ref_idx_l0」の復号が行われる(ステップS953)。このとき使用されるコンテキスト変数は、「ref_idx_l0」のコンテキスト変数(ctxIdx=54乃至59)である。同様に、「ref_idx_l1」の復号が必要であるか否かが判断され(ステップS964)、必要であれば「ref_idx_l1」の復号が行われる(ステップS955)。このとき使用されるコンテキスト変数は、「ref_idx_l1」のコンテキスト変数(ctxIdx=54乃至59)である。
また、マクロブロック内の4つのサブマクロブロックの各々について、「mvd_l0」の復号が必要であるか否かが判断され(ステップS971)、必要であればサブマクロブロックパーティションの各々について、「mvd_l0[][][0]」および「mvd_l0[][][1]」の復号が行われる(ステップS972、S973)。このとき使用されるコンテキスト変数は、「mvd_l0[][][0]」および「mvd_l0[][][1]」のコンテキスト変数(ctxIdx=40乃至53)である。同様に、マクロブロック内の4つのサブマクロブロックの各々について、「mvd_l1」の復号が必要であるか否かが判断され(ステップS974)、必要であればサブマクロブロックパーティションの各々について、「mvd_l1[][][0]」および「mvd_l1[][][1]」の復号が行われる(ステップS975、S976)。このとき使用されるコンテキスト変数は、「mvd_l1[][][0]」および「mvd_l1[][][1]」のコンテキスト変数(ctxIdx=40乃至53)である。
図23および図24は、「residual」(ステップS980)の復号手順を示す図である。
マクロブロックパーティション予測モードが「Intra_16x16」であれば(ステップS981)、「residual_block_cat0」が復号される(ステップS810)。そして、「residual_cat1」を復号する必要があるか否かが判断され(ステップS982)、必要と判断された場合には「residual_block_cat1」が4回分復号される(ステップS820)。この判断は、4回繰り返される。
ステップS981においてマクロブロックパーティション予測モードが「Intra_16x16」でないと判断された場合、「transform_size_8x8_flag」が「1」でなければ(ステップS983)、「residual_cat2」を復号する必要があるか否かが判断され(ステップS984)、必要と判断された場合には「residual_block_cat2」が4回分復号される(ステップS830)。この判断は、4回繰り返される。
ステップS983において「transform_size_8x8_flag」が「1」であると判断された場合、「residual_block_cat5」が4回分復号される(ステップS860)。
Chromaの復号が不要と判断された場合には、ここで「residual」の復号は終了する(ステップS985)。Chromaの復号が必要と判断された場合には、「residual_cat3」を復号する必要があるか否かが判断され(ステップS986)、必要と判断された場合には「residual_block_cat3」が復号される(ステップS840)。この判断は、2回繰り返される。また、「residual_cat4」を復号する必要があるか否かが判断され(ステップS987)、必要と判断された場合には「residual_block_cat4」が復号される(ステップS850)。この判断は、4×「NumC8x8」回のループと2回のループの2重ループにより繰り返される。
図25は、「residual_block_cat0」(ステップS810)の復号手順を示す図である。
「coded_block_flag」が復号され(ステップS811)、「coded_block_flag」が「1」でなければ「residual_block_cat0」の復号は終了する(ステップS812)。このとき使用されるコンテキスト変数は、「coded_block_flag」のブロックカテゴリー0のコンテキスト変数(ctxIdx=85乃至88)である。
「significant_coeff_flag」が復号され(ステップS813)、「significant_coeff_flag」が「1」であれば(ステップS814)、「last_significant_coeff_flag」が復号される(ステップS815)。終了が検知されるまでステップS813以降の処理が繰り返される(ステップS816)。なお、ここで使用されるコンテキスト変数は、「significant_coeff_flag」のブロックカテゴリー0のコンテキスト変数(ctxIdx=105乃至119または277乃至291)および「last_significant_coeff_flag」のブロックカテゴリー0のコンテキスト変数(ctxIdx=166乃至180または338乃至352)である。
ステップS816において終了が検知された後は、「coeff_abs_level_minus1」が復号される(ステップS817)。このとき使用されるコンテキスト変数は、「coeff_abs_level_minus1」のブロックカテゴリー0のコンテキスト変数(ctxIdx=227乃至236)である。また、「coeff_sign_flag」が復号される(ステップS818)。これら終了検知後の手順は、逆直交変換係数の数と同数回繰り返される。
図26は、「residual_block_cat1」(ステップS820)の復号手順を示す図である。
「coded_block_flag」が復号され(ステップS821)、「coded_block_flag」が「1」でなければ「residual_block_cat1」の復号は終了する(ステップS822)。このとき使用されるコンテキスト変数は、「coded_block_flag」のブロックカテゴリー1のコンテキスト変数(ctxIdx=89乃至92)である。
「significant_coeff_flag」が復号され(ステップS823)、「significant_coeff_flag」が「1」であれば(ステップS824)、「last_significant_coeff_flag」が復号される(ステップS825)。終了が検知されるまでステップS823以降の処理が繰り返される(ステップS826)。なお、ここで使用されるコンテキスト変数は、「significant_coeff_flag」のブロックカテゴリー1のコンテキスト変数(ctxIdx=120乃至133または292乃至305)および「last_significant_coeff_flag」のブロックカテゴリー1のコンテキスト変数(ctxIdx=181乃至194または353乃至366)である。
ステップS826において終了が検知された後は、「coeff_abs_level_minus1」が復号される(ステップS827)。このとき使用されるコンテキスト変数は、「coeff_abs_level_minus1」のブロックカテゴリー1のコンテキスト変数(ctxIdx=237乃至246)である。また、「coeff_sign_flag」が復号される(ステップS828)。これら終了検知後の手順は、逆直交変換係数の数と同数回繰り返される。
図27は、「residual_block_cat2」(ステップS830)の復号手順を示す図である。
「coded_block_flag」が復号され(ステップS831)、「coded_block_flag」が「1」でなければ「residual_block_cat2」の復号は終了する(ステップS832)。このとき使用されるコンテキスト変数は、「coded_block_flag」のブロックカテゴリー2のコンテキスト変数(ctxIdx=93乃至96)である。
「significant_coeff_flag」が復号され(ステップS833)、「significant_coeff_flag」が「1」であれば(ステップS834)、「last_significant_coeff_flag」が復号される(ステップS835)。終了が検知されるまでステップS833以降の処理が繰り返される(ステップS836)。なお、ここで使用されるコンテキスト変数は、「significant_coeff_flag」のブロックカテゴリー2のコンテキスト変数(ctxIdx=134乃至148または306乃至320)および「last_significant_coeff_flag」のブロックカテゴリー2のコンテキスト変数(ctxIdx=195乃至209または367乃至381)である。
ステップS836において終了が検知された後は、「coeff_abs_level_minus1」が復号される(ステップS837)。このとき使用されるコンテキスト変数は、「coeff_abs_level_minus1」のブロックカテゴリー2のコンテキスト変数(ctxIdx=247乃至256)である。また、「coeff_sign_flag」が復号される(ステップS838)。これら終了検知後の手順は、逆直交変換係数の数と同数回繰り返される。
図28は、「residual_block_cat3」(ステップS840)の復号手順を示す図である。
「coded_block_flag」が復号され(ステップS841)、「coded_block_flag」が「1」でなければ「residual_block_cat3」の復号は終了する(ステップS842)。このとき使用されるコンテキスト変数は、「coded_block_flag」のブロックカテゴリー3のコンテキスト変数(ctxIdx=97乃至100)である。
「significant_coeff_flag」が復号され(ステップS843)、「significant_coeff_flag」が「1」であれば(ステップS844)、「last_significant_coeff_flag」が復号される(ステップS845)。終了が検知されるまでステップS843以降の処理が繰り返される(ステップS846)。なお、ここで使用されるコンテキスト変数は、「significant_coeff_flag」のブロックカテゴリー3のコンテキスト変数(ctxIdx=149乃至151または321乃至323)および「last_significant_coeff_flag」のブロックカテゴリー3のコンテキスト変数(ctxIdx=210乃至212または382乃至384)である。
ステップS846において終了が検知された後は、「coeff_abs_level_minus1」が復号される(ステップS847)。このとき使用されるコンテキスト変数は、「coeff_abs_level_minus1」のブロックカテゴリー3のコンテキスト変数(ctxIdx=257乃至265)である。また、「coeff_sign_flag」が復号される(ステップS848)。これら終了検知後の手順は、逆直交変換係数の数と同数回繰り返される。
図29は、「residual_block_cat4」(ステップS850)の復号手順を示す図である。
「coded_block_flag」が復号され(ステップS851)、「coded_block_flag」が「1」でなければ「residual_block_cat4」の復号は終了する(ステップS852)。このとき使用されるコンテキスト変数は、「coded_block_flag」のブロックカテゴリー4のコンテキスト変数(ctxIdx=101乃至104)である。
「significant_coeff_flag」が復号され(ステップS853)、「significant_coeff_flag」が「1」であれば(ステップS854)、「last_significant_coeff_flag」が復号される(ステップS855)。終了が検知されるまでステップS853以降の処理が繰り返される(ステップS856)。なお、ここで使用されるコンテキスト変数は、「significant_coeff_flag」のブロックカテゴリー4のコンテキスト変数(ctxIdx=152乃至165または324乃至337)および「last_significant_coeff_flag」のブロックカテゴリー4のコンテキスト変数(ctxIdx=213乃至226または385乃至398)である。
ステップS856において終了が検知された後は、「coeff_abs_level_minus1」が復号される(ステップS857)。このとき使用されるコンテキスト変数は、「coeff_abs_level_minus1」のブロックカテゴリー4のコンテキスト変数(ctxIdx=266乃至275)である。また、「coeff_sign_flag」が復号される(ステップS858)。これら終了検知後の手順は、逆直交変換係数の数と同数回繰り返される。
図30は、「residual_block_cat5」(ステップS860)の復号手順を示す図である。
「significant_coeff_flag」が復号され(ステップS863)、「significant_coeff_flag」が「1」であれば(ステップS864)、「last_significant_coeff_flag」が復号される(ステップS865)。終了が検知されるまでステップS863以降の処理が繰り返される(ステップS866)。なお、ここで使用されるコンテキスト変数は、「significant_coeff_flag」のブロックカテゴリー5のコンテキスト変数(ctxIdx=402乃至416または436乃至450)および「last_significant_coeff_flag」のブロックカテゴリー5のコンテキスト変数(ctxIdx=417乃至425または451乃至459)である。
ステップS866において終了が検知された後は、「coeff_abs_level_minus1」が復号される(ステップS867)。このとき使用されるコンテキスト変数は、「coeff_abs_level_minus1」のブロックカテゴリー5のコンテキスト変数(ctxIdx=426乃至435)である。また、「coeff_sign_flag」が復号される(ステップS868)。これら終了検知後の手順は、逆直交変換係数の数と同数回繰り返される。
以上の復号手順から分かるように、前半において復号されるシンタックス要素について3本の演算レジスタが必要であり、また、後半において復号されるシンタックス要素について3本の演算レジスタが必要であることから、少なくとも3本の演算レジスタがあれば余分な転送を減らすことができる。しかし、「residual」の復号後には、「mb_type」や「mb_skip_flag」といった前半において復号されるシンタックス要素の復号が再び必要になる。そのため、「residual」の復号後には、128ビットレジスタのメインメモリ300へのストアによる待ちの影響によって、処理の効率が落ちる可能性がある。ストア待ちの影響を少なくし、「mb_type」や「mb_skip_flag」の復号を始められるようにするには、3本の演算レジスタとは別に1本の演算レジスタがあればよい。このように、4本の演算レジスタがCABAC復号器からアクセス可能であれば、余分なレジスタ転送を減らすことができる。また、後半において復号されるシンタックス要素から前半において復号されるシンタックス要素の復号に移行する際に、メインメモリ300へのロードストアのレイテンシによる影響を小さくすることができる。
以上のことから、CABAC復号器に接続された4本の演算レジスタと、前半に復号されるシンタックス要素のための4本の退避レジスタとを合わせた計8本のレジスタを備えるレジスタファイル120によって効率良く復号を行うことができることがわかる。
本発明の実施の形態におけるCABAC復号演算器110は、4本の演算レジスタが接続されており、それらは命令によって使い分けられる。ここでは復号命令として、「cabac_dec0命令」、「cabac_dec1命令」、「cabac_dec2命令」および「cabac_dec3命令」の4つを想定する。
「cabac_dec0命令」は、後半に復号されるシンタックス要素を復号する命令である。すなわち、「cabac_dec0命令」は、「significant_coeff_flag」をレジスタCV0に保持されるコンテキスト変数を使用して復号し、「last_significant_coeff_flag」をレジスタCV1に保持されるコンテキスト変数を使用して復号し、「coeff_abs_level_minus1」をレジスタCV2に保持されるコンテキスト変数を使用して復号する。
「cabac_dec1命令」は、「mvd_l0」および「mvd_l1」をレジスタCV1に保持されるコンテキスト変数を使用して復号する。
「cabac_dec2命令」は、「coded_block_flag」と、「transform_size_8x8_flag」と、「mb_field_decoding_flag」と、「coded_block_pattern」とをレジスタCV2に保持されるコンテキスト変数を使用して復号する。
「cabac_dec3命令」は、これら以外の前半に復号されるシンタックス要素をレジスタCV3に保持されるコンテキスト変数を使用して復号する。
「cabac_dec0命令」は、逆直交変換の係数を復号するためのctxIdxの算出と、復号された複数のBinからの多値化処理とを行い、DMA制御部150を経由してメインメモリ300に復号データを書き込む。その他の「cabac_dec1〜3命令」は、ライトバック処理部115を経由してCPU200のレジスタへ復号結果を書き込むことにより、CPU200に処理結果を返すようになっている。CPU200は、その値に従って次のctxIdxの算出と多値化処理を行う。
また、本発明の実施の形態におけるCABAC復号演算器110は、以下のようなレジスタ関連命令を備える。
図31は、本発明の実施の形態におけるCABAC復号演算器110のコンテキスト初期化命令の形式例を示す図である。このコンテキスト初期化命令(init命令)は、オペランドとして、「cv_dst」、「imm_cidx」、「imm_cnum」および「imm_ctxIdx」を備えている。
「cv_dst」は、コンテキスト変数を格納するレジスタ番号を示すものである。「imm_cidx」は、コンテキスト変数の格納先のcidxを示す即値である。「imm_cnum」は、コンテキスト変数の数を示す即値である。「imm_ctxIdx」は、H.264において規定されたctxIdxを示す即値である。
このコンテキスト初期化命令の各オペランドに従って、初期値パラメータテーブル133およびコンテキスト変数初期値生成部132により初期値を生成して転送バッファ131に格納することによって、レジスタに直接初期値を設定することができる。
図32は、本発明の実施の形態におけるCABAC復号演算器110のコンテキスト交換転送命令の形式例を示す図である。このコンテキスト交換転送命令(swap命令またはswap_cnd命令)は、オペランドとして、「cv_dst」、「cv_src」、「cnden」および「cndsw」を備えている。
「cv_dst」は、交換転送先レジスタのレジスタ番号を示すものである。「cv_src」は、交換転送元レジスタのレジスタ番号を示すものである。
「cnden」は、転送の際の交換を無条件に行うか、条件付きとするかのフラグである。この「cnden」が「0」であれば、無条件で交換転送する命令(swap命令)であることを意味する。一方、この「cnden」が「1」であれば、条件付きで交換転送する命令(swap_cnd命令)であることを意味する。すなわち、「cndsw」と「cv_src」の交換情報ビット(C14の余剰ビット)とが異なる場合には交換転送を行うことを意味し、「cndsw」と「cv_src」の交換情報ビットとが等しい場合には交換なしの転送を行うことを意味する。「cndsw」は、cndenが「1」である場合の、転送の際の交換の有無を判断する対象である。
このコンテキスト交換転送命令の各オペランドに従って、交換転送処理部134およびセレクタ135により、無条件もしくは条件付きの交換転送が行われる。
図33は、本発明の実施の形態におけるCABAC復号演算器110の転送命令の形式例を示す図である。この転送命令(mov命令)は、オペランドとして、「cv_dst」および「cv_src」を備えている。
「cv_dst」は、交換転送先レジスタのレジスタ番号を示すものである。「cv_src」は、交換転送元レジスタのレジスタ番号を示すものである。
この転送命令が実行された場合には、セレクタ135は転送バッファ131からのデータを選択して出力する。
以下では、コンテキスト変数のシンタックス要素の変化に着目して、主要な命令実行の流れについて抽出して説明する。
図34は、本発明の実施の形態において前半に復号されるシンタックス要素のうちIスライスまたはSIスライスに関する処理内容例を示す図である。
処理711では、初期化処理が行われる。「init_memory_ctx()」は、後半に復号されるシンタックス要素のためのコンテキスト変数をレジスタファイル120において初期化して、メインメモリ300にストアする命令である。また、「init」は上述のようにレジスタの初期化命令であり、ここでは対象となるレジスタ番号(cv_dst)のみが記されている。すなわち、レジスタCV4、CV6およびCV7の初期化が行われる。
処理712では、レジスタ間の転送処理が行われる。「mov」は上述のようにレジスタ間の転送命令であり、ここではCV7の内容がCV2に転送され、CV4の内容がCV3に転送されている。
処理713では、次のレジスタ間の転送処理が行われる。ここではCV3の内容がCV4に転送され、CV6の内容がCV3に転送されている。
処理714では、次のレジスタ間の転送処理が行われる。ここではCV2の内容がCV7に転送されている。
処理715では、次のレジスタ間の転送処理が行われる。ここではCV3の内容がCV6に転送されている。
図35は、図34の処理手順によるレジスタ間転送の態様を示す図である。この図から、前半に復号されるシンタックス要素の退避場所をCV4、CV6およびCV7として、使用前にCV2およびCV3に転送して、使用後に再びCV4、CV6およびCV7に退避する様子が分かる。
図36は、本発明の実施の形態において前半に復号されるシンタックス要素のうちPスライスまたはBスライスに関する処理内容例を示す図である。
処理721では、初期化処理が行われる。ここでは、処理711と同様に「init_memory_ctx()」によりメモリの初期化が行われる。そして、レジスタCV4乃至CV7の初期化が行われる。
処理722では、レジスタ間の転送処理が行われる。ここではCV7の内容がCV2に転送され、CV4の内容がCV3に転送されている。
処理723では、レジスタ間の転送処理および交換転送処理が行われる。すなわち、CV3の内容がCV4に転送され、CV2の内容がCV2に交換転送され、CV6の内容がCV3に転送され、CV5の内容がCV1に転送されている。
処理724では、次のレジスタ間の転送処理および交換転送処理が行われる。すなわち、CV1の内容がCV5に転送され、CV2の内容がCV7に交換転送される。
処理725では、次のレジスタ間の転送処理が行われる。ここではCV3の内容がCV6に転送されている。
図37は、図36の処理手順によるレジスタ間転送の態様を示す図である。この図から、前半に復号されるシンタックス要素の退避場所をCV4乃至CV7として、使用前にCV1乃至CV3に転送して、使用後に再びCV4乃至CV7に退避する様子が分かる。
図38は、本発明の実施の形態において後半に復号されるシンタックス要素のうちブロックカテゴリー0に関する処理内容例を示す図である。
処理741では、メインメモリ300からレジスタファイル120へのロードが行われる。すなわち、ブロックカテゴリー0の「significant_coeff_flag」のコンテキスト変数の格納アドレス(sig0)からCV0へのロードが行われる。また、ブロックカテゴリー0の「last_significant_coeff_flag」のコンテキスト変数の格納アドレス(last0)からCV1へのロードが行われる。また、ブロックカテゴリー0の「coeff_abs_level_minus1」のコンテキスト変数の格納アドレス(abs0)からCV2へのロードが行われる。
処理742では、メインメモリ300へのストアが行われる。すなわち、CV0の内容がsig0へストアされ、CV1の内容がlast0へストアされる。
処理743では、メインメモリ300への次のストアが行われる。すなわち、CV2の内容がabs0へストアされる。
図39は、本発明の実施の形態において後半に復号されるシンタックス要素のうちブロックカテゴリー1に関する処理内容例を示す図である。
処理751では、メインメモリ300からレジスタファイル120へのロードが行われる。すなわち、ブロックカテゴリー1の「significant_coeff_flag」のコンテキスト変数の格納アドレス(sig1)からCV0へのロードが行われる。また、ブロックカテゴリー1の「last_significant_coeff_flag」のコンテキスト変数の格納アドレス(last1)からCV1へのロードが行われる。また、ブロックカテゴリー1の「coeff_abs_level_minus1」のコンテキスト変数の格納アドレス(abs1)からCV2へのロードが行われる。
処理752では、メインメモリ300へのストアが行われる。すなわち、CV0の内容がsig1へストアされ、CV1の内容がlast1へストアされる。
処理753では、メインメモリ300への次のストアが行われる。すなわち、CV2の内容がabs1へストアされる。
図40は、本発明の実施の形態において後半に復号されるシンタックス要素のうちブロックカテゴリー2に関する処理内容例を示す図である。
処理761では、メインメモリ300からレジスタファイル120へのロードが行われる。すなわち、ブロックカテゴリー2の「significant_coeff_flag」のコンテキスト変数の格納アドレス(sig2)からCV0へのロードが行われる。また、ブロックカテゴリー2の「last_significant_coeff_flag」のコンテキスト変数の格納アドレス(last2)からCV1へのロードが行われる。また、ブロックカテゴリー2の「coeff_abs_level_minus1」のコンテキスト変数の格納アドレス(abs2)からCV2へのロードが行われる。
処理762では、メインメモリ300へのストアが行われる。すなわち、CV0の内容がsig2へストアされ、CV1の内容がlast2へストアされる。
処理763では、メインメモリ300への次のストアが行われる。すなわち、CV2の内容がabs2へストアされる。
図41は、本発明の実施の形態において後半に復号されるシンタックス要素のうちブロックカテゴリー3に関する処理内容例を示す図である。
処理771では、メインメモリ300からレジスタファイル120へのロードが行われる。すなわち、ブロックカテゴリー3の「significant_coeff_flag」のコンテキスト変数の格納アドレス(sig3)からCV0へのロードが行われる。また、ブロックカテゴリー3の「last_significant_coeff_flag」のコンテキスト変数の格納アドレス(last3)からCV1へのロードが行われる。また、ブロックカテゴリー3の「coeff_abs_level_minus1」のコンテキスト変数の格納アドレス(abs3)からCV2へのロードが行われる。
処理772では、メインメモリ300へのストアが行われる。すなわち、CV0の内容がsig3へストアされ、CV1の内容がlast3へストアされる。
処理773では、メインメモリ300への次のストアが行われる。すなわち、CV2の内容がabs3へストアされる。
図42は、本発明の実施の形態において後半に復号されるシンタックス要素のうちブロックカテゴリー4に関する処理内容例を示す図である。
処理781では、メインメモリ300からレジスタファイル120へのロードが行われる。すなわち、ブロックカテゴリー4の「significant_coeff_flag」のコンテキスト変数の格納アドレス(sig4)からCV0へのロードが行われる。また、ブロックカテゴリー4の「last_significant_coeff_flag」のコンテキスト変数の格納アドレス(last4)からCV1へのロードが行われる。また、ブロックカテゴリー4の「coeff_abs_level_minus1」のコンテキスト変数の格納アドレス(abs4)からCV2へのロードが行われる。
処理782では、メインメモリ300へのストアが行われる。すなわち、CV0の内容がsig4へストアされ、CV1の内容がlast4へストアされる。
処理783では、メインメモリ300への次のストアが行われる。すなわち、CV2の内容がabs4へストアされる。
図43は、本発明の実施の形態において後半に復号されるシンタックス要素のうちブロックカテゴリー5に関する処理内容例を示す図である。
処理791では、メインメモリ300からレジスタファイル120へのロードが行われる。すなわち、ブロックカテゴリー5の「significant_coeff_flag」のコンテキスト変数の格納アドレス(sig5)からCV0へのロードが行われる。また、ブロックカテゴリー5の「last_significant_coeff_flag」のコンテキスト変数の格納アドレス(last5)からCV1へのロードが行われる。また、ブロックカテゴリー5の「coeff_abs_level_minus1」のコンテキスト変数の格納アドレス(abs5)からCV2へのロードが行われる。
処理792では、メインメモリ300へのストアが行われる。すなわち、CV0の内容がsig5へストアされ、CV1の内容がlast5へストアされる。
処理793では、メインメモリ300への次のストアが行われる。すなわち、CV2の内容がabs5へストアされる。
なお、上述の処理751乃至753、処理761乃至763、処理771乃至773、処理781乃至783、および、処理791乃至793については、ループ内の処理であるため、同じコンテキスト変数を連続して何回か使用する場合には、ストアとロードは省略することができる。
図44は、図38乃至図43の処理手順によるレジスタ間転送の態様を示す図である。この図から、後半に復号されるシンタックス要素をブロックカテゴリー毎に、CV0乃至CV2にロードして、CABAC復号後にストアする様子が分かる。
前半に復号されるシンタックス要素に関する処理は、複雑であるが、処理量は少ない。具体的には、コンテキストインデックスの算出が複雑であり、Bin数の割合が10乃至20%程度と少ない。したがって、メインメモリ300にコンテキスト変数を格納しておくとレイテンシの影響が大きいため、CV4乃至CV7に退避して復号する。
一方、後半に復号されるシンタックス要素に関する処理は、単純であるが処理量が多いため、同じコンテキスト変数を連続して使い続けることができる。具体的には、コンテキストインデックスの算出が単純であり、Bin数の割合が80乃至90%程度と多い。したがって、ロードまたはストアのレイテンシを隠蔽し易いため、コンテキスト変数をメインメモリ300に格納して、ブロックカテゴリーの境目でCV0乃至CV2のコンテキスト変数を入れ替えながら復号する。
図45は、本発明の実施の形態における復号処理の概要を示す図である。この図は、データ操作に着目したものである。最初に必要なコンテキスト変数の初期値生成を行い(611)、前半に復号されるシンタックス要素はレジスタCV4〜7に退避したままで、後半に復号されるシンタックス要素の初期値がメインメモリ300にストアされる(612)。
前半処理620では、CV4乃至CV7に退避されていたコンテキスト変数をCV0乃至CV3に転送して(621)、復号処理を行う(622)。そして、更新されたものをCV4乃至CV7の元のレジスタに書き戻す処理(623)を繰り返すことにより、前半に復号されるべきシンタックス要素を全て復号する。
後半処理630では、ブロックカテゴリー毎に必要なコンテキスト変数をメインメモリ300からCV0乃至CV2にロードし(631)、復号処理を行う(632)。そして、更新されたものをメインメモリ300にストアする処理(633)を繰り返すことにより、後半に復号されるべきシンタックス要素を全て復号する。
図46は、本発明の実施の形態においてロードおよびストアのレイテンシが隠蔽される例を示す図である。ここでは、ブロックカテゴリー3を2回復号した後に、ブロックカテゴリー4を実行するまでの様子を示している。
「Branch」は、「cabac_dec2」において復号された「coded_block_flag」の結果によって、「cabac_dec0」において係数の復号をするか否かの分岐を行う命令である。この場合、全ての係数を復号することを仮定している。「coded_block_flag」のコンテキストインデックスの算出を行う命令があることを想定し、それを「ctxidx_cbf」とした。ここでは、基本的に4段のパイプラインを想定している。すなわち、命令フェッチおよび命令デコードを行うデコードステージ(ID)、レジスタからオペランドフェッチを行うレジスタフェッチステージ(RF)、演算処理などを実行する実行ステージ(EX)、および、レジスタへの書戻しを行うライトバックステージ(WB)の4段である。また、メモリへのストア処理を行うメモリステージ(MEM)も設けられる。ロードストアはデータキャッシュにヒットしていることを想定した。レジスタはフォワーディング(バイパス)されており、一つ前の命令の実行ステージ(EX)における演算結果は、ライトバックステージ(WB)の完了を待たずに、次の命令のレジスタフェッチステージ(RF)で参照できるものとする。
「cabac_dec0命令」は、レジスタフェッチステージ(RF)でCV0乃至CV2の使用権を復号制御部190から取得する。そして、「significant_coeff_flag」を復号する「EXsig」と、「last_significant_coeff_flag」を復号する「EXlast」とを交互に繰り返す。その結果、1ブロック分の処理が終了すると、「WBsig」および「WBlast」において、CV0およびCV1のレジスタの使用権を復号制御部190に返す。これにより、復号された係数の数だけ「coeff_abs_level_minus1」を復号する。ただし、「coeff_abs_level_minus1」は複数のBinであるため、1つの係数毎に「EXabs」を複数回繰り返し、その後に、コンテキスト変数を必要としないデコードバイパスで正負の符号などを復号する「EXsign」を行う。そして、最後の係数の「EXabs」が終了すると、「WBabs」においてCV2の使用権を復号制御部190へ返して、復号された係数が「MEM」においてメインメモリ300に書き込まれる。CV0およびCV1は、早期に使用権が返されるため、ストア処理と次のロード処理とが「coeff_abs_level_minus1」の復号中に実行することができる。
このように、本発明の実施の形態によれば、CABAC復号演算器110にコンテキスト変数を供給する複数本の演算レジスタをレジスタファイル120に設けるとともに、前半に復号されるシンタックス要素のコンテキスト変数を退避する複数本の退避レジスタをレジスタファイル120に設けることにより、効率良く復号を行うことができる。特に、前半に復号されるシンタックス要素のコンテキスト変数は退避レジスタに退避されるため、メインメモリ300へのアクセスを抑制することができる。
なお、本発明の実施の形態は本発明を具現化するための一例を示したものであり、以下に示すように特許請求の範囲における発明特定事項とそれぞれ対応関係を有するが、これに限定されるものではなく本発明の要旨を逸脱しない範囲において種々の変形を施すことができる。