最初に、1つ以上の実施形態の例示的な実装形態が以下に提供されるが、開示するシステムおよび/または方法が、現在知られているかまたは存在しているかどうかにかかわらず、任意の数の技法を使用して実施されてもよいことを理解されたい。本開示は、本明細書で図示および説明される例示的な設計および実装形態を含む、以下に示す例示的な実装形態、図面、および技法に、決して限定されるべきでなく、均等物のそれらの完全な範囲と一緒に添付の特許請求の範囲内で修正されてもよい。
本明細書では、コーディングツリーブロック(CTB:coding tree block)、コーディングツリーユニット(CTU:coding tree unit)、コーディングユニット(CU:coding unit)、コーディングされたビデオシーケンス(CVS:coded video sequence)、ジョイントビデオエキスパートチーム(JVET:Joint Video Experts Team)、動き制約タイルセット(MCTS:motion constrained tile set)、最大転送単位(MTU:maximum transfer unit)、ネットワーク抽象化レイヤ(NAL:network abstraction layer)、ピクチャ順序カウント(POC:picture order count)、ローバイトシーケンスペイロード(RBSP:raw byte sequence payload)、シーケンスパラメータセット(SPS:sequence parameter set)、多用途ビデオコーディング(VVC:versatile video coding)、およびワーキングドラフト(WD:working draft)などの、様々な頭字語が採用される。
データの最低限の損失しか伴わずにビデオファイルのサイズを低減するために、多くのビデオ圧縮技法が採用されうる。たとえば、ビデオ圧縮技法は、ビデオシーケンスにおけるデータ冗長性を低減または除去するために空間(たとえば、イントラピクチャ)予測および/または時間(たとえば、インターピクチャ)予測を実行することを含むことができる。ブロックベースのビデオコーディングのために、ビデオスライス(たとえば、ビデオピクチャまたはビデオピクチャの一部分)は、ビデオブロックに区分されてよく、ビデオブロックは、ツリーブロック、コーディングツリーブロック(CTB)、コーディングツリーユニット(CTU)、コーディングユニット(CU)、および/またはコーディングノードと呼ばれてもよい。ピクチャのイントラコーディングされた(I)スライスの中のビデオブロックは、同じピクチャの中の隣接ブロックの中の参照サンプルを基準にした空間予測を使用してコーディングされる。ピクチャのインターコーディングされた単方向予測(P)または双方向予測(B)スライスの中のビデオブロックは、同じピクチャの中の隣接ブロックの中の参照サンプルを基準にした空間予測、または他の参照ピクチャの中の参照サンプルを基準にした時間予測を採用することによって、コーディングされてもよい。ピクチャは、フレームおよび/または画像と呼ばれてもよく、参照ピクチャは、参照フレームおよび/または参照画像と呼ばれてもよい。空間予測または時間予測は、画像ブロックを表す予測ブロックをもたらす。残差データは、元の画像ブロックと予測ブロックとの間のピクセル差分を表す。したがって、インターコーディングされたブロックは、予測ブロックを形成する参照サンプルのブロックを指し示す動きベクトル、およびコーディングされたブロックと予測ブロックとの間の差分を示す残差データに従って符号化される。イントラコーディングされたブロックは、イントラコーディングモードおよび残差データに従って符号化される。さらなる圧縮のために、残差データは、ピクセル領域から変換領域に変換されてもよい。これらは残差変換係数をもたらし、残差変換係数は量子化されてもよい。量子化変換係数は、最初に二次元アレイをなして配置されてもよい。量子化変換係数は、変換係数の一次元ベクトルを作り出すために走査されてもよい。なお一層の圧縮を達成するために、エントロピーコーディングが適用されてもよい。そのようなビデオ圧縮技法が以下でさらに詳細に説明される。
符号化されたビデオが正確に復号されてもよいことを確実にするために、ビデオは、対応するビデオコーディング規格に従って符号化および復号される。ビデオコーディング規格は、国際電気通信連合(ITU)標準化セクタ(ITU-T)H.261、国際標準化機構/国際電気標準会議(ISO/IEC)モーションピクチャエキスパートグループ(MPEG)-1パート2、ITU-T H.262またはISO/IEC MPEG-2パート2、ITU-T H.263、ISO/IEC MPEG-4パート2、ITU-T H.264またはISO/IEC MPEG-4パート10とも呼ばれるアドバンストビデオコーディング(AVC:Advanced Video Coding)、およびITU-T H.265またはMPEG-Hパート2とも呼ばれる高効率ビデオコーディング(HEVC:High Efficiency Video Coding)を含む。AVCは、スケーラブルビデオコーディング(SVC:Scalable Video Coding)、マルチビュービデオコーディング(MVC:Multiview Video Coding)およびマルチビュー・ビデオ・コーディング・プラス・デプス(MVC+D)、ならびに三次元(3D)AVC(3D-AVC)などの、拡張を含む。HEVCは、スケーラブルHEVC(SHVC)、マルチビューHEVC(MV-HEVC)、および3D HEVC(3D-HEVC)などの、拡張を含む。ITU-TとISO/IECとのジョイントビデオエキスパートチーム(JVET)は、多用途ビデオコーディング(VVC)と呼ばれるビデオコーディング規格を策定し始めている。VVCは、JVET-L1001-v5を含むワーキングドラフト(WD)の中に含まれる。
ビデオ画像をコーディングするために、画像が最初に区分され、区分はビットストリームの中にコーディングされる。様々なピクチャ区分方式が利用可能である。たとえば、画像は、通常スライス、従属スライス、タイルに、かつ/またはウェーブフロント並列処理(WPP:Wavefront Parallel Processing)に従って、区分されうる。簡単のために、HEVCは、ビデオコーディングのためにCTBのグループにスライスを区分するとき、通常スライス、従属スライス、タイル、WPP、およびそれらの組み合わせしか使用され得ないようにエンコーダを制限する。そのような区分は、最大転送単位(MTU)サイズ整合、並列処理、および短縮されたエンドツーエンド遅延をサポートするために適用されうる。MTUは、単一パケットの中で送信されうるデータの最大量を示す。パケットペイロードがMTUを超過する場合、そのペイロードは、フラグメンテーションと呼ばれるプロセスを通じて2つのパケットに分割される。
単にスライスとも呼ばれる通常スライスは、ループフィルタ処理動作に起因するいくつかの相互依存性にもかかわらず、同じピクチャ内の他の通常スライスから独立して再構成されうる、画像の区分された部分である。各通常スライスは、送信のためにそれ自体のネットワーク抽象化レイヤ(NAL)ユニットの中にカプセル化される。さらに、ピクチャ内予測(イントラサンプル予測、動き情報予測、コーディングモード予測)、およびスライス境界を横切るエントロピーコーディング依存関係は、独立した再構成をサポートするために無効にされてもよい。そのような独立した再構成は並列化をサポートする。たとえば、通常スライスベースの並列化は、最低限のプロセッサ間通信またはコア間通信を採用する。しかしながら、各通常スライスは独立しており、各スライスは別個のスライスヘッダに関連する。通常スライスの使用は、スライスごとのスライスヘッダのビットコストに起因して、またスライス境界を横切る予測の欠如に起因して、大幅なコーディングオーバーヘッドを招きうる。さらに、通常スライスは、MTUサイズ要件に対する整合をサポートするために採用されてもよい。詳細には、通常スライスが別個のNALユニットの中にカプセル化され独立してコーディングされうるので、各通常スライスは、スライスを破壊して複数のパケットにすることを回避するために、MTU方式におけるMTUよりも小さくすべきである。したがって、並列化の目標およびMTUサイズ整合の目標は、矛盾した需要をピクチャの中のスライスレイアウトに負わせてもよい。
従属スライスは通常スライスと類似であるが、短縮されたスライスヘッダを有し、ピクチャ内予測を破壊することなく画像ツリーブロック境界の区分を可能にする。したがって、従属スライスは、通常スライスが複数のNALユニットに断片化されることを可能にし、そのことは、通常スライス全体の符号化が完了する前に通常スライスの一部が外へ送られることを可能にすることによって、短縮されたエンドツーエンド遅延をもたらす。
タイルとは、タイルの列および行を作成する水平境界および垂直境界によって作成される、画像の区分された部分である。タイルは、ラスタ走査順序で(右から左へ、かつ上から下へ)コーディングされてもよい。CTBの走査順序はタイル内で局所的である。したがって、最初のタイルの中のCTBは、次のタイルの中のCTBに進む前にラスタ走査順序でコーディングされる。通常スライスと同様に、タイルは、ピクチャ内予測依存関係ならびにエントロピー復号依存関係を破壊する。しかしながら、タイルは個々のNALユニットの中に含められなくてよく、したがって、タイルはMTUサイズ整合のために使用されなくてよい。各タイルは、1つのプロセッサ/コアによって処理され得、隣接タイルを復号する処理ユニット間での、ピクチャ内予測のために採用されるプロセッサ間/コア間通信は、(隣接するタイルが同じスライスの中にあるときに)共有されるスライスヘッダを伝達すること、ならびに再構成されるサンプルおよびメタデータのループフィルタ処理関連の共有を実行することに、限定されてもよい。スライスの中に2つ以上のタイルが含まれるとき、スライスの中の最初のエントリポイントオフセット以外の、タイルごとのエントリポイントバイトオフセットが、スライスヘッダの中でシグナリングされてもよい。スライスおよびタイルごとに、次の条件、すなわち、1)スライスの中のすべてのコーディングされたツリーブロックが同じタイルに属すること、および2)タイルの中のすべてのコーディングされたツリーブロックが同じスライスに属すること、のうちの少なくとも1つが果たされるべきである。
WPPでは、画像はCTBの単一の行に区分される。エントロピー復号および予測メカニズムは、他の行の中のCTBからのデータを使用してもよい。CTB行の並列復号を通じて並列処理が可能にされる。たとえば、現在の行が、先行する行と並行して復号されてもよい。しかしながら、現在の行の復号は、先行する行の復号プロセスから2個のCTBだけ遅延する。この遅延は、現在の行の中の現在のCTBの上のCTBおよび上かつ右のCTBに関係するデータが、現在のCTBがコーディングされる前に利用可能であることを確実にする。この手法は、図式で表されるとウェーブフロントのように見える。この千鳥状の冒頭は、最高で画像がCTB行を含むのと同じくらい多くのプロセッサ/コアを伴う並列化を可能にする。ピクチャ内の隣接ツリーブロック行の間のピクチャ内予測が許容されるので、ピクチャ内予測を可能にするためのプロセッサ間/コア間通信は相当となりうる。WPP区分はNALユニットサイズを考慮に入れる。したがって、WPPはMTUサイズ整合をサポートしない。しかしながら、必要に応じてMTUサイズ整合を実施するために、通常スライスは、いくらかのコーディングオーバーヘッドを伴って、WPPとともに使用されうる。
タイルはまた、動き制約タイルセットを含んでよい。動き制約タイルセット(MCTS)とは、関連する動きベクトルが、MCTSの内側の完全サンプルロケーションと、補間のためにMCTSの内側の完全サンプルロケーションのみを必要とする分数サンプルロケーションとを指し示すように制限されるように設計された、タイルセットである。さらに、MCTSの外側のブロックから導出される、時間的な動きベクトル予測用の動きベクトル候補の使用が却下される。このようにして、各MCTSは、MCTSの中に含まれないタイルの存在を伴わずに独立して復号されてもよい。ビットストリームの中のMCTSの存在を示すとともにMCTSをシグナリングするために、時間的なMCTS補足エンハンスメント情報(SEI:supplemental enhancement information)メッセージが使用されてもよい。MCTS SEIメッセージは、MCTSのための適合するビットストリームを生成するために、(SEIメッセージのセマンティックの一部として指定される)MCTSサブビットストリーム抽出において使用されうる追加の情報を提供する。その情報は、各々がいくつかのMCTSを規定し、かつ置換ビデオパラメータセット(VPS:video parameter set)のローバイトシーケンスペイロード(RBSP)バイト、シーケンスパラメータセット(SPS)、およびMCTSサブビットストリーム抽出プロセス中に使用されるべきピクチャパラメータセット(PPS:picture parameter set)を含む、いくつかの抽出情報セットを含む。MCTSサブビットストリーム抽出プロセスに従ってサブビットストリームを抽出すると、スライスアドレス関連のシンタックス要素(first_slice_segment_in_pic_flagおよびslice_segment_addressを含む)のうちの1つまたは全部が、抽出されたサブビットストリームの中で異なる値を採用してもよいので、パラメータセット(VPS、SPS、およびPPS)が書き換えられてよく、または置き換えられてよく、スライスヘッダが更新されてよい。
さらなる符号化のためにピクチャを区分するとき、様々なタイリング方式が採用されてもよい。特定の例として、タイルは、いくつかの例ではスライスに取って代わることができるタイルグループに割り当てられうる。いくつかの例では、各タイルグループは、他のタイルグループとは独立して抽出されうる。したがって、タイルグループ化は、各タイルグループが異なるプロセッサに割り当てられることを可能にすることによって並列化をサポートしてもよい。タイルグループは、ラスタ走査順序で割り当てられうるか、またはピクチャ内のエリアの長方形形状を形成するように制約されうる。そのようなタイルグループをサポートするために、明示的なタイル識別子(ID)シグナリングが使用されてもよい。いくつかのシステムでは、タイルIDは、常にタイルインデックスと同じとなるように割り当てられる。明示的なタイルIDシグナリングは、タイルIDがタイルインデックスとは異なることを可能にする。明示的なタイルIDシグナリングを有することは、タイルグループヘッダを更新する必要なく、ビットストリームからのMCTSの抽出をサポートする。明示的なタイルIDのシグナリングおよびタイルグループのアドレスとしての対応する使用が、HEVCスタイルのタイル構造定義およびシグナリングに特有であってもよいことに留意されたい。タイル構造定義および/またはシグナリングが修正される場合、明示的なタイルIDメカニズムによるタイルIDのシグナリングは、いくつかの例では不正確および/または適用不可能であってもよい。タイルグループ化および明示的なタイルIDシグナリングは、たとえば、デコーダが画像全体を復号することを望まないことがある場合に採用されうる。特定の例として、全方向性メディアアプリケーションフォーマット(OMAF:Omnidirectional Media Application Format)に従って符号化されてもよい仮想現実(VR)ビデオをサポートするために、ビデオコーディング方式が採用されてもよい。
VRビデオでは、1つ以上のカメラが、カメラの周囲の環境を記録してもよい。ユーザは、次いで、カメラと同じロケーションの中にユーザが存在するかのようにVRビデオを見ることができる。VRビデオでは、ピクチャはユーザの周囲の環境全体を取り囲む。ユーザは、次いで、ピクチャのサブ部分を見る。たとえば、ユーザは、表示されるピクチャのサブ部分をユーザの頭部移動に基づいて変化させるヘッドマウントディスプレイを採用してもよい。表示中のビデオの部分は、ビューポートと呼ばれてもよい。
したがって、全方向性ビデオの異なる特徴とは、任意の特定の時間においてビューポートだけが表示されることである。このことは、ビデオ全体を表示してもよい他のビデオアプリケーションとは対照的である。この特徴は、たとえば、ユーザのビューポート(または、推奨されるビューポート時限メタデータなどの任意の他の基準)に応じた選択的な配信を通じて、全方向性ビデオシステムの性能を改善するために利用されてもよい。ビューポート依存配信は、たとえば、領域ごとのパッキングおよび/またはビューポート依存ビデオコーディングを採用することによって可能にされてもよい。性能改善は、同じビデオ解像度/品質を採用するときに他の全方向性ビデオシステムと比較すると、より小さい送信帯域幅、より低い復号複雑度、またはその両方をもたらしてもよい。
例示的なビューポート依存動作は、HEVCベースのビューポート依存OMAFビデオプロファイルを用いて5000サンプル(たとえば、5120×2560ルーマサンプル)解像度(5K)の有効な正距円筒図法投影(ERP:equirectangle projection)解像度を達成するための、MCTSベースの手法である。この手法が以下でより詳細に説明される。ただし、一般に、この手法はVRビデオをタイルグループに区分し、複数の解像度でビデオを符号化する。デコーダは、ストリーミング中にユーザによって現在使用されるビューポートを示すことができる。VRビデオデータを提供するビデオサーバは、次いで、ビューポートに関連するタイルグループを高解像度で転送することができ、見られていないタイルグループをもっと低い解像度で転送することができる。このことは、ピクチャ全体が高解像度で送られるのを必要とすることなく、ユーザが高解像度でVRビデオを見ることを可能にする。見られていないサブ部分は廃棄され、したがって、ユーザは、より低い解像度を意識しなくてよい。しかしながら、ユーザがビューポートを変化させる場合、解像度のより低いタイルグループがユーザに表示されてもよい。新たなビューポートの解像度は、次いで、ビデオが進むにつれて高められてよい。そのようなシステムを実施するために、解像度がより高いタイルグループと解像度がより低いタイルグループの両方を含むピクチャが作成されるべきである。
別の例では、複数の解像度を含むピクチャを転送するようにビデオ会議アプリケーションが設計されてもよい。たとえば、ビデオ会議は複数の参加者を含んでよい。現在話している参加者は高い方の解像度で表示されてよく、他の参加者は低い方の解像度で表示されてよい。そのようなシステムを実施するために、解像度がより高いタイルグループと解像度がより低いタイルグループの両方を含むピクチャが作成されるべきである。
複数の解像度でコーディングされたサブピクチャを有するピクチャを作成することをサポートするための、様々なフレキシブルタイリングメカニズムが本明細書で開示される。たとえば、ビデオは複数の解像度でコーディングされうる。ビデオはまた、各解像度におけるサブピクチャを採用することによってコーディングされうる。解像度がより低いサブピクチャは、解像度がより高いサブピクチャよりも小さい。複数の解像度を有するピクチャを作成するために、ピクチャは第1のレベルのタイルに区分されうる。最も高い解像度からのサブピクチャは、第1のレベルのタイルの中に直接含められうる。さらに、第1のレベルのタイルは、第1のレベルのタイルよりも小さい第2のレベルのタイルに区分されうる。したがって、より小さい第2のレベルのタイルは、解像度がより低いサブピクチャを直接受け入れることができる。このようにして、首尾一貫したアドレス指定方式を使用するために、解像度が異なるタイルが動的にアドレス再指定されることを必要とすることなく、各解像度からのスライスがタイルインデックス関係を介して単一のピクチャに圧縮されうる。第1のレベルのタイルおよび第2のレベルのタイルはMCTSとして実施されてよく、したがって、異なる解像度における動き制約された画像データを受け入れてよい。本開示は多くの態様を含む。特定の例として、第1のレベルのタイルが第2のレベルのタイルに分割される。第1のレベルのタイルおよび第2のレベルのタイルは、次いで、タイルグループの中に含められうる。タイルグループは、整数個の第1のレベルのタイル、および/または第2のレベルのタイルの各シーケンスが単一の第1のレベルのタイルから分割される第2のレベルのタイルの1つ以上の連続するシーケンスを含むように制約されうる。この手法は、単一の第1のレベルのタイルから作成されたすべての第2のレベルのタイルが同じタイルグループに割り当てられることを確実にしてもよい。別の特定の例では、フレキシブルタイリング方式をコーディングするための走査順序が説明される。この例では、第1のレベルのタイルは、ピクチャおよび/またはタイルグループ境界に対してラスタ走査順序でコーディングされる。第2のレベルのタイルに遭遇すると、第1のレベルのタイル走査が中断される。第2のレベルのタイルの連続するシーケンスが、次いで、そのような第2のレベルのタイルがそこから区分された第1のレベルのタイルに対してラスタ走査順序で走査される。走査順序は、次いで、もしあれば、第2のレベルのタイルの連続する次のシーケンスに進む。そうでない場合、第1のレベルのタイル走査が継続される。このプロセスは、例に応じてタイルグループおよび/またはピクチャが符号化または復号されるまで継続する。
図1は、ビデオ信号をコーディングする例示的な動作方法100のフローチャートである。詳細には、エンコーダにおいてビデオ信号が符号化される。符号化プロセスは、ビデオファイルサイズを低減するために、様々なメカニズムを採用することによってビデオ信号を圧縮する。より小さいファイルサイズは、関連する帯域幅オーバーヘッドを低減しながら、圧縮されたビデオファイルがユーザに向かって送信されることを可能にする。デコーダが、次いで、圧縮されたビデオファイルを復号して、エンドユーザへの表示のために元のビデオ信号を再構成する。復号プロセスは、概して、デコーダがビデオ信号を矛盾なく再構成することを可能にするように、符号化プロセスを反映する。
ステップ101において、ビデオ信号がエンコーダの中に入力される。たとえば、ビデオ信号は、メモリの中に記憶された圧縮されていないビデオファイルであってよい。別の例として、ビデオファイルは、ビデオカメラなどのビデオキャプチャデバイスによってキャプチャされてよく、ビデオのライブストリーミングをサポートするように符号化されてよい。ビデオファイルは、オーディオ成分とビデオ成分の両方を含んでよい。ビデオ成分は、シーケンスで見られると動きの視覚的な印象を与える、一連の画像フレームを含む。フレームは、本明細書でルーマ成分(またはルーマサンプル)と呼ぶ光、およびクロマ成分(またはカラーサンプル)と呼ばれる色に換算して表現される、ピクセルを含む。いくつかの例では、フレームはまた、三次元視聴をサポートするための深度値を含んでよい。
ステップ103において、ビデオはブロックに区分される。区分することは、各フレームの中のピクセルを圧縮用の正方形および/または長方形のブロックに再分割することを含む。たとえば、(H.265およびMPEG-Hパート2とも呼ばれる)高効率ビデオコーディング(HEVC)では、フレームは、最初にコーディングツリーユニット(CTU)に分割され得、コーディングツリーユニットは、既定のサイズ(たとえば、64ピクセル×64ピクセル)のブロックである。CTUは、ルーマサンプルとクロマサンプルの両方を含む。CTUをブロックに分割し、次いで、さらなる符号化をサポートする構成が達成されるまでブロックを再帰的に再分割するために、コーディングツリーが採用されてもよい。たとえば、フレームのルーマ成分は、個々のブロックが比較的均質な光値を含むまで再分割されてよい。さらに、フレームのクロマ成分は、個々のブロックが比較的均質な色値を含むまで再分割されてよい。したがって、区分メカニズムはビデオフレームのコンテンツに応じて様々である。
ステップ105において、ステップ103において区分された画像ブロックを圧縮するために、様々な圧縮メカニズムが採用される。たとえば、インター予測および/またはイントラ予測が採用されてよい。インター予測は、共通のシーンの中のオブジェクトが継続的なフレームの中に出現する傾向があるという事実を利用するように設計されている。したがって、参照フレームの中のオブジェクトを示すブロックは、隣接するフレームの中で繰り返し記述される必要がない。詳細には、テーブルなどのオブジェクトは、複数のフレームにわたって一定の位置にとどまることがある。したがって、テーブルは1回記述され、隣接するフレームは、参照フレームを逆戻りに参照することができる。複数のフレームにわたってオブジェクトを整合させるために、パターンマッチングメカニズムが採用されてもよい。さらに、たとえば、オブジェクト移動またはカメラ移動に起因して、移動するオブジェクトは、複数のフレームを横切って描写されることがある。特定の例として、ビデオは、複数のフレームにわたってスクリーンを横切って移動する自動車を見せることがある。そのような移動を表すために動きベクトルが採用されうる。動きベクトルとは、フレームの中のオブジェクトの座標から参照フレームの中のオブジェクトの座標までのオフセットを提供する二次元ベクトルである。したがって、インター予測は、参照フレームの中の対応するブロックからのオフセットを示す動きベクトルのセットとして、現在のフレームの中の画像ブロックを符号化することができる。
イントラ予測は、共通のフレームの中のブロックを符号化する。イントラ予測は、ルーマ成分およびクロマ成分がフレームの中でクラスタ化する傾向があるという事実を利用する。たとえば、木の一部分の中の緑の断片は、緑の類似の断片に隣接して配置される傾向がある。イントラ予測は、複数の方向性予測モード(たとえば、HEVCでは33個)、平面モード、および直流(DC)モードを採用する。方向性モードは、対応する方向において現在ブロックが隣接ブロックのサンプルと類似/同じであることを示す。平面モードは、行/列に沿った一連のブロック(たとえば、平面)が、行の縁部において隣接ブロックに基づいて補間されうることを示す。平面モードは、実際には、値を変化させる際に比較的一定の勾配を採用することによって、行/列にわたる光/色の滑らかな遷移を示す。DCモードは、境界平滑化のために採用され、ブロックが方向性予測モードの角度方向に関連するすべての隣接ブロックのサンプルに関連する平均値と類似/同じであることを示す。したがって、イントラ予測ブロックは、実際の値ではなく関係を示す様々な予測モード値として画像ブロックを表すことができる。さらに、インター予測ブロックは、実際の値ではなく動きベクトル値として画像ブロックを表すことができる。いずれの場合も、予測ブロックは、いくつかの事例では画像ブロックを厳密に表さなくてよい。任意の差分が残差ブロックの中に記憶される。ファイルをさらに圧縮するために、残差ブロックに変換が適用されてもよい。
ステップ107において、様々なフィルタ処理技法が適用されてもよい。HEVCでは、フィルタは、ループ内フィルタ処理方式に従って適用される。上記で説明したブロックベースの予測は、デコーダにおいてブロック状の画像の生成をもたらしてもよい。さらに、ブロックベースの予測方式はブロックを符号化し、次いで、参照ブロックとして後で使用できるように符号化ブロックを再構成してもよい。ループ内フィルタ処理方式は、ブロック/フレームに、雑音抑制フィルタ、デブロッキングフィルタ、適応ループフィルタ、およびサンプル適応型オフセット(SAO:sample adaptive offset)フィルタを反復的に適用する。これらのフィルタは、符号化されたファイルが正確に再構成されうるように、そのようなブロッキングアーティファクトを緩和する。さらに、これらのフィルタは、再構成された参照ブロックの中のアーティファクトを緩和し、その結果、アーティファクトは、再構成された参照ブロックに基づいて符号化される後続のブロックの中で追加のアーティファクトを生成する可能性が低い。
ビデオ信号が区分、圧縮、およびフィルタ処理されると、得られたデータは、ステップ109においてビットストリームの中で符号化される。ビットストリームは、上記で説明したデータ、ならびにデコーダにおいて適切なビデオ信号再構成をサポートするために望まれる任意のシグナリングデータを含む。たとえば、そのようなデータは、区分データ、予測データ、残差ブロック、およびコーディング命令をデコーダに提供する様々なフラグを含んでよい。ビットストリームは、要求時にデコーダに向かう送信のために、メモリの中に記憶されてもよい。ビットストリームはまた、複数のデコーダに向かってブロードキャストおよび/またはマルチキャストされてよい。ビットストリームの作成は、反復的なプロセスである。したがって、ステップ101、103、105、107、および109は、多くのフレームおよびブロックにわたって継続的かつ/または同時に行われてよい。図1に示す順序は、説明の明快および容易さのために提示され、ビデオコーディングプロセスを特定の順序に限定するものではない。
ステップ111において、デコーダは、ビットストリームを受信し復号プロセスを開始する。詳細には、デコーダは、ビットストリームを対応するシンタックスおよびビデオデータに変換するために、エントロピー復号方式を採用する。ステップ111において、デコーダは、フレームに対する区分を決定するために、ビットストリームからのシンタックスデータを採用する。区分は、ステップ103におけるブロック区分の結果に整合すべきである。ステップ111において採用されるようなエントロピー符号化/復号が次に説明される。エンコーダは、入力画像の中での値の空間測位に基づいて、いくつかの可能な選択肢からブロック区分方式を選択することなどの、多くの選択を圧縮プロセス中に行う。正確な選択肢をシグナリングすることは、多数のビンを採用してもよい。本明細書で使用するビンとは、変数として扱われるバイナリ値(たとえば、コンテキストに応じて変わってもよいビット値)である。エントロピーコーディングは、特定の事例に対して明確に実行可能でない任意のオプションをエンコーダが廃棄して、許容できるオプションのセットを残すことを可能にする。許容できる各オプションは、次いで、コードワードが割り当てられる。コードワードの長さは、許容できるオプションの数に基づく(たとえば、2個のオプションに対して1つのビン、3~4個のオプションに対して2つのビンなど)。エンコーダは、次いで、選択されたオプションに対してコードワードを符号化する。コードワードは、すべての可能なオプションの潜在的に大きいセットからの選択肢を固有に示すのとは対照的に、許容できるオプションの小さいサブセットからの選択肢を固有に示すために望まれるのと同じくらいの大きさであるので、この方式はコードワードのサイズを低減する。デコーダは、次いで、エンコーダと同様の方法で、許容できるオプションのセットを決定することによって選択肢を復号する。許容できるオプションのセットを決定することによって、デコーダは、コードワードを読み取ることができ、エンコーダによって行われた選択を決定することができる。
ステップ113において、デコーダはブロック復号を実行する。詳細には、デコーダは、残差ブロックを生成するために逆変換を採用する。次いで、デコーダは、区分に従って画像ブロックを再構成するために、残差ブロックおよび対応する予測ブロックを採用する。予測ブロックは、ステップ105においてエンコーダにおいて生成されるような、イントラ予測ブロックとインター予測ブロックの両方を含んでよい。再構成された画像ブロックは、次いで、ステップ111において決定された区分データに従って、再構成されたビデオ信号のフレームの中に配置される。ステップ113のためのシンタックスも、上記で説明したようにエントロピーコーディングを介してビットストリームの中でシグナリングされてよい。
ステップ115において、エンコーダにおけるステップ107と同様の方法で、再構成されたビデオ信号のフレームに対してフィルタ処理が実行される。たとえば、ブロッキングアーティファクトを除去するために、雑音抑制フィルタ、デブロッキングフィルタ、適応ループフィルタ、およびSAOフィルタが、フレームに適用されてよい。フレームがフィルタ処理されると、ビデオ信号は、エンドユーザによる視聴のために、ステップ117においてディスプレイに出力されうる。
図2は、ビデオコーディングのための例示的なコーディングおよび復号(コーデック)システム200の概略図である。詳細には、コーデックシステム200は、動作方法100の実装形態をサポートするための機能を提供する。コーデックシステム200は、エンコーダとデコーダの両方の中で採用される構成要素を示すように一般化される。コーデックシステム200は、動作方法100の中のステップ101および103に関して説明したように、ビデオ信号を受信および区分し、そのことは区分されたビデオ信号201をもたらす。コーデックシステム200は、次いで、方法100の中のステップ105、107、および109に関して説明したようにエンコーダの働きをするとき、区分されたビデオ信号201を圧縮してコーディングされたビットストリームにする。デコーダの働きをするとき、コーデックシステム200は、動作方法100の中のステップ111、113、115、および117に関して説明したように、ビットストリームから出力ビデオ信号を生成する。コーデックシステム200は、汎用コーダ制御構成要素211、変換スケーリングおよび量子化構成要素213、イントラピクチャ推定構成要素215、イントラピクチャ予測構成要素217、動き補償構成要素219、動き推定構成要素221、スケーリングおよび逆変換構成要素229、フィルタ制御分析構成要素227、ループ内フィルタ構成要素225、復号ピクチャバッファ構成要素223、ならびにヘッダフォーマッティングおよびコンテキスト適応型バイナリ算術コーディング(CABAC:context adaptive binary arithmetic coding)構成要素231を含む。そのような構成要素は図示のように結合される。図2において、黒い線は符号化/復号されるべきデータの移動を示し、破線は他の構成要素の動作を制御する制御データの移動を示す。コーデックシステム200の構成要素はすべて、エンコーダの中に存在してよい。デコーダは、コーデックシステム200の構成要素のサブセットを含んでよい。たとえば、デコーダは、イントラピクチャ予測構成要素217、動き補償構成要素219、スケーリングおよび逆変換構成要素229、ループ内フィルタ構成要素225、ならびに復号ピクチャバッファ構成要素223を含んでよい。次にこれらの構成要素が説明される。
区分されたビデオ信号201は、コーディングツリーによってピクセルのブロックに区分されている、キャプチャされたビデオシーケンスである。コーディングツリーは、ピクセルのブロックをピクセルのもっと小さいブロックに再分割するために、様々な分割モードを採用する。これらのブロックは、次いで、もっと小さいブロックにさらに再分割されうる。そのブロックは、コーディングツリー上のノードと呼ばれてもよい。より大きい親ノードが、より小さい子ノードに分割される。ノードが再分割される回数は、ノード/コーディングツリーの深度と呼ばれる。分割されたブロックは、場合によってはコーディングユニット(CU)の中に含まれうる。たとえば、CUは、CU用の対応するシンタックス命令と一緒にルーマブロック、赤色差分クロマ(Cr)ブロック、および青色差分クロマ(Cb)ブロックを含む、CTUのサブ部分でありうる。分割モードは、採用される分割モードに応じて変化する形状の、それぞれ、2つ、3つ、または4つの子ノードにノードを区分するために採用される、2分木(BT:binary tree)、3分木(TT:triple tree)、および4分木(QT:quad tree)を含んでよい。区分されたビデオ信号201は、圧縮のために、汎用コーダ制御構成要素211、変換スケーリングおよび量子化構成要素213、イントラピクチャ推定構成要素215、フィルタ制御分析構成要素227、ならびに動き推定構成要素221に転送される。
汎用コーダ制御構成要素211は、アプリケーション制約に従ってビットストリームへのビデオシーケンスの画像のコーディングに関係する決定を行うように構成される。たとえば、汎用コーダ制御構成要素211は、ビットレート/ビットストリームサイズ対再構成品質の最適化を管理する。そのような決定は、記憶空間/帯域幅利用可能性および画像解像度要求に基づいて行われてよい。汎用コーダ制御構成要素211はまた、バッファアンダーランおよびオーバーラン問題を緩和するために、送信速度に照らしてバッファ利用を管理する。これらの問題を管理するために、汎用コーダ制御構成要素211は、他の構成要素による区分、予測、およびフィルタ処理を管理する。たとえば、汎用コーダ制御構成要素211は、解像度を高くし帯域幅使用を大きくするために圧縮複雑度を動的に増大させることがあり、または解像度および帯域幅使用を低減するために圧縮複雑度を低減させることがある。したがって、汎用コーダ制御構成要素211は、ビデオ信号再構成品質をビットレート問題と平衡させるために、コーデックシステム200の他の構成要素を制御する。汎用コーダ制御構成要素211は、他の構成要素の動作を制御する制御データを作成する。制御データはまた、ヘッダフォーマッティングおよびCABAC構成要素231に転送されて、デコーダにおける復号用のパラメータをシグナリングするためにビットストリームの中で符号化される。
区分されたビデオ信号201はまた、インター予測のために動き推定構成要素221および動き補償構成要素219へ送られる。区分されたビデオ信号201のフレームまたはスライスは、複数のビデオブロックに分割されてもよい。動き推定構成要素221および動き補償構成要素219は、時間予測を行うために、1つ以上の参照フレームの中の1つ以上のブロックに対する、受信されたビデオブロックのインター予測コーディングを実行する。コーデックシステム200は、たとえば、ビデオデータのブロックごとに適切なコーディングモードを選択するために、複数のコーディングパスを実行してもよい。
動き推定構成要素221および動き補償構成要素219は高度に統合されてよいが、概念的な目的のために別々に図示される。動き推定構成要素221によって実行される動き推定は、ビデオブロックに対して動きを推定する動きベクトルを生成するプロセスである。動きベクトルは、たとえば、予測ブロックに対するコーディングされたオブジェクトの変位を示してよい。予測ブロックとは、ピクセル差分の観点から、コーディングされるべきブロックに密に整合するものと認められるブロックである。予測ブロックは、参照ブロックと呼ばれてもよい。そのようなピクセル差分は、絶対差分和(SAD:sum of absolute difference)、二乗差分和(SSD:sum of square difference)、または他の差分メトリックによって決定されてよい。HEVCは、CTU、コーディングツリーブロック(CTB)、およびCUを含む、いくつかのコーディングされたオブジェクトを採用する。たとえば、CTUがCTBに分割され得、CTBは、次いで、CUの中に含めるためのCBに分割されうる。CUは、予測データを含む予測ユニット(PU:prediction unit)、および/またはCUに対する変換された残差データを含む変換ユニット(TU:transform unit)として符号化されうる。動き推定構成要素221は、レートひずみ最適化プロセスの一部としてレートひずみ分析を使用することによって、動きベクトル、PU、およびTUを生成する。たとえば、動き推定構成要素221は、現在のブロック/フレームに対して、複数の参照ブロック、複数の動きベクトルなどを決定してよく、レートひずみ特性が最良の参照ブロック、動きベクトルなどを選択してよい。最良のレートひずみ特性は、ビデオ再構成の品質(たとえば、圧縮によるデータ損失の量)とコーディング効率(たとえば、最終的な符号化のサイズ)の両方を平衡させる。
いくつかの例では、コーデックシステム200は、復号ピクチャバッファ構成要素223の中に記憶された参照ピクチャのサブ整数ピクセル位置に対する値を計算してもよい。たとえば、ビデオコーデックシステム200は、参照ピクチャの1/4ピクセル位置、1/8ピクセル位置、または他の分数ピクセル位置の値を補間してよい。したがって、動き推定構成要素221は、完全ピクセル位置および分数ピクセル位置に対する動き探索を実行し、分数ピクセル精度を有する動きベクトルを出力してもよい。動き推定構成要素221は、PUの位置を参照ピクチャの予測ブロックの位置と比較することによって、インターコーディングされたスライスの中のビデオブロックのPUに対する動きベクトルを計算する。動き推定構成要素221は、計算された動きベクトルを動きデータとして符号化のためにヘッダフォーマッティングおよびCABAC構成要素231へ、また動き補償構成要素219へ動きを出力する。
動き補償構成要素219によって実行される動き補償は、動き推定構成要素221によって決定された動きベクトルに基づいて予測ブロックをフェッチまたは生成することを伴ってよい。再び、動き推定構成要素221および動き補償構成要素219は、いくつかの例では機能的に統合されてもよい。現在ビデオブロックのPUに対する動きベクトルを受信すると、動き補償構成要素219は、動きベクトルが指し示す先の予測ブロックの位置を特定してもよい。次いで、コーディング中の現在ビデオブロックのピクセル値から予測ブロックのピクセル値を減算することによって残差ビデオブロックが形成され、ピクセル差分値を形成する。概して、動き推定構成要素221は、ルーマ成分に対する動き推定を実行し、動き補償構成要素219は、ルーマ成分に基づいて計算された動きベクトルをクロマ成分とルーマ成分の両方に対して使用する。予測ブロックおよび残差ブロックは、変換スケーリングおよび量子化構成要素213に転送される。
区分されたビデオ信号201はまた、イントラピクチャ推定構成要素215およびイントラピクチャ予測構成要素217へ送られる。動き推定構成要素221および動き補償構成要素219と同様に、イントラピクチャ推定構成要素215およびイントラピクチャ予測構成要素217は高度に統合されてよいが、概念的な目的のために別々に図示される。イントラピクチャ推定構成要素215およびイントラピクチャ予測構成要素217は、上記で説明したようにフレーム間で動き推定構成要素221および動き補償構成要素219によって実行されるインター予測の代替として、現在フレームの中のブロックに対して現在ブロックをイントラ予測する。詳細には、イントラピクチャ推定構成要素215は、現在ブロックを符号化するために使用すべきイントラ予測モードを決定する。いくつかの例では、イントラピクチャ推定構成要素215は、現在ブロックを符号化するための適切なイントラ予測モードを、テストされた複数のイントラ予測モードから選択する。選択されたイントラ予測モードは、次いで、符号化のためにヘッダフォーマッティングおよびCABAC構成要素231に転送される。
たとえば、イントラピクチャ推定構成要素215は、テストされる様々なイントラ予測モードに対してレートひずみ分析を使用してレートひずみ値を計算し、テストされたモードの中でレートひずみ特性が最良のイントラ予測モードを選択する。レートひずみ分析は、概して、符号化ブロックと、符号化ブロックを作り出すために符号化された、符号化されていない元のブロックとの間のひずみ(または誤差)の量、ならびに符号化ブロックを作り出すために使用されたビットレート(たとえば、ビット数)を決定する。イントラピクチャ推定構成要素215は、どのイントラ予測モードがブロックに対して最良のレートひずみ値を示すのかを決定するために、様々な符号化ブロックに対してひずみおよびレートから比率を計算する。加えて、イントラピクチャ推定構成要素215は、レートひずみ最適化(RDO:rate-distortion optimization)に基づいて深度モデリングモード(DMM:depth modeling mode)を使用して深度マップの深度ブロックをコーディングするように構成されてもよい。
イントラピクチャ予測構成要素217は、エンコーダ上に実装されるとき、イントラピクチャ推定構成要素215によって決定された選択済みのイントラ予測モードに基づいて予測ブロックから残差ブロックを生成してよく、またはデコーダ上に実装されるとき、ビットストリームから残差ブロックを読み取ってよい。残差ブロックは、行列として表される、予測ブロックと元のブロックとの間の値における差分を含む。残差ブロックは、次いで、変換スケーリングおよび量子化構成要素213に転送される。イントラピクチャ推定構成要素215およびイントラピクチャ予測構成要素217は、ルーマ成分とクロマ成分の両方に対して動作してもよい。
変換スケーリングおよび量子化構成要素213は、残差ブロックをさらに圧縮するように構成される。変換スケーリングおよび量子化構成要素213は、離散コサイン変換(DCT)、離散サイン変換(DST)、または概念的に類似の変換などの、変換を残差ブロックに適用し、残差変換係数値を備えるビデオブロックを作り出す。ウェーブレット変換、整数変換、サブバンド変換、または他のタイプの変換も使用されうる。変換は、残差情報をピクセル値領域から周波数領域などの変換領域に変換してもよい。変換スケーリングおよび量子化構成要素213はまた、たとえば、周波数に基づいて、変換された残差情報をスケーリングするように構成される。そのようなスケーリングは、残差情報にスケールファクタを適用することを伴い、その結果、異なる周波数情報が異なる粒度で量子化され、そのことは、再構成されるビデオの最終的な視覚的品質に影響を及ぼしてもよい。変換スケーリングおよび量子化構成要素213はまた、ビットレートをさらに低減するために変換係数を量子化するように構成される。量子化プロセスは、係数の一部または全部に関連するビット深度を低減しうる。量子化の程度は、量子化パラメータを調整することによって修正されてもよい。いくつかの例では、変換スケーリングおよび量子化構成要素213は、次いで、量子化変換係数を含む行列の走査を実行してもよい。量子化変換係数は、ヘッダフォーマッティングおよびCABAC構成要素231に転送されてビットストリームの中で符号化される。
スケーリングおよび逆変換構成要素229は、動き推定をサポートするために変換スケーリングおよび量子化構成要素213の逆の動作を適用する。スケーリングおよび逆変換構成要素229は、たとえば、別の現在ブロック用の予測ブロックになってもよい参照ブロックとして後で使用できるように、ピクセル領域における残差ブロックを再構成するために、逆のスケーリング、変換、および/または量子化を適用する。動き推定構成要素221および/または動き補償構成要素219は、もっと後のブロック/フレームの動き推定における使用のために、残差ブロックを対応する予測ブロックに戻して加算することによって参照ブロックを計算してよい。スケーリング、量子化、および変換の間に生み出されるアーティファクトを緩和するために、再構成された参照ブロックにフィルタが適用される。そのようなアーティファクトは、後続のブロックが予測されるとき、場合によっては不正確な予測を引き起こすことがある(かつ、追加のアーティファクトを生み出すことがある)。
フィルタ制御分析構成要素227およびループ内フィルタ構成要素225は、残差ブロックおよび/または再構成された画像ブロックにフィルタを適用する。たとえば、元の画像ブロックを再構成するために、スケーリングおよび逆変換構成要素229からの変換された残差ブロックが、イントラピクチャ予測構成要素217および/または動き補償構成要素219からの対応する予測ブロックと組み合わせられてよい。次いで、再構成された画像ブロックにフィルタが適用されてもよい。いくつかの例では、フィルタは、代わりに残差ブロックに適用されてよい。図2の中の他の構成要素と同様に、フィルタ制御分析構成要素227およびループ内フィルタ構成要素225は、高度に統合され一緒に実装されてもよいが、概念的な目的のために別々に示される。再構成された参照ブロックに適用されるフィルタは、特定の空間領域に適用され、そのようなフィルタがどのように適用されるのかを調整するための複数のパラメータを含む。フィルタ制御分析構成要素227は、そのようなフィルタがどこで適用されるべきかを決定するために、再構成された参照ブロックを分析し、対応するパラメータを設定する。そのようなデータは、符号化のためのフィルタ制御データとして、ヘッダフォーマッティングおよびCABAC構成要素231に転送される。ループ内フィルタ構成要素225は、フィルタ制御データに基づいてそのようなフィルタを適用する。フィルタは、デブロッキングフィルタ、雑音抑制フィルタ、SAOフィルタ、および適応ループフィルタを含んでよい。そのようなフィルタは、例に応じて、空間/ピクセル領域において(たとえば、再構成されたピクセルブロックに対して)、または周波数領域において適用されてよい。
エンコーダとして動作するとき、フィルタ処理済みの再構成された画像ブロック、残差ブロック、および/または予測ブロックは、上記で説明したように動き推定において後で使用できるように、復号ピクチャバッファ構成要素223の中に記憶される。デコーダとして動作するとき、復号ピクチャバッファ構成要素223は、再構成されたフィルタ処理済みのブロックを記憶し、それを出力ビデオ信号の一部としてディスプレイに向かって転送する。復号ピクチャバッファ構成要素223は、予測ブロック、残差ブロック、および/または再構成された画像ブロックを記憶することが可能な任意のメモリデバイスであってよい。
ヘッダフォーマッティングおよびCABAC構成要素231は、コーデックシステム200の様々な構成要素からデータを受信し、デコーダに向かう送信のために、そのようなデータをコーディングされたビットストリームの中に符号化する。詳細には、ヘッダフォーマッティングおよびCABAC構成要素231は、汎用制御データおよびフィルタ制御データなどの制御データを符号化するための、様々なヘッダを生成する。さらに、イントラ予測および動きデータを含む予測データならびに量子化変換係数データの形態の残差データはすべて、ビットストリームの中で符号化される。最終的なビットストリームは、区分された元のビデオ信号201を再構成するためにデコーダによって望まれるすべての情報を含む。そのような情報はまた、イントラ予測モードインデックステーブル(コードワードマッピングテーブルとも呼ばれる)、様々なブロックに対する符号化コンテキストの定義、最確イントラ予測モードの表示、区分情報の表示などを含んでよい。そのようなデータは、エントロピーコーディングを採用することによって符号化されてもよい。たとえば、情報は、コンテキスト適応型可変長コーディング(CAVLC:context adaptive variable length coding)、CABAC、シンタックスベースコンテキスト適応型バイナリ算術コーディング(SBAC:syntax-based context-adaptive binary arithmetic coding)、確率区間区分エントロピー(PIPE:probability interval partitioning entropy)コーディング、または別のエントロピーコーディング技法を採用することによって符号化されてよい。エントロピーコーディングに続いて、コーディングされたビットストリームは、別のデバイス(たとえば、ビデオデコーダ)へ送信されても、または後で送信もしくは取出しできるようにアーカイブされてもよい。
図3は、例示的なビデオエンコーダ300を示すブロック図である。ビデオエンコーダ300は、コーデックシステム200の符号化機能を実施し、かつ/または動作方法100のステップ101、103、105、107、および/もしくは109を実施するために、採用されてもよい。エンコーダ300は入力ビデオ信号を区分し、区分されたビデオ信号201と実質的に類似である区分されたビデオ信号301が得られる。区分されたビデオ信号301は、次いで、エンコーダ300の構成要素によって圧縮されビットストリームの中に符号化される。
詳細には、区分されたビデオ信号301は、イントラ予測のために、イントラピクチャ予測構成要素317に転送される。イントラピクチャ予測構成要素317は、イントラピクチャ推定構成要素215およびイントラピクチャ予測構成要素217と実質的に類似であってよい。区分されたビデオ信号301はまた、復号ピクチャバッファ構成要素323の中の参照ブロックに基づくインター予測のために、動き補償構成要素321に転送される。動き補償構成要素321は、動き推定構成要素221および動き補償構成要素219と実質的に類似であってよい。イントラピクチャ予測構成要素317および動き補償構成要素321からの予測ブロックおよび残差ブロックは、残差ブロックの変換および量子化のために、変換および量子化構成要素313に転送される。変換および量子化構成要素313は、変換スケーリングおよび量子化構成要素213と実質的に類似であってよい。変換および量子化された残差ブロックならびに対応する予測ブロックは(関連する制御データと一緒に)、ビットストリームの中へのコーディングのために、エントロピーコーディング構成要素331に転送される。エントロピーコーディング構成要素331は、ヘッダフォーマッティングおよびCABAC構成要素231と実質的に類似であってよい。
変換および量子化された残差ブロックならびに/または対応する予測ブロックはまた、動き補償構成要素321による使用のための参照ブロックへの再構成のために、変換および量子化構成要素313から逆変換および量子化構成要素329に転送される。逆変換および量子化構成要素329は、スケーリングおよび逆変換構成要素229と実質的に類似であってよい。ループ内フィルタ構成要素325の中のループ内フィルタも、例に応じて残差ブロックおよび/または再構成された参照ブロックに適用される。ループ内フィルタ構成要素325は、フィルタ制御分析構成要素227およびループ内フィルタ構成要素225と実質的に類似であってよい。ループ内フィルタ構成要素325は、ループ内フィルタ構成要素225に関して説明したような複数のフィルタを含んでよい。フィルタ処理済みのブロックが、次いで、動き補償構成要素321による参照ブロックとしての使用のために、復号ピクチャバッファ構成要素323の中に記憶される。復号ピクチャバッファ構成要素323は、復号ピクチャバッファ構成要素223と実質的に類似であってよい。
図4は、例示的なビデオデコーダ400を示すブロック図である。ビデオデコーダ400は、コーデックシステム200の復号機能を実施し、かつ/または動作方法100のステップ111、113、115、および/もしくは117を実施するために、採用されてもよい。デコーダ400は、たとえば、エンコーダ300から、ビットストリームを受信し、エンドユーザへの表示のために、再構成された出力ビデオ信号をビットストリームに基づいて生成する。
ビットストリームは、エントロピー復号構成要素433によって受信される。エントロピー復号構成要素433は、CAVLC、CABAC、SBAC、PIPEコーディング、または他のエントロピーコーディング技法などの、エントロピー復号方式を実施するように構成される。たとえば、エントロピー復号構成要素433は、ビットストリームの中でコードワードとして符号化された追加のデータを解釈するためのコンテキストを提供するために、ヘッダ情報を採用してもよい。復号される情報は、汎用制御データ、フィルタ制御データ、区分情報、動きデータ、予測データ、および残差ブロックからの量子化変換係数などの、ビデオ信号を復号するための任意の所望の情報を含む。量子化変換係数は、残差ブロックへの再構成のために、逆変換および量子化構成要素429に転送される。逆変換および量子化構成要素429は、逆変換および量子化構成要素329と類似であってよい。
再構成された残差ブロックおよび/または予測ブロックは、イントラ予測動作に基づく画像ブロックへの再構成のために、イントラピクチャ予測構成要素417に転送される。イントラピクチャ予測構成要素417は、イントラピクチャ推定構成要素215およびイントラピクチャ予測構成要素217と類似であってよい。詳細には、イントラピクチャ予測構成要素417は、フレームの中の参照ブロックの位置を特定するために予測モードを採用し、イントラ予測画像ブロックを再構成するためにその結果に残差ブロックを適用する。再構成されたイントラ予測画像ブロック、ならびに/または残差ブロックおよび対応するインター予測データが、それぞれ、復号ピクチャバッファ構成要素223およびループ内フィルタ構成要素225と実質的に類似であってよい、復号ピクチャバッファ構成要素423にループ内フィルタ構成要素425を介して転送される。ループ内フィルタ構成要素425は、再構成された画像ブロック、残差ブロック、および/または予測ブロックをフィルタ処理し、そのような情報が、復号ピクチャバッファ構成要素423の中に記憶される。復号ピクチャバッファ構成要素423からの再構成された画像ブロックは、インター予測のために、動き補償構成要素421に転送される。動き補償構成要素421は、動き推定構成要素221および/または動き補償構成要素219と実質的に類似であってよい。詳細には、動き補償構成要素421は、予測ブロックを生成しその結果に残差ブロックを適用して画像ブロックを再構成するために、参照ブロックからの動きベクトルを採用する。結果として得られる再構成されたブロックも、ループ内フィルタ構成要素425を介して復号ピクチャバッファ構成要素423に転送されてよい。復号ピクチャバッファ構成要素423は、追加の再構成された画像ブロックを記憶し続け、そうした画像ブロックは区分情報を介してフレームに再構成されうる。そのようなフレームはまた、シーケンスの中に置かれてよい。シーケンスは、再構成された出力ビデオ信号としてディスプレイに向かって出力される。
図5は、符号化ビデオシーケンスを含む例示的なビットストリーム500を示す概略図である。たとえば、ビットストリーム500は、コーデックシステム200および/またはデコーダ400によって復号するために、コーデックシステム200および/またはエンコーダ300によって生成されうる。別の例として、ビットストリーム500は、ステップ111におけるデコーダによる使用のために、方法100のステップ109においてエンコーダによって生成されてよい。
ビットストリーム500は、シーケンスパラメータセット(SPS)510、複数のピクチャパラメータセット(PPS)512、タイルグループヘッダ514、および画像データ520を含む。SPS510は、ビットストリーム500の中に含まれるビデオシーケンスの中のすべてのピクチャに共通のシーケンスデータを含む。そのようなデータは、ピクチャサイズ決定、ビット深度、コーディングツールパラメータ、ビットレート制約などを含むことができる。PPS512は、1つ以上の対応するピクチャに特有のパラメータを含む。したがって、ビデオシーケンスの中の各ピクチャは、1つのPPS512を参照してもよい。PPS512は、対応するピクチャの中のタイルにとって利用可能なコーディングツール、量子化パラメータ、オフセット、ピクチャ特有のコーディングツールパラメータ(たとえば、フィルタ制御)などを示すことができる。タイルグループヘッダ514は、ピクチャの中の各タイルグループに特有のパラメータを含む。したがって、ビデオシーケンスの中のタイルグループごとに1つのタイルグループヘッダ514があってもよい。タイルグループヘッダ514は、タイルグループ情報、ピクチャ順序カウント(POC)、参照ピクチャリスト、予測重み、タイルエントリポイント、デブロッキングパラメータなどを含んでよい。いくつかのシステムがスライスヘッダとしてタイルグループヘッダ514を参照し、タイルグループではなくスライスをサポートするためにそのような情報を使用することに留意されたい。
画像データ520は、インター予測および/またはイントラ予測に従って符号化されたビデオデータ、ならびに対応する変換および量子化された残差データを含む。そのような画像データ520は、符号化の前に画像を区分するために使用される区分に従ってソートされる。たとえば、画像データ520の中の画像は、タイル523に分割される。タイル523は、コーディングツリーユニット(CTU)にさらに分割される。CTUは、コーディングツリーに基づいてコーディングブロックにさらに分割される。コーディングブロックは、次いで、予測メカニズムに従って符号化/復号されうる。画像/ピクチャは、1つ以上のタイル523を含むことができる。
タイル523は、水平境界および垂直境界によって作成された、ピクチャの区分された部分である。タイル523は、長方形および/または正方形であってよい。詳細には、タイル523は、直角に接続されている4つの側部を含む。4つの側部は、平行な側部の2つのペアを含む。さらに、平行な側部ペアの中の側部は長さが等しい。したがって、タイル523は任意の長方形形状であってよく、ここで、正方形は、すべての4つの側部が等しい長さである、長方形の特別な事例である。ピクチャは、タイル523の行および列の中に配置されてもよい。タイル行とは、ピクチャの左の境界から右の境界まで(またはその逆に)連続的なラインを作成するように水平に隣接して配置されたタイル523のセットである。タイル列とは、ピクチャの上の境界から下の境界まで(またはその逆に)連続的なラインを作成するように垂直に隣接して配置されたタイル523のセットである。タイル523は、例に応じて、他のタイル523に基づく予測を可能にしてもしなくてもよい。各タイル523は、ピクチャの中に固有のタイルインデックスを有してよい。タイルインデックスは、あるタイル523を別のタイル523から区別するために使用されうる、手続き的に選択された数値識別子である。たとえば、タイルインデックスは、ラスタ走査順序で数値的に増大してよい。ラスタ走査順序は、左から右かつ上から下である。いくつかの例では、タイル523にタイル識別子(ID)も割り当てられてよいことに留意されたい。タイルIDは、あるタイル523を別のタイル523から区別するために使用されうる、割り当てられた識別子である。いくつかの例では、算出はタイルインデックスではなくタイルIDを採用してよい。さらに、いくつかの例では、タイルIDは、タイルインデックスと同じ値を有するように割り当てられうる。タイルインデックスおよび/またはタイルIDは、タイル523を含むタイルグループを示すためにシグナリングされてもよい。たとえば、タイルインデックスおよび/またはタイルIDは、タイル523に関連するピクチャデータを表示用の適切な位置にマッピングするために採用されてよい。タイルグループは、たとえば、対象領域の表示をサポートするために、かつ/または並列処理をサポートするために、別々に抽出およびコーディングされうる、タイル523の関連するセットである。タイルグループの中のタイル523は、タイルグループの外部のタイル523への参照を伴わずにコーディングされうる。各タイル523は対応するタイルグループに割り当てられてよく、したがって、ピクチャは複数のタイルグループを含むことができる。
図6A~図6Eは、異なるビットストリームからの複数の解像度のサブピクチャを組み合わせて仮想現実(VR)アプリケーションにおける使用のための単一のピクチャにするための、エクストラクタトラック610を作成するための例示的なメカニズム600を示す。メカニズム600は、方法100の例示的な使用事例をサポートするために採用されてもよい。たとえば、メカニズム600は、コーデックシステム200および/またはエンコーダ300からコーデックシステム200および/またはデコーダ400に向かう送信用のビットストリーム500を生成するために採用されうる。特定の例として、メカニズム600は、VR、OMAF、360度ビデオなどとともに使用するために採用されうる。
VRでは、ビデオの一部分だけがユーザに表示される。たとえば、VRビデオは、ユーザを取り囲む球体を含むように撮影されてよい。ユーザは、VRビデオを見るためにヘッドマウントディスプレイ(HMD)を採用してもよい。ユーザは、対象領域のほうへHMDを向けてよい。対象領域がユーザに表示され、他のビデオデータは廃棄される。このようにして、ユーザは、任意の瞬間において、VRビデオの、ユーザが選択した部分だけを見る。この手法は、ユーザの知覚を模倣し、したがって、実環境を模倣する方法でユーザに仮想環境を体験させる。この手法を伴う問題のうちの1つは、VRビデオ全体がユーザへ送信されてもよいが、ビデオの現在のビューポートしか実際には使用されず、残りが廃棄されることである。ストリーミングアプリケーションに対してシグナリング効率を高めるために、ユーザの現在のビューポートは、より高い第1の解像度で送信され得、他のビューポートは、より低い第2の解像度で送信されうる。このようにして、廃棄される可能性のあるビューポートは、ユーザによって見られる可能性のあるビューポートよりも小さい帯域幅を占める。ユーザが新たなビューポートを選択する場合、異なる現在のビューポートがより高い第1の解像度で送信されることをデコーダが要求しうるまで、解像度がより低いコンテンツが見せられうる。この機能をサポートするために、図6Eに示すようなエクストラクタトラック610を作成するためにメカニズム600が採用されうる。エクストラクタトラック610とは、上記で説明したような使用のために複数の解像度におけるピクチャをカプセル化する、画像データのトラックである。
メカニズム600は、それぞれ、図6Aおよび図6Bに示すように、同じビデオコンテンツを第1の解像度611および第2の解像度612で符号化する。特定の例として、第1の解像度611は5120×2560ルーマサンプルであってよく、第2の解像度612は2560×1280ルーマサンプルであってよい。ビデオのピクチャは、それぞれ、第1の解像度611におけるタイル601、および第2の解像度612におけるタイル603に区分されてもよい。図示の例では、タイル601および603は各々、4×2グリッドに区分される。さらに、各タイル601および603の位置に対してMCTSがコーディングされうる。第1の解像度611および第2の解像度612におけるピクチャは各々、対応する解像度で経時的にビデオを表すMCTSシーケンスをもたらす。各コーディングされたMCTSシーケンスは、サブピクチャトラックまたはタイルトラックとして記憶される。メカニズム600は、次いで、ビューポート適応MCTS選択をサポートすべきセグメントを作成するために、ピクチャを使用することができる。たとえば、高解像度MCTSと低解像度MCTSとの異なる選択を引き起こす、見ている方位の各範囲が検討される。図示の例では、第1の解像度611におけるMCTSを含む4つのタイル601、および第2の解像度612におけるMCTSを含む4つのタイル603が取得される。
メカニズム600は、次いで、可能なビューポート適応MCTS選択ごとにエクストラクタトラック610を作成することができる。図6Cおよび図6Dは、例示的なビューポート適応MCTS選択を示す。詳細には、選択されるタイル605および607のセットは、それぞれ、第1の解像度611および第2の解像度612において選択される。選択されるタイル605および607は、灰色の陰影で示される。図示の例では、選択されるタイル605は、ユーザに見せられることになる、第1の解像度611におけるタイル601であり、選択されるタイル607は、廃棄される可能性があるが、ユーザが新たなビューポートを選択する場合に表示をサポートするために保持される、第2の解像度612におけるタイル603である。選択されるタイル605および607は、次いで、第1の解像度611と第2の解像度612の両方における画像データを含む単一のピクチャに組み合わせられる。そのようなピクチャは、エクストラクタトラック610を作成するように組み合わせられる。図6Eは、例示の目的で、対応するエクストラクタトラック610からの単一のピクチャを示す。図示のように、エクストラクタトラック610の中のピクチャは、第1の解像度611および第2の解像度612からの、選択されるタイル605および607を含む。上述のように、図6C~図6Eは、単一のビューポート適応MCTS選択を示す。任意のビューポートのユーザ選択を可能にするために、選択されるタイル605と607との可能な組み合わせごとに、エクストラクタトラック610が作成されるべきである。
図示の例では、第2の解像度612のビットストリームからのコンテンツをカプセル化するタイル603の各選択は、2つのスライスを含む。パッキングされたピクチャと正距円筒図法投影(ERP)フォーマットの投影されるピクチャとの間のマッピングを作成するために、エクストラクタトラック610の中にRegionWisePackingBoxが含まれてよい。提示する例では、エクストラクタトラック610から解像されたビットストリームは、解像度が3200×2560である。それ故に、4000サンプル(4K)対応デコーダは、5000サンプル5K(5120×2560)解像度を有するコーディングされたビットストリームからビューポートが抽出されるコンテンツを復号してもよい。
図示のように、エクストラクタトラック610は、高解像度タイル601の2つの行および低解像度タイル603の4つの行を含む。したがって、エクストラクタトラック610は、高解像度コンテンツの2つのスライスおよび低解像度コンテンツの4つのスライスを含む。一律なタイリングは、そのような使用事例をサポートしなくてもよい。一律なタイリングは、タイル列のセットおよびタイル行のセットによって定義される。タイル列はピクチャの上からピクチャの下まで延在する。同様に、タイル行はピクチャの左からピクチャの右まで延在する。そのような構造は簡単に定義されうるが、この構造は、メカニズム600によって説明される使用事例などの、進歩した使用事例を事実上はサポートすることができない。図示の例では、エクストラクタトラック610の異なるセクションにおいて、異なる数の行が採用される。一律なタイリングが採用される場合、エクストラクタトラック610の右の側部におけるタイルは、各々2つのスライスを受け入れるように書き換えられるべきである。この手法は、非効率であり計算量的に複雑である。
本開示は、異なる数のスライスを含むようにタイルが書き換えられることを必要としない、以下で説明するようなフレキシブルタイリング方式を含む。フレキシブルタイリング方式は、タイル601が第1の解像度611におけるコンテンツを含むことを可能にする。フレキシブルタイリング方式はまた、第2の解像度612におけるタイル603に各々が直接マッピングされうるもっと小さいタイルに、タイル601が区分されることを可能にする。そのような手法は、上記で説明したように異なる解像度が組み合わせられるとき、タイルが書き換えられる/アドレス再指定されることを必要としないので、この直接マッピングはより効率的である。
図7は、異なるビットストリームからの複数の解像度のピクチャをつなぎ合わせて表示用の単一のピクチャにする、例示的なビデオ会議アプリケーション700を示す。アプリケーション700は、方法100の例示的な使用事例をサポートするために採用されてもよい。たとえば、アプリケーション700は、コーデックシステム200および/またはエンコーダ300からのビットストリーム500からのビデオコンテンツを表示するために、コーデックシステム200および/またはデコーダ400において採用されうる。ビデオ会議アプリケーション700は、ユーザにビデオシーケンスを表示する。ビデオシーケンスは、話している参加者701および他の参加者703を表示するピクチャを含む。話している参加者701は、より高い/より大きい第1の解像度で表示され、他の参加者703は、より低い/より小さい第2の解像度で表示される。そのようなピクチャをコーディングするために、ピクチャは、単一の行を有する部分、および3つの行を有する部分を含むべきである。一律なタイリングを用いてそのようなシナリオをサポートするために、ピクチャは左のタイルおよび右のタイルに区分される。右のタイルは、次いで、3つの行を含むように書き換えられる/アドレス再指定される。そのようなアドレス再指定は、圧縮と性能の両方の不利益をもたらす。以下で説明するフレキシブルタイリング方式は、単一のタイルが、もっと小さいタイルに区分され、他の参加者703に関連するサブピクチャビットストリームの中のタイルにマッピングされることを可能にする。このようにして、話している参加者701は、第1のレベルのタイルに直接マッピングされ得、他の参加者703は、そのような書換え/アドレス再指定を伴わずに、第1のタイルから分割された第2のレベルのタイルにマッピングされうる。
図8A~図8Dは、同じピクチャの中で異なる解像度を有する複数のタイルをサポートすることが可能な、例示的なフレキシブルビデオタイリング方式800を示す概略図である。より効率的なコーディングメカニズム600およびアプリケーション700をサポートするために、フレキシブルビデオタイリング方式800が採用されうる。したがって、フレキシブルビデオタイリング方式800は、方法100の一部として採用されうる。さらに、フレキシブルビデオタイリング方式800は、コーデックシステム200、エンコーダ300、および/またはデコーダ400によって採用されうる。フレキシブルビデオタイリング方式800の結果は、エンコーダとデコーダとの間の送信のためにビットストリーム500の中に記憶されうる。
図8Aに示すように、ピクチャ(たとえば、フレーム、画像など)は、レベル1タイルとも呼ばれる第1のレベルのタイル801に区分されうる。図8Bに示すように、第1のレベルのタイル801は、レベル2タイルとも呼ばれる第2のレベルのタイル803を作成するように選択的に区分されうる。第1のレベルのタイル801および第2のレベルのタイル803は、次いで、複数の解像度でコーディングされたサブピクチャを有するピクチャを作成するために採用されうる。第1のレベルのタイル801は、ピクチャを1組の列および1組の行に完全に区分することによって生成されるタイルである。第2のレベルのタイル803は、第1のレベルのタイル801を区分することによって生成されるタイルである。
上記で説明したように、様々なシナリオにおいて、たとえば、VRおよび/または遠隔会議では、ビデオは複数の解像度でコーディングされうる。ビデオはまた、各解像度におけるスライスを採用することによってコーディングされうる。解像度がより低いスライスは、解像度がより高いスライスよりも小さい。複数の解像度を有するピクチャを作成するために、ピクチャは第1のレベルのタイル801に区分されうる。最も高い解像度からのスライスは、第1のレベルのタイル801の中に直接含められうる。さらに、第1のレベルのタイル801は、第1のレベルのタイル801よりも小さい第2のレベルのタイル803に区分されうる。したがって、より小さい第2のレベルのタイル803は、解像度がより低いスライスを直接受け入れることができる。このようにして、各解像度からのスライスは、首尾一貫したアドレス指定方式を使用するために、解像度が異なるタイルが動的にアドレス再指定されることを必要とすることなく、たとえば、タイルインデックス関係を介して、単一のピクチャに圧縮されうる。第1のレベルのタイル801および第2のレベルのタイル803はMCTSとして実施されてよく、したがって、異なる解像度における動き制約された画像データを受け入れてよい。
本開示は多くの態様を含む。特定の例として、第1のレベルのタイル801が第2のレベルのタイル803に分割される。第2のレベルのタイル803は、次いで、各々がピクチャデータの(たとえば、より低い解像度における)単一の長方形スライスを含むように制約されてもよい。長方形スライスは、長方形形状を維持するように制約されるスライスであり、したがって、水平および垂直のピクチャ境界に基づいてコーディングされる。したがって、長方形スライスは、(左から右までのラインおよび上から下までのラインの中にCTUを含み、長方形形状を維持しないことがある)ラスタ走査グループに基づいてコーディングされない。スライスとは、同じフレーム/ピクチャの中の任意の他の領域から別個に符号化される、ピクチャ/フレームの空間的に別個の領域である。別の例では、第1のレベルのタイル801は、2つ以上の完全な第2のレベルのタイル803に分割されうる。そのような場合、第1のレベルのタイル801は、部分的な第2のレベルのタイル803を含まなくてよい。別の例では、第1のレベルのタイル801および第2のレベルのタイル803の構成が、タイルを作成するために区分されたピクチャに関連するPPSなどの、ビットストリームの中のパラメータセットの中でシグナリングされうる。一例では、フラグなどの分割表示が、第1のレベルのタイル801ごとにパラメータセットの中でコーディングされうる。表示は、どの第1のレベルのタイル801が第2のレベルのタイル803にさらに分割されるのかを示す。別の例では、第2のレベルのタイル803の構成が、第2のレベルのタイル列の数および第2のレベルのタイル行の数としてシグナリングされうる。
別の例では、第1のレベルのタイル801および第2のレベルのタイル803は、タイルグループに割り当てられうる。そのようなタイルグループは、対応するタイルグループの中のすべてのタイルが(たとえば、ラスタ走査とは対照的に)ピクチャの長方形領域をカバーするように制約されるように制約されうる。たとえば、いくつかのシステムは、ラスタ走査順序でタイルグループにタイルを追加してよい。このことは、現在の行の中に初期タイルを追加すること、現在の行の左のピクチャ境界に到達するまで行の中に各タイルを追加することに進むこと、次の行の右の境界に進むこと、および最終タイルに到達するまで次の行の中に各タイルを追加することなどを含む。この手法は、ピクチャを越えて延在する非長方形形状をもたらすことがある。そのような形状は、本明細書で説明するような複数の解像度を有するピクチャを作成することにとって有用でない場合がある。代わりに、本例は、任意の第1のレベルのタイル801および/または第2のレベルのタイル803が(たとえば、任意の順序で)タイルグループに追加されてもよいが、結果として得られるタイルグループが(たとえば、直角に接続された4つの側部を含む)長方形または正方形でなければならないように、タイルグループを制約してもよい。この制約は、単一の第1のレベルのタイル801から区分される第2のレベルのタイル803が、異なるタイルグループの中に置かれないことを確実にしてもよい。
別の例では、第1のレベルのタイル幅が最小幅しきい値の2倍よりも小さく、かつ第1のレベルのタイル高さが最小高さしきい値の2倍よりも小さいとき、第2のレベルのタイル列の数および第2のレベルのタイル行の数を明示的に示すデータがビットストリームから除外されうる。なぜかと言うと、そのような条件を満たす第1のレベルのタイル801は、それぞれ、2つ以上の列または1つの行に分割されなくてよく、したがって、そのような情報はデコーダによって推測されうるからである。別の例では、どの第1のレベルのタイル801が第2のレベルのタイル803に区分されるのかを示す分割表示が、いくつかの第1のレベルのタイル801に対してビットストリームから除外されうる。たとえば、第1のレベルのタイル801が、最小幅しきい値よりも小さい第1のレベルのタイル幅を有し、かつ第1のレベルのタイル高さが最小高さしきい値よりも小さいとき、そのようなデータは除外されうる。なぜかと言うと、そのような条件を満たす第1のレベルのタイル801は、第2のレベルのタイル803に分割されるには小さすぎ、したがって、そのような情報はデコーダによって推測されうるからである。
別の態様では、フレキシブルビデオタイリング方式800は、図8Cに示すようなタイルグループ805を採用してもよい。タイルグループ805は、太線によって仕切られるように示される。ピクチャは第1のレベルのタイル801に区分される。第1のレベルのタイル801のサブセットが、第2のレベルのタイル803に区分される。第1のレベルのタイル801および第2のレベルのタイル803は、次いで、タイルグループ805に割り当てられうる。タイルグループ805は、たとえば、対象領域の表示をサポートするために、かつ/または並列処理をサポートするために、別個に抽出およびコーディングされうる、タイルの関連するセットである。タイルグループ805は、ラスタ走査タイルグループまたは長方形タイルグループとして生成されてもよい。ラスタ走査タイルグループは、左から右へ、かつ上から下へ進む、ラスタ走査順序で割り当てられたタイルを含む。たとえば、ラスタ走査順序は、最初のタイルから右のピクチャ境界に向かって進み、次いで、最後のタイルに到達するまで、次の行における左のピクチャ境界から右のピクチャ境界に向かって進むなどである。対照的に、長方形タイルグループは、ピクチャの長方形のサブ部分を含む。タイルグループ805は長方形タイルグループであるが、いくつかの例ではラスタ走査タイルグループも使用されてもよい。
いくつかの態様では、第1のレベルのタイル801および第2のレベルのタイル803は、各タイルグループ805が、いくつかの第1のレベルのタイル801、または第2のレベルのタイル803の1つ以上の連続するシーケンスを含むように、タイルグループ805に割り当てられうる。本明細書で使用する第2のレベルのタイル803のシーケンスは、単一の第1のレベルのタイル801から分割された第2のレベルのタイル803のグループであり、したがって、連続するタイルインデックスを有する。この手法は、単一の第1のレベルのタイル801から作成されたすべての第2のレベルのタイル803が、同じタイルグループ805に割り当てられることを可能にする。図8Cに示す例では、1つのタイルグループ805は、4つの第1のレベルのタイル801、および単一の第1のレベルのタイル801から分割された第2のレベルのタイル803を各々が含む4つの他のタイルグループ805を含む。しかしながら、符号化および復号されるべきビデオのタイプに応じて、タイルおよびタイルグループ805の多くの組み合わせが使用されてもよい。
別の態様では、フレキシブルビデオタイリング方式800は、図8Dに示すような走査順序807を採用してもよい。走査順序807は、例に応じて、タイルが、エンコーダにおいて符号化され、かつ/またはデコーダもしくは(エンコーダにおける)仮想参照デコーダにおいて復号される、順序である。図示の走査順序807の中で、第1のレベルのタイル801がラスタ走査順序でコーディングされる。第2のレベルのタイル803のうちの1つに遭遇すると、第1のレベルのタイル801のラスタ走査順序コーディングは中断される。連続するすべての第2のレベルのタイル803が、次いで、ラスタ走査順序でコーディングされてから、第1のレベルのタイル801のラスタ走査順序符号化を継続する。すべてのタイルがコーディングされるまで、このプロセスが継続する。図示の例では、タイル1とラベル付けされた第2のレベルのタイル803に最初に遭遇する。したがって、第1のレベルのタイル801のラスタ走査順序コーディングが中断され、タイル1および2とラベル付けされた連続する第2のレベルのタイル803がコーディングされる。連続するすべての第2のレベルのタイル803がコーディングされると、第1のレベルのタイル801のラスタ走査順序コーディングが継続する。したがって、タイル3および4とラベル付けされた第1のレベルのタイル801が、次いで、コーディングされる。5とラベル付けされた第2のレベルのタイル803に遭遇する。連続する第2のレベルのタイル803が、次いで、コーディングされる。したがって、5~8とラベル付けされたタイルがコーディングされる。連続するすべての第2のレベルのタイル803がコーディングされると、第1のレベルのタイル801のラスタ走査順序コーディングが再び継続する。このことは、タイル9および10とラベル付けされた第1のレベルのタイル801をコーディングする結果となる。11とラベル付けされた第2のレベルのタイル803に遭遇する。連続する第2のレベルのタイル803が、次いで、コーディングされる。したがって、11および12とラベル付けされたタイルがコーディングされる。より正式な言い方では、第1のレベルのタイル801は、ピクチャおよび/またはタイルグループの境界に対するラスタ走査順序でコーディングされる。さらに、現在の第1のレベルのタイル801から区分されたすべての第2のレベルのタイル803(たとえば、連続する第2のレベルのタイル803のシーケンス)は、後続の第2のレベルのタイル803から区分された任意の第2のレベルのタイル803を符号化する前にコーディングされる。加えて、現在の第1のレベルのタイル801から区分されたすべての第2のレベルのタイル803は、現在の第1のレベルのタイル801の境界に対してラスタ走査順序で符号化される。
上記で説明したように、フレキシブルビデオタイリング方式800は、異なるビットストリームからのサブピクチャを複数の解像度を含むピクチャにマージすることをサポートする。以下のことは、そのような機能をサポートする様々な実施形態を説明する。概して、本開示は、HEVCにおけるタイリング方式よりもフレキシブルな方法でピクチャを区分する、ビデオコーディングにおけるタイルのシグナリングおよびコーディングのための方法を説明する。より詳細には、本開示は、いくつかのタイリング方式を説明し、タイル列はコーディングされたピクチャの上から下まで一律に延在しなくてよく、同様にタイル行はコーディングされたピクチャの左から右まで一律に延在しなくてよい。
たとえば、HEVCタイリング手法に基づくと、いくつかのタイルは、図6A~図6Eおよび図7において説明する機能をサポートするために複数のタイル行にさらに分割されるべきである。さらに、タイルがどのように配置されるのかに応じて、タイルはタイル列にさらに分割されるべきである。たとえば、図7において、いくつかの事例では参加者2~4は参加者1の下に配置されてよく、そのことは、タイルを列に分割することによってサポートされうる。これらのシナリオを満足するために、第1のレベルのタイルは、以下で説明するような第2のレベルのタイルのタイル行およびタイル列に分割されてもよい。
たとえば、タイル構造は次のように緩和されうる。同じピクチャの中のタイルは、特定の数のタイル行であることを必要とされない。さらに、同じピクチャの中のタイルは、特定の数のタイル列であることを必要とされない。フレキシブルタイルのシグナリングのために、以下のステップが使用されてもよい。第1のレベルのタイル構造は、HEVCにおいて定義されるようなタイル列およびタイル行によって定義されてもよい。タイル列およびタイル行は、サイズが一律であってもまたは一律でなくてもよい。これらのタイルの各々は、第1のレベルのタイルと呼ばれてもよい。各第1のレベルのタイルが1つ以上のタイル列および1つ以上のタイル行にさらに分割されるか否かを指定するために、フラグがシグナリングされてもよい。第1のレベルのタイルがさらに分割される場合、タイル列およびタイル行は、サイズが一律であることまたは一律でないことのいずれかであってよい。第1のレベルのタイルの分割から得られる新たなタイルは、第2のレベルのタイルと呼ばれる。フレキシブルタイル構造は、第2のレベルのタイルのみに限定されてよく、したがって、いくつかの例では、いかなる第2のレベルのタイルのそれ以上の分割も許容されない。他の例では、第1のレベルのタイルからの第2のレベルのタイルの作成と同様の方法で後続のレベルのタイルを作成するために、第2のレベルのタイルのさらなる分割が適用されうる。
前述の例では、ピクチャは、それ以上分割されない0個以上の第1のレベルのタイル、および0個以上の第2のレベルのタイルを含んでよい。さらに分割されている第1のレベルのタイルは、概念的に存在しうるにすぎず、ピクチャの中のタイルの総数の中に計数されなくてよい。例示的な走査順序は次のように規定される。簡単のために、タイルグループは、いくつかの完全な第1のレベルのタイル、または第1のレベルのタイルの完全なサブセットのいずれかを含むように制約されてよい。第1のレベルのタイルは、ピクチャのタイルラスタ走査に従って順序付けられてよい。さらに分割されている第1のレベルのタイルが参照されると、そのような分割から得られた第2のレベルのタイルのセットは一括して参照されてもよい。任意の現在の第1のレベルのタイルの第2のレベルのタイルは、現在の第1のレベルのタイルの後に来る後続の第1のレベルのタイルの任意の第2のレベルのタイルを参照する前に参照されてもよい。現在の第1のレベルのタイルの第2のレベルのタイルは、現在の第1のレベルのタイル内でラスタ走査順序で参照される。任意の現在のタイル内のCTUは、現在のタイル内でCTUラスタ走査順序で参照されてもよい。
簡単のために、第1のレベルのタイルが2つ以上の第2のレベルのタイルに分割されるとき、分割は、サイズが一律なタイル列および一律なタイル行を常に使用してもよい。そのような例では、レベル2タイル列およびレベル2タイル行が一律であるか否かを指定するフラグをシグナリングする必要がなくてよい。さらに、シンタックス要素がタイル行高さおよびタイル行幅を指定する必要がなくてよい。いくつかの例では、第1のレベルのタイルは、タイル列およびタイル行に対して一律なサイズを常に使用するように制約されてもよい。そのような例では、レベル1タイル列およびレベル1行が一律であるか否かを指定するフラグをシグナリングする必要がなくてよい。さらに、シンタックス要素がタイル行高さおよびタイル行幅を指定する必要がなくてよい。別の例では、第1のレベルのタイルおよび第2のレベルのタイルは、サイズが一律なタイル列およびタイル行を常に使用するように制約されてもよい。そのような例では、レベル1およびレベル2のタイル列および行が一律であるか否かを指定するフラグをシグナリングする必要がなくてよい。さらに、シンタックス要素がタイル行高さおよびタイル行幅を指定する必要がなくてよい。
この手法によって定義されるフレキシブルタイルのタイルロケーション、サイズ、インデックス、および走査順序の導出が、以下で説明される。いくつかの例では、そのようなフレキシブルタイル構造が使用されるとき、タイルグループは、いくつかの完全な第1のレベルのタイルのみを、または1つの単一の第1のレベルのタイルの完全な第2のレベルのタイルの連続するシーケンスのみを含んでよい。さらに、そのようなフレキシブルタイル構造が使用されるとき、タイルグループは、1つ以上の完全な第1のレベルのタイルを含むように制約されてもよい。この例では、タイルグループが第2のレベルのタイルを含むとき、同じ第1のレベルのタイルの分割から発生するすべての第2のレベルのタイルがタイルグループの中に含められるべきである。そのようなフレキシブルタイル構造が使用されるとき、タイルグループが1つ以上のタイルを含み、一緒にすべてのタイルがピクチャの長方形領域をカバーするタイルグループに属することが、さらに制約されうる。別の態様では、そのようなフレキシブルタイル構造が使用されるとき、タイルグループは、1つ以上の第1のレベルのタイルを含み、一緒にすべてのタイルが、ピクチャの長方形領域をカバーするタイルグループに属する。
一例では、フレキシブルタイルのシグナリングは次の通りでありうる。最小タイル幅および最小タイル高さは、定義された値である。第1のレベルのタイル構造は、タイル列およびタイル行によって定義されうる。タイル列およびタイル行は、サイズが一律であってもまたは一律でなくてもよい。これらのタイルの各々は、第1のレベルのタイルと呼ばれうる。第1のレベルのタイルのいずれかがさらに分割されてもよいかどうかを指定するために、フラグがシグナリングされてもよい。各第1のレベルのタイルの幅が最小タイル幅の2倍以下であり、かつ各第1のレベルのタイルの高さが最小タイル高さの2倍以下であるとき、このフラグは存在しなくてよい。存在しないとき、フラグの値は0に等しいものと推測される。
一例では、第1のレベルのタイルごとに以下のことが適用される。第1のレベルのタイルが1つ以上のタイル列および1つ以上のタイル行にさらに分割されるか否かを指定するために、フラグがシグナリングされうる。フラグの存在は、次のように制約されうる。第1のレベルのタイル幅が最小タイル幅よりも大きい場合、または第1のレベルのタイル高さが最小タイル高さよりも大きい場合、フラグは存在する/シグナリングされる。そうでない場合、フラグは存在せず、フラグの値は、第1のレベルのタイルがそれ以上分割されないことを示す0に等しいものと推測される。
第1のレベルのタイルがさらに分割される場合、この分割に対するタイル列の数およびタイル行の数がさらにシグナリングされてよい。タイル列およびタイル行は、サイズが一律であることまたは一律でないことのいずれかであってよい。第1のレベルのタイルの分割から得られるタイルは、第2のレベルのタイルと呼ばれる。タイル列の数およびタイル行の数の存在は、次のように制約されうる。第1のレベルのタイル幅が最小タイル幅の2倍よりも小さいとき、タイル列の数はシグナリングされなくてよく、タイル列値の数は1に等しいものと推測されうる。シグナリングされるシンタックス要素値が0であってよく、かつタイル列の数がシンタックス要素の値+1となるように、シグナリングは_minus1シンタックス要素を採用してもよい。この手法は、シグナリングデータをさらに圧縮してもよい。第1のレベルのタイル高さが最小タイル高さの2倍よりも小さいとき、タイル行の数はシグナリングされなくてよく、タイル行の数の値は、0に等しいものと推測されうる。シグナリングされるシンタックス要素値は0であってよく、タイル行の数は、シグナリングデータをさらに圧縮するためにシンタックス要素の値+1でありうる。第1のレベルのタイルの分割から得られるタイルは、第2のレベルのタイルと呼ばれうる。フレキシブルタイル構造は、任意の第2のレベルのタイルのそれ以上の分割が許容されないように第2のレベルのタイルのみに限定されてよい。他の例では、第1のレベルのタイルを第2のレベルのタイルに分割することと同様の方法で、第2のレベルのタイルのさらなる分割が適用されうる。
一例では、フレキシブルタイル構造のシグナリングは次の通りでありうる。ピクチャが2つ以上のタイルを含むとき、フラグなどの信号が、対応するタイルグループによって直接または間接的に参照されるパラメータセットの中で採用されうる。フラグは、対応するタイル構造が一律なタイル構造であるのかそれとも一律でないタイル構造(たとえば、本明細書で説明するようなフレキシブルタイル構造)であるのかを指定することができる。フラグはuniform_tile_structure_flagと呼ばれてもよい。uniform_tile_structure_flagが1に等しいとき、たとえば、一律なタイルの単一のレベルを示すためにnum_tile_columns_minus1およびnum_tile_rows_minus1をシグナリングすることによって、HEVCスタイルの一律なタイル構造のシグナリングが採用される。uniform_tile_structure_flagが0に等しいとき、以下の情報もシグナリングされてよい。ピクチャの中のタイルの数(NumTilesInPic)がnum_tiles_minus2+2に等しいことを示すシンタックス要素num_tiles_minus2によって、ピクチャの中のタイルの数がシグナリングされうる。デフォルトでピクチャはタイルであるものと見なされてもよいので、このことはシグナリング中のビット節約をもたらしうる。タイルごとに、最後の1つを除いて、タイルの最初のコーディングブロック(たとえば、CTU)および最後のコーディングブロックのアドレスがシグナリングされる。コーディングブロックのアドレスは、ピクチャの中のブロックのインデックス(たとえば、ピクチャの中のCTUのインデックス)でありうる。そのようなコーディングブロックに対するシンタックス要素は、tile_first_block_address[i]およびtile_last_block_address[i]であってよい。これらのシンタックス要素は、ue(v)またはu(v)としてコーディングされてもよい。シンタックス要素がu(v)としてコーディングされるとき、シンタックス要素の各々を表すために使用されるビット数は、ceil(log2(ピクチャの中のコーディングブロックの最大個数))である。最後のタイルの最初および最後のコーディングブロックのアドレスはシグナリングされなくてよく、代わりに、ルーマサンプル、およびピクチャの中のすべての他のタイルの集合の中の、ピクチャサイズに基づいて導出されてもよい。
一例では、タイルごとに、最後の1つを除いて、タイルの最初および最後のコーディングブロックのアドレスをシグナリングするのではなく、タイルの最初のコーディングブロックのアドレス、ならびにタイルの幅および高さがシグナリングされてもよい。別の例では、タイルごとに、最後の1つを除いて、タイルの最初および最後のコーディングブロックのアドレスをシグナリングするのではなく、ピクチャの原物に対するタイルの左上の点(たとえば、ピクチャの左上)のオフセット、ならびにタイルの幅および高さがシグナリングされてもよい。また別の例では、タイルごとに、最後の1つを除いて、タイルの最初および最後のコーディングブロックのアドレスをシグナリングするのではなく、以下の情報がシグナリングされうる。タイルの幅および高さがシグナリングされてよい。また、各タイルのロケーションはシグナリングされなくてよい。代わりに、タイルを以前のタイルのすぐ右に配置すべきかそれともすぐ下に配置すべきかを指定するために、フラグがシグナリングされてよい。タイルが以前のタイルの右にしかあり得ないかまたは下にしかあり得ない場合、このフラグは存在しなくてよい。最初のタイルの左上のオフセットは、常に原点/ピクチャの左上(たとえば、x=0かつy=0)となるように設定されてよい。
シグナリング効率のために、固有のタイルサイズ(たとえば、幅および高さ)のセットがシグナリングされてよい。固有のタイルサイズのこのリストは、各タイルサイズのシグナリングを含むループから、インデックスによって参照されてもよい。いくつかの例では、シグナリングされたタイル構造から導出されるようなタイルロケーションおよびタイルサイズは、いかなるタイルの間にもギャップおよびオーバーラップが発生しないことを確実にするように、区分を制約しなければならない。
以下の制約も適用してもよい。タイル形状は、長方形である(たとえば、ラスタ走査形状でない)ことを必要とされてもよい。ピクチャの中のタイルのユニットは、タイルの間にいかなるギャップおよびいかなるオーバーラップも伴わずにピクチャをカバーしなければならない。1つのコアしか用いずに復号が行われるとき、ピクチャの左の縁にない現在のコーディングブロック(たとえば、CTU)のコーディングのために、現在のコーディングブロックの前に左の隣接コーディングブロックが復号されなければならない。1つのコアしか用いずに復号が行われるとき、ピクチャの上の縁にない現在のコーディングブロック(たとえば、CTU)のコーディングのために、現在のコーディングブロックの前に上の隣接コーディングブロックが復号されなければならない。2つのタイルが、互いに隣接しているタイルインデックス(たとえば、idx3およびidx4)を有するとき、以下のことのうちの1つが真である。2つのタイルが垂直の縁を共有し、かつ/または第1のタイルがサイズ(その幅および高さを表すWaおよびHa)を伴って(Xa,Ya)における左上のロケーションを有するとき、かつ第2のタイルが(Xb,Yb)における左上のロケーションを有するとき、次いで、Yb=Ya+Haである。
以下の制約も適用してもよい。タイルが、2つ以上の左の隣接タイルを有するとき、タイルの高さは、すべてのその左の隣接タイルの高さの合計に等しくなければならない。タイルが、2つ以上の右の隣接タイルを有するとき、タイルの高さは、すべてのその左の隣接タイルの高さの合計に等しくなければならない。タイルが、2つ以上の上の隣接タイルを有するとき、タイルの幅は、すべてのその上の隣接タイルの幅の合計に等しくなければならない。タイルが、2つ以上の下の隣接タイルを有するとき、タイルの幅は、すべてのその下の隣接タイルの幅の合計に等しくなければならない。加えて、タイルインデックスとタイルIDとの間のマッピングを含む、タイルIDのシグナリングは、ピクチャの中のタイルの数に基づいてよい。したがって、マッピングは、タイル列およびタイル行に基づくのではなく、ピクチャの中のタイルの数に基づいてよい。たとえば、各タイルインデックスにタイルIDが割り当てられるように(たとえば、最初のインデックスが0であり、最後のインデックスがピクチャの中のタイルの数-1である、最初のインデックスから最後のインデックスまで)ループが採用されてよい。
以下のことは、上述の態様の特定の例示的な実施形態である。CTBラスタおよびタイル走査プロセスは、次の通りであってよい。第iの第1のレベルのタイル列の幅をCTBの単位で指定する、両端値を含む0からnum_level1_tile_columns_minus1までにわたるiに対するリストColWidth[i]は、次のように導出されうる。
if(uniform_level1_tile_spacing_flag)
for(i=0;i<=num_level1_tile_columns_minus1;i++)
ColWidth[i]=((i+1)*PicWidthInCtbsY)/(num_level1_tile_columns_minus1+1)-(i*PicWidthInCtbsY)/(num_level1_tile_columns_minus1+1)
else{
ColWidth[num_level1_tile_columns_minus1]=PicWidthInCtbsY (6-1)
for(i=0;i<num_level1_tile_columns_minus1;i++){
ColWidth[i]=tile_level1_column_width_minus1[i]+1
ColWidth[num_tile_level1_columns_minus1] -= ColWidth[i]
}
}
第jのタイル行の高さをCTBの単位で指定する、両端値を含む0からnum_level1_tile_rows_minus1までにわたるjに対するリストRowHeight[j]は、次のように導出されうる。
if(uniform_level1_tile_spacing_flag)
for(j=0;j<=num_level1_tile_rows_minus1;j++)
RowHeight[j]=((j+1)*PicHeightInCtbsY)/(num_level1_tile_rows_minus1+1)-(j*PicHeightInCtbsY)/(num_level1_tile_rows_minus1+1)
else{
RowHeight[num_level1_tile_rows_minus1]=PicHeightInCtbsY (6-2)
for(j=0;j<num_level1_tile_rows_minus1;j++){
RowHeight[j]=tile_level1_row_height_minus1[j]+1
RowHeight[num_level1_tile_rows_minus1] -= RowHeight[j]
}
}
第iのタイル列境界のロケーションをCTBの単位で指定する、両端値を含む0からnum_level1_tile_columns_minus1+1までにわたるiに対するリストcolBd[i]は、次のように導出されうる。
for(colBd[0]=0,i=0;i<=num_level1_tile_columns_minus1;i++)
colBd[i+1]=colBd[i]+ColWidth[i] (6-3)
第jのタイル行境界のロケーションをCTBの単位で指定する、両端値を含む0からnum_level1_tile_rows_minus1+1までにわたるjに対するリストrowBd[j]は、次のように導出されうる。
for(rowBd[0]=0,j=0;j<=num_level1_tile_rows_minus1;j++)
rowBd[j+1]=rowBd[j]+RowHeight[j] (6-4)
PPSを参照してピクチャの中のタイルの数を指定する変数NumTilesInPic、ならびに第iのタイル列境界のロケーションをCTBの単位で、第iのタイル行境界のロケーションをCTBの単位で、第iのタイル列の幅をCTBの単位で、かつ第iのタイル列の高さをCTBの単位で指定する、両端値を含む0からNumTilesInPic-1までにわたるiに対するリストTileColBd[i]、TileRowBd[i]、TileWidth[i]、およびTileHeight[i]は、次のように導出されうる。
for(tileIdx=0,i=0;i<NumLevel1Tiles;i++){
tileX=i%(num_level1_tile_columns_minus1+1)
tileY=i/(num_level1_tile_columns_minus1+1)
if(!level2_tile_split_flag[i]){ (6-5)
TileColBd[tileIdx]=colBd[tileX]
TileRowBd[tileIdx]=rowBd[tileY]
TileWidth[tileIdx]=ColWidth[tileX]
TileHeight[tileIdx]=RowHeight[tileY]
tileIdx++
}else{
for(k=0;k<=num_level2_tile_columns_minus1[i];k++)
colWidth2[k]=((k+1)*ColWidth[tileX])/(num_level2_tile_columns_minus1[i]+1)-(k*ColWidth[tileX])/(num_level2_tile_columns_minus1[i]+1)
for(k=0;k<=num_level2_tile_rows_minus1[i];k++)
rowHeight2[k]=((k+1)*RowHeight[tileY])/(num_level2_tile_rows_minus1[i]+1)-(k*RowHeight[tileY])/(num_level2_tile_rows_minus1[i]+1)
for(colBd2[0]=0,k=0;k<=num_level2_tile_columns_minus1[i];k++)
colBd2[k+1]=colBd2[k]+colWidth2[k]
for(rowBd2[0]=0,k=0;k<=num_level2_tile_rows_minus1[i];k++)
rowBd2[k+1]=rowBd2[k]+rowHeight2[k]
numSplitTiles=(num_level2_tile_columns_minus1[i]+1)*(num_level2_tile_rows_minus1[i]+1)
for(k=0;k<numSplitTiles;k++){
tileX2=k%(num_level2_tile_columns_minus1[i]+1)
tileY2=k/(num_level2_tile_columns_minus1[i]+1)
TileColBd[tileIdx]=colBd[tileX]+colBd2[tileX2]
TileRowBd[tileIdx]=rowBd[tileY]+rowBd2[tileY2]
TileWidth[tileIdx]=colWidth2[tileX2]
TileHeight[tileIdx]=rowHeight2[tileY2]
tileIdx++
}
}
}
NumTilesInPic=tileIdx
ピクチャのCTBラスタ走査におけるCTBアドレスからタイル走査におけるCTBアドレスへの変換を指定する、両端値を含む0からPicSizeInCtbsY-1までにわたるctbAddrRsに対するリストCtbAddrRsToTs[ctbAddrRs]は、次のように導出されうる。
for(ctbAddrRs=0;ctbAddrRs<PicSizeInCtbsY;ctbAddrRs++){
tbX=ctbAddrRs%PicWidthInCtbsY
tbY=ctbAddrRs/PicWidthInCtbsY tileFound=FALSE
for(tileIdx=NumTilesInPic-1,i=0;i<NumTilesInPic-1 && !tileFound;i++){ (6-6)
tileFound=tbX<(TileColBd[i]+TileWidth[i]) && tbY<(TileRowBd[i]+TileHeight[i])
if(tileFound)
tileIdx=i
}
CtbAddrRsToTs[ctbAddrRs]=0
for(i=0;i<tileIdx;i++)
CtbAddrRsToTs[ctbAddrRs] += TileHeight[i]*TileWidth[i]
CtbAddrRsToTs[ctbAddrRs] += (tbY-TileRowBd[tileIdx])*TileWidth[tileIdx]+tbX-TileColBd[tileIdx]
}
タイル走査におけるCTBアドレスからピクチャのCTBラスタ走査におけるCTBアドレスへの変換を指定する、両端値を含む0からPicSizeInCtbsY-1までにわたるctbAddrTsに対するリストCtbAddrTsToRs[ctbAddrTs]は、次のように導出されうる。
for(ctbAddrRs=0;ctbAddrRs<PicSizeInCtbsY;ctbAddrRs++) (6-7)
CtbAddrTsToRs[CtbAddrRsToTs[ctbAddrRs]]=ctbAddrRs
タイル走査におけるCTBアドレスからタイルIDへの変換を指定する、両端値を含む0からPicSizeInCtbsY-1までにわたるctbAddrTsに対するリストTileId[ctbAddrTs]、およびタイルIDからタイルの中の最初のCTBのタイル走査におけるCTBアドレスへの変換を指定する、両端値を含む0からNumTilesInPic-1までにわたるtileIdxに対するリストFirstCtbAddrTs[tileIdx]は、次のように導出されうる。
for(i=0,tileIdx=0;i<=NumTilesInPic;i++,tileIdx++){
for(y=TileRowBd[i];y<TileRowBd[i+1];y++) (6-8)
for(x=TileColBd[i];x<TileColBd[i+1];x++)
TileId[CtbAddrRsToTs[y*PicWidthInCtbsY+x]]=tileIdx
FirstCtbAddrTs[tileIdx]=CtbAddrRsToTs[TileColBd[tileIdx]]*PicWidthInCtbsY+TileColBd[tileIdx]]
}
タイルインデックスからタイルの中のCTUの数への変換を指定する、両端値を含む0からNumTilesInPic-1までにわたるtileIdxに対するリストNumCtusInTile[tileIdx]は、次のように導出されうる。
for(i=0,tileIdx=0;i<NumTilesInPic;i++,tileIdx++) (6-9)
NumCtusInTile[tileIdx]=TileColWidth[tileIdx]*TileRowHeight[tileIdx]
例示的なピクチャパラメータセットRBSPシンタックスは次の通りである。
例示的なピクチャパラメータセットRBSPセマンティックは、次の通りである。num_level1_tile_columns_minus1+1は、ピクチャを区分するレベル1タイル列の数を指定する。num_level1_tile_columns_minus1は、両端値を含む0~PicWidthInCtbsY-1の範囲の中になければならない。存在しないとき、num_level1_tile_columns_minus1の値は0に等しいものと推測される。num_level1_tile_rows_minus1+1は、ピクチャを区分するレベル1タイル行の数を指定する。num_level1_tile_rows_minus1は、両端値を含む0~PicHeightInCtbsY-1の範囲の中になければならない。存在しないとき、num_level1_tile_rows_minus1の値は0に等しいものと推測される。変数NumLevel1Tilesは、(num_level1_tile_columns_minus1+1)*(num_level1_tile_rows_minus1+1)に等しく設定される。single_tile_in_pic_flagが0に等しいとき、NumTilesInPicは1よりも大きくなければならない。uniform_level1_tile_spacing_flagは、レベル1タイル列境界および同様にレベル1タイル行境界がピクチャを横断して一律に分散されることを指定するために1に等しく設定される。uniform_level1_tile_spacing_flagは、レベル1タイル列境界および同様にレベル1タイル行境界が、ピクチャを横断して一律に分散されないがシンタックス要素level1_tile_column_width_minus1[i]およびlevel1_tile_row_height_minus1[i]を使用して明示的にシグナリングされることを指定するために、0に等しい。存在しないとき、uniform_level1_tile_spacing_flagの値は1に等しいものと推測される。
level1_tile_column_width_minus1[i]+1は、第iのレベル1タイル列の幅をCTBの単位で指定する。level1_tile_row_height_minus1[i]+1は、第iのタイルレベル1行の高さをCTBの単位で指定する。level2_tile_present_flagは、1つ以上のレベル1タイルがもっと多くのレベル2タイルに分割されることを指定する。level2_tile_split_flag[i]は、第iのレベル1タイルが2つ以上のタイルに分割されることを指定する。num_level2_tile_columns_minus1[i]+1は、第iのタイルを区分するタイル列の数を指定する。num_level2_tile_columns_minus1[i]は、両端値を含む0~ColWidth[i]の範囲の中になければならない。存在しないとき、num_level2_tile_columns_minus1[i]の値は0に等しいものと推測される。num_level2_tile_rows_minus1[i]+1は、第iのタイルを区分するタイル行の数を指定する。num_level2_tile_rows_minus1[i]は、両端値を含む0~RowHeight[i]の範囲の中になければならない。存在しないとき、num_level2_tile_rows_minus1[i]の値は0に等しいものと推測される。
level2_tile_split_flag[i]が1に等しいとき、(num_level2_tile_columns_minus1[i]+1)*(num_level2_tile_rows_minus1[i]+1)値は1よりも大きくなければならない。ピクチャは、0に等しいlevel2_tile_split_flag[i]を有する0個以上のレベル1タイル、および0個以上のレベル2タイルを含んでよい。0に等しいlevel2_tile_split_flag[i]を有するレベル1タイルは、ピクチャの中のタイルの総数の中に計数されなくてよい。そのようなタイルが参照されるとき、そのような分割から得られたレベル2タイルのセットは一括して参照されてもよい。
CTBラスタおよびタイル走査変換プロセス呼び出すことによって、以下の変数、すなわち、第iのレベル1タイル列の幅をCTBの単位で指定する、両端値を含む0からnum_level1_tile_columns_minus1までにわたるiに対するリストColWidth[i]、第jのレベル1タイル行の高さをCTBの単位で指定する、両端値を含む0からnum_level1_tile_rows_minus1までにわたるjに対するリストRowHeight[j]、PPSを参照してピクチャの中のタイルの数を指定する変数NumTilesInPic、第iのタイルの幅をCTBの単位で指定する、両端値を含む0からNumTilesInPicまでにわたるiに対するリストTileWidth[i]、第iのタイルの高さをCTBの単位で指定する、両端値を含む0からNumTilesInPicまでにわたるiに対するリストTileHeight[i]、第iのタイル列境界のロケーションをCTBの単位で指定する、両端値を含む0からNumTilesInPicまでにわたるiに対するリストTileColBd[i]、第iのタイル行境界のロケーションをCTBの単位で指定する、両端値を含む0からNumTilesInPicまでにわたるjに対するリストTileRowBd[i]、ピクチャのCTBラスタ走査におけるCTBアドレスからタイル走査におけるCTBアドレスへの変換を指定する、両端値を含む0からPicSizeInCtbsY-1までにわたるctbAddrRsに対するリストCtbAddrRsToTs[ctbAddrRs]、タイル走査におけるCTBアドレスからピクチャのCTBラスタ走査におけるCTBアドレスへの変換を指定する、両端値を含む0からPicSizeInCtbsY-1までにわたるctbAddrTsに対するリストCtbAddrTsToRs[ctbAddrTs]、タイル走査におけるCTBアドレスからタイルIDへの変換を指定する、両端値を含む0からPicSizeInCtbsY-1までにわたるctbAddrTsに対するリストTileId[ctbAddrTs]、タイルインデックスからタイルの中のCTUの数への変換を指定する、両端値を含む0からPicSizeInCtbsY-1までにわたるtileIdxに対するリストNumCtusInTile[tileIdx]、およびタイルIDからタイルの中の最初のCTBのタイル走査におけるCTBアドレスへの変換を指定する、両端値を含む0からNumTilesInPic-1までにわたるtileIdxに対するリストFirstCtbAddrTs[tileIdx]が導出される。
例示的なタイルグループヘッダセマンティックは次の通りである。タイルグループは、いくつかの完全なレベル1タイルのみ、または1つの単一のレベル1タイルのいくつかの完全なレベル2タイルのみを含んでよい。tile_group_addressは、タイルグループの中の最初のタイルのタイルアドレスを指定し、ここで、タイルアドレスは、式6-8によって指定されるようなTileId[firstCtbAddrTs]に等しく、firstCtbAddrTsは、タイルグループの中の最初のCTUのCTBのタイル走査におけるCTBアドレスである。tile_group_addressの長さは、Ceil(Log2(NumTilesInPic))ビットである。tile_group_addressの値は、両端値を含む0~NumTilesInPic-1の範囲の中になければならず、tile_group_addressの値は、同じコーディングされたピクチャのいかなる他のコーディングされたタイルグループNALユニットのtile_group_addressの値にも等しくてはならない。tile_group_addressが存在しないとき、それは0に等しいものと推測される。
以下のことは、上述の態様の第2の特定の例示的な実施形態である。例示的なCTBラスタおよびタイル走査プロセスは次の通りである。PPSを参照してピクチャの中のタイルの数を指定する変数NumTilesInPic、ならびに第iのタイル列境界のロケーションをCTBの単位で、第iのタイル行境界のロケーションをCTBの単位で、第iのタイル列の幅をCTBの単位で、かつ第iのタイル列の高さをCTBの単位で指定する、両端値を含む0からNumTilesInPic-1までにわたるiに対するリストTileColBd[i]、TileRowBd[i]、TileWidth[i]、およびTileHeight[i]は、次のように導出される。
for(tileIdx=0,i=0;i<NumLevel1Tiles;i++){
tileX=i%(num_level1_tile_columns_minus1+1)
tileY=i/(num_level1_tile_columns_minus1+1)
if(!level2_tile_split_flag[i]){ (6-5)
TileColBd[tileIdx]=colBd[tileX]
TileRowBd[tileIdx]=rowBd[tileY]
TileWidth[tileIdx]=ColWidth[tileX]
TileHeight[tileIdx]=RowHeight[tileY]
tileIdx++
}else{
if(uniform_level2_tile_spacing_flag[i]){
for(k=0;k<=num_level2_tile_columns_minus1[i];k++)
colWidth2[k]=((k+1)*ColWidth[tileX])/(num_level2_tile_columns_minus1[i]+1)-(k*ColWidth[tileX])/(num_level2_tile_columns_minus1[i]+1)
for(k=0;k<=num_level2_tile_rows_minus1[i];k++)
rowHeight2[k]=((k+1)*RowHeight[tileY])/(num_level2_tile_rows_minus1[i]+1)-(k*RowHeight[tileY])/(num_level2_tile_rows_minus1[i]+1)
}else{
colWidth2[num_level2_tile_columns_minus1[i]]=ColWidth[tileX])
for(k=0;k<=num_level2_tile_columns_minus1[i];k++){
colWidth2[k]=tile_level2_column_width_minus1[k]+1
colWidth2[k] -= colWidth2[k]
}
rowHeight2[num_level2_tile_rows_minus1[i]]=RowHeight[tileY])
for(k=0;k<=num_level2_tile_rows_minus1[i];k++){
rowHeigh2[k]=tile_level2_column_width_minus1[k]+1
rowHeight2[k] -= rowHeight2[k]
}
}
for(colBd2[0]=0,k=0;k<=num_level2_tile_columns_minus1[i];k++)
colBd2[k+1]=colBd2[k]+colWidth2[k]
for(rowBd2[0]=0,k=0;k<=num_level2_tile_rows_minus1[i];k++)
rowBd2[k+1]=rowBd2[k]+rowHeight2[k]
numSplitTiles=(num_level2_tile_columns_minus1[i]+1)*(num_level2_tile_rows_minus1[i]+1)
for(k=0;k<numSplitTiles;k++){
tileX2=k%(num_level2_tile_columns_minus1[i]+1)
tileY2=k/(num_level2_tile_columns_minus1[i]+1)
TileColBd[tileIdx]=colBd[tileX]+colBd2[tileX2]
TileRowBd[tileIdx]=rowBd[tileY]+rowBd2[tileY2]
TileWidth[tileIdx]=colWidth2[tileX2]
TileHeight[tileIdx]=rowHeight2[tileY2]
tileIdx++
}
}
}
NumTilesInPic=tileIdx
例示的なピクチャパラメータセットRBSPシンタックスは次の通りである。
例示的なピクチャパラメータセットRBSPセマンティックは次の通りである。uniform_level2_tile_spacing_flag[i]は、第iのレベル1タイルのレベル2タイル列境界および同様に第iのレベル1タイルのレベル2タイル行境界がピクチャを横断して一律に分散されることを指定するために1に等しく設定される。uniform_level2_tile_spacing_flag[i]は、第iのレベル1タイルのレベル2タイル列境界および同様に第iのレベル1タイルのレベル2タイル行境界が、ピクチャを横断して一律に分散されないがシンタックス要素level2_tile_column_width_minus1[j]およびlevel2_tile_row_height_minus1[j]を使用して明示的にシグナリングされることを指定するために、0に等しく設定されうる。存在しないとき、uniform_level2_tile_spacing_flag[i]の値は1に等しいものと推測される。level2_tile_column_width_minus1[j]+1は、第iのレベル1タイルの第jのレベル2タイル列の幅をCTBの単位で指定する。level2_tile_row_height_minus1[j]+1は、第iのレベル1タイルの第jのタイルレベル2行の高さをCTBの単位で指定する。
以下のことは、上述の態様の第3の特定の例示的な実施形態である。CTBラスタおよびタイル走査プロセスは次の通りである。第iの第1のレベルのタイル列の幅をCTBの単位で指定する、両端値を含む0からnum_level1_tile_columns_minus1までにわたるiに対するリストColWidth[i]は、次のように導出されてもよい。
for(i=0;i<=num_level1_tile_columns_minus1;i++)
ColWidth[i]=((i+1)*PicWidthInCtbsY)/(num_level1_tile_columns_minus1+1)-(i*PicWidthInCtbsY)/(num_level1_tile_columns_minus1+1)
第jのタイル行の高さをCTBの単位で指定する、両端値を含む0からnum_level1_tile_rows_minus1までにわたるjに対するリストRowHeight[j]は、次のように導出されてもよい。
for(j=0;j<=num_level1_tile_rows_minus1;j++)
RowHeight[j]=((j+1)*PicHeightInCtbsY)/(num_level1_tile_rows_minus1+1)-(j*PicHeightInCtbsY)/(num_level1_tile_rows_minus1+1)
例示的なピクチャパラメータセットRBSPシンタックスは次の通りである。
以下のことは、上述の態様の第4の特定の例示的な実施形態である。例示的なピクチャパラメータセットRBSPシンタックスは次の通りである。
例示的なピクチャパラメータセットRBSPセマンティックは次の通りである。ビットストリーム適合は、以下の制約が適用されることを必要としてもよい。値MinTileWidthは最小タイル幅を指定し、256ルーマサンプルに等しくなければならない。値MinTileHeightは最小タイル高さを指定し、64ルーマサンプルに等しくなければならない。最小タイル幅および最小タイル高さの値は、プロファイルおよびレベル定義に従って変化してもよい。変数Level1TilesMayBeFurtherSplitは、次のように導出されてもよい。
Level1TilesMayFurtherBeSplit=0
for(i=0,!Level1TilesMayFurtherBeSplit && i=0;i<NumLevel1Tiles;i++)
if((ColWidth[i]*CtbSizeY>=(2*MinTileWidth))||(RowHeight[i]*CtbSizeY>=(2*MinTileHeight)))
Level1TilesMayFurtherBeSplit=1
level2_tile_present_flagは、1つ以上のレベルタイルがもっと多くのタイルに分割されることを指定する。存在しないとき、level2_tile_present_flagの値は0に等しいものと推測される。level2_tile_split_flag[i]+1は、第iのレベル1タイルが2つ以上のタイルに分割されることを指定する。存在しないとき、level2_tile_split_flag[i]の値は0に等しいものと推測される。
以下のことは、上述の態様の第5の特定の例示的な実施形態である。各タイルロケーションおよび各タイルサイズがシグナリングされてもよい。そのようなタイル構造シグナリングをサポートするためのシンタックスは、以下で作表されるようなものでありうる。tile_top_left_address[i]およびtile_bottom_right_address[i]は、タイルによってカバーされる長方形エリアを示す、ピクチャ内のCTUインデックスである。これらのシンタックス要素をシグナリングするためのビット数は、ピクチャの中の最大個数のCTUを表すのに十分であるべきである。
各タイルロケーションおよび各タイルサイズがシグナリングされてもよい。そのようなタイル構造シグナリングをサポートするためのシンタックスは、以下で作表されるようなものでありうる。tile_top_left_address[i]は、ピクチャのCTUラスタ走査の順序における、タイルの中の最初のCTUのCTUインデックスである。タイル幅およびタイル高さがタイルのサイズを指定する。タイルサイズが共通のユニットを最初にシグナリングすることによって、これらの2つのシンタックス要素をシグナリングするときにいくつかのビットが節約されうる。
別の例では、各タイルサイズは次のようにシグナリングされうる。フレキシブルタイル構造をシグナリングするために、各タイルのロケーションはシグナリングされなくてよい。代わりに、タイルを以前のタイルのすぐ右に置くべきかそれともすぐ下に置くべきかを指定するために、フラグがシグナリングされてよい。タイルが現在のタイルの右にしかあり得ないかまたは下にしかあり得ない場合、このフラグは存在しなくてよい。
tile_x_offset[i]およびtile_y_offset[i]の値は、以下の順序付きステップによって導出されうる。
tile_x_offset[0]およびtile_y_offset[0]が0に等しく設定される。
maxWidthがtile_width[0]に等しく設定され、maxHeightがtile_height[0]に等しく設定される。
runningWidthがtile_width[0]に等しく設定され、runningHeightがtile_height[0]に等しく設定される。
lastNewRowHeightが0に等しく設定される。
TilePositionCannotBeInferred=falseである。
i>0に対して、以下のことが適用される。
値isRightを次のように設定させる。
runningWidth+tile_width[i]<=PictureWidthの場合、isRight==1であり、
他の場合、isRight==0である。
値isBelowを次のように設定させる。
runningHeight+tile_height[i]<=PictureHeightの場合、isBelow==1であり、
他の場合、isBelow==0である。
isRight==1 && isBelow==1の場合、TilePositionCannotBeInferred=trueである。
isRight==1 && isBelow==0の場合、以下のこと、すなわち、
right_tile_flag[i]=1、
tile_x_offset[i]=runningWidth、
tile_y_offset[i]=(runningWidth==maxWidth) ? 0 : lastNewRowHeight、
lastNewRowHeight=(runningWidth==maxWidth) ? 0 : lastNewRowHeightが適用され、
そうではなく、isRight==0 && isBelow==1の場合、以下のこと、すなわち、
right_tile_flag[i]=0、
tile_y_offset[i]=runningHeight、
tile_x_offset[i]=(runningHeight==maxHeight) ? 0 : tile_x_offset[i-1]、
lastNewRowHeight=(runningHeight==maxHeight && runningWidth==maxWidth) ? runningHeight : lastNewRowHeightが適用され、
そうではなく、isRight==1 && isBelow==1 && right_tile_flag[i]==1の場合、以下のこと、すなわち、
tile_x_offset[i]=runningWidth、
tile_y_offset[i]=(runningWidth==maxWidth) ? 0 : lastNewRowHeight、
lastNewRowHeight=(runningWidth==maxWidth) ? 0 : lastNewRowHeightが適用され、
他の場合(すなわち、isRight==1 && isBelow==1 && right_tile_flag[i]==0)、以下のこと、すなわち、
tile_y_offset[i]=runningHeight、
tile_x_offset[i]=(runningHeight==maxHeight) ? 0 : tile_x_offset[i-1]、
lastNewRowHeight=(runningHeight==maxHeight && runningWidth==maxWidth) ? runningHeight : lastNewRowHeightが適用され、
right_tile_flag[i]==1の場合、以下のこと、すなわち、
runningWidth=runningWidth+tile_width[i]が適用され、
runningWidth>maxWidthの場合、maxWidthをrunningWidthに等しく設定し、
runningHeightがtile_y_offset[i]+tile_height[i]に等しく、
他の場合(すなわち、right_tile_flag[i]==0)、以下のこと、すなわち、
runningHeight=runningHeight+tile_height[i]が適用され、
runningHeight>maxHeightの場合、maxHeightをrunningHeightに等しく設定し、
runningWidthがtile_x_offset[i]+tile_width[i]に等しい。
前述のことは、擬似コードでは次のように記述されうる。
tile_x_offset[0]=0
tile_y_offset[0]=0
maxWidth=tile_width[0]
maxHeight=tile_height[0]
runningWidth=tile_width[0]
runningHeight=tile_height[0]
lastNewRowHeight=0
isRight=false
isBelow=false
TilePositionCannotBeInferred=false
for(i=1;i<num_tiles_minus2+2;i++){
TilePositionCannotBeInferred=false
isRight=(runningWidth+tile_width[i]<=PictureWidth) ? true : false
isbelow=(runningHeight+tile_height[i]<=PictureHeight) ? true : false
if(!isRight && !isBelow)
//エラー。この事例が発生してはならない。
if(isRight && isBelow)
TilePositionCannotBeInferred=true
if(isRight && !isBelow){
right_tile_flag[i]=true
tile_x_offst[i]=runningWidth
tile_y_offset[i]=(runningWidth==maxWidth) ? 0 : lastNewRowHeight
lastNewRowHeight=tile_y_offset[i]
}
else if(!isRight && isBelow){
right_tile_flag[i]=false
tile_y_offset[i]=runningHeight
tile_x_offset[i]=(runningHeight==maxHeight) ? 0 : tile_x_offset[i-1]
lastNewRowHeight=(runningHeight==maxHeight && runningWidth==maxWidth) ? runningHeight : lastNewRowHeight
}
else if(right_tile_flag[i]){
tile_x_offst[i]=runningWidth
tile_y_offset[i]=(runningWidth==maxWidth) ? 0 : lastNewRowHeight
lastNewRowHeight=tile_y_offset[i]
}
else{
tile_y_offset[i]=runningHeight
tile_x_offset[i]=(runningHeight==maxHeight) ? 0 : tile_x_offset[i-1]
lastNewRowHeight=(runningHeight==maxHeight && runningWidth==maxWidth) ? runningHeight : lastNewRowHeight
}
}
if(right_tile_flag[i]){
runningWidth += tile_width[i]
if(runningWidth>maxWidth)maxWidth=runningWidth
runningHeight=tile_y_offset[i]+tile_height[i]
}
else{
runningHeight += tile_height[i]
if(runningHeight>maxHeight)maxHeight=runningHeight
runningWidth=tile_x_offset[i]+tile_width[i]
}
以下のことは、最後のタイルのサイズを導出する、擬似コードでの一実装形態である。
tile_x_offset[0]=0
tile_y_offset[0]=0
maxWidth=tile_width[0]
maxHeight=tile_height[0]
runningWidth=tile_width[0]
runningHeight=tile_height[0]
lastNewRowHeight=0
isRight=false
isBelow=false
TilePositionCannotBeInferred=false
for(i=1;i<num_tiles_minus2+2;i++){
currentTileWidth=(i==num_tiles_minus2+1) ? (PictureWidth-runningWidth)%PictureWidth : tile_width[i]
currentTileHeight=(i==num_tiles_minus2+1) ? (PictureHeight-runningHeight)%PictureHeight : tile_Height[i]
isRight=(runningWidth+currentTileWidth<=PictureWidth) ? true : false
isbelow=(runningHeight+currentTileHeight<=PictureHeight) ? true : false
if(!isRight && !isBelow)
//エラー。この事例が発生してはならない。
if(isRight && isBelow)
TilePositionCannotBeInferred=true
if(isRight && !isBelow){
right_tile_flag[i]=true
tile_x_offst[i]=runningWidth
tile_y_offset[i]=(runningWidth==maxWidth) ? 0 : lastNewRowHeight
lastNewRowHeight=tile_y_offset[i]
}
else if(!isRight && isBelow){
right_tile_flag[i]=false
tile_y_offset[i]=runningHeight
tile_x_offset[i]=(runningHeight==maxHeight) ? 0 : tile_x_offset[i-1]
lastNewRowHeight=(runningHeight==maxHeight && runningWidth==maxWidth) ? runningHeight : lastNewRowHeight
}
else if(right_tile_flag[i]){
tile_x_offst[i]=runningWidth
tile_y_offset[i]=(runningWidth==maxWidth) ? 0 : lastNewRowHeight
lastNewRowHeight=tile_y_offset[i]
}
else{
tile_y_offset[i]=runningHeight
tile_x_offset[i]=(runningHeight==maxHeight) ? 0 : tile_x_offset[i-1]
lastNewRowHeight=(runningHeight==maxHeight && runningWidth==maxWidth) ? runningHeight : lastNewRowHeight
}
}
if(right_tile_flag[i]){
runningWidth += currentTileWidth
if(runningWidth>maxWidth)maxWidth=runningWidth
runningHeight=tile_y_offset[i]+currentTileHeight
}
else{
runningHeight += currentTileHeight
if(runningHeight>maxHeight)maxHeight=runningHeight
runningWidth=tile_x_offset[i]+currentTileWidth
}
さらなるシグナリングビット節約のために、固有のタイルサイズの数が、ユニットタイルサイズの作表をサポートするためにシグナリングされうる。タイルサイズは、次いで、インデックスのみによって参照されうる。
以下のことは、上述の態様の第6の特定の例示的な実施形態である。例示的なCTBラスタおよびタイル走査プロセスは次の通りである。タイル走査におけるCTBアドレスからタイルIDへの変換を指定する、両端値を含む0からPicSizeInCtbsY-1までにわたるctbAddrTsに対するリストTileId[ctbAddrTs]、およびタイルIDからタイルの中の最初のCTBのタイル走査におけるCTBアドレスへの変換を指定する、両端値を含む0からNumTilesInPic-1までにわたるtileIdxに対するリストFirstCtbAddrTs[tileIdx]は、次のように導出されてもよい。
for(i=0,tileIdx=0;i<=NumTilesInPic;i++,tileIdx++){
for(y=TileRowBd[i];y<TileRowBd[i+1];y++) (6-8)
for(x=TileColBd[i];x<TileColBd[i+1];x++)
TileId[CtbAddrRsToTs[y*PicWidthInCtbsY+x]]=explicit_tile_id_flag ? tile_id_val[i] : tileIdx
FirstCtbAddrTs[tileIdx]=CtbAddrRsToTs[TileColBd[tileIdx]]*PicWidthInCtbsY+TileColBd[tileIdx]]
}
タイルIDからタイルインデックスへの変換を指定するNumTilesInPic tileId値のセットに対するセットTileIdToIdx[tileId]は、次のように導出されてもよい。
for(ctbAddrTs=0,tileIdx=0,tileStartFlag=1;ctbAddrTs<PicSizeInCtbsY;ctbAddrTs++){
if(tileStartFlag){
TileIdToIdx[TileId[ctbAddrTs]]=tileIdx
tileStartFlag=0
}
tileEndFlag=ctbAddrTs==PicSizeInCtbsY-1||TileId[ctbAddrTs+1]!=TileId[ctbAddrTs]
if(tileEndFlag){
tileIdx++
tileStartFlag=1
}
}
例示的なピクチャパラメータセットRBSPシンタックスおよびセマンティックは次の通りである。
いくつかの例では、セマンティックは次の通りでありうる。tile_id_len_minus1+1は、PPSを参照してタイルグループヘッダの中でシンタックス要素tile_id_val[i]およびシンタックス要素tile_group_addressを表すために使用されるビット数を指定する。tile_id_len_minus1の値は、両端値を含むCeil(Log2(NumTilesInPic)~15の範囲の中にあってよい。他の例では、セマンティックは次の通りでありうる。tile_id_len_minus1+1は、タイルID値を参照するPPSを参照してタイルグループヘッダの中でシンタックス要素tile_id_val[i]およびシンタックス要素を表すために使用されるビット数を指定してもよい。tile_id_len_minus1の値は、両端値を含むCeil(Log2(NumTilesInPic)~15の範囲の中にあってよい。
explicit_tile_id_flagは、タイルごとのタイルIDが明示的にシグナリングされることを指定するために1に等しく設定されてもよい。explicit_tile_id_flagは、タイルIDが明示的にはシグナリングされないことを指定するために0に等しく設定されてもよい。tile_id_val[i]は、ピクチャの中の第iのタイルのタイルのタイルIDを指定してもよい。tile_id_val[i]の長さは、tile_id_len_minus1+1ビットであってよい。両端値を含む0~NumTilesInPic-1の範囲の中の任意の整数mに対して、iがjに等しくないときtile_id_val[i]はtile_id_val[j]に等しくなくてよく、jがiよりも大きいときtile_id_val[i]はtile_id_val[j]よりも小さくてよい。
例示的なタイルグループヘッダRBSPシンタックスおよびセマンティックは次の通りである。
tile_group_addressは、タイルグループの中の最初のタイルのタイルアドレスを指定してもよい。tile_group_addressの長さは、tile_id_len_minus1+1ビットであってよい。tile_group_addressの値は、両端値を含む0~2tile_id_len_minus1+1-1の範囲の中にあってよく、tile_group_addressの値は、同じコーディングされたピクチャのいかなる他のコーディングされたタイルグループNALユニットのtile_group_addressの値にも等しくなくてよい。tile_group_addressは、存在しないとき、0に等しいものと推定されてもよい。
図9は、例示的なビデオコーディングデバイス900の概略図である。ビデオコーディングデバイス900は、本明細書で説明するような開示する実施例/実施形態を実施するのに適している。ビデオコーディングデバイス900は、ダウンストリームポート920、アップストリームポート950、ならびに/またはネットワークを介してアップストリームおよび/もしくはダウンストリームにデータを通信するための送信機および/もしくは受信機を含むトランシーバユニット(Tx/Rx)910を備える。ビデオコーディングデバイス900はまた、データを処理するための論理ユニットおよび/または中央演算処理装置(CPU)、ならびにデータを記憶するためのメモリ932を含む、プロセッサ930を含む。ビデオコーディングデバイス900はまた、電気構成要素、光電気(OE:optical-to-electrical)構成要素、電気光(EO:electrical-to-optical)構成要素、ならびに/または電気通信ネットワーク、光通信ネットワーク、もしくはワイヤレス通信ネットワークを介したデータの通信のためにアップストリームポート950および/もしくはダウンストリームポート920に結合されたワイヤレス通信構成要素を備えてよい。ビデオコーディングデバイス900はまた、ユーザとの間でデータを通信するための入力および/または出力(I/O)デバイス960を含んでよい。I/Oデバイス960は、ビデオデータを表示するためのディスプレイ、オーディオデータを出力するためのスピーカーなどの、出力デバイスを含んでよい。I/Oデバイス960はまた、キーボード、マウス、トラックボールなどの、入力デバイス、および/またはそのような出力デバイスと相互作用するための対応するインターフェースを含んでよい。
プロセッサ930は、ハードウェアおよびソフトウェアによって実装される。プロセッサ930は、1つ以上のCPUチップ、コア(たとえば、マルチコアプロセッサとして)、フィールドプログラマブルゲートアレイ(FPGA)、特定用途向け集積回路(ASIC)、およびデジタル信号プロセッサ(DSP)として実装されてよい。プロセッサ930は、ダウンストリームポート920、Tx/Rx910、アップストリームポート950、およびメモリ932と通信している。プロセッサ930は、コーディングモジュール914を備える。コーディングモジュール914は、ビットストリーム500および/またはフレキシブルビデオタイリング方式800に従って区分される画像を採用してもよい、方法100、1000、および1100、メカニズム600、ならびに/またはアプリケーション700などの、本明細書で説明される開示する実施形態を実施する。コーディングモジュール914はまた、本明細書で説明する任意の他の方法/メカニズムを実施してもよい。さらに、コーディングモジュール914は、コーデックシステム200、エンコーダ300、および/またはデコーダ400を実装してもよい。たとえば、コーディングモジュール914は、ピクチャを第1のレベルのタイルに区分することができ、第1のレベルのタイルを第2のレベルのタイルに区分することができる。コーディングモジュール914はまた、各タイルグループが、いくつかの第1のレベルのタイル、または単一の第1のレベルのタイルの第2のレベルのタイルの連続するシーケンスを含むように、第1のレベルのタイルおよび第2のレベルのタイルをタイルグループに割り当てることができ、その結果、単一の第1のレベルのタイルから作成されたすべての第2のレベルのタイルは、同じタイルグループに割り当てられる。コーディングモジュール914はまた、第1のレベルのタイルがラスタ走査順序でコーディングされるような走査順序でそのようなタイルを符号化および/または復号することができ、第2のレベルのタイルは、そのような第2のレベルのタイルがそこから区分される第1のレベルのタイル内でラスタ走査順序でコーディングされる。コーディングモジュール914は、本明細書で説明するような様々な使用事例に対して、異なる解像度におけるサブピクチャを組み合わせて単一のピクチャにするために、そのようなメカニズムを採用することをさらにサポートする。したがって、コーディングモジュール914は、ビデオコーディングデバイス900の機能を改善するとともに、ビデオコーディング技術に特有の問題に対処する。さらに、コーディングモジュール914は、異なる状態へのビデオコーディングデバイス900の変換をもたらす。代替的に、コーディングモジュール914は、(たとえば、非一時的媒体上に記憶されるコンピュータプログラム製品として)メモリ932の中に記憶されプロセッサ930によって実行される命令として実施されうる。
メモリ932は、ディスク、テープドライブ、ソリッドステートドライブ、読取り専用メモリ(ROM)、ランダムアクセスメモリ(RAM)、フラッシュメモリ、3値連想メモリ(TCAM)、スタティックランダムアクセスメモリ(SRAM)などの、1つ以上のメモリタイプを備える。メモリ932は、実行のためにプログラムが選択されるときにそのようなプログラムを記憶するために、またプログラム実行中に読み取られる命令およびデータを記憶するために、オーバーフローデータ記憶デバイスとして使用されてもよい。
図10は、フレキシブルタイリング方式800などのフレキシブルタイリング方式を採用することによって画像を符号化する、例示的な方法1000のフローチャートである。方法1000は、方法100、メカニズム600、および/またはサポートするアプリケーション700を実行するとき、コーデックシステム200、エンコーダ300、および/またはビデオコーディングデバイス900などの、エンコーダによって採用されてもよい。さらに、方法1000は、デコーダ400などのデコーダへの送信のためにビットストリーム500を生成するために採用されてもよい。
エンコーダが、複数の画像を含むビデオシーケンスを受信し、たとえば、ユーザ入力に基づいて、ビデオシーケンスをビットストリームの中に符号化すべきと決定すると、方法1000が開始してもよい。一例として、ビデオシーケンス、したがって、画像は、複数の解像度で符号化されうる。ステップ1001において、ピクチャは、複数の第1のレベルのタイルに区分される。第1のレベルのタイルのサブセットも、複数の第2のレベルのタイルに区分されてもよい。いくつかの例では、サブセットの外側の第1のレベルのタイルは、第1の解像度におけるピクチャデータを含んでよい。さらに、第2のレベルのタイルは、第1の解像度とは異なる第2の解像度におけるピクチャデータを含んでよい。いくつかの例では、第1のレベルのタイルのサブセットの中の各第1のレベルのタイルは、2つ以上の完全な第2のレベルのタイルを含んでよい。
ステップ1003において、第1のレベルのタイルおよび第2のレベルのタイルは、1つ以上のタイルグループに割り当てられる。割当ては、各タイルグループが、いくつかの第1のレベルのタイル、第2のレベルのタイルの各シーケンスが単一の第1のレベルのタイルから分割される第2のレベルのタイルの1つ以上の連続するシーケンス、またはそれらの組み合わせを含むように実行されてもよい。特定の例として、割当ては、単一の第1のレベルのタイルから作成されたすべての第2のレベルのタイルが、同じタイルグループに割り当てられるように実行されてもよい。いくつかの例では、1つ以上のタイルグループの各々は、割当て済みのタイルグループの中のすべてのタイルがピクチャの長方形部分をカバーするように制約されてもよい。
ステップ1005において、第1のレベルのタイルおよび第2のレベルのタイルは、ビットストリームの中に符号化される。たとえば、第1のレベルのタイルおよび第2のレベルのタイルは、走査順序に従って符号化されてもよい。特定の例では、走査順序に従って符号化することは、第1のレベルのタイルをラスタ走査順序で符号化することを含んでよい。第2のレベルのタイルのうちの1つに遭遇すると、第1のレベルのタイルのラスタ走査順序符号化が中断されてもよい。連続するすべての第2のレベルのタイルがラスタ走査順序で符号化されてから第1のレベルのタイルのラスタ走査順序符号化を継続してもよい。たとえば、現在の第1のレベルのタイルから区分されたすべての第2のレベルのタイルは、後続の第2のレベルのタイルから区分された任意の第2のレベルのタイルを符号化する前に符号化されてもよい。ステップ1007において、ビットストリームは、デコーダに向かう通信のために記憶されてもよい。
図11は、フレキシブルビデオタイリング方式800などのフレキシブルタイリング方式を採用することによって画像を復号する、例示的な方法1100のフローチャートである。方法1100は、方法100、メカニズム600、および/またはサポートするアプリケーション700を実行するとき、コーデックシステム200、デコーダ400、および/またはビデオコーディングデバイス900などの、デコーダによって採用されてもよい。さらに、方法1100は、エンコーダ300などのエンコーダからビットストリーム500を受信すると採用されてもよい。
デコーダが、たとえば、方法1000の結果として、ビデオシーケンスを表すコーディングされたデータのビットストリームを受信し始めると、方法1100が開始してもよい。ビットストリームは、複数の解像度でコーディングされたビデオシーケンスからのビデオデータを含んでよい。ステップ1101において、ビットストリームが受信される。ビットストリームは、複数の第1のレベルのタイルに区分されたピクチャを含む。第1のレベルのタイルのサブセットは、複数の第2のレベルのタイルにさらに区分されてもよい。いくつかの例では、サブセットの外側の第1のレベルのタイルは、第1の解像度におけるピクチャデータを含んでよい。さらに、第2のレベルのタイルは、第1の解像度とは異なる第2の解像度におけるピクチャデータを含んでよい。別の例では、第1のレベルのタイルのサブセットの中の各第1のレベルのタイルは、2つ以上の完全な第2のレベルのタイルを含んでよい。第1のレベルのタイルおよび第2のレベルのタイルは、1つ以上のタイルグループに割り当てられる。割当ては、各タイルグループが、いくつかの第1のレベルのタイル、第2のレベルのタイルの各シーケンスが単一の第1のレベルのタイルから分割される第2のレベルのタイルの1つ以上の連続するシーケンス、またはそれらの組み合わせを含むように実行されてもよい。特定の例として、割当ては、単一の第1のレベルのタイルから作成されたすべての第2のレベルのタイルが、同じタイルグループに割り当てられるように実行されてもよい。いくつかの例では、1つ以上のタイルグループの各々は、割当て済みのタイルグループの中のすべてのタイルがピクチャの長方形部分をカバーするように制約されてもよい。
ステップ1105において、第1のレベルのタイルおよび第2のレベルのタイルが、1つ以上のタイルグループに基づいて復号されてもよい。いくつかの例では、第1のレベルのタイルおよび第2のレベルのタイルは、走査順序に従って復号される。特定の例では、走査順序に従って復号することは、第1のレベルのタイルをラスタ走査順序で復号することを含んでよい。第2のレベルのタイルのうちの1つに遭遇すると、第1のレベルのタイルのラスタ走査順序符号化が中断されてもよい。連続するすべての第2のレベルのタイルが、次いで、ラスタ走査順序で符号化されてから、第1のレベルのタイルのラスタ走査順序復号を継続してもよい。たとえば、現在の第1のレベルのタイルから区分されたすべての第2のレベルのタイルは、後続の第2のレベルのタイルから区分された任意の第2のレベルのタイルを復号する前に復号されてもよい。
ステップ1107において、再構成ビデオシーケンスが、復号された第1のレベルのタイルおよび第2のレベルのタイルに基づいて表示のために生成されてもよい。
図12は、フレキシブルビデオタイリング方式800などのフレキシブルタイリング方式を採用することによってビデオシーケンスをコーディングするための、例示的なシステム1200の概略図である。システム1200は、コーデックシステム200、エンコーダ300、デコーダ400、および/またはビデオコーディングデバイス900などの、エンコーダおよびデコーダによって実施されてもよい。さらに、システム1200は、方法100、1000、1100、メカニズム600、および/またはアプリケーション700を実施するときに採用されてもよい。システム1200はまた、データをビットストリーム500などのビットストリームの中に符号化し、ユーザへの表示のためにそのようなビットストリームを復号してもよい。
システム1200はビデオエンコーダ1202を含む。ビデオエンコーダ1202は、ピクチャを複数の第1のレベルのタイルに区分し、かつ第1のレベルのタイルのサブセットを複数の第2のレベルのタイルに区分するための、区分モジュール1201を備える。ビデオエンコーダ1202は、単一の第1のレベルのタイルから作成されたすべての第2のレベルのタイルが、同じタイルグループに割り当てられるように、第1のレベルのタイルおよび第2のレベルのタイルを1つ以上のタイルグループに割り当てるための割当てモジュール1203をさらに備える。ビデオエンコーダ1202は、第1のレベルのタイルおよび第2のレベルのタイルをビットストリームの中に符号化するための符号化モジュール1205をさらに備える。ビデオエンコーダ1202は、デコーダに向かう通信のためにビットストリームを記憶するための記憶モジュール1207をさらに備える。ビデオエンコーダ1202は、デコーダに向かってビットストリームを送信するための送信モジュール1209をさらに備える。ビデオエンコーダ1202は、方法1000のステップのうちのいずれかを実行するようにさらに構成されてもよい。
システム1200はまた、ビデオデコーダ1210を含む。ビデオデコーダ1210は、複数の第1のレベルのタイルに区分されたピクチャを含むビットストリームを受信するための受信モジュール1211を備え、第1のレベルのタイルのサブセットは、複数の第2のレベルのタイルにさらに区分され、単一の第1のレベルのタイルから作成されたすべての第2のレベルのタイルが、同じタイルグループに割り当てられるように、第1のレベルのタイルおよび第2のレベルのタイルは1つ以上のタイルグループに割り当てられる。ビデオデコーダ1210は、1つ以上のタイルグループに基づいて第1のレベルのタイルおよび第2のレベルのタイルを復号するための復号モジュール1213をさらに備える。ビデオデコーダ1210は、復号された第1のレベルのタイルおよび第2のレベルのタイルに基づいて表示のために再構成ビデオシーケンスを生成するための生成モジュール1215をさらに備える。ビデオデコーダ1210は、方法1100のステップのうちのいずれかを実行するようにさらに構成されてもよい。
第1の構成要素と第2の構成要素との間にライン、トレース、または別の媒体を除いて介在する構成要素がないとき、第1の構成要素は第2の構成要素に直接結合される。第1の構成要素と第2の構成要素との間にライン、トレース、または別の媒体以外の介在する構成要素があるとき、第1の構成要素は第2の構成要素に間接的に結合される。「結合される(coupled)」という用語およびその変形は、直接結合されることと間接的に結合されることの両方を含む。「約(about)」という用語の使用は、別段に明記されていない限り後続の数の±10%を含む範囲を意味する。
本明細書に記載する例示的な方法のステップが、説明する順序で実行されることを必ずしも必要とされるとは限らないことも理解されたく、そのような方法のステップの順序は、単に例であるものと理解されるべきである。同様に、そのような方法の中に追加のステップが含められてよく、本開示の様々な実施形態と一致する方法の中で、いくつかのステップが除外されてよくまたは組み合わせられてよい。
本開示の中でいくつかの実施形態が提供されているが、開示するシステムおよび方法が、本開示の趣旨または範囲から逸脱することなく、多くの他の特定の形態で具現されてもよいことが理解されてもよい。本例は、限定的ではなく例示的と見なされるべきであり、その意図は、本明細書で与えられる詳細に限定されるべきでない。たとえば、様々な要素または構成要素が組み合わせられてよく、または別のシステムの中で統合されてよく、あるいはいくつかの特徴が除外されてよく、または実施されなくてよい。
加えて、様々な実施形態において個別または別個として説明および図示される技法、システム、サブシステム、および方法は、組み合わせられてよく、または本開示の範囲から逸脱することなく、他のシステム、構成要素、技法、もしくは方法と統合されてよい。変更、置換、および改変の他の例は、当業者によって確認可能であり、本明細書で開示する趣旨および範囲から逸脱することなく行われてよい。