本明細書で使用される用語は本発明における機能を考慮しながらできるだけ現在広く使用されている一般的な用語を選択したが、これは当分野に携わる技術者の意図、慣例または新たな技術の出現などによって異なり得る。また、特定の場合は出願人が任意に選定した用語もあるが、この場合、該当の発明を実施する形態の部分においてその意味を記載する。よって、本明細書で使用される用語は、単なる用語の名称ではなく、その用語の有する実質的な意味と本明細書全般にわたる内容に基づいて解釈すべきであることを明らかにする。
本開示において、以下の用語は以下のような基準で解釈されるが、記載されていない用語であっても下記趣旨によって解釈される。コーディングは場合によってはエンコーディングまたはデコーディングと解釈され、情報(information)は値(values)、パラメータ(parameter)、係数(coefficients)、成分(elements)などをいずれも含む用語であって、場合によっては意味が異なるように解釈されることがあるため、本開示はこれに限らない。「ユニット」は映像(ピクチャ)処理の基本単位またはピクチャの特定位置を指す意味で使用されており、場合によっては「ブロック」、「パーティション」、または「領域」などの用語と互いに混用して使用されている。また、本明細書において、ユニットはコーディングユニット、予測ユニット、変換ユニットをいずれも含む概念として使用される。
図1は、本開示の一実施例によるビデオ信号エンコーディング装置の概略的なブロック図である。図1を参照すると、本開示のエンコーディング装置100は、大きく変換部110、量子化部115、逆量子化部120、逆変換部125、フィルタリング部130、予測部150、及びエントロピーコーディング部160を含む。
変換部110は、入力されたビデオ信号に対する画素値を変換して変換係数値を獲得する。例えば、離散コサイン変換(Discrete Cosine Transform、DCT)、またはウェーブレット変換(Wavelet Transform)などが使用される。特に、離散コサイン変換は入力されたピクチャ信号を一定サイズのブロックの形態に分けて変換を行う。変換において、変換領域内の値の分布と特性によってコーディング効率が異なり得る。
量子化部115は、変換部110内で出力された変換係数値を量子化する。逆量子化部120では変換係数値を逆量子化し、逆変換部125では逆量子化された変換係数値を利用して元の画素値を復元する。
フィルタリング部130は、復元されがピクチャの品質を改善するための演算を行う。例えば、デブロッキングフィルタ及び適応的ループフィルタなどが含まれる。フィルタリングを経たピクチャは、出力されるか参照ピクチャとして利用するために復号ピクチャバッファ(Decoded Picture Buffer)156に保存される。
コーディング効率を上げるために、ピクチャ信号をそのままコードせず、予測部150で既にコードされた領域を用いてピクチャを予測し、予測されたピクチャに原ピクチャと予測ピクチャ間のレジデュアル値を足して復元ピクチャを取得する方法が用いられる。イントラ予測部152では、現在ピクチャ内で画面内予測を行い、インター予測部154では、復号ピクチャバッファ156に保存された参照ピクチャを用いて現在ピクチャを予測する。イントラ予測部152は、現在ピクチャ内の復元された領域から画面内予測を行い、画面内符号化情報をエントロピーコーディング部160に伝達する。インター予測部154はさらに、モーション推定部154a及びモーション補償部154bを含んで構成されてよい。モーション推定部154aでは、復元された特定領域を参照して現在領域のモーションベクトル値を取得する。モーション推定部154aでは、参照領域の位置情報(参照フレーム、モーションベクトルなど)などをエントロピーコーディング部160に伝達してビットストリームに含まれ得るようにする。モーション推定部154aから伝達されたモーションベクトル値を用いて、モーション補償部154bでは画面間モーション補償を行う。
エントロピーコーディング部160は、量子化された変換係数、画面間符号化情報、画面内符号化情報、及びインター予測部154から入力された参照領域情報などをエントロピーコーディングしてビデオ信号ビットストリームを生成する。ここで、エントロピーコーディング部160では、可変長コーディング(Variable Length Coding、VLC)方式と算術コーディング(arithmetic coding)などが使用される。可変長コーディング(VLC)方式は入力されるシンボルを連続したコードワードに変換するが、コードワードの長さは可変的である。例えば、よく発生するシンボルは短いコードワードで、よく発生しないシンボルは長いコードワードで表現する。可変長コーディング方式として、コンテキスト基盤の適応型可変長コーディング(Context-based Adaptive Variable Length Coding、CAVLC)方式が使用される。算術コーディングは連続したデータシンボルを一つの素数に変換するが、算術コーディングは各シンボルを表現するために必要な最適の素数ビットを得る。算術コーディングとして、コンテキスト基盤の適応型算術符号化(Context-based Adaptive Binary Arithmetic Coding、CABAC)方式が使用される。
前記生成されたビットストリームは、NAL(Network Abstraction Layer)ユニットを基本単位にカプセル化されている。NALユニットは符号化されたスライスセグメントを含むが、前記スライスセグメントは整数個のコーディングツリーユニット(coding tree unit)からなる。ビデオデコーダでビットストリームをデコーディングするためには、まずビットストリームをNALユニット単位に分離した後、分離されたそれぞれのNALユニットをデコーディングすべきである。
図2は、本開示の実施例によるビデオ信号デコーディング装置200の概略的なブロック図である。図2を参照すると、本開示のデコーディング装置200は、大きくエントロピーデコーディング部210、逆量子化部220、逆変換部225、フィルタリング部230、及び予測部250を含む。
エントロピーデコーディング部210は、ビデオ信号ビットストリームをエントロピーデコーディングし、各領域に対する変換係数、動き情報などを抽出する。逆量子化部220はエントロピーデコーディングされた変換係数を逆量子化し、逆変換部225は逆量子化された変換係数を利用して元の画素値を復元する。
一方、フィルタリング部230は、ピクチャに対するフィルタリングを行って画質を向上させる。ここには、ブロック歪曲現象を減少させるためのデブロッキングフィルタ及び/またはピクチャ全体の歪曲を除去するための適応的ループフィルタなどが含まれる。フィルタリングを経たピクチャは出力されるか、次のフレームに対する参照ピクチャとして利用するために復号ピクチャバッファ(Decoded Picture Buffer)256に保存される。
また、本開示の予測部250はイントラ予測部252とインター予測部254を含み、上述したエントロピーデコーディング部210を介してデコーディングされた符号化タイプ、各領域に対する変換係数、動き情報などを活用して予測ピクチャを復元する。
それに関連して、前記イントラ予測部252では現在ピクチャ内のデコーディングされたサンプルから画面内予測を行う。インター予測部254は、複合ピクチャバッファ256に保存されている参照ピクチャ及び動き情報を利用して予測ピクチャを生成する。インター予測部254は、更に動き推定部254a及び動き補償部254bを含んで構成される。動き推定部254aでは、現在ブロックとコーディングに使用する参照ピクチャの参照ブロック間の位置関係を示す動きベクトルを獲得して動き補償部254bに伝達する。
前記イントラ―予測部252またはインター予測部254から出力された予測値、及び逆変換部225から出力された画素値が足されて復元されたビデオフレームが生成される。
以下では、前記エンコーディング装置100とデコーディング装置200の動作において、図3乃至図5を参照してコーディングユニット及び予測ユニットなどを分割する方法について説明する。
コーディングユニットとは、上述したビデオ信号の処理過程において、例えば、画面内(intra)/画面間(inter)予測、変換(transform)、量子化(quantization)、及び/またはエントロピーコーディング(entropy coding)などの過程でピクチャを処理するための基本単位を意味する。一つのピクチャをコーディングするのに使用されるコーディングユニットのサイズは一定ではない。コーディングユニットは四角形を有し、一つのコーディングユニットは更にいくつかのコーディングユニットに分割される。
図3は、コーディングユニットを分割する本開示の一実施例を示す図である。例えば、2N×2Nのサイズを有する一つのコーディングユニットは、更にN×Nのサイズを有する4つのコーディングユニットに分割される。このようなコーディングユニットの分割は再帰的に行われるが、全てのコーディングユニットが同じ形態に分割される必要はない。但し、コーディング及び処理過程における便宜上、最大コーディングユニットのサイズ及び/または最小コーディングユニットのサイズの対する制限があり得る。
一つのコーディングユニットに対して、該当コーディングユニットが分割されるのか否かを示す情報を保存する。図4は、図3に示すコーディングユニットの分割構造をブラッグ値を利用して階層的に示す方法に関する一実施例を示す図である。コーディングユニットの分割可否を示す情報は、該当ユニットが分割されていたら「1」、分割されていなければ「0」の値に割り当てる。図4に示したように、分割可否を示すフラッグの値が1であれば該当ノードに対応するコーディングユニットは更に4つのコーディングユニットに分けられ、0であればそれ以上分けられずに該当コーディングユニットに対する処理プロセスが行われる。
上述したコーディングユニットの構造は再帰的なツリー構造を利用して示される。つまり、一つのピクチャまたは最大サイズのコーディングユニットをルート(root)にして、他のコーディングユニットに分割されるコーディングユニットは分割されたコーディングユニットの個数だけ子(child)ノードを有するようになる。よって、それ以上分割されないコーディングユニットがリーフ(leaf)ノードになる。一つのコーディングユニットに対して正方形の分割のみ可能であるか仮定すれば、一つのコーディングユニットは最大4つの他のコーディングユニットに分割されるため、コーディングユニットを示すツリーはクアッドツリー(Quad tree)状になる。
エンコーダではビデオピクチャの特性(例えば、解像度)によって、またはコーディングの効率を考慮して最適のコーディングユニットのサイズが選択され、それに関する情報またはそれを誘導する情報がビットストリームに含まれる。例えば、最大コーディングユニットのサイズ及びツリーの最大深さが定義される。正方形分割を行う際、コーディングユニットの高さ及び幅は親ノードのコーディングユニットの高さ及び幅の半分になるため、前記のような情報を利用すれば最小コーディングユニットのサイズが求められる。または逆に、最小コーディングユニットのサイズ及びツリーの最大深さを予め定義して利用し、それを利用して最大コーディングユニットのサイズを誘導して利用することもできる。正方形分割において、ユニットのサイズは2の倍数の形態に変化するため、実際のコーディングユニットのサイズは2を底にする対数値で示して伝送効率を上げることができる。
デコーダでは、現在コーディングユニットが分割されているのか否かを示す情報を獲得する。このような情報は特定条件の下でのみ獲得(伝送)されるようにすると効率を上げることができる。例えば、現在コーディングユニットが分割可能な条件は現在位置で現在コーディングユニットのサイズを足したものがピクチャのサイズより小さく、現在ユニットのサイズが予め設定された最小コーディングユニットのサイズより大きい場合であるため、このような場合にのみ現在コーディングユニットが分割されているのかを示す情報を獲得することができる。
もし前記情報がコーディングユニットが分割されていることを示せば、分割されるコーディングユニットのサイズは現在コーディングユニットの半分になり、現在処理位置を基準にして4つの正方形コーディングユニットに分割される。各運渇されたコーディングユニットに対して前記のような処理を繰り返す。
図5は、コーディングユニットを分割する本開示の更なる実施例を示す図である。本開示の更なる実施例によると、上述したクアッドツリー状のコーディングユニットは、水平分割または垂直分割のバイナリーツリー(binary tree)構造に更に分割される。つまり、ルートコーディングユニットに対して正方形のクアッドツリー分割が先に適用され、クアッドツリーのリーフノードで矩形のバイナリーツリー分割が更に適用される。一実施例によると、バイナリーツリー分割は対称的な水平分割または対称的な垂直分割であるが、本開示はこれに限らない。
バイナリーツリー各分割ノードにおいて、分割形態(つまり、水平分割または垂直分割)を指示するフラッグが更にシグナリングされる。一実施例によると、前記フラッグ値が「0」であれば水平分割が指示され、前記フラッグ値が「1」であれば垂直分割が指示される。
但し、本開示の実施例において、コーディングユニットの分割方法は上述した方法に限らず、非対称的な水平/垂直分割、3つの矩形コーディングユニットに分割されるトリプルツリー(triple tree)などが適用されてもよい。
コーディングのためのピクチャ予測(動き補償)はそれ以上分けられないコーディングユニット(つまり、コーディングユニットツリーのリーフノード)を対象に行われる。このような予測を行う基本単位を、以下では予測ユニット(prediction unit)または予測ブロック(prediction block)という。
以下、本明細書で使用されるユニットという用語は、予測を行う基本単位である前記予測ユニットを代替する用語として使用される。但し、本開示はこれに限らず、より広い意味では、前記コーディングユニットを含む概念として理解される。
デコーディングが行われる現在ユニットを復元するために、現在ユニットが含まれている現在ピクチャまたは他のピクチャがデコーディングされた部分がが利用される。復元に現在ピクチャのみを利用する、つまり、画面内予測のみを行うピクチャ(スライス)をイントラピクチャまたはIピクチャ(スライス)、画面内予測と画面間予測をいずれも行うことができるピクチャ(スライス)をインターピクチャ(スライス)という。インターピクチャ(スライス)のうち各ユニットを予測するために最大一つの動きベクトル及び参照インデックス(reference index)を利用するピクチャ(スライス)を予測ピクチャ(predictive picture)またはPピクチャ(スライス)といい、最大2つのモーションベクトル及び参照インデックスを利用するピクチャ(スライス)を双予測ピクチャ(Bi-predictive picture)またはBピクチャ(スライス)という。
イントラ予測部では、現在ピクチャ内の復元された領域から対象ユニットのピクセル値を予測する画面内予測(intra prediction)を行う。例えば、現在ユニットを中心に、左側及び/または上端に位置するユニットの復元されたピクセルから現在ユニットピクセル値を予測する。この際、現在ユニットの左側に位置するユニットは現在ユニットに隣接した左側ユニット、左側上端ユニット、及び左側下端ユニットを含む。また、現在ユニットの上端に位置するユニットは現在ユニットに隣接した上端ユニット、左側上端ユニット、及び右側上端ユニットを含む。
一方、インター予測部では、現在ピクチャではない復元された他のピクチャの情報を利用して対象ユニットのピクセル値を予測する画面間予測(inter prediction)を行う。この際、予測に利用されるピクチャを参照ピクチャ(reference picture)という。画面間予測過程において、現在ユニットを予測するのにどの参照領域を利用するのかは、該当参照領域が含まれている参照ピクチャを示すインデックス及び動きベクトル(motion vector)情報などを利用して示す。
画面間予測には、L0予測、L1予測、及び双予測(Bi-prediction)がある。L0予測は、L0(第0参照ピクチャリスト)に含まれている一つの参照ピクチャを利用した予測であり、L1予測はL1(第1参照ピクチャリスト)に含まれている一つの参照ピクチャを利用した予測を意味する。そのためには、1セットの動き情報(例えば、動きベクトル及び参照ピクチャインデックス)が必要である。双予測方式では最大2つの参照領域を利用するが、この2つの参照領域は同じ参照ピクチャに存在してもよく、互いに異なるピクチャにそれぞれ存在してもよい。つまり、双予測方式では最大2セットの動き情報(例えば、動きベクトル及び参照ピクチャインデックス)が利用されるが、2つの動きベクトルが同じ参照ピクチャインデックスに対応してもよく、互いに異なる参照ピクチャインデックスに対応してもよい。この際、参照ピクチャは時間的に現在ピクチャの以前や以降両方に表示(または出力)される。
動きベクトル及び参照ピクチャインデックスを利用して現在ユニットの参照ユニットを獲得する。前記参照ユニットは、参照ピクチャインデックスを有する参照ピクチャ内に存在する。また、前記動きベクトルによって特定されたユニットのピクセル値または補間(interpolation)された値が現在ユニットの予測値(predictor)として利用される。サブペル(sub-pel)単位のピクセル正確度を有する動き予測のために、例えば、輝度信号に対して8-タブ補間フィルタが、色差信号に対して4-タブ補間フィルタが使用される。但し、サブペル単位の動き予測のための補間フィルタはこれに限らない。このように、動き情報を利用して、以前デコーディングされたピクチャから現在ユニットのテクスチャを予測する動き補償(motion compensation)が行われる。
以下、図6及び図7を参照して、本開示の実施例による画面内予測方法をより詳しく説明する。上述したように、イントラ予測部は、現在ユニットの左側及び/または上端に位置する隣接ピクセルを参照ピクセルとして利用して、現在ユニットのピクセル値を予測する。
図6に示したように、現在ユニットのサイズがN×Nであれば、現在ユニットの左側及び/または上端に位置する最大4N+1子の隣接ピクセルを使用して参照ピクセルが設定される。参照ピクセルとして使用される少なくとも一部の隣接ピクセルがまだ復元されていなければ、イントラ予測部は予め設定された規則による参照サンプルのパッディング過程を行って参照ピクセルを獲得する。また、イントラ予測部は、画面内予測の誤差を減らすために参照サンプルフィルタリング過程を行う。つまり、隣接ピクセル及び/または参照サンプルパッディング過程によって獲得されたピクセルにフィルタリングを行って参照ピクセルを獲得する。イントラ予測部は、このように獲得された参照ピクセルを利用して現在ユニットのピクセルを予測する。
図7は、画面内予測に使用される予測モードの一実施例を示す図である。画面内予測のために、画面内予測方向を指示する画面内予測モード情報がシグナリングされる。現在ユニットが画面内予測ユニットであれば、ビデオ信号デコーディング装置はビットストリームから現在ユニットの画面内予測モード情報を抽出する。ビデオ信号デコーディング装置のイントラ予測部は、抽出された画面内予測モード情報に基づいて現在ユニットに対する画面内予測を行う。
本開示の一実施例によると、画面内予測モードは計67個のモードを含む。それぞれの画面内予測モードは、予め設定されたインデックス(つまり、イントラモードインデックス)によって指示される。例えば、図7に示したようにイントラモードインデックス0は平面(planar)モードを指示し、イントラモードインデックス1はDCモードを指示し、イントラモードインデックス2~66は互いに異なる方向モード(つまり、角度モード)をそれぞれ指示する。画面内予測部は現在ユニットの画面内予測モード情報に基づいて、現在ユニットの画面内予測に使用される参照ピクセル及び/または補間された参照ピクセルを決定する。イントラモードインデックスが特定方向モードを指示すれば、現在ユニットの現在ピクセルから前記特定方向に対応する参照ピクセルまたは補間された参照ピクセルが現在ピクセルの予測に使用される。よって、画面内予測モードに応じて互いに異なるセットの参照ピクセル及び/または補完された参照ピクセルが画面内予測に使用される。
参照ピクセル及び画面内予測モード情報を利用して現在ブロックの画面内予測が行われた後、ビデオ信号デコーディング装置は逆変換部から獲得された現在ユニットの残差信号を現在ユニットの画面内予測値に足して、現在ユニットのピクセル値を復元する。
図8は、本開示の一実施例によるinter predictionを示す図である。
上述したように、現在ピクチャまたはブロックをエンコーディング、デコーディングする際に他のピクチャまたはブロックから予測する。つまり、他のピクチャまたはブロックとの類似性をに基づいてエンコーディング、デコーディングすることができる。他のピクチャまたはブロックと類似した部分を現在ピクチャまたはブロックでは省略したシグナリングでエンコーディング、デコーディングできるが、それについては以下で更に説明する。ブロック単位の予測をすることができる。
図8を参照すると、左側にReference picture(参照ピクチャ)があり、右側にCurrent picture(現在ピクチャ)があるが、current pictureまたはcurrent pictureの一部を参照ピクチャ(reference picture)またはreference pictureの一部との類似性を利用して予測する。図8のcurrent pictureの中に実線で示した四角形が現在エンコーディング、デコーディングするブロックとすると、reference pictureの点線で示した四角形から現在ブロックを予測する。この際、現在ブロックが参照すべきブロック(参照ブロック)を指示する情報が存在するが、これは直接シグナリングされてもよく、シグナリングオーバーヘッドを減らすためにある約束によって作り出すこともできる。前記現在ブロックが参照すべきブロックを指示する情報は動きベクトル(motion vector)を含む。これは現在ブロックと参照ブロックとの間のピクチャ内における相対的な位置を示すベクトルである。図8を参照すると、reference pictureの点線で示した部分が存在するが、現在ブロックがどのように移動すればreference pictureの参照すべきブロックに移動できるのかを示すベクトルが動きベクトルである。つまり、現在ブロックを動きベクトルに応じて動かしたら出るブロックは図8のcurrent pictureに点線で示した部分であるが、この点線で示した部分はcurrent picture内での位置がreference pictureの参照ブロックの位置と同じである。
また、前記現在ブロックが参照すべきブロックを指示する情報は参照ピクチャ(reference picture)を示す情報を含む。参照ピクチャを示す情報を参照ピクチャリスト(reference picture list)と参照ピクチャインデックス(reference picture index)を含む。参照ピクチャリストは参照ピクチャら(reference pictures)を含むリストであり、参照ピクチャリストに含まれている参照ピクチャから参照ブロックを使用することができる。つまり、参照ピクチャリストに含まれている参照ピクチャから現在ブロックを予測することができる。また、参照ピクチャインデックス(reference picture index)は使用する参照ピクチャ(reference picture)を指示するためのインデックスである。
図9は、本開示の一実施例による動きベクトルシグナリング方法を示す図である。
本開示の一実施例によると、動きベクトル(motion vector;MV)はmotion vector predictor(MVP;動きベクトル予測子)に基づいて生成する。例えば、以下のようにmotion vector predictorがmotion vectorとなる。
MV=MVP、他の例を挙げると、例えば、以下のようにmotion vectorはmotion vector difference(MVD)に基づく。motion vector predictorに正確なmotion vectorを示すために、motion vector difference(MVD;動きベクトル差分)を足す。
MV=MVP+MVD、また、ビデオコーディングにおいて、エンコーダで決定したmotion vector情報をデコーダに伝送し、デコーダは受信したmotion vector情報からmotion vectorを生成して予測ブロックを決定する。例えば、前記motion vector情報はmotion vector predictor(動きベクトル予測子)に関する情報、motion vector difference(動きベクトル差分)を含む。この際、モードによって前記motion vector情報の構成要素が異なり得る。例えば、merge modeでは前記motion vector情報はmotion vector predictor(動きベクトル予測子)に関する情報を含み、motion vector difference(動きベクトル差分)は含まない。他の例として、AMVP(advanced motion vector prediction)modeでは前記motion vector情報はmotion vector predictor(動きベクトル予測子)に関する情報を含み、motion vector difference(動きベクトル差分)を含む。
Motion vector predictor(動きベクトル予測子)に関する情報を決定、送信、受信するために、エンコーダとデコーダは同じ方法でMVP candidate(動きベクトル予測子候補子)を生成する。例えば、エンコーダとデコーダは同じ順に同じMVP candidate(動きベクトル予測子候補子)を生成する。そして、エンコーダは生成したMVP candidates(動きベクトル予測子候補子ら)のうちから決定したMVP(動きベクトル予測子)を示すインデックス(mvp_lx_flag)をデコーダに伝送し、デコーダはこのインデックス(mvp_lx_flag)に基づいて決定されたMVP(動きベクトル予測子)及びMVを割り出す。インデックス(mvp_lx_flag)は、第0参照ピクチャリスト(list 0)の動きベクトル予測子インデックス(mvp_l0_flag)及び第1参照ピクチャリスト(list 1)の動きベクトル予測子インデックス(mvp_l1_flag)を含む。インデックス(mvp_lx_flag)を受信する方法については図56乃至図59で説明する。
MVP candidate及びMVP candidateの生成方法は、spatial candidate、temporal candidateなどを含む。Spatial candidateは、現在ブロックから一定位置にあるブロックに対するmotion vectorである。例えば、現在ブロックと隣接するか隣接しないブロックや位置に当たるmotion vectorである。Temporal candidateは、現在ブロックとは異なるピクチャ内のブロックに当たるmotion vectorである。または、MVP candidateはaffine motion vector、ATMVP、STMVP、上述したmotion vectorらのcombination、上述したmotion vectorらの平均vector、zero motion vectorなどを含む。
また、上述した参照ピクチャ(reference picture)を示す情報もエンコーダからデコーダに伝送される。また、MVP candidateに当たる参照ピクチャが参照ピクチャを示す情報に当たらなければmotion vector scalingを行う。Motion vector scalingは、現在ピクチャのPOC(picture order count)、現在ブロックの参照ピクチャのPOC、MVP candidateの参照ピクチャのPOC、MVP candidateに基づく計算である。
図10は、本開示の一実施例によるmotion vector difference syntaxを示す図である。
Motion vector difference(動きベクトル差分)は、motion vector differenceのsignとabsolute valueが分けられてコーディングされる。つまり、motion vector differenceのsignとabsolute valueは異なるsyntaxである。また、motion vector differenceのabsolute valueは値が直接コーディングされてもよいが、図10のようにabsolute valueがNより大きいのか否かを示すflagを含んでコーディングされてもよい。もしabsolute valueがNより大きければ、(absolute-N)の値が共にシグナリングされる。図10の例ではabs_mvd_greater0_flagが伝送されるが、このflagはabsolute valueが0より大きいのかを示すflagである。もしabsolute valueが0より大きくないとabs_mvd_greater0_flagが示されれば、absolute valueが0であると決定する。また、もしabsolute valueが0より大きいとabs_mvd_greater0_flagが示されれば、追加のsyntaxが存在する可能性がある。例えば、abs_mvd_greater1_flagが存在するが、このflagはabsolute valueが1より大きいのかを示すflagである。もしabsolute valueが1より大きくないとabs_mvd_greater1_flagが示されれば、absolute valueが1であると決定する。もしabsolute valueが1より大きいとabs_mvd_greater1_flagが示されれば、追加のsyntaxが存在する可能性がある。例えば、abs_mvd_minus2が存在するが、これは(absolute value-2)の値である。上述したabs_mvd_greater0_flag、abs_mvd_greater1_flagを介してabsolute valueが1より大きいと(2以上であると)決定されたため、(absolute value-2)を示すのである。abs_mvd_minus2がvriable lengthにbinarizationされる場合、より少ないビットでシグナリングするためである。例えば、Exp-Golomb、truncated unary、truncated Riceなどのvriable lengthであるbinarization方法が存在する。また、mvd_sign_flagはmotion vector differenceのsignを示すflagである。
この実施例において、コーディング方法をmotion vector differenceを介して説明したが、motion vector difference以外の情報もsignとabsolute valueに関して分けて、absolute valueはabsolute valueがある値より大きいのか否かを示すflagと、absolute valueから前記ある値を引いた値にコーディングすることができる。また、図10において、[0]と[1]はcomponent indexを示す。例えば、x-component、y-componentを示す。
図11は、本開示の一実施例によるadaptive motion vector resolution(適応的な動きベクトル解像度)のシグナリングを示す図である。
本開示の一実施例によると、motion vector(動きベクトル)またはmotion vector difference(動きベクトル差分)を示すresolution(解像度)は多様である。言い換えれば、motion vectorまたはmotion vector differenceがコーディングされるresolutionは多様である。例えば、resolutionはpixel(pel)に基づいて示される。例えば、1/4(quarter)、1/2(half)、1(integer)、2、4pixelなどの単位でmotion vectorまたはmotion vector differenceをシグナリングする。例えば、16を示したい場合、1/4単位にすると64にコーディングされ(1/4*64=16)、1単位にすると16にコーディングされ(1*16=16)、4単位にすると4にコーディングされる(4*4=16)。つまり、以下のように値を定義する。
valueDetermined=resolution*valuePerResolution
ここで、valueDeterminedは伝達する値であって、本実施例ではmotion vector(動きベクトル)またはmotion vector difference(動きベクトル差分)である。また、valuePerResolutionはvalueDeterminedを[/resolution]単位で示す値である。
この際、motion vectorまたはmotion vector differenceでシグナリングする値がresolutionで割り切れない場合、roundingなどでprediction性能が最もよいmotion vectorまたはmotion vector differenceではない不正確な値を送る。High reeolutionを使用すれば不正確度が下がるが、コーディングされる値が大きいため多くのビットを使用するようになり、low reeolutionを使用すれば不正確度が上がるが、コーディングされる値が小さいため少ないビットを使用するようになる。
また、前記resolutionをブロック、CU、sliceなどの単位で異なるように設定することができる。よって、単位に合わせてadaptiveにresolutionを適用することができる。
前記resolutionはエンコーダからデコーダにシグナリングされる。この際、resolutionに対するシグナリングは上述したvariable lengthにbinarizationしたシグナリングである。このような場合、最も小さい値(最も前にある値)に当たるインデックスでシグナリングすれば、シグナリングオーバーヘッドが少なくなる。
一実施例として、high reeolution(詳しくシグナリング)からlow resolutionの順にシグナリングインデックスにマッチングさせる。
図11は、3つのresolutionに対するシグナリングを示している。このような場合、3つのシグナリングは0、10、11であり、3つのシグナリングそれぞれがresolution 1、resolution 2、resolution 3に当たる。resolution 1をシグナリングするには1ビットが必要であり、残りのresolutionをシグナリングするのに2ビットが必要であるため、resolution 1をシグナリングする際にシグナリングオーバーヘッド少ない。図11の例ではresolution 1、resolution2、resolution 3がそれぞれ1/4、1、4pelである。
以下の開示において、motion vector resolutionはmotion vector differenceのresolutionを意味する。
図12は、本開示の一実施例によるadaptive motion vector resolutionのシグナリングを示す図である。
図11で説明したように、resolution(解像度)をシグナリングするのに必要なビット数がresolution(解像度)によって異なり得るため、状況に合わせてシグナリング方法を変更する。例えば、あるresolutionをシグナリングするシグナリング値が状況によって異なり得る。例えば、シグナリングインデックスとresolutionを状況によって異なる順にマッチングさせる。例えば、シグナリング0、10、110、…に当たるresolutionがある状況ではそれぞれresolution 1、resolution2、resolution 3、…であり、他の状況ではそれぞれresolution 1、resolution2、resolution 3、…ではなく他の順である。また、2つ以上の状況を定義することができる。
図12を参照すると、0、10、11に当たるresolutionがCase 1ではそれぞれresolution 1、resolution 2、resolution3であり、Case 2ではそれぞれresolution 2、resolution 1、resolution3である。この際、Caseは2つ以上である。
図13は、本開示の一実施例によるadaptive motion vector resolutionのシグナリングを示す図である。
図12で説明したように、motion vector resolutionを状況によって異なるようにシグナリングする。例えば、1/4、1、4pelのresolutionが存在するとしたら、ある状況では図11で説明したようなシグナリングを使用し、ある状況では図13(a)または図13(b)のようなシグナリングを使用する。図11、図13(a)、図13(b)の2つの場合のみ存在するか、3つがいずれも存在してもよい。よって、ある状況では最も高いresolutionではないresolutionを少ないビットでシグナリングすることができる。
図14は、本開示の一実施例によるadaptive motion vector resolutionのシグナリングを示す図である。
本開示の一実施例によると、図11で説明したadaptive motion vector resolution(適応的な動きベクトル解像度)において、状況によって可能なresolutionが変わり得る。例えば、resolution値が状況によって変わり得る。一実施例として、ある状況ではresolution 1、resolution 2、resolution 3、resolution 4、…のうちから使用し、ある状況ではresolution A、resolution B、resolution C、resolution D、…のうちから使用する。また、{resolution 1、resolution 2、resolution 3、resolution 4、…}と{resolution A、resolution B、resolution C、resolution D、…}には空集合ではなく積集合がある可能性がある。つまり、あるresolution値は2つ以上の状況で使用するが、前記2つ以上の状況は使用可能なresolution値のsetが異なり得る。また、状況別に使用可能なresolution値の個数が異なり得る。
図14を参照すると、Case 1ではresolution 1、resolution 2、resolution 3を使用し、Case 2ではresolution A、resolution B、resolution Cを使用する。例えば、resolution 1、resolution 2、resolution 3は1/4、1、4pelである。また、例えば、resolution A、resolution B、resolution Cは1/4、1/2、1pelである。
図15は、本開示の一実施例によるadaptive motion vector resolutionのシグナリングを示す図である。
図15を参照すると、motion vector candidate(動きベクトル候補)またはmotion vector predictor candidate(動きベクトル予測子候補)によってresolution(解像度)シグナリングを異ならせる。例えば、図12乃至図14で説明した状況(case)が選択されるか、シグナリングされたmotion vectorやmotion vector predictorがどのcandidateであるのかに関する。シグナリングを異ならせる方法は、図12乃至図14の方法による。
例えば、candidate(候補)のうちどの位置にあるのかによって状況を異ならせて定義する。または、candidate(候補)がどのように作られたのかによって状況を異ならせて定義する。
エンコーダまたはデコーダは、少なくとも一つのMV candidate(動きベクトル候補)または少なくとも一つのMVP candidate(動きベクトル予測子候補)を含むcandidate list(候補リスト)を生成する。MV candidate(動きベクトル候補)またはMVP candidate(動きベクトル予測子候補)に対するcandidate list(候補リスト)で前にあるMVP(動きベクトル予測子)は正確度が高く、candidate list(候補リスト)で後ろにあるMVP(動きベクトル予測子)は正確度が低い傾向がある。これは、candidate list(候補リスト)の前にあるものはより少ないビットでシグナリングして、candidate list(候補リスト)の前にあるMVP(動きベクトル予測子)がより正確度が高いように設計した可能性もある。本開示の一実施例において、MVP(動きベクトル予測子)の正確度が高ければ予測性能のよいmotion vector(動きベクトル)を示すためのMVD(動きベクトル差分)値が小さく、MVP(動きベクトル予測子)の正確度が低ければ予測性能のよいmotion vector(動きベクトル)を示すためのMVD(動きベクトル差分)値が大きい。よって、MVP(動きベクトル予測子)の正確度が低ければ、low resolution(低い解像度)でシグナリングしてmotion vector difference(動きベクトル差分)値を示すのに必要なビット(例えば、difference値をresolutionに基づいて示す値)を減らすことができる。
このような原理でMVP(動きベクトル予測子)の正確度が低い際にlow resolution(低い解像度)を使用することができるため、本開示の一実施例によると、MVP candidate(動きベクトル予測子候補)によって最もhigh reeolution(高い解像度)ではなく、resolutionが最も少ないビットでシグナリングすることを約束することができる。例えば、1/4、1、4pelが可能なresolutionであれば、1または4を最も少ないビット(1-bit)にシグナリングする。図15を参照すると、Candidate 1、Candidate 2に対してはhigh resolutionである1/4pelを最も少ないビットでシグナリングし、Candidate 1、Candidate 2より後ろにあるCandidate Nに対しては1/4pelではないresolutionを最も少ないビットでシグナリングしている。
図16は、本開示の一実施例によるadaptive motion vector resolutionのシグナリングを示す図である。
図15で説明したように、決定されたmotion vector(動きベクトル)またはmotion vector predictor(動きベクトル予測子)がどのcandidate(候補)であるのかによって、motion vector resolution(動きベクトル解像度)を異ならせる。シグナリングを異ならせる方法は、図12乃至図14の方法による。
図16を参照すると、あるcandidate(候補)に対してはhigh resolution(高い解像度)を最も少ないビットでシグナリングし、あるcandidate(候補)に対してはhigh resolution(高い解像度)ではないresolution(解像度)を最も少ないビットでシグナリングしている。例えば、high resolution(高い解像度)ではないresolution(解像度)を最も少ないビットでシグナリングするcandidate(候補)は不正確なcandidate(候補)である。例えば、high resolution(高い解像度)ではいresolution(解像度)を最も少ないビットでシグナリングするcandidate(候補)は、temporal candidate、zero motion vector、non-adjacent spatial candidate、refinement過程あるのか否かによるcandidateなどである。
Temporal Candidateは他のピクチャからのmotion vectorである。Zero motion vectorはvector成分がいずれも0であるmotion vectorである。Non-adjacent spatial candidateは現在ブロックと隣接しない位置から参照したmotion vectorである。Refinement(改善)過程はmotion vector predictor(動きベクトル予測子)をrefineする過程であり、例えば、template matching、bilateral matchingなどを介してrefineする。
本開示の一実施例によるとmotion vector predictor(動きベクトル予測子)をrefineした後、motion vector difference(動きベクトル差分)を足す。これはmotion vector predictor(動きベクトル予測子)を正確にしてmotion vector difference(動きベクトル差分)値を減らすためである。このような場合、refinement(改善)過程がないcandidate(候補)に対してmotion vector resolution(動きベクトル解像度)シグナリングを異ならせる。例えば、最もhigh resolution(高い解像度)ではないresolution(解像度)を最も少ないビットでシグナリングする。
他の実施例によると、motion vector predictor(動きベクトル予測子)にmotion vector difference(動きベクトル差分)を足した後、refinement(改善)過程を行う。この際、refinement(改善)過程があるcandidateに対してmotion vector resolution(動きベクトル解像度)シグナリングを異ならせる。例えば、最もhigh resolution(高い解像度)ではないresolution(解像度)を最も少ないビットでシグナリングする。これはmotion vector difference(動きベクトル差分)を足した後でrefinement(改善)過程が行われるため、MV difference(動きベクトル差分)を最大限正確に(予測誤差が少ないように)シグナリングしなくても、refinement(改善)過程を介して誤差を減らすことができるためである。
また他の例として、選択されたcandidate(候補)が他のcandidate(候補)と一定以上値が異なれば、motion vector resolution(動きベクトル解像度)シグナリングをを変更する。
更に他の例として、決定されたmotion vector(動きベクトル)またはmotion vector predictor(動きベクトル予測子)がどのcandidate(候補)であるのかによって、行われるmotion vector refinement(動きベクトル改善)過程を異ならせる。Motion vector refinement(動きベクトル改善)過程は、より正確なmotion vector(動きベクトル)を見つけるための過程である。例えば、基準点から決められた約束によって現在ブロックとmatching(マッチング)するブロックを見つける過程である(例えば、template matchingまたはbilateral matching)。基準点は決定されたmotion vector(動きベクトル)またはmotion vector predictor(動きベクトル予測子)に当たる位置である。この際、決められた約束によって基準点から動く程度が異なり得るが、motion vector refinement(動きベクトル改善)過程を異ならせるということは、基準点から動く程度を異ならせるということである。例えば、正確なcandidate(候補)に対しては詳しいrefinement(改善)過程から始まり、不正確なcandidate(候補)に対してはそれより詳しくないrefinement(改善)過程から始まる。正確で、不正確なcandidate(候補)はcandidate list(候補リスト)における位置、またはどの方式でcandidate(候補)が生成されたのかなどによって決定される。どのような方式でcandidate(候補)が生成されたのかは、spatial candidateをどの位置から持ってきたのかである。また、それについては図16の説明を参照する。また、詳細で、それより詳細ではないrefinement(改善)はmatching(マッチング)するブロックを基準点から少しずつ動かしながら見つけるのか、多く動かしながら見つけるのかである。また、大きく動かしながら見つける場合、多く動かしながら見つけた最もmatching(マッチング)するブロックから更に少しずつ動かしながら見つける過程を追加する。
更に他の実施例として、現在ピクチャのPOC及びmotion vectorまたはmotion vector predictor candidateのreference pictureのPOCに基づいてmotion vector resolutionシグナリングを変更する。シグナリングを異ならせる方法は、図12乃至図14の方法による。
例えば、現在ピクチャのPOC(picture order count)とmotion vector(動きベクトル)またはmotion vector predictor candidate(動きベクトル予測子候補)のreference picture(参照ピクチャ)のPOCの差が大きければ、motion vector(動きベクトル)またはmotion vector predictor(動きベクトル予測子)が不正確な可能性があり、high resolutionではないresolutionを最も少ないビットでシグナリングする。
更に他の例として、motion vector scaling(動きベクトルスケーリング)をすべきであるのかに基づいてmotion vector resolution(動きベクトル解像度)シグナリングを変更する。例えば、選択したmotion vector(動きベクトル)またはmotion vector predictor(動きベクトル予測子)がmotion vector scaling(動きベクトルスケーリング)を行うcandidateであれば、high resolutionではないresolutionを最も少ないビットでシグナリングする。Motion vector scaling(動きベクトルスケーリング)を行う場合は、現在ブロックに対するreference picture(参照ピクチャ)と参照したcandidate(候補)のreference picture(参照ピクチャ)が異なる場合である。
図17は、本開示の一実施例によるaffine motion predictionを示す図である。
図8で説明したような従来の予測方法では、現在ブロックが回転やスケーリングなしに単に移動した位置からのブロックから予測する。現在ブロックと同じサイズや形状、角度の参照ブロックから予測する。図8は、単にtranslation motion modelなのである。しかし、実際の映像に含まれているコンテンツはより複雑な動きを有し、多様な模様から予測すれば予測性能が更に向上される。
図17を参照すると、current picture(現在ピクチャ)に現在予測するブロックを実線で示している。現在予測するブロックとは異なる形状、サイズ、角度のブロックを参照して現在ブロックを予測し、参照ブロックをreference picture(参照ピクチャ)に点線で示している。参照ブロックのピクチャ内における位置と同じ位置をcurrent pictureに点線で示している。この際、参照ブロックは現在ブロックにaffine transformationで示されるブロックである。それによってstretching(scaling)、rotation、shearing、reflection、orthogonal projectionなどを示すことができる。
Affine motion(アフィン動き)、affine transformation(アフィン変換)を示すparameterの個数は多様であり、より多くのparameterを使用したらより少ないparameterを使用する際より更に多様なmotionを示すことができるが、signalingや計算などでオーバーヘッドが発生する可能性がある。
例えば、6つのparameterによってaffine transformationが示される。または、3つのcontrol point motion vectorsによってaffine transformationが示される。
図18は、本開示の一実施例によるaffine motion predictionを示す図である。
図17のように、affine transformation(アフィン変換)を利用して複雑な動きを表現することができるが、そのためのシグナリングオーバーヘッド及び演算を減らすためにより簡単なaffine motion prediction(アフィン動き予測)またはaffine transformation(アフィン変換)を使用する。動いを制限することでより簡単なaffine motion prediction(アフィン動き予測)をすることができる。動きを制限したら、現在ブロックが参照ブロックに変形される形状が制限される。
図18を参照すると、v0、v1のcontrol point motion vectors(コントロールポイント動きベクトルら)を利用してaffine motion prediction(アフィン動き予測)を行う。v0、v1の2つのvectorsを使用することは、4つのparametersを使用することと同じである。前記v0、v1の2つのvectorsまたは4つのparametersで現在ブロックがどの形状の参照ブロックから予測するのかを示す。このような簡単なaffine transformationを使用することで、ブロックのrotation、scaling(zoom in/out)の動きを示すことができる。図18を参照すると、実線で示した現在ブロックはreference picture(参照ピクチャ)において図18の点線で示した位置から予測する。Affine transformationを介して現在ブロックの各point(pixel)が他のpointにマッピングされる。
図19は、本開示の一実施例によるmotion vector field(動きベクトルフィールド)を示す式である。図18のcontrol point motion vector(コントロールポイント動きベクトル)v0は、(v_0x,v_0y)であり、top-left corner control pointのmotion vectorである。また、control point motion vector v1は、(v_1x,v_1y)であり、top-right corner control pointのmotion vectorである。この際、(x,y)位置のmotion vector(v_x,v_y)は図19のようである。よって、各pixelの位置またはある位置に対するmotion vectorを図19の式によって推定し、これはv0、v1に基づいている。
また、図19の数式において、(x,y)はblock(ブロック)内での相対的な座標である。例えば、(x,y)はblock(ブロック)のleft top位置を(0,0)とした際の位置である。
もしv0がピクチャ上で位置(x0,y0)に対するcontrol point motion vector(コントロールポイント動きベクトル)で、v1がピクチャ上で位置(x1,y1)に対するcontrol point motion vector(コントロールポイント動きベクトル)であれば、block(ブロック)内での位置(x,y)をv0、v1の位置と同じ座標を使用して示すには、図19の数式でxとyをそれぞれ(x-x0,y-y0)に変更して示す。また、w(blockのwidth)は(x1-x0)である。
図20は、本開示の一実施例によるaffine motion predictionを示す図である。
本開示の一実施例によると、多数のcontrol point motion vector(コントロールポイント動きベクトル)または多数のparameterを使用してaffine motion(アフィン動き)を示す。
図20を参照すると、v0、v1、v2のcontrol point motion vector(コントロールポイント動きベクトル)を利用してaffine motion prediction(アフィン動き予測)を行う。v0、v1、v2の3つのvectorsを使用することは、6つのparametersを使用することと同じである。前記v0、v1、v2の3つのvectorsまたは6つのparametersで現在ブロックがどの形状の参照ブロックから予測するのかを示す。図20を参照すると、実線で示した現在ブロックはreference pictureにおいて図20の点線で示した位置から予測する。affine transformationを介して現在ブロックの各point(pixel)が他のpointにマッピングされる。
図21は、本開示の一実施例によるmotion vector fieldを示す式である。図20において、control point motion vector(コントロールポイント動きベクトル)v0が(mv_0^x,mv_0^y)でtop-left corner control pointのmotion vectorであり、control point motion vector(コントロールポイント動きベクトル)v1が(mv_1^x,mv_1^y)でtop-right corner control pointのmotion vectorであり、control point motion vector(コントロールポイント動きベクトル)v2が(mv_2^x,mv_2^y)でbottom-left corner control pointのmotion vectorである。この際、(x,y)位置のmotion vector(動きベクトル)(mv^x,mv^y)は図21のようである。よって、各pixelの位置またはある位置に対するmotion vectorを図21の式によって推定し、これはv0、v1、v2に基づいている。
また、図21の数式において、(x,y)はblock(ブロック)内での相対的な座標である。例えば、(x,y)はblock(ブロック)のleft top位置を(0,0)とした際の位置である。よって、もしv0が位置(x0,y0)に対するcontrol point motion vector(コントロールポイント動きベクトル)で、v1が位置(x1,y1)に対するcontrol point motion vector(コントロールポイント動きベクトル)で、v2が位置(x2,y2)に対するcontrol point motion vector(コントロールポイント動きベクトル)であるとし、(x,y)をv0、v1、v2の位置と同じ座標を使用して示すには、図21の数式でxとyをそれぞれ(x-x0,y-y0)に変更して示す。また、w(blockのwidth)は(x1-x0)で、h(blockのheight)は(y2-y0)である。
図22は、本開示の一実施例によるaffine motion predictionを示す図である。
上述したように、motion vector field(動きベクトルフィールド)が存在し、各pixelに対してmotion vectorを計算するが、より簡単にするために、図22のようにsubblock based(サブブロック基盤)でaffine transformationを行う。例えば、図22(a)の小さい四角形がsubblock(サブブロック)であるが、subblockの代表motion vector(動きベクトル)を作り、そのsubblockのpixelに対して前記代表motion vector(動きベクトル)を利用する。また、図17、図18、図20などで複雑な動きを表現したように、subblockがそのような動きを表現して参照ブロックと対応するか、またはsubblockにtranslation motionのみを適用してより簡単にすることもできる。図22(a)において、v0、v1、v2はcontrol point motion vector(コントロールポイント動きベクトル)である。
この際、subblock(サブブロック)のサイズはM*Nであり、MとNは図22(b)に示したようである。そして、MvPreはmotion fraction accuracy(動きベクトルフラクション正確度)である。また、(v_0x,v_0y)と(v_1x,v_1y)、(v_2x,v_2y)はそれぞれtop-left、top-right、bottom-left control pointのmotion vector(動きベクトル)である。(v_2x,v_2y)は現在ブロックのbottom-left control pointのmotion vectorであるが、例えば、4-parameterの場合、図19の式によって計算したbottom-leftに対するMV(動きベクトル)である。
また、subblockの代表motion vectorを作る際、subblockの中央のサンプル位置を利用して代表motion vectorを計算する。また、subblockのmotion vectorを作る際、normal motion vectorより正確度が高いmotion vectorを使用するが、そのためにmotion compensation interpolation filters(動き補償補間フィルタ)が適用される。
他の実施例として、subblockのサイズが可変的ではなく、特定サイズに固定されていてもよい。例えば、4*4サイズにsubblockのサイズが固定されていてもよい。
図23は、本開示の一実施例によるaffine motion predictionのあるモードを示す図である。
本開示の一実施例によると、affine motion prediction(アフィン動き予測)の一例として、affine inter mode(アフィンインターモード)がある。Affine inter mode(アフィンインターモード)であることを指示するflag(フラッグ)がある。図23を参照すると、v0、v1近くのA、B、C、D、E位置のブロックがあり、各ブロックに当たるmotion vector(動きベクトル)をvA、vB、vC、vD、vEとする。それを利用して以下のようにmotion vector(動きベクトル)またはmotion vector predictor(動きベクトル予測子)に対するcandidate list(候補リスト)を作る。
{(v0,v1)|v0={vA,vB,vC}、v1={vD,vE}}
つまり、vA、vB、vCのうちから選んだv0と、vD、vEのうちから選んだv1で(v0,v1)pairを作る。この際、neighbor block(隣ブロック)のreferenceのPOC(picture order count)とcurrent CU(現在コーディングユニット;現在ブロック)に対するreference(参照)のPOC、current CU(現在コーディングユニット;現在ブロック)のPOCによってmotion vectorをscaling(スケーリング)する。上述したようなmotion vector pairでcandidate list(候補リスト)が作られたら、candidate listのうちどれを選択したのか、選択されたのかをシグナリングすることができる。また、candidate listが十分に埋められていなければ、他のinter prediction(インター予測)のcandidate(候補)で埋めることができる。例えば、AMVP(Advanced Motion Vector Prediction) candidatesを活用して埋めてもよい。また、candidate listから選んだv0、v1をaffine motion prediction(アフィン動き予測)のcontrol point motion vector(コントロールポイント動きベクトル)としてすぐ使用せずに補正するdifference(差分)をシグナリングすることができるが、それによってよりよいcontrol point motion vector(コントロールポイント動きベクトル)を作ることができる。つまり、デコーダではcandidate list(候補リスト)から選んだv0、v1にdifference(差分)を足して作ったv0’、v1’をaffine motion predictionのcontrol point motion vectorとして使用する。
一実施例として、特定サイズ以上のCU(コーディングユニット)に対してaffine inter mode(アフィンインターモード)を使用してもよい。
図24は、本開示の一実施例によるaffine motion predictionのあるモードを示す図である。
本開示の一実施例によると、affine motion prediction(アフィン動き予測)の一例として、affine merge mode(アフィンマージモード)がある。Affine merge mode(アフィンマージモード)であることを指示するflag(フラッグ)がある。Affine merge mode(アフィンマージモード)では、現在ブロックの周辺でaffine motion prediction(アフィン動き予測)を使用した場合、その周辺ブロックのmotion vector(動きベクトル)から現在ブロックのcontrol point motion vector(コントロールポイント動きベクトル)を計算する。例えば、周辺ブロックがaffine motion prediction(アフィン動き予測)を使用したのかを確認する際、candidate(候補)になる周辺ブロックは図24(a)のようである。また、A、B、C、D、Eの順にaffine motion prediction(アフィン動き予測)を使用したのかを確認し、affine motion prediction(アフィン動き予測)を使用したブロックを見つけたら、そのブロックまたはそのブロック周辺のmotion vector(動きベクトル)を使用して現在ブロックのcontrol point motion vector(コントロールポイント動きベクトル)を計算する。A、B、C、D、Eは図24(a)に示したように、それぞれleft、above、above right、left bottom、above leftである。
一実施例として、図24(b)のようにA位置のブロックがaffine motion prediction(アフィン動き予測)を使用した場合、そのブロックまたはそのブロック周辺のmotion vectorを利用してv0、v1を計算する。前記そのブロックまたはそのブロック周辺のmotion vectorはv2、v3、v4である。
一実施例では参照する周辺ブロックの順番が決められている。しかし、特定位置からderive(導出)したcontrol point motion vector(コントロールポイント動きベクトル)が常に性能がよりよいことはない。よって、他の実施例として、ある位置のblockを参照してcontrol point motion vector(コントロールポイント動きベクトル)をderiveするのかをシグナリングする。例えば、control point motion vector derivationのcandidate位置が図24(a)のA、B、C、D、Eの順に決められており、そのうちからどれを参照するのかをシグナリングする。
また他の実施例として、control point motion vector(コントロールポイント動きベクトル)をderiveする際、各control point motion vectorに対して近いblockから持ってきて正確度を上げることができる。例えば、図24を参照すると、v0をderivationする際にはleft blockを参照し、v1をderivationする際にはabove blockを参照する。または、v0をderivationする際にA、D、またはEを参照し、v1をderivationする際にBまたはCを参照してもよい。
図25は、本開示の一実施例によるaffine motion predictor derivationを示す図である。
Affine motion prediction(アフィン動き予測)のためにcontrol point motion vectors(コントロールポイント動きベクトルら)が必要であるが、前記control point motion vectors(コントロールポイント動きベクトルら)に基づいてmotion vector field(動きベクトルフィールド)、つまり、subblock(サブブロック)やある位置に対するmotion vector(動きベクトル)が計算される。Control point motion vector(コントロールポイント動きベクトル)はseed vector(シードベクトル)とも称される。
この際、control point MV(コントロールポイント動きベクトル)はpredictor(予測子)に基づく。例えば、predictor(予測子)がcontrol point MV(コントロールポイント動きベクトル)になり得る。他の例として、predictor(予測子)とdifference(差分)に基づいてcontrol point MV(コントロールポイント動きベクトル)が計算されてもよい。詳しくは、predictor(予測子)にdifference(差分)を足すか引くことでcontrol point MV(コントロールポイント動きベクトル)を計算する。
この際、control point MVのpredictorを作る過程において、周辺のaffine motion prediction(affine motion compensation(MC))したblockのcontrol point MVs(コントロールポイント動きベクトルら)またはMVs(動きベクトルら)からderiveする。例えば、予め設定された位置に当たるblockがaffine motion predictionされたら、そのblockのcontrol point MVsはMVsから現在ブロックのaffine motion compensationのためのpredictorをderivationする。図25を参照すると、予め設定された位置はA0、A1、B0、B1、B2である。または、予め設定された位置は現在blockと隣接した位置と隣接しない位置を含む。また、予め設定された位置のcontrol point MVs(コントロールポイント動きベクトルら)またはMVs(動きベクトルら)を参照し(spatial)、予め設定された位置のtemporal control point MVsまたはMVsを参照する。
図25の実施例のような方法でaffine MC(アフィン動き補償)のcandidateを作ることができるが、このようなcandidateをinherited candidateと称してもよい。または、このようなcandidateをmerge candidate(マージ候補)と称してもよい。また、図25の方法において、予め設定された位置を参照する際に予め設定された順によって参照する。
図26は、本開示の一実施例によるaffine motion predictor derivationを示す図である。
Affine motion prediction(アフィン動き補償)のためにcontrol point motion vectors(コントロールポイント動きベクトルら)が必要であるが、前記control point motion vectors(コントロールポイント動きベクトルら)に基づいてmotion vector field(動きベクトルフィールド)、つまり、subblock(サブブロック)やある位置に対するmotion vectorが計算される。Control point motion vector(コントロールポイント動きベクトル)はseed vector(シードベクトル)とも称される。
この際、control point MV(コントロールポイント動きベクトル)はpredictor(予測子)に基づく。例えば、predictorがcontrol point MV(コントロールポイント動きベクトル)になり得る。他の例として、predictorとdifference(差分)に基づいてcontrol point MV(コントロールポイント動きベクトル)が計算されてもよい。詳しくは、predictor(予測子)にdifference(差分)を足すか引くことでcontrol point MV(コントロールポイント動きベクトル)を計算する。
この際、control point MVを作る過程において、周辺のMVsからderiveする。この際、周辺のMVsはaffine MC(アフィン動き補償)されたMVs(動きベクトルら)ではない場合のMVs(動きベクトルら)も含む。例えば、現在blockの各control point MV(コントロールポイント動きベクトル)をderivationする際、各control point MVに対して予め設定された位置のMVをcontrol point MVのpredictorとして使用する。例えば、予め設定された位置はその部分と隣接したblockに含まれている部分である。
図26を参照すると、control point MV(コントロールポイント動きベクトル) mv0、mv1、mv2を決定する。この際、本開示の一実施例によると、予め設定された位置A、B、Cに当たるMV(動きベクトル)をmv0に対するpredictorとして使用する。また、予め設定された位置D、Eに当たるMV(動きベクトル)をmv1に対するpredictorとして使用する。予め設定された位置F、Gに当たるMV(動きベクトル)をmv2に対するpredictorとして使用する。
また、図26の実施例によってcontrol point MV(コントロールポイント動きベクトル) mv0、mv1、mv2の各predictor(予測子)を決定する際、各control pointの位置に対する予め設定された位置を参照する順番が決められている。また、control point MVのpredictorとして参照する予め設定された位置が各control pointに対して多数あり得るが、可能な予め設定された位置の組み合わせが決められている可能性がある。
図26の実施例のような方法でaffine MC(アフィン動き補償)のcandidateを作ることができるが、このようなcandidateをconstructed candidateと称してもよい。または、このようなcandidateをinter candidateまたはvertual candidateと称してもよい。また、図41の方法において、予め設定された位置を参照する際に予め設定された順によって参照する。
本開示の一実施例によると、図23乃至図26で説明した実施例またはそれらの組み合わせでaffine MC(アフィン動き補償)のcandidate listまたはaffine MC(アフィン動き補償)のcontrol point MV candidate list(コントロールポイント動き補償候補リスト)を生成することができる。
図27は、本開示の一実施例によるaffine motion predictor derivationを示す図である。
図24乃至図25で説明したように、周辺のaffine motion predictionされたblockから現在blockのaffine motion predictionのためのcontrol point MV(コントロールポイント動きベクトル)をderivationする。この際、図27と同じ方法を使用する。図27の式において、周辺のaffine motion predictionされたblockのtop-left、top-right、bottom-leftのMV(動きベクトル)またはcontrol point MV(コントロールポイント動きベクトル)をそれぞれ(v_E0x,v_E0y)、(v_E1x,v_E1y)、(v_E2x,v_E2y)である。また、周辺のaffine motion predictionされたblockのtop-left、top-right、bottom-leftの座標をそれぞれ(x_E0,y_E0)、(x_E1,y_E1)、(x_E2,y_E2)とする。この際、図27によって現在blockのcontrol point MV(コントロールポイント動きベクトル)のpredictorまたはcontrol point MV(コントロールポイント動きベクトル)である(v_0x,v_0y)、(v_1x,v_1y)を計算する。
図28は、本開示の一実施例によるaffine motion predictor derivationを示す図である。
上述したように、affine motion compensation(アフィン動き補償)のために多数のcontrol point MV(コントロールポイント動きベクトル)または多数のcontrol point MV predictor(コントロールポイント動きベクトル予測子)が必要である。この際、あるcontrol point MV(コントロールポイント動きベクトル)またはcontrol point MV predictor(コントロールポイント動きベクトル予測子)から他のcontrol point MV(コントロールポイント動きベクトル)またはcontrol point MV predictor(コントロールポイント動きベクトル予測子)を誘導する。
例えば、前記図面で説明した方法で2つのcontrol point MV(コントロールポイント動きベクトル)または2つのcontrol point MV predictor(コントロールポイント動きベクトル予測子)を作り出した際、それに基づいて他のcontrol point MV(コントロールポイント動きベクトル)または他のcontrol point MV predictor(コントロールポイント動きベクトル予測子)を生成する。
図28を参照すると、top-left、top-right、bottom-leftのcontrol point MV predictor(コントロールポイント動きベクトル予測子)またはcontrol point MV(コントロールポイント動きベクトル)であるmv0、mv1、mv2を生成する方法を示している。図面のx、yはそれぞれx-component、y-componentを示しており、現在block sizeがw*hである。
図29は、本開示の一実施例によるcontrol point motion vectorの生成方法を示す図である。
本開示の一実施例によると、現在blockをaffine MC(アフィン動き補償)するためにcontrol point MV(コントロールポイント動きベクトル)に対するpredictorを作り、それにdifferenceを足してcontrol point MV(コントロールポイント動きベクトル)を決定する。一実施例によると、図23乃至図26で説明した方法でcontrol point MVのpredictorを作ることができる。Differenceはエンコーダからデコーダにシグナリングされる。
図29を参照すると、各control point MV(コントロールポイント動きベクトル)に対するdifferenceが存在する。また、各control point MV(コントロールポイント動きベクトル)に対するdifferenceがそれぞれシグナリングされる。図29(a)は、4-parameter modelのcontrol point MVであるmv0、mv1を決定する方法を示し、図29(b)は、6-parameter modelのcontrol point MV(コントロールポイント動きベクトル)であるmv0、mv1、mv2を決定する方法を示す。各control point MV(コントロールポイント動きベクトル)に対するdifferenceであるmvd0、mvd1、mvd2をpredictorに足すことでcontrol point MV(コントロールポイント動きベクトル)を決定している。
図29において、上端バー(bar)で示したものはcontrol point MV(コントロールポイント動きベクトル)のpredictorである。
図30は、図29で説明した方法によるmotion vector differenceの決定方法を示す図である。
一実施例として、図10で説明した方法でmotion vector difference(動きベクトル差分)がシグナリングされる。そして、シグナリングされた方法で決定したmotion vector difference(動きベクトル差分)が図30のlMvdである。また、図29で示したシグナリングされるmvd(動きベクトル差分)、つまり、mvd0、mvd1、mvd2と同じ値が図30のlMvdである。図29で説明したように、シグナリングされたmvd(動きベクトル差分)をcontrol point MV(コントロールポイント動きベクトル)のpredictor(予測子)とのdifference(差分)として決定し、その決定したdifference(差分)が図30のMvdL0とMvdL1である。L0はreference list 0(第0参照ピクチャリスト)を、L1はreference list 1(第1参照ピクチャリスト)を示す。compIdxはcomponent indexであって、x、y componentなどを示す。
図31は、本開示の一実施例によるcontrol point motion vectorの生成方法を示す図である。
本開示の一実施例によると、現在blockをaffine MC(アフィン動き補償)するためにcontrol point MV(コントロールポイント動きベクトル)に対するpredictorを作り、それにdifferenceを足してcontrol point MV(コントロールポイント動きベクトル)を決定する。一実施例によると、図23乃至図26で説明した方法でcontrol point MV(コントロールポイント動きベクトル)のpredictorを作ることができる。Difference(差分)はエンコーダからデコーダにシグナリングされる。
図31を参照すると、各control point MV(コントロールポイント動きベクトル)に対するdifference(差分)に対するpredictor(予測子)が存在する。例えば、あるcontrol point MV(コントロールポイント動きベクトル)のdifference(差分)に基づいて他のcontrol point MV(コントロールポイント動きベクトル)のdifference(差分)を決定する。これはcontrol point MV(コントロールポイント動きベクトル)に対するdifference(差分)間の類似性に基づく。類似しているため、predictorを決定したらpredictorとの差を少なくすることができるのである。この際、control point MV(コントロールポイント動きベクトル)に対するdifference predictor(差分予測子)がシグナリングされ、control point MV(コントロールポイント動きベクトル)に対するdifference predictor(差分予測子)とのdifference(差分)がシグナリングされる。
図31(a)は、4-parameter modelのcontrol point MV(コントロールポイント動きベクトル)であるmv0、mv1を決定する方法を示し、図31(b)は、6-parameter modelのcontrol point MV(コントロールポイント動きベクトル)であるmv0、mv1、mv2を決定する方法を示す。
図31を参照すると、各control point MVに対するdifferenceをcontrol point MV 0であるmv0のdifference(mvd0)に基づいてcontrol point MVに対するdifference及びcontrol point MVを決定している。図31に示したmvd0、mvd1、mvd2をエンコーダからデコーダにシグナリングする。図29で説明した方法に比べ、図31の方法は図29と同じmv0、mv1、mv2であって同じpredictorを使用してもシグナリングするmvd1とmvd2の値が異なり得る。Control point MV mv0、mv1、mv2のpredictorとのdifferenceが類似していれば、図31の方法を使用したら図29の方法を使用する際よりmvd1とmvd2の絶対値が少ない可能性があり、それによってmvd1とmvd2のシグナリングオーバーヘッドを減らすことができる。図31を参照すると、mv1のpredictorとのdifferenceを(mvd1+mvd0)、mv2のpredictorとのdifferenceを(mvd2+mvd0)に決定する。
図31において、上端バー(bar)で示したものはcontrol point MVのpredictorである。
図32は、図31で説明した方法によるmotion vector differenceの決定方法を示す図である。
一実施例として、図10または図33で説明した方法でmotion vector difference(動きベクトル差分)がシグナリングされる。そして、シグナリングされたパラメータに基づいて決定されたmotion vector difference(動きベクトル差分)が図32のlMvdである。また、図31で示したシグナリングされるmvd、つまり、mvd0、mvd1、mvd2と同じ値が図32のlMvdである。
図32のMvdLXは、各control point MV(コントロールポイント動きベクトル)とpredictor(予測子)との差である。つまり、(mv-mvp)である。この際、図31で説明したように、control point MV 0(mv_0)に対してはシグナリングされたmotion vector differenceをすぐにcontrol point MVに対するdifference(MvdLX)を使用し、他のcontrol point MV(mv_1,mv_2)に対してはシグナリングされたmotion vector difference(図31ではmvd1、mvd2)及びcontrol point MV 0(mv_0)に対してはシグナリングされたmotion vector difference(図31ではmvd0)に基づいてcontrol point MVのdifferenceであるMvdLXを決定して使用する。
図32において、LXはreference list(参照ピクチャリストX)を示す。compIdxはcomponent indexであって、x、y componentなどを示す。cpIdxはcontrol point indexを示す。cpIdxは図31で示す0、1、または0、1、2を意味する。
図10、12、13などで示す値にmotion vector differenceのresolutionを考慮する。例えば、resolutionがRであれば、図面のlMvdにlMvd*Rの値を使用する。
図33は、本開示の一実施例によるmotion vector difference syntaxを示す図である。
図33を参照すると、図10の説明と類似した方法でmotion vector differenceをコーディングする。この際、コーディングはcpIdx、control point indexによって別に行われる。
図34は、本開示の一実施例による上位レベルシグナリングの構造を示す図である。本開示の一実施例によると、一つ以上の上位レベルシグナリングが存在する。上位レベルシグナリングは上位レベルにおけるシグナリングを意味する。上位レベルはある単位を含む単位である。例えば、現在block(ブロック)また現在coding unit(コーディングユニット)の上位レベルはCTU、slice、tile、tile group、picture、sequenceなどを含む。上位レベルシグナリングは該当上位レベルの下位レベルに対して影響を及ぼす。例えば、上位レベルがsequenceであれば、sequenceの下位であるCTU、slice、tile、tile group、picture単位に影響及ぼす。ここで影響を及ぼすとは、上位レベルシグナリングが下位レベルに対するエンコーディングまたはデコーディングに影響を及ぼすということである。
または、上位レベルシグナリングはあるmodeを使用可能であるのか否かを示すシグナリングを含む。図34を参照すると、上位レベルシグナリングはsps_modeX_enabled_flagを含む。一実施例によると、sps_modeX_enabled_flagに基づいてmode modeXを使用可能であるのか否かを判断する。例えば、sps_modeX_enabled_flagがある値である際にはmode modeXを使用することができない。また、sps_modeX_enabled_flagが他のある値である際にはmode modeXを使用することができる。また、sps_modeX_enabled_flagが他のある値である際には、更なるシグナリングに基づいてmode modeXを使用するのか否かを判断する。例えば、前記ある値は0であってもよく、前記他のある値は1であってもよい。しかし、これに限らず、前記ある値は1であってもよく、前記他のある値は0であってもよい。
本開示の一実施例によると、affine motion compensation(アフィン動き補償)が使用可能であるのかを示すシグナリングが存在する。例えば、このシグナリングは上位レベルシグナリングである。図34を参照すると、このシグナリングはsps_affine_enabled_flag(アフィン可能フラッグ)である。図2及び図7を参照すると、シグナリングはビットストリームを介してエンコーダからデコーダに伝送される信号を意味する。デコーダはビットストリームからアフィン可能フラッグをパージングする。
例えば、sps_affine_enabled_flag(アフィン可能フラッグ)が0であれば、affine motion compensation(アフィン動き補償)が使用されないようにsyntaxが制限される。また、sps_affine_enabled_flag(アフィン可能フラッグ)が0であれば、inter_affine_flag(インターアフィンフラッグ)、cu_affine_type_flag(コーディングユニットアフィンタイプフラッグ)が存在しない。
例えば、inter_affine_flag(インターアフィンフラッグ)はblockでaffine MC(アフィン動き補償)が使用されるのか否かを示すシグナリングである。図2及び図7を参照すると、シグナリングはビットストリームを介してエンコーダからデコーダに伝送される信号を意味する。デコーダはビットストリームからinter_affine_flag(インターアフィンフラッグ)をパージングする。
また、cu_affine_type_flag(コーディングユニットアフィンタイプフラッグ)はblock(ブロック)からどのtypeのaffine MC(アフィン動き補償)が使用されるのかを示すシグナリングである。また、ここでtypeは4-parameter affine modelであるのか、6-parameter affine modelであるのかを示す。また、sps_affine_enabled_flag(アフィン可能フラッグ)が1であれば、affine model compensation(アフィン動き補償)が使用可能である。
Affine motion compensation(アフィン動き補償)は、affine model based motion compensation(アフィンモデル基盤の動き補償)またはaffine model based motion compensation for inter prediction(インター予測に対するアフィンモデル基盤の動き補償)を意味する。
また、本開示の一実施例によると、どのmodeの特定typeを使用可能であるのかを示すシグナリングが存在する。例えば、特定typeのaffine motion compensationを使用可能であるのかを示すシグナリングが存在する。例えば、このシグナリングは上位レベルシグナリングである。図34を参照すると、このシグナリングはsps_affine_type_flagである。また、前記特定typeは6-parameter affine modelを意味する。例えば、sps_affine_type_flagが0であれば、6-parameter affine modelが使用されないようにsyntaxが制限される。また、sps_affine_type_flagが0であれば、cu_affine_type_flagが存在しない。また、もしsps_affine_type_flagが1であれば、6-parameter affine modelが使用される。もしsps_affine_type_flagが存在しなければ、その値を0にinferする。
また、本開示の一実施例によると、どのmodeの特定typeを使用可能であるのかを示すシグナリングは、前記あるmodeを使用可能であるのかを示すシグナリングが存在する場合に存在する。例えば、前記どのmodeを使用可能であるのかを示すシグナリングが1であれば、前記どのmodeの特定typeを使用可能であるのかを示すシグナリングをparsingする。また、前記どのmodeを使用可能であるのかを示すシグナリングが0であれば、前記どのmodeの特定typeを使用可能であるのかを示すシグナリングをparsingしない。例えば、どのmodeを使用可能であるのかを示すシグナリングはsps_affine_enabled_flag(アフィン可能フラッグ)を含む。また、どのmodeの特定typeを使用可能であるのかを示すシグナリングはsps_affine_type_flag(アフィン可能フラッグ)を含む。図34を参照すると、sps_affine_enabled_flag(アフィン可能フラッグ)が1であればsps_affine_type_flagをparsingする。また、sps_affine_enabled_flag(アフィン可能フラッグ)が0であればsps_affine_type_flagをparsingせず、その値を0にinfer(暗示)する。
また、上述したように、adaptive motion vector resolution(AMVR;適応的な動きベクトル解像度)を使用する。AMVRのresolution setを状況いよって異なるように使用する。例えば、prediction modeによってAMVRのresolution setを異ならせて使用する。例えば、AMVPのようなregular inter predictionを使用する際と、affine MC(アフィン動き補償)を使用する際のAMVR resolution setが異なり得る。また、AMVRのようなregular inter predictionに適用されるAMVRは、motion vector difference(動きベクトル差分)に適用される。または、AMVP(Advanced Motion Vector Prediction)のようなregular inter predictionに適用されるAMVRは、motion vector predictorに適用される。また、affine MC(アフィン動き補償)に適用されるAMVRは、control point motion vector(コントロールポイント動きベクトル)またはcontrol point motion vector difference(コントロールポイント動きベクトル差分)に適用される。
また、本開示の一実施例によると、AMVRを使用可能であるのかを示すシグナリングが存在する。このシグナリングは上位レベルシグナリングである。図34を参照すると、sps_amvr_enabled_flag(AMVR可能フラッグ)が存在する。図2及び図7を参照すると、シグナリングはビットストリームを介してエンコーダからデコーダに伝送される信号を意味する。デコーダはビットストリームからAMVR可能フラッグをパージングする。
本開示の一実施例によるsps_amvr_enabled_flag(AMVR可能フラッグ)は、適応的な動きベクトル差分解像度が使用されるのか否かを示す。また、本開示の一実施例によるsps_amvr_enabled_flag(AMVR可能フラッグ)は、適応的な動きベクトル差分解像度が使用可能であるのか否かを示す。例えば、本開示の一実施例によると、sps_amvr_enabled_flag(AMVR可能フラッグ)が1であれば、AMVRがmotion vector codingに使用可能である。また、本開示の一実施例によると、sps_amvr_enabled_flag(AMVR可能フラッグ)が1であれば、AMVRがmotion vector codingに使用される。また、sps_amvr_enabled_flag(AMVR可能フラッグ)が1であれば、どのresolutionが使用されるのかを指すための更なるシグナリングが存在する。また、sps_amvr_enabled_flag(AMVR可能フラッグ)が0であれば、AMVRがmotion vector codingに使用されない。また、sps_amvr_enabled_flag(AMVR可能フラッグ)が0であれば、AMVRがmotion vector codingに使用不可能である。本開示の一実施例によると、sps_amvr_enabled_flag(AMVR可能フラッグ)に当たるAMVRは、regular inter predictionに使用されることを意味する。例えば、sps_amvr_enabled_flag(AMVR可能フラッグ)に当たるAMVRは、affine MC(アフィン動き補償)に使用されることを意味しない。また、affine MC(アフィン動き補償)の使用可否は、inter_affine_flag(インターアフィンフラッグ)によって示される。つまり、sps_amvr_enabled_flag(AMVR可能フラッグ)に当たるAMVRは、inter_affine_flag(インターアフィンフラッグ)が0である場合に使用されることを意味するか、inter_affine_flag(インターアフィンフラッグ)が1である場合に使用されることを意味しない。
本開示の一実施例によると、affine MC(アフィン動き補償)にAMVRが使用可能であるのかを示すシグナリングが存在する。このシグナリングは上位レベルシグナリングである。図34を参照すると、affine MC(アフィン動き補償)にAMVRが使用可能であるのかを示すシグナリングであるsps_affine_amvr_enabled_flag(アフィンAMVR可能フラッグ)が存在する。図2及び図7を参照すると、シグナリングはビットストリームを介してエンコーダからデコーダに伝送される信号を意味する。デコーダはビットストリームからアフィンAMVR可能フラッグをパージングする。
sps_affine_amvr_enabled_flag(アフィンAMVR可能フラッグ)は、アフィン動き補償に対して適応的な動きベクトル差分解像度が使用されるのか否かを示す。また、sps_affine_amvr_enabled_flag(アフィンAMVR可能フラッグ)は、アフィン動き補償に対して適応的な動きベクトル差分解像度が使用可能であるのか否かを示す。一実施例によると、sps_affine_amvr_enabled_flag(アフィンAMVR可能フラッグ)が1であれば、AMVRがaffine inter mode motion vector codingに使用可能である。また、sps_affine_amvr_enabled_flag(アフィンAMVR可能フラッグ)が1であれば、AMVRがaffine inter mode motion vector codingに使用される。また、sps_affine_amvr_enabled_flag(アフィンAMVR可能フラッグ)が0であれば、affine inter mode motion vector codingにAMVRが使用不可能である。sps_affine_amvr_enabled_flag(アフィンAMVR可能フラッグ)が0であれば、affine inter mode motion vector codingにAMVRが使用されない。
例えば、sps_affine_amvr_enabled_flag(アフィンAMVR可能フラッグ)が1であれば、inter_affine_flag(インターアフィンフラッグ)が1である場合に当たるAMVRが使用される。また、sps_affine_amvr_enabled_flag(アフィンAMVR可能フラッグ)が1であれば、どのresolutionが使用されるのかを指示するための更なるシグナリングが存在する。また、sps_affine_amvr_enabled_flag(アフィンAMVR可能フラッグ)が0であれば、inter_affine_flag(インターアフィンフラッグ)が1である場合に当たるAMVRが使用不可能である。
図35は、本開示の一実施例によるcoding unit syntaxの構造を示す図である。
図34で説明したように、AMVRを使用する上位レベルシグナリングに基づいてresolutionを指示するための更なるシグナリングが存在する。図34を参照すると、resolutionを指示するための更なるシグナリングは、amvr_flagまたはamvr_precision_flagを含む。amvr_flagまたはamvr_precision_flagは動きベクトル差分の解像度に関する情報である。
一実施例によると、amvr_flagが0である場合が示すシグナリングが存在する。また、amvr_flagが1であればamvr_precision_flagが存在する。また、amvr_flagが1であればamvr_precision_flagにも基づいてresolutionが決定される。例えば、amvr_flagが0であれば1/4 resolutionである。また、もしamvr_flagが存在しなければ、CuPredModeに基づいてamvr_flag値をinferする。例えば、CuPredModeがMODE_IBCであればamvr_flagの値を1にinferし、CuPredModeがMODE_IBCではないか、CuPredMode(coding unit prediction mode)がMODE_INTERであればamvr_flagの値を0にinferする。
また、inter_affine_flag(インターアフィンフラッグ)が0でamvr_precision_flagが0であれば、1-pel resolutionを使用する。また、inter_affine_flag(インターアフィンフラッグ)が1でamvr_precision_flagが0であれば、1/16-pel resolutionを使用する。また、inter_affine_flag(インターアフィンフラッグ)が0でamvr_precision_flagが1であれば、4-pel resolutionを使用する。また、inter_affine_flag(インターアフィンフラッグ)が1でamvr_precision_flagが1であれば、1-pel resolutionを使用する。
もしamvr_precision_flagが0であれば、その値を0にinferする。
一実施例によると、resolutionはMvShift値によって適用される。また、MvShiftは動きベクトル差分の解像度に関する情報であるamvr_flag及びamvr_precision_flagによって決定される。例えば、inter_affine_flagが0であればMvShift値は以下のように決定される。
MvShift=(amvr_flag+amvr_precision_flag)<<1
また、MvShift値に基づいてMvd(motion vector difference;動きベクトル差分)値がshiftされる。例えば、Mvd(動きベクトル差分)は以下のようにshiftされ、それによってAMVRのresolutionが適用される。
MvdLX=MvdLX<<(MvShift+2)
他の例として、inter_affine_flag(インターアフィンフラッグ)が1であればMvShift値は以下のように決定される。
MvShift=amvr_precision_flag?(amvr_precision_flag<<1):(-(amvr_flag<<1))
また、MvShift値に基づいてMvdCp(コントロールポイント動きベクトル差分)値がshiftされる。MvdCpは、control point motion vector differenceまたはcontrol point motion vectorである。例えば、MvdCp(コントロールポイント動きベクトル差分)は以下のようにshiftされ、それによってAMVRのresolutionが適用される。
MvdCpLX=MvdCpLX<<(MvShift+2)
また、MvdまたはMvdCpはmvd_codingによってシグナリングされる値である。
図35を参照すると、CuPredModeがMODE_IBCであれば、動きベクトル差分の解像度に関する情報であるamvr_flagが存在しない。また、CuPredModeがMODE_INTERであれば、動きベクトル差分の解像度に関する情報であるamvr_flagが存在するが、この際、ある条件を満足したらamvr_flagをparsingすることができる。
本開示の一実施例によると、AMVRが使用されるのかを示す上位レベルシグナリング値に基づいてAMVRに関連するsyntax elementsをparsingするのかを決定する。例えば、AMVRが使用されるのかを示す上位レベルシグナリング値が1であれば、AMVRに関連するsyntax elementsをparsingする。また、AMVRが使用されるのかを示す上位レベルシグナリング値が0であれば、AMVRに関連するsyntax elementsをparsingしない。図35を参照すると、CuPredModeがMODE_IBCである場合、sps_amvr_enabled_flag(AMVR可能フラッグ)が0であれば、動きベクトル差分の解像度に関する情報であるamvr_precision_flagをparsingしない。また、CuPredModeがMODE_IBCである場合、sps_amvr_enabled_flag(AMVR可能フラッグ)が1であれば、動きベクトル差分の解像度に関する情報であるamvr_precision_flagをparsingする。この際、parsingするための更なる条件が考慮される。
例えば、MvdLX(複数の動きベクトル差分)のうち0ではないものが少なくとも一つ存在すれば、amvr_precision_flagをparsingする。MvdLXはreference list LXに対するMvd値である。また、Mvd(動きベクトル差分)はmvd_codingを介してシグナリングされる。LXはL0(第0参照ピクチャリスト)、L1(第1参照ピクチャリスト)を含む。また、MvdLXはx軸、y軸それぞれに当たる成分が存在する。例えば、x軸はpictureの横軸に当たり、y軸はpictureの縦軸に当たる。図35を参照すると、MvdLX[x0][y0][0]、MvdLX[x0][y0][1]において、[0]、[1]がそれぞれx軸、y軸の成分に対するものであることを指示する。また、CuPredModeがMODE_IBCであればL0のみ使用する。図35を参照すると、1)sps_amvr_enabled_flagが1で、2)MvdL0[x0][y0][0]またはMvdL0[x0][y0][1]が0でなければ、amvr_precision_flagをparsingする。また、1)sps_amvr_enabled_flag(AMVR可能フラッグ)が0であるか、2)MvdL0[x0][y0][0]とMvdL0[x0][y0][1]がいずれも0であれば、amvr_precision_flagをparsingしない。
また、CuPredModeがMODE_IBCではない場合があり得る。この際、図35を参照すると、sps_amvr_enabled_flag(AMVR可能フラッグ)が1で、inter_affine_flag(インターアフィンフラッグ)が0で、MvdLX(複数の動きベクトル差分)値のうち0ではないものが少なくとも一つ存在すれば、amvr_flagをparsingする。ここで、amvr_flagは動きベクトル差分の解像度に関する情報である。また、上述したように、sps_amvr_enabled_flag(AMVR可能フラッグ)が1であるということは、適応的な動きベクトル差分解像度の使用を示す。また、inter_affine_flag(インターアフィンフラッグ)が0であるということは、現在ブロックに対してアフィン動き補償を使用しないことを示す。また、図34で説明したように、amvr_flagのような動きベクトル差分の解像度に関する情報に基づいて現在ブロックに対する前記複数の動きベクトル差分が修正される。この条件をcondition Aと称する。
また、sps_affine_amvr_enabled_flag(アフィンAMVR可能フラッグ)が1で、inter_affine_flag(インターアフィンフラッグ)が1で、MvdCpLX(複数のコントロールポイント動きベクトル差分)値のうち0ではないものが少なくとも一つ存在すれば、amvr_flagをparsingする。ここで、amvr_flagは動きベクトル差分の解像度に関する情報である。また、上述したように、sps_affine_amvr_enabled_flag(アフィンAMVR可能フラッグ)が1であるということは、アフィン動き補償に対して適応的な動きベクトル差分解像度が使用されることを示す。また、inter_affine_flag(インターアフィンフラッグ)が1であるということは、現在ブロックに対してアフィン動き補償を使用することを示す。また、図34で説明したように、amvr_flagのような動きベクトル差分の解像度に関する情報に基づいて現在ブロックに対する前記複数のコントロールポイント動きベクトル差分が修正される。この条件をcondition Bと称する。
また、condition Aまたはcondition Bを満足したらamvr_flagをparsingする。また、condition Aとcondition Bをいずれも満足しなければ、動きベクトル差分の解像度に関する情報であるamvr_flagをparsingしない。つまり、1)sps_amvr_enabled_flag(AMVR可能フラッグ)が0であるか、inter_affine_flag(インターアフィンフラッグ)が1であるか、MvdLX(複数の動きベクトル差分)がいずれも0で、2)sps_affine_amvr_enabled_flagが0であるか、inter_affine_flag(インターアフィンフラッグ)が0であるか、MvdCpLX(複数のコントロールポイント動きベクトル差分)値がいずれも0であれば、amvr_flagをparsingしない。
また、amvr_flag値に基づいてamvr_precision_flagのparsing可否を決定する。例えば、amvr_flag値が1であれば、amvr_precision_flagのparsingする。また、amvr_flag値が0であれば、amvr_precision_flagのparsingしない。
また、MvdCpLX(複数のコントロールポイント動きベクトル差分)はcontrol point motion vectorに対するdifferenceを意味する。また、MvdCpLX(複数のコントロールポイント動きベクトル差分)はmvd_codingを介してシグナリングされる。LXはL0(第0参照ピクチャリスト)、L1(第1参照ピクチャリスト)を含む。また、MvdCpLXはcontrol point motion vector 0、1、2などに当たる成分が存在する。例えば、control point motion vector 0、1、2などは現在blockを基準にする予め設定された位置に当たるcontrol point motion vectorである。
図35を参照すると、MvdCpLX[x0][y0][0][]、MvdCpLX[x0][y0][1][]、MvdCpLX[x0][y0][2][]において、[0]、[1]、[2]がそれぞれcontrol point motion vector 0、1、2に当たることを指示する。また、control point motion vector 0に当たるMvdCpLX(複数のコントロールポイント動きベクトル差分)値は他のcontrol point motion vectorにも使用される。例えば、図47で使用されたように、control point motion vector 0を使用してもよい。また、MvdCpLX(複数のコントロールポイント動きベクトル差分)はx軸、y軸それぞれに当たる成分が存在する。例えば、x軸はpictureの横軸に当たり、y軸はpictureの縦軸に当たる。図35を参照すると、MvdCpLX[x0][y0][][0]、MvdCpLX[x0][y0][][1]において、[0]、[1]がそれぞれx軸、y軸の成分に対することを指示する。
図36は、本開示の一実施例による上位レベルシグナリングの構造を示す図である。
図34乃至図35で説明したような上位レベルシグナリングが存在する。例えば、sps_affine_enabled_flag(アフィン可能フラッグ)、sps_affine_amvr_enabled_flag、sps_amvr_enabled_flag(AMVR可能フラッグ)、sps_affine_type_flagなどが存在する。
本開示の一実施例によると、前記上位レベルシグナリングはparsing dependencyを有する。例えば、どの上位レベルシグナリング値に基づいて他の上位レベルシグナリングをparsingするのか否かを決定する。
本開示の一実施例によると、affine MC(アフィン動き補償)を使用可能であるのかに基づいてaffine AMVRを使用可能であるのかを決定する。例えば、affine MCを使用可能であるのかを示す上位レベルシグナリングに基づいてaffine AMVRを使用可能であるのかを決定する。より詳しくは、affine MCを使用可能であるのかを示す上位レベルシグナリングに基づいて、affine AMVRを使用可能であるのかを示す上位レベルシグナリングのparsing可否を決定する。
一実施例として、affine MCを使用可能な場合、affine AMVRを使用可能な可能性がある。また、affine MCを使用不可能な場合はaffine AMVRを使用不可能な可能性がある。
より詳しくは、affine MCを使用可能であるのかを示す上位レベルシグナリングが1であれば、affine AMVRを使用可能である。この際、更なるシグナリングされるが存在する。また、affine MCを使用可能であるのかを示す上位レベルシグナリングが0であれば、affine AMVRを使用不可能である。例えば、affine MCを使用可能であるのかを示す上位レベルシグナリングが1であれば、affine AMVRを使用可能であるのかを示す上位レベルシグナリングをparsingする。また、affine MCを使用可能であるのかを示す上位レベルシグナリングが0であれば、affine AMVRを使用可能であるのかを示す上位レベルシグナリングをparsingしない。また、affine AMVRを使用可能であるのかを示す上位レベルシグナリングが存在しなければ、その値をinfersする。例えば、0にinferする。他の例として、affine MCを使用可能であるのかを示す上位レベルシグナリングに基づいてinferする。また他の例として、AMVRを使用可能であるのかを示す上位レベルシグナリングに基づいてinferする。
一実施例によると、affine AMVRは図34乃至図35で説明したaffine MCに使用するAMVRである。例えば、affine MCを使用可能であるのかを示す上位レベルシグナリングは、sps_affine_enabled_flag(アフィン可能フラッグ)である。また、affine AMVRを使用可能であるのかを示す上位レベルシグナリングはsps_affine_amvr_enabled_flagである。
図36を参照すると、sps_affine_enabled_flag(アフィン可能フラッグ)が1であればsps_affine_amvr_enabled_flagをparsingする。また、sps_affine_enabled_flag(アフィン可能フラッグ)が0であれば、sps_affine_amvr_enabled_flagをparsingしない。また、sps_affine_amvr_enabled_flagが存在しなければ、その値を0にinferする。
本開示の実施例は、affine AMVRはaffine MCを使用する場合に意味があるためである。
図37は、本開示の一実施例による上位レベルシグナリングの構造を示す図である。
図34乃至図35で説明したような上位レベルシグナリングが存在する。例えば、sps_affine_enabled_flag(アフィン可能フラッグ)、sps_affine_amvr_enabled_flag(アフィンAMVR可能フラッグ)、sps_amvr_enabled_flag(AMVR可能フラッグ)、sps_affine_type_flagなどが存在する。
本開示の一実施例によると、前記上位レベルシグナリングはparsing dependency(パージング依存性)を有する。例えば、どの上位レベルシグナリング値に基づいて他の上位レベルシグナリングをparsingするのか否かを決定する。
本開示の一実施例によると、AMVRを使用可能であるのかに基づいてaffine AMVRを使用可能であるのかを決定する。例えば、AMVRを使用可能であるのかを示す上位レベルシグナリングに基づいてaffine AMVRを使用可能であるのかを決定する。より詳しくは、AMVRを使用可能であるのかを示す上位レベルシグナリングに基づいて、affine AMVRを使用可能であるのかを示す上位レベルシグナリングのparsing可否を決定する。
一実施例として、AMVRを使用可能な場合、affine AMVRを使用可能な可能性がある。また、AMVRを使用不可能な場合はaffine AMVRを使用不可能な可能性がある。
より詳しくは、AMVRを使用可能であるのかを示す上位レベルシグナリングが1であれば、affine AMVRを使用可能である。この際、追加のシグナリングが存在する可能性がある。また、AMVRを使用可能であるのかを示す上位レベルシグナリングが0であれば、affine AMVRを使用不可能である。例えば、AMVRを使用可能であるのかを示す上位レベルシグナリングが1であれば、affine AMVRを使用可能であるのかを示す上位レベルシグナリングをparsingする。また、AMVRを使用可能であるのかを示す上位レベルシグナリングが0であれば、affine AMVRを使用可能であるのかを示す上位レベルシグナリングをparsingしない。また、affine MCを使用可能であるのかを示す上位レベルシグナリングが存在しなければ、その値をinfersする。例えば、0にinferする。他の例として、affine MCを使用可能であるのかを示す上位レベルシグナリングに基づいてinferする。また他の例として、AMVRを使用可能であるのかを示す上位レベルシグナリングに基づいてinferする。
一実施例によると、affine AMVRは図34乃至図35で説明したaffine MC(アフィン動き補償)に使用するAMVRである。例えば、AMVRを使用可能であるのかを示す上位レベルシグナリングは、sps_amvr_enabled_flag(AMVR可能フラッグ)である。また、affine AMVRを使用可能であるのかを示す上位レベルシグナリングは、sps_affine_amvr_enabled_flag(アフィンAMVR可能フラッグ)である。
図37(a)を参照すると、sps_amvr_enabled_flag(AMVR可能フラッグ)が1であれば、sps_affine_amvr_enabled_flag(アフィンAMVR可能フラッグ)をparsingする。また、sps_amvr_enabled_flag(AMVR可能フラッグ)が0であれば、sps_affine_amvr_enabled_flag(アフィンAMVR可能フラッグ)をparsingしない。また、sps_affine_amvr_enabled_flag(アフィンAMVR可能フラッグ)が存在しなければ、その値を0にinferする。
本開示の一実施例は、sequenceによってadaptive resolution(適応的な解像度)が効率的であるのかが異なり得るためである。
また、affine AMVRの使用可否が、affine MCの使用可否及びAMVRの使用可否をいずれも考慮して決定される。例えば、affine MCを使用可能であるのかを示す上位レベルシグナリングとAMVRを使用可能であるのかを示す上位レベルシグナリングに基づいて、affine AMVRを使用可能であるのかを示す上位レベルシグナリングのparsing可否を決定する。一実施例によると、affine MCを使用可能であるのかを示す上位レベルシグナリングとAMVRを使用可能であるのかを示す上位レベルシグナリングがいずれも1であれば、affine AMVRを使用可能であるのかを示す上位レベルシグナリングをparsingする。また、affine MCを使用可能であるのかを示す上位レベルシグナリングまたはAMVRを使用可能であるのかを示す上位レベルシグナリングがいずれも0であれば、affine AMVRを使用可能であるのかを示す上位レベルシグナリングをparsingしない。また、affine MCを使用可能であるのかを示す上位レベルシグナリングが存在しなければ、その値をinfersする。
図37(b)を参照すると、sps_affine_enabled_flag(アフィン可能フラッグ)とsps_amvr_enabled_flag(AMVR可能フラッグ)がいずれも1であれば、sps_affine_amvr_enabled_flag(アフィンAMVR可能フラッグ)をparsingする。また、sps_affine_enabled_flag(アフィン可能フラッグ)とsps_amvr_enabled_flag(AMVR可能フラッグ)のうち少なくとも一つが0であれば、sps_affine_amvr_enabled_flag(アフィンAMVR可能フラッグ)をparsingしない。また、sps_affine_amvr_enabled_flag(アフィンAMVR可能フラッグ)が存在しなければ、その値を0にinferする。
より詳しく図37(b)を説明すると、ライン3701において、sps_affine_enabled_flag(アフィン可能フラッグ)に基づいてアフィン動き補償の使用可否が決定される。図34乃至図35で既に説明したように、sps_affine_enabled_flag(アフィン可能フラッグ)が1であればアフィン動き補償が使用可能であることを意味する。また、sps_affine_enabled_flag(アフィン可能フラッグ)が0であれば、アフィン動き補償が使用不可能であることを意味する。
図37(b)のライン3701において、アフィン動き補償が使用されると決定されれば、ライン3702において、sps_amvr_enabled_flag(AMVR可能フラッグ)に基づいて適応的な動きベクトル差分解像度の使用可否が決定される。図34乃至図35で既に説明したように、sps_amvr_enabled_flag(AMVR可能フラッグ)が1であれば適応的な動きベクトル差分解像度が使用されることを意味する。sps_amvr_enabled_flag(AMVR可能フラッグ)が0であれば、適応的な動きベクトル差分解像度が使用されないことを意味する。
ライン3701において、アフィン動き補償が使用されないと決定されれば、sps_amvr_enabled_flag(AMVR可能フラッグ)に基づいて適応的な動きベクトル差分解像度の使用可否が決定されない。つまり、図37(b)のライン3702が行われない。詳しくは、アフィン動き補償が使用されなければ、sps_affine_amvr_enabled_flag(アフィンAMVR可能フラッグ)はエンコーダからデコーダに伝送されない。つまり、デコーダはsps_affine_amvr_enabled_flag(アフィンAMVR可能フラッグ)を受信せず、sps_affine_amvr_enabled_flag(アフィンAMVR可能フラッグ)がでからパージングされない。この際、sps_affine_amvr_enabled_flag(アフィンAMVR可能フラッグ)は存在しないため0と暗示(infer)される。上述したように、sps_affine_amvr_enabled_flag(アフィンAMVR可能フラッグ)が0であれば、アフィン動き補償に対して適応的な動きベクトル差分解像度が使用できないことを示す。
図37(b)のライン3072において、適応的な動きベクトル差分解像度が使用されると決定されれば、ライン3703において、ビットストリームからアフィン動き補償に対する適応的な動きベクトル差分解像度の使用可否を示すsps_affine_amvr_enabled_flag(アフィンAMVR可能フラッグ)がパージングされる。
ライン3072において、適応的な動きベクトル差分解像度使用されないと決定されれば、sps_affine_amvr_enabled_flag(アフィンAMVR可能フラッグ)はビットストリームからパージングされない。つまり、図37(b)のライン3703が行われない。より詳しくは、アフィン動き補償を使用し、適応的な動きベクトル差分解像度をしない場合、sps_affine_amvr_enabled_flag(アフィンAMVR可能フラッグ)はエンコーダからデコーダに伝送されない。つまり、デコーダはsps_affine_amvr_enabled_flag(アフィンAMVR可能フラッグ)を受信しない。デコーダはsps_affine_amvr_enabled_flag(アフィンAMVR可能フラッグ)をビットストリームからパージングしない。この際、sps_affine_amvr_enabled_flag(アフィンAMVR可能フラッグ)は存在しないため0と暗示(infer)される。上述したように、sps_affine_amvr_enabled_flag(アフィンAMVR可能フラッグ)が0であれば、アフィン動き補償に対して適応的な動きベクトル差分解像度が使用できないことを示す。
図37(b)のように、sps_affine_enabled_flag(アフィン可能フラッグ)を先に確認し、sps_amvr_enabled_flag(AMVR可能フラッグ)を次に確認することで、不必要な処理過程を減らすことができるため効率性を上げることができる。例えば、sps_amvr_enabled_flag(AMVR可能フラッグ)が先に確認され、sps_affine_enabled_flag(アフィン可能フラッグ)が次に確認されれば、7番目の行からsps_affine_type_flagを導出するためにsps_affine_enabled_flag(アフィン可能フラッグ)を再度確認しなければならない。しかし、sps_affine_enabled_flag(アフィン可能フラッグ)が先に確認され、sps_amvr_enabled_flag(AMVR可能フラッグ)を次に確認することで、このような不必要な過程を減らすことができる。
図38は、本開示の一実施例によるcoding unit syntaxの構造を示す図である。
図35で説明したように、MvdLXまたはMvdCpLXのうち0ではない値が少なくとも一つ存在するのか否かで、AMVRに関連するsyntaxwparsingするのか否かを決定する。しかし、どのreference list(参照ピクチャリスト)を使用するのか、affine modelがいくつのparameterを使用するのかなどによって、使用するMvdLX(動きベクトル差分)またはMvdCpLX(コントロールポイント動きベクトル差分)が異なり得る。もし、MvdLXまたはMvdCpLXの初期値が0でなければ、現在blockで称しないMvdLXまたはMvdCpLXが0ではないため、不必要なAMVRに関連するsyntax elementをシグナリングするようになり、encoderとdecoder間のmissmatchを起こす恐れがある。図38乃至図39は、encoderとdecoder間のmissmatchを起こさない方法を説明する。
一実施例によると、inter_pred_idc(参照ピクチャリストに関する情報)は、どの参照リスト(reference list)を使用するのか、またはpredictionの方向がどのようであるのかを示す。例えば、inter_pred_idc(参照ピクチャリストに関する情報)はPRED_L0またはPRED_L1またはPRED_BIの値である。もし、inter_pred_idc(参照ピクチャリストに関する情報)がPRED_L0であれば、reference list 0(第0参照ピクチャリスト)のみを使用する。また、inter_pred_idc(参照ピクチャリストに関する情報)がPRED_L1であれば、reference list 1(第1参照ピクチャリスト)のみを使用する。また、inter_pred_idc(参照ピクチャリストに関する情報)がPRED_BIであれば、reference list 0(第0参照ピクチャリスト)とreference list 1(第1参照ピクチャリスト)をいずれも使用する。inter_pred_idc(参照ピクチャリストに関する情報)がPRED_L0またはPRED_L1であれば、uni-predictionである。また、inter_pred_idc(参照ピクチャリストに関する情報)がPRED_BIであれば、bi-predictionである。
また、MotionModelIdc値に基づいてどのaffine modelを使用するのかを決定する。また、MotionModelIdc値に基づいてどのaffine MCを使用するのかを決定する。例えば、MotionModelIdcがtranslation motionまたは4-parameter affine motionまたは6-parameter affine motionを示す。例えば、MotionModelIdcがtranslation motion値が0、1、2であれば、それぞれtranslation motion、4-parameter affine motion、6-parameter affine motionを指示する。また、一実施例によると、MotionModelIdcはinter_affine_flag(インターアフィンフラッグ)とcu_affine_type_flagに基づいて決定される。例えば、merge_flagが0であれば(merge modeでなければ)、MotionModelIdcがinter_affine_flag(インターアフィンフラッグ)とcu_affine_type_flagに基づいて決定される。例えば、MotionModelIdcは(inter_affine_flag+cu_affine_type_flag)である。他の実施例によると、MotionModelIdcはmerge_subblock_flagによって決定される。例えば、merge_flagが1であれば(merge modeであれば)、MotionModelIdcはmerge_subblock_flagによって決定される。例えば、MotionModelIdc値はmerge_subblock_flag値に設定される。
例えば、inter_pred_idc(参照ピクチャリストに関する情報)がPRED_L0であるかPRED_BIであれば、MvdLX(動きベクトル差分)またはMvdCpLX(コントロールポイント動きベクトル差分)においてL0に当たる値を使用する。よって、AMVRに関連するsyntaxをparsingする際、MvdL0またはMvdCpL0はinter_pred_idc(参照ピクチャリストに関する情報)がPRED_L0であるかPRED_BIである場合にのみ考慮する。つまり、inter_pred_idc(参照ピクチャリストに関する情報)がPRED_L1であれば、MvdL0(第0参照ピクチャリストに対する動きベクトル差分)またはMvdCpL0(第0参照ピクチャリストに対するコントロールポイント動きベクトル差分)を考慮しなくてもよい。
また、inter_pred_idc(参照ピクチャリストに関する情報)がPRED_L1であるかPRED_BIであれば、MvdLXまたはMvdCPLXにおいてL1に当たる値を使用する。よって、AMVRに関連するsyntaxをparsingする際、MvdL1(第1参照ピクチャリストに対する動きベクトル差分)またはMvdCpL1(第1参照ピクチャリストに対するコントロールポイント動きベクトル差分)は、inter_pred_idc(参照ピクチャリストに関する情報)がPRED_L1であるかPRED_BIである場合のみ考慮する。つまり、inter_pred_idc(参照ピクチャリストに関する情報)がPRED_L0であれば、MvdL1またはMvdCpL1を考慮しなくてもよい。
図38を参照すると、MvdL0とMvdCpL0は、inter_pred_idcがPRED_L1ではない場合にのみその値が0ではないのかによってAMVRに関連するsyntaxのparsing可否を決定する。つまり、inter_pred_idcがPRED_L1であれば、MvdL0のうちに0ではない値があるか、MvdCpL0のうちに0ではない値がある場合もAMVRに関連するsyntaxをparsingしない。
また、MotionModelIdcが1であれば、MvdCpLX[x0][y0][0][]、MvdCpLXx0][y0][1][]、MvdCpLX[x0][y0][2][]のうちMvdCpLX[x0][y0][0][]、MvdCpLX[x0][y0][1][]のみを考慮する。つまり、MotionModelIdcが1であれば、MvdCpLX[x0][y0][2][]を考慮しない。例えば、MotionModelIdcが1であれば、MvdCpLX[x0][y0][2][]のうちに0ではない値があるのか否かは、AMVRに関連するsyntaxのparsing可否に影響を及ぼさない。
また、MotionModelIdcが2であれば、MvdCpLX[x0][y0][0][]、MvdCpLX[x0][y0][1][]、MvdCpLX[x0][y0][2][]をいずれも考慮する。つまり、MotionModelIdcが2であれば、MvdCpLX[x0][y0][2][]を考慮する。
また、前記実施例において、MotionModelIdcを1、2で示したものは、cu_affine_type_flagが0、1であると表現することもできるこれは、affine MCの使用可否を破断することができるためである。例えば、affine MCの使用可否をinter_affine_flag(インターアフィンフラッグ)によって判断する。
図38を参照すると、MvdCpLX[x0][y0][2][]のうちに0ではないものがあるのかをMotionModelIdcが2である場合にのみ考慮する。もし、MvdCpLX[x0][y0][0][]、MvdCpLX[x0][y0][1][]がいずれも0で、MvdCpLX[x0][y0][2][]のうちに0ではないものが少なくとも一つあれば(上述した実施例によって、ここでL0、L1を分けてL0、L1のうち一つに当たるもののみを考慮してもよい。)、MotionModelIdcが2でなければ、AMVRに関連するsyntaxをparsingしない。
図39は、本開示の一実施例によるMVD基本値の設定を示す図である。
上述したように、MvdLX(動きベクトル差分)またはMvdCpLX(コントロールポイント動きベクトル差分はmvd_codingによってシグナリングされる。また、mvd_codingによってIMvd値がシグナリングされて、MvdLXまたはMvdCpLXをIMvd値に設定する。図39を参照すると、MotionModelIdcが0であれば、IMvd値によってMvdLXを設定する。また、MotionModelIdcが0でなければ、IMvd値によってMvdCpLXを設定する。また、refList値によってLXのうちいずれかに当たる動作をするのかを決定する。
また、図10または図23、図34、図35などで説明したように、mvd_codingが存在する。また、mvd_codingは、abs_mvd_greater0_flag、abs_mvd_greater1_flag、abs_mvd_minus2、mvd_sign_flagなどをparsingするステップ、または決定するステップを含む。また、IMvdは、abs_mvd_greater0_flag、abs_mvd_greater1_flag、abs_mvd_minus2、mvd_sign_flagなどによって決定される。
図39を参照すると、IMvdは以下のように設定される。
IMvd=abs_mvd_greater0_flag*(abs_mvd_minus2+2)*(1-2*mvd_sign_flag)
MvdLX(動きベクトル差分)またはMvdCpLX(コントロールポイント動きベクトル差分)の基本値を予め設定された値に設定する。本開示の一実施例によると、MvdLXまたはMvdCpLXの基本値を0に設定する。または、IMvdの基本値を予め設定された値に設定する。または、IMvdまたはMvdLXまたはMvdCpLXの値が予め設定された値になるように関連するsyntax elementの基本値を設定する。Syntax elementのきほんはsyntax elementが存在しなければinferする値を意味する。前記予め設定された値は0である。
本開示の一実施例によると、abs_mvd_greater0_flagはMVDのabsolute valueが0より大きいのか否かを指示する。また、本開示の一実施例によると、abs_mvd_greater0_flagが存在しなければ、その値を0にinferする。このような場合、IMvd値が0に設定される。また、このような場合、MvdLXまたはMvdCpLX値が0に設定される。
または、本開示の一実施例によると、IMvdまたはMvdLXまたはMvdCpLX値が設定されていなければ、その値を予め設定された値に設定する。例えば、0に設定する。
また、本開示の一実施例によると、abs_mvd_greater0_flagが存在しなければ、該当するIMvdまたはMvdLXまたはMvdCpLX値を0に設定する。
本開示の一実施例によると、abs_mvd_greater1_flagはMVDのabsolute valueが1より大きいのか否かを指示する。また、abs_mvd_greater1_flagが存在しなければ、その値を0にinferする。
また、abs_mvd_minus2+2はMVDのabsolute value値を指示する。また、abs_mvd_minus2値が存在しなければ、その値を-1にinferする。
また、mvd_sign_flagはMVDのsignを指示する。mvd_sign_flagが0、1であれば、該当MVDがそれぞれpositive、negative valueであることを示す。もしmvd_sign_flagが存在しなければ、その値を0にinferする。
図40は、本開示の一実施例によるMVD基本値の設定を示す図である。MvdLXまたはMvdCpLXの初期値を0にして、encoderとdecoder間のmissmatchを起こさないように図39で説明したように、MvdLX(複数の動きベクトル差分)またはMvdCpLX(複数のコントロールポイント動きベクトル差分)値は初期化される。また、この際、初期化する値は0である。図40の実施例はそれについてより詳しく説明する。
本開示の一実施例によると、MvdLX(複数の動きベクトル差分)またはMvdCpLX(複数のコントロールポイント動きベクトル差分)値は予め設定された値に初期化される。また、初期化する位置はAMVRに関連するsyntax elementsをparsingする位置より先である。前記AMVRに関連するsyntax elementsは、図40のamvr_flag、amvr_precision_flagなどを含む。amvr_flagまたはamvr_precision_flagは動きベクトル差分の解像度に関する情報である。
前記AMVRに関連するsyntax elementsによってMVD(動きベクトル差分)またはMV(動きベクトル)のresolution、またはMVDまたはMVのシグナリングされるresolutionが決定される。また、本開示の実施例において、初期化する予め設定された値に0である。
書庫異化することでAMVRに関連するsyntax elementsをparsingする際、encoder、decoder間のMvdLX、MvdCpLX値が同じくなるため、encoderとdecoder間のmissmatchが起こらない。また、初期かを0の値にすることで、不必要にAMVRに関連するsyntax elementsがビットストリームに含まれない。
本開示の一実施例によると、MvdLXはreference List(L0、L1など)、x- or y-componentなどに対して定義される。また、MvdCpLXはreference List(L0、L1など)、x- or y-component、control point 0、1、2などに対して定義される。
本開示の一実施例によると、MvdLXまたはMvdCpLXの値をいずれも初期化する。また、初期化する位置は、該当MvdLXまたはMvdCpLXに対するmvd_codingを行う前である。例えば、L0のみを使用するprecision blockにおいてもL0に当たるMvdLX、MvdCpLXを初期化することができる。初期化が必須的に必要なもののみを初期化するためには条件の確認が必要であるが、このように区分せずに初期化することで、条件の確認に負担を減らすことができる。
本開示の他の実施例によると、MvdLXまたはMvdCpLX値のうち使用しないものに当たる値を初期化する。ここで、使用しないとは現在blockで使用しないことを意味する。例えば、MvdLXまたはMvdCpLXのうち現在使用しないreference listに当たる値を初期化する。例えば、L0を使用しなければ、MvdL0、MvdCpL0に当たる値を初期化する。L0を使用しないのは、inter_pred_idcがPRED_L1の場合である。また、L1を使用しなければ、MvdL1、MvdCpL1に当たる値を初期化する。L1を使用しないのは、inter_pred_idcがPRED_L0の場合である。L0を使用するのはinter_pred_idcがPRED_L0であるかPRED_BIの場合である。また、L1を使用するのはinter_pred_idcがPRED_L1であるかPRED_BIの場合である。図40を参照すると、inter_pred_idcがPRED_L1であれば、MvdL0[x0][y0][0]、MvdL0[x0][y0][1]、MvdCpL0[x0][y0][0][0]、MvdCpL0[x0][y0][0][1]、MvdCpL0[x0][y0][1][0]、MvdCpL0[x0][y0][1][1]、MvdCpL0[x0][y0][2][0]、MvdCpL0[x0][y0][2][1]を初期化する。また、初期化する値は0である。また、inter_pred_idcがPRED_L0あれば、MvdL1[x0][y0][0]、MvdL1[x0][y0][1]、MvdCpL1[x0][y0][0][0]、MvdCpL1[x0][y0][0][1]、MvdCpL1[x0][y0][1][0]、MvdCpL1[x0][y0][1][1]、MvdCpL1[x0][y0][2][0]、MvdCpL1[x0][y0][2][1]を初期化する。また、初期化する値は0である。
MvdLX[x][y][compIdx]は、reference list LXに対する(x,y)位置、component index compIdxに対するmotion vector differenceである。MvdCpLX[x][y][cpIdx][compIdx]は、reference list LXに対するmotion vector differenceである。また、MvdCpLX[x][y][cpIdx][compIdx]は、位置(x,y)、control point motion vector cpIdx、及びcomponent index compIdxに対するmotion vector differenceである。ここで、componentはxまたはy成分を示す。
また、本開示の一実施例によると、MvdLX(動きベクトル差分)またはMvdCpLX(コントロールポイント動きベクトル差分)のうち使用しないものはaffine motion compensationの使用可否による。例えば、affine motion compensationが使用されれば、MvdLXを初期化する。また、affine motion compensationが使用されなければ、MvdCpLXを初期化する。例えば、affine motion compensationを使用するのかを示すシグナリングが存在する。図40を参照すると、inter_affine_flag(インターアフィンフラッグ)はaffine motion compensationを使用するのかを示すシグナリングである。例えば、inter_affine_flag(インターアフィンフラッグ)が1であればaffine motion compensationを使用する。または、MotionModelIdcはaffine motion compensationを使用するのかを示すシグナリングである。例えば、MotionModelIdcが0でなければaffine motion compensationを使用する。
また、本開示の一実施例によると、MvdLXまたはMvdCpLXのうち使用しないものはどのaffine motion compensationを使用するのかに関する。例えば、4-parameter affine modelを使用するのか、6-parameter affine modelを使用するのかによって使用しないMvdLXまたはMvdCpLXが異なり得る。例えば、どのaffine motion compensationを使用するのかによってMvdCpLX[x][y][cpIdx][compIdx]のcpIdxに対して使用しないものが異なり得る。例えば、4-parameter affine modelを使用する場合、MvdCpLX[x][y][cpIdx][compIdx]のうち一部のみを使用する。または、6-parameter affine modelを使用しない場合、MvdCpLX[x][y][cpIdx][compIdx]のうち一部のみを使用する。よって、使用しないMvdCpLXを予め設定された値に初期化する。この際、使用しないMvdCpLXは6-parameter affine modelでは使用し、4-parameter affine modelでは使用しないcpIdxに当たる。例えば、4-parameter affine modelを使用すれば、MvdCpLX[x][y][cpIdx][compIdx]のcpIdxが2の値を使用せず、それを予め設定された値に初期化する。また、上述したように、4-parameter affine modelを使用するのか、6-parameter affine modelを使用するのかを示すシグナリングまたはparameterが存在する。例えば、MotionModelIdcまたはcu_affine_type_flagによって4-parameter affine modelを使用するのか6-parameter affine modelを使用するのかが分かる。MotionModelIdc値が1、2であることは、それぞれ4-parameter affine model、6-parameter affine modelを使用することを示す。図40を参照すると、MotionModelIdcが1であれば、MvdCpL0[x0][y0][2][0]、MvdCpL0[x0][y0][2][1]、MvdCpL1[x0][y0][2][0]、MvdCpL1[x0][y0][2][1]を予め設定された値に初期化する。また、この際、MotionModelIdcが1である場合の代わりにMotionModelIdcが2ではない場合の条件を使用することもできる。前記予め設定された値は0である。
また、本開示の一実施例によると、MvdLXまたはMvdCpLXのうち使用しないものは、mvd_l1_zero_flag(第1参照ピクチャリストに対する動きベクトル差分ゼロフラッグ)に基づく。例えば、mvd_l1_zero_flagが1であれば、MvdL1、MvdCpL1を予め設定された値に初期化する。また、この際、更なる条件を考慮する。例えば、mvd_l1_zero_flagとinter_pred_idc(参照ピクチャリストに関する情報)に基づいて、MvdLXまたはMvdCpLXのうち使用しないものが決定される。例えば、mvd_l1_zero_flagが1で、inter_pred_idcがPRED_BIであれば、MvdL1、MvdCpL1を予め設定された値に初期化する。例えば、mvd_l1_zero_flag(第1参照ピクチャリストに対する動きベクトル差分ゼロフラッグ)はreference list L1に対するMVD値(例えば、MvdLXまたはMvdCpLX)が0であることを示す上位レベルシグナリングである。シグナリングはビットストリームを介してエンコーダからデコーダに伝送される信号を意味する。デコーダは、mvd_l1_zero_flag(第1参照ピクチャリストに対する動きベクトル差分ゼロフラッグ)をビットストリームからパージングする。
本開示の他の実施例によると、あるblockに対してmvd_codingを行う前に全てのMvd、MvdCpを予め設定された値に初期化する。この際、mvd_codingはあるCUに対する全てのmvd_codingを意味する。よって、mvd_coding syntaxをparsingし、決定したMvdまたはMvdCp値を初期化することが発生しないようにし、全てのMvd、MvdCP値を初期化することで説明した問題を解決する。
図41は、本開示の一実施例によるAMVRに関連するsyntaxの構造を示す図である。図41の実施例は、図38の実施例に基づく。
図38で説明したように、MvdLX(動きベクトル差分)またはMvdCpLX(コントロールポイント動きベクトル差分)のうち0ではない値が少なくとも一つ存在するのか否かを確認する。この際、確認するMvdLXまたはMvdCpLXはmvd_l1_zero_flag(第1参照ピクチャリストに対する動きベクトル差分ゼロフラッグ)に基づいて決定される。よって、mvd_l1_zero_flagに基づいてAMVRに関連するsyntaxのparsing可否が決定される。上述したように、mvd_l1_zero_flagが1であればreference list L1に対するMVD(動きベクトル差分)が0であることを示すため、この場合はMvdL1(第1参照ピクチャリストに対する動きベクトル差分)またはMvdCpL1(第1参照ピクチャリストに対するコントロールポイント動きベクトル差分)を考慮しない。例えば、mvd_l1_zero_flagが1であればMvdL1またはMvdCpL1が0なのか否かに関わらずMvdL0(第0参照ピクチャリストに対する動きベクトル差分)またはMvdCpL0(第0参照ピクチャリストに対するコントロールポイント動きベクトル差分)のうちから0である値が少なくとも一つ存在するのか否かに基づいてAMVRに関連するsyntaxをparsingする。更なる実施例によると、mvd_l1_zero_flagがreference list L1に対するMVDが0であることを示すのはbi-predictionのblockに対してのみである。よって、mvd_l1_zero_flag及びinter_pred_idc(参照ピクチャリストに関する情報)に基づいてAMVRに関連するsyntaxをparsingする。例えば、mvd_l1_zero_flag及びinter_pred_idc(参照ピクチャリストに関する情報)に基づいて0ではない値が少なくとも一つ存在するのか否かを判断するMvdLXまたはMvdCpLXが決定される。例えば、mvd_l1_zero_flag及びinter_pred_idcに基づいてMvdL1またはMvdCpL1を考慮しなくてもよい。例えば、mvd_l1_zero_flagが1で、inter_pred_idcがPRED_BIであれば、MvdL1またはMvdCpL1を考慮しない。例えば、mvd_l1_zero_flagが1で、inter_pred_idcがPRED_BIであれば、MvdL1またはMvdCpL1が0なのか否かに関わらず、MvdL0またはMvdCpL0のうちから0である値が少なくとも一つ存在するのか否かに基づいてAMVRに関連するsyntaxをparsingする。
図41を参照すると、mvd_l1_zero_flagが1で、inter_pred_idc[x0][y0]==PRED_BIであれば、MvdL1[x0][y0][0]、MvdL1[x0][y0][1]、MvdCpL1[x0][y0][0][0]、MvdCpL1[x0][y0][0][1]、MvdCpL1[x0][y0][1][0]、MvdCpL1[x0][y0][1][1]、MvdCpL1[x0][y0][2][0]、MvdCpL1[x0][y0][2][1]のうち0ではない値が存在するのか否かに関わらない動作を行う。例えば、mvd_l1_zero_flagが1で、inter_pred_idc[x0][y0]==PRED_BIの場合、MvdL0またはMvdCpL0のうち0ではない値が存在しなければ、41MvdL1[x0][y0][0]、MvdL1[x0][y0][1]、MvdCpL1[x0][y0][0][0]、MvdCpL1[x0][y0][0][1]、MvdCpL1[x0][y0][1][0]、MvdCpL1[x0][y0][1][1]、MvdCpL1[x0][y0][2][0]、MvdCpL1[x0][y0][2][1]のうち0ではない値が存在してもAMVRに関連するsyntaxをparsingしない。
また、mvd_l1_zero_flagが0であるか、inter_pred_idc[x0][y0]!=PRED_BIであれば、MvdL1[x0][y0][0]、MvdL1[x0][y0][1]、MvdCpL1[x0][y0][0][0]、MvdCpL1[x0][y0][0][1]、MvdCpL1[x0][y0][1][0]、MvdCpL1[x0][y0][1][1]、MvdCpL1[x0][y0][2][0]、MvdCpL1[x0][y0][2][1]のうち0ではない値が存在するのかを考慮する。例えば、mvd_l1_zero_flagが0であるか、inter_pred_idc[x0][y0]!=PRED_BIであれば、MvdL1[x0][y0][0]、MvdL1[x0][y0][1]、MvdCpL1[x0][y0][0][0]、MvdCpL1[x0][y0][0][1]、MvdCpL1[x0][y0][1][0]、MvdCpL1[x0][y0][1][1]、MvdCpL1[x0][y0][2][0]、MvdCpL1[x0][y0][2][1]のうち0ではない値が存在すれば、AMVRに関連するsyntaxをparsingする。例えば、mvd_l1_zero_flagが0であるか、inter_pred_idc[x0][y0]!=PRED_BIの場合、MvdL1[x0][y0][0]、MvdL1[x0][y0][1]、MvdCpL1[x0][y0][0][0]、MvdCpL1[x0][y0][0][1]、MvdCpL1[x0][y0][1][0]、MvdCpL1[x0][y0][1][1]、MvdCpL1[x0][y0][2][0]、MvdCpL1[x0][y0][2][1]のうち0ではない値が存在すれば、もしMvdL0またはMvdCpL0がいずれも0であってもAMVRに関連するsyntaxをparsingする。
図42は、本開示の一実施例によるinter predictionに関連するsyntaxの構造を示す図である。
本開示の一実施例によると、mvd_l1_zero_flag(第1参照ピクチャリストに対する動きベクトル差分ゼロフラッグ)はreference list L1(第1参照ピクチャリスト)に対するMvd(動きベクトル差分)値が0であることを示すシグナリングである。また、このシグナリングは現在blockより上位レベルでシグナリングされる。よって、mvd_l1_zero_flag値に基づいて多数のblockでreference list L1に対するMvd値が0になり得る。例えば、mvd_l1_zero_flag値が1であれば、reference list L1に対するMvd値が0である。または、mvd_l1_zero_flag及びinter_pred_idc(参照ピクチャリストに関する情報)に基づいてreference list L1に対するMvd値が0である。例えば、mvd_l1_zero_flag値が1で、inter_pred_idcがPRED_BIであれば、reference list L1に対するMvd値が0である。この際、Mvd値はMvdL1[x][y][compIdx]である。また、この際、Mvd値はcontrol point motion vector differenceを意味しない。つまり、この際、Mvd値はMvdCp値を意味しない。
本開示の他の実施例によると、mvd_l1_zero_flagはreference list L1に対するMvd、MvdCp値が0であることを示すシグナリングである。また、このシグナリングは現在blockより上位レベルでシグナリングされる。よって、mvd_l1_zero_flag値に基づいて多数のblockでreference list L1に対するMvd、MvdCp値が0になり得る。例えば、mvd_l1_zero_flag値が1であれば、reference list L1に対するMvd、MvdCp値が0である。または、mvd_l1_zero_flag及ぼいinter_pred_idcに基づいてreference list L1に対するMvd、MvdCp値が0になる。例えば、mvd_l1_zero_flag値が1で、inter_pred_idcがPRED_BIであれば、reference list L1に対するMvd、MvdCp値が0である。この際、Mvd値はMvdL1[x][y][compIdx]である。また、MvdCp値は、MvdCpL1[x][y][cpIdx][compIdx]である。
また、Mvdまたは、MvdCp値が0であることは、該当するmvd_coding syntax structureをparsingしないことを意味する。つまり、例えば、mvd_l1_zero_flag値が1であれば、MvdL1またはMvdCpL1に当たるmvd_coding syntax structureをparsingしない。また、mvd_l1_zero_flag値が0であれば、MvdL1またはMvdCpL1に当たるmvd_coding syntax structureをparsingする。
本開示の一実施例によると、mvd_l1_zero_flagに基づいてMvdCp値が0であれば、MVPを示すシグナリングをparsingしない。MVPを示すシグナリングはmvp_l1_flagを含む。また、上述したmvd_l1_zero_flagの説明によると、mvd_l1_zero_flagシグナリングはMvdとMvdCp両方に対して0であることを示すことを意味する。例えば、reference list L1に対するMvdまたはMvdCp値が0であることを示す条件を満足したら、MVPを示すシグナリングをparsingしない。このような場合、MVPを示すシグナリングを予め設定された値にinferする。例えば、MVPを示すシグナリングが存在しなければ、その値を0にinferする。また、mvd_l1_zero_flagに基づいてMvdまたはMvdCp値が0であることを示す条件を満足しなかったら、MVPを示すシグナリングをparsingする。しかし、このような実施例において、MvdまたはMvdCp値が0であればMVPを選択する自由度がなくなる可能性があり、それによってコーディングの効率が下がる恐れがある。
より詳しくは、reference list L1に対するMvdとMvdCp値が0であることを示す条件を満足し、affine MCを使用したら、MVPを示すシグナリングをparsingしない。このような場合、MVPを示すシグナリングを予め設定された値にinferする。
図42を参照すると、mvd_l1_zero_flagが1で、inter_pred_idc値がPRED_BIであれば、mvp_l1_flagをparsingしない。また、このような場合、mvp_l1_flag値を0にinferする。または、mvd_l1_zero_flagが0で、inter_pred_idc値がPRED_BIでなければ、mvp_l1_flagをparsingする。
本実施例において、mvd_l1_zero_flagに基づいてMVPを示すシグナリングのparsing可否を決定することは、特定条件を満足する際に起こる。例えば、特定条件はgeneral_merge_flagが0である条件を含む。例えば、general_merge_flagは上述したmerge_flagと同じ意味である。また、特定条件はCuPerdModeに基づく条件を含む。より詳しくは、特定条件はCuPerdModeがMODE_IBCではない条件を含む。また、特定条件はCuPerdModeがMODE_INTERである条件を含む。CuPerdModeがMODE_IBCであれば、現在pictureをreferenceとする予測を使用する。また、CuPerdModeがMODE_IBCであれば、そのblockに当たるblock vectorまたはmotion vectorが存在する。もしCuPerdModeがMODE_INTERであれば、現在pictureではないpictureをreferenceとする予測を使用する。CuPerdModeがMODE_INTERであれば、そのblockに当たるmotion vectorが存在する。
よって、本開示の一実施例によると、general_merge_flagが0で、CuPerdModeがMODE_IBCではなく、mvd_l1_zero_flagが1で、inter_pred_idcがPRED_BIであれば、mvp_l1_flagをparsingしない。また、mvp_l1_flagが存在しなければ、その値を0にinferする。
より詳しくは、general_merge_flagが0で、CuPerdModeがMODE_IBCではなく、mvd_l1_zero_flagが1で、inter_pred_idcがPRED_BIで、affine MCを使用すれば、mvp_l1_flagをparsingしない。また、mvp_l1_flagが存在しなければ、その値を0にinferする。
図42を参照すると、sym_mvd_flagをsymmetric MVDを示すシグナリングである。Symmetric MVDの場合、あるMVDに基づいて他のMVDを決定する。Symmetric MVDの場合、explicit signalingされたMVDに基づいて他のMVDを決定する。例えば、symmetric MVDの場合、一つのreference listに対するMVDに基づいて他のreference listに対するMVDを決定する。例えば、symmetric MVDの場合、reference list L0に対するMVDに基づいて他のreference list L1に対するMVDを決定する。あるMVDに基づいて他のMVDを決定する際、前記あるMVDの符号を逆にした値を他のMVDとして決定する。
図43は、本開示の一実施例によるinter predictionに関連するsyntaxの構造を示す図である。
図43の実施例は、図42で説明した問題を解決するための実施例である。本開示の一実施例によると、mvd_l1_zero_flag(第1参照ピクチャリストに対する動きベクトル差分ゼロフラッグ)に基づいてMvd(動きベクトル差分)またはMvdCp(コントロールポイント動きベクトル差分)値が0であれば、MVP(動きベクトル予測子)を示すシグナリングをparsingする。MVPを示すシグナリングはmvp_l1_flag(第1参照ピクチャリストに対する動きベクトル予測子インデックス)を含む。また、上述したmvd_l1_zero_flagの説明によると、mvd_l1_zero_flagシグナリングはMvdとMvdCp両方に対して0であることを示すことを意味する。例えば、reference list L1(第1参照ピクチャリスト)に対するMvdまたはMvdCp値が0であることを示す条件を満足したら、MVPを示すシグナリングをparsingする。よって、MVPを示すシグナリングをinferしない。それによって、mvd_l1_zero_flagに基づいてMvdまたはMvdCp値が0であってもMVPを選択する自由度を有する。それによってコーディングの効率が向上される。また、mvd_l1_zero_flagに基づいてMvdまたはMvdCp値が0であることを示す条件を満足しない場合も、MVPを示すシグナリングをparsingする。
より詳しくは、reference list L1に対するMvdまたはMvdCp値が0であることを示す条件を満足し、affine MCを使用したら、MVPを示すシグナリングをparsingする。
図43のライン4301を参照すると、現在ブロックに対して参照ピクチャリストに関する情報(inter_pred_idc)が獲得される。ライン4302を参照すると、参照ピクチャリストに関する情報(inter_pred_idc)が第0参照ピクチャリスト(list 0)のみを使用しないものではないことを示す場合、ライン4303において、ビットストリームから第1参照ピクチャリスト(list 1)の動きベクトル予測子インデックス(mvp_l1_flag)がパージングされる。
mvd_l1_zero_flag(動きベクトル差分ゼロフラッグ)がビットストリームから獲得される。mvd_l1_zero_flag(動きベクトル差分ゼロフラッグ)は第1参照ピクチャリストに対してMvdLX(動きベクトル差分)及びMvdCpLX(複数のコントロールポイント動きベクトル差分)が0に設定されるのか否かを示す。シグナリングはビットストリームを介してエンコーダからデコーダに伝送される信号を意味する。デコーダはmvd_l1_zero_flag(動きベクトル差分ゼロフラッグ)をビットストリームからパージングする。
mvd_l1_zero_flag(動きベクトル差分ゼロフラッグ)が1で、inter_pred_idc(参照ピクチャリストに関する情報)値がPRED_BIであれば、mvp_l1_flag(動きベクトル予測子インデックス)をparsingする。ここで、PRED_BIはList 0(第0参照ピクチャリスト)及びList 1(第1参照ピクチャリスト)両方を使用することを示す。または、mvd_l1_zero_flag(動きベクトル差分ゼロフラッグ)が0で、inter_pred_idc(参照ピクチャリストに関する情報)値がPRED_BIでなければ、mvp_l1_flag(動きベクトル予測子インデックス)をparsingする。つまり、mvd_l1_zero_flag(動きベクトル差分ゼロフラッグ)が1で、inter_pred_idc(参照ピクチャリストに関する情報)が第0参照ピクチャリスト及び第1参照ピクチャリスト両方を使用することを示すのかに関わらず、mvp_l1_flag(動きベクトル予測子インデックス)がparsingされる。
本実施例において、mvd_l1_zero_flag(第1参照ピクチャリストの動きベクトル差分ゼロフラッグ)に基づいてMvd、MvdCpを決定し、MVPを示すシグナリングをparsingすることは、特定条件を満足した際に可能である。例えば、特定条件はgeneral_merge_flagが0である条件を含む。例えば、general_merge_flagは上述したmerge_flagと同じ意味である。また、特定条件はCuPerdModeに基づく条件を含む。より詳しくは、特定条件はCuPerdModeがMODE_IBCではない条件を含む。また、特定条件はCuPerdModeがMODE_INTERである条件を含む。CuPerdModeがMODE_IBCであれば、現在pictureをreferenceとする予測を使用する。また、CuPerdModeがMODE_IBCであれば、そのblockに当たるblock vectorまたはmotion vectorが存在する。もしCuPerdModeがMODE_INTERであれば、現在pictureではないpictureをreferenceとする予測を使用する。CuPerdModeがMODE_INTERであれば、そのblockに当たるmotion vectorが存在する。
よって、本開示の一実施例によると、general_merge_flagが0で、CuPerdModeがMODE_IBCではなく、mvd_l1_zero_flagが1で、inter_pred_idcがPRED_BIであれば、mvp_l1_flag(第1参照ピクチャリストに対する動きベクトル予測子インデックス)をparsingする。よって、mvp_l1_flag(第1参照ピクチャリストに対する動きベクトル予測子インデックス)が存在し、その値をinferしない。
また、より詳しくは、general_merge_flagが0で、CuPerdModeがMODE_IBCではなく、mvd_l1_zero_flag(第1参照ピクチャリストに対する動きベクトル差分ゼロフラッグ)が1で、inter_pred_idc(参照ピクチャリストに関する情報)がPRED_BIで、affine MCを使用したら、mvp_l1_flagをparsingする。また、mvp_l1_flag(第1参照ピクチャリストに対する動きベクトル予測子インデックス)が存在し、その値をinferしない。
図43と図40の実施例を共に実施してもよい。例えば、MvdまたはMvdCpを初期化した後、mvp_l1_flagをparsingする。この際、MvdまたはMvdCpの初期かは、図40で説明した初期化である。また、mvp_l1_flagのparsingは図43の説明に従う。例えば、mvd_l1_zero_flagに基づいてreference list L1に対するMvd、MvdCp値が0ではない場合、MotionModelIdc値が1であれば、control point index 2のMvdCpL1値を初期化してmvp_l1_flagをparsingする。
図44は、本開示の一実施例によるinter predictionに関連するsyntaxの構造を示す図である。
図44の実施例は、MVPを選択する自由度をなくすためコーディングの効率を上げるための実施例である。また、図44の実施例は、図43で説明した実施例を他の方式で表現するものである。よって、図43の実施例と重複する説明は省略する。
図44の実施例において、mvd_l1_zero_flagに基づいてMvdまたはMvdCp値が0であることを示す場合、MVPを示すシグナリングをparsingする。MVPを示すシグナリングはmvp_l1_flagを含む。
図45は、本開示の一実施例によるinter predictionに関連するsyntaxを示す図である。
本開示の一実施例によると、inter prediction方法はskip mpde、merge mode、inter modeなどを含む。一実施例によると、skip modeではresidual signalが伝送されない。また、skip modeではmerge modeのようなMVの決定方法を使用してもよい。Skip modeの使用可否はskip flagによって決定される。図33を参照すると、cu_skip_flag値によってskip modeの使用可否が決定される。
一実施例によると、merge modeではmotion vector differenceを使用しない。Motion candidate indexに基づいてmotion vectorを決定する。Merge modeの使用可否はmerge flagによって決定される。図33を参照すると、merge_flag値によってmerge modeの使用可否が決定される。また、skip modeを使用しなければ、merge modeを使用することができる。
Skip modeまたはmerge modeにおいて、一つ以上のcandidate listの種類のうちから選択的に使用する。例えば、merge candidateまたはsubblock merge candidateを使用する。または、merge candidateはsignal neighboring から選択、temporal candidateなどを含む。また、merge candidateは現在block(CU:coding unit)全体に対するmotion vectorを使用するcandidateを含む。つまり、現在blockに属する各subblockのmotion vectorが同じcandidateを含む。また、subblock merge candidateはsubblock-based temporal MV、affine merge candidateなどを含む。また、subblock merge candidateは現在block(CU)のsubblock別に異なるmotion vectorを使用可能なcandidateを含む。Affine merge candidateは、affine motion predictionのcontrol point motion vectorを決定する際にmotion vector differenceを使用せずに決定する方法で作った方法である。また、subblock merge candidateは現在blockでsubblock単位にmotion vectorを決定する方法を含む。例えば、subblock merge candidateは上述したsubblock-based temporal MVとaffine merge candidate以外にもplanar MV、regression based MV、STMVPなどを含む。
一実施例によると、inter modeではmotion vector differenceを使用する。Motion candidate indexに基づいてmotion vector predictiorを決定し、motion vector predictorとmotion vector differenceに基づいてmotion vectorを決定する。Inter modeの使用可否は他のmodeの使用可否によって決定される。他の実施例として、inter modeの使用可否はflagによって決定される。図45では他のmodeであるskip modeとmerge modeを使用しない場合、inter modeを使用する例を示している。
Inter modeはAMVPmode、affine inter modeなどを含む。Inter modeはmotion vector predictorとmotion vector differenceに基づいてmotion vectorを決定するモードである。Affine inter modeは、affine motion predictionのcontrol point motion vectorを決定する際にmotion vector differenceを使用する方法である。
図45を参照すると、skip modeまたはmerge modeに決定された後、subblock merge candidateを使用するのか、merge candidateを使用するのかを決定する。例えば、特定条件を満足したら、subblock merge candidateの使用可否を示すmerge_subblock_flagをparsingする。前記特定条件はblock sizeに関する条件である。例えば、width、height、areaなどに関する条件であってもよく、これらを組み合わせて使用してもよい。図45を参照すると、例えば、現在block(CU)のwidth及びheightが特定値以上である際の条件である。merge_subblock_flagをparsingする場合、その値を0にinferする。もしmerge_subblock_flagが1であればsubblock merge candidateを使用し、0であればmerge candidateを使用する。Subblock merge candidateを使用すればcandidate indexであるmerge_subblock_Idxをparsingし、merge candidateを使用すればcandidate indexであるmerge_Idxをparsingする。この際、candidate listのmaximum個数が1であればparsingしない。merge_subblock_Idxまたはmerge_Idxをparsingしなければ0にinferする。
図45はcoding_unit関数を示すが、intra predictionに関する内容な省略しており、図45はinter predictionに決定された場合を示す。
図46は、本開示の一実施例によるtriangle partitioning modeを示す図である。
本開示で言及するtriangle partitioning mode(TPM)は、triangle partition mode、triangle prediction、triangle based prediction、triangle motion compensation、triangluar prediction、triangle inter prediction、triangluar merge mode、triangle merge modeなど多様な名称で称される。また、TPMはgeometric partitioning mode(GPM)に含まれる。
図46に示したように、TPMは矩形のブロックを2つの三角形に分ける方式である。しかし、GPMはブロックを多様な方式で2つのブロックに分割する。例えば、GPMは一つの矩形ブロックを図46のように2つの三角形ブロックに分割する。また、GPMは一つの矩形ブロックを一つの五角形ブロックと一つの三角形ブロックに分割する。また、GPMは一つの矩形ブロックを2つの四角形ブロックに分割する。ここで、矩形は正方形を含む。以下では、説明の便宜上、GPMの簡単なバージョンであるTPMを基準に説明するが、GPMを含むと解釈すべきである。
本開示の一実施例によると、予測する方法としてuni-predictionが存在する。Uni-predictionは一つのreference listを使用する予測方法である。前記reference listは多数存在するが、一実施例によると、L0、L1の2つが存在する。Uni-predictionを使用する場合、一つのblockで一つのreference listを使用する。また、uni-predictionを使用する場合、一つのpixelを予測するのに一つのmotion informationを使用する。本開示において、blockはCU(coding unit)、PU(prediction unit)を意味する。また、本開示において、blockはTU(transform unit)を意味する。
本開示の他の実施例によると、予測する方法としてbi-predictionが存在する。Bi-predictionは多数のreference listを使用する予測方法である。Bi-predictionは2つのreference listを使用する予測方法である。例えば、bi-predictionはL0とL1のreference listを使用する。Bi-predictionを使用する場合、一つのblockで多数のreference listを使用する。例えば、bi-predictionを使用する場合、一つのblockで2つのreference listを使用する。また、bi-predictionを使用する場合、一つのpixelを予測するのに多数のmotion informationを使用する。
前記motion informationは、motion vector、reference index、prediction list utilization flagを含む。
前記reference listはreference picture listである。
本開示において、uni-predictionまたはbi-predictionに当たるmotion informationを一つのmotion information setと定義する。
本開示の一実施例によると、TPMを使用する場合、多数のmotion information setを使用する。例えば、TPMを使用する場合、2つのmotion information setを使用する。例えば、TPMを使用する場合、多くても2つのmotion information setを使用する。また、TPMを使用するblock内で2つのmotion information setが適用される方法は位置に基づく。例えば、TPMを使用するblock内で予め設定された位置に対しては一つのmotion information setを使用し、他の予め設定された位置に対しては他の一つのmotion information setを使用する。更に、他の予め設定された位置に対しては、2つのmotion information setを共に使用する。例えば、他の予め設定された位置に対しては、一つのmotion information setに基づく予測1と他の一つのmotion information setに基づく予測2に基づいて予測3を予測に使用する。例えば、予測3は予測1と予測2のweighted sumである。
図46を参照すると、Partition 1とPartition 2は前記予め設定された位置と前記他の予め設定された位置を概略的に示す。TPMを使用する場合、図46に示したように2つのsplit方法のうち一つを使用する。2つのsplit方法はdiagonal split、anti-diagonal splitを含む。また、splitによって2つのtriangle-shaped partitionsに分けられる。上述したように、TPMはGPMに含まれる。GPMについては上述したため、重複する説明は省略する。
本開示の一実施例によると、TPMを使用する場合、各Partitionに対してuni-predictionのみを使用する。つまり、各Partitionに対して一つのmotion informationを使用する。これはmemory access、computational complexityなどの複雑度を下げるためである。よって、CUに対して2つおmotion informationのみを使用する。
また、各motion informationをcandidate listから決定する。一実施例によると、TPMで使用するcandidate listはmerge candidate listに基づく。他の実施例として、TPMで使用するcandidate listはAMVP candidate listに基づく。よって、TPMを使用するためにcandidate indexをシグナリングする。また、TPMを使用するblockに対してTPMでPartitionの個数だけ、または多くてもPartitionの個数だけのcandidate indexをencoding、decoding、parsingする。
また、あるblockがTPMによって多数のmotion informationに基づいてpredictionされても、transform及びquantizationは前記あるblock全体に対して行われる。
図47は、本開示の一実施例によるmerge data syntaxを示す図である。本開示の一実施例によると、merge data syntaxを多様なmodeに関するシグナリングを含む。前記多様なmodeは、regular merge mode、MMVD(merge with MVD)、subblock merge mode、CIIP(combined intra-and inter-prediction)、TPMなどを含む。Regular merge modeはHEVにおいてmerge modeと同じmodeである。また、前記多様なmodeをblockで使用するのかを示すシグナリングが存在する。また、このシグナリングはsyntax elementとしてparsingされるか、implicitly signalingされる。図47を参照すると、regular merge mode、MMVD、subblock merge mode、CIIP、TPMを使用するのかを示すシグナリングは、それぞれregular_merge_flag、mmvd_merge_flag(またはmmvd_flag)、merge_subblock_flag、ciip_flag(またはmh_intra_flag)、MergeTriangleFlag(またはmerge_triangle_flag)である。
本開示の一実施例によると、merge modeを使用する場合、前記多様なmodeのうちからあるmodeを除いた全てのmodeを使用しないとシグナリングすれば、前記あるmodeを使用すると決定する。また、merge modeを使用する場合、前記多様なmodeのうちからあるmodeを除いた全てのmodeのうち少なくとも一つは使用するとシグナリングすれば、前記あるmodeを使用しないと決定する。また、modeを使用可能であるのかを示す上位レベルシグナリングが存在する。上位レベルはあるblockを含む単位である。上位レベルはsequence、picture、slice、tile group、tile、CTUなどである。もしmodeを使用可能であるのかを示す上位レベルシグナリングが使用可能であることを示せば、そのmodeを使用するのかを示す追加のシグナリングが存在し、そのmodeを使用するか使用しない。もしmodeを使用可能であるのかを示す上位レベルシグナリングが使用不可能であることを示せば、そのmodeを使用しない。例えば、merge modeを使用する場合、regular merge mode、MMVD、subblock merge mode、CIIPをいずれも使用しないとシグナリングすれば、TPMを使用すると決定する。また、merge modeを使用する場合、regular merge mode、MMVD、subblock merge mode、CIIPのうち少なくとも一つを使用するとシグナリングすれば、TPMを使用しないと決定する。また、merge modeを使用するのかを示すシグナリングが存在する。例えば、merge modeを使用するの価を示すシグナリングはgeneral_merge_flagまたはmerge_flagである。もしmerge modeを使用すれば、図47のようなmerge data syntaxをparsingする。
また、TPMを使用可能なblock sizeが制限的である。例えば、width、heightがいずれも8以上であればTPMを使用する。
もしTPMを使用すれば、TPMに関連するsyntax elementがparsingされる。TPMに関連するsyntax elementはsplit方法を示すシグナリング、candidate indexを示すシグナリングを含む。Split方法はsplit方向を意味する。Candidate indexを示すシグナリングはTPMを使用するblockに対して多数(例えば、2つ)存在する。図47を参照すると、split方法を示すシグナリングはmerge_triangle_split_dirである。また、candidate indexを示すシグナリングはmerge_triangle_Idx0、merge_triangle_Idx1である。
本開示において、TPMに対するcandidate indexをm、nとする。例えば、図46のPartition 1とPartition 2に対するcandidate indexがそれぞれm、nである。一実施例によると、m、nは図47で説明したcandidate indexを示すシグナリングに基づいて決定される。本開示の一実施例によると、m、nのうち一つはmerge_triangle_Idx0とmerge_triangle_Idx1のうち一つに基づいて決定され、m、nのうち残りの一つはmerge_triangle_Idx0とmerge_triangle_Idx1両方に基づいて決定される。
または、m、nのうち一つはmerge_triangle_Idx0とmerge_triangle_Idx1のうち一つに基づいて決定され、m、nのうち残りの一つはmerge_triangle_Idx0とmerge_triangle_Idx1のうち残りの一つに基づいて決定される。
より詳しくは、mはmerge_triangle_Idx0に基づいて決定され、nはmerge_triangle_Idx0(またはm)とmerge_triangle_Idx1に基づいて決定される。例えば、以下のようにm、nが決定される。
m=merge_triangle_Idx0
n=merge_triangle_Idx1+(merge_triangle_Idx1>=m)?1:0
本開示の一実施例によると、mとnは同じくではない。これはTPMにおいて、2つのcandidate indexが同じであれば、つまり、2つのmotion informationが同じであればpartitioningの効果が得られないためである。よって、このようなシグナリング方法はnをシグナリングする際、n>mであればシグナリングビット数を減らすためである。全体のcandidateのうち、mはnではないため、シグナリングから除外することができる。
TPMで使用するcandidate listをmergeCanListとすると、TPMにおいて、mergeCanList[m]とmergeCanList[n]をmotion informationとして使用する。
図48は、本開示の一実施例による上位レベルシグナリングを示す図である。
本開示の一実施例によると、多数の上位レベルシグナリングが存在する。上位レベルシグナリングは上位レベル単位で伝送されるシグナリングである。上位レベル単位は一つ以上の下位レベル単位を含む。上位レベルシグナリングは一つ以上の下位レベル単位に適用されるシグナリングである。例えば、sliceまたはsequenceはCU、PU、TUなどに対して上位レベル単位である。逆に、CU、PU、またはTUはsliceまたはsequenceに対して下位レベル単位である。
本開示の一実施例によると、上位レベルシグナリングはcandidateのmaximum numberを示すシグナリングを含む。例えば、上位レベルシグナリングはmerge candidateのmaximum numberを示すシグナリングを含む。例えば、上位レベルシグナリングはTPMで使用されるcandidateのmaximum numberを示すシグナリングを含む。前記merge candidateのmaximum numberを示すシグナリングまたはTPMで使用されるcandidateのmaximum numberを示すシグナリングは、inter predictionが許容されればシグナリング、parsingされる。Inter predictionが強要されるのかはslice typeによって決定される。Slice typeはI、P、Bなどが存在する。例えば、slice typeがIであればinter predictionが許容されない。例えば、slice typeがIであればintra predictionまたはintra block copy(IBC)のみ使用する。また、slice typeがPまたはBであればinter predictionが許容される。また、slice typeがPまたはBであればintra prediction、IBCなどが許容される。また、slice typeがPであれなpixelを予測するのに多くても一つのreference listを使用する。また、slice typeがBであれなpixelを予測するのに多数つのreference listを使用する。例えば、slice typeがBであれなpixelを予測するのに多ければ2つのreference listを使用する。
本開示の一実施例によると、maximum numberをシグナリングする際、基準値に基づいてシグナリングする。例えば、(基準値-maximum number)をシグナリングする。よって、decoderでparsingした値と基準値に基づいてmaximum numberをderiveする。例えば、(基本値-parsingした値)をmaximum numberとして決定する。
一実施例によると、前記merge candidateのmaximum numberを示すシグナリングにおける基準値は6である。
一実施例によると、前記TPMで使用されるcandidateのmaximum numberを示すシグナリングにおける基準値は、前記merge candidateのmaximum numberである。
図48を参照すると、merge candidateのmaximum numberを示すシグナリングはsix_minus_max_num_merge_candである。ここで、merge candidateはマージモードベクトル予測に対する候補を意味する。以下、説明の便宜上、six_minus_max_num_merge_candを第1情報と称する。図2及び図7を参照すると、シグナリングはビットストリームを介してエンコーダからデコーダに伝送される信号を意味する。six_minus_max_num_merge_cand(第1情報)はシーケンス単位でシグナリングされる。デコーダはビットストリームからsix_minus_max_num_merge_cand(第1情報)をパージングする。
また、TPMで使用されるcandidateのmaximum numberを示すシグナリングは、max_num_merge_cand_minus_max_num_triangle_candである。図2及び図7を参照すると、シグナリングはビットストリームを介してエンコーダからデコーダに伝送される信号を意味する。デコーダはビットストリームからmax_num_merge_cand_minus_max_num_triangle_cand(第3情報)をパージングする。max_num_merge_cand_minus_max_num_triangle_cand(第3情報)はパーティショニングされたブロックのためのマージモード候補の最大個数に関する情報である。
また、merge candidateのmaximum numberはMaxNumMergeCand(マージ候補の最大個数)であり、この値はsix_minus_max_num_merge_cand(第1情報)に基づく。また、TPMで使用されるcandidateのmaximum numberはMaxNumTriangleMergeCandであり、この値はmax_num_merge_cand_minus_max_num_triangle_candに基づく。MaxNumMergeCand(マージ候補の最大個数)はマージモード使用されるが、ブロックが動き補償のためにパーティショニングされるか、またはパーティショニングされない場合に使用される。以上ではTPMを基準に説明したが、GPMについても同じ方式で説明される。
本開示の一実施例によると、TPM modeを使用可能であるのかを示す上位レベルシグナリングが存在する。図48を参照すると、TPM modeを使用可能であるのかを示す上位レベルシグナリングは、sps_triangle_enabled_flag(だ2情報)である。TPM modeを使用可能であるのかを示す情報は、インター予測のために図46のようにブロックのパーティショニン可否を示す情報と同じである。GPMはTPMを含むため、ブロックのパーティショニング可否を示す情報はGPMモードの使用可否を示す情報と同じである。インター予測のためということは、動き補償のためということを示す。つまり、sps_triangle_enabled_flag(第2情報)はインター予測のためのブロックのパーティショニング可否を示す情報である。ブロックのパーティショニング可否を示す第情報が1であれば、TPMまたはGPMを使用可能であることを示す。また、第2情報が0であれば、TPMまたはGPMが使用不可能であることを示す。しかし、これに限らず、第2情報が0であれば、TPMまたはGPMを使用可能であることを示す。また、第2情報が1であれば、TPMまたはGPMが使用不可能であることを示す。
図2及び図7を参照すると、シグナリングはビットストリームを介してエンコーダからデコーダに伝送される信号を意味する。デコーダはビットストリームからsps_triangle_enabled_flag(第2情報)をパージングする。
本開示の一実施例によると、TPMのpartitioning個数以上のTPMで使用されるcandidateが存在する場合にのみTPMを使用する。例えば、TPMが2つにpartitioningされる際、TPMで使用されるcandidateが2つ以上存在する場合にのみTPMを使用する。一実施例によると、TPMで使用するcandidateはmerge candidateに基づく。よって、本開示の一実施例によると、merge candidateのmaximum numberが2以上であればTPMを使用する。よって、merge candidateのmaximum numberが2以上であればTPMに関するシグナリングをparsingする。TPMに関するシグナリングは、TPMで使用されるcandidateのmaximum numberを示すシグナリングである。
図48を参照すると、sps_triangle_enabled_flagが1で、MaxNumMergeCandが2以上であれば、max_num_merge_cand_minus_max_num_triangle_candをparsingする。また、sps_triangle_enabled_flagが0であるか、MaxNumMergeCandが2より小さければ、max_num_merge_cand_minus_max_num_triangle_candをparsingしない。
図49は、本開示の一実施例によるTPMで使用されるcandidateのmaximum numberを示す図である。
図49を参照すると、TPMで使用されるcandidateのmaximum numberはMaxNumTriangleMergeCandである。また、TPMで使用されるcandidateのmaximum numberを示すシグナリングは、max_num_merge_cand_minus_max_num_triangle_candである。また、図48で説明した内容は省略する。
本開示の一実施例によると、TPMで使用されるcandidateのmaximum numberは「TPMのpartition個数」から「TPMで使用されるcandidateのmaximum numberを示すシグナリングにおける基準値」の範囲(inculsive)に存在する。よって、TPMのpartition個数が2で、基準値がmerge candidateのmaximum numberであれば、図49に示したように、MaxNumTriangleMergeCandは2からMaxNumMergeCandの範囲(inculsive)に存在する。
本開示の一実施例によると、TPMで使用されるcandidateのmaximum numberを示すシグナリングが存在しなければ、TPMで使用されるcandidateのmaximum numberを示すシグナリングをinferするか、TPMで使用されるcandidateのmaximum numberを示すinferする。例えば、TPMで使用されるcandidateのmaximum numberを示すシグナリングが存在しなければ、TPMで使用されるcandidateのmaximum numberを0にinferする。また、TPMで使用されるcandidateのmaximum numberを示すシグナリングが存在しなければ、TPMで使用されるcandidateのmaximum numberを示すシグナリングを基準値にinferする。
また、TPMで使用されるcandidateのmaximum numberを示すシグナリングが存在しなければ、TPMを使用しない。また、TPMで使用されるcandidateのmaximum numberがTPMのpartition個数より小さければ、TPMを使用しない。また、TPMで使用されるcandidateのmaximum numberが0であれば、TPMを使用しない。
しかし、図48乃至図49の実施例によると、TPMのpartition個数と「TPMで使用されるcandidateのmaximum numberを示すシグナリングにおける基準値」が同じであれば、TPMで使用されるcandidateのmaximum numberとして可能な値は1つのみである。しかし、図48乃至図49の実施例によると、そのような場合でもTPMで使用されるcandidateのmaximum numberを示すシグナリングがparsingされるが、これは不必要である。もしMaxNumMergeCandが2であれば、図49を参照すると、MaxNumTriangleMergeCandとして可能な値は2のみである。しかし、図48を参照すると、そのような場合でもmax_num_merge_cand_minus_max_num_triangle_candをparsingする。
図49を参照すると、MaxNumTriangleMergeCandは(MaxNumMergeCand-max_num_merge_cand_minus_max_num_triangle_cand)に決定される。
図50は、本開示の一実施例によるTPMに関する上位レベルシグナリングを示す図である。本開示の一実施例によると、TPMのpartition個数と「TPMで使用されるcandidateのmaximum numberを示すシグナリングにおける基準値」が同じであれば、TPMで使用されるcandidateのmaximum numberを示すシグナリングをparsingしない。また、上述した一実施例によると、TPMのpartition個数は2である。また、「TPMで使用されるcandidateのmaximum numberを示すシグナリングにおける基準値」は、merge candidateのmaximum numberである。よって、merge candidateのmaximum numberが2であれば、TPMで使用されるcandidateのmaximum numberを示すシグナリングをparsingしない。
または、「TPMで使用されるcandidateのmaximum numberを示すシグナリングにおける基準値」がTPMのpartition個数以下であれば、TPMで使用されるcandidateのmaximum numberを示すシグナリングをparsingしない。よって、merge candidateのmaximum numberが2以下であれば、TPMで使用されるcandidateのmaximum numberを示すシグナリングをparsingしない。
図50のライン5001を参照すると、MaxNumMergeCand(マージ候補の最大個数)が2であるか、またはMaxNumMergeCand(マージ候補の最大個数)が2以下であれば、max_num_merge_cand_minus_max_num_triangle_cand(第3情報)をparsingしない。また、sps_triangle_enabled_flag(第2情報)が1で、MaxNumMergeCand(マージ候補の最大個数)が2より大きければ、max_num_merge_cand_minus_max_num_triangle_cand(第3情報)をparsingする。また、sps_triangle_enabled_flag(第2情報)が0であれば、max_num_merge_cand_minus_max_num_triangle_cand(第3情報)をparsingしない。よって、sps_triangle_enabled_flag(第2情報)が0であるか、MaxNumMergeCand(マージ候補の最大個数)が2以下であれば、max_num_merge_cand_minus_max_num_triangle_cand(第3情報)をparsingしない。
図51は、本開示の一実施例によるTPMで使用されるcandidateのmaximum numberを示す図である。図51の実施例は、図50の実施例の場合に共に実施されてもよい。また、上述したものは本図面において説明を省略している可能性がある。
本開示の一実施例によると、「TPMで使用されるcandidateのmaximum numberを示すシグナリングにおける基準値」がTPMのpartition個数であれば、TPMで使用されるcandidateのmaximum numberをTPMのpartition個数にinfer、設定する。また、infer、設定することは、TPMで使用されるcandidateのmaximum numberを示すシグナリングが存在しない場合である。図50の実施例によると、「TPMで使用されるcandidateのmaximum numberを示すシグナリングにおける基準値」がTPMのpartition個数であれば、TPMで使用されるcandidateのmaximum numberを示すシグナリングをparsingせず、TPMで使用されるcandidateのmaximum numberを示すシグナリングが存在すれば、TPMで使用されるcandidateのmaximum numberの値を個数にinferする。まあ、更なる条件を満足した場合にこれを行う。更なる条件は、TPM modeを使用可能であるのかを示す上位レベルシグナリングが1である条件である。
また、本実施例において、TPMで使用されるcandidateのmaximum numberをinfer、設定することを説明したが、TPMで使用されるcandidateのmaximum numberをinfer、設定する代わりに説明したTPMで使用されるcandidateのmaximum number値が導出されるように、TPMで使用されるcandidateのmaximum numberを示すシグナリングをinfer、設定することもできる。
図50を参照すると、sps_triangle_enabled_flag(第2情報)が1を示し、MaxNumMergeCand(マージ候補の最大個数)が2より大きければ、max_num_merge_cand_minus_max_num_triangle_cand(第3情報)が受信される。この際、図51のライン5101を参照すると、明確にシグナリングされたmax_num_merge_cand_minus_max_num_triangle_cand(第3情報)を利用してMaxNumTriangleMergeCand(パーティショニングされたブロックのためのマージモード候補の最大個数)が獲得される。要するに、sps_triangle_enabled_flag(第2情報)が1を示し、MaxNumMergeCand(マージ候補の最大個数)が3より大きいか同じであれば、MaxNumMergeCand(マージ候補の最大個数)から第3情報(max_num_merge_cand_minus_max_num_triangle_cand)を差し引いて、MaxNumTriangleMergeCand(パーティショニングされたブロックのためのマージモード候補の最大個数)が獲得される。
図51のライン5102を参照すると、sps_triangle_enabled_flag(第2情報)が1で、MaxNumMergeCand(マージ候補の最大個数)が2であれば、MaxNumTriangleMergeCand(パーティショニングされたブロックのためのマージモード候補の最大個数)を2に設定する。より詳しくは、上述したように、sps_triangle_enabled_flag(第2情報)が1で、MaxNumMergeCand(マージ候補の最大個数)が2より大きければmax_num_merge_cand_minus_max_num_triangle_cand(第3情報)が受信されるため、ライン5102のように、sps_triangle_enabled_flag(第2情報)が1で、MaxNumMergeCand(マージ候補の最大個数)が2であれば、max_num_merge_cand_minus_max_num_triangle_cand(第3情報)が受信されない。この際、 MaxNumTriangleMergeCand (パーティショニングされたブロックのためのマージモード候補の最大個数)はmax_num_merge_cand_minus_max_num_triangle_cand(第3情報)なしに決定される。
また、図51のライン5103を参照すると、sps_triangle_enabled_flag(第2情報)が0であるか、MaxNumMergeCand(マージ候補の最大個数)が2でなければ、MaxNumTriangleMergeCand(パーティショニングされたブロックのためのマージモード候補の最大個数)を0にinfer、設定する。この際、ライン5101において、上述したように、sps_triangle_enabled_flag(第2情報)が1を示し、MaxNumMergeCand(マージ候補の最大個数)が3より大きいか同じであればmax_num_merge_cand_minus_max_num_triangle_cand(第3情報)がシグナリングされるため、MaxNumTriangleMergeCandを0にinfer、設定する場合は、前記第2情報が0であるか、前記マージ候補の最大個数が1である場合である。要するに、sps_triangle_enabled_flag(第2情報)が0であるか、MaxNumMergeCand(マージ候補の最大個数)が1であれば、MaxNumTriangleMergeCand(パーティショニングされたブロックのためのマージモード候補の最大個数)は0に設定される。
MaxNumMergeCand(マージ候補の最大個数)とMaxNumTriangleMergeCand(パーティショニングされたブロックのためのマージモード候補の最大個数)は互いに異なる用途に使用される。例えば、MaxNumMergeCand(マージ候補の最大個数)はブロックが動き補償のためにパーティショニングされるかパーティショニングされない場合に使用される。しかし、MaxNumTriangleMergeCand(パーティショニングされたブロックのためのマージモード候補の最大個数)はブロックがパーティショニングされている場合にのみ使用される情報である。マージモードであるパーティショニングされたブロックに対する候補の個数は、MaxNumTriangleMergeCand(パーティショニングされたブロックのためのマージモード候補の最大個数)を超えない。
また、他の実施例を使用することもできる。図51の実施例において、MaxNumMergeCandが2でなければ2より大きい場合も含むが、その場合、MaxNumTriangleMergeCandを0にinfer、設定するということの意味が不明になる恐れがあるが、そのような場合はTPMで使用されるcandidateのmaximum numberを示すシグナリングが存在してinferしないようになるため、動作に異常がない。しかし、この実施れでは意味を活かしてinferする。
もしsps_triangle_enabled_flag(第2情報)が1で、MaxNumMergeCand(マージ候補の最大個数)が2以上であれば、MaxNumTriangleMergeCandを2(またはMaxNumMergeCandが)にinfer、設定する。そうでない場合(つまり、sps_triangle_enabled_flagが0であるかMaxNumMergeCandが2より小さい場合)、MaxNumTriangleMergeCandを0にinfer、設定する。
もしsps_triangle_enabled_flagが1でMaxNumMergeCandが2であれば、MaxNumTriangleMergeCandを2にinfer、設定する。そうではなく、もし(otherwise if)sps_triangle_enabled_flagが10であれば、MaxNumTriangleMergeCandを0にinfer、設定する。
よって、前記実施例において、図50の実施れによると、MaxNumMergeCandが0 or 1 or 2であれば、TPMで使用されるcandidateのmaximum numberを示すシグナリングが存在せず、MaxNumMergeCandが0 or 1であれば、TPMで使用されるcandidateのmaximum numberを0にinfer、設定する。MaxNumMergeCandが2であれば、TPMで使用されるcandidateのmaximum numberを2にinfer、設定する。
図52は、本開示の一実施例によるTPMに関連するsyntax elementを示す図である。
上述したように、TPMで使用されるcandidateのmaximum numberが存在し、TPMのpartition個数が予め設定されている。また、TPMで使用するcandidate indexは互いに異なり得る。
本開示の一実施例によると、TPMで使用されるcandidateのmaximum numberがTPMのpartition個数と同じであれば、そうではない場合とは異なるシグナリングを行う。例えば、TPMで使用されるcandidateのmaximum numberがTPMのpartition個数と同じであれば、そうではない場合とは異なるcandidate indexシグナリングを行う。それによってより少ないビットでシグナリングすることができる。また、TPMで使用されるcandidateのmaximum numberがTPMのpartition個数以下であれば、そうではない場合とは異なるシグナリングを行う(このうちTPMのpartition個数より小さい場合は、TPMを使用できない場合である)。
TPMのpartitionが2であれば、2つのcandidate indexをシグナリングする。もしTPMで使用されるcandidateのmaximum numberが2であれば、candidate indexの組み合わせは2つのみである。2つの組み合わせはm、nがそれぞれ0、1であるものと1、0であるものである。よって、1-bitのシグナリングのみで2つのcandidate indexをシグナリングする。
図52を参照すると、MaxNumTriangleMergeCandが2であれば、そうではない場合(そうではなくTPMを使用する場合はMaxNumTriangleMergeCandが2より大きい場合)とは異なるcandidate indexシグナリングを行う。また、MaxNumTriangleMergeCandが2以下であれば、そうではない場合(そうではなくTPMを使用する場合はMaxNumTriangleMergeCandが2より大きい場合)とは異なるcandidate indexシグナリングを行う。他のcandidate indexシグナリングは、図52を参照すると、merge_triangle_idx_indicator parsingである。他のcandidate indexシグナリングは、merge_triangle_idx0またはmerge_triangle_idx1をparsingしないシグナリング方法である。それについては図53で更に説明する。
図53は、本開示の一実施例によるTPM candidate indexのシグナリングを示す図である。
本開示の一実施例によると、図52で説明した他のindexシグナリングを使用すれば、candidate indexをmerge_triangle_idx_indicatorに基づいて決定する。また、他のindexシグナリングを使用すれば、merge_triangle_idx0またはmerge_triangle_idx1が存在しない可能性がる。
本開示の一実施例によると、TPMで使用されるcandidateのmaximum numberがTPMのpartition個数と同じであれば、TPM candidate indexをmerge_triangle_idx_indicatorに基づいて決定する。また、これはTPMを使用するblockの場合である。
より詳しくは、MaxNumTriangleMergeCandが2であれば(または、MaxNumTriangleMergeCandが2で、MergeTriangleFlagが1であれば)、merge_triangle_idx_indicatorに基づいてTPM candidate indexを決定する。この場合、merge_triangle_idx_indicatorが0であれば、TPM candidate indicesであるm、nをそれぞれ0、1に設定し、もしmerge_triangle_idx_indicatorが1であれば、TPM candidate indicesであるm、nをそれぞれ1、0に設定する。または、m、nが説明したようにparsingされる値(syntax element)であるmerge_triangle_idx0またはmerge_triangle_idx1をinfer、設定する。
図47で説明したmerge_triangle_idx0、merge_triangle_idx1に基づいてm、nを設定する方法を参照し、図53を参照すると、merge_triangle_idx0が存在しなければ、もしMaxNumTriangleMergeCandが2であれば(または、MaxNumTriangleMergeCandが2で、MergeTriangleFlagが1であれば)、merge_triangle_idx_indicatorが1であればmerge_triangle_idx0値を1にinferする。また、そうでない場合、merge_triangle_idx0値を0にinferする。また、merge_triangle_idx1が存在しなければ、merge_triangle_idx1を0にinferする。よって、MaxNumTriangleMergeCandが2であれば、merge_triangle_idx_indicatorが0である際、merge_triangle_idx0、merge_triangle_idx1がそれぞれ0、0で、それによってm、nはそれぞれ0、1になる。また、MaxNumTriangleMergeCandが2であれば、merge_triangle_idx_indicatorが1である際、merge_triangle_idx0、merge_triangle_idx1がそれぞれ1、0で、それによってm、nはそれぞれ1、0になる。
図54は、本開示の一実施例によるTPM candidate indexのシグナリングを示す図である。
図47ではTPM candidate indicesを決定する方法を説明したが、図54における実施例では他の決定方法、シグナリング方法を説明する。上述したものと重複する説明は省略する。また、m、nは図47で説明したようにcandidate indicesを示す。
本開示の一実施例によると、merge_triangle_idx0とmerge_triangle_idx1のうち、予め設定されたsyntax elementにm、nのうち小さい値をシグナリングする。また、merge_triangle_idx0とmerge_triangle_idx1のうち残りの一つにはmとnの差に基づく値をシグナリングする。また、mとnの大小関係を示す値をシグナリングする。
例えば、merge_triangle_idx0はm、nのうち小さい値である。また、merge_triangle_idx1は|m、n|に基づく値であるmerge_triangle_idx1は(|m、n|-1)である。これは、mとnが同じではないためである。また、mとnの大小関係を示す値が図54のmerge_triangle_biggerである。
この関係を利用して、merge_triangle_idx0とmerge_triangle_idx1、merge_triangle_biggerに基づいてm、nを決定する。図54を参照すると、merge_triangle_bigger値に基づいて他の動作を行う。例えば、merge_triangle_biggerが0であれば、nがmより大きい。この場合、mはmerge_triangle_idx0である。また、nは(merge_triangle_idx1+m+1)である。また、merge_triangle_biggerが1であれば、mがnより大きい。この場合、nはmerge_triangle_idx0である。また、mは(merge_triangle_idx1+n+1)である。
図54の方法は、図47の方法に比べm、nのうち小さい値が0ではない場合(または大きい場合)にシグナリングオーバーヘッドを減らすという長所がある。例えば、m、nがそれぞれ3、4であれば、図47の方法ではmerge_triangle_idx0、merge_triangle_idx1をそれぞれ3、3にシグナリングすべきである。しかし、図54の方法ではm、nがそれぞれ3、4であれば、merge_triangle_idx0、merge_triangle_idx1をそれぞれ3、0にシグナリングすべきである(これに加えて大小関係を示すシグナリングが必要である)。よって、variable length signalingを使う際、encoding、decodingする値のサイズが減るため、小さいビットを使用することができる。
図55は、本開示の一実施例によるTPM candidate indexのシグナリングを示す図である。
図47ではTPM candidate indicesを決定する方法を説明したが、図55における実施例では他の決定方法、シグナリング方法を説明する。上述したものと重複する説明は省略する。また、m、nは図47で説明したようにcandidate indicesを示す。
本開示の一実施例によると、merge_triangle_idx0とmerge_triangle_idx1のうち、予め設定されたsyntax elementにm、nのうち大きい値をシグナリングする。また、merge_triangle_idx0とmerge_triangle_idx1のうち残りの一つにはmとnのうち小さい値に基づく値をシグナリングする。また、mとnの大小関係を示す値をシグナリングする。
例えば、merge_triangle_idx0はm、nのうち大きい値に基づく。一実施例によると、m、nが同じではないため、m、nのうち大きい値は1以上である。よって、m、nのうち大きい値が除外されることを考慮して、より小さいビットでシグナリングする。例えば、merge_triangle_idx0は((m、nのうち大きい値)-1)である。この際、merge_triangle_idx0のmaximum値は(MaxNumTriangleMergeCand-1-1)である(0から始まる値であるため-1、大きい値が0であるものを除外できるため-1)。Maximum値はbinarizationで使用され、maximum値が減るとより小さいビットを使用する場合があり得る。例えば、merge_triangle_idx1はm、nのうち小さい値である。また、merge_triangle_idx1のmaximum値はmerge_triangle_idx0である。よって、maximum値をMaxNumTriangleMergeCandに設定するより更に小さいビットを使用する場合があり得る。また、merge_triangle_idx0が0であれば、つまり、m、nのうち大きい値が1であれば、m、nのうち小さい値が0であるため、追加のシグナリングが存在しない。例えば、merge_triangle_idx0が0であれば、つまり、m、nのうち大きい値が1であれば、m、nのうち小さい値を0に決定する。また、merge_triangle_idx0が0であれば、つまり、m、nのうち大きい値が1であれば、merge_triangle_idx1を0にinfer、決定する。図22を参照すると、merge_triangle_idx0に基づいてmerge_triangle_idx1のparsing可否を決定する。例えば、merge_triangle_idx0が0より大きければmerge_triangle_idx1をparsingし、merge_triangle_idx0が0であれば、merge_triangle_idx1をparsingしない。
また、mとnの大小関係を示す値が図55のmerge_triangle_biggerである。
この関係を利用して、merge_triangle_idx0とmerge_triangle_idx1、merge_triangle_biggerに基づいてm、nを決定する。図55を参照すると、merge_triangle_bigger値に基づいて他の動作を行う。例えば、merge_triangle_biggerが0であれば、mがnより大きい。この場合、mは(merge_triangle_idx0+1)である。また、nはmerge_triangle_idx1である。また、merge_triangle_biggerが1であれば、nがmより大きい。この場合、nは(merge_triangle_idx0+1)である。また、mはmerge_triangle_idx1である。また、merge_triangle_idx1が存在しなければ、その値を0にinferする。
図55の方法は、図47の方法に比べm、n値によってシグナリングオーバーヘッドを減らすという長所がある。例えば、m、nがそれぞれ1、0であれば、図47の方法ではmerge_triangle_idx0、merge_triangle_idx1をそれぞれ1、0にシグナリングすべきである。しかし、図55の方法ではm、nがそれぞれ1、0であれば、merge_triangle_idx0、merge_triangle_idx1をそれぞれ0、0にシグナリングすべきであるが、merge_triangle_idx1はencoding、parsingせずにinferする(これに加えて大小関係を示すシグナリングが必要である)。よって、variable length signalingを使う際、encoding、decodingする値のサイズが減るため、小さいビットを使用することができる。または、m、nがそれぞれ2、1であれば、図47の方法ではmerge_triangle_idx0、merge_triangle_idx1をそれぞれ2、1に、図55の方法ではmerge_triangle_idx0、merge_triangle_idx1をそれぞれ1、1にシグナリングすべきである。しかし、この際、図55の方法では、merge_triangle_idx1のmaximum値が(3-1-1)=1であるため、maximum値が大きい際より1小さいビットでシグナリングされる。例えば、図55の方法はm、n間の差が小さい際、例えば、差が1である際に長所を有する方法である。
また、図55のsyntax構造において、merge_triangle_idx1のparsing可否を決定するためにmerge_triangle_idx0を参照すると説明したが、m、nのうち大きい値に基づいて決定してもよい。つまり、m、nのうち大きい値が1以上の場合とそうでない場合に区分する。但し、この場合、merge_triangle_biggerのparsingがmerge_triangle_idx1のparsing可否を決定するより先に起こるべきである。
これまで構成を具体的な実施例を介して説明したが、当業者であれば本開示の趣旨及び範囲を逸脱せずに修正、変更し得るはずである。よって、本開示の詳細な説明及び実施例から本開示の属する技術分野に属する人が容易に類推し得るものは、本開示の権利範囲に属すると解釈される。