前述したように、ビデオストリームのコーディングに関連する圧縮方式は、画像を複数のブロックに分割し、1つまたは複数の技術を使用してデジタルビデオ出力ビットストリームを生成して、出力に含まれる情報を制限することを含む。受信した符号化ビットストリームを復号化して、限られた情報からブロックとソース画像を再作成することができる。ビデオストリームまたはその一部(フレームやブロックなど)を符号化することは、ビデオストリームで時間的または空間的な類似性を使用して、コーディング効率を向上させることができる。例えば、ビデオストリームの現在のブロックは、以前にコーディングされたピクセル値と現在のブロック内のピクセル値との間の差(残差)を識別することに基づいて符号化され得る。この方法では、残差と、残差の生成に使用されるパラメータのみを符号化されたビットストリームに追加する必要がある。残差は、不可逆量子化ステップを使用して符号化され得る。
以下でさらに説明するように、残差ブロックはピクセル領域内にある。残差ブロックは、周波数領域に変換されて、変換係数の変換ブロックが得られる。変換係数は量子化され、その結果、量子化された変換係数の量子化された変換ブロックを得ることができる。量子化された係数は、エントロピー符号化され、かつ符号化されたビットストリームに付加される。復号化器は、符号化されたビットストリームを受信し、量子化された変換係数をエントロピー復号化して、元のビデオフレームを再構築することができる。
エントロピーコーディングは、符号化されたビデオビットストリームで発生する値の分布をモデル化する確率モデルに依存する「ロスレス」コーディングに関する手法である。測定または推定された値の分布に基づく確率モデルを使用することにより、エントロピーコーディングは、ビデオデータを表現するために必要なビット数を理論上の最小値に近くまで低減することができる。実際には、ビデオデータを表現するのに必要なビット数における実際の低減は、確率モデルの精度、符号化が実行されるビット数、およびコーディングを実行するために使用される固定小数点演算の計算精度の関数とすることができる。
符号化されたビデオビットストリームでは、ビットの多くは、コンテンツ予測(例えば、インターモード/動きベクトルコーディング、イントラ予測モードコーディングなど)または残差コーディング(例えば、変換係数)の2つのうちの一つに関して使用される。符号化器は、係数コーディングに費やされるビット数/ビット量を減少させる技術を使用することができる。例えば、係数トークンツリー(バイナリトークンツリーとも呼ばれ得る)は、このトークンツリーにおける各ブランチに関する前方適応確率により、値の範囲を指定する。トークンベースの値は、符号化される値から減算されて、残差が形成され、次いで、ブロックは固定確率を用いて符号化される。後方適応性を含むわずかなバリエーションを有する同様のスキームも可能である。適応技術は、ビデオストリームが符号化されるときに、データの特性の変化に適応するように確率モデルを変更することができる。いずれにしても、復号化器には、ビデオビットストリームを復号化するために、エントロピーコーディングされたビデオビットストリームを符号化するために使用された確率モデルが通知される(または利用可能となる)。
量子化された変換ブロックは、ゼロの量子化された変換係数および非ゼロの量子化された変換係数を含むことができる。非ゼロ係数は、本明細書では有意係数(significant coefficients)とも呼ばれる。量子化された変換ブロックの符号化および復号化は、スキャン順序に従って変換ブロックの変換係数を符号化および復号化することを含むことができる。量子化された変換ブロックを符号化および復号化することは、変換ブロック内の最後の非ゼロの量子化された変換係数(即ち、最後の有意係数)である有意係数に関する情報を符号化および復号化することを含むことができる。これは、ブロック終了(EOB)位置のコーディングとして参照される。どの変換係数が最後の非ゼロ変換係数として指定されるかは、スキャン順序に基づいて決定される。
いくつかのコーディングシステムでは、最後の非ゼロ係数のデカルト座標(即ち、量子化変換ブロック内の列および行)がコーディングされる。これは、本明細書では、EOB位置のコーディングに対するデカルト座標手法として参照される。
他のコーディングシステムにおいて、スキャン順序に従って各量子化された変換係数がアクセスされると(即ち、コーディングまたは復号化されるべく)、変換係数が最後の非ゼロ係数であるかどうかに関する情報がコーディングされる。このため、EOB位置は、有意係数位置とともにインターリービング方式でコーディングされる。これは、本明細書では、EOB位置のコーディングへのインターリービング手法として参照される。
以下でさらに説明するように、デカルト座標手法は、変換ブロックが密である場合により効率的になる。密な変換ブロックは、非ゼロ係数(即ち、有意係数)の数が比較的大きいようなものである。一方、変換ブロックが疎(sparse)である場合、インターリービング手法の方が効率的である。疎係数ブロックは、非ゼロ係数の数が比較的少ないブロックである。
本開示による実施形態は、デカルト座標手法およびインターリービング手法の利点を組み合わせて、EOB位置をコーディングすることにより、ビデオデータを表すのに必要なビット数を減少させることができる。本明細書の教示によるEOB位置のコーディングは、密変換ブロックおよび疎変換ブロックの両方に対して、(例えば、EOB位置をコーディングするのに必要なビットに関して)良好に実行することができる。
本開示による実施形態は、変換ブロックの変換係数を次元を有する座標系にマッピングする。次元の値の一部は、有意な(即ち、非ゼロの)変換係数を含む。例えば、デカルト座標系(以下で説明される)において、次元を列次元とすることができる。図10のブロック1050(変換ブロックである)を参照すると、次元値6(即ち、列インデックス6)は、有意係数、即ち、係数1052および係数1056を含み、一方、次元値3(即ち、列インデックス3)は、非ゼロ係数を含んでいない。有意係数を含む次元値について、次元値が最後の非ゼロ係数を含むか、または含んでいないかについて一度のみコーディングすることにより、EOB位置をコーディングするのに必要なビット数を減少させることができる。座標系の例は、デカルト座標系、極座標系、デカルトグループ化座標系、および係数グループ座標系を含む。本開示の実施形態によれば、他の座標系も可能である。本明細書で説明する座標系において、座標系に関して2つの次元が説明されている。しかしながら、座標系は3つ以上の次元を含むことができる。
前述したように、座標系はデカルト座標系にすることができ、次元は変換ブロックの列および行とすることができる。座標系は、DC係数(即ち、変換ブロックのブロック位置(0、0))を中心とすることができ、かつ中心からの距離を反対角線(anti-diagonal lines)を使用して測定することができる極座標系とすることができる。反対角線は第1の次元とすることができ、反対角線上の位置は第2の次元とすることができる。座標系は、変換係数が番号付きグループにグループ化されるようなグループ化システムであり、第1の次元はグループインデックス、第2の次元はグループ内の変換係数のオフセット位置である。他の座標系も可能である。
ビデオ圧縮における最後の有意係数フラグの改善されたコーディングが、本明細書では、教示が組み込まれ得るシステムを参照して最初に説明される。
図1は、ビデオ符号化および復号化システム100の概略図である。送信局102は、例えば、図2に記載されているようなハードウェアの内部構成を有するコンピュータとすることができる。しかしながら、送信局102の他の適切な実施形態も可能である。例えば、送信局102の処理を複数の装置に分散させることができる。
ネットワーク104は、ビデオストリームの符号化および復号化のために、送信局102および受信局106を接続することができる。具体的には、ビデオストリームを送信局102で符号化することができ、符号化されたビデオストリームを受信局106で復号化することができる。ネットワーク104は、例えば、インターネットであってもよい。ネットワーク104は、ローカルエリアネットワーク(LAN)、ワイドエリアネットワーク(WAN)、仮想プライベートネットワーク(VPN)、携帯電話ネットワーク、または送信局102から、この例では、受信局106にビデオストリームを転送する任意の他の手段とすることができる。
受信局106は、一例では、図2に記載されたようなハードウェアの内部構成を有するコンピュータとすることができる。しかしながら、受信局106の他の適切な実施形態も可能である。例えば、受信局106の処理を複数の装置に分散させることができる。
ビデオ符号化および復号化システム100の他の実施形態も可能である。例えば、実施形態はネットワーク104を省略することができる。別の実施形態では、ビデオストリームを符号化し、後で受信局106またはメモリを有する任意の他の装置に送信するために格納することができる。一実施形態では、受信局106は、符号化されたビデオストリームを(例えば、ネットワーク104、コンピュータバス、および/または何らかの通信経路を介して)受信し、後の復号化のためにビデオストリームを記憶する。一実施形態では、ネットワーク104を介して符号化されたビデオを伝送するためにリアルタイム転送プロトコル(RTP:real-time transport protocol)が使用される。別の実施形態では、例えば、ハイパーテキスト転送プロトコル(HTTP:Hypertext Transfer Protocol)ベースのビデオストリーミングプロトコルなどのRTP以外の転送プロトコルが使用されてもよい。
ビデオ会議システムで使用される場合、例えば、送信局102および/または受信局106は、以下に説明するように、ビデオストリームを符号化および復号化する能力を含むことができる。例えば、受信局106は、ビデオ会議サーバ(例えば、送信局102)から符号化されたビデオビットストリームを受信して復号化および視聴し、さらにそのビデオビットストリームを他の参加者による復号化および視聴のために符号化してビデオ会議サーバに送信するビデオ会議参加者とし得る。
図2は、送信局または受信局を実施することができるコンピューティングデバイス200の一例のブロック図である。例えば、コンピューティングデバイス200は、図1の送信局102および受信局106の一方または両方を実施することができる。コンピューティングデバイス200は、複数のコンピューティングデバイスを含むコンピューティングシステムの形態、または例えば、携帯電話、タブレットコンピュータ、ラップトップコンピュータ、ノートブックコンピュータ、デスクトップコンピュータなどの単一のコンピューティングデバイスの形態とすることができる。
コンピューティングデバイス200内のCPU202は、中央処理装置とすることができる。代替的に、CPU202は、現在存在するか、または今後開発される、情報を操作または処理することができる任意の他のタイプのデバイスまたは複数のデバイスであってもよい。開示された実施態様は、図示のような単一のプロセッサ、例えばCPU202で実施することができるが、複数のプロセッサを使用して速度と効率の利点を達成することができる。
コンピューティングデバイス200内のメモリ204は、実施形態では読み出し専用メモリ(ROM)デバイスまたはランダムアクセスメモリ(RAM)デバイスであってもよい。任意の他の適切なタイプの記憶装置をメモリ204として使用することができる。メモリ204は、CPU202がバス212を使用してアクセスするコードおよびデータ206を含むことができる。メモリ204は、オペレーティングシステム208およびアプリケーションプログラム210をさらに含むことができ、アプリケーションプログラム210は、本明細書に記載された方法をCPU202が実行するのを可能にする少なくとも1つのプログラムを含む。例えば、アプリケーションプログラム210は、アプリケーション1~Nを含むことができ、アプリケーション1~Nは、本明細書で説明する方法を実行するビデオコーディングアプリケーションをさらに含む。コンピューティングデバイス200はまた、例えば、モバイルであるコンピューティングデバイス200と共に使用されるメモリカードとすることができる二次ストレージ214を含むことができる。ビデオ通信セッションは、かなりの量の情報を含み得るので、それらは、二次ストレージ214に全体的または部分的に記憶され、処理のために必要に応じてメモリ204にロードされる。
コンピューティングデバイス200は、ディスプレイ218などの1つまたは複数の出力デバイスを含むこともできる。ディスプレイ218は、一例では、ディスプレイを、タッチ入力を感知するように動作可能なタッチセンシティブエレメントと組み合わせたタッチセンシティブディスプレイであってもよい。ディスプレイ218は、バス212を介してCPU202に接続することができる。ユーザがコンピューティングデバイス200をプログラムするかまたは他の方法で使用することを可能にする他の出力デバイスが、ディスプレイ218に加えて、またはディスプレイ218に代えて設けられてもよい。出力デバイスがディスプレイであるか、またはディスプレイを含む場合、ディスプレイは、液晶ディスプレイ(LCD)、陰極線管(CRT)ディスプレイ、または有機LED(OLED)ディスプレイなどの発光ダイオード(LED)ディスプレイを含む様々な方法で実施することができる。
コンピューティングデバイス200は、コンピューティングデバイス200を操作するユーザの画像等の画像を検出することができる、例えば、カメラなどの撮像デバイス220、または現在または将来開発される任意の他の撮像デバイス220を含むか、または撮像デバイス220と通信することができる。撮像デバイス220は、コンピューティングデバイス200を操作するユーザの方に向けられるように配置することができる。一例では、撮像デバイス220の位置および光軸は、視野が、ディスプレイ218に直接隣接する領域であって、その領域からディスプレイ218が視認可能な領域を含むように構成することができる。
コンピューティングデバイス200は、コンピューティングデバイス200の近くの音を感知することができる、例えば、マイクロホンなどの音声感知デバイス222、または現在または今後開発される任意の他の音声感知デバイスを含むか、または音声感知デバイス222と通信することができる。音声感知デバイス222は、コンピューティングデバイス200を操作するユーザの方に向けられ、かつユーザがコンピューティングデバイス200を操作している間にユーザによって発せられた例えば音声、他の発話を受信するように構成することができる。
図2は、コンピューティングデバイス200のCPU202およびメモリ204が単一のユニットに統合されていることを示しているが、他の構成を利用することもできる。CPU202の動作は、直接的にまたはローカルエリアネットワークまたは他のネットワークを介して接続することができる複数のマシン(各マシンは1つまたは複数のプロセッサを有する)にわたって分散させることができる。メモリ204は、ネットワークベースのメモリのような複数のマシンに分散されるか、またはコンピューティングデバイス200の動作を実行する複数のマシンにおけるメモリとすることができる。本明細書では単一のバスとして示されているが、コンピューティングデバイス200のバス212は、複数のバスから構成することができる。さらに、二次ストレージ214は、コンピューティングデバイス200の他の構成要素に直接接続されるか、またはネットワークを介してアクセスされ、かつメモリカードなどの単一の統合されたユニットまたは複数のメモリカードなどの複数のユニットを含むことができる。従って、コンピューティングデバイス200は、多種多様な構成で実施することができる。
図3は、符号化され、続いて復号化されるビデオストリーム300の一例の図である。ビデオストリーム300は、ビデオシーケンス302を含む。次のステージでは、ビデオシーケンス302はいくつかの隣接フレーム304を含む。3つのフレームが隣接フレーム304として示されているが、ビデオシーケンス302は任意の数の隣接フレーム304を含むことができる。隣接フレーム304はさらに、個々のフレーム、例えば、フレーム306に細分化することができる。次のステージでは、フレーム306は、一連のセグメント308またはプレーンに分割することができる。セグメント308は、例えば、並列処理を可能にするフレームのサブセットとすることができる。セグメント308は、ビデオデータを別々の色に分離することができるフレームのサブセットとすることができる。例えば、カラービデオデータのフレーム306は、輝度プレーン(luminance plane)および2つの色度プレーン(chrominance plane)を含むことができる。セグメント308は、異なる解像度でサンプリングすることができる。
フレーム306がセグメント308に分割されているか否かにかかわらず、フレーム306は、さらに、フレーム306内の例えば16×16画素に対応するデータを含むことができるブロック310に細分化されてもよい。ブロック310は、1つまたは複数のセグメント308の画素データからのデータを含むように構成される。ブロック310は、4x4画素、8x8画素、16x8画素、8x16画素、16x16画素、またはそれ以上等の任意の他の適切なサイズであってもよい。
図4は、本開示の実施形態による符号化器400のブロック図である。符号化器400は、例えば、メモリ204などのメモリに格納されたコンピュータソフトウェアプログラムを提供するなどして、上述のように送信局102内で実施することができる。コンピュータソフトウェアプログラムは、CPU202等のプロセッサよる実行時に、送信局102に本明細書で説明した方法でビデオデータを符号化させる機械命令を含むことができる。符号化器400は、例えば、送信局102に含まれる専用のハードウェアとして実施することもできる。符号化器400は、ビデオストリーム300を入力として使用してフォワードパス(実線の接続線で示す)において様々な機能を実行して、符号化または圧縮されたビットストリーム420を生成するイントラ予測/インター予測ステージ402、変換ステージ404、量子化ステージ406、およびエントロピー符号化ステージ408を有する。符号化器400は、将来のブロックの符号化のためのフレームを再構成する再構成パス(点線の接続線で示す)をも含む。図4において、符号化器400は、再構成パスにおいて様々な機能を実行する以下のステージ、逆量子化ステージ410、逆変換ステージ412、再構成ステージ414、およびループフィルタリングステージ416を有する。符号化器400の他の構成的な変形例を使用して、ビデオストリーム300を符号化することができる。
ビデオストリーム300が符号化のために提示されるとき、フレーム306はブロックの単位で処理され得る。イントラ予測/インター予測ステージ402において、ブロックは、イントラフレーム予測(イントラ予測とも呼ばれる)またはインターフレーム予測(インター予測とも呼ばれる)、または両方の組み合わせを用いて符号化することができる。いずれの場合でも、予測ブロックを形成することができる。イントラ予測の場合、予測ブロックの全部または一部が、以前に符号化され、かつ再構成された現在のフレーム内のサンプルから形成され得る。インター予測の場合、予測ブロックの全部または一部は、動きベクトルを使用して決定された1つまたは複数の以前に構築された参照フレーム内のサンプルから形成され得る。
次に、引き続き図4を参照して、イントラ予測/インター予測ステージ402において予測ブロックが現在のブロックから減算され、残差ブロック(残差とも呼ばれる)が生成される。変換ステージ404は、ブロックベースの変換を使用して、残差を、例えば周波数領域の変換係数に変換する。このようなブロックベースの変換は、例えば、離散コサイン変換(DCT:Discrete Cosine Transform)および非対称離散サイン変換(ADST:Asymmetric Discrete Sine Transform)を含む。他のブロックベースの変換も可能である。さらに、異なる変換の組み合わせを単一の残差に適用することができる。変換の適用の一例では、DCTは残差ブロックを、変換係数値が空間周波数に基づく周波数領域に変換する。行列の左上の最低周波数(DC)係数、および行列の右下の最高周波数係数。予測ブロックのサイズ、従って結果の残差ブロックは、変換ブロックのサイズと異なり得ることは注目に値する。例えば、予測ブロックは、別々の変換が適用される小さなブロックに分割され得る。
量子化ステージ406は、量子化値または量子化レベルを使用して、変換係数を量子化された変換係数と呼ばれる離散量子値に変換する。例えば、変換係数は、量子化値で除算され、切り捨てられてもよい。次に、量子化された変換係数は、エントロピー符号化ステージ408によってエントロピー符号化される。エントロピーコーディングは、トークンツリーおよびバイナリツリーを含む任意の数の技術を使用して実行されてもよい。例えば、使用される予測のタイプ、変換タイプ、動きベクトルおよび量子化値を含み得る、ブロックを復号化するために使用される他の情報とともに、エントロピー符号化された係数は、圧縮されたビットストリーム420に出力される。ブロックを復号化するための情報は、圧縮ビットストリーム420内のブロック、フレーム、スライス、および/またはセクションヘッダにエントロピーコーディングされ得る。圧縮されたビットストリーム420は、符号化されたビデオストリームまたは符号化されたビデオビットストリームとも称され、これらの用語は本明細書では互換的に使用される。
符号化器400および復号化器500(以下に説明する)の両方が、圧縮されたビットストリーム420を復号化するために同じ参照フレームを使用することを確実にするために、図4における再構成パス(点線の接続線で示す)が使用される。再構成パスは、逆量子化ステージ410で量子化された変換係数を逆量子化すること、および逆変換ステージ412で逆量子化された変換係数を逆変換して微分残差ブロック(微分残差とも称される)を生成することを含む以下により詳細に説明される復号化プロセス中に行われる機能と同様の機能を実行する。再構成ステージ414において、イントラ予測/インター予測ステージ402で予測された予測ブロックを微分残差に加えて、再構成されたブロックが作成される。ブロック化アーチファクトなどの歪みを低減するために、ループフィルタリングステージ416が再構成されたブロックに適用される。
符号化器400の他の変形例を使用して圧縮されたビットストリーム420を符号化することができる。例えば、非変換ベースの符号化器400は、あるブロックまたはフレームに関して変換ステージ404を使用せずに残差信号を直接量子化することができる。別の実施形態では、符号化器400は、量子化ステージ406と逆量子化ステージ410とを組み合わせて単一のステージにすることができる。
図5は、本開示の実施形態による復号化器500のブロック図である。復号化器500は、例えば、メモリ204に格納されたコンピュータソフトウェアプログラムを提供することによって、受信局106で実施することができる。コンピュータソフトウェアプログラムは、CPU202などのプロセッサによる実行時に、受信局106に、図8および9において以下のように説明した方法でビデオデータを復号化させる機械命令を含む。復号化器500は、例えば、送信局102または受信局106に含まれるハードウェアで実施することもできる。復号化器500は、上述の符号化器400の再構成パスと同様に、一例では、様々な機能を実行して圧縮されたビットストリーム420から出力ビデオストリーム516を生成するための以下のステージ、エントロピー復号化ステージ502、逆量子化ステージ504、逆変換ステージ506、イントラ予測/インター予測ステージ508、再構成ステージ510、ループフィルタリングステージ512、およびデブロッキングフィルタリングステージ514を含む。圧縮されたビットストリーム420を復号化するために復号化器500の他の構造的な変形例を使用することができる。
圧縮されたビットストリーム420が復号化のために提示されると、圧縮されたビットストリーム420内のデータ要素が、エントロピー復号化ステージ502によって復号化されて、一組の量子化された変換係数が生成される。逆量子化ステージ504は、(例えば、量子化された変換係数に量子化値を乗算することにより)量子化された変換係数を逆量子化し、逆変換ステージ506は、選択された変換タイプを使用して逆量子化された変換係数を逆変換して、符号化器400における逆変換ステージ412によって生成されたものと同一である微分残差を生成する。圧縮されたビットストリーム420から復号化されたヘッダ情報を使用して、復号化器500は、イントラ予測/インター予測ステージ508を用いて、例えばイントラ予測/インター予測ステージ402において符号化器400で生成されたのと同じ予測ブロックを作成する。再構成ステージ510において、予測ブロックを微分残差に加えて再構成ブロックが作成される。ループフィルタリングステージ512は、ブロッキングアーチファクトを低減するために再構成されたブロックに適用される。再構成されたブロックに他のフィルタリングを適用することができる。一例では、ブロッキング歪を低減するためにデブロッキングフィルタリングステージ514が再構成ブロックに適用され、その結果が出力ビデオストリーム516として出力される。出力ビデオストリーム516は、復号化されたビデオストリームとも呼ばれ、用語は本明細書では互換的に使用される。
復号化器500の他の変形例を使用して、圧縮されたビットストリーム420を復号化することができる。例えば、復号化器500は、デブロッキングフィルタリングステージ514を用いずに出力ビデオストリーム516を生成することができる。復号化器500のいくつかの実施形態では、デブロッキングフィルタリングステージ514は、ループフィルタリングステージ512の前に適用される。追加的または代替的に、符号化器400は、ループフィルタリングステージ416に加えて、デブロッキングフィルタリングステージを含む。
図6は、本開示の実施形態による量子化された変換係数を示す図600である。図600は、現在のブロック620、スキャン順序602、量子化された変換ブロック604、非ゼロマップ606、ブロック終了(end-of-block)マップ622、およびサインマップ626を示している。現在のブロック620は、4x4ブロックとして図示されている。しかしながら、任意のブロックサイズが可能である。例えば、現在のブロックは、4x4、8x8、16x8、8×16、32x32のサイズ(即ち、寸法)、または任意の他の正方形または長方形のブロックサイズを有することができる。現在のブロック620は、現在のフレームのブロックとすることができる。別の例では、現在のフレームは、ブロックの集合を含むセグメント(図3のセグメント308など)、タイル、または同様のものに分割されてもよく、現在のブロックは、パーティションのブロックである。
量子化された変換ブロック604は、現在のブロック620のサイズに類似したサイズのブロックであり得る。量子化された変換ブロック604は、非ゼロ係数(例えば、係数608)およびゼロ係数(例えば、係数610)を含む。上述したように、量子化された変換ブロック604は、現在のブロック620に対応する残差ブロックに関する量子化された変換係数を含む。また、上述したように、量子化された変換係数は、図4のエントロピーコーディングステージ408などのエントロピーコーディングフェーズによってエントロピーコーディングされる。
量子化された変換係数をエントロピーコーディングすることは、図7に関して以下に説明するように、2値化された変換係数の2値シンボルをコーディングするための条件付き確率の推定値を提供するコンテキストモデル(確率コンテキストモデル、確率モデル、モデル、およびコンテキストとも呼ばれる)の選択を含むことができる。量子化された変換係数をエントロピーコーディングする場合、追加情報が、コンテキストモデルを選択するためのコンテキストとして使用され得る。例えば、以前に符号化された変換係数の大きさは、確率モデルを決定するために少なくとも部分的に使用することができる。
変換ブロックを符号化するために、ビデオコーディングシステムは、スキャン順序で変換ブロックをトラバースし(traverse)、量子化された変換係数が個々にトラバースされる(即ち、アクセスされる)ときに、量子化された変換係数を符号化(例えば、エントロピー符号化)し得る。スキャン順序602などのジグザグスキャン順序では、変換ブロックの左上隅(DC係数とも呼ばれる)が最初にトラバースされて符号化され、スキャン順序の次の係数(即ち、「1」とラベル付けされた位置に対応する変換係数)がトラバースされて符号化される。ジグザグスキャン順序(即ち、スキャン順序602)では、現在の量子化された変換係数(例えば、符号化されるべき変換係数)の上方でかつ左側のいくつかの量子化された変換係数が最初にトラバースされる。他のスキャン順序も可能である。量子化された変換係数の1次元構造(例えば、配列)は、スキャン順序を使用して2次元の量子化された変換ブロックをトラバースすることによって生じたものとすることができる。
量子化された変換ブロック604を符号化することは、量子化された変換ブロック604のどの量子化された変換係数がゼロであり、どれが非ゼロであるかを示す非ゼロマップ606を決定することを含むことができる。非ゼロ係数およびゼロ係数は、非ゼロマップにおいて値1および値ゼロ(0)によりそれぞれ示すことができる。例えば、非ゼロマップ606は、係数608に対応するデカルト位置(0、0)における非ゼロ607と、係数610に対応するデカルト位置(2、0)におけるゼロ608とを含む。
量子化された変換ブロック604を符号化することは、ブロック終了マップ622を生成すること、およびブロック終了マップ622を符号化することを含むことができる。ブロック終了マップは、量子化された変換ブロック604の非ゼロの量子化された変換係数が、任意のスキャン順序に関して最後の非ゼロ係数であるかどうかを示す。非ゼロ係数が変換ブロックにおける最後の非ゼロ係数でない場合、そのことは、ブロック終了マップにおいてバイナリビット0(ゼロ)によって示すことができる。一方、非ゼロ係数が変換ブロックにおける最後の非ゼロ係数である場合、ブロック終了マップにおいてバイナリ値1によって示すことができる。例えば、スキャン位置11に対応する量子化された変換係数(即ち、最後の非ゼロの量子化された変換係数628)は、量子化された変換ブロック604の最後の非ゼロ係数であるため、それは、1のブロック終了値624によって示され、他のすべての非ゼロの変換係数は、ゼロによって示される。
量子化された変換ブロック604を符号化することは、サインマップ626を生成すること、およびサインマップ626を符号化することを含むことができる。サインマップ626は、量子化された変換ブロック604のどの非ゼロの量子化された変換係数が正の値を有し、どの非ゼロの量子化された変換係数が負の値を有するかを示す。ゼロの変換係数は、サインマップで示される必要はない。サインマップ626は、量子化された変換ブロック604に関するサインマップを示している。サインマップ626では、負の量子化された変換係数をゼロ(0)で示し、正の量子化された変換係数を1で示すことができる。
上述したように、いくつかのコーディングシステムが、インターリービング手法を使用して、最後の非ゼロの量子化された変換係数628のEOB位置を符号化および/または復号化することができる。インターリービング手法の一例を次に示す。
インターリービング手法では、フラグ(例えば、シンタックス要素(syntax element)sig_coef_flagなど)を使用して、符号化または復号化されている係数が有意であるか否かを示すことができる。変換係数に関して、シンタックス要素sig_coef_flagは、変換係数がゼロであるか、または非ゼロであるかという質問に答える。例えば、シンタックス要素sig_coef_flagがゼロ(0)である場合、現在の変換係数はゼロであり、sig_coef_flagが1の場合、現在の変換係数は非ゼロである。
インターリービング手法では、別のフラグは、スキャン順序602などのスキャン順序が与えられたときに、コーディングされている(即ち、符号化または復号化されている)係数が変換ブロックの最後の有意フラグであるかどうかを示すフラグは、last_sig_flagと呼ばれるシンタックス要素とすることができる。非ゼロの変換係数に関して、シンタックス要素last_sig_flagは、変換係数が最後の非ゼロ係数であるかという質問に答える。ゼロ(0)の値は、変換係数が最後の非ゼロ係数ではないことを示し、1の値は、変換係数が最後の非ゼロ係数であることを示す。シンタックス要素last_sig_flagは、変換ブロックの有意係数ごとに符号化および復号化することができる。
従って、現在の係数が非ゼロであることを示すシンタックス要素sig_coef_flag(即ち、値が1のsig_coef_flag)が符号化または復号化される場合、対応するシンタックス要素last_sig_flagは、現在の非ゼロ係数が現在のブロックにおける最後の有意係数である(例えば、last_sig_flag=1)か否か(例えば、last_sig_flag=0)を示す。従って、設定されたフラグlast_sig_flag(例えば、last_sig_flag=1)が符号化または復号化されると、現在のブロックのEOB位置が決定される。
NxN変換ブロックにおいてEOB位置をコーディングするためのインターリービング手法は、次のように要約することができる。
ステップ1において、スキャン位置iをゼロに初期化する(i=0)。スキャン位置iは、スキャン順序位置に対応する。ステップ2において、スキャン順序位置iにおけるシンタックス要素sig_coef_flagを符号化/復号化する。ステップ3において、シンタックス要素sig_coef_flagが設定されているかどうかを決定し(例えば、sig_coef_flag=1)、設定されている場合、スキャン順序位置iにおけるシンタックス要素last_sig_flagを符号化/復号化する。ステップ4において、iを増加する(i=i+1)。次に、EOBの位置が符号化/復号化される(即ち、last_sig_flag=1)か、ブロックの最後に到達する(即ち、iが値N*Nに到達する)まで、ステップ2~4を繰り返す。ステップ3において、ブロック終了に到達した場合(即ち、i=N*N-1)、位置iにおけるシンタックス要素last_sig_flagは符号化/復号化されない。このような場合、変換ブロックの最後の係数(即ち、最後のスキャン順序位置における変換係数)は、EOBであると想定される。
上記のスキームの変形例では、シンタックス要素last_sig_flagは、現在のブロック内の現在の位置にあるものを含む残りのすべての係数がゼロであることを示すeob_flagによって置き換えることができる。その場合、シンタックス要素eob_flagは、セットsig_coef_flagの直後にコーディング(符号化/復号化)される。即ち、sig_coef_flagが位置iにおいて設定されている場合、eobフラグは位置i+1においてコーディングされる。
図7に関して、インターリービング手法を使用するコーディングシステムの別の例を示す。図7の例では、係数バイナリツリーが使用される。
図7は、本開示の実施形態による、変換ブロックをエントロピーコーディングするために使用することができる係数トークンツリー700の図である。係数トークンツリー700は、ツリーの各ノードにおいて、2つのブランチのうちの1つを取る(即ち、トラバースする)必要があるため、バイナリツリーと呼ばれる。係数トークンツリー700は、AおよびBとラベル付けされたノードにそれぞれ対応するルートノード701およびノード703を含む。
図6に関して上述したように、ブロックに関してブロック終了(EOB)トークンが検出されると、現在のブロックの係数のコーディングは終了し、ブロックにおける残りの係数はゼロであると推測される。このため、EOB位置のコーディングは、ビデオコーディングシステムにおける係数の重要な部分になる。
係数トークンツリー700を使用して、量子化された変換ブロック(例えば、図6の量子化された変換ブロック604)の量子化された係数(例えば、図6の係数608、610)に対して2進数列が生成される。
一例では、N×Nブロック(例えば、量子化された変換ブロック604)内の量子化された係数は、所定のスキャン順序(例えば、図6のスキャン順序602)に従って1D(一次元)配列(ここでは、配列u)に編成される。Nは、4、8、16、32、または任意のその他の値にすることができる。1D配列のi番目の位置における量子化された係数は、u[i]として参照される。ここで、i=0,…,N*N-1である。u[i],…,u[N*N-1]における最後の連続のゼロの開始位置は、eobとして表すことができる。1D配列の最後の位置(即ち、u[N*N-1])がゼロでない場合、eobは、値N*Nに設定することができる。即ち、1D配列uの最後の係数がゼロでない場合、eobは、1D配列の最後の位置に設定することができる(即ち、eobは、値N*Nに設定される)。図6の例を使用すると、1D配列uは次のエントリu[]=[-6、0、-1、0、2、4、1、0、0、1、0、-1、0、0、0、0]を有することができる。u[i]の各々における値は、量子化された変換係数である。本明細書では、1D配列uの量子化された変換係数は、単に「係数」または「変換係数」と呼ぶこともある。位置i=0における係数(即ち、u[0]=-6)は、DC係数に対応している。図6の例では、1D配列uの位置12におけるゼロ係数の後に非ゼロ係数がないため、eobは、12に等しくなる。
i=0~N*N-1に関する係数u[i],…,u[N*N-1]を符号化および復号化するために、トークンt[i]が各位置i<=eobにおいて生成される。i<eobに関して、トークンt[i]は、u[i]における対応する量子化された変換係数のサイズおよび/またはサイズ範囲を示すことができる。eobにおいて量子化された変換係数に関するトークンは、EOB_TOKENとすることができる。EOB_TOKENは、1D配列uがeob位置に続く非ゼロ係数が(包含的に)含まれないことを示すトークンである。即ち、t[eob]=EOB_TOKENは、現在のブロックのEOB位置を示す。以下の表Iは、EOB_TOKENを除くトークン値の例、および本開示の実施形態によるそれらの値と対応する名前のリストを提供する。
一例では、量子化された係数値は、符号付き12ビット整数であると見なされる。量子化された係数値を表すために、12ビットの符号付き値の範囲を11個のトークン(表Iのトークン0-10)とブロック終了トークン(EOB_TOKEN)に分割することができる。トークンを生成して量子化された係数値を表すために、係数トークンツリー700をトラバースすることができる。ツリーをトラバースした結果(即ち、ビット列)は、図4のエントロピー符号化ステージ408に関して説明した符号化器によってビットストリーム(図4のビットストリーム420など)に符号化することができる。
係数トークンツリー700は、EOB_TOKEN(トークン702)、ZERO_TOKEN(トークン704)、ONE_TOKEN(トークン706)、TWO_TOKEN(トークン708)、THREE_TOKEN(トークン710)、FOUR_TOKEN(トークン712)、CAT1(表IのDCT_VAL_CAT1であるトークン714)、CAT2(表IのDCT_VAL_CAT2であるトークン716)、CAT3(表IのDCT_VAL_CAT3であるトークン718)、CAT4(表IのDCT_VAL_CAT4であるトークン720)、CAT5(表IのDCT_VAL_CAT5であるトークン722)、およびCAT6(表IのDCT_VAL_CAT6であるトークン724)のトークンを含む。上記から分かるように、係数トークンツリーは、単一の量子化された係数値を、トークン704、706、708、710、および712のうちの1つなどの単一のトークンにマッピングする。トークン714、716、718、720、722、および724などの他のトークンは、量子化された係数値の範囲を表す。例えば、37の値を有する量子化された変換係数は、トークンDCT_VAL_CAT5(図7のトークン722)によって表すことができる。
トークンに関するベース値は、その範囲の最小値として定義される。例えば、トークン720のベース値は19である。エントロピーコーディングは、各量子化された係数に関するトークンを識別し、トークンが範囲を表す場合、量子化された係数からベース値を減算することにより残差を形成することができる。例えば、20の値を有する量子化された変換係数は、復号化器が元の量子化された変換係数を再構築可能となるように、トークン720に含まれることによって、符号化されたビデオビットストリームにおいて1(即ち、20マイナス19)の残差値によって表される。ブロック終了のトークン(即ち、トークン702)は、変換されたブロックデータにおいてさらに非ゼロの量子化された係数が残っていないことを通知する。
(図4のエントロピー符号化ステージ408によるなど)バイナリ算術符号化エンジンを使用することによりトークンt[i]を符号化または復号化するために、係数トークンツリー700を使用することができる。係数トークンツリー700は、ルートノード701(即ち、Aとラベル付けされたノード)から開始してトラバースされる。係数トークンツリーをトラバースすることにより、例えば、バイナリ算術コーディングを使用してビットストリームに符号化されるビット列(符号語)が生成される。ビット列は、現在の係数(即ち、符号化されている量子化された変換係数)の表現である。
現在の係数がゼロであり、残りの変換係数に非ゼロの値が存在しない場合、トークン702(即ち、EOB_TOKEN)がビットストリームに追加される。これは、例えば、図6のスキャン順序の位置11における変換係数の場合である。一方、現在の係数が非ゼロの場合、または現在のブロックの残りの係数に非ゼロの値がある場合、「1」ビットが符号語に追加され、トラバースがノード703(即ち、Bとラベル付けされたノード)に移る。ノードBでは、現在の係数がテストされて、現在の係数がゼロに等しいかどうかが確認される。現在の係数がゼロに等しい場合、左側のブランチが取られて、値ZERO_TOKENおよびビット「0」を表すトークン704が符号語に追加される。現在の係数がゼロに等しくない場合、ビット「1」が符号語に追加され、トラバースがノードCを通過する。ノードCにおいて、現在の係数が1より大きいかどうかを確認するためにテストされる。現在の係数が1に等しい場合、左側のブランチが取られて、値ONE_TOKENを表すトークン706がビットストリームに追加される(即ち、「0」ビットが符号語に追加される)。現在の係数が1より大きい場合、トラバースはノードDに移って、現在の係数の値を値4と比較してチェックする。現在の係数が4以下の場合、トラバースはノードEに移り、「0」ビットが符号語に追加される。ノードEにおいて、値「2」と等しいかどうかのテストが行われ得る。真の場合、値「2」を表すトークン706がビットストリームに追加される(即ち、ビット「0」が符号語に追加される)。真でない場合、ノードFにおいて、現在の係数が値「3」または値「4」のいずれであるか、ビットストリームに対して適宜トークン710(即ち、ビット「0」が符号語に追加される)またはトークン712(即ち、ビット「1」が符号語に追加される)のいずれであるか等々がテストされる。
基本的に、左の子ノードへのトラバース時に「0」ビットが符号語に追加され、右の子ノードへのトラバース時に符号語に「1」ビットが追加される。圧縮されたビットストリームから符号語を復号化するときに、復号化器によって同様のプロセスが実行される。復号化器はビットストリームからビットを読み取る。ビットが「1」の場合、係数トークンツリーは右にトラバースされ、ビットが「0」の場合、ツリーは左にトラバースされる。復号化器は次のビットを読み取り、ツリーのトラバースがリーフノード(即ち、トークン)に到達するまでプロセスを繰り返す。一例として、トークンt[i]=THREE_TOKENを符号化するには、ルートノード(即ち、ルートノード701)から開始して、111010のバイナリ列が符号化される。別の例として、符号語11100を復号化すると、トークンTWO_TOKENが生成される。
左および右の子ノードへの「0」ビットと「1」ビットとの間の対応は、符号化および復号化のプロセスを記述するために使用される規則に過ぎないことに留意されたい。いくつかの実施形態では、例えば、「1」が左の子ノードに対応し、「0」が右の子ノードに対応する規則など、異なる規則を使用することができる。符号化器および復号化器の両方が同じ規則を導入している限り、本明細書で説明するプロセスが適用される。
EOB_TOKENは非ゼロ係数の後でのみ可能であるため、u[i-1]がゼロである場合(即ち、1D配列uの位置i-1における量子化された変換係数がゼロに等しい場合)、復号化器は、最初のビットが1でなければならないことを推測することができる。ツリーをトラバースする際に、ゼロ変換係数(例えば、図6のジグザグスキャン順序の位置1における変換係数)に続く変換係数(例えば、図6のジグザグスキャン順序の位置2の変換係数)に関して、トラバースは必ずルートノード701からノード703に移動するので、最初のビットは1でなければならない。
このため、バイナリフラグcheckEobを使用して、係数トークンツリー700におけるルートノードから開始される最初のビットの符号化および復号化をスキップするように符号化器および復号化器に指示することができる。実際には、バイナリフラグcheckEobが0(即ち、ルートノードがチェックされるべきではないことを示す)である場合、係数トークンツリー700のルートノード701はスキップされ、ノード703はトラバースのためにアクセスされる係数トークンツリー700の最初のノードとなる。即ち、ルートノード701がスキップされると、符号化器は符号化をスキップすることができ、復号化器は復号化をスキップして、符号化列の最初のビット(即ち、バイナリビット「1」)を推測することができる。
ブロックの符号化または復号化の開始時に、バイナリフラグcheckEobを1に初期化することができる(即ち、ルートノードをチェックする必要があることを示す)。以下のステップは、NxNブロック内の量子化された変換係数を復号化するプロセスの一例を示す。
ステップ1において、バイナリフラグcheckEobがゼロ(即ち、checkEob=0)に設定され、インデックスもゼロ(即ち、i=0)に設定される。
ステップ2で、トークンt[i]は、
1)バイナリフラグcheckEobが1に等しい場合は全係数トークンツリー(即ち、係数トークンツリー700のルートノード701から開始する)を使用するか、または
2)checkEobが0に等しい場合はEOB_TOKENがスキップされる部分ツリー(例えば、ノード703から開始する)を使用するかのいずれかによって復号化される。
ステップ3において、トークンt[i]=EOB_TOKENである場合、量子化された変換係数u[i],....,u[N*N-1]が全て0に設定され、復号化処理を終了する。それ以外の場合、必要に応じて(即ち、t[i]がZERO_TOKENと等しくない場合)追加ビットが復号化されて、u[i]を再構築することができる。
ステップ4において、u[i]がゼロに等しい場合、バイナリフラグcheckEobが1に設定され、それ以外の場合、checkEobが0に設定される。即ち、checkEobは、値(u[i]!=0)に設定することができる。
ステップ5において、インデックスiがインクリメントされる(即ち、i=i+1)。
ステップ6において、量子化された変換係数がすべて復号化されるまで(即ち、インデックスi=N*Nまで)、またはEOB_TOKENが復号化されるまで、ステップ2~5が繰り返される。
上記のステップ2において、トークンt[i]を復号化することは、コンテキストctxを決定するステップと、コンテキストctxからバイナリ確率分布(即ち、モデル)を決定するステップと、決定された確率分布を使用することにより、ブール演算コード(Boolean arithmetic code)を使用して係数トークンツリー700のルートノードからリーフノードへのパスを復号化するステップを含むことができる。コンテキストctxは、コンテキスト導出の方法を使用して決定することができる。コンテキスト導出の方法は、ブロックサイズ、プレーンタイプ(即ち、輝度または色度)、位置i、および以前に復号化されたトークンt[0],…,t[i-1]のうちの1つまたは複数を使用して、コンテキストctxを決定することができる。他の基準を使用して、コンテキストctxを決定することができる。バイナリ確率分布は、checkEOB=1の場合はルートノード701から、checkEOB=0の場合はノード703から開始する、係数トークンツリー700の任意の内部ノードに関して決定することができる。
いくつかの符号化システムでは、コンテキストctxが与えられたときに、トークンt[i]を符号化または復号化するために使用される確率は、固定され、かつ画像(即ち、フレーム)に適応していなくてもよい。例えば、確率は、任意のコンテキストctxに対して定義されたデフォルト値であり得るか、または確率は、そのフレームに関するフレームヘッダの一部としてコーディング(即ち、通知)され得る。フレームをコーディングする際に、すべてのコンテキストに関する確率をコーディングすることは、コストがかかる。このため、符号化器は、各コンテキストに関して、フレームヘッダでコンテキストに関連する確率をコーディングし、バイナリフラグを使用して復号化器にその決定を通知することが有益かどうかを分析し得る。さらに、コンテキストに関する確率をコーディングすることは、(例えば、ビットレートにおける)コストを低減するために、予測を使用し得る。予測は、以前に復号化されたフレーム内の同じコンテキストの確率から導出され得る。いくつかの符号化システムでは、コンテキストctxが与えられたときの確率は、新たなシンボルが復号化または符号化されるときに、ピクチャ(即ち、フレーム)において適応させることができる。様々な適応方法を使用することができる。適応方法の例は、ラプラス(Laplace)推定器、クリチェフスキー-トロフィモフ(Krichevsky-Trofimov)推定器、グッドチューリング(Good-Turing)推定器、IIR(無限インパルス応答)フィルターベースの推定器、および有限状態マシンベースの推定器を含む。
図8は、本開示の実施形態による、EOB位置をバイナリ化するためのツリー800の例の図である。ツリー800は、EOB位置をコーディングするデカルト座標手法を実施するコーディングシステムによって使用することができる。デカルト座標手法では、EOB位置をブロック位置としてコーディングすることができる。従って、上記のインターリービング手法とは異なり、EOB位置のコーディングはスキャン順序に依存しない。現在のブロックのサイズはNxNであるため、現在のブロックのスキャン順序に従って、最後の有意係数は、ブロック位置(eob_x,eob_y)にあり、eob_xは列番号を示し、eob_yは行番号を示す。例えば、図6を参照すると、最後の非ゼロの量子化された変換係数628は、ブロック位置(2、2)にある。インターリービング手法では、EOBブロック位置(eob_x,eob_y)が特定されると、列番号eob_x及び行番号eob_yのコーディングは、コーディングプロセスの他の態様に関して使用される任意のスキャン順序とは無関係である。
ツリー800は、バイナリ化、コンテキストモデリング、および量子化された変換係数の符号化および復号化のためのバイナリ算術コーディングのステップを使用するビデオコーディングシステムによって使用することができる。このプロセスは、コンテキスト適応型バイナリ算術コーディング(CABAC:context-adaptive binary arithmetic coding)として参照され得る。例えば、量子化された変換係数xを符号化するために、コーディングシステムは以下のステップを実行し得る。量子化された変換係数xは、図6の量子化された変換ブロック604の任意の係数(例えば、係数608)とすることができる。
以下のステップは、列番号eob_xおよび行番号eob_yの両方に対して同様に実行される。説明を簡略化するために、列番号eob_xに関するステップのみを説明する。
バイナリ化ステップでは、ツリー800を使用して、EOB係数の列番号eob_xがバイナリ列に最初にバイナリ化される。バイナリツリー800がトラバースされて、列番号eob_xに対応するバイナリ列プレフィックスを生成する。例えば、列番号eob_xが3の場合、バイナリツリー800をトラバースすることにより生成されるプレフィックスは、ノード802に対応する1110である。別の例として、列番号eob_xが4または5の場合、生成されるプレフィックスはノード804に対応する11110である。ノード804の場合、列番号eob_xが4(即ち、0のサフィックス)または5(即ち、1のサフィックス)であるかどうかを示すためにサフィックスも生成される。従って、列番号eob_xが4の場合、バイナリ列111100がコーディングされ、列番号eob_xが5の場合、バイナリ列111101がコーディングされる。
コンテキスト導出ステップでは、コーディングされるべき各ビンに対して、コンテキストが導出される。コンテキストは、ブロックサイズ、プレーンタイプ(即ち、輝度または色度)、係数xのブロック位置、および以前に復号化された係数(例えば、可能な場合、左方および/または上方に隣接する(neighboring)係数)の1つまたは複数などの情報から導出することができる。その他の情報、より多くの情報、またはより少ない情報を使用して、コンテキストを導出することができる。
バイナリ算術コーディングステップでは、コンテキストが与えられると、例えば、バイナリ算術コーディングエンジンを使用することにより、ビンは、コンテキストに関連付けられた確率値とともにバイナリ符号語にコーディングされる。
上記したように、デカルト座標手法とインターリービング手法は、EOB位置のコーディングに関して異なる手法を使用する。デカルト座標手法は、ブロック位置(eob_x,eob_y)を直接コーディングする。インターリービング手法は、(係数が有意係数であるかどうかを示す)sig_flag_codingを用いて、(有意係数が最後の有意係数であるかどうかを示す)last_sig_flagのコーディングをインターリーブする。
変換ブロックが非ゼロ係数が比較的少ない疎である場合、インターリービング手法がより効率的である。例えば、変換ブロックが、ブロック位置(4、5)において1つの非ゼロ係数のみを含んでいる場合、インターリービング手法は、1つのlast_sig_flagを正確に符号化および復号化する。一方、デカルト座標手法は、12個のビンを符号化および復号化する(即ち、バイナリ決定)。12個のビンは、上記の図8に関して説明したように、バイナリ列111100(即ち、eob_x=4)および111101(即ち、eob_y=5)の符号化に対応する。
一方、ブロックが比較的多数の非ゼロ係数を含む場合、デカルト座標手法がより効率的である。例えば、最大の場合(即ち、ブロックの全ての係数がゼロでない場合)では、16x16ブロックに関して、インターリービング手法を使用してコーディングされるlast_sig_flagsの数は255である。一方、デカルト座標手法を使用することにより、16x16ブロック内のeob位置に対してコーディングされるビンの数は、ブロック位置(15、14)または(14、15)に対応するビンの数となる。上記したように、EOBが(15、15)にある場合、last_sig_flagをコーディングする必要がないことに留意されたい。値14および15は、ツリー800を使用して、プレフィックス列11111110およびサフィックス10および11、またはバイナリ列1111111010および1111111011にそれぞれバイナリ化される。これにより、合計20個のビンがコーディングされる。このため、最大の場合において、デカルト座標手法は、インターリービング手法よりも計算的に処理量は少ない。
図9は、本開示の実施形態による、係数の変換ブロックの最後の非ゼロ係数の位置を符号化するプロセス900のフローチャート図である。プロセス900は、スキャン順序に従って変換ブロックの係数を符号化することができる。代替的に、プロセス900は、変換ブロックの係数を符号化する別のプロセスによって呼び出されるか、または別のプロセスに埋め込まれることができる。プロセス900は、EOB位置に関する情報を符号化する。
プロセス900は、図4の符号化器400などの符号化器で実施することができる。プロセス900は、例えば、送信局102などのコンピューティングデバイスによって実行することができるソフトウェアプログラムとして実施することができる。ソフトウェアプログラムは、メモリ204または二次ストレージ214などのメモリに格納された機械可読命令であって、CPU202のようなプロセッサにより実行されて、コンピューティングデバイスにプロセス900を実行させる機械可読命令を含むことができる。少なくともいくつかの実施形態では、プロセス900は、図4の符号化器400のエントロピー符号化ステージ408によって全体的または部分的に実行される。
プロセス900は、図10を参照して説明される。図10は、本開示の実施形態によるスキャン順序1000およびブロック1050の一例である。ブロック1050は、量子化された変換係数のブロックである。
スキャン順序1000は、図6のスキャン順序602に関して説明したとおりである。例えば、スキャンインデックス1002は、ブロック1050の係数1052(即ち、位置(6、0)における係数)が、スキャンインデックス値21にあることを示し、スキャンインデックス1004は、ブロック1050の係数1054(即ち、位置(2、2)における係数)が、スキャンインデックス値12にあることを示し、スキャンインデックス1006は、ブロック1050の係数1056(即ち、位置(6、2)における係数)が、スキャンインデックス値37にあることを示す。係数1056は、スキャン順序1000が与えられたときのブロック1050の最後の非ゼロ係数である。即ち、スキャンインデックス1006に対応する係数(即ち、スキャンインデックス値37)は、最後の非ゼロ係数である。
902において、プロセス900は、最後の非ゼロ係数の位置を決定する。本開示で使用される「決定する」とは、何らかの方法で選択する、構築する、決定する、指定する、識別する、受信する、または任意の方法において他の決定を行うことを意味する。最後の非ゼロ係数の位置は、上記したブロック位置(eob_x,eob_y)に関して説明したとおりである。このため、位置は列値を含む(例えば、EOB係数の列番号を示すeob_x)。位置は行値を含む(例えば、EOB係数の行番号を示すeob_y)。本明細書では、列値と列番号は同じ意味で使用される。行値と行番号は同じ意味で使用される。
一例において、プロセス900は、スキャン順序(例えば、スキャン順序1000)に従ってブロック(例えば、ブロック1050)の係数をスキャンして、最後の非ゼロ係数を決定することができる。最後の非ゼロ係数が特定されると、最後の非ゼロ係数の位置が決定される。別の例では、プロセス900は、別のモジュール、コーディングステージ、プロセスなどから位置を受信することにより、最後の非ゼロ係数の位置を決定することができる。
904において、プロセス900は、係数の変換ブロックの非ゼロ係数を符号化する。非ゼロ係数は、変換ブロックの係数列と係数行において存在する。一例では、プロセス900は、非ゼロ係数を符号化せずに、係数列および係数行を単に受信し得る。「受信する」とは、生成する、決定する、または何らかの方法で受信することを意味することができる。例えば、係数(例えば、スキャン順序値23における係数)が符号化された後または符号化される前に、プロセス900は、係数列(即ち、4)および係数行(即ち、2)を受信する。
906において(図11のシーケンス1118~1126に関して以下にさらに説明する)、非ゼロ係数が係数列において符号化されるべき最初の非ゼロ係数であるとの決定に応答して、プロセス900は、係数列が最後の非ゼロ係数の列値に等しいかどうかを符号化する。908において(図11のブロック1118に関して以下にさらに説明する)、非ゼロ係数が係数列において符号化されるべき最初の非ゼロ係数ではないとの決定に応答して、プロセス900は、係数列が最後の非ゼロ係数の列値に等しいかどうかの符号化をスキップする。
910において(図11のシーケンス1128~1136に関して以下にさらに説明する)、非ゼロ係数が係数行において符号化されるべき最初の非ゼロ係数であるとの決定に応答して、プロセス900は、係数行が最後の非ゼロ係数の行値に等しいかどうかを符号化する。912において(図11のブロック1128に関して以下にさらに説明する)、非ゼロ係数が係数行において符号化されるべき最初の非ゼロ係数ではないとの決定に応答して、プロセス900は、係数行が最後の非ゼロ係数の行値に等しいかどうかの符号化をスキップする。
プロセス900の一例では、係数の変換ブロックは、イントラ予測を使用して予測された残差ブロックの変換ブロックである。即ち、プロセス900は、イントラ予測ブロックでは使用することができるが、インター予測ブロックでは使用することができない。一例では、係数の変換ブロックは、輝度カラー成分のブロックの変換ブロックである。即ち、プロセスは、輝度ブロックには使用することができるが、色度には使用することができない。一例では、プロセス900は、あるブロックサイズで使用できるが、他のブロックサイズでは使用することができない。例えば、プロセス900は、サイズが4x4の変換ブロックに使用することができるが、それより大きいサイズの変換ブロックに使用することができない。
図9に示すような最後の有意係数フラグのコーディングを改良した他の実施形態が利用可能である。実施形態では、最後の有意係数フラグのコーディングを改良した付加要素を追加したり、特定の要素を組み合わせたり、かつ/または特定の要素を削除したりすることができる。
図11は、本開示の一実施形態による、デカルト座標系を使用して、係数の変換ブロックの最後の非ゼロ係数の位置を符号化するプロセス1100のフローチャート図である。プロセス1100は、非ゼロ変換係数を含む列が最後の非ゼロ係数を含む列であるかどうかを一度のみコーディング(即ち、符号化または復号化)する。プロセス1100は、非ゼロ変換係数を含む行が最後の非ゼロ係数を含む行であるかどうかを一度のみコーディング(即ち、符号化または復号化)する。プロセス1100は、スキャン順序に従って変換ブロックの係数をコーディングするプロセスによって、またはそれと組み合わせて使用することができる。
プロセス1100のデカルト座標系は、変換ブロックのDC係数において原点を有することができる。デカルト座標系の次元は、行および列である。変換ブロックの変換係数は、行値および列値に沿って配置される。例えば、変換ブロック1050において、行は行値0~7を有し、列は値0~7を有する。係数1054は、列値2および行値2において存在する。最後の非ゼロ係数(例えば、図10の係数1056)の位置は、列値(例えば、列値6)および行値(例えば、行値2)を含む。上記したように、最後の非ゼロ係数は、スキャン順序に関して決定することができる。即ち、変換ブロック1050の係数がスキャン順序1000に従ってスキャンされる場合、係数1056は、最後の非ゼロ係数である。例えば、スキャン順序1000以外のスキャン順序が使用される場合、異なる係数(即ち、係数1056以外)が、最後の非ゼロ係数として識別されてもよい。
プロセス1100は、図4の符号化器400などの符号化器で実施することができる。プロセス1100は、例えば、送信局102などのコンピューティングデバイスによって実行することができるソフトウェアプログラムとして実施することができる。ソフトウェアプログラムは、メモリ204または二次ストレージ214などのメモリに格納された機械可読命令であって、CPU202のようなプロセッサにより実行されて、コンピューティングデバイスにプロセス1100を実行させる機械可読命令を含むことができる。少なくともいくつかの実施形態では、プロセス1100は、図4の符号化器400のエントロピー符号化ステージ408によって全体的または部分的に実行される。
プロセス1100は、図5の復号化器500などの復号化器において実施することができる。プロセス1100は、例えば、受信局106などのコンピューティングデバイスによって実行することができるソフトウェアプログラムとして実施することができる。ソフトウェアプログラムは、メモリ204または二次ストレージ214などのメモリに格納された機械可読命令であって、CPU202のようなプロセッサにより実行されて、コンピューティングデバイスにプロセス1100を実行させる機械可読命令を含むことができる。少なくともいくつかの実施形態では、プロセス1100は、図5の復号化器500のエントロピー復号化ステージ502によって全体的または部分的に実行することができる。
符号化器によって実施される場合、「コーディング」は、図4の圧縮ビットストリーム420などの符号化されたビットストリームにおける符号化を意味する。復号化器によって実施される場合、「コーディング」とは、図5の圧縮ビットストリーム420などの符号化されたビットストリームからの復号化を意味する。
以下の説明では、サイズN×Nのブロック(例えば、変換ブロック1050)が想定されている。しかしながら、ブロックは、サイズMxN(MとNは等しくない)の長方形ブロックとすることもできる。一次元配列uは、図6に関連して説明したとおりである。従って、u[i]は、任意のスキャン順序(例えば、図10のスキャン順序1000)に従うi番目のスキャン位置における変換係数を示す。例えば、u[21](即ち、スキャン位置21における係数の値(即ち、スキャンインデックス1002))は、係数値-1(即ち、係数1052)である。
スキャンインデックス(即ち、スキャン順序1000の値)に関して、アレイスキャンは、ブロック1050における対応する列番号および行番号を提供することができる。このため、scan[i]は、スキャン位置iからブロック位置へのマッピングを示す。ブロック位置は、係数の列番号および行番号を含むタプルとすることができる(即ち、(ci、ri),ciは列番号または列値を示し、riは行番号または行値を示す)。例えば、scan[37]は、タプル(6、2)を提供することができる。スキャンインデックスからブロック位置へのマッピングは、スキャンアレイ以外の手段によって提供することができる。例えば、スキャンインデックスを入力として受け取る機能(または、同様のもの)は、ブロックの位置を提供(例えば、返送)することができる。
タプル(eob_c、eob_r)は、任意のスキャン順序に従う現在のブロック内の最後の有意係数のブロック位置(即ち、列値および行値)を示す。このため、図10を参照すると、(eob_c、eob_r)は、タプル(6、2)によって与えられる。
1102において、プロセス1100は、行セットRを空のセットに初期化し、列セットCを空のセットに初期化する。行セットRは、プロセス1100によって既にアクセスされた行(即ち、行値)の軌跡を保持する。列セットCは、プロセス1100によって既にアクセスされた列(即ち、列値)の軌跡を保持する。この状況において、アクセス済み行とは、現在の非ゼロ係数が任意のスキャン順序でアクセスされるときに、現在の非ゼロ係数と同じ行にある別の非ゼロ係数が既に決定されていることを意味する。この状況において、アクセス済み列とは、現在の非ゼロ係数が任意のスキャン順序でアクセスされるときに、現在の非ゼロ係数と同じ列にある別の非ゼロ係数が既に決定されていることを意味する。例えば、スキャン順序1000において、スキャンインデックス1010(即ち、スキャンインデックス値3)が処理される(即ち、係数1060に対応する)ときに、行0がアクセスされていたと決定される(即ち、行セットRが行0を含む)。その理由は、別の非ゼロ係数(即ち、スキャンインデックス1008に対応する係数1058)が既に同じ行(即ち、行0)にあると決定されており、係数1058および1060は両方とも同じ行0にあり、かつ、係数1058は、スキャン順序において係数1060の前に処理されるからである。
1104において、スキャン位置iがゼロに初期化され、フラグEOB_C_FOUNDおよびEOB_R_FOUNDは、偽(即ち、値ゼロ)に設定される。スキャン位置iは、1次元配列uのインデックスとして使用される。フラグEOB_C_FOUNDは、ブロック終了係数と同じ列にある変換係数が処理された(即ち、スキャン順序に従ってアクセスされた)かどうかを示す。フラグEOB_R_FOUNDは、ブロック終了係数と同じ行にある変換係数が処理されたかどうかを示す。
1106において、プロセス1100は、スキャンインデックスu[i]に対応する係数がゼロ係数であるか、または非ゼロ係数であるかを符号化して、sig[i]を設定することができる。sigデータ構造(例えば、配列、フラグなど)は、スキャンインデックスiにおける係数がゼロか否かを示す。この例では、非ゼロ係数は、1の値で示される(即ち、sig[i]=1)。しかしながら、他の値も可能である。上記したように、符号化器において実施する場合、スキャンインデックスu[i]に対応する係数がゼロであるか又は非ゼロであるかをコーディングすることは、係数がゼロであるか又は非ゼロであるか示すシンタックス要素(例えば、0または1ビット)を符号化されたビットストリームに出力することを意味する。復号化器において実施する場合、スキャンインデックスu[i]に対応する係数がゼロであるか又は非ゼロであるかをコーディングすることは、係数がゼロであるか又は非ゼロであるかを示すシンタックス要素(例えば、0または1ビット)を符号化されたビットストリームから読み取ることを意味する。
1108において、係数が非ゼロ係数でない場合(即ち、sig[i]=1)、プロセス1100は1110に進み、それ以外の場合、プロセス1100は1116に進む。換言すれば、スキャンインデックスiにおける係数がゼロである場合、プロセス1100は、1110において次の係数を処理するかどうかを決定し、それ以外の場合、プロセス1100は現在の係数をさらに処理する。
1110において、変換ブロックのすべての係数が処理された場合(即ち、スキャン位置i=N*N-1)、または現在の係数がブロック終了係数である場合(即ち、ci=eob_cおよびri=eob_r)、プロセス1100は終了し、それ以外の場合、プロセスは1112に続く。1112において、プロセス1100は、スキャン位置iをインクリメントして次の係数を処理する。
1116において、プロセス1100は、スキャン位置iにおける変換係数の列値(即ち、ci)および行値(即ち、ri)を決定する。列値および行値は、上記したアレイスキャンを使用して決定することができる。このため、1116において、タプル(ci、ri)が決定される。1117において、プロセス1100は、シーケンス1118~1126およびシーケンス1128~1136によって与えられる2つのブランチを処理する。一例では、2つのブランチを順番に処理することができる。別の例では、2つのブランチを並列に処理することができる。
1118において、最後の非ゼロ係数の列がまだ発見されておらず(即ち、EOB_C_FOUND=0)、かつ現在の係数の列(即ち、列値ci)がまだアクセスされていない場合(即ち、列値ciが列セットCに含まれていない場合)、プロセス1100は1120に進み、それ以外の場合、シーケンス1118~1126はスキップされる。
1120において、プロセス1100は、フラグLAST_EOB_C_FLAGをコーディングすることができる。フラグLAST_EOB_C_FLAGは、現在の非ゼロ係数の列が最後の非ゼロ係数の列であるかどうかを示す。例えば、符号化器によって実施される場合、プロセス1100は値ci=eob_cを符号化することができる。このため、ブール値ci=eob_cに対応するビットを符号化することができる。復号化器において実施される場合、プロセス1100は、フラグLAST_EOB_C_FLAGを設定することができるシンタックス要素を復号化することができる。現在の係数の列が最後の非ゼロ係数の列と同じでない場合、ゼロ(0)をコーディングでき、それ以外の場合、1がコーディングされる。説明を繰り返すと、前述したように、符号化器によって実施される場合、コーディングとは、符号化されたビットストリームに符号化することを意味し、復号化器によって実施される場合、コーディングとは、符号化されたビットストリームから復号化することを意味する。
1122において、列値ciがアクセスされたことを示すために、列値ciが列セットCに追加されて、列値ciを有する別の非ゼロ変換係数がアクセスされると/された場合、プロセス1100はシーケンス1118~1126をスキップすることができ、その結果、(1120において)列値ciがブロックの最後の非ゼロ変換係数を含むかどうかを示す別の値をコーディングすることをスキップすることができる。
1124において、列値ciが最後の非ゼロ係数の列値に等しい場合(即ち、ci=eob_cである場合、または同等に、LAST_EOB_C_FLAG=1である場合)、プロセス1100は、(1126において)フラグEOB_C_FOUNDを真(例えば、EOB_C_FOUND=1)に設定する。復号化器によって実施される場合、プロセス1100は、1126において、列値ciが最後の非ゼロ係数の列値(即ち、eob_c)であることを記録することもできる。プロセス1100は、次に、1117の2つのブランチが完了すると、1110に進む。
シーケンス1128~1136において、プロセス1100は、ブランチ1118~1136のステップと同様のステップを実行する。ブロック1128は、EOB_C_FOUND、列値ci、および列セットCの代わりに、EOB_R_FOUND、行値ri、および行セットRがそれぞれ使用されることを除いて、ブロック1118と同じとすることができる。ブロック1130は、LAST_EOB_C_FLAGをコーディングする代わりに、プロセス1100が、現在の非ゼロ係数の行が最後の非ゼロ係数の行であるかどうかを示すLAST_EOB_R_FLAGをコーディングすることを除いて、ブロック1120と同じとすることができる。ブロック1132は、列セットCおよび列値ciの代わりに、行セットRおよび行値riが使用されることを除いて、ブロック1122と同じとすることができる。ブロック1134は、列値ciをeob_cと比較する代わりに、行値riが最後の非ゼロ係数eob_rの行値と比較されることを除いて、ブロック1124と同じとすることができる。ブロック1136は、EOB_C_FOUNDフラグを設定する代わりにEOB_R_FOUNDフラグが設定され、復号化器によって実施される場合、プロセス1100は、行値riが最後の非ゼロ係数(即ち、eob_r)の行値であることを記録することができる点を除いて、ブロック1126と同じとすることができる。
プロセス1100は、次のように代替的に記述することができる。
ステップ1:2つの空のセットRおよびCを初期化する。さらに、i=0、EOB_C_FOUND=0、EOB_R_FOUND=0を初期化する。
ステップ2:(u[i]!=0)、即ち、スキャン位置iにおけるsignificent_coef_flag sig[i]符号化または復号化する。
ステップ3:sig[i]=1の場合、(ci,ri)=scan[i]を決定し、以下を実行する。
a.EOB_C_FOUND=0の場合、およびci\∈Cの場合、(eobc=ci)であるか否かを示すLAST_EOB_C_FLAGを符号化または復号化して、C=C∪{ci}を設定する。eobcがciと等しい場合(即ち、LAST_EOB_C_FLAG=1)、EOB_C_FOUND=1に設定し、eobcを(復号化器において)記録する。
b.EOB_R_FOUND=0の場合、およびri\∈Rの場合、(eobr=ri)であるか否かを示すLAST_EOB_R_FLAGを符号化または復号化して、R=R∪{ri}を設定する。eobrがriと等しい場合(即ち、LAST_EOB_R_FLAG=1)、EOB_R_FOUND=1に設定し、eobrを(復号化器において)記録する。
ステップ4:iを1だけインクリメントする。
ステップ5:次の2つの条件のいずれかが満たされるまで、ステップ2~4を繰り返す。
I=N*N、または
eobc=ci-1、およびeobr=ri-1の両方。
以下の表1は、プロセス1100のブランチ1117による、スキャン順序1000に従うブロック1050の非ゼロ係数の処理の結果を示している。上記したように、スキャン順序1000が与えられたときの、最後の非ゼロ係数は、係数1056である。
スキャン順序1000を使用すると、1次元配列uは、値u[0-37]={8,2,3,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,-1,2,1,0,0,0,0,0,0,0,0,0,1,1,0,0,1}を含む。値u[0-37]は、最後の非ゼロ係数(即ち、係数1056)までの、および最後の非ゼロ係数(即ち、係数1056)を含むu配列のサブセットである。値u[0-37]は、11個の非ゼロ係数を含む。表1から分かるように、LAST_EOB_C_FLAGは4回コーディングされ、LAST_EOB_R_FLAGは4回コーディングされている。対照的に、インターリービング手法を実施するシステムは、非ゼロ係数が最後の非ゼロ係数であるかどうかについて11回コーディングする。デカルト座標手法を実施するシステムは、コンテキストベースのコーディングを使用して、1111100の7個のビン(即ち、列値6)および110の3個のビン(即ち、行値2)をコーディングする。
一実施形態では、プロセス1100は、列セットCがN-2個の要素を含む場合(即ち、列セットCの基数|C|がN-1に等しい場合)、1120においてフラグLAST_EOB_C_FLAGのコーディングをスキップすることができる。列セットCがN-1個の要素を含み、プロセス1100がブロック1120にある場合、それは、列セットCにおけるN-1個の列値のいずれも最後の非ゼロ係数を含まない場合でなければならない。スキャン順序によっては、列セットCにおける列インデックスが必ずしも順番に追加されるとは限らない。即ち、スキャン順序によっては、小さいインデックスの前に大きいインデックスが追加される場合がある。さらに、プロセス1100は1120にあるため、それは、列値ciが少なくとも1つの非ゼロ係数を含んでいる場合でなければならない(ブロック1108においてsig[i]=1であるため)。このため、列セットCの外側にある最後の残りの列でもある現在の列は、ブロックの最後の非ゼロ係数を含んでいると推測することができる。このため、LAST_EOB_C_FLAGのコーディングをスキップすることができる。同様に、プロセス1100は、行セットRがN-1個の要素を含む場合(即ち、行セットRの基数|R|がN-1に等しい場合)、1130においてフラグLAST_EOB_R_FLAGのコーディングをスキップすることができる。
NxNブロックのすべての係数が非ゼロ係数である場合、本開示による実施形態は、N-1個のLAST_EOB_C_FLAG(即ち、列ごとに1つのフラグ)およびN-1個のLAST_EOB_R_FLAG(即ち、行ごとに1つのフラグ)をコーディング(符号化および/または復号化)する。対照的に、インターリービング手法は、N*N-1個のLAST_SIG_FLAG(即ち、非ゼロ係数ごとに1つのフラグ)をコーディングする。デカルト座標手法は、N=4の場合は6個のビン(列値と行値の各々に対して3個のビン)、N=8の場合は12個のビン、N=16の場合は18個のビン、N=32の場合は24個のビンをコーディングする。以下の表2は、Nの様々な値に対する最大処理量(即ち、値の数)をまとめたものである。
表2に示すように、本開示による実施形態は、NxNブロック内で符号化および復号化される最大数のビンにおいて測定される最大処理量に関して、インターリービング手法を改善することができる。
上述したように、表2は、最大処理量において、本開示による実施形態とインターリービング手法との間の差異が、ブロックサイズが増加するにつれて増大することを示している。さらに、上述したように、インターリービング手法は、疎な変換ブロックに対してより効果的に機能する。このため、本開示による実施形態は、符号化手法(即ち、本明細書で開示される手法とインターリービング手法との間)を選択的に選択することができる。例えば、小さなブロック(例えば、4x4ブロック)の場合、インターリービング手法を使用して、eob位置をコーディング(即ち、符号化および/または復号化)することができ、本明細書で開示する手法は、より大きなブロック(例えば、8x8ブロック以上)に対して使用することができる。別の例では、使用する手法の選択は、色成分に依存することができる。例えば、本明細書で開示される手法は、輝度ブロックに使用することができ、デカルト座標手法またはインターリービング手法は、色度ブロック(通常は疎である)に使用することができる。さらに別の例では、選択は、ピクチャタイプおよび/またはコーディングモードに依存することができる。例えば、本明細書で開示される手法は、イントラコーディングされたブロックに使用することができ、デカルト座標手法またはインターリービング手法は、インターコーディングされたブロックに使用することができる。別の例では、選択は、選択をデータ自体に適応させる、以前に復号化されたブロックからの統計に依存することができる。さらなる例では、選択は、画像/フレームヘッダで通知することができ、画像/フレーム内のブロックについては、それらのブロックに関して通知された選択を使用することができる。
図12は、本開示の一実施形態による、デカルトグループ化座標系を使用して、係数の変換ブロックの最後の非ゼロ係数の位置をコーディングするプロセス1200のフローチャート図である。デカルトグループ化座標系では、変換ブロックの列値は列グループにグループ化され、変換ブロックの行値は行グループにグループ化される。プロセス1200は、列値のグループ内で、列値およびインデックスを含む列グループを示すことによって、最後の非ゼロ係数の列値をコーディングすることができる。プロセス1200は、非ゼロ変換係数を含む列グループが非ゼロ変換係数を含むかどうかをコーディングする。
プロセス1200は、プロセス1100の態様を共有することができる。プロセス1100のブロックとして番号付けされたプロセス1200におけるブロックに関する説明は省略する。
一例では、プロセス1200は、変換ブロックが比較的多数の非ゼロ変換係数を含む場合に使用することができる。即ち、プロセス1200は、変換ブロックが密であるときに使用することができる。一例では、ブロック内の非ゼロ変換係数の数が所定のしきい値を超えると、変換ブロックの最後の非ゼロ係数の位置をコーディングするためにプロセス1200を実行することができ、それ以外の場合、プロセス1100、または本明細書で開示される別のプロセスを実行することができる。代替的に、実施形態は、プロセス1100および1200を組み込み得る。従って、非ゼロ変換係数の数が所定のしきい値を超えると、プロセス1200の固有の態様を実行でき、それ以外の場合、プロセス1100の固有の態様を実行することができる。
プロセス1200は、密な変換ブロックの場合にプロセス1100よりもコーディングの改善を提供することができる。プロセス1200は、(上記した)最大処理量に関してデカルト座標手法の性能に一致するか、または近づくことができる。
列グループおよび行グループを説明するために、サイズNxNのブロックの場合、Pが番号{0、…、N-1}からグループ番号{0、1、…、G-1}へのマッピングを示すものとする。ここで、Gは、グループの数である。一例では、列値に対して第1のマッピングを定義し、行値に対して第2のマッピングを定義することができる。N≦32の例では、マッピングPは、以下のように与えられる。
P(i)=i i<4の場合
P(i)=4 4≦i<6の場合
P(i)=5 6≦i<8の場合
P(i)=6 8≦i<12の場合
P(i)=7 12≦i<16の場合
P(i)=8 16≦i<24の場合
P(i)=9 24≦i<32の場合
上記のマッピングを使用して、列値15(即ち、12≦i<16)を列グループ番号7(即ち、P(15)=7)にマッピングすることができ、行値3(即ち、i<4)を行グループ番号3(即ち、P(3)=3)にマッピングすることができる。より多くのグループまたはより少ないグループを利用することができる。グループの数は、ブロックサイズによって異なる。N=64の例では、上記のマッピングは、以下のものを含むように拡張することができる。
P(i)=10 32≦i<48の場合
P(i)=11 48≦i<64の場合
上記のマッピングを使用すると、図10の係数1056は、列グループ番号5にマップされ、かつ列グループ番号5内の0番目の列にある。列グループ番号5は、ブロック1050の列6および7を含む。様々なマッピングが利用可能である。マッピングが異なると、クロック終了係数に関連するシンタックス要素がコーディングされる回数に関して、最大処理量が異なることとなる可能性がある。
プロセス1200とプロセス1100との間の違いについて説明する。図12には示されていないが、プロセス1200は、最後の非ゼロ係数の列グループeobcおよび行グループeobrを決定することができる。
1202において、プロセス1200は、列グループセットCを空のセットに初期化し、行グループセットRを空のセットに初期化する。
列グループセットCは、プロセス1200が既にアクセスした列グループの軌跡を保持する。この状況において、アクセス済み列グループとは、現在の非ゼロ係数が任意のスキャン順序でアクセスされるときに、現在の非ゼロ係数と同じ列グループにある別の非ゼロ係数が既に決定されていることを意味する。例えば、スキャン順序1000において、(即ち、ブロック位置(4、2)の係数値1に対応する)スキャンインデックス値23が処理されるときに、列グループ番号4がアクセスされていたと決定される(即ち、列グループセットCが列グループ番号4を含む)。その理由は、別の非ゼロ係数(即ち、スキャンインデックス値22に対応するブロック位置(5、1)における係数)が既に同じ列グループ(即ち、列グループ4)にあると決定されているためである。
行グループセットRは、プロセス1200が既にアクセスした行グループの軌跡を保持する。この状況において、アクセス済み行グループとは、現在の非ゼロ係数が任意のスキャン順序でアクセスされるときに、現在の非ゼロ係数と同じ行グループにある別の非ゼロ係数が既に決定されていることを意味する。
図12のブロック1116の後、プロセス1200は1217に進む。1217において、プロセス1200は、シーケンス1218~1227およびシーケンス1228~1237によって与えられる2つのブランチを処理する。一例では、2つのブランチを順番に処理することができる。別の例では、2つのブランチを並列に処理することができる。
1218において、最後の非ゼロ係数の列グループがまだ発見されておらず(即ち、EOB_C_FOUND=0)、かつ現在の係数の列値を含む列グループ(即ち、列グループP(ci))がまだアクセスされていない場合(即ち、列グループ値P(ci)が列グループセットCに含まれていない場合)、プロセス1200は1120に進む。それ以外の場合、シーケンス1220~1127はスキップされる。
1220において、プロセス1200はフラグLAST_EOB_C_FLAGをコーディングすることができる。フラグLAST_EOB_C_FLAGは、現在の非ゼロ係数の列グループが最後の非ゼロ係数を含む列グループであるかどうかを示す。例えば、符号化器によって実施される場合、プロセス1200は値P(ci)=P(eobc)を符号化することができる。復号化器において実施される場合、プロセス1100は、フラグLAST_EOB_C_FLAGを設定することができるシンタックス要素を復号化することができる。現在の係数の列グループが最後の非ゼロ係数の列グループと同じでない場合、ゼロ(0)をコーディングすることができ、それ以外の場合、1がコーディングされる。説明を繰り返すと、前述したように、符号化器によって実施される場合、コーディングとは、符号化されたビットストリームに符号化することを意味し、復号化器によって実施される場合、コーディングとは、符号化されたビットストリームから復号化することを意味する。
1222において、列グループP(ci)がアクセスされたことを示すために、列グループ値P(ci)が列セットCに追加されて、列グループ値P(ci)を有する別の変換係数がアクセスされると/された場合、プロセス1200は、シーケンス1220~1227をスキップすることができ、その結果、(1220において)列グループP(ci)がブロックの最後の非ゼロ変換係数を含むかどうかを示す別の値をコーディングすることをスキップすることができる。
1224において、列グループ値P(ci)が最後の非ゼロ係数の列グループ値に等しい場合(即ち、P(ci)=P(eob_c)の場合、または同等に、LAST_EOB_C_FLAG=1の場合)、プロセス1200は、(1226において)フラグEOB_C_FOUNDを真(例えば、EOB_C_FOUND=1)に設定する。復号化器によって実施される場合、プロセス1200は、1226において、列グループ値P(ci)が最後の非ゼロ係数の列グループ値(即ちP(eobc))であることを記録することもできる。1227において、プロセス1200は、最後の非ゼロ係数eobcの列を再構築するために、P(ci)≧4のときに、追加のビットをコーディングする。例えば、図10を参照すると、最後の非ゼロ係数(即ち、係数1056)は列グループ番号5(上記のマッピングによる列値6及び7を含む)にあり、かつグループ内の最初の列にあるため、プロセス1200は、追加のビット(例えば、ゼロ0の値)をコーディングすることができる。1227においてコーディングされた追加ビットは、グループ内の列数に依存する。1217の2つのブランチが完了すると、プロセス1200は1110に進む。
シーケンス1228~1237において、プロセス1200は、ブランチ1218~1237のステップと同様のステップを実行する。ブロック1228は、EOB_C_FOUND、列グループP(ci)、および列グループセットCの代わりに、EOB_R_FOUND、行グループP(ri)、および行グループセットRが使用されることを除いて、ブロック1218と同じとすることができる。ブロック1230は、プロセス1220は、LAST_EOB_C_FLAGをコーディングする代わりに、現在の非ゼロ係数の行グループが最後の非ゼロ係数の行グループであるかどうかを示すLAST_EOB_R_FLAGをコーディングすることを除いて、ブロック1220と同じとすることができる。ブロック1232は、列グループセットCおよび列グループ値P(ci)の代わりに、行グループセットRおよび行グループ値P(ri)が使用されることを除いて、ブロック1222と同じとすることができる。ブロック1234は、列グループ値P(ci)を最後の非ゼロ係数の列グループ値(P(eobc)の列グループ値と比較する代わりに、行グループ値P(ri)が最後の非ゼロ係数(P(eobr))の行グループ値と比較されることを除いて、ブロック1224と同じとすることができる。ブロック1236は、フラグEOB_C_FOUNDの代わりに、フラグEOB_R_FOUNDを除いて、ブロック1226と同じとすることができる。ブロック1237は、追加のビットが最後の非ゼロ係数の行を再構築するためにコーディングされることを除いて、ブロック1227と同じとすることができる。
図13は、本開示の実施形態による、極座標系を使用して、係数の変換ブロックの最後の非ゼロ係数の位置をコーディングするプロセス1300のフローチャート図である。プロセス1300は、上述したプロセス1100および1200に類似している。しかしながら、プロセス1300は極座標系を使用する。プロセス1300の極座標系は、図15および図10のブロック1050に関してさらに説明される。
図15は、本開示の実施形態による極座標系1500の一例である。図15は、図10のスキャン順序1000の複製である。極座標系1500は、原点および対角線によって特徴付けることができる。一例において、原点は、ブロック1050のDC係数(即ち、係数1058)とすることができる。即ち、原点は、スキャンインデックス値0(即ち、スキャンインデックス1504)に対応することができる。
上述したように、図10のブロック1050の各係数は、デカルト位置(列、行)に配置されている。例えば、係数1056は、デカルト位置(6、2)に存在する。極座標系1500の反対角線は、同じ値(列+行)を有するブロック1050の係数が同じ反対角線上にあると見なされるような線とすることができる。
例えば、反対角線1502は、列+行=1を有する係数を含む。このため、スキャンインデックス値1(ブロック位置(0、1)における係数に対応)とスキャンインデックス値2(ブロック位置(1、0)における係数に対応)に対応する係数は、同じ反対角線上にある(即ち、反対角線1502)。
別の例として、反対角線1506は、列+行=4を有するブロック1050の係数を含む。即ち、反対角線1506は、デカルト位置(4、0)、(3、1)、(2、2)、(1、3)、および(0、4)における係数にそれぞれ対応するスキャン位置10、11、12、13、および14における係数を含む。同様に、反対角線1508は、列+行=8を有するブロック1050の係数を含む。即ち、反対角線1508は、デカルト位置(7、1)、(6、2)、(5、3)、(4、4)、(3、5)、(2、6)、および(1、7)における係数にそれぞれ対応するスキャン位置36、37、38、39、40、41、および42における係数を含む。
極座標系1500において、係数は、係数および対角線上の係数の位置を含む反対角線によって記述される。即ち、係数はタプル(反対角線、位置)によって記述することができる。一例では、位置は係数の行番号によって指定することができる。別の例では、位置は係数の列番号によって指定することができる。位置を記述するための他のオプションを利用することができる。
このため、変換ブロック内の最後の非ゼロ係数の位置(例えば、図10のスキャンインデックス1006に対応する係数1056)は、タプル(eobd,eoba)を使用して記述することができる。係数1056の反対角線は、eobd=6+2=8によって与えることができる。係数の列番号が位置eobaに使用される場合、係数1056は、タプル(8、6)によって記述することができる。係数の行番号が位置eobaに使用される場合、係数1056は、タプル(8、2)によって記述することができる。以下の説明では、反対角線に沿った位置は、係数の行番号によって与えられるものであると想定されている。DC位置を原点とすると、極座標系1500は、極座標系の離散バージョンとみなすことができる。図13には示されていないが、プロセス1300は、最後の非ゼロ係数の反対角線eobdおよび位置eobaを決定することができる。
プロセス1300は、非ゼロ係数を含む反対角線がスキャン順序が任意のブロックの最後の非ゼロ係数を含む反対角線であるかどうかを一度コーディングする。プロセス1300は、最後の非ゼロ係数を含む反対角線上の現在の非ゼロ係数について、現在の非ゼロ係数が最後の非ゼロ係数であるかどうかをコーディングする(または推測することができる)。プロセス1300は、図11のプロセス1100と同じ一部のブロックを含む。説明を簡略化するために、同じ番号のブロックの説明を省略する。
1302において、プロセス1300は、対角セットDを空のセットに初期化する。対角セットDは、プロセス1300によって既にアクセスされた反対角線の軌跡を保持する。この状況において、アクセスされる反対角線は、現在の非ゼロ係数が任意のスキャン順序でアクセスされるときに、別の非ゼロ係数が現在の非ゼロ係数と同じ反対角線に含まれるように既に決定されていることを意味する。例えば、スキャン順序1000では、スキャンインデックス値2(即ち、ブロック位置(1、0)における係数値3に対応する)が処理されると、反対角線1(即ち、1+0)がアクセスされたものとして決定される(即ち、対角セットDは値2を有する反対角線を含む)。この理由は、別の非ゼロ係数(即ち、スキャンインデックス値1に対応するブロック位置(0、1)における係数)が反対角線(即ち、反対角線値1)に含まれるものとして既に決定されているからである。
1304において、スキャン位置iがゼロに初期化され、フラグEOB_D_FOUNDおよびフラグEOB_A_FOUNDは、それぞれ偽(値ゼロなど)に設定される。スキャン位置iは、1次元配列uのインデックスとして使用される。フラグEOB_D_FOUNDは、ブロック終了係数と同じ反対角線上にある変換係数が処理されたかどうか(即ち、スキャン順序に従ってアクセスされたかどうか)を示す。フラグEOB_A_FOUNDは、最後の非ゼロ係数の反対角線上の現在の変換係数の位置が最後の非ゼロ係数の位置であるかどうかを示す。
1317において、プロセス1300は、現在の係数に関する反対角線値を計算する。現在の係数は、スキャン位置iのスキャンインデックス値に対応する変換ブロックの係数である。1116において決定された列値(即ち、ci)および行値(即ち、ri)を使用して、プロセス1300は、現在の反対角線diをdi=ci+riとして計算する。
1318において、プロセス1300が、最後の非ゼロ係数を含む反対角線が決定されておらず(即ち、フラグEOB_D_FOUND=0)、かつ現在の反対角線diがアクセスされていない(即ち、値diがセットD内にない)と決定された場合、プロセス1300は1320に進み、それ以外の場合、プロセス1300は1328に進む。
1320において、プロセス1300はフラグLAST_EOB_D_FLAGをコーディングする。フラグLAST_EOB_D_FLAGは、現在の非ゼロ係数の反対角線が最後の非ゼロ係数の反対角線であるかどうかを示す。例えば、符号化器によって実施される場合、プロセス1300は、値di=eobdを符号化することができる。復号化器において実施される場合、プロセス1300は、フラグLAST_EOB_D_FLAGを設定することができるシンタックス要素を復号化することができる。現在の係数の反対角線が最後の非ゼロ係数の反対角線と同じでない場合、ゼロ(0)をコーディングすることができ、それ以外の場合、1がコーディングされる。繰り返すと、前述したように、符号化器によって実施される場合、コーディングとは、符号化されたビットストリームに符号化することを意味し、復号化器によって実施される場合、コーディングとは、符号化されたビットストリームから復号化することを意味する。
1322において、反対角値diがアクセスされたことを示すために、現在の係数の反対角線値diが反対角セットDに追加されて、同じ反対角線diを有する別の変換係数がアクセスされると/された場合に、プロセス1300は、ブランチ1320-1326をスキップし、その結果、(1320において)反対角値diがブロックの最後の非ゼロ変換係数を含むかどうかを示す別の値をコーディングすることをスキップすることができるようにする。
1324において、反対角線値diが最後の非ゼロ係数の反対角線値に等しい場合(即ち、di=eobdの場合、または同等に、LAST_EOB_D_FLAG=1の場合)、プロセス1300は(1326)EOB_D_FOUNDフラグを真(例えば、EOB_D_FOUND=1)に設定し、それ以外の場合、プロセス1300は1328に進む。復号化器によって実施される場合、1326において、プロセス1300は、反対角線値diが最後の非ゼロ係数(即ち、eobd)の反対角線値であることを記録することもできる。次に、プロセス1300は1328に進む。
1328において、プロセス1300が、EOB_D_FOUNDが設定されている(即ち、EOB_D_FOUND=1)ことを決定した場合、プロセス1300は1330に進み、それ以外の場合、プロセス1300は1112に進む。シーケンス1330~1338では、プロセス1300は、反対角線上の現在の非ゼロ係数の位置が最後の非ゼロ係数の位置であるかどうかをコーディングまたは推測する。1328において、フラグEOB_D_FOUNDが設定されている場合、反対角線値diは、最後の非ゼロ係数(即ち、eobd)の反対角線値であることも意味する。また、それは、現在の反対角線が最後の非ゼロ係数を含んでいるため、後続の反対角線がゼロ係数のみを含んでいることも意味する。サブシーケンスの反対角線は、任意の反対角線di+kであり、kはゼロ(0)より大きい値である。
1330において、プロセス1300は、現在の係数位置(ci、ri)が反対角線diの最後の位置であるかどうかを決定する。最後の位置でない場合、プロセスは1334に進む。最後の位置である場合、1332において、プロセス1300は、(符号化器による符号化または復号化器による復号化の代わりに)最後の非ゼロ係数(即ち、eoba)の位置が現在の係数の行値と同じであると推測することができる。即ち、プロセス1300は、eobaがriに等しいと推測することができる。一例では、プロセス1330は、すべてのk>0についてdi+kがdiに等しくないと決定することにより、現在の係数位置(ci、ri)が反対角線diの最後の位置であると決定することができる。プロセス1300は、次に1112に進む。
1334において、プロセス1300は、フラグLAST_EOB_A_FLAGをコーディングする。フラグLAST_EOB_A_FLAGは、現在の非ゼロ係数の反対角線上の位置が最後の非ゼロ係数の位置であるかどうかを示す。例えば、符号化器によって実施される場合、プロセス1300は、値ri=eobaを符号化することができる。復号化器において実施される場合、プロセス1300は、フラグLAST_EOB_A_FLAGを設定することができるシンタックス要素を復号化することができる。現在の係数の反対角線上の位置が最後の非ゼロ係数の反対角線上の位置と同じでない場合、ゼロ(0)をコーディングすることができ、それ以外の場合、1がコーディングされる。
1336において、プロセス1300は、位置の値riが最後の非ゼロ係数の反対角線di上の位置の値に等しいかどうか(即ち、ri=eobrの場合、または同等に、LAST_EOB_A_FLAG=1の場合)を決定する。等しくない場合、プロセス1300は1112に進む。等しい場合、プロセス1300は、(1338において)フラグEOB_A_FOUNDを真(例えば、EOB_A_FOUND=1)に設定する。復号化器によって実施される場合、プロセス1300は、1338において、行値riが最後の非ゼロ係数(即ちeobr)の反対角線に沿った位置であることを記録することもできる。次に、プロセス1300は、1112に進む。
1312において、変換ブロックのすべての係数が処理された場合(即ち、スキャン位置i=N*N)、または最後の非ゼロ変換係数の反対角線がアクセスされ(即ち、EOB_D_FOUND=1)、かつ反対角線上の最後の非ゼロ位置の位置が発見された場合(即ち、EOB_A_FOUND=1)、プロセス1300は終了し、それ以外の場合、プロセスは1106に続く。
上述したように、プロセス1300は、EOB_D_FOUND=1であり(即ち、現在の反対角線が最後の非ゼロ係数を含む反対角線である)、かつ現在の係数位置(ci、ri)が反対角線の最後の位置である場合、現在の係数が非ゼロ係数であることを(符号化器による符号化または復号化器による復号化の代わりに)推測することができる。従って、プロセス1300は、値sig[i]の符号化または復号化するコストを節約することができる。
図14は、本開示の実施例による、係数グループ座標系を使用して、係数の変換ブロックの最後の非ゼロ係数の位置をコーディングするプロセス1400のフローチャート図である。係数グループ座標系は、変換ブロックを変換係数のグループに分割する。係数グループ座標系の第1の次元は量子化された変換係数のグループとすることができ、第2の次元はグループ内の位置とすることができる。係数グループ座標系は、すべてのスキャン位置{0、…、N*N-1}を多数の重複しないグループ{G0,...,GK}に分割することができる。ここで、Kは、N*N-1より小さい正の整数である。以下の説明では、グループに係数が含まれていると記載することは、グループに係数のスキャンインデックスが含まれていると記載することと同じである。同様に、非ゼロ係数のグループ番号は、非ゼロ係数のスキャンインデックスを含むグループ番号と同じである。
係数グループ{G0,...,GK}が与えられると、変換ブロック内の最後の非ゼロ係数の位置eobは、(eobg,eoba)を使用して記述することができ、eobgはブロック終了係数を含むグループGkのインデックスkを示し、eobaはグループGk内のオフセット位置を示す。オフセット位置eobaは、eoba=eob-Gk,0として決定することができる。即ち、オフセット位置eobaは、ブロック終了係数のスキャンインデックス位置から、ブロック終了係数を含むグループの最初のスキャンインデックスを減算したものである。
図16は、本開示の実施形態による係数グループ座標系1600の一例である。係数グループ座標系1600は、各グループがスキャン位置{16k,16k+1,...,16k+15}を含むように、スキャン位置をグループGkに分割する。即ち、各グループGkは、16個の連続したスキャン位置で構成されている。従って、係数グループ座標系1600は、4つのグループを含む。グループG1(即ち、グループ1602)は、スキャン位置{0,1,...,15}を含む。グループG2(即ち、グループ1604)は、スキャン位置{16,17,...,31}を含む。グループG3(即ち、グループ1606)は、スキャン位置{31,32,...,47}を含む。グループG4(即ち、グループ1608)は、スキャン位置{48,49,...,63}を含む。
他の係数グループも可能である。例えば、スキャン位置をグループG0={0},G1={1},G2={2,3},G3={4,5,6,7},G4={8,...,15},G5={16,...,31},G6={32,...,63},G7={64,...,127},G8={128,...,255},G9={256,511},G10={512,...,1023}に分割することができる。さらに別の例としては、係数グループGkは、G0={0},G1={1},G2={2,3},G3={4,5,6,7},G4={8,...,15},G5={16,...,31},k≧6に関して、Gk=32+16(k-6),...,47+16(k-6)}とすることができる。
プロセス1400は、係数グループおよびブロック終了(eobg,eoba)の位置オフセットをコーディングする一例である。プロセス1400は、プロセス1100の態様を共有することができる。プロセス1100のブロックとして番号付けされたプロセス1400のブロックに関する説明は、省略する。
1402において、プロセス1400は、グループセットGを空のセットに初期化する。グループセットGは、プロセス1400によって既にアクセスされたグループの軌跡を保持する。この状況において、アクセス済みグループとは、現在の非ゼロ係数が任意のスキャン順序でアクセスされるときに、現在の非ゼロ係数と同じグループに含まれる別の非ゼロ係数が既に決定されていることを意味する。
1404において、スキャン位置iがゼロに初期化され、フラグEOB_G_FOUNDが偽(例えば、値ゼロ)に設定され、フラグEOB_A_FOUNDが偽に設定される。スキャン位置iは、1次元配列uのインデックスとして使用される。フラグEOB_G_FOUNDは、ブロック終了係数のスキャン位置と同じグループ内にある変換係数のスキャン位置が処理されている(即ち、スキャン順序に従ってアクセスされている)かどうかを示す。フラグEOB_A_FOUNDは、最後の非ゼロ係数を含むグループ内の現在の変換係数の位置オフセットが、最後の非ゼロ係数の位置オフセットであるかどうかを示す。
1416において、プロセス1400は、現在の係数が属するグループ番号を決定する。同様に、プロセス1400は、現在の係数のスキャン位置が属するグループの現在のグループ番号を決定する。プロセス1400は、スキャン位置iがグループGki内にあるように、スキャン位置i(即ち、スキャン位置i)の現在のグループ番号kiを決定することができる。
1418において、プロセス1400が、最後の非ゼロ係数を含むグループが決定されておらず(即ち、フラグEOB_G_FOUND=0)、かつ現在のグループ番号kiがアクセスされていない(即ち、値kiがセットG内に存在しない)ことを決定すると、プロセス1400は1420に進み、それ以外の場合、プロセス1400は1428に進む。
1420において、プロセス1400はフラグLAST_EOB_G_FLAGをコーディングする。フラグLAST_EOB_G_FLAGは、現在のグループ番号kiが最後の非ゼロ係数のグループ番号であるかどうかを示す。例えば、符号化器によって実施される場合、プロセス1400は、値ki=eobgを符号化することができる。復号化器によって実施される場合、プロセス1400は、フラグLAST_EOB_G_FLAGを設定することができるシンタックス要素を復号化することができる。現在のグループ番号が最後の非ゼロ係数のグループ番号と同じでない場合、ゼロ(0)をコーディングすることができ、それ以外の場合、1がコーディングされる。
1422において、グループ番号kiがアクセスされたことを示すために、現在のグループ番号kiがグループセットGに追加されて、同じグループ内の別の非ゼロ変換がアクセスされると/された場合、プロセス1400は、シーケンス1420~1426をスキップし、その結果、(1420において)グループ番号kiがブロックの最後の非ゼロ変換係数を含むかどうかを示す別の値をコーディングすることをスキップすることができるようにする。
1424において、現在のグループ番号kiが最後の非ゼロ係数のグループ番号に等しい場合(即ち、ki=eobgの場合、または同等に、LAST_EOB_G_FLAG=1の場合)、プロセス1400は、(1426において)フラグEOB_G_FOUNDを真(例えば、EOB_G_FOUND=1)に設定し、それ以外の場合、プロセス1400は1428に進む。復号化器によって実施される場合、プロセス1400は、1426において、グループ番号kiが最後の非ゼロ係数(即ち、eobg)を含むグループであることを記録することもできる。次に、プロセス1400は1428に進む。
1428において、プロセス1400が、EOB_G_FOUNDが設定されている(即ち、EOB_G_FOUND=1)ことを決定した場合、プロセス1400は、1430に進み、それ以外の場合、プロセス1400は1112に進む。シーケンス1430~1438において、プロセス1400は、最後の非ゼロ係数を含むグループ内の非ゼロ係数の位置オフセットが、最後の非ゼロ係数の位置であるかどうかをコーディングまたは推測する。1428において、フラグEOB_G_FOUNDが設定されている場合、kiの番号が付けられた現在のグループが、最後の非ゼロ係数(即ちeobg)のスキャンインデックスを含むグループであることも意味する。
1430において、スキャン位置iがグループ内の最後の位置である場合、次に、プロセス1400は1432に進み、それ以外の場合、プロセス1400は1434に進む。一例では、プロセス1400は、次のスキャン位置の値(即ち、i+1)がグループ外にあるかどうかをテストすることにより、スキャン位置iがグループ内の最後の位置であるかどうかを決定することができる。例示のために図16を参照すると、スキャンインデックス15がグループG1(即ち、グループ1602)の最後の位置であるかどうかを決定するために、プロセス1400は、スキャンインデックスi+1=16がグループG1にあるかどうかをテストする。上記したように、グループG2(即ち、グループ1604)は、スキャン位置16を含むグループである。このため、(i+1)はG1に存在しないため、スキャン位置iは、グループG1の最後の位置である。
1432で、プロセス1400は、(符号化器による符号化または復号化器による復号化の代わりに)最後の非ゼロ係数(即ち、eoba)の位置オフセットが最後の非ゼロ係数のオフセットと同じであると推測することができる。即ち、プロセス1400は、eobaがi-Gki,0に等しいと推測することができる。即ち、最後の非ゼロ係数のオフセット位置は、現在のスキャンインデックス(i)からスキャンインデックスiを含むグループの最初のスキャンインデックスを減算したもの等しくなる。例えば、図16のグループを使用して、現在のスキャン位置i=39が与えられた場合、スキャン位置iを含むグループの最初のスキャン位置は32である。これは、スキャン位置39を含むグループがグループ1604であり、かつグループ1604の最初のスキャン位置がスキャン位置32であるからである。
1434において、プロセス1400は、フラグLAST_EOB_A_FLAGをコーディングする。フラグLAST_EOB_A_FLAGは、グループ内の現在の非ゼロ係数の位置オフセットが最後の非ゼロ係数の位置オフセットであるかどうかを示す。例えば、符号化器によって実施される場合、プロセス1400は、値(i-Gki,0=eoba)を符号化することができる。復号化器において実施される場合、プロセス1400は、フラグLAST_EOB_A_FLAGを設定することができるシンタックス要素を復号化することができる。現在の係数のグループ内の位置オフセットが最後の非ゼロ係数の位置オフセットと同じでない場合、ゼロ(0)をコーディングすることができ、それ以外の場合、1がコーディングされる。
1436において、プロセス1400は、(i-Gki,0=eoba)であるかどうか、または、同等に、LAST_EOB_A_FLAG=1であるかどうかを決定する。否の場合、プロセス1400は、1112に進む。是の場合、プロセス1400は、(1438において)フラグEOB_A_FOUNDを真(例えば、EOB_A_FOUND=1)に設定する。復号化器によって実施される場合、プロセス1400は、1438において、値i-Gki,0が最後の非ゼロ係数の位置オフセット(eoba)であることを記録することもできる。次に、プロセス1400は、1112に進む。
1412において、変換ブロックのすべての係数が処理された場合(即ち、スキャン位置i=N*N)、または最後の非ゼロ変換係数のグループがアクセスされ(即ち、EOB_G_FOUND=1)、かつグループ内の最後の非ゼロ位置の位置オフセットが発見された場合(即ち、EOB_A_FOUND=1)、プロセス1400は終了し、それ以外の場合、プロセスは1106に続く。
一実施形態では、プロセス1400は、1106において、EOB_G_FOUND=1(即ち、現在のグループが最後の非ゼロ係数を含むグループである)であり、かつ現在のスキャン位置iがグループの最後のオフセット位置である(即ち、iはGkiの最後の位置である)場合、現在の係数が非ゼロ係数であることを(符号化器による符号化または復号化器による復号化の代わりに)推測することができる)。このため、プロセス1400は、値sig[i]の符号化または復号化するコストを節約することができる。
図17は、本開示の実施形態により、変換ブロックの最後の非ゼロ係数の位置を復号化するためのプロセス1700のフローチャート図である。プロセス1700は、復号化器500などの復号化器において実施することができる。プロセス1700は、受信局によって実施することができる。プロセス1700は、例えば、コンピューティングデバイスによって実行することができるソフトウェアプログラムとして実施することができる。ソフトウェアプログラムは、メモリ204または二次ストレージ214などのメモリに格納された機械可読命令であって、CPU202のようなプロセッサにより実行されて、コンピューティングデバイスにプロセス1700を実行させる機械可読命令を含むことができる。プロセス1700は、特殊なハードウェアまたはファームウェアを使用して実施することができる。いくつかのコンピューティングデバイスは、複数のメモリ、複数のプロセッサ、またはその両方を有することができる。プロセス1700のステップまたは動作は、異なるプロセッサ、メモリ、またはその両方を使用して分散させることができる。本明細書で単数の「プロセッサ」または「メモリ」という用語の使用は、記載されたステップのいくつかまたは全ての実行に使用することができる1つのプロセッサまたは1つのメモリのみを有するコンピューティングデバイスのみならず、複数のプロセッサまたは複数のメモリを有するデバイスを包含する。
1702において、プロセス1700は、図5の圧縮ビットストリーム420などの符号化ビットストリームから、変換ブロックの第1の係数が非ゼロであるかどうかを復号化する。一例では、ブロック1702は、図11~14のブロック1108に関して説明したとおりである。
1704において、プロセス1700は、第1の係数が非ゼロであるかどうか、かつ第1の係数が第1の次元の第1の値に関して復号化されるべき第1の非ゼロ係数であるかどうかを決定する。是の場合、プロセス1700は、1706に進み、それ以外の場合、プロセスは終了する。
一例では、第1の次元の第1の値は、図11に関して説明したデカルト座標系の列次元に関する列値とすることができ、決定は、ブロック1118に関して説明したとおりとすることができる。一例では、第1の次元の第1の値は、図11に関して説明したデカルト座標系の行次元に関する行値とすることができ、決定は、ブロック1128に関して説明したとおりとすることができる。一例では、第1の次元の第1の値は、図12に関して説明したデカルトグループ化座標系の列グループ次元に関する列グループ値とすることができ、決定は、ブロック1218に関して説明したとおりとすることができる。一例では、第1の次元の第1の値は、図12に関して説明したデカルトグループ化座標系の行グループ次元に関する行グループ値とすることができ、決定は、ブロック1228に関して説明したとおりとすることができる。一例では、第1の次元の第1の値は、図13に関して説明した極座標系の反対角次元の反対角線値とすることができ、決定は、ブロック1318に関して説明したとおりとすることができる。一例では、第1の次元の第1の値は、図14に関して説明した係数グループ座標系の係数グループ次元に関する係数グループ値とすることができ、決定は、ブロック1418に関して説明したとおりとすることができる。
1706において、プロセス1700は、符号化ビットストリームから、第1の次元の第1の値がブロック終了係数を示すかどうかを示す第1のシンタックス要素を復号化する。復号化は、使用される座標系によって異なる。一例では、復号化は、図11の1120または1130に関して説明したとおりとすることができる。一例では、復号化は、図12の1220または1230に関して説明したとおりとすることができる。一例では、復号化は、図13の1320に関して説明したとおりとすることができる。一例では、復号化は、図14の1420に関して説明したとおりとすることができる。
1708において、ブロック終了係数を示す第1のシンタックス要素に応答して、プロセス1700は、第1の値を使用して、最後の非ゼロ係数の位置を決定する。一例では、ブロックは、図11のシーケンス1124~1126に関して説明したとおりとすることができる。一例では、ブロックは、図11のシーケンス1134~1136に関して説明したとおりとすることができる。一例では、ブロックは、図12のシーケンス1224~1127に関して説明したとおりとすることができる。一例では、ブロックは、図12のシーケンス1234~1237に関して説明したとおりとすることができる。一例では、ブロックは、図13のシーケンス1324~1326に関して説明したとおりとすることができる。一例では、ブロックは、図14のシーケンス1424~1426に関して説明したとおりとすることができる。
一実施形態では、プロセス1700は、第1の変換係数が第2の次元の第2の値に関して復号化されるべき第1の非ゼロ係数であると決定されたことに応答して、符号化ビットストリームから、第2の次元の第2の値がブロック終了係数を示すかどうかを示す第2のシンタックス要素を復号化するステップと、ブロック終了係数を示す第2のシンタックス要素に応答して、第2の値を使用して最後の非ゼロ係数の位置を決定するステップとを含むことができる。
第1の次元および第2の次元は、変換ブロックの列および行を含む座標系における次元であり得る。座標系は、図11のデカルト座標系に関して説明したとおりとすることができる。
一実施形態では、第1の次元と第2の次元は極座標系における次元である。極座標系は、図7に関して説明したとおりとすることができる。極座標系は、変換ブロックのDC係数を中心とすることができる。第1の次元は、変換ブロックを符号化するために使用されるスキャン順序の反対角線に対応することができ、第2の次元は、第1の次元の反対角線上の位置に対応することができる。
第1次元および第2次元は、係数グループ座標系における次元であり得る。係数グループ座標系は、図14に関して説明したとおりである。一例では、係数グループ座標系はスキャン順序のスキャン位置をスキャン位置のグループに分割することができ、第1の次元は、スキャン位置のグループに対応することができ、第2次元は、グループ内のスキャンインデックスのオフセット位置に対応することができる。一例では、係数グループ座標系は変換ブロックを変換係数のグループに分割することができ、第1の次元は、変換係数のグループに対応することができ、第2の次元は、グループ内の位置に対応することができる。
係数グループ座標系の実施形態では、グループが同数のスキャン位置を含むことができる。例えば、スキャン位置の同数は、16とすることができる。
プロセス1700の実施形態において、第1の次元および第2の次元は、デカルトグループ化座標系における次元である。デカルトグループ化座標系は、図12で説明したとおりである。第1の次元は、変換ブロックの列のグループに対応することができ、第2の次元は、変換ブロックの行のグループに対応することができる。
係数の変換ブロックは、イントラ予測を使用して予測される残差ブロックの変換ブロックとすることができる。変換係数は、輝度色成分のブロックに関する変換係数とすることができる。
図18は、本開示の実施形態による、変換ブロックの最後の非ゼロ係数の位置を復号化するための別のプロセス1800のフローチャート図である。プロセス1800は、図5の復号化器500などの復号化器において実施することができる。プロセス1800は、例えば、受信局106などのコンピューティングデバイスによって実行することができるソフトウェアプログラムとして実施することができる。ソフトウェアプログラムは、メモリ204または二次ストレージ214などのメモリに格納された機械可読命令であって、CPU202のようなプロセッサにより実行されて、コンピューティングデバイスにプロセス1800を実行させる機械可読命令を含むことができる。少なくともいくつかの実施形態では、プロセス1100は、図5の復号化器500のエントロピー復号化ステージ502によって全体的または部分的に実行することができる。
1802において、プロセス1800は、変換ブロックの係数を係数グループ座標系にマッピングする。係数グループ座標系は、第1の次元および第2の次元を有することができる。第1の次元は、変換係数のグループに対応することができる。第2の次元は、複数の係数グループのうちの一つのグループ内のオフセット位置に対応することができる。一例では、いくつかのグループが不等数の係数を含むことができる。
1804において、プロセス1800は、符号化されたビットストリームから、最後の非ゼロ係数を含む係数グループを決定する。例えば、図14および16に関して説明したように、プロセスは、1420に関して説明したように、シンタックス要素またはグループ1606を示すフラグを復号化することにより、最後の非ゼロ係数を含む係数グループを決定することができる。
1806において、プロセス1800は、符号化ビットストリームから、係数グループ内の最後の非ゼロ係数のオフセット位置を、最後の非ゼロ係数について決定する。例えば、プロセスは、図14に関して説明したようにオフセット位置を決定することができる。
1808において、プロセス1800は、符号化されたビットストリームから、係数グループおよびオフセット位置に対応する係数までの係数を復号化する。一例では、係数は、図14の1412および1106に関して説明したように復号化することができる。
プロセス1800の実施形態において、オフセット位置を決定することは、符号化されたビットストリームから、例えば、図14の1434に関して説明したオフセット位置を示すシンタックス要素を復号化することを含むことができる。
プロセス1800の実施形態において、オフセット位置を決定することは、復号化されている現在の係数が係数グループの最後のオフセット位置にあると決定することに応答して、最後の非ゼロ係数のオフセット位置が最後のオフセット位置であると推測することを含むことができる。一例では、図14の1430および1432に関して説明したように、オフセット位置を推測することができる。
プロセス1800の実施形態では、係数グループおよびオフセット位置に対応する係数まで係数を復号化することは、復号化されている現在の係数が係数グループ内の最後のオフセット位置にあると決定することに応答して、現在の係数が非ゼロ係数であると推測することを含むことができる。このプロセスは、図14の1106に関して説明したように、現在の係数が非ゼロ係数であると推測することができる。
一実施形態による係数の変換ブロックの最後の非ゼロ係数の位置を復号化するためのさらに別のプロセスがここで開示される。このプロセスは、変換ブロックの係数を第1の次元と第2の次元を有する座標系にマッピングすることを含む。第1の1つまたは複数の係数は、第1の次元の第1の値で座標系に配置され、第2の1つまたは複数の係数は、第2の次元の第2の値で座標系に配置される。プロセスは、符号化されたビットストリームから、第1の次元の第1の値が最後の非ゼロ係数を含むかどうかについて、第1の値に関して1度のみ復号化するステップと、符号化されたビットストリームから、第2の次元の第2の値が最後の非ゼロ係数を含むかどうかについて、第2の値に関して1度のみ復号化するステップと、第1の次元の復号化された第3の値と第2の次元の復号化された第4の値とを使用して、最後の非ゼロ係数の位置を決定するステップとをも含む。復号化された第3の値および復号化された第4の値は、最後の非ゼロ係数を示すことができる。
例えば、極座標系の場合、第1の次元は反対角線とすることができ、第2の次元は対角線上の位置とすることができる。従って、第1の次元の第1の値が最後の非ゼロ係数を含むかどうかについて、第1の値に関して1度のみ復号化する例は、図15の反対角線1502(即ち、行+列=0+1=1+0=1に対応する)が最後の非ゼロ係数を含むかどうかについて1度のみ復号化することができる。この場合、反対角線次元(即ち、第1の次元)の反対角線1502(即ち、第1の値)は、最後の非ゼロ係数を含まない。
一実施形態では、第4の値を復号化することは、第4の値を推測することを意味することができる。例えば、デカルト座標系において、図11の1120に関して説明したように、第4の値を推測することができる。例えば、極座標系において、図13の1332に関して説明したように、第4の値を推測することができる。例えば、係数グループ座標系において、図14の1432に関して説明したように、第4の値を推測することができる。例えば、第1の次元が1つのみの要素を含む場合、第4の値が1つの値であると推測することができる。例えば、グループ座標系におけるグループが1つのスキャン位置(例えば、G0={0}、G1={1})のみを含む場合、第4の値はグループの1つのスキャン位置であると推測することができる。例えば、極座標系において、決定された反対角線がDC係数を含む反対角線(即ち、行+列=0+0=0に対応する反対角線)である場合、第4の値を推測することができる。
上述の符号化および復号化の態様は、符号化および復号化技術のいくつかの例を示す。しかしながら、符号化および復号化は、これらの用語が特許請求の範囲で使用されているように、データの圧縮、圧縮解除、変換、または任意の他の処理または変更を意味し得ることを理解されたい。
本明細書では、「例」または「実施」という用語は、例、事例、または例示として機能することを意味するために使用される。本明細書において「例」または「実施形態」と記載された任意の態様または設計は、必ずしも他の態様または設計に対して好ましいまたは有利であるとして解釈されるべきではない。むしろ、「例」または「実施形態」という用語の使用は、概念を具体的な方法で表現することを意図している。本出願で使用される場合、用語「または」は、排他的な「または」ではなく、包括的な「または」を意味することが意図される。即ち、他に明記されていない限り、または文脈から明らかでない限り、「XはAまたはBを含む」とは、任意の自然な包含的置換(natural inclusive permutations)を意味することを意図する。即ち、「XはAまたはBを含む」は、以下の場合、XがAを含む場合、XがBを含む場合、またはXがAおよびBの両方を含む場合のいずれにおいても満足される。さらに、本出願および添付の特許請求の範囲で使用される冠詞「a」および「an」は、他に明記されない限り、または単数形に向けられる文脈から明らかでない限り、「1つまたは複数」を意味すると一般に解釈されるべきである。さらに、「実施形態」または「一実施形態」という用語の使用は、そのように記載されない限り、同じ実施形態または実施を意味することを意図するものではない。
送信局102および/または受信局106(ならびに、符号化器400および復号化器500が含む、それに記憶され、かつ/またはそれによって実行されるアルゴリズム、方法、命令など)の実施形態は、ハードウェア、ソフトウェア、またはそれらの任意の組み合わせにおいて実現することができる。ハードウェアは、例えば、コンピュータ、知的財産(IP)コア、特定用途向け集積回路(ASIC:application-specific integrated circuits)、プログラマブル論理アレイ、光プロセッサ、プログラマブル論理コントローラ、マイクロコード、マイクロコントローラ、サーバ、マイクロプロセッサ、デジタル信号プロセッサ、または他の適切な回路を含むことができる。特許請求の範囲において、「プロセッサ」という用語は、前述のハードウェアのいずれかを単独でまたは組み合わせて含むものとして理解されるべきである。用語「信号」および「データ」は、互換的に使用される。さらに、送信局102および受信局106の一部は、必ずしも同じ方法で実施される必要はない。
さらに、一態様では、例えば、送信局102または受信局106は、実行時に、本明細書に記載された個々の方法、アルゴリズム、および/または命令をのうちのいずれかを実行するコンピュータプログラムを備えた汎用コンピュータまたは汎用プロセッサを使用して実施することができる。加えて、または代替的に、例えば、本明細書に記載された方法、アルゴリズム、または命令のいずれかを実行するための他のハードウェアを含むことができる専用コンピュータ/プロセッサを利用することができる。
送信局102および受信局106は、例えば、ビデオ会議システム内のコンピュータ上で実施することができる。あるいは、送信局102はサーバ上で実施することができ、受信局106はサーバとは別のハンドヘルド通信デバイスのようなデバイス上で実施することができる。この場合、送信局102は、符号化器400を使用してコンテンツを符号化されたビデオ信号に符号化し、符号化されたビデオ信号を通信デバイスに送信することができる。通信デバイスは、復号化器500を使用して符号化されたビデオ信号を復号化することができる。あるいは、通信デバイスは、通信デバイス上に局所的に格納されたコンテンツ、例えば、送信局102によって送信されなかったコンテンツを復号化することができる。他の送信局102および受信局106の実施スキームが利用可能である。例えば、受信局106は、ポータブル通信デバイスではなく、一般に固定のパーソナルコンピュータであってもよく、かつ/または符号化器400を含むデバイスは、復号化器500を含んでもよい。
さらに、本開示の実施形態の全部または一部は、例えば有形のコンピュータ使用可能またはコンピュータ可読媒体からアクセス可能なコンピュータプログラム製品の形態を取ることができる。コンピュータ使用可能またはコンピュータ可読媒体は、例えば、任意のプロセッサによって、またはそれに関連して使用するために、プログラムを有形に包含、格納、通信、または輸送することができる任意のデバイスであり得る。媒体は、例えば、電子、磁気、光学、電磁気、または半導体デバイスであり得る。他の適切な媒体も利用可能である。
上述した実施形態、実施例及び態様は、本開示の理解を容易にするために記載されており、本開示を限定するものではない。本開示は、添付の特許請求の範囲内に含まれる様々な改変および均等の構成を包含することを意図しており、その範囲は、法律で許容されるようなすべての改変および均等の構造を包含するように最も広い解釈が与えられる。