本実施の形態において使用する技術、及び技術用語を定義する。
<ツリーブロック>
実施の形態では、所定の大きさで符号化・復号処理対象画像を均等分割する。この単位をツリーブロックと定義する。図4に示す通り、本実施の形態では、ツリーブロックのサイズを128x128画素と設定するが、ツリーブロックのサイズはこれに限定されるものではなく、任意のサイズを設定してよい。処理対象(符号化処理においては符号化対象、復号処理においては復号対象に対応する。)のツリーブロックは、ラスタスキャン順、すなわち左から右、上から下の順序で切り替わる。各ツリーブロックの内部は、さらに再帰的な分割が可能である。ツリーブロック分割後の、符号化・復号の対象となるブロックを符号化ブロックと定義する。また、ツリーブロック、符号化ブロックを総称してブロックと定義する。適切なブロック分割を行うことにより効率的な符号化が可能となる。ツリーブロックのサイズは、符号化装置と復号装置で予め取り決めた固定値とすることもできるし、符号化装置が決定したツリーブロックのサイズを復号装置に伝送するような構成をとることもできる。
<予測モード>
処理対象符号化ブロック単位で、処理対象画像の処理済み(符号化処理においては符号化が完了した信号を復号した画像、画像信号、ツリーブロック、ブロック、符号化ブロック等に用い、復号処理においては復号が完了した画像、画像信号、ツリーブロック、ブロック、符号化ブロック等に用いる。)の周囲の画像信号から予測を行うイントラ予測(MODE_INTRA)、及び処理済み画像の画像信号から予測を行うインター予測(MODE_INTER)を切り替える。このイントラ予測(MODE_INTRA)とインター予測(MODE_INTER)を識別するモードを予測モード(PredMode)と定義する。予測モード(PredMode)はイントラ予測(MODE_INTRA)、またはインター予測(MODE_INTER)を値として持つ。
<インター予測>
処理済み画像の画像信号から予測を行うインター予測では、複数の処理済み画像を参照ピクチャとして用いることができる。複数の参照ピクチャを管理するため、L0(参照リスト0)とL1(参照リスト1)の2種類の参照リストを定義し、それぞれ参照インデックスを用いて参照ピクチャを特定する。PスライスではL0予測(Pred_L0)が利用可能である。BスライスではL0予測(Pred_L0)、L1予測(Pred_L1)、双予測(Pred_BI)が利用可能である。L0予測(Pred_L0)はL0で管理されている参照ピクチャを参照するインター予測であり、L1予測(Pred_L1)はL1で管理されている参照ピクチャを参照するインター予測である。双予測(Pred_BI)はL0予測とL1予測が共に行われ、L0とL1のそれぞれで管理されている1つずつの参照ピクチャを参照するインター予測である。L0予測、L1予測、双予測を特定する情報を、インター予測モードと定義する。以降の処理において出力に添え字LXが付いている定数、変数に関しては、L0、L1ごとに処理が行われることを前提とする。
<予測動きベクトルモード>
予測動きベクトルモードは、予測動きベクトルを特定するためのインデックス、差分動きベクトル、インター予測モード、参照インデックスを伝送し、処理対象ブロックのインター予測情報を決定するモードである。予測動きベクトルは、処理対象ブロックに隣接する処理済みブロック、または処理済み画像に属するブロックで処理対象ブロックと同一位置またはその付近(近傍)に位置するブロックから導出した予測動きベクトル候補と、予測動きベクトルを特定するためのインデックスから導出する。
<マージモード>
マージモードは、差分動きベクトル、参照インデックスを伝送せずに、処理対象ブロックに隣接する処理済みブロック、または処理済み画像に属するブロックで処理対象ブロックと同一位置またはその付近(近傍)に位置するブロックのインター予測情報から、処理対象ブロックのインター予測情報を導出するモードである。
処理対象ブロックに隣接する処理済みブロック、およびその処理済みブロックのインター予測情報を空間マージ候補と定義する。処理済み画像に属するブロックで処理対象ブロックと同一位置またはその付近(近傍)に位置するブロック、およびそのブロックのインター予測情報から導出されるインター予測情報を時間マージ候補と定義する。各マージ候補はマージ候補リストに登録され、マージインデックスにより処理対象ブロックの予測で使用するマージ候補を特定する。
<隣接ブロック>
図11は、予測動きベクトルモード、マージモードで、インター予測情報を導出するために参照する参照ブロックを説明する図である。A0,A1,A2,B0,B1,B2,B3は、処理対象ブロックに隣接する処理済みブロックである。T0は、処理済画像に属するブロックで、処理対象画像の処理対象符号化ブロックと同一位置またはその付近(近傍)に位置するブロックである。
A1,A2は、処理対象符号化ブロックの左側に位置し、処理対象符号化ブロックに隣接するブロックである。B1,B3は、処理対象符号化ブロックの上側に位置し、処理対象符号化ブロックに隣接するブロックである。A0,B0,B2はそれぞれ、処理対象符号化ブロックの左下、右上、左上に位置するブロックである。
予測動きベクトルモード、マージモードにおいて隣接ブロックをどのように扱うかの詳細については後述する。
<アフィン変換動き補償>
アフィン変換動き補償は、符号化ブロックを所定単位のサブブロックに分割し、各サブブロックに対して個別に動きベクトルを設定して動き補償を行うものである。各サブブロックの動きベクトルは、処理対象ブロックに隣接する処理済みブロック、または処理済み画像に属するブロックで処理対象ブロックと同一位置またはその付近(近傍)に位置するブロックのインター予測情報から導出する1つ以上の制御点に基づき導出する。本実施の形態では、サブブロックのサイズを4x4画素とするが、サブブロックのサイズはこれに限定されるものではないし、画素単位で動きベクトルを導出してもよい。
図14に、制御点が2つの場合のアフィン変換動き補償の例を示す。この場合、2つの制御点が水平方向成分、垂直方向成分の2つのパラメータを有するため、制御点が2つの場合のアフィン変換を、4パラメータアフィン変換と呼称する。図14のCP1、CP2が制御点である。図15に、制御点が3つの場合のアフィン変換動き補償の例を示す。この場合、3つの制御点が水平方向成分、垂直方向成分の2つのパラメータを有するため、制御点が3つの場合のアフィン変換を、6パラメータアフィン変換と呼称する。図15のCP1、CP2、CP3が制御点である。
アフィン変換動き補償は、予測動きベクトルモードおよびマージモードのいずれのモードにおいても利用可能である。予測動きベクトルモードでアフィン変換動き補償を適用するモードをサブブロック予測動きベクトルモードと定義し、マージモードでアフィン変換動き補償を適用するモードをサブブロックマージモードと定義する。
<インター予測のシンタックス>
図12、図13を用いて、インター予測に関するシンタックスを説明する。図12のmerge_flagは、処理対象符号化ブロックをマージモードとするか、予測動きベクトルモードとするかを示すフラグである。merge_affine_flagは、マージモードの処理対象符号化ブロックでサブブロックマージモードを適用するか否かを示すフラグである。inter_affine_flagは、予測動きベクトルモードの処理対象符号化ブロックでサブブロック予測動きベクトルモードを適用するか否かを示すフラグである。cu_affine_type_flagは、サブブロック予測動きベクトルモードにおいて、制御点の数を決定するためのフラグである。図13に各シンタックスエレメントの値と、それに対応する予測方法を示す。merge_flag=1,merge_affine_flag=0は、サブブロックマージでないマージモードである、通常マージモードに対応する。merge_flag=1,merge_affine_flag=1は、サブブロックマージモードに対応する。merge_flag=0,inter_affine_flag=0は、サブブロック予測動きベクトルモードでない予測動きベクトルマージである、通常予測動きベクトルモードに対応する。merge_flag=0,inter_affine_flag=1は、サブブロック予測動きベクトルモードに対応する。merge_flag=0,inter_affine_flag=1の場合は、さらにcu_affine_type_flagを伝送し、制御点の数を決定する。
<POC>
POC(Picture Order Count)は符号化されるピクチャに関連付けられる変数とし、ピクチャの出力順序で1ずつ増加する値が設定される。POCの値によって、同じピクチャであるかを判別したり、出力順序でのピクチャ間の前後関係を判別したり、ピクチャ間の距離を導出したりすることができる。例えば、2つのピクチャのPOCが同じ値を持つ場合、同一のピクチャであると判断できる。2つのピクチャのPOCが違う値を持つ場合、POCの値が小さいピクチャのほうが、先に出力されるピクチャであると判断でき、2つのピクチャのPOCの差が時間軸方向でのピクチャ間距離を示す。
(第1の実施の形態)
本発明の第1の実施の形態に係る画像符号化装置100及び画像復号装置200について説明する。
図1は、第1の実施の形態に係る画像符号化装置100のブロック図である。実施の形態の動画像符号化装置は、画像符号化装置100、ブロック分割部101、インター予測部102、イントラ予測部103、復号画像メモリ104、予測方法決定部105、残差信号生成部106、直交変換・量子化部107、ビット列符号化部108、逆量子化・逆直交変換部109、復号画像信号重畳部110、および符号化情報格納メモリ111を備える。
ブロック分割部101は、入力した画像を再帰的に分割して、符号化ブロックを生成する。ブロック分割部101は、分割対象となるブロックを水平方向と垂直方向にそれぞれ分割する4分割部と、分割対象となるブロックを水平方向または垂直方向のいずれかに分割する2−3分割部を含む。生成した処理対象符号化ブロックの画像信号を、インター予測部102、イントラ予測部103および残差信号生成部106に供給する。また、決定した再帰分割構造を示す情報をビット列符号化部108に供給する。ブロック分割部101の詳細な動作は後述する。
インター予測部102は、処理対象符号化ブロックのインター予測を行う。符号化情報格納メモリに格納されているインター予測情報、復号画像メモリ104に格納されている復号済みの画像信号から複数のインター予測情報の候補を導出し、複数の候補の中から適したインター予測モードを選択し、選択されたインター予測モード、及び選択されたインター予測モードに応じた予測画像信号を予測方法決定部105に供給する。インター予測部102の詳細な構成と動作は後述する。
イントラ予測部103は、処理対象符号化ブロックのイントラ予測を行う。復号画像メモリ104に格納されている復号済みの画像信号からイントラ予測により予測画像信号を生成し、複数のイントラ予測モードの中から適したイントラ予測モードを選択し、選択されたイントラ予測モード、及び選択されたイントラ予測モードに応じた予測画像信号を予測方法決定部105に供給する。図10にイントラ予測の例を示す。図10(a)は、イントラ予測の予測方向とイントラ予測モード番号の対応を示したものである。例えば、イントラ予測モード50は、垂直方向に画素をコピーすることによりイントラ予測画像を生成する。イントラ予測モード1は、DCモードであり、処理対象ブロックのすべての画素値を参照画素の平均値とするモードである。イントラ予測モード0はPlanarモードであり、垂直方向・水平方向の参照画素から2次元的なイントラ予測画像を作成するモードである。図10(b)は、イントラ予測モード40の場合のイントラ予測画像を生成する例である。処理対象ブロックの各画素に対し、イントラ予測モードの示す方向の参照画素の値をコピーする。イントラ予測モードの参照画素が整数位置でない場合には、周辺の整数位置の参照画素値から補間により参照画素値を決定する。
復号画像メモリ104は、復号画像信号重畳部110で生成した復号画像を格納する。復号画像メモリに格納されている復号画像は、インター予測部102、イントラ予測部103に供給する。
予測方法決定部105は、各予測に対して、符号化情報及び残差信号の符号量、予測画像信号と処理対象画像信号との間の歪量等を用いて評価することにより、最適な予測モード(インター予測またはイントラ予測)を決定する。インター予測のマージモードの場合は、マージインデックス、サブブロックマージモードか否かを示す情報(サブブロックマージフラグ)の符号化情報をビット列符号化部108に供給し、インター予測の予測動きベクトルモードの場合はインター予測モード、予測動きベクトルインデックス、L0、L1の参照インデックス、差分動きベクトル、サブブロックモードか否かを示す情報(サブブロック予測動きベクトルフラグ)等の符号化情報をビット列符号化部108に供給する。決定した符号化情報を符号化情報格納メモリ111に供給する。
残差信号生成部106は、処理対象の画像信号から予測画像信号を減ずることにより残差信号を生成し、直交変換・量子化部107に供給する。
直交変換・量子化部107は、残差信号に対して量子化パラメータに応じて直交変換及び量子化を行い直交変換・量子化された残差信号を生成し、ビット列符号化部108と逆量子化・逆直交変換部109に供給する。
ビット列符号化部108は、シーケンス、ピクチャ、スライス、符号化ブロック単位の情報に加えて、符号化ブロック毎に予測方法決定部105によって決定された予測方法に応じた符号化情報を符号化する。具体的には、符号化ブロック毎の予測モードPredMode、分割モードPartMode、インター予測(PRED_INTER)の場合、マージモードか否かを判別するフラグ、サブブロックマージフラグ、マージモードの場合はマージインデックス、マージモードでない場合はインター予測モード、予測動きベクトルインデックス、差分動きベクトルに関する情報、サブブロック予測動きベクトルフラグ等の符号化情報を後述する規定のシンタックス規則に従って符号化し、第1の符号化ビット列を生成する。また、ビット列符号化部108は、直交変換及び量子化された残差信号を規定のシンタックス規則に従ってエントロピー符号化して第2の符号化ビット列を生成する。第1の符号化ビット列と第2の符号化ビット列を規定のシンタックス規則に従って多重化し、ビットストリームを出力する。
逆量子化・逆直交変換部109は、直交変換・量子化部107から供給された直交変換・量子化された残差信号を逆量子化及び逆直交変換して残差信号を算出し、復号画像信号重畳部110に供給する。
復号画像信号重畳部110は、予測方法決定部105による決定に応じた予測画像信号と逆量子化・逆直交変換部109で逆量子化及び逆直交変換された残差信号を重畳して復号画像を生成し、復号画像メモリ104に格納する。なお、復号画像に対して符号化によるブロック歪等の歪を減少させるフィルタリング処理を施した後、復号画像メモリ104に格納してもよい。
符号化情報格納メモリ111は、予測方法決定部105で決定した、予測モード(インター予測またはイントラ予測)等の符号化情報を格納する。符号化情報格納メモリ111が格納する符号化情報は、インター予測の場合は、決定した動きベクトル、参照リスト、参照インデックスに加え、インター予測のマージモードの場合は、マージインデックス、サブブロックマージモードか否かを示す情報(サブブロックマージフラグ)の符号化情報、インター予測の予測動きベクトルモードの場合はインター予測モード、予測動きベクトルインデックス、L0、L1の参照インデックス、差分動きベクトル、サブブロックモードか否かを示す情報(サブブロック予測動きベクトルフラグ)、イントラ予測の場合は、決定したイントラ予測モード等である。符号化情報格納メモリ111で管理される履歴候補リストの構築については後述する。
図2は図1の動画像符号化装置に対応した本発明の実施の形態に係る動画像復号装置の構成を示すブロックである。実施の形態の動画像復号装置は、ビット列復号部201、ブロック分割部202、インター予測部203、イントラ予測部204、符号化情報格納メモリ205、逆量子化・逆直交変換部206、復号画像信号重畳部207、および復号画像メモリ208を備える。
図2の動画像復号装置の復号処理は、図1の動画像符号化装置の内部に設けられている復号処理に対応するものであるから、図2の符号化情報格納メモリ205、逆量子化・逆直交変換部206、復号画像信号重畳部207、および復号画像メモリ208の各構成は、図1の動画像符号化装置の逆量子化・逆直交変換部109、復号画像信号重畳部110、符号化情報格納メモリ111、および復号画像メモリ104の各構成とそれぞれ対応する機能を有する。
ビット列復号部201に供給されるビットストリームは規定のシンタックスの規則に従って分離する。分離された第1の符号化ビット列を復号し、シーケンス、ピクチャ、スライス、符号化ブロック単位の情報、及び、符号化ブロック単位の符号化情報を得る。具体的には、符号化ブロック単位でインター予測(PRED_INTER)かイントラ予測(PRED_INTRA)かを判別する予測モードPredMode、分割モードPartMode、インター予測(PRED_INTER)の場合、マージモードか否かを判別するフラグ、マージモードの場合はマージインデックス、サブブロックマージフラグ、予測動きベクトルモードである場合はインター予測モード、予測動きベクトルインデックス、差分動きベクトル、サブブロック予測動きベクトルフラグ等に関する符号化情報を後述する規定のシンタックス規則に従って復号し、符号化情報をインター予測部203またはイントラ予測部204、および符号化情報格納メモリ205に供給する。分離した第2の符号化ビット列を復号して直交変換・量子化された残差信号を算出し、直交変換・量子化された残差信号を逆量子化・逆直交変換部206に供給する。
インター予測部203は、処理対象の符号化ブロックの予測モードPredModeがインター予測(PRED_INTER)で予測動きベクトルモードである時に、符号化情報格納メモリ205に記憶されている既に復号された画像信号の符号化情報を用いて、複数の予測動きベクトルの候補を導出して後述する予測動きベクトル候補リストに登録し、予測動きベクトル候補リストに登録された複数の予測動きベクトルの候補の中から、ビット列復号部201で復号され供給される予測動きベクトルインデックスに応じた予測動きベクトルを選択し、ビット列復号部201で復号された差分ベクトルと選択された予測動きベクトルから動きベクトルを算出し、他の符号化情報とともに符号化情報格納メモリ205に格納する。ここで供給・格納する符号化ブロックの符号化情報は、予測モードPredMode、分割モードPartMode、L0予測、及びL1予測を利用するか否かを示すフラグpredFlagL0[xP][yP], predFlagL1[xP][yP]、L0、L1の参照インデックスrefIdxL0[xP][yP], refIdxL1[xP][yP]、L0、L1の動きベクトルmvL0[xP][yP], mvL1[xP][yP]等である。ここで、xP、yPはピクチャ内での符号化ブロックの左上の画素の位置を示すインデックスである。予測モードPredModeがインター予測(MODE_INTER)で、インター予測モードがL0予測(Pred_L0)の場合、L0予測を利用するか否かを示すフラグpredFlagL0は1, L1予測を利用するか否かを示すフラグpredFlagL1は0である。インター予測モードがL1予測(Pred_L1)の場合、L0予測を利用するか否かを示すフラグpredFlagL0は0, L1予測を利用するか否かを示すフラグpredFlagL1は1である。インター予測モードが双予測(Pred_BI)の場合、L0予測を利用するか否かを示すフラグpredFlagL0、L1予測を利用するか否かを示すフラグpredFlagL1は共に1である。さらに、処理対象の符号化ブロックの予測モードPredModeがインター予測(PRED_INTER)でマージモードの時に、マージ候補を導出する。符号化情報格納メモリ205に記憶されている既に復号された符号化ブロックの符号化情報を用いて、複数のマージの候補を導出して後述するマージ候補リストに登録し、マージ候補リストに登録された複数のマージ候補の中からビット列復号部201で復号され供給されるマージインデックスに対応したマージ候補を選択し、選択されたマージ候補のL0予測、及びL1予測を利用するか否かを示すフラグpredFlagL0[xP][yP], predFlagL1[xP][yP]、L0、L1の参照インデックスrefIdxL0[xP][yP], refIdxL1[xP][yP]、L0、L1の動きベクトルmvL0[xP][yP], mvL1[xP][yP]等のインター予測情報を符号化情報格納メモリ205に格納する。ここで、xP、yPはピクチャ内での符号化ブロックの左上の画素の位置を示すインデックスである。インター予測部の詳細な構成と動作は後述する。
イントラ予測部204は、処理対象の符号化ブロックの予測モードPredModeがイントラ予測(PRED_INTRA)の時に、イントラ予測を行う。ビット列復号部201で復号された符号化情報にはイントラ予測モードが含まれており、イントラ予測モードに応じて、復号画像メモリ208に格納されている復号済みの画像信号からイントラ予測により予測画像信号を生成し、予測画像信号を復号画像信号重畳部207に供給する。イントラ予測部204は、画像符号化装置100のイントラ予測部103に対応するものであるから、イントラ予測部103と同様の処理を行う。
逆量子化・逆直交変換部206は、ビット列復号部201で復号された直交変換・量子化された残差信号に対して逆直交変換及び逆量子化を行い、逆直交変換・逆量子化された残差信号を得る。
復号画像信号重畳部207は、インター予測部203でインター予測された予測画像信号、またはイントラ予測部204でイントラ予測された予測画像信号と、逆量子化・逆直交変換部206により逆直交変換・逆量子化された残差信号とを重畳することにより、復号画像信号を復号し、復号画像メモリ208に格納する。復号画像メモリ208に格納する際には、復号画像に対して符号化によるブロック歪等を減少させるフィルタリング処理を施した後、復号画像メモリ208に格納してもよい。
次に、画像符号化装置100におけるブロック分割部101の動作について説明する。図3は、画像をツリーブロックに分割し、各ツリーブロックをさらに分割する動作を示すフローチャートである。まず、入力された画像を、所定サイズのツリーブロックに分割する(ステップS1001)。各ツリーブロックについては、所定の順序、すなわちラスタスキャン順に走査し(ステップS1002)、処理対象のツリーブロックの内部を分割する(ステップS1003)。
図7は、ステップS1003の分割処理の詳細動作を示すフローチャートである。まず、処理対象のブロックを4分割するか否かを判断する(ステップS1101)。
処理対象ブロックを4分割すると判断した場合は、処理対象ブロックを4分割する(ステップS1102)。処理対象ブロックを分割した各ブロックについて、Zスキャン順、すなわち左上、右上、左下、右下の順に走査する(ステップS1103)。図5は、Zスキャン順の例であり、図6の601は、処理対象ブロックを4分割した例である。図6の601の番号0〜3は処理の順番を示したものである。そしてステップS1101で分割した各ブロックについて、図7のフローチャートを再帰的に呼び出す。
処理対象ブロックを4分割しないと判断した場合は、2−3分割を行う(ステップS1105)。
図8は、ステップS1105の2−3分割処理の詳細動作を示すフローチャートである。まず、処理対象のブロックを2−3分割するか否か、すなわち2分割または3分割の何れかを行うか否かを判断する(ステップS1201)。
処理対象ブロックを2−3分割すると判断しない場合、すなわち分割しないと判断した場合は、分割を終了し(ステップS1211)、上位階層のブロックに戻る。
処理対象のブロックを2−3分割すると判断した場合は、さらに処理対象ブロックを2分割するか否か(ステップS1202)を判断する。
処理対象ブロックを2分割すると判断した場合は、処理対象ブロックを垂直方向に分割するか否かを判断し(ステップS1203)、その結果に基づき、処理対象ブロックを垂直方向に分割する(ステップS1204)か、処理対象ブロックを水平方向に分割する(ステップS1205)。ステップS1204の結果、処理対象ブロックは、図602に示す通り、垂直方向2分割に分割され、ステップS1205の結果、処理対象ブロックは、図604に示す通り、水平方向2分割に分割される。
ステップS1202において、処理対象のブロックを2分割すると判断しなかった場合、すなわち3分割すると判断した場合は、処理対象ブロックを垂直方向に分割するか否かを判断し(ステップS1206)、その結果に基づき、処理対象ブロックを垂直方向に分割する(ステップS1207)か、処理対象ブロックを水平方向に分割する(ステップS1208)。ステップS1207の結果、処理対象ブロックは、図603に示す通り、垂直方向3分割に分割され、ステップS1208の結果、処理対象ブロックは、図605に示す通り、水平方向3分割に分割される。
ステップS1204からステップS1205のいずれかを実行後、処理対象ブロックを分割した各ブロックについて、左から右、上から下の順に走査する(ステップS1209)。図6の602から605の番号0〜3は処理の順番を示したものである。分割した各ブロックについて、図8のフローチャートを再帰的に呼び出す。
ここで説明した再帰的なブロック分割は、分割する回数、または、処理対象のブロックのサイズ等により、分割要否を制限してもよい。分割要否を制限する情報は、符号化装置と復号装置の間で予め取り決めを行うことで、情報の伝達を行わない構成で実現してもよいし、符号化装置が分割要否を制限する情報を決定し、符号化ビット列に記録することにより、復号装置に伝達する構成で実現してもよい。
ここで、あるブロックを分割した場合、分割前のブロックを親ブロックと呼び、分割後の各ブロックを子ブロックと呼ぶ。
次に、画像復号装置200におけるブロック分割部202の動作について説明する。ブロック分割部202は、画像符号化装置100のブロック分割部101と同様の処理手順でツリーブロックを分割するものである。ただし、画像符号化装置100のブロック分割部101では、画像認識による最適形状の推定や歪レート最適化等最適化手法を適用し、最適なブロック分割の形状を決定するのに対し、画像復号装置200におけるブロック分割部202は、符号化ビット列に記録されたブロック分割情報を復号することにより、ブロック分割形状を決定する点が異なる。
第1の実施の形態のブロック分割に関するシンタックス(符号化ビット列の構文規則)を図9に示す。coding_quadtree()はブロックの4分割処理にかかるシンタックスを表し、multi_type_tree()はブロックの2分割または3分割処理にかかるシンタックスを表す。qt_splitはブロックを4分割するか否かを示すフラグであり、ブロックを4分割する場合は、qt_split=1、4分割しない場合は、qt_split=0とする。4分割する場合(qt_split=1)、4分割した各ブロックについて、再帰的に4分割処理をする(coding_quadtree(0), coding_quadtree(1), coding_quadtree(2), coding_quadtree(3))。4分割しない場合(qt_split=0)は、multi_type_tree()に従い、後続の分割を決定する。mtt_splitは、さらに分割をするか否かを示すフラグである。さらに分割をする場合(mtt_split=1)、垂直方向に分割するか水平方向に分割するかを示すフラグであるmtt_split_verticalと、2分割するか3分割するかを決定するフラグであるmtt_split_binaryを参照する。mtt_split_vertical=1は、垂直方向に分割することを示し、mtt_split_vertical=0は、水平方向に分割することを示す。mtt_split_binary=1は、2分割することを示し、mtt_split_binary=0は3分割することを示す。mtt_split=0となるまで、再帰的にmulti_type_treeを呼び出すことにより、階層的なブロック分割を行う。
<インター予測>
実施の形態に係るインター予測方法は、図1の動画像符号化装置のインター予測部102および図2の動画像復号装置のインター予測部203において実施される。
実施の形態によるインター予測方法について、図面を用いて説明する。インター予測方法は符号化ブロック単位で符号化及び復号の処理の何れでも実施される。
<符号化側のインター予測部102の説明>
図16は図1の動画像符号化装置のインター予測部102の詳細な構成を示す図である。通常予測動きベクトルモード導出部301は複数の通常予測動きベクトル候補を導出して予測動きベクトルを選択し、検出した動きベクトルとの差分ベクトルを算出する。検出されたインター予測モード、参照インデックス、動きベクトル、算出された差分ベクトルが通常予測動きベクトルモードのインター予測情報となる。このインター予測情報がインター予測モード判定部305に供給される。通常予測動きベクトルモード導出部301の詳細な構成と処理については後述する。
通常マージモード導出部302では複数の通常マージ候補を導出して通常マージ候補を選択し、通常マージモードのインター予測情報を得る。このインター予測情報がインター予測モード判定部305に供給される。通常マージモード導出部302の詳細な構成と処理については後述する。
サブブロック予測動きベクトルモード導出部303では複数のサブブロック予測動きベクトル候補を導出してサブブロック予測動きベクトルを選択し、検出した動きベクトルとの差分ベクトルを算出する。検出されたインター予測モード、参照インデックス、動きベクトル、算出された差分ベクトルが通常予測動きベクトルモードのインター予測情報となる。このインター予測情報がインター予測モード判定部305に供給される。サブブロック予測動きベクトルモード導出部303の詳細な構成と処理については後述する。
サブブロックマージモード導出部304では複数のサブブロックマージ候補を導出してサブブロックマージ候補を選択し、サブブロックマージモードのインター予測情報を得る。このインター予測情報がインター予測モード判定部305に供給される。サブブロックマージモード導出部304の詳細な構成と処理については後述する。
インター予測モード判定部305では通常予測動きベクトルモード導出部301、通常マージモード導出部302、サブブロック予測動きベクトルモード導出部303、サブブロックマージモード導出部304から供給されるインター予測情報に基づいて、インター予測情報を判定する。インター予測モード判定部の305から判定結果に応じたインター予測情報が動き補償予測部306に供給される。
動き補償予測部306では判定されたインター予測情報に基づいて、復号画像メモリ104に格納されている参照画像信号に対してインター予測を行う。詳細な構成と処理については後述する。
<復号側のインター予測部203の説明>
図22は図2の動画像復号装置のインター予測部203の詳細な構成を示す図である。
通常予測動きベクトルモード導出部401は複数の通常予測動きベクトル候補を導出して予測動きベクトルを選択し、検出した動きベクトルとの差分ベクトルを算出する。検出されたインター予測モード、参照インデックス、動きベクトル、差分ベクトルが通常予測動きベクトルモードのインター予測情報となる。このインター予測情報がスイッチ408を経由して動き補償予測部406に供給される。通常予測動きベクトルモード導出部401の詳細な構成と処理については後述する。
通常マージモード導出部402では複数の通常マージ候補を導出して通常マージ候補を選択し、通常マージモードのインター予測情報を得る。このインター予測情報がスイッチ408を経由して動き補償予測部406に供給される。通常マージモード導出部402の詳細な構成と処理については後述する。
サブブロック予測動きベクトルモード導出部403では複数のサブブロック予測動きベクトル候補を導出してサブブロック予測動きベクトルを選択し、検出した動きベクトルとの差分ベクトルを算出する。検出されたインター予測モード、参照インデックス、動きベクトル、算出された差分ベクトルが通常予測動きベクトルモードのインター予測情報となる。このインター予測情報がスイッチ408を経由して動き補償予測部406に供給される。サブブロック予測動きベクトルモード導出部403の詳細な構成と処理については後述する。
サブブロックマージモード導出部404では複数のサブブロックマージ候補を導出してサブブロックマージ候補を選択し、サブブロックマージモードのインター予測情報を得る。このインター予測情報がスイッチ408を経由して動き補償予測部406に供給される。サブブロックマージモード導出部404の詳細な構成と処理については後述する。
動き補償予測部406では判定されたインター予測情報に基づいて、復号画像メモリ208に格納されている参照画像信号に対してインター予測を行う。詳細な構成と処理については符号化側と同様である。
<通常予測動きベクトルモード導出部(通常AMVP)>
図17の通常予測動きベクトルモード導出部301は、空間予測動きベクトル候補導出部321、時間予測動きベクトル候補導出部322、履歴予測動きベクトル候補導出部323、予測動きベクトル候補補充部325、通常動きベクトル検出部326、予測動きベクトル候補選択部327、動きベクトル減算部328を含む。
図23の通常予測動きベクトルモード導出部401は、空間予測動きベクトル候補導出部421、時間予測動きベクトル候補導出部422、履歴予測動きベクトル候補導出部423、予測動きベクトル候補補充部425、予測動きベクトル候補選択部426、動きベクトル加算部427を含む。
符号化側の通常予測動きベクトルモード導出部301および復号側の通常予測動きベクトルモード導出部401の処理手順について、それぞれ図19、図25のフローチャートを用いて説明する。図19は符号化側の通常動きベクトルモード導出部301による通常予測動きベクトルモード導出処理手順を示すフローチャートであり、図25は復号側の通常動きベクトルモード導出部401による通常予測動きベクトルモード導出処理手順を示すフローチャートである。
<通常予測動きベクトルモード導出部(通常AMVP):符号化側の説明>
図19を参照して符号化側の通常予測動きベクトルモード導出処理手順を説明する。図19の処理手順の説明において、明細書の動きベクトルという用語と、図19の通常動きベクトルという用語は対応するものとする。
まず、通常動きベクトル検出部326でインター予測モードおよび参照インデックス毎に通常動きベクトルを検出する(図19のステップS100)。
続いて、空間予測動きベクトル候補導出部321、時間予測動きベクトル候補導出部322、履歴予測動きベクトル候補導出部323、予測動きベクトル候補補充部325、予測動きベクトル候補選択部327、動きベクトル減算部328で、通常予測動きベクトルモードのインター予測で用いる動きベクトルの差分動きベクトルをL0、L1毎にそれぞれ算出する(図19のステップS101〜S106)。具体的には処理対象ブロックの予測モードPredModeがインター予測(MODE_INTER)で、インター予測モードがL0予測(Pred_L0)の場合、L0の予測動きベクトル候補リストmvpListL0を算出して、予測動きベクトルmvpL0を選択し、L0の動きベクトルmvL0の差分動きベクトルmvdL0を算出する。処理対象ブロックのインター予測モードがL1予測(Pred_L1)の場合、L1の予測動きベクトル候補リストmvpListL1を算出して、予測動きベクトルmvpL1を選択し、L1の動きベクトルmvL1の差分動きベクトルmvdL1を算出する。処理対象ブロックのインター予測モードが双予測(Pred_BI)の場合、L0予測とL1予測が共に行われ、L0の予測動きベクトル候補リストmvpListL0を算出して、L0の予測動きベクトルmvpL0を選択し、L0の動きベクトルmvL0の差分動きベクトルmvdL0を算出するとともに、L1の予測動きベクトル候補リストmvpListL1を算出して、L1の予測動きベクトルmvpL1を算出し、L1の動きベクトルmvL1の差分動きベクトルmvdL1をそれぞれ算出する。
L0、L1それぞれについて、差分動きベクトル算出処理を行うが、L0、L1ともに共通の処理となる。したがって、以下の説明においてはL0、L1を共通のLXとして表す。L0の差分動きベクトルを算出する処理ではXが0であり、L1の差分動きベクトルを算出する処理ではXが1である。また、LXの差分動きベクトルを算出する処理中に、LXではなく、もう一方のリストの情報を参照する場合、もう一方のリストをLYとして表す。
LXの動きベクトルmvLXを使用する場合(図19のステップS102:YES)、LXの予測動きベクトルの候補を算出してLXの予測動きベクトル候補リストmvpListLXを構築する(図19のステップS103)。通常予測動きベクトルモード導出部301の中の空間予測動きベクトル候補導出部321、時間予測動きベクトル候補導出部322、履歴予測動きベクトル候補導出部323、予測動きベクトル候補補充部325で複数の予測動きベクトルの候補を導出して予測動きベクトル候補リストmvpListLXを構築する。図19のステップS103の詳細な処理手順については図20のフローチャートを用いて後述する。
続いて、予測動きベクトル候補選択部327により、LXの予測動きベクトル候補リストmvpListLXからLXの予測動きベクトルmvpLXを選択する(図19のステップS104)。動きベクトルmvLXと予測動きベクトル候補リストmvpListLXの中に格納された各予測動きベクトルの候補mvpListLX[i]との差分であるそれぞれの差分動きベクトルを算出する。それら差分動きベクトルを符号化したときの符号量を予測動きベクトル候補リストmvpListLXの要素(予測動きベクトル候補)ごとに算出する。そして、予測動きベクトル候補リストmvpListLXに登録された各要素の中で、予測動きベクトルの候補毎の符号量が最小となる予測動きベクトルの候補mvpListLX[i]を予測動きベクトルmvpLXとして選択し、そのインデックスiを取得する。予測動きベクトル候補リストmvpListLXの中で最小の発生符号量となる予測動きベクトルの候補が複数存在する場合には、予測動きベクトル候補リストmvpListLXの中のインデックスiが小さい番号で表される予測動きベクトルの候補mvpListLX[i]を最適予測動きベクトルmvpLXとして選択し、そのインデックスiを取得する。
続いて、動きベクトル減算部328で、LXの動きベクトルmvLXから選択されたLXの予測動きベクトルmvpLXを減算し、
mvdLX = mvLX - mvpLX
としてLXの差分動きベクトルmvdLXを算出する(図19のステップS105)。
<通常予測動きベクトルモード導出部(通常AMVP):復号側の説明>
次に、図25を参照して復号側の通常予測動きベクトルモード処理手順を説明する。復号側では、空間予測動きベクトル候補導出部421、時間予測動きベクトル候補導出部422、履歴予測動きベクトル候補導出部423、予測動きベクトル候補補充部425で、通常予測動きベクトルモードのインター予測で用いる動きベクトルをL0,L1毎にそれぞれ算出する(図25のステップS201〜S206)。具体的には処理対象ブロックの予測モードPredModeがインター予測(MODE_INTER)で、処理対象ブロックのインター予測モードがL0予測(Pred_L0)の場合、L0の予測動きベクトル候補リストmvpListL0を算出して、予測動きベクトルmvpL0を選択し、L0の動きベクトルmvL0を算出する。処理対象ブロックのインター予測モードがL1予測(Pred_L1)の場合、L1の予測動きベクトル候補リストmvpListL1を算出して、予測動きベクトルmvpL1を選択し、L1の動きベクトルmvL1を算出する。処理対象ブロックのインター予測モードが双予測(Pred_BI)の場合、L0予測とL1予測が共に行われ、L0の予測動きベクトル候補リストmvpListL0を算出して、L0の予測動きベクトルmvpL0を選択し、L0の動きベクトルmvL0を算出するとともに、L1の予測動きベクトル候補リストmvpListL1を算出して、L1の予測動きベクトルmvpL1を算出し、L1の動きベクトルmvL1をそれぞれ算出する。
符号化側と同様に、復号側でもL0、L1それぞれについて、動きベクトル算出処理を行うが、L0、L1ともに共通の処理となる。したがって、以下の説明においてはL0、L1を共通のLXとして表す。LXは処理対象の符号化ブロックのインター予測に用いるインター予測モードを表す。L0の動きベクトルを算出する処理ではXが0であり、L1の動きベクトルを算出する処理ではXが1である。また、LXの動きベクトルを算出する処理中に、算出対象のLXと同じ参照リストではなく、もう一方の参照リストの情報を参照する場合、もう一方の参照リストをLYとして表す。
LXの動きベクトルmvLXを使用する場合(図25のステップS202:YES)、LXの予測動きベクトルの候補を算出してLXの予測動きベクトル候補リストmvpListLXを構築する(図25のステップS203)。通常予測動きベクトルモード導出部401の中の空間予測動きベクトル候補導出部421、時間予測動きベクトル候補導出部422、履歴予測動きベクトル候補導出部423、予測動きベクトル候補補充部425で複数の予測動きベクトルの候補を算出し、予測動きベクトル候補リストmvpListLXを構築する。図25のステップS203の詳細な処理手順については図20のフローチャートを用いて後述する。
続いて、予測動きベクトル候補選択部426で予測動きベクトル候補リストmvpListLXからビット列復号部201にて復号されて供給される予測動きベクトルのインデックスmvpIdxLXに対応する予測動きベクトルの候補mvpListLX[mvpIdxLX]を選択された予測動きベクトルmvpLXとして取り出す(図25のステップS204)。
続いて、動きベクトル加算部427でビット列復号部201にて復号されて供給されるLXの差分動きベクトルmvdLXとLXの予測動きベクトルmvpLXを加算し、
mvLX = mvpLX + mvdLX
としてLXの動きベクトルmvLXを算出する(図25のステップS205)。
<通常予測動きベクトルモード導出部(通常AMVP):動きベクトルの予測方法>
図20は本発明の実施の形態に係る動画像符号化装置の通常予測動きベクトルモード導出部301及び動画像復号装置の通常予測動きベクトルモード導出部401とで共通する機能を有する通常予測動きベクトルモード導出処理の処理手順を表すフローチャートである。
通常予測動きベクトルモード導出部301及び通常予測動きベクトルモード導出部401では、予測動きベクトル候補リストmvpListLXを備えている。予測動きベクトル候補リストmvpListLXはリスト構造を成し、予測動きベクトル候補リスト内部の所在を示す予測動きベクトルインデックスと、インデックスに対応する予測動きベクトル候補を要素として格納する記憶領域が設けられている。予測動きベクトルインデックスの数字は0から開始され、予測動きベクトル候補リストmvpListLXの記憶領域に、予測動きベクトル候補が格納される。本実施の形態においては、予測動きベクトル候補リストmvpListLXは少なくとも2個の予測動きベクトル候補(インター予測情報)を登録することができるものとする。さらに、予測動きベクトル候補リストmvpListLXに登録されている予測動きベクトル候補数を示す変数numCurrMvpCandに0を設定する。
空間予測動きベクトル候補導出部321及び421は、左側に隣接するブロックからの予測動きベクトルの候補を導出する。この処理では、左側に隣接するブロック(A0またはA1)の予測動きベクトル候補が利用できるか否かを示すフラグavailableFlagLXA、及び動きベクトルmvLXA、参照インデックスrefIdxAを導出し、mvLXAを予測動きベクトル候補リストmvpListLXに追加する(図20のステップS301)。なお、L0のときXは0、L1のときXは1とする(以下同様)。続いて、空間予測動きベクトル候補導出部321及び421は、上側に隣接するブロック(B0,B1またはB2)からの予測動きベクトルの候補を導出する。この処理では、上側に隣接するブロックの予測動きベクトル候補が利用できるか否かを示すフラグavailableFlagLXB、及び動きベクトルmvLXB、参照インデックスrefIdxBを導出し、mvLXAとmvLXBが等しくなければ、mvLXBを予測動きベクトル候補リストmvpListLXに追加する(図20のステップS302)。図20のステップS301とS302の処理は参照する隣接ブロックの位置と数が異なる点以外は共通であり、符号化ブロックの予測動きベクトル候補が利用できるか否かを示すフラグavailableFlagLXN、及び動きベクトルmvLXN、参照インデックスrefIdxN(NはAまたはB、以下同様)を導出する。
続いて、時間予測動きベクトル候補導出部322及び422は、現在の処理対象ピクチャとは時間が異なるピクチャにおける符号化ブロックからの予測動きベクトルの候補を導出する。この処理では、異なる時間のピクチャにおける符号化ブロックの予測動きベクトル候補が利用できるか否かを示すフラグavailableFlagLXCol、及び動きベクトルmvLXCol、参照インデックスrefIdxCol、参照リストlistColを導出し、mvLXColを予測動きベクトル候補リストmvpListLXに追加する(図20のステップS303)。このステップS303の導出処理手順を後ほど詳細に説明する。
なお、シーケンス(SPS)、ピクチャ(PPS)またはスライスの単位で時間予測動きベクトル候補導出部322及び422の処理を省略することができるものとする。
続いて、履歴予測動きベクトル候補導出部323及び423は履歴予測動きベクトル候補リストHmvpCandListに登録されている履歴予測動きベクトル候補を予測動きベクトル候補リストmvpListLXに追加する。(図20のステップS304)。このステップS304の登録処理手順については図41のフローチャートを用いて後ほど詳細に説明する。
続いて予測動きベクトル候補補充部325及び425は予測動きベクトル候補リストmvpListLXを満たすまで(0,0)等、所定の値の動きベクトルを追加する(図20のステップS305)。
<通常マージモード導出部(通常マージ)>
図18の通常マージモード導出部302は、空間マージ候補導出部341、時間マージ候補導出部342、平均マージ候補導出部344、履歴マージ候補導出部345、マージ候補補充部346、マージ候補選択部347を含む。
図24の通常マージモード導出部402は、空間マージ候補導出部441、時間マージ候補導出部442、平均マージ候補導出部444、履歴マージ候補導出部445、マージ候補補充部446、マージ候補選択部447を含む。
図21は本発明の実施の形態に係る動画像符号化装置の通常マージモード導出部302及び動画像復号装置の通常マージモード導出部402とで共通する機能を有する通常マージモード導出処理の手順を説明するフローチャートである。
以下、諸過程を順を追って説明する。なお、以下の説明においては特に断りのない限りスライスタイプslice_typeがBスライスの場合について説明するが、Pスライスの場合にも適用できる。ただし、スライスタイプslice_typeがPスライスの場合、インター予測モードとしてL0予測(Pred_L0)だけがあり、L1予測(Pred_L1)、双予測(Pred_BI)がないので、L1に纏わる処理を省略することができる。
通常マージモード導出部302及び通常マージモード導出部402では、マージ候補リストmergeCandListを備えている。マージ候補リストmergeCandListはリスト構造を成し、マージ候補リスト内部の所在を示すマージインデックスと、インデックスに対応するマージ候補を要素として格納する記憶領域が設けられている。マージインデックスの数字は0から開始され、マージ候補リストmergeCandListの記憶領域に、マージ候補が格納される。以降の処理では、マージ候補リストmergeCandListに登録されたマージインデックスiのマージ候補は、mergeCandList[i]で表すこととする。本実施の形態においては、マージ候補リストmergeCandListは少なくとも6個のマージ候補(インター予測情報)を登録することができるものとする。さらに、マージ候補リストmergeCandListに登録されているマージ候補数を示す変数numCurrMergeCandに0を設定する。
空間マージ候補導出部341及び空間マージ候補導出部441では、動画像符号化装置の符号化情報格納メモリ111または動画像復号装置の符号化情報格納メモリ205に格納されている符号化情報から、処理対象ブロックの左側と上側に隣接するブロックからの空間マージ候補A,Bを導出して、導出された空間マージ候補をマージ候補リストmergeCandListに登録する(図21のステップS401)。ここで、空間マージ候補A,Bまたは時間マージ候補Colのいずれかを示すNを定義する。ブロックNのインター予測情報が空間マージ候補Nとして利用できるか否かを示すフラグavailableFlagN、空間マージ候補NのL0の参照インデックスrefIdxL0N及びL1の参照インデックスrefIdxL1N、L0予測が行われるか否かを示すL0予測フラグpredFlagL0NおよびL1予測が行われるか否かを示すL1予測フラグpredFlagL1N、L0の動きベクトルmvL0N、L1の動きベクトルmvL1Nを導出する。ただし、本実施の形態においては処理対象となる符号化ブロックを含むブロックに含まれる他の符号化ブロックを参照せずに、マージ候補を導出するので、処理対象の符号化ブロックを含むブロックに含まれる空間マージ候補は導出しない。
続いて、時間マージ候補導出部342及び時間マージ候補導出部442では、異なる時間のピクチャからの時間マージ候補を導出して、導出された時間マージ候補をマージ候補リストmergeCandListに登録する(図21のステップS402)。時間マージ候補が利用できるか否かを示すフラグavailableFlagCol、時間マージ候補のL0予測が行われるか否かを示すL0予測フラグpredFlagL0ColおよびL1予測が行われるか否かを示すL1予測フラグpredFlagL1Col、及びL0の動きベクトルmvL0Col、L1の動きベクトルmvL1Colを導出する。ステップS402の詳細な処理手順については後ほど図56を参照して詳細に説明する。
なお、シーケンス(SPS)、ピクチャ(PPS)またはスライスの単位で時間マージ候補導出部342及び時間マージ候補導出部442の処理を省略することができるものとする。
続いて、履歴マージ候補導出部345及び履歴マージ候補導出部445では、履歴予測動きベクトル候補リストHmvpCandListに登録されている履歴予測動きベクトル候補をマージ候補リストmergeCandListに追加する(図21のステップS403)。ステップS403の詳細な処理手順については図62のフローチャートを用いて後ほど詳細に説明する。
続いて、平均マージ候補導出部344及び平均マージ候補導出部444では、マージ候補リストmergeCandListから平均マージ候補を導出して、導出された平均マージ候補をマージ候補リストmergeCandListに登録する(図21のステップS404)。ステップS404の詳細な処理手順については図41のフローチャートを用いて後ほど詳細に説明する。
続いて、マージ候補補充部346及びマージ候補補充部446では、マージ候補リストmergeCandList内に登録されているマージ候補数numCurrMergeCandが、最大マージ候補数MaxNumMergeCandより小さい場合、マージ候補リストmergeCandList内に登録されているマージ候補数numCurrMergeCandが最大マージ候補数MaxNumMergeCandを上限として追加マージ候補を導出して、マージ候補リストmergeCandListに登録する(図21のステップS405)。最大マージ候補数MaxNumMergeCandを上限として、Pスライスでは、異なる参照インデックスで動きベクトルが(0,0)の値を持つ予測モードがL0予測(Pred_L0)のマージ候補を追加する。Bスライスでは、異なる参照インデックスで動きベクトルが(0,0)の値を持つ予測モードが双予測(Pred_BI)のマージ候補を追加する。
続いて、マージ候補選択部347及びマージ候補選択部447では、マージ候補リストmergeCandList内に登録されているマージ候補からマージ候補を選択する。符号化側のマージ候補選択部347では、符号量とひずみ量を算出することによりマージ候補を選択し、選択されたマージ候補を示すマージインデックス、マージ候補のインター予測情報を動き補償予測部306に供給する。一方、復号側のマージ候補選択部447では、復号されたマージインデックスに基づいて、マージ候補を選択し、選択されたマージ候補を動き補償予測部406に供給する。
通常マージモード導出部302及び通常マージモード導出部402は、ある符号化ブロックのサイズ(幅と高さの積)が32未満の場合、その符号化ブロックの親ブロックにおいてマージ候補が導出される。そして、全ての子ブロックでは、親ブロックにおいて導出されたマージ候補を用いる。ただし、親ブロックのサイズが32以上で、かつ画面内に収まっている場合に限る。
<サブブロック予測動きベクトルモード導出>
サブブロック予測動きベクトルモード導出について説明する。
図26は、本実施の形態の符号化装置におけるサブブロック予測動きベクトルモード導出部303のブロック図である。
まず、アフィン継承予測動きベクトル候補導出部361において、アフィン継承予測動きベクトル候補を導出する。アフィン継承予測動きベクトル候補導出の詳細については後述する。
続いて、アフィン構築予測動きベクトル候補導出部362において、アフィン構築予測動きベクトル候補を導出する。アフィン構築予測動きベクトル候補導出の詳細については後述する。
続いて、アフィン同一予測動きベクトル候補導出部363において、アフィン同一予測動きベクトル候補を導出する。アフィン同一予測動きベクトル候補導出の詳細については後述する。
サブブロック動きベクトル検出部366は、サブブロック予測動きベクトルモードに適するサブブロック動きベクトルを検出し、検出したベクトルをサブブロック予測動きベクトル候補選択部367、差分演算部368に供給する。
サブブロック予測動きベクトル候補選択部367は、アフィン継承予測動きベクトル候補導出部361、アフィン構築予測動きベクトル候補導出部362、アフィン同一予測動きベクトル候補導出部363において導出されたサブブロック予測動きベクトル候補の中から、サブブロック動きベクトル検出部366から供給された動きベクトルに基づいて、サブブロック予測動きベクトル候補を選択し、選択されたサブブロック予測動きベクトル候補に関する情報をインター予測モード判定部305、差分演算部368に供給する。
差分演算部368は、サブブロック動きベクトル検出部366から供給された動きベクトルベクトルから、サブブロック予測動きベクトル候補選択部367で選択されたサブブロック予測動きベクトルを減算した差分予測動きベクトルを、インター予測モード判定部305に供給する。
図27は、本実施の形態の復号装置におけるサブブロック予測動きベクトルモード導出部403のブロック図である。
まず、アフィン継承予測動きベクトル候補導出部461において、アフィン継承予測動きベクトル候補を導出する。アフィン継承予測動きベクトル候補導出部461の処理は本実施の形態の符号化装置におけるアフィン継承予測動きベクトル候補導出部361の処理と同一である。
続いて、アフィン構築予測動きベクトル候補導出部462において、アフィン構築予測動きベクトル候補を導出する。アフィン構築予測動きベクトル候補導出部462の処理は本実施の形態の符号化装置におけるアフィン構築予測動きベクトル候補導出部362の処理と同一である。
続いて、アフィン同一予測動きベクトル候補導出部463において、アフィン同一予測動きベクトル候補を導出する。アフィン同一予測動きベクトル候補導出部463の処理は本実施の形態の符号化装置におけるアフィン同一予測動きベクトル候補導出部363の処理と同一である。
サブブロック予測動きベクトル候補選択部466は、アフィン継承予測動きベクトル候補導出部461、アフィン構築予測動きベクトル候補導出部462、アフィン同一予測動きベクトル候補導出部463において導出されたサブブロック予測動きベクトル候補の中から、符号化装置から伝送され復号される予測動きベクトルインデックスに基づいて、サブブロック予測動きベクトル候補を選択し、選択されたサブブロック予測動きベクトル候補に関する情報を動き補償予測部406、加算演算部467に供給する。
加算演算部467は、サブブロック予測動きベクトル候補選択部466で選択されたサブブロック予測動きベクトルに、符号化装置から伝送され復号される差分動きベクトルを加算して生成した動きベクトルを動き補償予測部406に供給する。
<アフィン継承予測動きベクトル候補導出>
アフィン継承予測動きベクトル候補導出部361について説明する。アフィン継承予測動きベクトル候補導出部461についてもアフィン継承予測動きベクトル候補導出部361と同様である。
アフィン継承予測動きベクトル候補は、制御点の動きベクトル情報を継承する。
図30は、アフィン継承予測動きベクトル候補導出を説明する図である。
アフィン継承予測動きベクトル候補は、空間的に隣接する符号化済・復号済ブロックの有する制御点の動きベクトルを探索することで得られる。
具体的には、処理対象のブロックの左側に隣接するブロック(A0,A1)と、処理対象のブロックの上側に隣接するブロック(B0,B1,B2)から、それぞれ最大1つのアフィンモードを探索し、アフィン継承予測動きベクトルとする。
図34は、アフィン継承予測動きベクトル候補導出のフローチャートである。
まず、処理対象のブロックの左側に隣接するブロック(A0,A1)を左グループとし(ステップS3101)、A0を含むブロックがアフィン変換動き補償を用いたブロック(アフィンモード)であるか否かを判断する(ステップS3102)。A0がアフィンモードである場合(ステップS3102:YES)、A0が使用したアフィンモードを取得し(ステップS3103)、上側に隣接するブロックの処理に移る。A0がアフィンモードでない場合(ステップS3102:NO)、アフィン継承予測動きベクトル候補導出の対象をA0−>A1とし、A1を含むブロックからアフィンモードの取得を試みる。
続いて、処理対象のブロックの上側に隣接するブロック(B0,B1,B2)を上グループとし(ステップS3104)、B0を含むブロックがアフィンモードであるか否かを判断する(ステップS3105)。B0がアフィンモードである場合(ステップS3105:YES)、B0が使用したアフィンモードを取得し(ステップS3106)、処理を終了する。B0がアフィンモードでない場合(ステップS3105:NO)、アフィン継承予測動きベクトル候補導出の対象をB0−>B1とし、B1を含むブロックからアフィンモードの取得を試みる。さらに、B1がアフィンモードでない場合(ステップS3105:NO)、アフィン継承予測動きベクトル候補導出の対象をB1−>B2とし、B2を含むブロックからアフィンモードの取得を試みる。
このように、左側ブロックと上側ブロックにグループを分けて、左側ブロックについては、左下から左上のブロックの順にアフィンモードを探索し、左側ブロックについては、右上から左上のブロックの順にアフィンモードを探索することで、可能な限り異なる2つのアフィンモードを取得することができ、アフィン予測動きベクトルのいずれかが差分動きベクトルの小さくなるアフィン予測動きベクトル候補を導出することができる。
<アフィン構築予測動きベクトル候補導出>
アフィン構築予測動きベクトル候補導出部362について説明する。アフィン構築予測動きベクトル候補導出部462についてもアフィン構築予測動きベクトル候補導出部362と同様である。
アフィン構築予測動きベクトル候補は、空間的に隣接するブロックの動き情報から制御点の動きベクトル情報を構築する。
図31は、アフィン構築予測動きベクトル候補導出を説明する図である。
アフィン構築予測動きベクトル候補は、空間的に隣接する符号化済・復号済ブロックの有する動きベクトルを組み合わせて新たなアフィンモードを構築することで得られる。
具体的には、処理対象のブロックの左上側に隣接するブロック(B2,B3,A2)から左上制御点CP0の動きベクトルを導出し、処理対象のブロックの右上側に隣接するブロック(B1,B0)から右上制御点CP1の動きベクトルを導出し、処理対象のブロックの左下側に隣接するブロック(A1,A0)から左下制御点CP2の動きベクトルを導出する。
図35は、アフィン構築予測動きベクトル候補導出のフローチャートである。
まず、左上制御点CP0、右上制御点CP1、左下制御点CP2を導出する(ステップS3201)。左上制御点CP0は、処理対象のブロックと同一の参照画像をもつ参照ブロックを、B2、B3、A2参照ブロックの優先順で探索することで算出される。右上制御点CP1は、処理対象のブロックと同一の参照画像をもつ参照ブロックを、B1、B0参照ブロックの優先順で探索することで算出される。左下制御点CP2は、処理対象のブロックと同一の参照画像をもつ参照ブロックを、A1、A0参照ブロックの優先順で探索することで算出される。
アフィン構築予測動きベクトルとして、制御点3本モードを選択する場合(ステップS3202:YES)、3つの制御点(CP0,CP1,CP2)がすべて導出されたか否かを判断する(ステップS3203)。3つの制御点(CP0,CP1,CP2)がすべて導出された場合(ステップS3203:YES)、3つの制御点(CP0,CP1,CP2)を用いたアフィンモデルをアフィン構築予測動きベクトルとする(ステップS3204)。制御点3本モードを選択せず、制御点2本モードを選択した場合(ステップS3202:NO)、2つの制御点(CP0,CP1)がすべて導出されたか否かを判断する(ステップS3205)。2つの制御点(CP0,CP1)がすべて導出された場合(ステップS3205:YES)、2つの制御点(CP0,CP1)を用いたアフィンモデルをアフィン構築予測動きベクトルとする(ステップS3206)。
<アフィン同一予測動きベクトル候補導出>
アフィン同一予測動きベクトル候補導出部363について説明する。アフィン同一予測動きベクトル候補導出部463についてもアフィン同一予測動きベクトル候補導出部363と同様である。
アフィン同一予測動きベクトル候補は、各制御点で同一の動きベクトルを導出することで得られる。
具体的には、アフィン構築予測動きベクトル候補導出部362・462と同様に、各制御点情報を導出し、すべての制御点をCP0〜CP2のいずれかで同一に設定することで得られる。また、通常予測動きベクトルモードと同様に導出した時間動きベクトルをすべての制御点に設定することでも得られる。
<サブブロックマージモード導出>
サブブロックマージモード導出について説明する。
図28は、本実施の形態の符号化装置におけるサブブロックマージモード導出部304のブロック図である。サブブロックマージモード導出部304は、サブブロックマージ候補リストsubblockMergeCandListを備えている。これは、通常マージモード導出部302におけるマージ候補リストmergeCandListと同様にリスト構造を成し、サブブロックマージ候補リスト内部の所在を示すマージインデックスと、インデックスに対応するサブブロックマージ候補を要素として格納する記憶領域が設けられている。本実施の形態においては、サブブロックマージ候補リストsubblockMergeCandListは少なくとも5個のマージ候補(インター予測情報)を登録することができるものとする。ただし、各マージ候補は、さらにサブブロック単位の動きベクトル情報を持つか、あるいは制御点の動きベクトル情報を持つ。
まず、サブブロック時間マージ候補導出部381において、サブブロック時間マージ候補を導出する。サブブロック時間マージ候補導出の詳細については後述する。
続いて、アフィン継承マージ候補導出部382において、アフィン継承マージ候補を導出する。アフィン継承マージ候補導出の詳細については後述する。
続いて、アフィン構築マージ候補導出部383において、アフィン構築マージ候補を導出する。アフィン構築マージ候補導出の詳細については後述する。
続いて、アフィン固定マージ候補導出部385において、アフィン固定マージ候補を導出する。アフィン固定マージ候補導出の詳細については後述する。
サブブロックマージ候補選択部386は、サブブロック時間マージ候補導出部381、アフィン継承マージ候補導出部382、アフィン構築マージ候補導出部383、アフィン固定マージ候補導出部385において導出されたサブブロックマージ候補の中から、サブブロックマージ候補を選択し、選択されたサブブロックマージ候補に関する情報をインター予測モード判定部305に供給する。
図29は、本実施の形態の復号装置におけるサブブロックマージモード導出部404のブロック図である。サブブロックマージモード導出部404は、サブブロックマージ候補リストsubblockMergeCandListを備えている。これは、サブブロックマージモード導出部304と同じものである。
まず、サブブロック時間マージ候補導出部481において、サブブロック時間マージ候補を導出する。サブブロック時間マージ候補導出部481の処理はサブブロック時間マージ候補導出部381の処理と同一である。
続いて、アフィン継承マージ候補導出部482において、アフィン継承マージ候補を導出する。アフィン継承マージ候補導出部482の処理はアフィン継承マージ候補導出部382の処理と同一である。
続いて、アフィン構築マージ候補導出部483において、アフィン構築マージ候補を導出する。アフィン構築マージ候補導出部483の処理はアフィン構築マージ候補導出部383の処理と同一である。
続いて、アフィン固定マージ候補導出部485において、アフィン固定マージ候補を導出する。アフィン固定マージ候補導出部485の処理はアフィン固定マージ候補導出部485の処理と同一である。
サブブロックマージ候補選択部486は、サブブロック時間マージ候補導出部481、アフィン継承マージ候補導出部482、アフィン構築マージ候補導出部483、アフィン固定マージ候補導出部485において導出されたサブブロックマージ候補の中から、符号化装置から伝送され復号されるインデックスに基づいて、サブブロックマージ候補を選択し、選択されたサブブロックマージ候補に関する情報を動き補償予測部406に供給する。
サブブロックマージモード導出部304及びサブブロックマージモード導出部404は、ある符号化ブロックのサイズ(幅と高さの積)が32未満の場合、その符号化ブロックの親ブロックにおいてサブブロックマージ候補が導出される。そして、全ての子ブロックでは、親ブロックにおいて導出されたサブブロックマージ候補を用いる。ただし、親ブロックのサイズが32以上で、かつ画面内に収まっている場合に限る。
<サブブロック時間マージ候補導出>
サブブロック時間マージ候補導出部381の動作については後述する。
<アフィン継承マージ候補導出>
アフィン継承マージ候補導出部382について説明する。アフィン継承マージ候補導出部482についてもアフィン継承マージ候補導出部382と同様である。
アフィン継承マージ候補は、空間的に隣接するブロックの有するアフィンモデルから制御点のアフィンモデルを継承する。
図32は、アフィン継承マージ候補導出を説明する図である。アフィンマージ継承マージモード候補の導出は、アフィン継承予測動きベクトルの導出と同様に、空間的に隣接する符号化済・復号済ブロックの有する制御点の動きベクトルを探索することで得られる。
具体的には、処理対象のブロックの左側に隣接するブロック(A0,A1)と、処理対象のブロックの上側に隣接するブロック(B0,B1,B2)から、それぞれ最大1つのアフィンモードを探索し、アフィンマージモードに使用する。
図36は、アフィン継承マージ候補導出のフローチャートである。
まず、処理対象のブロックの左側に隣接するブロック(A0,A1)を左グループとし(ステップS3301)、A0を含むブロックがアフィンモードであるか否かを判断する(ステップS3302)。A0がアフィンモードである場合(ステップS3102:YES)、A0が使用したアフィンモデルを取得し(ステップS3303)、上側に隣接するブロックの処理に移る。A0がアフィンモードでない場合(ステップS3302:NO)、アフィン継承マージ候補導出の対象をA0−>A1とし、A1を含むブロックからアフィンモードの取得を試みる。
続いて、処理対象のブロックの上側に隣接するブロック(B0,B1,B2)を上グループとし(ステップS3304)、B0を含むブロックがアフィンモードであるか否かを判断する(ステップS3305)。B0がアフィンモードである場合(ステップS3305:YES)、B0が使用したアフィンモデルを取得し(ステップS3306)、処理を終了する。B0がアフィンモードでない場合(ステップS3305:NO)、アフィン継承マージ候補導出の対象をB0−>B1とし、B1を含むブロックからアフィンモードの取得を試みる。さらに、B1がアフィンモードでない場合(ステップS3305:NO)、アフィン継承マージ候補導出の対象をB1−>B2とし、B2を含むブロックからアフィンモードの取得を試みる。
<アフィン構築マージ候補導出>
アフィン構築マージ候補導出部383について説明する。アフィン構築マージ候補導出部483についてもアフィン構築マージ候補導出部383と同様である。
図33は、アフィン構築マージ候補導出を説明する図である。アフィン構築マージ候補は、空間的に隣接するブロックの有する動き情報及び時間符号化ブロックから制御点のアフィンモデルを構築する。
具体的には、処理対象のブロックの左上側に隣接するブロック(B2,B3,A2)から左上制御点CP0の動きベクトルを導出し、処理対象のブロックの右上側に隣接するブロック(B1,B0)から右上制御点CP1の動きベクトルを導出し、処理対象のブロックの左下側に隣接するブロック(A1,A0)から左下制御点CP2の動きベクトルを導出し、処理対象のブロックとの右下側に隣接する符号化ブロック(T0)から右下制御点CP3の動きベクトルを導出する。
図37は、アフィン構築マージ候補導出のフローチャートである。
まず、左上制御点CP0、右上制御点CP1、左下制御点CP2、右下制御点CP3を導出する(ステップS3401)。左上制御点CP0は、動き情報を有するブロックを、B2、B3、A2ブロックの優先順で探索することで算出される。右上制御点CP1は、動き情報を有するブロックを、B1、B0ブロックの優先順で探索することで算出される。左下制御点CP2は、動き情報を有するブロックを、A1、A0ブロックの優先順で探索することで算出される。右下制御点CP3は、時間ブロックの動き情報を探索することで算出される。
続いて、導出されたCP0、CP1、CP2により3本制御点によるアフィンモデルを構築可能であるか否かを判断し(ステップS3402)、構築可能である場合(ステップS3402:YES)、CP0、CP1、CP2による3本制御点アフィンモデルをアフィンマージ候補とする(ステップS3403)。
続いて、導出されたCP0、CP1、CP3により3本制御点によるアフィンモデルを構築可能であるか否かを判断し(ステップS3404)、構築可能である場合(ステップS3404:YES)、CP0、CP1、CP3による3本制御点アフィンモデルをアフィンマージ候補とする(ステップS3405)。
続いて、導出されたCP0、CP2、CP3により3本制御点によるアフィンモデルを構築可能であるか否かを判断し(ステップS3406)、構築可能である場合(ステップS3406:YES)、CP0、CP2、CP3による3本制御点アフィンモデルをアフィンマージ候補とする(ステップS3407)。
続いて、導出されたCP1、CP2、CP3により3本制御点によるアフィンモデルを構築可能であるか否かを判断し(ステップS3408)、構築可能である場合(ステップS3408:YES)、CP1、CP2、CP3による3本制御点アフィンモデルをアフィンマージ候補とする(ステップS3409)。
続いて、導出されたCP0、CP1により2本制御点によるアフィンモデルを構築可能であるか否かを判断し(ステップS3410)、構築可能である場合(ステップS3410:YES)、CP0、CP1による2本制御点アフィンモデルをアフィンマージ候補とする(ステップS3411)。
続いて、導出されたCP0、CP2により2本制御点によるアフィンモデルを構築可能であるか否かを判断し(ステップS3412)、構築可能である場合(ステップS3412:YES)、CP0、CP2による2本制御点アフィンモデルをアフィンマージ候補とする(ステップS3413)。
ここで、アフィンモデルを構築可能であるか否かは、少なくとも、すべての制御点の参照画像が同一である(アフィン変換可能)ことを条件とする。 また、CP0,CP1,CP2による3本制御点アフィンモデル、CP0,CP1による2本制御点アフィンモデル以外のアフィンモデルは、3本制御点アフィンモデルについては、CP0,CP1,CP2による3本制御点アフィンモデルに、2本制御点アフィンモデルについては、CP0,CP1による2本制御点アフィンモデルに変換する。
<アフィン固定マージ候補導出>
アフィン固定マージ候補導出部385について説明する。アフィン固定マージ候補導出部485についてもアフィン固定マージ候補導出部385と同様である。
アフィン固定マージ候補は、固定された動き情報で制御点の動き情報を固定する。
具体的には、各制御点の動きベクトルを(0,0)に固定する。
<時間予測動きベクトル導出>
時間予測動きベクトルの説明に先行して、ピクチャの時間的な前後関係について図49を参照して説明する。図49(a)は、処理対象の符号化ブロックと、処理対象ピクチャとは時間的に異なる符号化済みのピクチャの関係を示す。処理対象ピクチャの符号化において参照する、特定の符号化済みのピクチャをColPicと定義する。ColPicはシンタックスにより特定される。
また、図49(b)は、ColPicにおいて、処理対象の符号化ブロックと同一位置、およびその近傍に存在する、符号化済みの符号化ブロックを示す。ただし、図49(b)に示したT0およびT1の符号化ブロックは模式的なものであり、実際の位置や大きさはこの限りでない。いま、処理対象の符号化ブロックについて、位置を(xCb, yCb)、幅をcbWidth、高さをcbHeightとする。そして、
xColBr = xCb + cbWidth
yColBr = yCb + cbHeight
を算出する。位置((xColBr >> 3) << 3, (yColBr >> 3) << 3)を含むColPic上の符号化ブロックがT0となる。また、
xColCtr = xCb + (cbWidth >> 1)
yColCtr = yCb + (cbHeight >> 1)
を算出する。位置((xColCtr >> 3) << 3, (yColCtr >> 3) << 3)を含むColPic上の符号化ブロックがT1となる。
上記したピクチャの時間的な前後関係の説明は、符号化時のものであるが、復号時も同様となる。つまり、復号時は、上記の説明における符号化を復号と置き換えて、同様に説明される。
図17の通常予測動きベクトルモード導出部301における時間予測動きベクトル候補導出部322の動作について、図50を参照して説明する。
まず、ColPicを導出する(ステップS4201)。ColPicの導出について、図51を参照して説明する。
スライスタイプslice_typeがBスライスで、フラグcollocated_from_l0_flagが0の場合(ステップS4211:YES、ステップS4212:YES)、異なる時間のピクチャColPicは、参照リストL1の参照インデックスが0のピクチャRefPicList1[0]となる(ステップS4213)。そうでない場合、すなわちスライスタイプslice_typeがBスライスで前述のフラグcollocated_from_l0_flagが1の場合(ステップS4211:YES、ステップS4212:NO)、またはスライスタイプslice_typeがPスライスの場合(ステップS4211:NO、ステップS4214:YES)、異なる時間のピクチャColPicは、参照リストL0の参照インデックスが0のピクチャRefPicList0[0]となる(ステップS4215)。slice_typeがPスライスでない場合(ステップS4214:NO)、処理を終了する。
再び、図50を参照する。ColPicを導出したら、符号化ブロックcolCbを導出し、符号化情報を取得する(ステップS4202)。この処理について、図52を参照して説明する。
まず、異なる時間のピクチャColPic内で、符号化対象の符号化ブロックと同一位置の右下位置を含む符号化ブロックを、異なる時間の符号化ブロックcolCbとする(ステップS4221)。この符号化ブロックの例を、図49の符号化ブロックT0に示す。
次に、異なる時間の符号化ブロックcolCbの符号化情報を取得する(ステップS4222)。異なる時間の符号化ブロックcolCbのPredModeが利用できないか、異なる時間の符号化ブロックcolCbの予測モードPredModeがイントラ予測(MODE_INTRA)である場合(ステップS4223:NO、ステップS4224:YES)、異なる時間のピクチャColPic内で処理対象の符号化ブロックと同一位置の中央右下位置を含む符号化ブロックを異なる時間の符号化ブロックcolCbとする(ステップS4225)。この符号化ブロックの例を、図49の符号化ブロックT1に示す。
再び、図50を参照する。次に、参照リストごとに、インター予測情報を導出する(ステップS4203、S4204)。ここでは、符号化ブロックcolCbについて、参照リストごとの動きベクトルmvLXColと符号化情報が有効か否かを示すフラグavailableFlagLXColを導出する。LXは参照リストを示し、参照リスト0の導出ではLXはL0となり、参照リスト1の導出ではLXはL1となる。インター予測情報の導出について、図53を参照して説明する。
異なる時間の符号化ブロックcolCbが利用できない場合(ステップS4231:NO)、または予測モードPredModeがイントラ予測(MODE_INTRA)の場合(ステップS4232:NO)、フラグavailableFlagLXColとフラグpredFlagLXColを共に0とし(ステップS4233)、動きベクトルmvLXColを(0,0)として(ステップS4234)、処理を終了する。
符号化ブロックcolCbが利用でき(ステップS4231:YES)、予測モードPredModeがイントラ予測(MODE_INTRA)でない場合(ステップS4232:YES)、以下の手順でmvCol、refIdxColおよびavailableFlagColを算出する。
符号化ブロックcolCbのL0予測が利用されているか否かを示すフラグPredFlagL0[xPCol][yPCol]が0の場合(ステップS4235:YES)、符号化ブロックcolCbの予測モードはPred_L1であるので、動きベクトルmvColが符号化ブロックcolCbのL1の動きベクトルであるMvL1[xPCol][yPCol]と同じ値に設定され(ステップS4236)、参照インデックスrefIdxColがL1の参照インデックスRefIdxL1[xPCol][yPCol]と同じ値に設定され(ステップS4237)、参照リストlistColがL1に設定される(ステップS4238)。ここで、xPCol、yPColは異なる時間のピクチャColPic内での符号化ブロックcolCbの左上の画素の位置を示すインデックスである。
一方、符号化ブロックcolCbのL0予測フラグPredFlagL0[xPCol][yPCol]が0でない場合(ステップS4235:NO)、符号化ブロックcolCbのL1予測フラグPredFlagL1[xPCol][yPCol]が0か否かを判定する。符号化ブロックcolCbのL1予測フラグPredFlagL1[xPCol][yPCol]が0の場合(ステップS4239:YES)、動きベクトルmvColが符号化ブロックcolCbのL0の動きベクトルであるMvL0[xPCol][yPCol]と同じ値に設定され(ステップS4240)、参照インデックスrefIdxColがL0の参照インデックスRefIdxL0[xPCol][yPCol] と同じ値に設定され(ステップS4241)、参照リストlistColがL0に設定される(ステップS4242)。
符号化ブロックcolCbのL0予測フラグPredFlagL0[xPCol][yPCol]と符号化ブロックcolCbのL1予測フラグPredFlagL1[xPCol][yPCol]が共に0でない場合(ステップS4235:NO、かつS4239:NO)、符号化ブロックcolCbのインター予測モードは双予測(Pred_BI)であるので、L0、L1の2つの動きベクトルから、一方を選択する(ステップS4243)。
図54は、符号化ブロックcolCbのインター予測モードが双予測(Pred_BI)のときの符号化ブロックのインター予測情報の導出処理手順を示すフローチャートである。
まず、すべての参照リストに登録されているすべてのピクチャのPOCが現在の処理対象ピクチャのPOCより小さいか否かを判定し(ステップS4251)、符号化ブロックcolCbのすべての参照リストであるL0及びL1に登録されているすべてのピクチャのPOCが現在の処理対象ピクチャのPOCより小さい場合で(ステップS4251:YES)、LXがL0、即ち処理対象の符号化ブロックのL0の動きベクトルの予測ベクトル候補を導出している場合(ステップS4252:YES)、符号化ブロックcolCbのL0の方のインター予測情報を選択し、LXがL1、即ち処理対象の符号化ブロックのL1の動きベクトルの予測ベクトル候補を導出している場合(ステップS4252:NO)、符号化ブロックcolCbのL1の方のインター予測情報を選択する。一方、符号化ブロックcolCbのすべての参照リストL0及びL1に登録されているピクチャのPOCの少なくとも1つが現在の処理対象ピクチャのPOCより大きい場合で(ステップS4251:NO)、フラグcollocated_from_l0_flagが0場合(ステップS4253:YES)、符号化ブロックcolCbのL0の方のインター予測情報を選択し、フラグcollocated_from_l0_flagが1の場合(ステップS4253:NO)、符号化ブロックcolCbのL1の方のインター予測情報を選択する。
符号化ブロックcolCbのL0の方のインター予測情報を選択する場合(ステップS4252:YES、またはステップS4253:YES)、動きベクトルmvColがMvL0[xPCol][yPCol]と同じ値に設定され(ステップS4254)、参照インデックスrefIdxColがRefIdxL0[xPCol][yPCol]と同じ値に設定され(ステップS4255)、リストlistColがL0に設定される(ステップS4256)。
符号化ブロックcolCbのL1の方のインター予測情報を選択する場合(ステップS4252:NO、またはステップS4253:NO)、動きベクトルmvColがMvL1[xPCol][yPCol]と同じ値に設定され(ステップS4257)、参照インデックスrefIdxColがRefIdxL1[xPCol][yPCol]と同じ値に設定され(ステップS4258)、リストlistColがL1に設定される(ステップS4259)。
図53に戻り、符号化ブロックcolCbからインター予測情報が取得できたら、フラグavailableFlagLXColとフラグpredFlagLXColを共に1とする(ステップS4244)。
続いて、動きベクトルmvColをスケーリングして、動きベクトルmvLXColとする(ステップS4245)。この動きベクトルmvLXColのスケーリング演算処理手順を図55を用いて説明する。
異なる時間のピクチャColPicのPOCから、符号化ブロックcolCbのリストlistColで参照する参照インデックスrefIdxColに対応する参照ピクチャのPOCを減算してピクチャ間距離tdを、
td = [異なる時間のピクチャColPicのPOC] − [符号化ブロックcolCbのリストlistColで参照する参照ピクチャのPOC]
と算出する(ステップS4261)。なお、異なる時間のピクチャColPicよりも符号化ブロックcolCbのリストlistColで参照する参照ピクチャのPOCの方が表示順序で前の場合、ピクチャ間距離tdは正の値となり、異なる時間のピクチャColPicよりも符号化ブロックcolCbのリストlistColで参照する参照ピクチャのPOCの方が表示順序で後の場合、ピクチャ間距離tdは負の値となる。
次に、現在の処理対象ピクチャのPOCから現在の処理対象ピクチャのリストLXが参照する参照ピクチャのPOCを減算してピクチャ間距離tbを、
tb = [現在の処理対象ピクチャのPOC] − [時間マージ候補のLXの参照インデックスに対応する参照ピクチャのPOC]
と算出する(ステップS4262)。なお、現在の処理対象ピクチャよりも現在の処理対象ピクチャのリストLXで参照する参照ピクチャの方が表示順序で前の場合、ピクチャ間距離tbは正の値となり、現在の処理対象ピクチャのリストLXで参照する参照ピクチャの方が表示順序で後の場合、ピクチャ間距離tbは負の値となる。
続いて、ピクチャ間距離tdとtbを比較し(ステップS4263)、ピクチャ間距離tdとtbが等しい場合(ステップS4263:YES)、動きベクトルmvLXColを、
mvLXCol = mvCol
と算出して(ステップS4264)、本スケーリング演算処理を終了する。
一方、ピクチャ間距離tdとtbが等しくない場合(ステップS4263:NO)、変数txを、
tx = ( 16384 + Abs( td ) >> 1 ) / td
と算出する(ステップS4265)。続いて、スケーリング係数distScaleFactorを、
distScaleFactor = Clip3( -4096, 4095, ( tb * tx + 32 ) >> 6 )
と算出する(ステップS4266)。ここで、Clip3(x,y,z)は値zについて、最小値をx、最大値をyに制限する関数である。続いて、動きベクトルmvLXColを、
mvLXCol = Clip3( -32768, 32767, Sign( distScaleFactor * mvLXCol )
* ( (Abs( distScaleFactor * mvLXCol ) + 127 ) >> 8 ) )
と算出して(ステップS4267)、本スケーリング演算処理を終了する。ここで、Sign(x)は値xの符号を返す関数であり、Abs(x)は値xの絶対値を返す関数である。
再び、図50を参照する。そして、L0の動きベクトルmvL0Colとを前述の通常予測動きベクトルモード導出部301における予測動きベクトル候補リストmvpListLXに候補として追加する(ステップS4205)。ただし、この追加は、参照リスト0の符号化ブロックcolCbが有効か否かを示すフラグavailableFlagL0Col=1の場合のみである。また、L1の動きベクトルmvL1Colを前述の通常予測動きベクトルモード導出部301における予測動きベクトル候補リストmvpListLXに候補として追加する(ステップS4205)。ただし、この追加は、参照リスト1の符号化ブロックcolCbが有効か否かを示すフラグavailableFlagL1Col=1の場合のみである。以上により、時間予測動きベクトル候補導出部322の処理を終了する。
上記した通常予測動きベクトルモード導出部301の説明は、符号化時のものであるが、復号時も同様となる。つまり、図23の通常予測動きベクトルモード導出部401における時間予測動きベクトル候補導出部422の動作は、上記の説明における符号化を復号と置き換えて、同様に説明される。
<時間マージ候補導出>
図18の通常マージモード導出部302における時間マージ候補導出部342の動作について、図56を参照して説明する。
まず、ColPicを導出する(ステップS4301)。次に、符号化ブロックcolCbを導出し、符号化情報を取得する(ステップS4302)。さらに、参照リストごとに、インター予測情報を導出する(ステップS4303,S4304)。以上の処理は、時間予測動きベクトル候補導出部322におけるS4201からS4204と同じであるため、説明を省略する。
次に、符号化ブロックcolCbが有効か否かを示すフラグavailableFlagColを算出する(ステップS4305)。フラグavailableFlagL0Col、またはフラグavailableFlagL1Colが1の場合に、availableFlagColは1となる。それ以外ではavailableFlagColは0となる。
そして、L0の動きベクトルmvL0Col、およびL1の動きベクトルmvL1Colを、前述の通常マージモード導出部302におけるマージ候補リストmergeCandListに候補として追加する(ステップS4306)。ただし、この追加は、符号化ブロックcolCbが有効か否かを示すフラグavailableFlagCol=1の場合のみである。以上により、時間マージ候補導出部342の処理を終了する。
上記した時間マージ候補導出部342の説明は、符号化時のものであるが、復号時も同様となる。つまり、図24の通常マージモード導出部402における時間マージ候補導出部442の動作は、上記の説明における符号化を復号と置き換えて、同様に説明される。
<履歴予測動きベクトル候補リストの更新>
次に、符号化側の符号化情報格納メモリ111及び復号側の符号化情報格納メモリ205に備える履歴予測動きベクトル候補リストHmvpCandListの初期化と更新方法について詳細に説明する。図38は履歴予測動きベクトル候補リスト初期化・更新処理手順を説明するフローチャートである。
本実施の形態では、履歴予測動きベクトル候補リストHmvpCandListの更新は、符号化情報格納メモリ111及び符号化情報格納メモリ205で実施されるものとする。インター予測部102及びインター予測部203の中に履歴候補リスト更新部を設置して履歴予測動きベクトル候補リストHmvpCandListの更新を実施させてもよい。
スライスの先頭で履歴予測動きベクトル候補リストHmvpCandListの初期設定を行い、符号化側では予測方法決定部105で通常予測ベクトルモードまたは通常マージモードが選択された場合に履歴予測動きベクトル候補リストHmvpCandListを更新し、復号側では、ビット列復号部201で復号されたインター予測情報が通常予測ベクトルモードまたは通常マージモードの場合に履歴予測動きベクトル候補リストHmvpCandListを更新する。
通常予測ベクトルモードまたは通常マージモードでインター予測を行う際に用いるインター予測情報を、インター予測情報候補hMvpCandとして履歴予測動きベクトル候補リストHmvpCandListに登録する。インター予測情報候補hMvpCandには、L0の参照インデックスrefIdxL0及びL1の参照インデックスrefIdxL1、L0予測が行われるか否かを示すL0予測フラグpredFlagL0およびL1予測が行われるか否かを示すL1予測フラグpredFlagL1、L0の動きベクトルmvL0、L1の動きベクトルmvL1が含まれる。符号化側の符号化情報格納メモリ111及び復号側の符号化情報格納メモリ205に備える履歴予測動きベクトル候補リストHmvpCandListに登録されている要素(すなわち、インター予測情報)の中に、インター予測情報候補hMvpCandと同じ値のインター予測情報が存在するかどうかを履歴予測動きベクトル候補リストHmvpCandListの先頭から後方に向かって順に確認する。インター予測情報候補hMvpCandと同じ値のインター予測情報が存在する場合は、履歴予測動きベクトル候補リストHmvpCandListからその要素を削除する。一方、インター予測情報候補hMvpCandと同じ値のインター予測情報が存在しない場合は、履歴予測動きベクトル候補リストHmvpCandListの先頭の要素を削除し、履歴予測動きベクトル候補リストHmvpCandListの最後に、インター予測情報候補hMvpCandを追加する。
本発明の符号化側の符号化情報格納メモリ111及び復号側の符号化情報格納メモリ205に備える最大の数である最大履歴予測動きベクトル候補リストのサイズ、すなわち履歴予測動きベクトル候補リストHmvpCandListの要素の最大数(最大候補数)MaxNumHmvpCandは6とする。なお、MaxNumHmvpCandは、最大マージ候補数MaxNumMergeCand - 1と同じ値としてもよいし、最大マージ候補数MaxNumMergeCandと同じ値としてもよいし、5、6等所定の固定値でもよい。
まず、スライス単位での履歴予測動きベクトル候補リストHmvpCandListの初期化を行う(図38のステップS2101)。スライスの先頭で履歴予測動きベクトル候補リストHmvpCandListのすべての要素を空にし、履歴予測動きベクトル候補リストHmvpCandListに登録されている履歴予測動きベクトル候補の数(現在の候補数)NumHmvpCandの値は0に設定する。
さらに、オフセット値hMvpIdxOffsetに所定の値を設定する。オフセット値hMvpIdxOffsetに設定する値は0から(履歴予測動きベクトル候補リストのサイズMaxNumHmvpCand −1)までのいずれかの所定値を設定する。オフセット値hMvpIdxOffsetは所定の値とするが、オフセット値hMvpIdxOffsetの値をシーケンス単位で符号化/復号することにより設定してもよいし、スライス単位で符号化/復号することにより設定してもよい。オフセット値hMvpIdxOffsetについては詳細に後述する。
なお、履歴予測動きベクトル候補リストHmvpCandListの初期化をスライス単位(スライスの最初の符号化ブロック)で実施するとしたが、ピクチャ単位、タイル単位やツリーブロック行単位で実施しても良い。
続いて、スライス内の符号化ブロック毎に以下の履歴予測動きベクトル候補リストHmvpCandListの更新処理を繰り返し行なう(図38のステップS2102〜S2107)。
まず、符号化ブロック単位での初期設定を行う。同一候補が存在するか否かを示すフラグidenticalCandExistにFALSE(偽)の値を設定し、削除対象の候補を示す削除対象インデックスremoveIdxに0を設定する(図38のステップS2103)。
履歴予測動きベクトル候補リストHmvpCandListに登録対象のインター予測情報候補hMvpCandと同じ値のインター予測情報が存在するか否かを判定する(図38のステップS2104)。符号化側の予測方法決定部105で通常予測動きベクトルモードまたは通常マージモードと判定された場合、または復号側のビット列復号部201で通常予測動きベクトルモードまたは通常マージモードとして復号された場合、そのインター予測情報を登録対象のインター予測情報候補hMvpCandとする。符号化側の予測方法決定部105でイントラ予測モード、サブブロック予測動きベクトルモードまたはサブブロックマージモードと判定された場合、または復号側のビット列復号部201でイントラ予測モード、サブブロック予測動きベクトルモードまたはサブブロックマージモードとして復号された場合、履歴予測動きベクトル候補リストHmvpCandListの更新処理を行わず、登録対象のインター予測情報候補hMvpCandは存在しない。登録対象のインター予測情報候補hMvpCandが存在しない場合はステップS2105〜S2106をスキップする(図38のステップS2104:NO)。登録対象のインター予測情報候補hMvpCandが存在する場合はステップS2105以下の処理を行う(図38のステップS2104:YES)。
続いて、履歴予測動きベクトル候補リストHmvpCandListの各要素の中に登録対象のインター予測情報候補hMvpCandと同じ値のインター予測情報、すなわち同一の要素が存在するか否かを判定する(図38のステップS2105)。図39はこの同一要素確認処理手順のフローチャートである。履歴予測動きベクトル候補の数NumHmvpCandの値が0の場合(図39のステップS2121:NO)、履歴予測動きベクトル候補リストHmvpCandListは空で、同一候補は存在しないので図39ステップS2122〜S2125をスキップし、本同一要素確認処理手順を終了する。履歴予測動きベクトル候補の数NumHmvpCandの値が0より大きい場合(図39のステップS2121:YES)、登録対象のインター予測情報候補hMvpCandと同じ値のインター予測情報が存在するかどうかを履歴予測動きベクトル候補リストHmvpCandListの先頭から後方に向かって順に確認する。履歴予測動きベクトルインデックスhMvpIdxが0からNumHmvpCand-1まで、ステップS2123の処理を繰り返す(図39のステップS2122〜S2125)。まず、履歴予測動きベクトル候補リストの0から数えてhMvpIdx番目の要素HmvpCandList[hMvpIdx]がインター予測情報候補hMvpCandと同一か否かを比較する(図39のステップS2123)。同一の場合(図39のステップS2123:YES)、同一候補が存在するか否かを示すフラグidenticalCandExistにTRUE(真)の値を設定し、削除対象の要素の位置を示す削除対象インデックスremoveIdxに現在の履歴予測動きベクトルインデックスhMVpIndexの値を設定し、本同一要素確認処理を終了する。同一でない場合(図39のステップS2123:NO)、同一候補が存在するか否かを示すフラグidenticalCandExistはFALSE(偽)のままであり、hMvpIdxを1インクリメントし、履歴予測動きベクトルインデックスhMvpIdxがNumHmvpCand-1以下であれば、ステップS2123以降の処理を行う(図39のステップS2122〜S2125)。
再び図38のフローチャートに戻り、履歴予測動きベクトル候補リストHmvpCandListの要素のシフト及び追加処理を行う(図38のステップS2106)。図40は図38のステップS2106の履歴予測動きベクトル候補リストHmvpCandListの要素シフト/追加処理手順のフローチャートである。まず、履歴予測動きベクトル候補リストHmvpCandListに格納されている要素を除いてから新たな要素を追加するか、要素を除かずに新たな要素を追加するかを判定する。具体的には、同一候補が存在するか否かを示すフラグidenticalCandExistがTRUE(真)または現在の候補数NumHmvpCandが最大候補数MaxNumHmvpCandに達しているか否かを比較する(図40のステップS2141)。現在の候補数NumHmvpCandが最大候補数MaxNumHmvpCandと同じ値である場合、履歴予測動きベクトル候補リストHmvpCandListに要素が最大数追加されていることを示す。同一候補が存在するか否かを示すフラグidenticalCandExistがTRUE(真)またはNumHmvpCandが MaxNumHmvpCandと同じ値のいずれかの条件を満たす場合(図40のステップS2141:YES)、履歴予測動きベクトル候補リストHmvpCandListに格納されている要素を削除してから新たな要素を追加する。具体的には、同一候補が存在するか否かを示すフラグidenticalCandExistがTRUE(真)の場合は、履歴予測動きベクトル候補リストHmvpCandListから同一候補を削除する。NumHmvpCandがMaxNumHmvpCandと同じ値である場合、履歴予測動きベクトル候補リストHmvpCandListから先頭の候補(要素)を削除する。インデックスiの初期値をremoveIdx+1の値に設定する。removeIdxは削除対象の候補を示す削除対象インデックスである。このインデックスiが初期値のremoveIdx+1からNumHmvpCand-1まで、ステップS2143の要素シフト処理を繰り返す。(図40のステップS2142〜S2144)。HMVPCandList[ i - 1 ]にHMVPCandList[ i ]の要素をコピーすることで要素を前方にシフトし(図40のステップS2143)、iを1インクリメントする(図40のステップS2142〜S2144)。インデックスiがNumHmvpCand-1となり、ステップS2143の要素シフト処理が完了したら、履歴予測動きベクトル候補リストの最後にインター予測情報候補hMvpCandを追加する(図40のステップS2145)。ここで、履歴予測動きベクトル候補リストの最後とは、0から数えて(NumHmvpCand-1)番目のHMVPCandList[NumHmvpCand-1]である。以上で、本履歴予測動きベクトル候補リストHMVPCandListの要素シフト・追加処理を終了する。一方、同一候補が存在するか否かを示すフラグidenticalCandExistがTRUE(真)およびNumHmvpCandがMaxNumHmvpCandと同じ値のいずれの条件も満たさない場合(図40のステップS2141:NO)、すなわち同一候補が存在するか否かを示すフラグidenticalCandExistがFALSE(偽)およびNumHmvpCandがMaxNumHmvpCandより小さい場合、履歴予測動きベクトル候補リストHmvpCandListに格納されている要素を除かずに、履歴予測動きベクトル候補リストの最後の要素の次の位置にインター予測情報候補hMvpCandを追加する(図40のステップS2146)。ここで、履歴予測動きベクトル候補リストの最後の要素の次の位置とは、0から数えてNumHmvpCand番目のHMVPCandList[NumHmvpCand]である。履歴予測動きベクトル候補リストに要素が追加されていない場合は0番目の位置となる。また、NumHmvpCandを1インクリメントして、本履歴予測動きベクトル候補リストHMVPCandListの要素シフト/追加処理を終了する。
図43は履歴予測動きベクトルリストの更新処理の一例を説明する図である。履歴予測動きベクトル候補リストHMVPCandListに6つの要素(インター予測情報)が登録されている際に、新たなインター予測情報を追加する場合、履歴予測動きベクトル候補リストHMVPCandListの各要素と前方から新たなインター予測情報を比較して(図43(a))、新たなインター予測情報が履歴予測動きベクトル候補リストHMVPCandListの先頭から3番目の要素HMVP2と同じ値であれば、履歴予測動きベクトル候補リストHMVPCandListから要素HMVP2を削除して後方の要素HMVP3〜HMVP5を前方に1つずつシフト(コピー)し、履歴予測動きベクトル候補リストHMVPCandListの最後に新たなインター予測情報を追加して(図43(b))、履歴予測動きベクトル候補リストHMVPCandListの更新を完了する(図43(c))。
<履歴予測動きベクトル候補導出処理>
次に、符号化側の通常予測動きベクトルモード導出部301の履歴予測動きベクトル候補導出部323、復号側の通常予測動きベクトルモード導出部401の履歴予測動きベクトル候補導出部423で共通の処理である図20のステップS304の処理手順である履歴予測動きベクトル候補リストHMVPCandListからの履歴予測動きベクトル候補の導出方法について詳細に説明する。図41は履歴予測動きベクトル候補導出処理手順を説明するフローチャートである。
現在の予測動きベクトル候補の数numCurrMvpCandが予測動きベクトル候補リストmvpListLXの最大要素数(ここでは2とする)以上または履歴予測動きベクトル候補の数(履歴予測動きベクトルリストに登録されている要素の数)NumHmvpCandの値が0の場合(図41のステップS2201:NO)、図41のステップS2202からS2210の処理を省略し、履歴予測動きベクトル候補導出処理手順を終了する。現在の予測動きベクトル候補の数numCurrMvpCandが予測動きベクトル候補リストmvpListLXの最大要素数である2より小さい場合、かつ履歴予測動きベクトル候補の数NumHmvpCandの値が0より大きい場合(図41のステップS2201:YES)、図41のステップS2202からS2210の処理を行う。
続いて、インデックスiが1から、所定の上限値である4と履歴予測動きベクトル候補の数NumHmvpCandのいずれか小さい値まで、図41のステップS2203からS2209の処理を繰り返す(図41のステップS2202〜S2210)。現在の予測動きベクトル候補の数numCurrMvpCandが予測動きベクトル候補リストmvpListLXの最大要素数である2以上の場合(図41のステップS2203:NO)、図41のステップS2204からS2210の処理を省略し、本履歴予測動きベクトル候補導出処理手順を終了する。現在の予測動きベクトル候補の数numCurrMvpCandが予測動きベクトル候補リストmvpListLXの最大要素数である2より小さい場合(図41のステップS2203:YES)、図41のステップS2204以降の処理を行う。
続いて、ステップS2205からS2208までの処理を履歴予測動きベクトル候補リストHmvpCandListの各要素の参照リストLYがL0とL1)についてそれぞれ行う(図41のステップS2204〜S2209)。履歴予測動きベクトル候補リストHmvpCandListのL0とL1についてそれぞれ図41のステップS2205〜S2208の処理を行うことを示す。現在の予測動きベクトル候補の数numCurrMvpCandが予測動きベクトル候補リストmvpListLXの最大要素数である2以上の場合(図41のステップS2205:NO)、図41のステップS2207からS2210の処理を省略し、本履歴予測動きベクトル候補導出処理手順を終了する。現在の予測動きベクトル候補の数numCurrMvpCandが予測動きベクトル候補リストmvpListLXの最大要素数である2より小さい場合(図41のステップS2205:YES)、図41のステップS2206以降の処理を行う。
続いて、履歴予測動きベクトル候補リストの要素の動きベクトルを予測動きベクトル候補として、予測動きベクトル候補リストに追加する。この時、履歴予測動きベクトル候補リストの後ろからオフセット値hMvpIdxOffsetで指定した個数の要素について、予測動きベクトル候補リストに含まれていない要素かどうかを降順に確認して、予測動きベクトル候補リストに含まれていない要素を予測動きベクトル候補リストに追加していき、その後は降順に予測動きベクトル候補リストに含まれていない要素かどうかを確認せずに履歴予測動きベクトル候補リストの要素を予測動きベクトル候補リストに追加していく。履歴予測動きベクトル候補リストの確認の際に、履歴予測動きベクトル候補リストの後ろからオフセット値hMvpIdxOffsetで指定した個数の要素だけを比較する理由について、図65を用いて説明する。図65はブロックを4分割した場合の3つの例と履歴予測動きベクトル候補リストとの関係を示す。各符号化ブロックが通常予測動きベクトルモード、または通常マージモードで符号化された場合について説明する。図65(a)は符号化/復号対象の符号化ブロックが右上のブロック場合の図である。この場合、符号化/復号対象の符号化ブロックの左側のブロックのインター予測情報が履歴予測動きベクトル候補リストの最後の要素HMVP5となる可能性が高い。図65(b)は符号化/復号対象の符号化ブロックが左下のブロックの場合の図である。この場合、符号化/復号対象の符号化ブロックの右上のブロックのインター予測情報が履歴予測動きベクトル候補リストの最後の要素HMVP5となる可能性が高く、符号化/復号対象の符号化ブロックの上のブロックのインター予測情報が履歴予測動きベクトル候補リストの最後から2番目の要素HMVP4となる可能性が高い。図65(c)は符号化/復号対象の符号化ブロックが右下のブロックの場合の図である。この場合、符号化/復号対象の符号化ブロックの左のブロックのインター予測情報が履歴予測動きベクトル候補リストの最後の要素HMVP5となる可能性が高く、符号化/復号対象の符号化ブロックの上のブロックのインター予測情報が履歴予測動きベクトル候補リストの最後から2番目の要素HMVP4となる可能性が高く、符号化/復号対象の符号化ブロックの左上のブロックのインター予測情報が履歴予測動きベクトル候補リストの最後から3番目の要素HMVP3となる可能性が高い。すなわち、履歴予測動きベクトル候補リストの最後の要素は空間予測動きベクトル候補として導出される可能性が最も高い。図65(d)に示すように空間予測動きベクトル候補として導出される可能性が最も高い履歴予測動きベクトル候補リストの最後の要素HMVP5のみを比較するために、オフセット値hMvpIdxOffsetを1に設定する。さらに、空間予測動きベクトル候補として導出される可能性が2番目に高い履歴予測動きベクトル候補リストの最後から2番目の要素も比較するために、オフセット値hMvpIdxOffsetを2に設定することもできる。さらに、空間予測動きベクトル候補として導出される可能性が3番目に高い履歴予測動きベクトル候補リストの最後から3番目の要素も比較するために、オフセット値hMvpIdxOffsetを3に設定することもできる。このようにオフセット値hMvpIdxOffsetに1以上の値を設定することで、履歴予測動きベクトル候補リストの要素を比較する最大回数が削減するために、最大処理量が削減する。なお、オフセット値hMvpIdxOffsetに0を設定することで、履歴予測動きベクトル候補リストの要素の比較回数が0となり、比較処理が省略される。インデックスiがオフセット値hMvpIdxOffsetより小さくない場合、すなわち予測動きベクトル候補リストに含まれていない要素かどうかを確認する場合(図41のステップS2206:YES)、履歴予測動きベクトル候補リストHmvpCandList[NumHmvpCand - i]のLYの参照インデックスが、符号化/復号対象動きベクトルの参照インデックスrefIdxLXと同じ値であり、履歴予測動きベクトル候補リストの要素HmvpCandList[NumHmvpCand - i]のLYが、予測動きベクトル候補リストmvpListLXのどの要素とも異なる要素の場合(図41のステップS2207:YES)、予測動きベクトル候補リストの最後の要素として、予測動きベクトル候補リストの0から数えてnumCurrMvpCand番目の要素mvpListLX[numCurrMvpCand]に履歴予測動きベクトル候補HmvpCandList[NumHmvpCand - i]のLYの動きベクトルを予測動きベクトル候補リストmvpListLXに追加し(図41のステップS2208)、現在の予測動きベクトル候補の数numCurrMvpCandを1インクリメントする。履歴予測動きベクトル候補リストHmvpCandListの中に、符号化/復号対象動きベクトルの参照インデックスrefIdxLXと同じ参照インデックスの要素であり、予測動きベクトルリストmvpListLXのどの要素とも異なる要素がない場合(図41のステップS2206:NO)、ステップS2208の追加処理をスキップする。
一方、インデックスiがオフセット値hMvpIdxOffsetより小さくない場合、すなわち予測動きベクトル候補リストに含まれていない要素かどうかを確認しない場合(図41のステップS2206のNO)、予測動きベクトル候補リストの最後の要素として、予測動きベクトル候補リストの0から数えてnumCurrMvpCand番目の要素mvpListLX[numCurrMvpCand]に履歴予測動きベクトル候補HmvpCandList[NumHmvpCand - i]のLYの動きベクトルを追加し(図41のステップS2208)、現在の予測動きベクトル候補の数numCurrMvpCandを1インクリメントする。
以上の図41のステップS2205からS2208の処理をL0とL1で双方ともに行う(図41のステップS2204〜S2209)。
インデックスiを1インクリメントし(図41のステップS2202、S2210)、インデックスiが所定の上限値である4と履歴予測動きベクトル候補の数NumHmvpCandのいずれか小さい値以下の場合、再びステップS2203以降の処理を行う(図41のステップS2202〜S2210)。
<履歴マージ候補導出処理>
次に、符号化側の通常マージモード導出部302の履歴マージ候補導出部345、復号側の通常マージモード導出部402の履歴マージ候補導出部445で共通の処理である図21のステップS404の処理手順である履歴マージ候補リストHmvpCandListからの履歴マージ候補の導出方法について詳細に説明する。図42は履歴マージ候補導出処理手順を説明するフローチャートである。
まず、初期化処理を行う(図42のステップS2301)。フラグisPruned[i]の0から(numCurrMergeCand -1)番目のそれぞれの要素にFALSEの値を設定し、変数numOrigMergeCandに現在のマージ候補リストに登録されている要素の数numCurrMergeCandを設定する。
続いて、履歴予測動きベクトルリストの要素の中でマージ候補リストに含まれていない要素をマージ候補リストに追加する。この時、履歴予測動きベクトルリストの後ろから降順に確認し、追加していく。インデックスhMvpIdxの初期値を1に設定し、この初期値からNumHmvpCandまで、図42のステップS2303からステップS2311までの追加処理を繰り返す(図42のステップS2302〜S2312)。現在のマージ候補リストに登録されている要素の数numCurrMergeCandが(最大マージ候補数MaxNumMergeCand-1)以下でなければ、すなわち現在のマージ候補リストに登録されている要素の数numCurrMergeCandが最大マージ候補数MaxNumMergeCandに達していれば、マージ候補リストのすべての要素にマージ候補が追加されたので、本履歴マージ候補導出処理を終了する(図42のステップS2303:NO)。現在のマージ候補リストに登録されている要素の数numCurrMergeCandが(最大マージ候補数MaxNumMergeCand-1)以下の場合(図42のステップS2303:YES)、ステップS2304以降の処理を行う。
同じ動き情報を示す変数sameMotionにFALSE(偽)の値を設定する(図42のステップS2304)。続いて、履歴予測動きベクトル候補リストの要素であるインター予測情報をマージ候補として、マージ候補リストに追加する。この時、履歴予測動きベクトル候補リストの後ろの要素(最近追加された要素)からオフセット値hMvpIdxOffsetで指定した個数の要素について、マージ候補リストに含まれていない要素かどうかを降順に確認して、マージ候補リストに含まれていない要素をマージ候補リストに追加していき、その後は降順にマージ候補リストに含まれていない要素かどうかを確認せずに履歴予測動きベクトル候補リストの要素をマージ候補リストに追加していく。履歴予測動きベクトル候補リストの確認の際に、履歴予測動きベクトル候補リストの後ろの要素(最近追加された要素)からオフセット値hMvpIdxOffsetで指定した個数の要素だけを比較する理由について、図65を用いて説明する。図65はブロックを4分割した場合の3つの例と履歴予測動きベクトル候補リストとの関係を示す。各符号化ブロックが通常予測動きベクトルモード、または通常マージモードで符号化された場合について説明する。図65(a)は符号化/復号対象の符号化ブロックが右上のブロック場合の図である。この場合、符号化/復号対象の符号化ブロックの左側のブロックのインター予測情報が履歴予測動きベクトル候補リストの最後の要素HMVP5となる可能性が高い。図65(b)は符号化/復号対象の符号化ブロックが左下のブロックの場合の図である。この場合、符号化/復号対象の符号化ブロックの右上のブロックのインター予測情報が履歴予測動きベクトル候補リストの最後の要素HMVP5となる可能性が高く、符号化/復号対象の符号化ブロックの上のブロックのインター予測情報が履歴予測動きベクトル候補リストの最後から2番目の要素HMVP4となる可能性が高い。図65(c)は符号化/復号対象の符号化ブロックが右下のブロックの場合の図である。この場合、符号化/復号対象の符号化ブロックの左のブロックのインター予測情報が履歴予測動きベクトル候補リストの最後の要素HMVP5となる可能性が高く、符号化/復号対象の符号化ブロックの上のブロックのインター予測情報が履歴予測動きベクトル候補リストの最後から2番目の要素HMVP4となる可能性が高く、符号化/復号対象の符号化ブロックの左上のブロックのインター予測情報が履歴予測動きベクトル候補リストの最後から3番目の要素HMVP3となる可能性が高い。すなわち、履歴予測動きベクトル候補リストの最後の要素は空間マージ候補として導出される可能性が最も高い。図65(d)に示すように空間マージ候補として導出される可能性が最も高い履歴予測動きベクトル候補リストの最後の要素HMVP5のみを比較するために、オフセット値hMvpIdxOffsetを1に設定する。さらに、空間マージ候補として導出される可能性が2番目に高い履歴予測動きベクトル候補リストの最後から2番目の要素も比較するために、オフセット値hMvpIdxOffsetを2に設定することもできる。さらに、空間マージ候補として導出される可能性が3番目に高い履歴予測動きベクトル候補リストの最後から3番目の要素も比較するために、オフセット値hMvpIdxOffsetを3に設定することもできる。このようにオフセット値hMvpIdxOffsetに1から3の値を所定値として設定し、履歴予測動きベクトル候補リストの後ろの要素(最近追加された要素)からオフセット値hMvpIdxOffsetで指定した個数の要素と空間マージ候補、またはマージ候補リストに格納されている要素のみを比較対象とすることで、履歴予測動きベクトル候補リストの要素を比較する最大回数が削減するために、最大処理量が削減する。
インデックスhMvpIdxが所定のオフセット値hMvpIdxOffset以下の場合、すなわちマージ候補リストに含まれていない要素かどうかを確認する場合(図42のステップS2305のYES)、インデックスiの初期値を0に設定し、この初期値からnumOrigMergeCand-1まで図42のステップS2307、S2308の処理を行う(図42のS2306〜S2309)。履歴予測動きベクトル候補リストの0から数えて(NumHmvpCand-hMvpIdx)番目の要素HmvpCandList[NumHmvpCand-hMvpIdx]がマージ候補リストの0から数えてi番目の要素mergeCandList[i]と同じ値かどうかを比較する(図42のステップS2307)。マージ候補の同じ値とは、マージ候補が持つすべてのインター予測情報の構成要素(インター予測モード、L0及びL1の参照インデックス、L0及びL1の動きベクトル)の値が同じであることを示す。したがって、このステップS2307の比較処理では、isPruned[i]がFALSE(偽)の際に、mergeCandList[i]とHmvpCandList[NumHmvpCand-hMvpIdx]が持つすべての構成要素(インター予測モード、L0及びL1の参照インデックス、L0及びL1の動きベクトル)の値が同じ値かどうかを比較する。同じ値の場合(図39のステップS2307:YES)、sameMotionおよびisPruned[i]共にTRUE(真)を設定する(図42のステップS2308)。なお、フラグisPruned[i]はマージ候補リストの0から数えてi番目の要素が履歴予測動きベクトル候補リストのいずれかの要素と同じ値であることを示すフラグである。同じ値でない場合(図39のステップS2307:NO)、ステップS2308の処理をスキップする。図42のステップS2306からステップS2309までの繰り返し処理が完了したらsameMotionがFALSE(偽)かどうかを比較し(図42のステップS2310)、sameMotionが FALSE(偽)の場合(図42のステップS2310:YES)、すなわち履歴予測動きベクトル候補リストの0から数えて(NumHmvpCand - hMvpIdx)番目の要素HmvpCandList[NumHmvpCand - hMvpIdx]はmergeCandListに存在しないので、マージ候補リストの最後の要素として、マージ候補リストのnumCurrMergeCand番目のmergeCandList[numCurrMergeCand]に履歴予測動きベクトル候補リストの0から数えて(NumHmvpCand - hMvpIdx)番目の要素HmvpCandList[NumHmvpCand - hMvpIdx]を追加し、numCurrMergeCandを1インクリメントする(図42のステップS2311)。一方、インデックスhMvpIdxがオフセット値hMvpIdxOffsetより小さくない場合、すなわちマージ候補リストに含まれていない要素かどうかを確認しない場合(図42のステップS2305のNO)、マージ候補リストの最後の要素として、マージ候補リストのnumCurrMergeCand番目のmergeCandList[numCurrMergeCand]に履歴予測動きベクトル候補リストの0から数えて(NumHmvpCand - hMvpIdx)番目の要素HmvpCandList[NumHmvpCand - hMvpIdx]を追加し、numCurrMergeCandを1インクリメントする(図42のステップS2312)。
さらに、インデックスhMvpIdxを1インクリメントし(図42のステップS2302)、図42のステップS2302〜S2312の繰り返し処理を行う。
履歴予測動きベクトル候補リストのすべての要素の確認が完了するか、マージ候補リストのすべての要素にマージ候補が追加されたら、本履歴マージ候補の導出処理を完了する。
<平均マージ候補導出処理>
次に、符号化側の通常マージモード導出部302の平均マージ候補導出部344、復号側の通常マージモード導出部402の平均マージ候補導出部444で共通の処理である図21のステップS403の処理手順である平均マージ候補の導出方法について詳細に説明する。図62は平均マージ候補導出処理手順を説明するフローチャートである。
まず、初期化処理を行う(図62のステップS1301)。変数numOrigMergeCandに現在のマージ候補リストに登録されている要素の数numCurrMergeCandを設定する。
続いて、マージ候補リストの先頭から順に走査し、2つの動き情報を決定する。1つ目の動き情報を示すインデックスi=0、2つ目の動き情報を示すインデックスj=1とする。(図62のステップS1302〜S1303)。現在のマージ候補リストに登録されている要素の数numCurrMergeCandが(最大マージ候補数MaxNumMergeCand-1)以下でなければ、マージ候補リストのすべての要素にマージ候補が追加されたので、本履歴マージ候補導出処理を終了する(図62のステップS1304)。現在のマージ候補リストに登録されている要素の数numCurrMergeCandが(最大マージ候補数MaxNumMergeCand-1)以下の場合は、ステップS1305以降の処理を行う。
マージ候補リストのi番目の動き情報mergeCandList[i]とマージ候補リストのj番目の動き情報mergeCandList[j]がともに無効であるか否かを判定し(図62のステップS1305)、ともに無効である場合は、mergeCandList[i]とmergeCandList[j]の平均マージ候補の導出を行わず、次の要素に移る。mergeCandList[i]とmergeCandList[j]がともに無効でない場合は、Xを0と1として以下の処理を繰り返す(図62のステップS1306からS1314)。
mergeCandList[i]のLX予測が有効であるかを判定する(図62のステップS1307)。mergeCandList[i]のLX予測が有効である場合は、mergeCandList[j]のLX予測が有効であるかを判定する(図62のステップS1308)。mergeCandList[j]のLX予測が有効である場合、すなわち、mergeCandList[i]のLX予測とmergeCandList[j]のLX予測がともに有効である場合は、mergeCandList[i]のLX予測の動きベクトルとmergeCandList[j]のLX予測の動きベクトルを平均したLX予測の動きベクトルとmergeCandList[i]のLX予測の参照インデックスを有するLX予測の平均マージ候補を導出してaverageCandのLX予測に設定し、averageCandのLX予測を有効とする(図62のステップS1309)。図62のステップS1308で、mergeCandList[j]のLX予測が有効でない場合、すなわち、mergeCandList[i]のLX予測が有効、かつmergeCandList[j]のLX予測が無効である場合は、mergeCandList[i]のLX予測の動きベクトルと参照インデックスを有するLX予測の平均マージ候補を導出してaverageCandのLX予測に設定し、averageCandのLX予測を有効とする(図62のステップS1310)。図62のステップS1307で、mergeCandList[i]のLX予測が有効でない場合、mergeCandList[j]のLX予測が有効であるか否かを判定する(図62のステップS1311)。mergeCandList[j]のLX予測が有効である場合、すなわちmergeCandList[i]のLX予測が無効、かつmergeCandList[j] のLX予測が有効である場合は、mergeCandList[j]のLX予測の動きベクトルと参照インデックスを有するLX予測の平均マージ候補を導出してaverageCandのLX予測に設定し、averageCandのLX予測を有効とする(図62のステップS1312)。図62のステップS1311で、mergeCandList[j]のLX予測が有効でない場合、すなわちmergeCandList[i]のLX予測、mergeCandList[j]のLX予測がともに無効である場合は、averageCandのLX予測を無効とする(図62のステップS1312)。
以上のように生成されたL0予測、L1予測またはBI予測の平均マージ候補averageCandを、マージ候補リストのnumCurrMergeCand番目のmergeCandList[numCurrMergeCand]に追加し、numCurrMergeCandを1インクリメントする(図62のステップS1315)。以上で、平均マージ候補の導出処理を完了する。
なお、平均マージ候補は動きベクトルの水平成分と動きベクトルの垂直成分それぞれで平均される。
<サブブロック時間マージ候補導出>
図16のサブブロックマージモード導出部304におけるサブブロック時間マージ候補導出部381の動作について、図44を参照して説明する。
まず、符号化ブロックが8x8画素未満か否かを判定する(ステップS4002)。
符号化ブロックが8x8画素未満の場合(ステップS4002:YES)、サブブロック時間マージ候補の存在を示すフラグavailableFlagSbCol=0に設定して(ステップS4003)、サブブロック時間マージ候補導出部の処理を終了する。ここで、シンタックスによりテンポラル動きベクトル予測が禁止されている場合、またはサブブロック時間マージが禁止されている場合には、符号化ブロックが8x8画素未満の場合(ステップS4002:YES)と同じ処理をする。
一方、符号化ブロックが8x8画素以上の場合(ステップS4002:NO)、符号化ピクチャにおける符号化ブロックの隣接動き情報を導出する(ステップS4004)。
符号化ブロックの隣接動き情報を導出する処理について、図45を参照して説明する。隣接動き情報を導出する処理は、前述の空間予測動きベクトル候補導出部321の処理と相似している。ただし、隣接ブロックの探索をする順番はA0,B0,B1,A1であり、B2は探索しない。まず、隣接ブロックn=A0として、符号化情報を取得する(ステップS4052)。符号化情報とは、隣接ブロックを利用できるか否かを示すフラグavailableFlagN、参照リストごとの参照インデックスrefIdxLXN、および動きベクトルmvLXNを示す。
次に、隣接ブロックnが有効か無効かを判断する(ステップS4054)。隣接ブロックを利用できるか否かを示すフラグavailableFlagN=1であれば有効、それ以外は無効とする。
隣接ブロックnが有効であれば(ステップS4054:YES)、参照インデックスrefIdxLXNを、隣接ブロックnの参照インデックスrefIdxLXnとする(ステップS4056)。また、動きベクトルmvLXNを、隣接ブロックnの動きベクトルmvLXnとして(ステップS4056)、ブロックの隣接動き情報を導出する処理を終了する。
一方、隣接ブロックnが無効であれば(ステップS4054:NO)、隣接ブロックn=B0として、符号化情報を取得し(ステップS4052)、隣接ブロックnが有効か無効かを判断する(ステップS4054)。以下、同様の処理をして、B1,A1の順番にループする。隣接動き情報を導出する処理は、隣接ブロックが有効となるまでループし、全ての隣接ブロックA0,B0,B1,A1が無効であれば、ブロックの隣接動き情報を導出する処理を終了する。
再び、図44を参照する。隣接動き情報を導出したら(ステップS4004)、テンポラル動きベクトルを導出する(ステップS4006)。
テンポラル動きベクトルを導出する処理について、図46を参照して説明する。まず、テンポラル動きベクトルtempMv=(0,0)として初期化する(ステップS4062)。
次に、隣接動き情報が有効か無効かを判断する(ステップS4064)。隣接ブロックを利用できるか否かを示すフラグavailableFlagN=1であれば有効、それ以外は無効とする。隣接動き情報が無効の場合(ステップS4064:NO)、テンポラル動きベクトルを導出する処理を終了する。
一方、隣接動き情報が有効の場合(ステップS4064:YES)、隣接ブロックNにおいてL1予測を利用しているか否かを示すフラグpredFlagL1Nが1か否かを判断する(ステップS4066)。predFlagL1N=0の場合(ステップS4066:NO)、次の処理(ステップS4078)に進む。predFlagL1N=1の場合(ステップS4066:YES)、すべての参照リストに登録されているすべてのピクチャのPOCが、現在の処理対象ピクチャのPOC以下か否かを判断する(ステップS4068)。この判断が真の場合(ステップS4068:YES)、次の処理(ステップS4070)に進む。
スライスタイプslice_typeがBスライスで、フラグcollocated_from_l0_flagが0の場合(ステップS4070:YES、ステップかつS4072:YES)、ColPicと参照ピクチャRefPicList1[refIdxL1N](参照リストL1の参照インデックスrefIdxL1Nのピクチャ)が同じか否かを判断する(ステップS4074)。この判断が真の場合(ステップS4074:YES)、テンポラル動きベクトルtempMv=mvL1Nとする(ステップS4076)。この判断が偽の場合(ステップS4074:NO)、次の処理(ステップS4078)に進む。スライスタイプslice_typeがBスライスでなく、フラグcollocated_from_l0_flagが0でない場合(ステップS4070:NO、またはステップS4072:NO)、次の処理(ステップS4078)に進む。
そして、隣接ブロックNにおいてL0予測を利用しているか否かを示すフラグpredFlagL0Nが1か否かを判断する(ステップS4078)。predFlagL0N=1の場合(ステップS4078:YES)、ColPicと参照ピクチャRefPicList0[refIdxL0N](参照リストL0の参照インデックスrefIdxL0Nのピクチャ)が同じか否かを判断する(ステップS4080)。この判断が真の場合(ステップS4080:YES)、テンポラル動きベクトルtempMv=mvL0Nとする(ステップS4082)。この判断が偽の場合(ステップS4080:NO)、テンポラル動きベクトルを導出する処理を終了する。
再び、図44を参照する。次に、ColPicを導出する(ステップS4016)。この処理は、時間予測動きベクトル候補導出部322におけるS4201と同じであるから、説明を省略する。
そして、異なる時間の符号化ブロックcolCbを設定する(ステップS4017)。これは、異なる時間のピクチャColPic内で処理対象の符号化ブロックと同一位置の中央右下に位置する符号化ブロックを、colCbとして設定するものである。この符号化ブロックは図49の符号化ブロックT1に相当する。
次に、符号化ブロックcolCbにテンポラル動きベクトルtempMvを加算した位置を、新たなcolCbとする(ステップS4018)。いま、符号化ブロックcolCbの左上の位置を(xColCb, yColCb)、テンポラル動きベクトルtempMvを1/16画素精度で(tempMv[0], tempMv[1])とする。そして、
xColCb = Clip3( xCtb, xCtb + CtbSizeY + 3, xColCb + ( tempMv[0] >> 4 ) )
yColCb = Clip3( yCtb, yCtb + CtbSizeY - 1, yColCb + ( tempMv[1] >> 4 ) )
を算出する。ここで、ツリーブロックの左上の位置は(xCtb, yCtb)、ツリーブロックの大きさはCtbSizeYとする。位置((xColCb >> 3) << 3, (yColCb >> 3) << 3)を含むColPic上の符号化ブロックが、新たなcolCbとなる。上式に示すように、tempMv加算後の位置は、tempMv加算前に比べて大きくずれないように、ツリーブロックの大きさ程度の範囲に補正される。もしこの位置が画面外となった場合は、画面内に補正される。
そして、この符号化ブロックcolCbの予測モードPredModeがインター予測(MODE_INTER)か否かを判定する(ステップS4020)。colCbの予測モードがインター予測でない場合(ステップS4020:NO)、サブブロック時間マージ候補の存在を示すフラグavailableFlagSbCol=0に設定して(ステップS4003)、サブブロック時間マージ候補導出部の処理を終了する。
一方、colCbの予測モードがインター予測の場合(ステップS4020:YES)、参照リストごとにインター予測情報を導出する(ステップS4022、S4023)。ここでは、colCbについて、参照リストごとの中心動きベクトルctrMvLXと、LX予測を利用しているか否かを示すフラグctrPredFlagLXを導出する。LXは参照リストを示し、参照リスト0の導出ではLXはL0となり、参照リスト1の導出ではLXはL1となる。インター予測情報の導出について、図47を参照して説明する。
異なる時間の符号化ブロックcolCbが利用できない場合(ステップS4112:NO)、または予測モードPredModeがイントラ予測(MODE_INTRA)の場合(ステップS4114:NO)、フラグavailableFlagLXColとフラグpredFlagLXColを共に0とし(ステップS4116)、動きベクトルmvColを(0,0)として(ステップS4118)、インター予測情報の導出処理を終了する。
符号化ブロックcolCbが利用でき(ステップS4112:YES)、予測モードPredModeがイントラ予測(MODE_INTRA)でない場合(ステップS4114 :YES)、以下の手順でmvCol、refIdxColおよびavailableFlagColを算出する。
符号化ブロックcolCbのLX予測が利用されているか否かを示すフラグPredFlagLX[xPCol][yPCol]が1の場合(ステップS4120:YES)、動きベクトルmvColが符号化ブロックcolCbのLXの動きベクトルであるMvLX[xPCol][yPCol]と同じ値に設定され(ステップS4122)、参照インデックスrefIdxColがLXの参照インデックスRefIdxLX[xPCol][yPCol]と同じ値に設定され(ステップS4124)、リストlistColがLXに設定される(ステップS4126)。ここで、xPCol、yPColは異なる時間のピクチャColPic内での符号化ブロックcolCbの左上の画素の位置を示すインデックスである。
一方、符号化ブロックcolCbのLX予測が利用されているか否かを示すフラグPredFlagLX[xPCol][yPCol]が0の場合(ステップS4120:NO)、以下の処理をする。まず、すべての参照リストに登録されているすべてのピクチャのPOCが、現在の処理対象ピクチャのPOC以下か否かを判断する(ステップS4128)。かつ、colCbのLY予測が利用されているか否かを示すフラグPredFlagLY[xPCol][yPCol]が1か否かを判断する(ステップS4128)。ここで、LY予測とはLX予測とは異なる参照リストと定義する。つまり、LX=L0ではLY=L1、LX=L1ではLY=L0となる。
この判断が真の場合(ステップS4128:YES)、動きベクトルmvColが符号化ブロックcolCbのLYの動きベクトルであるMvLY[xPCol][yPCol]と同じ値に設定され(ステップS4130)、参照インデックスrefIdxColがLYの参照インデックスRefIdxLY[xPCol][yPCol]と同じ値に設定され(ステップS4132)、リストlistColがLXに設定される(ステップS4134)。
一方、この判断が偽の場合(ステップS4128:NO)、フラグavailableFlagLXColとフラグpredFlagLXColを共に0とし(ステップS4116)、動きベクトルmvColを(0,0)として(ステップS4118)、インター予測情報の導出処理を終了する。
符号化ブロックcolCbからインター予測情報が取得できたら、フラグavailableFlagLXColとフラグpredFlagLXColを共に1とする(ステップS4136)。
続いて、動きベクトルmvColをスケーリングして、動きベクトルmvLXColとする(ステップS4138)。この処理は、時間予測動きベクトル候補導出部322におけるS4245と同じであるから、説明を省略する。
再び、図44を参照する。参照リストごとにインター予測情報を導出したら、算出された動きベクトルmvLXColを中心動きベクトルctrMvLX、算出されたフラグpredFlagLXColをフラグctrPredFlagLXとする(ステップS4022,ステップS4023)。
そして、中心動きベクトルが有効か無効かを判断する(ステップS4024)。ctrPredFlagL0=0かつctrPredFlagL1=0であれば無効、それ以外は無効と判断する。中心動きベクトルが無効の場合(ステップS4024:NO)、サブブロック時間マージ候補の存在を示すフラグavailableFlagSbCol=0に設定して(ステップS4003)、サブブロック時間マージ候補導出部の処理を終了する。
一方、中心動きベクトルが有効の場合(ステップS4024:YES)、サブブロック時間マージ候補の存在を示すフラグavailableFlagSbCol=1に設定して(ステップS4025)、サブブロック動き情報を導出する(ステップS4026)。この処理について、図48を参照して説明する。
まず、符号化ブロックcolCbの幅cbWidthと高さcBheightから、幅方向のサブブロック数numSbXおよび高さ方向のサブブロック数numSbYを算出する(ステップS4152)。また、refIdxLXSbCol=0とする(ステップS4152)。この処理以降は、予測サブブロックcolSbの単位で繰り返し処理をする。この繰り返しは、高さ方向のインデックスySbIdxを0からnumSbYまで、幅方向のインデックスxSbIdxを0からnumSbXまで変更しながら処理をする。
符号化ブロックcolCbの左上の位置を(xCb,yCb)とすると、予測サブブロックcolSbの左上の位置(xSb,ySb)は、
xSb = xCb + xSbIdx * sbWidth
ySb = yCb + ySbIdx * sbHeight
と算出される。次に、予測サブブロックcolSbにテンポラル動きベクトルtempMvを加算した位置を、新たなcolSbとする(ステップS4154)。予測サブブロックcolSbの左上の位置を(xColSb, yColSb)、テンポラル動きベクトルtempMvを1/16画素精度で(tempMv[0], tempMv[1])とすると、新たなcolSbの左上の位置は、
xColSb = Clip3( xCtb, xCtb + CtbSizeY + 3, xSb + ( tempMv[0] >> 4 ) )
yColSb = Clip3( yCtb, yCtb + CtbSizeY - 1, ySb + ( tempMv[1] >> 4 ) )
となる。ここで、ツリーブロックの左上の位置は(xCtb, yCtb)、ツリーブロックの大きさはCtbSizeYとする。上式に示すように、tempMv加算後の位置は、tempMv加算前に比べて大きくずれないように、ツリーブロックの大きさ程度の範囲に補正される。もしこの位置が画面外となった場合は、画面内に補正される。
そして、参照リストごとにインター予測情報を導出する(ステップS4156,S4158)。ここでは、予測サブブロックcolSbについて、サブブロック単位で参照リストごとの動きベクトルmvLXSbColと、予測サブブロックが有効か否かを示すフラグavailableFlagLXSbColを導出する。LXは参照リストを示し、参照リスト0の導出ではLXはL0となり、参照リスト1の導出ではLXはL1となる。インター予測情報の導出は、図47のS4022,S4023と同じであるため、説明を省略する。
インター予測情報を導出後(ステップS4156,S4158)、予測サブブロックcolSbが有効か否かを判断する(ステップS4160)。availableFlagL0SbCol=0かつavailableFlagL1SbCol=0の場合はcolSbが無効、それ以外は有効と判断する。colSbが無効の場合(ステップS4160:NO)、動きベクトルmvLXSbColを、中心動きベクトルctrMvLXとする(ステップS4162)。さらに、LX予測を利用しているか否かを示すフラグpredFlagLXSbColを、中心動きベクトルにおけるフラグctrPredFlagLXとする(ステップS4162)。以上により、サブブロック動き情報の導出を終了する。
再び、図44を参照する。そして、L0の動きベクトルmvL0SbCol、およびL1の動きベクトルmvL1SbColを、前述のサブブロックマージモード導出部304におけるサブブロックマージ候補リストsubblockMergeCandListに候補として追加する(ステップS4028)。ただし、この追加は、サブブロック時間マージ候補の存在を示すフラグavailableSbCol=1の場合のみである。以上により、時間マージ候補導出部342の処理を終了する。
上記したサブブロック時間マージ候補導出部381の説明は、符号化時のものであるが、復号時も同様となる。つまり、図22のサブブロックマージモード導出部404におけるサブブロック時間マージ候補導出部481の動作は、上記の説明における符号化を復号と置き換えて、同様に説明される。
<動き補償予測処理>
動き補償予測部306は、符号化において現在予測処理の対象となっているブロックの位置およびサイズを取得する。また、動き補償予測部306は、インター予測情報をインター予測モード判定部305から取得する。取得したインター予測情報から参照インデックスおよび動きベクトルを導出し、復号画像メモリ内の参照インデックスで特定される参照ピクチャを、動きベクトルの分だけ予測ブロックの画像信号と同一位置より移動させた位置の画像信号を取得した後に予測信号を生成する。
インター予測におけるインター予測モードがL0予測やL1予測のような、単一の参照ピクチャからの予測の場合には、1つの参照ピクチャから取得した予測信号を動き補償予測信号とし、インター予測モードがBI予測のような、予測モードが2つの参照ピクチャからの予測の場合には、2つの参照ピクチャから取得した予測信号を重みづけ平均したものを動き補償予測信号とし、動き補償予測信号を予測方法決定部に供給する。ここでは双予測の重みづけ平均の比率を1:1とするが、他の比率を用いて重みづけ平均を行っても良い。例えば、予測対象となっているピクチャと参照ピクチャとのピクチャ間隔が近いものほど重みづけの比率が大きくなるようにしてもよい。また、重みづけ比率の算出をピクチャ間隔の組み合わせと重みづけ比率との対応表を用いて行うようにしても良い。
動き補償予測部406は、符号化側の動き補償予測部306と同様の機能をもつ。動き補償予測部406は、インター予測情報を、通常予測動きベクトルモード導出部401、通常マージモード導出部402、サブブロック予測動きベクトルモード導出部403、サブブロックマージモード導出部404から、スイッチ408を介して取得する。
動き補償予測部406は、得られた動き補償予測信号を、復号画像信号重畳部207に供給する。
<インター予測モードについて>
単一の参照ピクチャからの予測を行う処理を単予測と定義し、単予測の場合はL0予測またはL1予測という、参照リストL0、L1に登録された2つの参照ピクチャのいずれか一方を利用した予測を行う。L0予測およびL1予測は前方向予測(前方の参照画像を参照する予測)であっても後方向予測(後方の参照画像を参照する予測)であってもよい。図57〜58は、L0予測(単予測)での動き補償予測を説明するための図である。
図57はインター予測モードがL0予測であってL0の参照ピクチャ(RefL0Pic)が処理対象ピクチャ(CurPic)より前の時刻にある場合を示している。図58はL0予測であってL0の参照ピクチャが処理対象ピクチャより後の時刻にある場合を示している。同様に、図57および図58のL0予測の参照ピクチャをL1予測の参照ピクチャ(RefL1Pic)に置き換えて単予測を行うこともできる。
2つの参照ピクチャからの予測を行う処理を双予測と定義し、双予測の場合はL0予測とL1予測の双方を利用して双予測と表現する。図59〜61は、双予測での動き補償予測を説明するための図である。図59は双予測であってL0予測の参照ピクチャが処理対象ピクチャより前の時刻にあって、L1予測の参照ピクチャが処理対象ピクチャより後の時刻にある場合を示している。図60は双予測であってL0予測の参照ピクチャとL1予測の参照ピクチャが処理対象ピクチャより前の時刻にある場合を示している。図61は双予測であってL0予測の参照ピクチャとL1予測の参照ピクチャが処理対象ピクチャより後の時刻にある場合を示している。
このように、L0/L1の予測種別と時間の関係は、L0が前方向予測(前方の参照画像を参照する予測)、L1が後方向予測(後方の参照画像を参照する予測)とは限定されずに用いることが可能である。また双予測の場合に、同一の参照ピクチャを用いてL0予測及びL1予測のそれぞれを行ってもよい。なお、動き補償予測を単予測で行うか双予測で行うかの判断は、例えばL0予測を利用するか否か及びL1予測を利用するか否かを示す情報(例えば、フラグ)に基づき判断される。
<参照インデックスについて>
本発明の実施の形態では、動き補償予測の精度向上のために、動き補償予測において複数の参照ピクチャの中から最適な参照ピクチャを選択することを可能とする。そのため、動き補償予測で利用した参照ピクチャを参照インデックスとして利用するとともに、参照インデックスを符号化ベクトルとともに符号化ストリーム中に符号化する。
<通常予測動きベクトルモードに基づく動き補償処理>
動き補償予測部306は、図16の符号化側におけるインター予測部102でも示されるように、インター予測モード判定部305において、通常予測動きベクトルモード導出部301によるインター予測情報が選択された場合には、このインター予測情報をインター予測モード判定部305から取得し、現在処理対象となっているブロックのインター予測モード、参照インデックス、動きベクトルを導出し、動き補償予測信号を生成する。生成された動き補償予測信号は、予測方法決定部105に供給される。
同様に、動き補償予測部406は、図22の復号側におけるインター予測部203でも示されるように、復号の過程でスイッチ408が通常予測動きベクトルモード導出部401に接続された場合には、通常予測動きベクトルモード導出部401によるインター予測情報を取得し、現在処理対象となっているブロックのインター予測モード、参照インデックス、動きベクトルを導出し、動き補償予測信号を生成する。生成された動き補償予測信号は、復号画像信号重畳部207に供給される。
<通常マージモードに基づく動き補償処理>
動き補償予測部306は、図16の符号化側におけるインター予測部102でも示されるように、インター予測モード判定部305において、通常マージモード導出部302によるインター予測情報が選択された場合には、このインター予測情報をインター予測モード判定部305から取得し、現在処理対象となっているブロックのインター予測モード、参照インデックス、動きベクトルを導出し、動き補償予測信号を生成する。生成された動き補償予測信号は、予測方法決定部105に供給される。
同様に、動き補償予測部406は、図22の復号側におけるインター予測部203でも示されるように、復号の過程でスイッチ408が通常マージモード導出部402に接続された場合には、通常マージモード導出部402によるインター予測情報を取得し、現在処理対象となっているブロックのインター予測モード、参照インデックス、動きベクトルを導出し、動き補償予測信号を生成する。生成された動き補償予測信号は、復号画像信号重畳部207に供給される。
<サブブロック予測動きベクトルモードに基づく動き補償処理>
動き補償予測部306は、図16の符号化側におけるインター予測部102でも示されるように、インター予測モード判定部305において、サブブロック予測動きベクトルモード導出部303によるインター予測情報が選択された場合には、このインター予測情報をインター予測モード判定部305から取得し、現在処理対象となっているブロックのインター予測モード、参照インデックス、動きベクトルを導出し、動き補償予測信号を生成する。生成された動き補償予測信号は、予測方法決定部105に供給される。
同様に、動き補償予測部406は、図22の復号側におけるインター予測部203でも示されるように、復号の過程でスイッチ408がサブブロック予測動きベクトルモード導出部403に接続された場合には、サブブロック予測動きベクトルモード導出部403によるインター予測情報を取得し、現在処理対象となっているブロックのインター予測モード、参照インデックス、動きベクトルを導出し、動き補償予測信号を生成する。生成された動き補償予測信号は、復号画像信号重畳部207に供給される。
<サブブロックマージモードに基づく動き補償処理>
動き補償予測部306は、図16の符号化側におけるインター予測部102でも示されるように、インター予測モード判定部305において、サブブロックマージモード導出部304によるインター予測情報が選択された場合には、このインター予測情報をインター予測モード判定部305から取得し、現在処理対象となっているブロックのインター予測モード、参照インデックス、動きベクトルを導出し、動き補償予測信号を生成する。生成された動き補償予測信号は、予測方法決定部105に供給される。
同様に、動き補償予測部406は、図22の復号側におけるインター予測部203でも示されるように、復号の過程でスイッチ408がサブブロックマージモード導出部404に接続された場合には、サブブロックマージモード導出部404によるインター予測情報を取得し、現在処理対象となっているブロックのインター予測モード、参照インデックス、動きベクトルを導出し、動き補償予測信号を生成する。生成された動き補償予測信号は、復号画像信号重畳部207に供給される。
<アフィンモードに基づく動き補償処理>
本実施の形態においてはアフィンモデルによる動き補償が利用できる。アフィンモデルによる動き補償は符号化ブロックの2〜4個の角を制御点とし、制御点の動きベクトルからサブブロックの動きベクトルを導出し、サブブロック単位で動き補償を行う。
以下のフラグは、符号化処理においてインター予測モード判定部305により決定されるインター予測の条件に基づいて以下のフラグに反映され、符号化ストリーム中に符号化される。復号処理においては、符号化ストリーム中の以下のフラグに基づいてアフィンモデルによる動き補償を行うか否かを特定する。
sps_affine_enabled_flagは、インター予測において、アフィンモデルによる動き補償が利用できるか否かを表す。sps_affine_enabled_flagが0であれば、シーケンス単位でアフィンモデルによる動き補償ではないように抑制される。また、inter_affine_flag とcu_affine_type_flag は、符号化ビデオシーケンスのCU(符号化ユニット)シンタックスにおいて伝送されない。sps_affine_enabled_flagが1であれば、符号化ビデオシーケンスにおいてアフィンモデルによる動き補償を利用できる。
sps_affine_type_flagは、インター予測において、6パラメータアフィンモードによる動き補償が利用できるか否かを表す。6パラメータアフィンモデルは3つの制御点のそれぞれの動きベクトルの水平及び垂直成分の6つのパラメータからサブブロックの動きベクトルを導出し、サブブロック単位で動き補償を行うモードである。サブブロック単位で動きベクトルを導出するが、符号化ブロック単位で共通の参照インデックスを導出する。
sps_affine_type_flagが0であれば、6パラメータアフィンモデルによる動き補償ではないように抑制される。また、cu_affine_type_flagは、符号化ビデオシーケンスのCUシンタックスにおいて伝送されない。sps_affine_type_flagが1であれば、符号化ビデオシーケンスにおいて6パラメータアフィンモデルによる動き補償を利用できる。
sps_affine_type_flagが存在しない場合には、0であるものとする。
PまたはBスライスを復号している場合、現在処理対象となっているCUにおいて、inter_affine_flagが1であれば、現在処理対象となっているCUの動き補償予測信号を生成するために、アフィンモデルによる動き補償が用いられる。
inter_affine_flagが0であれば、現在処理対象となっているCUにアフィンモデルは用いられない。
inter_affine_flagが存在しない場合には、0であるものとする。
PまたはBスライスを復号している場合、現在処理対象となっているCUにおいて、cu_affine_type_flagが1であれば、現在処理対象となっているCUの動き補償予測信号を生成するために、6パラメータアフィンモデルによる動き補償が用いられる。
cu_affine_type_flagが0であれば、現在処理対象となっているCUの動き補償予測信号を生成するために、4パラメータアフィンモデルによる動き補償が用いられる。4パラメータアフィンモデルは2つの制御点のそれぞれの動きベクトルの水平成分及び垂直成分の4つのパラメータからサブブロックの動きベクトルを導出し、サブブロック単位で動き補償を行うモードである。
<マージ差分動きベクトル(MMVD)>
マージ候補の上位2つ(マージ候補リスト内のマージインデックスが0および1のマージ候補)の動きベクトルに対し、差分動きベクトルを加算することができる。この差分動きベクトルを、マージ差分動きベクトルと呼ぶ。
符号化側のマージ候補選択部347においてマージ差分動きベクトルを加算する場合、マージ差分動きベクトルが加算された動きベクトルは、インター予測モード判定部305を介して動き補償予測部306に供給される。また、ビット列符号化部108は、マージ差分動きベクトルに関する情報を符号化する。マージ差分動きベクトルに関する情報とは、動きベクトルに加算する距離を示すインデックスmmvd_distance_idxと、動きベクトルを加算する方向を示すインデックスmmvd_direction_idxである。これらのインデックスは、図63(a)および図63(b)に示す表のように定義される。そして、マージ差分動きベクトルオフセットMmvdOffsetのx,y成分をそれぞれMmvdOffset[0], MmvdOffset[1]で表すと、
MmvdOffset[0] = ( MmvdDistance << 2 ) * MmvdSign[0]
MmvdOffset[1] = ( MmvdDistance << 2 ) * MmvdSign[1]
となる。マージ差分動きベクトルは、上式のマージ差分動きベクトルオフセットMmvdOffsetより導出される。マージ差分動きベクトルを導出する詳細は、以下の復号側の場合において説明する。
復号側において、マージ差分動きベクトルが存在する場合、ビット列復号部201に供給されるビットストリームからマージ差分動きベクトルに関する情報を分離し、マージ差分動きベクトルオフセットMmvdOffsetを導出する。また、マージ候補選択部447は、復号されたマージ差分動きベクトルオフセットから、マージ差分動きベクトルを導出する。このマージ差分動きベクトルを動きベクトルに加算してから、その動きベクトルを動き補償予測部406に供給する。
マージ候補選択部447におけるマージ差分動きベクトルmMvdLXの導出について、図64(a)のフローチャートを参照して説明する。まず、符号化ブロックのインター予測モードが双予測(PRED_BI)であるか否かを判定する(S4402)。双予測でない場合(S4402:No)、L0予測(PRED_L0)であるか否かを判定する(S4404)。L0予測の場合(S4404:Yes)、
mMvdL0 = MmvdOffset
mMvdL1 = 0
として(S4406)、マージ差分動きベクトルを導出する処理は終了する。L1予測の場合(S4404:No)、
mMvdL0 = 0
mMvdL1 = MmvdOffset
として(S4408)、マージ差分動きベクトルを導出する処理は終了する。
一方、双予測の場合(S4402:Yes)、処理対象ピクチャcurrPicと参照ピクチャのPOCの差を、参照リストごとに計算し、それぞれcurrPocDiffL0, currPocDiffL1とする(S4410)。ここで、picAとpicBのPOCの差DiffPicOrderCnt(picA, picB)は、
DiffPicOrderCnt( picA, picB ) = [picAのPOC] - [picBのPOC]
を示す。また、参照ピクチャRefPicList0[ refIdxL0 ]は、参照リストL0の参照インデックスrefIdxL0が示すピクチャである。同様に、参照ピクチャRefPicList1[ refIdxL1 ]は、参照リストL1の参照インデックスrefIdxL1が示すピクチャである。
次に、-currPocDiffL0 * currPocDiffL1 >= 0か否かを判定する(ステップS4412)。この判定が真の場合(ステップS4412:Yes)、
mMvdL0 = MmvdOffset
mMvdL1 = -MmvdOffset
として(ステップS4414)、マージ差分動きベクトルを導出する処理は終了する。一方、この判定が偽の場合(ステップS4412:No)、
mMvdL0 = MmvdOffset
mMvdL1 = MmvdOffset
とする(ステップS4416)。次に、参照リストL0とのPOCの差の絶対値が、参照リストL1とのPOCの差の絶対値以上か否かを判定する(ステップS4418)。この判定が真の場合(ステップS4418:Yes)、X=0, Y=1とし(ステップS4420)、L1のマージ差分動きベクトルmMvdL1をスケーリングする(ステップS4424)。ここで、mMvdLYは、Y=0の場合はmMvdL0、Y=1の場合はmMvdL1であることを示す。一方、この判定が偽の場合(ステップS4418:No)、X=1, Y=0とし(ステップS4422)、L0のマージ差分動きベクトルmMvdL0をスケーリングする(ステップS4424)。マージ差分動きベクトルmMvdLYのスケーリングは、図64(b)のように、
td = Clip3( -128, 127, currPocDiffLX )
tb = Clip3( -128, 127, currPocDiffLY )
tx = ( 16384 + Abs( td ) >> 1 ) / td
distScaleFactor = Clip3( -4096, 4095, ( tb * tx + 32 ) >> 6 )
mMvdLY = Clip3( -32768, 32767, Sign( distScaleFactor * mMvdLY )
* ( (Abs( distScaleFactor * mMvdLY ) + 127 ) >> 8 ) )
として導出する。ここで、currPocDiffLXは、X=0の場合はcurrPocDiffL0、X=1の場合はcurrPocDiffL1であることを示す。同様に、currPocDiffLYは、Y=0の場合はcurrPocDiffL0、Y=1の場合はcurrPocDiffL1であることを示す。また、Clip3(x,y,z)は値zについて、最小値をx、最大値をyに制限する関数である。Sign(x)は値xの符号を返す関数であり、Abs(x)は値xの絶対値を返す関数である。以上により、マージ差分動きベクトルを導出する処理は終了する。
マージ差分動きベクトルは、サブブロックマージ候補の上位2つの動きベクトルに対して加算しても良い。この場合、動きベクトルに加算する距離を示すインデックスmmvd_distance_idxは、図63(c)に示す表のように定義される。サブブロックマージ候補選択部386の動作は、マージ候補選択部347と同じであるため、説明を省略する。また、サブブロックマージ候補選択部486の動作は、マージ候補選択部447と同じであるため、説明を省略する。
前述の通り、MmvdDistanceは、図63(a)や図63(c)に示す表のように定義される。これらの表は1/4画素精度で定義されているので、生成されるマージ差分動きベクトルは、小数画素精度を含むことがある。ただし、これらの表の画素精度が1であることを示すフラグをスライス単位で符号化/復号することにより、生成されるマージ差分動きベクトルが、小数画素精度を含まないように変更することができる。
<適応動きベクトル解像度(AMVR)>
符号化ブロック単位で、差分動きベクトルの解像度を適応的に変更することができる。この解像度を、適応動きベクトル解像度と呼ぶ。
通常予測動きベクトルモードに対して適応動きベクトル解像度を用いる場合について説明する。この場合、空間予測動きベクトル候補導出部321および421と、時間予測動きベクトル候補導出部322および422と、履歴予測動きベクトル候補導出部323および423において、導出された候補の動きベクトルは解像度に応じて丸められる。解像度は1/4,1,4画素精度から選択でき、解像度を変更しない場合は1/4画素精度となる。丸め処理は、処理対象の符号化ブロックにおける動きベクトルの解像度に合わせてなされる。つまり、導出された候補の動きベクトルmvXは、
rightShift = leftShift = MvShift + 2
offset = 1 << ( rightShift - 1 )
mvX = ( mvX >= 0 ? ( mvX + offset ) >> rightShift :
- ( ( - mvX + offset ) >> rightShift ) ) << leftShift
と丸め処理される。ここで、処理対象の符号化ブロックにおける動きベクトルの解像度が1/4画素精度の場合、MvShift=0である。同様に、動きベクトルの解像度が1画素精度の場合はMvShift=2であり、動きベクトルの解像度が4画素精度の場合はMvShift=4である。上式により、mvXのx,y成分それぞれが処理される。
適応動きベクトル解像度は、サブブロック予測動きベクトルモードに対して用いることもできる。この場合、上記の通常予測動きベクトルモードに対して、解像度のみが異なる。すなわち、アフィン継承予測動きベクトル候補導出部361および461と、アフィン構築予測動きベクトル候補導出部362および462と、アフィン同一予測動きベクトル候補導出部363および463において、導出された候補の動きベクトルは解像度に応じて丸められる。解像度は1/16,1/4,1画素精度から選択でき、解像度を変更しない場合は1/16画素精度となる。丸め処理は、処理対象の符号化ブロックにおける動きベクトルの解像度に合わせてなされる。つまり、導出された候補の動きベクトルmvXは、上記の式により丸め処理される。ここで、処理対象の符号化ブロックにおける動きベクトルの解像度が1/4画素精度の場合、MvShift=0である。同様に、動きベクトルの解像度が1画素精度の場合はMvShift=2である。上記の式により、mvXのx,y成分それぞれが処理される。
(第2の実施の形態)
次に、第2の実施の形態に係る画像符号化装置および画像復号装置について説明する。第1の実施の形態に係る画像符号化装置および画像復号装置とは、構成が同じであるが、履歴マージ候補導出部345、445の処理手順が異なる。履歴マージ候補導出部345、445の処理手順である図42のフローチャートの代わりに図66のフローチャートとなっており、これらの違いについて説明する。
<第2の実施の形態の履歴マージ候補導出処理>
第2の実施の形態に係る画像符号化装置および画像復号装置の履歴マージ候補導出処理について、図66のフローチャートを用いて説明する。
第2の実施の形態では、処理対象の符号化ブロックの左側に隣接するブロックA1から導出された空間マージ候補A1、及び右側に隣接するブロックB1から導出された空間マージ候補B1と履歴予測動きベクトル候補リストの後ろの要素(最近付化された要素)からオフセット値hMvpIdxOffsetで指定した個数の各要素のみを比較する点が、第1の実施の形態と異なる。第1の実施の形態に係る画像符号化装置および画像復号装置の履歴予測動きベクトル候補導出処理を示す図42のフローチャートとは、図42のステップS2306、S2307,S2309が図66ではステップS2326、S2327,S2329にそれぞれ変更されている点が異なり、それ以外は同一の処理である。第2の実施の形態においても、まず、初期化処理を行う(図66のステップS2301)。isPruned[i]の0から(numCurrMergeCand -1)番目のそれぞれの要素にFALSEの値を設定し、変数numOrigMergeCandに現在のマージ候補リストに登録されている要素の数numCurrMergeCandを設定する。
続いて、インデックスhMvpIdxの初期値を1に設定し、この初期値からNumHmvpCandまで、図66のステップS2303からステップS2311までの追加処理を繰り返す(図66のステップS2302〜S2312)。現在のマージ候補リストに登録されている要素の数numCurrMergeCandが(最大マージ候補数MaxNumMergeCand-1)以下でなければ、マージ候補リストのすべての要素にマージ候補が追加されたので、本履歴マージ候補導出処理を終了する(図66のステップS2303:NO)。現在のマージ候補リストに登録されている要素の数numCurrMergeCandが(最大マージ候補数MaxNumMergeCand-1)以下の場合(図66のステップS2303:YES)、ステップS2304以降の処理を行う。
まず、sameMotionにFALSE(偽)の値を設定する(図66のステップS2304)。続いて、インデックスhMvpIdxが所定のオフセット値hMvpIdxOffset以下の場合、すなわちマージ候補リストに含まれていない要素かどうかを確認する場合(図42のステップS2305のYES)、インデックスiの初期値を0に設定し、この初期値から、所定の上限値である1とnumOrigMergeCand-1のいずれか小さい値まで図66のステップS2327、S2308の処理を行う(図66のS2326〜S2329)。ここで、第2の実施の形態では、処理対象の符号化ブロックの左側に隣接するブロックA1から導出された空間マージ候補A1、及び右側に隣接する空間マージ候補B1と履歴予測動きベクトル候補リストの後ろの要素(最近付化された要素)からオフセット値hMvpIdxOffsetで指定した個数の各要素のみを比較する。所定の上限値が1であるのは、処理対象の符号化ブロックの左側に隣接するブロックA1から導出された空間マージ候補A1または右側に隣接する空間マージ候補B1がマージ候補リストの0から数えて0番目と1番目にしか格納される可能性がないからである。履歴予測動きベクトル候補リストの0から数えて(NumHmvpCand-hMvpIdx)番目の要素HmvpCandList[NumHmvpCand-hMvpIdx]と、空間マージ候補A1、およびB1を比較する。(図66のステップS2327)。マージ候補が持つすべての構成要素(インター予測モード、L0及びL1の参照インデックス、L0及びL1の動きベクトル)の値が同じかどうかを比較する。ここで、マージ候補が同じ値とは、マージ候補が持つすべての構成要素(インター予測モード、L0及びL1の参照インデックス、L0及びL1の動きベクトル)の値が同じであることを示す。したがって、このステップS2327の比較処理では、マージ候補リストの0から数えてi番目の要素mergeCandList[i]が左側に隣接するブロックA1から導出された空間マージ候補A1または右側に隣接する空間マージ候補B1で、かつisPruned[i]がFALSE(偽)の際に、mergeCandList[i]とHmvpCandList[NumHmvpCand-hMvpIdx]が持つすべての構成要素(インター予測モード、L0及びL1の参照インデックス、L0及びL1の動きベクトル)の値が同じ値かどうかを比較する。同じ値の場合(図39のステップS2327:YES)、sameMotionおよびisPruned[i]共にTRUE(真)を設定する(図66のステップS2308)。なお、フラグisPruned[i]はマージ候補リストの0から数えてi番目の要素が履歴予測動きベクトル候補リストのいずれかの要素と同じ値であることを示すフラグである。同じ値でない場合(図39のステップS2327:NO)、ステップS2308の処理をスキップする。図66のステップS2326からステップS2329までの繰り返し処理が完了したらsameMotionがFALSE(偽)か否かを比較し(図66のステップS2310)、sameMotionが FALSE(偽)の場合(図66のステップS2310:YES)、マージ候補リストのnumCurrMergeCand番目のmergeCandList[numCurrMergeCand]に履歴予測動きベクトル候補リストの0から数えて(NumHmvpCand - hMvpIdx)番目の要素HmvpCandList[NumHmvpCand - hMvpIdx]を追加し、numCurrMergeCandを1インクリメントする(図66のステップS2311)。インデックスhMvpIdxを1インクリメントし(図66のステップS2302)、図66のステップS2302〜S2312の繰り返し処理を行う。
履歴予測動きベクトル候補リストのすべての要素の確認が完了するか、マージ候補リストのすべての要素にマージ候補が追加されたら、本履歴マージ候補の導出処理を完了する。
なお、第2の実施の形態では、マージ候補リストに格納され空間マージ候補A1およびB1と、履歴予測動きベクトル候補リストの要素を比較するものとして説明したが、空間マージ候補A1およびB1をそれぞれマージ候補リスト以外のメモリに記憶し、マージ候補リスト以外のメモリに記憶された空間マージ候補A1およびB1と、履歴予測動きベクトル候補リストの要素を比較してもよい。
(第3の実施の形態)
次に、第3の実施の形態に係る画像符号化装置および画像復号装置について説明する。第1の実施の形態に係る画像符号化装置および画像復号装置とは、構成が同じであるが、符号化側の符号化情報格納メモリ111及び復号側の符号化情報格納メモリ205に備える履歴予測動きベクトル候補リスト初期化・更新処理手順における、同一要素確認処理手順が異なる。第1の実施形態の履歴予測動きベクトル候補リスト初期化・更新処理手順における同一要素確認処理手順である図39のフローチャートの代わりに、第3の実施形態の履歴予測動きベクトル候補リスト初期化・更新処理手順における同一要素確認処理手順では図67のフローチャートとなっており、これらの違いについて説明する。
<第3の実施形態の履歴予測動きベクトル候補リスト初期化・更新処理手順における同一要素確認処理手順>
第3の実施の形態に係る画像符号化装置および画像復号装置の履歴予測動きベクトル候補リスト初期化・更新処理手順における同一要素確認処理手順について、図67のフローチャートを用いて説明する。
第3の実施の形態では、履歴予測動きベクトル候補リスト更新処理において、履歴予測動きベクトル候補リストHmvpCandListに要素が最大数追加されている場合、すなわち、現在の履歴予測動きベクトル候補の数NumHmvpCandが履歴予測動きベクトル候補の最大数MaxNumHmvpCandに達している場合、履歴予測動きベクトル候補リストに含まれる先頭の要素、すなわち0から数えて0番目の要素(履歴予測動きベクトル候補)を比較せず、1番目以降の要素のみを比較する点が、第1の実施の形態と異なる。履歴予測動きベクトル候補リストに含まれる要素はインター予測モード、参照インデックス、動きベクトルで構成される。履歴予測動きベクトル候補リストに含まれる先頭の要素を比較しないことで、要素の比較回数は最大で(MaxNumHmvpCand -1)回に制限され、要素の比較に伴う最大処理量を削減する。第1の実施の形態に係る画像符号化装置および画像復号装置の履歴予測動きベクトル候補導出処理を示す図39のフローチャートとは、図39のステップS2122、S2125が図67ではステップS2132、2135にそれぞれ変更されている点が異なり、それ以外は同一の処理である。
第3の実施の形態においても、履歴予測動きベクトル候補の数NumHmvpCandの値が0の場合(図67のステップS2121:NO)、履歴予測動きベクトル候補リストHmvpCandListは空で、同一候補は存在しないので図67ステップS2132〜S2135をスキップし、本同一要素確認処理手順を終了する。履歴予測動きベクトル候補の数NumHmvpCandの値が0より大きい場合(図67のステップS2121:YES)、履歴予測動きベクトルインデックスhMvpIdxが0または1からNumHmvpCand-1まで、ステップS2123の処理を繰り返す(図67のステップS2132〜S2135)。まず、現在の履歴予測動きベクトル候補の数NumHmvpCandが履歴予測動きベクトル候補の最大数MaxNumHmvpCand未満の場合、履歴予測動きベクトル候補リストに含まれる先頭の要素、すなわち0から数えて0番目の要素(履歴予測動きベクトル候補)を比較するので、hMvpIdxを0とする。一方、現在の履歴予測動きベクトル候補の数NumHmvpCandが履歴予測動きベクトル候補の最大数MaxNumHmvpCandに達している場合、履歴予測動きベクトル候補リストに含まれる先頭の要素、すなわち0から数えて0番目の要素(履歴予測動きベクトル候補)を比較しないので、hMvpIdxを1とする(図67のステップS2132)。続いて、履歴予測動きベクトル候補リストの0から数えてhMvpIdx番目の要素HmvpCandList[hMvpIdx]が登録対象のインター予測情報候補hMvpCandと同一か否かを比較する(図67のステップS2123)。同一の場合(図67のステップS2123:YES)、同一候補が存在するか否かを示すフラグidenticalCandExistにTRUE(真)の値を設定し、削除対象インデックスremoveIdxにhMVpIndexの値を設定し、本同一要素確認処理を終了する。同一でない場合(図67のステップS2123:NO)、hMvpIdxを1インクリメントし、履歴予測動きベクトルインデックスhMvpIdxがNumHmvpCand-1以下であれば、ステップS2123以降の処理を行う(図67のステップS2132〜S2135)。
(第4の実施の形態)
次に、第4の実施の形態に係る画像符号化装置および画像復号装置について説明する。第4の実施の形態に係る画像符号化装置および画像復号装置とは、構成が同じであるが、符号化側の符号化情報格納メモリ111及び復号側の符号化情報格納メモリ205に備える履歴予測動きベクトル候補リスト初期化・更新処理手順における、同一要素確認処理手順が異なる。第1の実施形態の履歴予測動きベクトル候補リスト初期化・更新処理手順における同一要素確認処理手順である図39のフローチャートの代わりに、第4の実施形態の履歴予測動きベクトル候補リスト初期化・更新処理手順における同一要素確認処理手順では図68のフローチャートとなっており、これらの違いについて説明する。
<第4の実施形態の履歴予測動きベクトル候補リスト初期化・更新処理手順における同一要素確認処理手順>
第4の実施の形態に係る画像符号化装置および画像復号装置の履歴予測動きベクトル候補リスト初期化・更新処理手順における同一要素確認処理手順について、図68のフローチャートを用いて説明する。
第4の実施の形態では、履歴予測動きベクトル候補リスト更新処理において、履歴予測動きベクトル候補リストの最後の要素から降順に要素を比較する点が、第1の実施の形態、及び第3の実施の形態と異なる。さらに、履歴予測動きベクトル候補リスト更新処理において、履歴予測動きベクトル候補リストHmvpCandListに要素が最大数追加されている場合、履歴予測動きベクトル候補リストに含まれる先頭の要素、すなわち0から数えて0番目の要素を比較せず、1番目以降の要素のみを比較する点が、第1の実施の形態と異なる。履歴予測動きベクトル候補リストに含まれる要素はインター予測モード、参照インデックス、動きベクトルで構成される。履歴予測動きベクトル候補リストに含まれる先頭の要素を比較しないことで、要素の比較回数は最大で(MaxNumHmvpCand -1)回に制限され、要素の比較に伴う最大処理量を削減する。
第4の実施の形態においても、履歴予測動きベクトル候補の数NumHmvpCandの値が0の場合(図68のステップS2151:NO)、履歴予測動きベクトル候補リストHmvpCandListは空で、同一候補は存在しないので図68ステップS2152〜S2155をスキップし、本同一要素確認処理手順を終了する。履歴予測動きベクトル候補の数NumHmvpCandの値が0より大きい場合(図68のステップS2152:YES)、インデックスiが1から、履歴予測動きベクトル候補の最大数MaxNumHmvpCand -1と履歴予測動きベクトル候補の数NumHmvpCandのいずれか小さい値まで、ステップS2153の処理を繰り返す(図68のステップS2152〜S2155)。まず、履歴予測動きベクトル候補リストの0から数えてNumHmvpCand-i番目の要素HmvpCandList[NumHmvpCand - i]が登録対象のインター予測情報候補hMvpCandと同一か否かを比較する(図68のステップS2153)。同一の場合(図68のステップS2153:YES)、同一候補が存在するか否かを示すフラグidenticalCandExistにTRUE(真)の値を設定し、削除対象インデックスremoveIdxにhMVpIndexの値を設定し、本同一要素確認処理を終了する。同一でない場合(図68のステップS2153:NO)、iを1インクリメントし、 iが履歴予測動きベクトル候補の最大数MaxNumHmvpCand -1と履歴予測動きベクトル候補の数NumHmvpCandのいずれか小さい値以下であれば、ステップS2153以降の処理を行う(図68のステップS2152〜S2155)。なお、インデックスiが初期値である1の時、履歴予測動きベクトル候補リストの0から数えてNumHmvpCand-i番目の要素HmvpCandList[NumHmvpCand - i]は履歴予測動きベクトル候補リストに登録されている最後の要素を示し、インデックスiが1ずつインクリメントされるにつれて履歴予測動きベクトル候補リストの要素を降順に示す。インデックスiは最大で(MaxNumHmvpCand -1)とすることで、履歴予測動きベクトル候補の先頭の要素HMVPCandList[0]を比較することはない。
以上に述べた全ての実施の形態は、複数を組み合わせても良い。
以上に述べた全ての実施の形態において、画像符号化装置が出力する符号化ビットストリームは、実施の形態で用いられた符号化方法に応じて復号することができるように特定のデータフォーマットを有している。符号化ビットストリームは、HDD、SSD、フラッシュメモリ、光ディスク等のコンピュータ等で読み解き可能な記録媒体に記録して提供しても良いし、有線あるいは無線のネットワークを通してサーバから提供しても良い。従って、この画像符号化装置に対応する画像復号装置は、提供手段によらず、この特定のデータフォーマットの符号化ビットストリームを復号することができる。
画像符号化装置と画像復号装置の間で符号化ビットストリームをやりとりするために、有線または無線のネットワークが用いられる場合、通信路の伝送形態に適したデータ形式に符号化ビットストリームを変換して伝送してもよい。その場合、画像符号化装置が出力する符号化ビットストリームを通信路の伝送形態に適したデータ形式の符号化データに変換してネットワークに送信する送信装置と、ネットワークから符号化データを受信して符号化ビットストリームに復元して画像復号装置に供給する受信装置とが設けられる。 送信装置は、画像符号化装置が出力する符号化ビットストリームをバッファするメモリと、符号化ビットストリームをパケット化するパケット処理部と、ネットワークを介してパケット化された符号化データを送信する送信部とを含む。受信装置は、ネットワークを介してパケット化された符号化データを受信する受信部と、受信された符号化データをバッファするメモリと、符号化データをパケット処理して符号化ビットストリームを生成し、画像復号装置に提供するパケット処理部とを含む。
画像符号化装置と画像復号装置の間で符号化ビットストリームをやりとりするために、有線または無線のネットワークが用いられる場合、送信装置、受信装置に加え、さらに、送信装置が送信する符号化データを受信し、受信装置に供給する中継装置が設けられても良い。中継装置は、送信装置が送信するパケット化された符号化データを受信する受信部と、受信された符号化データをバッファするメモリと、パケットされた符号化データとネットワークに送信する送信部とを含む。さらに、中継装置は、パケット化された符号化データをパケット処理して符号化ビットストリームを生成する受信パケット処理部と、符号化ビットストリームを蓄積する記録媒体と、符号化ビットストリームをパケット化する送信パケット処理部を含んでも良い。
また、画像復号装置で復号された画像を表示する表示部を構成に追加することで、表示装置としても良い。その場合、表示部は、復号画像信号重畳部207により生成され、復号画像メモリ208に格納された復号画像信号を読み出して画面に表示する。
また、撮像部を構成に追加し、撮像した画像を画像符号化装置に入力することで、撮像装置としても良い。その場合、撮像部は、撮像した画像信号をブロック分割部101に入力する。
図69に、本願の符号化復号装置のハードウェア構成の一例を示す。符号化復号装置は、本発明の実施の形態に係る画像符号化装置、および画像復号装置の構成を包含する。係る符号化復号装置9000は、CPU9001、コーデックIC9002、I/Oインターフェース9003、メモリ9004、光学ディスクドライブ9005、ネットワークインターフェース9006、ビデオインターフェース9009を有し、各部はバス9010により接続される。
画像符号化部9007と画像復号部9008は、典型的にはコーデックIC9002として実装される。本発明の実施の形態に係る画像符号化装置の画像符号化処理は、画像符号化部9007により実行され、本発明の実施の形態に係る画像復号装置における画像復号処理は、画像符号化部9007により実行される。I/Oインターフェース9003は、例えばUSBインターフェースにより実現され、外部のキーボード9104、マウス9105等と接続する。CPU9001は、I/Oインターフェース9003を介して入力したユーザー操作に基づき、ユーザーの所望する動作を実行するように符号化復号装置9000を制御する。キーボード9104、マウス9105等によるユーザーの操作としては、符号化、復号のどちらの機能を実行するかの選択、符号化品質の設定、符号化ストリームの入出力先、画像の入出力先等がある。
ユーザーがディスク記録媒体9100に記録された画像を再生する操作を所望する場合、光学ディスクドライブ9005は、挿入されたディスク記録媒体9100から符号化ビットストリームを読出し、読み出した符号化ストリームを、バス9010を介してコーデックIC9002の画像復号部9008に送る。画像復号部9008は入力した符号化ビットストリームに対して本発明の実施の形態に係る画像復号装置における画像復号処理を実行し、復号画像を、ビデオインターフェース9009を介して外部のモニタ9103へ送る。また、符号化復号装置9000は、ネットワークインターフェース9006を有し、ネットワーク9101を介して、外部の配信サーバ9106や、携帯端末9107と接続可能である。ユーザーがディスク記録媒体9100に記録された画像に変えて、配信サーバ9106や携帯端末9107に記録された画像を再生することを所望する場合は、ネットワークインターフェース9006は、入力されたディスク記録媒体9100から符号化ビットストリームを読出すことに変えて、ネットワーク9101より符号化ストリームを取得する。また、ユーザーがメモリ9004に記録された画像を再生することを所望する場合は、メモリ9004に記録された符号化ストリームに対して、本発明の実施の形態に係る画像復号装置における画像復号処理を実行する。
ユーザーが外部のカメラ9102で撮像した画像を符号化しメモリ9004に記録する操作を所望する場合、ビデオインターフェース9009は、カメラ9102から画像を入力し、バス9010を介し、コーデックIC9002の画像符号化部9007に送る。画像符号化部9007は、ビデオインターフェース9009を介して入力した画像に対して本発明の実施の形態に係る画像符号化装置における画像符号化処理を実行し、符号化ビットストリームを作成する。そして符号化ビットストリームを、バス9010を介し、メモリ9004へ送る。ユーザーがメモリ9004に変えて、ディスク記録媒体9100に符号化ストリームを記録することを所望する場合は、光学ディスクドライブ9005は、挿入されたディスク記録媒体9100に対し符号化ストリームの書き出しを行う。
画像符号化装置を有し画像復号装置を有さないハードウェア構成や、画像復号装置を有し画像符号化装置を有さないハードウェア構成を実現することも可能である。そのようなハードウェア構成は、例えばコーデックIC9002が、画像符号化部9007、または画像復号部9008にそれぞれ置き換わることにより実現される。
以上の符号化及び復号に関する処理は、ハードウェアを用いた伝送、蓄積、受信装置として実現しても良いのは勿論のこと、ROM(リード・オンリー・メモリ)やフラッシュメモリ等に記憶されているファームウェアや、コンピュータ等のソフトウェアによって実現しても良い。そのファームウェアプログラム、ソフトウェアプログラムをコンピュータ等で読み取り可能な記録媒体に記録して提供しても良いし、有線あるいは無線のネットワークを通してサーバから提供しても良いし、地上波あるいは衛星ディジタル放送のデータ放送として提供しても良い。
以上、本発明を実施の形態をもとに説明した。実施の形態は例示であり、それらの各構成要素や各処理プロセスの組み合わせにいろいろな変形例が可能なこと、またそうした変形例も本発明の範囲にあることは当業者に理解されるところである。