以下、本発明の実施の形態における画像復号化装置および画像符号化装置について図面を参照しながら説明する。
(実施の形態1)
図1は、本発明の実施の形態1における画像復号化装置の構成を示すブロック図である。
本実施の形態における画像復号化装置100は、簡単な構成で復号化の並列処理を適切に実行する装置であって、デコーダ110とメモリ150とを備えている。
メモリ150は、デコーダ110に入力されるデータ、デコーダ110により中間的に生成されたデータ、およびデコーダ110により最終的に生成されて出力されるデータを記憶するための領域を有する。
具体的には、メモリ150は、ストリームバッファ151と、M個の分割ストリームバッファ(第1分割ストリームバッファ〜第M分割ストリームバッファ)152と、フレームメモリ153とを備えている。
ストリームバッファ151には、画像符号化装置により生成されて送信された符号化ストリームが格納される。M個の分割ストリームバッファ152には、デコーダ110により生成されるM×N個の分割ストリームが、上述の中間的に生成されたデータとして格納される。なお、各分割ストリームバッファ152には、N個のデコードエンジン120のそれぞれに対して割り当てられた領域がある。フレームメモリ153には、N個のデコードエンジン(復号化部)120によって生成されたN個の分割復号画像データが、上述の最終的に生成されて出力されるデータとして格納される。なお、復号画像データは、フレームメモリ153に格納され、表示装置に読み込まれて動画像として表示される。
デコーダ110は、メモリ150のストリームバッファ151に格納されている符号化ストリームを読み出して復号化することによって復号画像データを生成し、その復号画像データをメモリ150のフレームメモリ153に格納する。また、このデコーダ110は、M個のストリーム分割部(第1ストリーム分割部〜第Mストリーム分割部)130と、ストリーム分割制御部140と、N個のデコードエンジン(第1デコードエンジン〜第Nデコードエンジン)120とを備えている。
なお、本実施の形態におけるデコードエンジン120は、HDの画像(1920×1088画素、60i)を2チャンネル分復号可能な処理能力を有する。
ストリーム分割制御部140は、後述するモード情報を取得し、そのモード情報に応じて、M個のストリーム分割部130におけるストリーム分割処理の処理量が均等になるようにするため、各ストリーム分割部130のそれぞれに対し、ストリーム分割処理を所定の単位で振り分けるための振り分け制御情報を通知する。なお、ストリーム分割処理については後述する。本実施の形態では、ストリーム分割制御部140は、M個のストリーム分割部130におけるストリーム分割処理を、スライス単位で振り分けるものとして説明する。つまり、ストリーム分割制御部140は、振り分け制御情報の通知によって、符号化ストリームに含まれる処理対処領域(スライス)ごとに、その処理対象領域に対するストリーム分割処理を、M個のストリーム分割部130のうちの何れか1つに実行させる。例えば、振り分け制御情報は、ストリーム分割処理の対象とされるスライスを識別するためのスライス番号を示す。言い換えれば、ストリーム分割制御部140は、M個のストリーム分割部130のうちの何れか1つに対して振り分け制御情報を送信することにより、そのストリーム分割部130に対して、ストリーム分割処理の対象となる処理対象領域を指定する。さらに、ストリーム分割制御部140は、ストリーム分割処理をスライス単位でM個のストリーム分割部130に振り分けた結果から、N個のデコードエンジン120に対し、M個の分割ストリームバッファ152のうちどの分割ストリームバッファ152から分割ストリームを取得すればよいかを示す選択情報を通知する。
M個のストリーム分割部130のそれぞれは、モード情報および振り分け制御情報を取得し、そのモード情報および振り分け制御情報に応じて、符号化ストリームから処理すべきスライス(処理対象領域)を抽出し、そのスライスをN個の分割ストリーム(第1分割ストリーム〜第N分割ストリーム)に並列に分割する。つまり、本実施の形態におけるストリーム分割部130は、符号化ストリームに含まれる、ストリーム分割制御部140によって振り分けられたスライスごとに、そのスライスを1つまたは複数のMBラインに分割する。そして、ストリーム分割部130は、それらの複数のMBラインのそれぞれを、生成対象であるN個の分割ストリームのうちの何れかの一部に割り当てることにより、N個の分割ストリームを生成する。上述のストリーム分割処理は、このように、スライス(処理対象領域)を複数のMBラインに分割してN個の分割ストリームのうちの何れかの一部に割り当てる処理である。また、M個のストリーム分割部130は、そのストリーム分割処理を並列して実行することにより、N×M個の分割ストリームを生成する。
なお、MBラインは、ピクチャの左端から右端まで水平方向に配列された複数のマクロブロックからなる列を1つ有する構成単位である。また、ストリーム分割部130は、ピクチャがMBAFF(マクロブロックアダプティブフレームフィールド)で構成されていない場合には、処理対象領域(スライス)を複数のMBラインに分割するが、ピクチャがMBAFFで構成されている場合には、2つのMBラインを1つの構成単位(以下、MBラインペアという)として扱い、処理対象領域(スライス)を複数のMBラインペアに分割する。言い換えれば、ストリーム分割部130は、ピクチャがMBAFFで構成されている場合には、処理対象領域(スライス)を複数のMBラインに分割し、MBラインペアに属する2つのMBラインをそれぞれ同一の分割ストリームの一部に割り当てる。以下、ピクチャがMBAFFで構成されていないことを前提にして本発明を説明するが、本発明において、ピクチャがMBAFFで構成されていない場合と、MBAFFで構成されている場合とで異なる処理が必要なときには、その都度、MBAFFに対して特有の処理を説明する。また、MBAFFに対してその特有な処理などが必要とされない場合には、以下の説明において、MBラインをMBラインペアに置き換えることによって、その説明を、ピクチャがMBAFFで構成されている場合における本発明の説明に置き換えることができる。
M個のストリーム分割部130のそれぞれは、このように分割したN個の分割ストリームを、M個の分割ストリームバッファ152のうちの、そのストリーム分割部130に対応付けられた1つの分割ストリームバッファ152に格納する。すなわち、第1ストリーム分割部130は、分割したN個の分割ストリームを第1分割ストリームバッファ152に格納し、第2ストリーム分割部130は、分割したN個の分割ストリームを第2分割ストリームバッファ152に格納し、第Mストリーム分割部130は、分割したN個の分割ストリームを第M分割ストリームバッファ152に格納する。
また、M個のストリーム分割部130のそれぞれは、スライスを所定の単位として扱い、スライスを複数のMBラインに分割する際に、符号化ストリーム中のMBラインの直前、または、そのMBラインに属する2つのマクロブロックの間に、ヘッダがあれば、そのヘッダをそのMBラインに付随させて、分割ストリームの一部に割り当てる。
このようなストリーム分割部130によるMBラインごとの分割によって、ピクチャに含まれる、複数のMBラインにわたって配置されるスライスは分割されることになる。また、ストリーム分割部130は、N個の分割ストリームに分割するときには、N個の分割ストリームのそれぞれに跨るマクロブロック間の可変長復号処理における依存関係を除去しておく。
N個のデコードエンジン120は、モード情報および選択情報を取得し、そのモード情報および選択情報に応じて、それぞれ自らが処理すべき分割ストリームをM個の分割ストリームバッファ152のいずれかから読み出し、読み出した分割ストリームを並列に復号化することによりN個の分割復号画像データを生成する。
例えば、ストリーム分割制御部140の選択情報により、第1分割ストリームバッファ152から分割ストリームを取得するように通知された場合には、第1デコードエンジン120は、第1分割ストリームバッファ152の第1デコードエンジン120に割り当てたれた領域から第1分割ストリームを読み出す。同様に、第2デコードエンジン120は、第1分割ストリームバッファ152の第2デコードエンジン120に割り当てられた領域から第2分割ストリームを読み出し、第3デコードエンジン120は、第1分割ストリームバッファ152の第3デコードエンジン120に割り当てられた領域から第3分割ストリームを読み出し、第4デコードエンジン120は、第1分割ストリームバッファ152の第4デコードエンジン120に割り当てられた領域から第4分割ストリームを読み出す。そして、第1デコードエンジン120〜第4デコードエンジン120はそれぞれ第1分割ストリーム〜第4分割ストリームを並列に復号化する。
また、例えば、ストリーム分割制御部140の選択情報により、第M分割ストリームバッファ152から分割ストリームを取得するように通知された場合には、第1デコードエンジン120は、第M分割ストリームバッファ152の第1デコードエンジン120に割り当てられた領域から第1分割ストリームを読み出す。同様に、第2デコードエンジン120は、第2分割ストリームを第M分割ストリームバッファ152の第2デコードエンジン120に割り当てられた領域から第2分割ストリームを読み出し、第3デコードエンジン120は、第M分割ストリームバッファ152の第3デコードエンジン120が割り当てられた領域から第3分割ストリームを読み出し、第4デコードエンジン120は、第M分割ストリームバッファ152の第4デコードエンジン120に割り当てられた領域から第4分割ストリームを読み出す。そして、第1デコードエンジン120〜第4デコードエンジン120はそれぞれ第1分割ストリーム〜第4分割ストリームを並列に復号化する。
また、N個のデコードエンジン120は、分割ストリームを復号化するときには、フレームメモリ153に既に格納されている復号画像データを参照し、必要に応じて動き補償を行うことによって分割ストリームを復号化する。
さらに、N個のデコードエンジン120のそれぞれは、分割ストリームに含まれる画面内予測により符号化されたマクロブロックを復号化するときには、その復号化対象マクロブロックの左上、上および右上にあるマクロブロックを復号化したデコードエンジン120から、それらの復号化されたマクロブロックの情報を隣接MB情報として取得する。その隣接MB情報を取得したデコードエンジン120は、その隣接MB情報を用いて、復号化対象マクロブロックを復号化する。また、デコードエンジン120は、例えばデブロッキングフィルタ処理や動きベクトル予測処理を行う場合にも、上述と同様に、処理対象のマクロブロックの左上、上および右上にある復号化されたマクロブロックの情報を隣接MB情報として取得して、上述の処理を行う。
なお、本実施の形態では、説明を簡単にするために、以下、NをN=4として説明する。また、本実施の形態では、N(N=4)個のデコードエンジン120はそれぞれ、復号化対象のマクロブロックから見て、左、左上、上、および右上のマクロブロックの復号化が終了すると、それらの隣接MB情報を用いて、その復号化対象のマクロブロックの復号化を開始する。その結果、第1デコードエンジン120〜第4デコードエンジン120はそれぞれ、各MBラインにおいて水平方向に互いに異なる位置にあるマクロブロックを並列に復号化する。
図2Aは、ピクチャがMBAFFで構成されていない場合の復号化の順序を示す図である。
ピクチャがMBAFFで構成されていない場合、第1デコードエンジン120は第0MBラインを復号化し、第2デコードエンジン120が第1MBラインを復号化し、第3デコードエンジン120が第2MBラインを復号化し、第4デコードエンジン120が第3MBラインを復号化する。なお、第k(kは0以上の整数)MBラインは、ピクチャの上端からk番目にあるMBラインを示し、例えば、第0MBラインは、ピクチャの上端から0番目にあるMBラインである。
ここで、ピクチャの復号化が開始されるときには、まず、第1デコードエンジン120が第0MBラインの復号化を開始する。次に、第0MBラインの左端にある2つのマクロブロックの復号化が完了すると、第2デコードエンジン120が第1MBラインの左端のマクロブロックの復号化を開始する。そして、第1MBラインの左端にある2つのマクロブロックの復号化が完了すると、第3デコードエンジン120が第2MBラインの左端のマクロブロックの復号化を開始する。同様に、第2MBラインの左端にある2つのマクロブロックの復号化が完了すると、第4デコードエンジン120が第3MBラインの左端のマクロブロックの復号化を開始する。
したがって、第(k+1)MBラインは、第kMBラインに比べて、2マクロブロック分だけ遅れて、左端のマクロブロックから右端のマクロブロックまで復号化される。
図2Bは、ピクチャがMBAFFで構成されている場合の復号化の順序を示す図である。
ピクチャがMBAFFで構成されている場合、MBラインペアは、上述のように、ピクチャの左端から右端まで水平方向に配列された複数のマクロブロックからなる列(MBライン)を2つ有する構成単位である。MBラインペアは、上下にある2つのマクロブロック(マクロブロックペア)ごとに、適応的にフレーム/フィールド符号化されている。なお、マクロブロックペアでは、まず上のマクロブロックが復号化され、次に、下のマクロブロックが復号化される。この場合にも、ピクチャがMBAFFで構成されていない場合と同様に、第1デコードエンジン120は第0MBラインペアを復号化し、第2デコードエンジン120が第1MBラインペアを復号化し、第3デコードエンジン120が第2MBラインペアを復号化し、第4デコードエンジン120が第3MBラインペアを復号化する。なお、第k(kは0以上の整数)MBラインペアは、ピクチャの上端からk番目にある2つのMBラインからなる構成単位を示し、例えば、第0MBラインペアは、ピクチャの上端から0番目にある2つのMBラインからなる構成単位である。
ここで、ピクチャの復号化が開始されるときには、まず、第1デコードエンジン120が第0MBラインペアの復号化を開始する。次に、第0MBラインペアの左端にある2つのマクロブロックペアの復号化が完了すると、第2デコードエンジン120が第1MBラインペアの左上端のマクロブロックの復号化を開始する。そして、第1MBラインペアの左端にある2つのマクロブロックペアの復号化が完了すると、第3デコードエンジン120が第2MBラインペアの左上端のマクロブロックの復号化を開始する。同様に、第2MBラインペアの左端にある2つのマクロブロックペアの復号化が完了すると、第4デコードエンジン120が第3MBラインペアの左上端のマクロブロックの復号化を開始する。
したがって、第(k+1)MBラインペアは、第kMBラインペアに比べて、2マクロブロックペア分だけ遅れて、左端のマクロブロックペアから右端のマクロブロックペアまで復号化される。
なお、ピクチャがMBAFFで構成されていない場合、および、ピクチャがMBAFFで構成されている場合のそれぞれにおいて、第(k+1)MBラインまたは第(k+1)MBラインペアは、第kMBラインまたは第kMBラインペアに比べて、少なくとも2マクロブロック分または2マクロブロックペア分だけ遅れて復号化されればよい。つまり、3マクロブロック分または3マクロブロックペア分以上遅れて復号化されてもよい。例えば、第(k+1)MBラインまたは第(k+1)MBラインペアが、第kMBラインまたは第kMBラインペアに比べて、2マクロブロック分または2マクロブロックペア分だけ遅れて復号化される場合には、ピクチャの復号化にかかる時間を最短にすることができ、3マクロブロック分または3マクロブロックペア分以上遅れて復号化される場合には、その遅れる分量に応じてピクチャの復号化にかかる時間が長くなる。
このような本実施の形態における画像復号化装置100の特徴は、ストリーム分割部130による分割によって生成された、スライスの1つまたは複数の部分(スライス部分)からなるスライス部分群を1つの新たなスライスとして再構成することである。スライスの再構成は、スライスヘッダの挿入処理、スライス終端処理、MBアドレス情報の更新処理、スキップラン修正処理、およびQPデルタ設定処理を含む。また、QPデルタ設定処理は、QPデルタ修正処理およびQPデルタ挿入処理を含む。なお、本実施の形態では、QPデルタ設定処理がQPデルタ修正処理である場合について説明する。
図3は、スライスヘッダの挿入処理を説明するための説明図である。
例えば、M個のストリーム分割部130は、図3の(a)に示すピクチャp1を分割する。なお、以下の説明では、M個のストリーム分割部130の全体を、ストリーム分割部群130aという。上述のように、本実施の形態では、ストリーム分割制御部140による振り分けの単位である処理対象領域をスライスとして説明する。したがって、ピクチャp1が複数のスライスから構成されている場合には、各ストリーム分割部130がピクチャp1に含まれるスライスを分割する。その結果、M個のストリーム分割部130の全体であるストリーム分割部群130aが、以下に説明するように、ピクチャp1を分割することになる。なお、ストリーム分割制御部140による振り分けの単位である処理対象領域がピクチャである場合には、1つのストリーム分割部130が、以下に説明するように、ピクチャp1を分割することになる。
ピクチャp1は、スライスA、スライスBおよびスライスCから構成されているとともに、MBラインL1〜L12から構成されている。
スライスAは、MBラインL1〜L7にわたって配置され、スライスヘッダhaと、そのスライスヘッダhaから連続して配置されている複数のマクロブロックmbaとを有する。スライスBは、MBラインL7〜L8にわたって配置され、スライスヘッダhbと、そのスライスヘッダhbから連続して配置されている複数のマクロブロックmbbとを有する。スライスCは、MBラインL9〜L12にわたって配置され、スライスヘッダhcと、そのスライスヘッダhcから連続して配置されている複数のマクロブロックmbcとを有する。なお、スライスヘッダには、そのスライスヘッダを有するスライスの復号化に必要な補助情報が含まれている。
ストリーム分割部群130aは、図3の(b)に示すように、上述のピクチャp1をMBラインごとに分割する。そして、ストリーム分割部群130aは、MBラインL1〜L12のそれぞれを先頭から順に、第1分割ストリーム〜第4分割ストリームの何れかの一部に割り当てる。例えば、ストリーム分割部群130aは、MBラインL1を第1分割ストリームの一部に割り当て、MBラインL2を第2分割ストリームの一部に割り当て、MBラインL3を第3分割ストリームの一部に割り当て、MBラインL4を第4分割ストリームの一部に割り当てる。そして、ストリーム分割部群130aは、第4分割ストリームへのMBラインの割り当てが終了すると、第1分割ストリームへのMBラインの割り当てを繰り返す。つまり、ストリーム分割部群130aは、MBラインL5を第1分割ストリームの一部に割り当て、MBラインL6を第2分割ストリームの一部に割り当て、MBラインL7を第3分割ストリームの一部に割り当て、MBラインL8を第4分割ストリームの一部に割り当てる。
その結果、第1分割ストリームは連続するMBラインL1、L5、L9を含み、第2分割ストリームは連続するMBラインL2、L6、L10を含み、第3分割ストリームは連続するMBラインL3、L7、L11を含み、第4分割ストリームは連続するMBラインL4、L8、L12を含む。
なお、MBラインL1〜L6と、MBラインL7の先頭側の6マクロブロックからなる集合と、MBラインL7の終端側の10マクロブロックからなる集合と、MBラインL8〜L12とは、それぞれスライスA〜Cの一部を構成するスライス部分である。そして、第1分割ストリームでは、スライスAのスライス部分であるMBラインL1、L5からスライス部分群(第1分割ストリームにおけるスライスA)が構成される。また、第2分割ストリームでは、スライスBのスライス部分であるMBラインL2、L6からスライス部分群(第2分割ストリームにおけるスライスB)が構成される。
ここで、単純にMBラインを分割ストリームに割り当てるだけでは、分割ストリームに含まれるスライスを適切にデコードエンジン120に認識させることができない場合がある。
例えば、第1分割ストリームには、上述のように連続するMBラインL1、L5、L9が含まれている。この場合、MBラインL1、L5はスライスAとして認識されるべきであり、MBラインL9はスライスCとして認識されるべきである。そのためには、第1分割ストリームにおいてスライスAの先頭となるべきMBラインL1の先頭にスライスAのスライスヘッダhaが配置されている必要があり、第1分割ストリームにおいてスライスCの先頭となるべきMBラインL9の先頭にスライスCのスライスヘッダhcが配置されている必要がある。図3に示す例では、スライスヘッダha、hcがそれぞれMBラインL1、L9の先頭に予め配されているため、ストリーム分割部群130aはMBラインL1、L5、L9をスライスヘッダha、hcとともに第1分割ストリームに割り当てればよい。
一方、第2分割ストリームには、上述のように連続するMBラインL2、L6、L10が含まれている。この場合、MBラインL2、L6はスライスAとして認識されるべきであり、MBラインL10はスライスCとして認識されるべきである。そのためには、第2分割ストリームにおいてスライスAの先頭となるべきMBラインL2の先頭にスライスAのスライスヘッダhaが配置されている必要があり、第2分割ストリームにおいてスライスCの先頭となるべきMBラインL10の先頭にスライスCのスライスヘッダhcが配置されている必要がある。
そこで、本実施の形態におけるストリーム分割部群130aは、MBラインを分割ストリームの一部に割り当てるときには、必要に応じてスライスヘッダha、hb、hcを複製することにより複製スライスヘッダha’、hb’、hc’を生成し、それらを分割ストリームに挿入する。
例えば、ストリーム分割部群130aは、スライスヘッダhaを複製することにより3つの複製スライスヘッダha’を生成し、その複製スライスヘッダha’をMBラインL2、L3、L4の直前に挿入する。さらに、ストリーム分割部群130aは、スライスヘッダhbを複製することにより1つの複製スライスヘッダhb’を生成し、その複製スライスヘッダhb’をMBラインL8の直前に挿入する。さらに、ストリーム分割部群130aは、スライスヘッダhcを複製することにより3つの複製スライスヘッダhc’を生成し、その複製スライスヘッダhc’をMBラインL10、L11、L12の直前に挿入する。
その結果、第2分割ストリームでは、スライスAの先頭となるMBラインL2の直前に、スライスAのスライスヘッダhaの複製である複製スライスヘッダha’が配置され、スライスCの先頭となるMBラインL10の直前に、スライスCのスライスヘッダhcの複製である複製スライスヘッダhc’が配置される。これにより、第2デコードエンジン120は、複製スライスヘッダha’、hc’から、第2分割ストリームのスライスAおよびスライスCのそれぞれの復号化に必要なパラメータを得ることができる。
次に、MBアドレス情報の更新処理について説明する。
ストリーム分割部群130aは、上述のように複製スライスヘッダを分割ストリームに挿入するときには、挿入される位置に応じて、複製スライスヘッダに含まれているMBアドレス情報を更新する。
つまり、符号化ストリームに含まれるピクチャを構成する各スライスのスライスヘッダには、そのスライスの先頭マクロブロックの上記ピクチャ内におけるアドレスを特定するためのMBアドレス情報“first_mb_in_slice”が含まれている。したがって、このようなスライスヘッダが複製されることによって生成された複製スライスヘッダには、当初、複製元のスライスヘッダのMBアドレス情報と同一のMBアドレス情報が含まれている。その結果、このような複製スライスヘッダが、ピクチャ内において複製元のスライスヘッダと異なる位置に挿入されれば、その複製スライスヘッダのMBアドレス情報により特定されるアドレスは、誤ったアドレスを指し示していることになる。つまり、複製スライスヘッダのMBアドレス情報により特定されるアドレスは、分割ストリームにおいてその複製スライスヘッダを有するスライスの先頭マクロブロックの上記ピクチャ内におけるアドレスを指し示さず、複製元のスライスヘッダを有するスライスの先頭マクロブロックのアドレスを指し示している。
例えば、ピクチャp1のスライスAのスライスヘッダhaには、そのスライスAの先頭マクロブロック(MBラインL1の先頭マクロブロック)のピクチャp1内におけるアドレスを示すMBアドレス情報が含まれている。このようなスライスヘッダhaが複製されることによって生成された複製スライスヘッダha’には、当初、MBラインL1の先頭マクロブロックのピクチャp1内におけるアドレスを特定するためのMBアドレス情報が含まれている。その結果、このような複製スライスヘッダha’が、MBラインL2の直前に挿入されれば、その複製スライスヘッダha’のMBアドレス情報により特定されるアドレスは、第2分割ストリームにおいてその複製スライスヘッダha’を有するスライスAの先頭マクロブロック(MBラインL2の先頭マクロブロック)のピクチャp1内におけるアドレスを指し示さず、MBラインL1の先頭マクロブロックのアドレスを指し示している。
そこで、本実施の形態におけるストリーム分割部群130aは、上述のように、複製スライスヘッダに含まれているMBアドレス情報を更新する。
図4は、MBアドレス情報の更新処理を説明するための説明図である。
ストリーム分割部130は、まず、符号化ストリームに含まれているSPS(シーケンスパラメータセット)から、ピクチャの水平方向のマクロブロックの数に関連する情報である“pic_width_in_mbs_minus1”を取得する。
さらに、ストリーム分割部130は、複製元のスライスヘッダに含まれるMBアドレス情報“first_mb_in_slice”を用いて、その複製元のスライスヘッダを有するスライスの先頭マクロブロックのアドレスを算出する。
次に、ストリーム分割部130は、算出された先頭マクロブロックのアドレスに基づいて、その先頭マクロブロックがピクチャ内において何行目のMBラインにあるかを示す値“mbposv”を算出する。なお、値“mbposv”は0以上の整数である。
そして、ストリーム分割部130は、直前に複製スライスヘッダが挿入されるMBラインが、複製元のスライスヘッダが配置されているMBラインから見てn行離れているときには、複製スライスヘッダのMBアドレス情報を“first_mb_in_slice[n]”=(“mbposv”+n)×(“pic_width_in_mbs_minus1”+1)により算出する。
なお、ピクチャがMBAFF(マクロブロックアダプティブフレームフィールド)で構成されている場合には、ストリーム分割部130は、複製スライスヘッダのMBアドレス情報を“first_mb_in_slice[n]”=(“mbposv”/2+n)×(“pic_width_in_mbs_minus1”+1)により算出する。
ストリーム分割部130は、複製スライスヘッダに当初含まれているMBアドレス情報を、上述のように算出されたMBアドレス情報に更新する。これにより、複製スライスヘッダのMBアドレス情報により特定されるアドレスは、分割ストリームにおいてその複製スライスヘッダを有するスライスの先頭マクロブロックのピクチャ内におけるアドレスを正しく指し示す。
次に、スライス終端処理について説明する。
符号化ストリームに含まれるピクチャを構成する各スライスの終端には、そのスライスの終端であることを示すスライス終端情報が設定されている。したがって、図3に示すように、単純に、ピクチャが複数のMBラインに分割され、その複数のMBラインがそれぞれ第1分割ストリーム〜第4分割ストリームの何れかの一部に割り当てられる場合には、分割ストリームに含まれるスライスの終端を適切にデコードエンジン120に認識させることができない場合がある。
そこで、本実施の形態におけるストリーム分割部130は、スライスヘッダの挿入処理と同様に、スライス終端処理も実行する。
図5は、スライス終端処理を説明するための説明図である。
例えば、図5の(a)に示すように、符号化ストリームのピクチャp1に含まれるスライスCは、スライスヘッダhcと、MBラインL9〜L12と、スライス終端情報ecとを含んでいる。
ストリーム分割部群130aはピクチャp1をMBラインごとに分割する。その結果、図5の(b)〜(e)に示すように、1つのストリーム分割部130によって、MBラインL9はスライスヘッダhcと共に第1分割ストリームに割り当てられ、MBラインL10は第2分割ストリームに割り当てられ、MBラインL11は第3分割ストリームに割り当てられ、MBラインL12は第4分割ストリームに割り当てられる。
さらに、ストリーム分割部130は、上述のスライスヘッダの挿入処理により、スライスヘッダhcを複製して3つの複製スライスヘッダhc’を生成し、それらの3つの複製スライスヘッダhc’をそれぞれ、第2分割ストリーム〜第4分割ストリームのMBラインL10、L11、L12の直前に挿入する。また、ストリーム分割部130は、上述のMBアドレス情報の更新処理により、挿入される複製スライスヘッダhc’の位置に応じて、その複製スライスヘッダhc’に含まれるMBアドレス情報を更新する。
ここで、ストリーム分割部130は、スライス終端処理として、第1分割ストリームにおけるスライスC(MBラインL9)の終端、第2分割ストリームにおけるスライスC(MBラインL10)の終端、第3分割ストリームにおけるスライスC(MBラインL11)の終端、および第4分割ストリームにおけるスライスC(MBラインL12)の終端を示すスライス終端情報ec’を生成する。そして、ストリーム分割部130は、その生成されたスライス終端情報ec’を、第1分割ストリーム〜第4分割ストリームのMBラインL9、L10、L11、L12の直後に設定する。なお、ストリーム分割部130は、符号化ストリームをMBラインごとに分割するときには、その符号化ストリームに元々含まれているスライス終端情報ecを破棄している。また、スライス終端情報ecとスライス終端情報ecとが同一の情報であれば、最終的には、MBラインL12はスライス終端情報ec’(ec)と共に第4分割ストリームに割り当てられることになる。
これにより、各デコードエンジン120は、分割ストリームに含まれるスライスの終端を適切に認識することができる。
次に、ストリーム分割制御部140によって行われる、符号化ストリームに含まれるスライスの振り分け処理について説明する。
ここまでで説明したように、本実施の形態における画像復号化装置100は、M個のストリーム分割部130と、N個のデコードエンジン120とを備えており、符号化ストリームの復号化処理を並列化している。このように、システム全体における並列処理を可能とすることにより、復号化処理全体の性能向上を実現している。
ここで、M個のストリーム分割部130のそれぞれは、符号化ストリームに含まれる符号化ピクチャのスライスを所定の単位(処理対象領域)として1つまたは複数のMBラインに分割するが、スライスの大きさは一定ではないため、その処理量はスライス毎に変動する。
また、全てのスライスの大きさが一定であるようなシステムであっても、処理の対象は符号化されたストリームであるため、その処理量はスライス毎の符号量に依存する。一般的な動画像符号化方式では、符号化ストリームは可変長符号化されており、データの内容に応じて符号量が変動する。また、H.264/AVC方式におけるスライスには、Iスライス、Pスライス、Bスライスなどと呼ばれる種類がある。画面内符号化処理が行われるIスライスでは符号量が多く、画面内符号化処理に加えて画面間符号化処理が行われるPスライスと、Bスライスでは符号量が少なくなる傾向がある。このように、符号化ストリームに含まれる符号化スライスの符号量は一定ではなく、大きく変動しうる。そのため、入力される符号化されたスライスを順番にM個のストリーム分割部130のそれぞれに振り分けるだけでは各ストリーム分割部130の処理量が均等にならず、並列化による処理性能向上の効果が十分に得られない。
そこで、ストリーム分割制御部140は、各ストリーム分割部130の処理量が均等になるように、各スライスをストリーム分割部130のそれぞれに対して振り分ける。
図6Aおよび図6Bは、ストリーム分割制御部140によるスライスの振り分け処理の具体例を示す説明図である。なお、本実施の形態では、説明を簡単にするために、以下、MをM=2として説明する。
図6Aは、H.264/AVC方式の符号化ストリームの一例を示す図である。この例における符号化ストリームは、SPS(シーケンスパラメータセット)、PPS(ピクチャパラメータセット)、およびピクチャを構成するスライスデータ(スライス)から構成されている。ピクチャ0はスライス0のみから構成される。ピクチャ1はスライス1およびスライス2から構成される。ピクチャ2はスライス3およびスライス4から構成される。
図6A中の矢印は、スライスデータとPPSの参照関係、およびPPSとSPSの参照関係を示しており、例えばスライス0は、PPS0に含まれるヘッダ情報を用いて復号化され、スライス1とスライス2は、PPS1に含まれるヘッダ情報を用いて復号化される。また、ストリームのシーケンス情報を含むSPSは、PPS0〜2によって参照される。つまり、図6Aに示したSPSは、スライス0〜スライス4の全てのスライスの復号化に利用される。
このように、H.264/AVC方式では、複数のスライスが同一のヘッダ情報(SPS、PPS)を参照することがあり得る。従って、M個のストリーム分割部130のそれぞれに対してストリーム分割処理を振り分ける場合、SPSやPPSなどのヘッダ情報は、すべてのストリーム分割部130で等しく復号化されて解析処理される必要がある。
図6Bは、ストリーム分割制御部140による一連のスライスの振り分け処理を示す図である。処理の開始時点で、各ストリーム分割部130は、これから処理するスライスの番号を保持している。例えば、第1ストリーム分割部130はこれから処理するスライスの番号の初期値としてSN1=0を保持し、第2ストリーム分割部130はこれから処理するスライスの番号の初期値としてSN2=0を保持している。
タイミングt0で、第1ストリーム分割部130および第2ストリーム分割部130はどちらもストリーム分割処理をしていないため、ストリーム分割制御部140は、振り分け制御情報を送信することにより、第1ストリーム分割部130に対してスライス0の復号化を通知し、第2ストリーム分割部130に対してスライス1の復号化を通知する。
第1ストリーム分割部130は、ストリーム分割制御部140からスライス0の復号化を通知されると、復号化を通知されたスライスのスライス番号と、これから処理するスライスの番号として保持しているSN1の値とを比較する。このタイミングでは、両者は0で一致しているため、第1ストリーム分割部130は、最初に入力されるスライスに対してストリーム分割処理を行う。
具体的には、第1ストリーム分割部130は、まずSPSを復号化して解析し、ストリーム分割処理に必要な各種パラメータを抽出するとともに、振り分け制御情報により通知されたスライスのスライス番号とSN1の値とが一致しているため、入力されたSPSを第1分割ストリームバッファ152に対してそのまま出力する。次に、第1ストリーム分割部130は、PPS0を復号化して解析し、ストリーム分割処理に必要な各種パラメータを抽出するとともに、同様に、入力されたPPS0を第1分割ストリームバッファ152に対してそのまま出力する。次に、第1ストリーム分割部130は、スライス0に対してストリーム分割処理を行うとともに、生成したN個の分割ストリームを第1分割ストリームバッファ152に対して出力する。
一方、第2ストリーム分割部130は、振り分け制御情報により、ストリーム分割制御部140からスライス1の復号化を通知されると、復号化を通知されたスライスのスライス番号と、これから処理するスライスの番号として保持しているSN2の値とを比較する。このタイミングでは、復号化を通知されたスライスのスライス番号は1を示し、SN2は0を示しており、その差分は1である。そこで、第2ストリーム分割部130は、入力される1スライス分の処理をスキップし、2番目に入力されるスライスに対してストリーム分割処理を行う。つまり、第2ストリーム分割部130は、差分の数だけのスライスに対するストリーム分割処理をスキップする。
具体的には、第2ストリーム分割部130は、まずSPSを復号化して解析し、ストリーム分割処理に必要な各種パラメータを抽出する。ここで、第2ストリーム分割部130は、復号化を通知されたスライスのスライス番号とSN2の値とが一致していないため、第2分割ストリームバッファ152に対するSPSの出力を行わない。次に、第2ストリーム分割部130は、PPS0を復号化して解析し、ストリーム分割処理に必要な各種パラメータを抽出するが、同様に、第2分割ストリームバッファ152に対するPPS0の出力を行わない。次に、第2ストリーム分割部130は、入力されるスライス0に対するストリーム分割処理をスキップする。したがって、第2ストリーム分割部130は、第2分割ストリームバッファ152に対して、スライス0のストリーム分割処理の結果を出力しない。なお、ストリーム分割処理のスキップは、符号化データに付随するスタートコードを探索することで行われる。ここで、第2ストリーム分割部130は、スライス0の処理をスキップしたことで、SN2をインクリメントしてSN2=1とする。
ここで、第2ストリーム分割部130がSPSおよびPPS0を第2分割ストリームバッファ152に出力しないのは、N個のデコードエンジン120にて、同じヘッダ情報を重複して受信しないようにするためである。すなわち、SPSおよびPPS0は、第1ストリーム分割部130により、第1分割ストリームバッファ152に対して出力されるため、SPSおよびPPS0の第2ストリーム分割部130からの出力は抑止されている。
次に、第2ストリーム分割部130は、PPS1を復号化して解析し、ストリーム分割処理に必要な各種パラメータを抽出するとともに、復号化を通知されたスライスのスライス番号とSN2の値とが一致しているため、入力されたPPS1を第2分割ストリームバッファ152に対してそのまま出力する。次に、第2ストリーム分割部130は、スライス1に対してストリーム分割処理を行うとともに、生成したN個の分割ストリームを第2分割ストリームバッファ152に対して出力する。
タイミングt1では、第2ストリーム分割部130によるスライス1に対するストリーム分割処理が終了するため、第2ストリーム分割部130は、ストリーム分割制御部140に対して処理の完了を通知するとともに、第2分割ストリームバッファ152に出力した分割ストリームの情報を通知する。具体的には、第2ストリーム分割部130は、実際に分割ストリームバッファ152に出力したPPS1およびスライス1のそれぞれを構成するNALユニットの個数を通知する。NALユニットは、H.264/AVC方式のストリームを構成する構成単位であり、SPS、PPS、およびスライスなどはそれぞれ、このNALユニットに含まれる。
なお、スライスの大きさは可変であるため、スライスに含まれるMBライン数が分割ストリーム数であるNに満たないこともあり得る。そのため、ストリーム分割部130で処理されたスライスに対応するNALユニットの個数は、生成するN個の分割ストリームごとに異なり、その値は0または1となる。従って、ストリーム分割部130は、ストリーム分割制御部140に対して、N個の分割ストリームごとに出力したNALユニットの個数を通知する。
なお、図6Bで示す動作例では、説明を簡単にするため、各スライスが含むMBライン数はNよりも十分大きいものとし、1スライスに対応するNALユニットの個数は、分割ストリームによらず1であるものして説明する。ここでは、第2ストリーム分割部130は、PPS1とスライス1で合計2個のNALユニットを処理したことをストリーム分割制御部140に対して通知する。同時に第2ストリーム分割部130は、スライス1に対するストリーム分割処理が終了したことで、SN2をインクリメントしてSN2=2とする。第2ストリーム分割部130から処理完了の通知を受けたストリーム分割制御部140は、第2ストリーム分割部130に対してスライス2の復号化を通知する。
第2ストリーム分割部130は、ストリーム分割制御部140からスライス2の復号化を通知されると、復号化を通知されたスライスのスライス番号と、これから処理するスライスの番号として保持しているSN2の値とを比較する。このタイミングでは、両者は2で一致しているため、第2ストリーム分割部130は最初に入力されるスライスに対してストリーム分割処理を行う。
具体的には、第2ストリーム分割部130は、スライス2に対してストリーム分割処理を行うとともに、復号化を通知されたスライスのスライス番号とSN2の値とが一致しているため、生成したN個の分割ストリームを第2分割ストリームバッファ152に対して出力する。
タイミングt2では、第1ストリーム分割部130によるスライス0に対するストリーム分割処理が終了するため、第1ストリーム分割部130は、ストリーム分割制御部140に対して処理の完了を通知するとともに、第1分割ストリームバッファ152に出力した分割ストリームの情報として、SPS、PPS0およびスライス0のそれぞれを構成するNALユニットの個数「3」を通知する。同時に、第1ストリーム分割部130は、スライス0に対するストリーム分割処理が終了したことで、SN1をインクリメントしてSN1=1とする。第1ストリーム分割部130から処理完了の通知を受けたストリーム分割制御部140は、振り分け制御情報により、第1ストリーム分割部130に対してスライス3の復号化を通知する。
第1ストリーム分割部130は、ストリーム分割制御部140からスライス3の復号化を通知されると、復号化を通知されたスライスのスライス番号と、これから処理するスライスの番号として保持しているSN1の値とを比較する。このタイミングでは、通知されたスライスのスライス番号は3を示し、SN2は1を示しており、その差分は2である。そこで、第1ストリーム分割部130は、入力される2スライス分の処理をスキップし、3番目に入力されるスライスに対してストリーム分割処理を行うように動作する。
具体的には、第1ストリーム分割部130は、まずPPS1を復号化して解析し、ストリーム分割処理に必要な各種パラメータを抽出するが、復号化を通知されたスライスのスライス番号とSN1の値とが一致していないため、第1分割ストリームバッファ152に対するPPS1の出力を行わない。次に、第1ストリーム分割部130は、入力されるスライス1の処理をスキップする。したがって、第1ストリーム分割部130は、第1分割ストリームバッファ152に対して、スライス1のストリーム分割処理の結果を出力しない。ここで、第1ストリーム分割部130は、スライス1の処理をスキップしたことで、SN1をインクリメントしてSN1=2とする。次に、第1ストリーム分割部130にはスライス2が入力されるが、復号化を通知されたスライスのスライス番号とSN1の値とがまだ一致していないため、入力されるスライス2の処理もスキップされる。したがって、第1ストリーム分割部130は、第1分割ストリームバッファ152に対して、スライス2のストリーム分割処理の結果を出力しない。ここで、第1ストリーム分割部130は、スライス2の処理をスキップしたことで、SN1をインクリメントしてSN1=3とする。
次に、第1ストリーム分割部130は、PPS2を復号化して解析し、ストリーム分割処理に必要な各種パラメータを抽出するとともに、復号化を通知されたスライスのスライス番号とSN1の値とが一致しているため、入力されたPPS2を第1分割ストリームバッファ152に対してそのまま出力する。次に、第1ストリーム分割部130は、スライス3に対してストリーム分割処理を行うとともに、生成したN個の分割ストリームを第1分割ストリームバッファ152に対して出力する。
タイミングt3では、第2ストリーム分割部130によるスライス2に対するストリーム分割処理が終了するため、第2ストリーム分割部130は、ストリーム分割制御部140に対して処理の完了を通知するとともに、第2分割ストリームバッファ152に出力した分割ストリームの情報として、スライス2を構成するNALユニットの個数「1」を通知する。同時に、第2ストリーム分割部130は、スライス2に対するストリーム分割処理が終了したことで、SN2をインクリメントしてSN2=3とする。第2ストリーム分割部130から処理完了の通知を受けたストリーム分割制御部140は、振り分け制御情報により、第2ストリーム分割部130に対してスライス4の復号化を通知する。
第2ストリーム分割部130は、ストリーム分割制御部140からスライス4の復号化を通知されると、復号化を通知されたスライスのスライス番号と、これから処理するスライスの番号として保持しているSN2の値とを比較する。このタイミングでは、復号化を通知されたスライスのスライス番号は4を示し、SN2は3を示しており、その差分は1である。そこで、第2ストリーム分割部130は入力される1スライス分の処理をスキップし、2番目に入力されるスライスに対してストリーム分割処理を行う。
具体的には、第2ストリーム分割部130は、まずPPS2を復号化して解析し、ストリーム分割処理に必要な各種パラメータを抽出するが、復号化を通知されたスライスのスライス番号とSN2の値とが一致していないため、第2分割ストリームバッファ152に対するPPS2の出力は行わない。次に、第2ストリーム分割部130は、入力されるスライス3の処理をスキップする。したがって、第2ストリーム分割部130は、第2分割ストリームバッファ152に対して、スライス3のストリーム分割処理の結果を出力しない。ここで、第2ストリーム分割部130は、スライス3の処理をスキップしたことで、SN2をインクリメントしてSN2=4とする。
次に、第2ストリーム分割部130は、復号化を通知されたスライスのスライス番号とSN2の値とが一致しているため、スライス4に対してストリーム分割処理を行うとともに、生成したN個の分割ストリームを第2分割ストリームバッファ152に対して出力する。
タイミングt4では、第1ストリーム分割部130によるスライス3に対するストリーム分割処理が終了するため、第1ストリーム分割部130は、ストリーム分割制御部140に対して処理の完了を通知するとともに、第1分割ストリームバッファ152に出力した分割ストリームの情報として、PPS2およびスライス3のそれぞれを構成するNALユニットの個数「2」を通知する。同時に、第1ストリーム分割部130は、スライス3に対するストリーム分割処理が終了したことで、SN1をインクリメントしてSN1=4とする。
同様に、タイミングt5では、第2ストリーム分割部130によるスライス4に対するストリーム分割処理が終了するため、第2ストリーム分割部130は、ストリーム分割制御部140に対して処理の完了を通知するとともに、第2分割ストリームバッファ152に出力した分割ストリームの情報として、スライス4を構成するNALユニットの個数「1」を通知する。同時に、第2ストリーム分割部130は、スライス4に対するストリーム分割処理が終了したことで、SN2をインクリメントしてSN2=5とする。
以上説明したように、ストリーム分割制御部140は、処理を完了したストリーム分割部130に対して順次スライスの復号化処理(ストリーム分割処理)を振り分けていく。これにより、各ストリーム分割部130の処理量が均等になる。
図7は、図6Bで示したスライスの振り分け、およびストリーム分割処理を行った場合における分割ストリームバッファ152の状態を示す図である。なお、図7に示すスライス0〜4はそれぞれスライスの一部分のデータを示す。
第1分割ストリームバッファ152には、スライス0およびスライス3に対応するN(N=4)個の分割ストリームが格納される。また、第2分割ストリームバッファ152には、スライス1、スライス2およびスライス4に対応するN(N=4)個の分割ストリームが格納される。このように、2つの分割ストリームバッファ152には各ストリーム分割部130における処理量に応じてスライスが分散して格納されるため、各スライスの格納順序は一定とはならない。
そのためストリーム分割制御部140は、N個のデコードエンジン120がそれぞれ、分割前の符号化ストリームと同じスライス順で分割ストリームを取得できるよう、M個の分割ストリームバッファ152のうち、どの分割ストリームバッファから分割ストリームを取得すればよいかを示す選択情報を、N個のデコードエンジン120に通知する。
図8は、図6Bで示したスライスの振り分け、およびストリーム分割処理を行った場合における選択情報の形式の一例を示す図である。
図8に示すように、選択情報は、1スライスにつき、分割ストリームバッファ情報と、NALユニット数情報とを含んでおり、ストリーム分割制御部140によるスライスの振り分け処理を行う毎に生成される。分割ストリームバッファ情報は、ストリーム分割制御部140が、第1ストリーム分割部130と第2ストリーム分割部130のどちらにスライスを振り分けたかを示す。つまり、分割ストリームバッファ情報は、ストリーム分割部130がスライスに対してストリーム分割処理を行った結果、そのスライスに対してストリーム分割部130から出力された分割ストリームが格納されている分割ストリームバッファを示す。また、NALユニット数情報は、ストリーム分割部130において、対象となるスライスの処理を行った際に出力されたNALユニット個数を示しており、ストリーム分割部130の処理完了時に、ストリーム分割部130からストリーム分割制御部140に対して通知される。
なお、前述のように、NALユニット数情報はN個の分割ストリームごとに異なる可能性がある。したがって、N個のデコードエンジン120のそれぞれに対して、N個の分割ストリームに対応する別々の内容の選択情報が通知される。すなわち、第1デコードエンジンには、第1分割ストリームに対応する選択情報が通知され、第2デコードエンジンには、第2分割ストリームに対応する選択情報が通知され、第3デコードエンジンには、第3分割ストリームに対応する選択情報が通知され、第4デコードエンジンには、第4分割ストリームに対応する選択情報が通知される。ここでは前述のように、各スライスに含まれるMBライン数はNよりも十分大きく、1スライスに対応するNALユニットの個数は分割ストリームによらず1であるとしているため、N個のデコードエンジン120に対して通知される選択情報は同じであるものとして説明する。
ストリーム分割制御部140によって生成された選択情報は、N個のデコードエンジン120に対して通知され、例えばデコードエンジン120内のFIFO(先入れ先出し)メモリに格納される。FIFOに格納された選択情報は、通知された順番にデコードエンジン120によって読み出され、分割ストリームバッファ152からのストリーム取得処理に利用される。
具体的には、まずデコードエンジン120は、スライス0の選択情報として、分割ストリームバッファ情報=1およびNALユニット数情報=3を読み出す。デコードエンジン120はスライス0の選択情報に従い、第1分割ストリームバッファ152から、3個のNALユニット(SPS、PPS0、スライス0)を取得する。次に、デコードエンジン120は、スライス1の選択情報として、分割ストリームバッファ情報=2およびNALユニット数情報=2を読み出す。デコードエンジン120はスライス1の選択情報に従い、第2分割ストリームバッファ152から、2個のNALユニット(PPS1、スライス1)を取得する。次に、デコードエンジン120は、スライス2の選択情報として、分割ストリームバッファ情報=2およびNALユニット数情報=1を読み出す。デコードエンジン120はスライス2の選択情報に従い、第2分割ストリームバッファ152から、1個のNALユニット(スライス2)を取得する。次に、デコードエンジン120は、スライス3の選択情報として、分割ストリームバッファ情報=1およびNALユニット数情報=2を読み出す。デコードエンジン120はスライス3の選択情報に従い、第1分割ストリームバッファ152から、2個のNALユニット(PPS2、スライス3)を取得する。次に、デコードエンジン120は、スライス4の選択情報として、分割ストリームバッファ情報=2およびNALユニット数情報=1を読み出す。デコードエンジン120はスライス4の選択情報に従い、第2分割ストリームバッファ152から、1個のNALユニット(スライス4)を取得する。
このように、デコードエンジン120は、ストリーム分割制御部140から通知される選択情報を用いることで、デコーダ110に入力された符号化ストリームと同じスライス順序で、M個の分割ストリームバッファ152から分割ストリーム(分割ストリームのスライス)を取得することが出来る。
なお、図6A〜図8を用いて説明したスライスの振り分け処理は、本発明の画像復号化装置100の処理動作の一例であって、本発明は、ここで説明した処理動作に限定されない。
例えば、図6Bでは、ストリーム分割制御部140が、ストリーム分割部130に対してスライスの復号化を通知する際にスライス番号を指定したが、スライス番号ではなく、処理をスキップするスライス数を指定してもよい。この場合、ストリーム分割制御部140は、M個のストリーム分割部130のそれぞれに対して振り分けたスライス数を記憶しておき、それをもとに処理をスキップするスライス数を計算する。また、図6Bでは、ストリーム分割部130によるスライスのストリーム分割処理が終了した際、ストリーム分割部130は、ストリーム分割制御部140に対して処理の完了および分割ストリームバッファ152に出力したNALユニットの個数を通知したが、分割ストリームバッファ152に出力したNALユニットの個数の代わりに、分割ストリームバッファ152に出力した分割ストリームのビット数を通知してもよい。つまり、デコードエンジン120が分割ストリームバッファ152から取得すべき分割ストリームのサイズが判定可能な情報を通知できればよい。
また、例えば、図8では、分割ストリームバッファ情報は、分割ストリームバッファ152の番号を直接指定するものとしたが、その番号と異なる情報であってもよい。つまり、M=2の場合には、分割ストリームバッファ情報は、処理対象のスライスに対応する分割ストリームが格納されている分割ストリームバッファ152が、直前のスライスに対応する分割ストリームが格納されていた分割ストリームバッファ152と同じであるかどうかを示す情報であってもよい。すなわち分割ストリームバッファ情報は、複数の分割ストリームバッファ152から適切に分割ストリームを取得できる情報であればよい。また、例えば図8では、選択情報はNALユニット数情報を含むものとしたが、前述したように、NALユニット数情報の代わりに分割ストリームのビット数を示す情報を含むものとしてもよい。
図9は、本実施の形態における画像復号化装置100の全体的な動きを示すフローチャートである。
まず、画像復号化装置100は、符号化ストリームを取得し(ステップS10)、その符号化ストリームから処理対象となる符号化されたピクチャを特定するとともに、ストリーム分割を並列処理するため、処理量が均等になるようにスライスを振り分ける(ステップS12)。さらに、画像復号化装置100は、処理対象のピクチャを分割することにより1つのMBラインを抽出する(ステップS14)。なお、MBラインの直前またはそのMBラインに属する2つのマクロブロック間にスライスヘッダがあれば、そのMBラインはそのスライスヘッダと共に抽出される。
次に、画像復号化装置100は、ステップS14の分割によって抽出された1つのMBラインを、生成対象となる第1〜第N分割ストリームの何れかに割り当てる前に、スライス再構成処理をする必要があるか否か(そのMBラインの直前にスライスヘッダを挿入する必要があるか否か、既に割り当てられているMBラインの直後にスライス終端情報を設定する必要があるか否か、MBスキップラン情報を修正する必要があるか否か、および、QP変化量を設定する必要があるか否か)を判別する(ステップS16)。
画像復号化装置100は、ステップS16で、スライス再構成処理をする必要があると判別したときには(ステップS16のYes)、スライス再構成処理を実行する(ステップS18)。つまり、画像復号化装置100は、上述のスライスヘッダの挿入処理、スライス終端処理、スキップラン修正処理およびQPデルタ設定処理の少なくとも1つを実行する。また、画像復号化装置100は、スライスヘッダの挿入処理を実行するときには、MBアドレス情報の更新処理も実行する。なお、ステップS14〜ステップS20のストリーム分割処理は、スライス単位で並列に行われる。
そして、画像復号化装置100は、そのMBラインを生成対象となる第1〜第N分割ストリームの何れかに割り当てる(ステップS20)。このステップS20が繰り返し行われることによって、第1〜第N分割ストリームのそれぞれにMBラインが順次割り当てられ、第1〜第N分割ストリームが生成される。
画像復号化装置100は、第1〜第N分割ストリームのそれぞれに割り当てられたMBラインを並列に復号化する(ステップS22)。なお、第1〜第N分割ストリームのうちの何れかの分割ストリームにMBラインが割り当てられていない場合には、画像復号化装置100は、そのMBラインが割り当てられていない分割ストリームを除く、残りの分割ストリームを復号化する。
次に、画像復号化装置100は、ピクチャに含まれる全てのMBラインを割り当てたか否かを判別し(ステップS24)、割り当てていないと判別したときには(ステップS24のNo)、ステップS14からの処理を繰り返し実行する。一方、画像復号化装置100は、全てのMBラインを割り当てたと判別したときには(ステップS24のYes)、さらに、符号化ストリームに含まれる全てのピクチャを分割したか否かを判別する(ステップS26)。ここで、画像復号化装置100は、全てのピクチャを分割していないと判別したときには(ステップS26のNo)、ステップS12からの処理を繰り返し実行し、全てのピクチャを分割したと判別したときには(ステップS26のYes)、復号化処理を終了する。
なお、図9のフローチャートに示される処理動作は、本発明の画像復号化装置100の処理動作の一例であって、本発明は、このフローチャートに示される処理動作に限定されない。
例えば、図9のフローチャートでは、画像復号化装置100のストリーム分割部130が、ステップS18のスライス再構成処理で、スライスヘッダの挿入処理を行うが、スライスヘッダの挿入処理を行うことなく、スライスヘッダを必要とするデコードエンジン120に複製スライスヘッダを直接渡してもよい。また、図9のフローチャートでは、ストリーム分割部130が、ステップS18のスライス再構成処理で、MBアドレス情報の更新処理を行うが、その更新処理を行わなくてもよい。この場合、例えば、デコードエンジン120が、分割ストリームに含まれている複製スライスヘッダのMBアドレス情報を更新する。また、図9のフローチャートでは、ストリーム分割部130が、ステップS18のスライス再構成処理で、スライス終端処理を行うが、そのスライス再構成処理で行わなくてもよい。この場合、例えば、ステップS20でMBラインが第1〜第N分割ストリームの何れかに割り当てられた後であって、次の新たなMBラインがストリーム分割部130からその何れかの分割ストリームに割り当てられる直前に、既に割り当てられているMBラインに対してスライス終端処理が行われてもよい。
ここで、ストリーム分割部130の構成および動作について詳細に説明する。
図10は、ストリーム分割部130の構成を示すブロック図である。
ストリーム分割部130は、処理管理部130m、セレクタSct、スタートコード検出部131、EPB除去部132a、EPB挿入部132b、スライスヘッダ挿入部133、およびスライスデータ処理部134a、134bを備えている。
処理管理部130mは、モード情報および振り分け制御情報を取得し、それらの情報にしたがって、ストリーム分割部130に備えられている他の構成要素を制御する。つまり、図6A〜図8に示すようなストリーム分割処理が行われるように、処理管理部130mは、例えば、これから処理するスライスの番号(SN1またはSN2など)を保持し、その番号に基づいてセレクタSctを制御する。その結果、処理管理部130mは、SPS、PPS、または、処理対処のスライスから生成された分割ストリームを出力させたり、その出力を停止させたりする。
スタートコード検出部131は、ストリームバッファ151から符号化ストリームを読み出して、NALユニットごとにスタートコードを検出する。
EPB除去部132aは、EPB(エミュレーション防止バイト)を符号化ストリームから除去し、EPBが除去された符号化ストリームをスライスデータ処理部134a、134bに出力する。さらに、EPB除去部132aは、符号化ストリームに含まれているSPS(シーケンスパラメータセット)およびPPS(ピクチャパラメータセット)などのスライスより上層の情報を取得し、その情報が4つの分割ストリームのそれぞれに挿入されるように、その情報をEPB挿入部132bに出力する。
EPB挿入部132bは、符号化ストリームが分割されることによって生成される分割ストリームに、EPB除去部132aによって除去されたEPBを挿入する。
スライスヘッダ挿入部133は、上述のスライスヘッダの挿入処理およびMBアドレス情報の更新処理を実行する。なお、スライスヘッダ挿入部133は、所定のタイミングで、スライスヘッダの挿入処理をするか否かを示すスライスヘッダ処理内容通知M1をスライスデータ処理部134a、134bに送り、スライスデータ処理部134a、134bから終端処理完了通知M2を受けたときに、スライスヘッダの挿入処理を実行する。そして、スライスヘッダ挿入部133は、スライスヘッダの挿入処理によって、MBラインの直前にあるスライスヘッダと、MBアドレス情報が更新された複製スライスヘッダとをEPB挿入部132bに出力する。
スライスデータ処理部134a、134bは、EPBが除去された符号化ストリームを分割することにより4つの分割ストリームを生成し、その4つの分割ストリームを出力する。なお、スライスデータ処理部134a、134bから出力される分割ストリームには、上述のMBラインの直前またはその中にあるスライスヘッダおよび複製スライスヘッダが含まれていない。ここで、スライスデータ処理部134aは、CAVLD(Context−Adaptive Variable Length Decoding)に応じた処理を実行し、CAVLC(Context−Adaptive Variable Length Coding)によって生成された符号化ストリームを4つの分割ストリームに分割する。また、スライスデータ処理部134bは、CABAD(Context−Adaptive Binary Arithmetic Decoding)に応じた処理を実行し、CABAC(Context−Adaptive Binary Arithmetic Coding)によって生成された符号化ストリームを4つの分割ストリームに分割する。
スライスデータ処理部134aは、スライスデータ層デコード部135a、マクロブロック層デコード部136a、スキップラン修正部137a、QPデルタ修正部138aおよび分割点検出部139aを備えている。
スライスデータ層デコード部135aは、符号化ストリームに含まれるスライスデータ層の符号化データを可変長復号化する。マクロブロック層デコード部136aは、符号化ストリームに含まれるマクロブロック層の符号化データを可変長復号化する。このような、スライスデータ層デコード部135aおよびマクロブロック層デコード部136aによる可変長復号化により、隣接するマクロブロック間の依存関係が除去される。なお、スライスデータ層デコード部135aおよびマクロブロック層デコード部136aは、処理対象のマクロブロックに隣接するマクロブロックに依存する情報(具体的には、CAVLCのnC(non−zero coefficient)など)のみを復号化してもよい。
スキップラン修正部137aは、スライスデータ層デコード部135aによって復号化されたMBスキップラン情報“mb_skip_run”を修正し、修正されたMBスキップラン情報を再び符号化し、符号化されたMBスキップラン情報を出力する。すなわち、スキップラン修正部137aは、MBスキップラン情報が、符号化ストリームにおいて連続する少なくとも2つのスライス部分に跨って連続するブロックの個数を示すときには、その連続するブロックの個数を分割し、スライス部分ごとのブロックの個数を示すように修正したMBスキップラン情報を、少なくとも2つの連続するスライス部分がそれぞれ割り当てられる分割ストリームに設定する。さらに、スキップラン修正部137aは、各分割ストリームにおいて、設定される複数のMBスキップラン情報に対応する複数のブロックが当該分割ストリーム内で連続するときには、複数のMBスキップラン情報を、その複数のMBスキップラン情報のそれぞれが示す個数の総和を示す1つのMBスキップラン情報に変換する。
ここで、MBスキップラン情報は、符号化ピクチャに含まれるスライス内で特定の種類のブロックが連続する場合に連続する当該ブロックの個数を示す第1の符号語の一例である。具体的には、MBスキップラン情報は、連続してスキップされるマクロブロックの数を示している。
例えば、符号化ストリームのスライスの中で、連続してスキップされるマクロブロックの集合が複数のMBラインに跨って存在する場合、スライスデータ層デコード部135aによって復号化されたMBスキップラン情報は、その集合に含まれる連続してスキップされるマクロブロックの数を示している。このような場合に、ピクチャがMBラインごとに分割され、それらのMBラインが別々の分割ストリームに割り当てられると、それぞれの分割ストリームで、連続してスキップされるマクロブロックの数が変わってしまう。つまり、MBスキップラン情報による、MBライン間の依存関係が崩れてしまう。
そこで、スキップラン修正部137aは、上述の集合の一部を含むMBラインごとに、そのMBラインに含まれている上記一部を成す、連続してスキップされるマクロブロックの数を特定する。そして、スキップラン修正部137aは、MBラインごとに、MBスキップラン情報により示される数が、そのMBラインに対して特定された数となるように、MBスキップラン情報を修正する。
QPデルタ修正部138aは、マクロブロックごとに、マクロブロック層デコード部136aによって復号化された、そのマクロブロックのQP変化量“mb_qp_delta”を修正し、修正されたQP変化量を再び符号化し、符号化されたQP変化量を出力する。すなわち、QPデルタ修正部138aは、QP変化量が、2つのMBラインに跨るブロック間の変化量を示す場合には、各分割ストリームにおけるブロックの新たな前後関係に基づく符号化係数の変化量を計算する。そしてQPデルタ修正部138aは、計算した変化量にQP変化量を修正する。
なお、QP変化量は、符号化ピクチャに含まれるスライス内で連続するブロック間における符号化係数の変化量を示す第2の符号語の一例である。具体的には、QP変化量は、マクロブロック(対象マクロブロック)に含まれており、その対象マクロブロックのQP値と、その対象マクロブロックの直前に位置するマクロブロックのQP値との差分値を示す。
つまり、ピクチャがMBラインごとに分割され、MBラインのそれぞれが複数の分割ストリームの何れかに割り当てられると、MBラインの境界を挟んで互いに連続していたマクロブロックはそれぞれ別々の分割ストリームに割り当てられる。その結果、その互いに連続していた一方のマクロブロック(対象マクロブロック)を含む分割ストリームを復号化の対象とするデコードエンジン120は、対象マクロブロックのQP変化量から、その対象マクロブロックのQP値を導出することができない。つまり、QP変化量による、MBライン間の依存関係が崩れてしまう。
そこで、QPデルタ修正部138aは、マクロブロックごとに、そのマクロブロック(対象マクロブロック)のQP変化量を、分割ストリームにおける新たなマクロブロックの前後関係に基づいて再計算する。
分割点検出部139aは、符号化ストリームを4つの分割ストリームに分割する。つまり、分割点検出部139aは、ピクチャまたはスライスを複数のMBラインに分割し、MBラインのそれぞれを4つの分割ストリームの何れかに割り当てる。なお、分割点検出部139aは、MBラインの直前またはそのMBラインに属する2つのマクロブロック間にスライスヘッダがある場合には、そのスライスヘッダの割り当てを行うことなく、MBラインだけを分割ストリームに割り当てる。また、分割点検出部139aは、分割ストリームのそれぞれに、スキップラン修正部137aから取得したMBスキップラン情報と、QPデルタ修正部138aから取得したQP変化量とを含める。
さらに、分割点検出部139aは、分割ストリームのスライスの終端を検出し、スライスヘッダ挿入部133からスライスヘッダ処理内容通知M1を受けると、そのスライスヘッダ処理内容通知M1の示す内容に応じて、上述のスライス終端処理を実行する。また、分割点検出部139aは、スライス終端処理が完了すると、スライスヘッダ挿入部133に終端処理完了通知M2を送る。
スライスデータ処理部134bは、スライスデータ層デコード部135b、マクロブロック層デコード部136b、QPデルタ修正部138bおよび分割点検出部139bを備えている。
スライスデータ層デコード部135bは、符号化ストリームに含まれるスライスデータ層の符号化データを可変長復号化(算術復号化)する。マクロブロック層デコード部136bは、符号化ストリームに含まれるマクロブロック層の符号化データを可変長復号化(算術復号化)する。このような、スライスデータ層デコード部135bおよびマクロブロック層デコード部136bによる可変長復号化により、隣接するマクロブロック間の依存関係が除去される。
QPデルタ修正部138bは、上述のQPデルタ修正部138aと同様、マクロブロックごとに、マクロブロック層デコード部136bによって復号化された、そのマクロブロックのQP変化量“mb_qp_delta”を修正し、修正されたQP変化量を再び符号化し、符号化されたQP変化量を出力する。
分割点検出部139bは、分割点検出部139aと同様、符号化ストリームを4つの分割ストリームに分割する。このとき、分割点検出部139bは、分割ストリームのそれぞれに、QPデルタ修正部138bから取得したQP変化量を含める。さらに、分割点検出部139bは、分割ストリームのスライスの終端を検出し、スライスヘッダ挿入部133からのスライスヘッダ処理内容通知M1を受けると、そのスライスヘッダ処理内容通知M1の示す内容に応じて、上述のスライス終端処理を実行する。また、分割点検出部139bは、スライス終端処理が完了すると、スライスヘッダ挿入部133に終端処理完了通知M2を送る。
ここで、スライスヘッダ挿入部133およびスライスデータ処理部134a、134bについて詳細に説明する。なお、スライスデータ処理部134a、134bについて共通する機能および処理動作を説明するときには、それらを区別することなくスライスデータ処理部134と総称する。
まず、スライスヘッダ挿入部133がスライスヘッダを挿入するタイミング、およびスライスデータ処理部134がスライス終端情報を挿入するタイミングについて説明する。
図11は、スライスヘッダ挿入部133およびスライスデータ処理部134の動作を説明するための説明図である。なお、ここでは、ピクチャに含まれるスライスAおよびスライスBがストリーム分割処理対象のスライスとしてストリーム分割部130に振り分けられている。
スライスデータ処理部134は、スライスAおよびスライスBを含むピクチャをMBラインごとに分割し、EPB挿入部132bを介して、先頭側のMBラインから各MBラインを順次、分割ストリームバッファ152に含まれる4つの領域(第1領域df1〜第4領域df4)に格納する。このとき、スライスデータ処理部134は、1MBラインの格納ごとに、MBラインの格納先を第1領域df1、第2領域df2、第3領域df3、第4領域df4、第1領域df1の順に繰り返し変更する。
例えば、スライスデータ処理部134は、図11の(a)に示すように、スライスAのMBラインLa1を、分割ストリームバッファ152の第1領域df1に格納し、スライスAの次のMBラインLa2を、分割ストリームバッファ152の第2領域df2に格納し、スライスAの次のMBラインLa3を、分割ストリームバッファ152の第3領域df3に格納する。さらに、スライスデータ処理部134は、スライスAの次のスライスBのMBラインLb1を、分割ストリームバッファ152の第4領域df4に格納する。
その結果、分割ストリームバッファ152の4つの第1領域df1〜第4領域df4のそれぞれにMBラインが格納され、分割ストリームバッファ152は、スライスBの次のMBラインが再び第1領域df1に格納される直前の状態になる。
なお、スライスデータ処理部134は、MBラインLa3を第3領域df3に格納するときには、符号化ストリームにおいてMBラインLa3の直後にスライス終端情報eaがあっても、そのスライス終端情報eaを格納することなく、MBラインLa3だけを第3領域df3に格納する。そして、スライスデータ処理部134は、その後に、第3領域df3に新たなスライスに属するMBラインを格納するときになって、そのスライス終端情報eaに対応するスライス終端情報ea’を第3領域df3に格納する。また、スライスデータ処理部134がMBラインLb1を第4領域df4に格納するときには、事前に、スライスヘッダ挿入部133によってスライスBのスライスヘッダhbが第4領域df4に格納されている。また、ピクチャには、スライスAのMBラインLa1よりも前に、そのスライスAの他のMBラインが存在している。したがって、第1領域df1、第2領域df2および第3領域df3のMBラインLa1、La2、La3の直前には、スライスAの複製スライスヘッダが挿入されていない。
また、スライスデータ処理部134の分割点検出部139a、139bは、マクロブロックを出力するごとに、1MBラインの全てのマクロブロックが出力されたか否かを判別している。その結果、分割点検出部139a、139bは、全てのマクロブロックが出力されたと判別すると、MBラインの境界(MBラインの終端)を検出する。そして、分割点検出部139a、139bは、MBラインの境界を検出するごとに、マクロブロックの出力処理を中断し、MBラインの境界を検出したことをスライスヘッダ挿入部133に通知する。
したがって、MBラインの最後のマクロブロックが分割ストリームバッファ152に格納されて、分割ストリームバッファ152が上述のような図11の(a)に示す状態になったときにも、スライスヘッダ挿入部133は、スライスデータ処理部134の分割点検出部139a、139bから、MBラインの境界が検出されたことの通知を受ける。
MBラインの境界検出の通知を受けたスライスヘッダ挿入部133は、図11の(b)に示すように、スライスヘッダ処理内容通知M1をスライスデータ処理部134に送る。このスライスヘッダ処理内容通知M1は、スライスデータ処理部134から分割ストリームバッファ152へ次のMBラインが格納される直前に、スライスヘッダを分割ストリームバッファ152に出力して格納する予定があるか否かをそのスライスデータ処理部134に知らせる情報であって、「出力」または「非出力」を示す。つまり、「出力」を示すスライスヘッダ処理内容通知M1は、スライスデータ処理部134に対してスライス終端処理を促す通知である。
例えば、スライスヘッダ挿入部133は、スライスデータ処理部134から分割ストリームバッファ152へ次のMBラインLb2が格納される直前に、複製スライスヘッダhb’を分割ストリームバッファ152に出力して格納すべきと判断する。このとき、スライスヘッダ挿入部133は、「出力」を示すスライスヘッダ処理内容通知M1をスライスデータ処理部134に出力する。
スライスデータ処理部134は、スライスヘッダ処理内容通知M1を取得すると、そのスライスヘッダ処理内容通知M1が「出力」を示していれば、スライス終端情報を生成して分割ストリームバッファ152に格納した後に、終端処理完了通知M2をスライスヘッダ挿入部133に出力する。一方、スライスデータ処理部134は、スライスヘッダ処理内容通知M1が「非出力」を示していれば、スライス終端情報を分割ストリームバッファ152に格納することなく、終端処理完了通知M2をスライスヘッダ挿入部133に出力する。
例えば、スライスデータ処理部134は、「出力」を示すスライスヘッダ処理内容通知M1を取得すると、図11の(c)に示すように、スライス終端情報ea’を生成し、分割ストリームバッファ152の第1領域df1に格納する。その格納が完了すると、スライスデータ処理部134は、終端処理完了通知M2をスライスヘッダ挿入部133に出力する。
スライスヘッダ挿入部133は、スライスデータ処理部134から終端処理完了通知M2を取得すると、直前に出力したスライスヘッダ処理内容通知M1が「出力」を示していた場合には、EPB挿入部132bを介して、スライスヘッダを分割ストリームバッファ152に出力して格納し、その後、スライスヘッダ処理完了通知M3をスライスデータ処理部134に出力する。一方、直前に出力したスライスヘッダ処理内容通知M1が「非出力」を示していた場合には、スライスヘッダ挿入部133は、スライスヘッダを分割ストリームバッファ152に格納することなく、スライスヘッダ処理完了通知M3をスライスデータ処理部134に出力する。
例えば、スライスヘッダ挿入部133は、直前に出力したスライスヘッダ処理内容通知M1が「出力」を示していた場合に、スライスデータ処理部134から終端処理完了通知M2を取得すると、図11の(d)に示すように、複製スライスヘッダhb’を生成して分割ストリームバッファ152の第1領域df1に格納する。その後、スライスヘッダ挿入部133は、スライスヘッダ処理完了通知M3をスライスデータ処理部134に出力する。
スライスデータ処理部134の分割点検出部139a、139bは、スライスヘッダ挿入部133からスライスヘッダ処理完了通知M3を受けると、中断していたマクロブロックの出力処理を再開し、次のMBラインを出力して分割ストリームバッファ152に格納する。
例えば、スライスデータ処理部134は、図11の(d)に示すように、次のMBラインLb2を出力して分割ストリームバッファ152の第1領域df1に格納する。
このようなスライスヘッダ挿入部133およびスライスデータ処理部134による処理によって、分割ストリームバッファ152の各領域において、スライス終端情報、スライスヘッダ、次のMBラインの順に、これらのデータを適切なMBラインの境界に書き込むことができる。
図12は、スライスヘッダ挿入部133の構成を示すブロック図である。
なお、図12を用いて、分割点検出部139a、139bについて共通する機能および処理動作を説明するときには、それらを区別することなく分割点検出部139と総称する。
スライスヘッダ挿入部133は、NALタイプ判定部133a、ヘッダ挿入カウンタ133b、ヘッダアドレス更新部133cおよびヘッダバッファ133dを備えている。
NALタイプ判定部133aは、符号化ストリームのNALユニットを取得するごとに、そのNALユニットのタイプがスライスであるか否かを判別する。そして、NALタイプ判定部133aは、スライスであると判別したときには、そのNALユニットのタイプがスライスであることをヘッダバッファ133dおよびヘッダ挿入カウンタ133bに通知する。
ヘッダバッファ133dは、NALタイプ判定部133aからの通知を受けると、その通知に対応するNALユニットにスライスヘッダが含まれていれば、そのNALユニットからスライスヘッダを取り出して記憶する。さらに、ヘッダバッファ133dは、後のNALユニットに新たなスライスヘッダが含まれていれば、既に記憶しているスライスヘッダをその新たなスライスヘッダに置き換える。つまり、ヘッダバッファ133dは、常に最新のスライスヘッダを保持している。
ヘッダ挿入カウンタ133bは、複製スライスヘッダを生成して挿入するタイミングを特定するために、符号化ストリーム中のMBラインの境界(終端)が分割点検出部139で検出された数をカウントする。具体的には、ヘッダ挿入カウンタ133bは、0〜4(デコードエンジン120の総数)までの値をカウントする。ヘッダ挿入カウンタ133bは、NALタイプ判定部133aからの通知を受けると、その通知に対応するNALユニットにスライスヘッダが含まれていれば、カウント値を0にリセットする。さらに、ヘッダ挿入カウンタ133bは、MBラインの境界(MBラインの終端)が検出されたときには、カウント値を1だけカウントアップする。そして、ヘッダ挿入カウンタ133bは、カウント値が4に達した後に、さらにMBラインの境界が検出されたときには、カウントアップすることなく、カウント値を4に維持しておく。
このように、ヘッダ挿入カウンタ133bは、MBラインの境界が検出されたときには、カウント値を更新あるいは保持し、NALユニットにスライスヘッダが含まれていれば、カウント値を0にリセットする。
また、ヘッダ挿入カウンタ133bは、MBラインの境界が検出されたときには、その検出によって更新されたカウント値(MBライン境界の直後のスライスヘッダによってリセットされたカウント値=0を含む)に応じて、「出力」または「非出力」を示すスライスヘッダ処理内容通知M1を分割点検出部139に出力する。具体的には、ヘッダ挿入カウンタ133bは、MBラインの境界が検出された直後のカウント値が0〜3のときには、「出力」を示すスライスヘッダ処理内容通知M1を出力し、そのカウント値が4のときには、「非出力」を示すスライスヘッダ処理内容通知M1を出力する。また、ヘッダ挿入カウンタ133bは、MBラインの境界が検出されたときに限らず、カウント値が0になったときにも、「出力」を示すスライスヘッダ処理内容通知M1を出力する。
さらに、ヘッダ挿入カウンタ133bは、スライスヘッダ処理内容通知M1を分割点検出部139に出力した後に、その分割点検出部139から終端処理完了通知M2を受け取ると、その出力したスライスヘッダ処理内容通知M1が「出力」を示していた場合には、ヘッダバッファ133dに格納されているスライスヘッダをそのヘッダバッファ133dから出力させる。その後、ヘッダ挿入カウンタ133bはスライスヘッダ処理完了通知M3を分割点検出部139に出力する。なお、ヘッダバッファ133dからスライスヘッダが出力されるときには、スライスヘッダ挿入部133は、そのスライスヘッダに含まれているMBアドレス情報により示される値に応じて、分割ストリームバッファ152の格納先となる領域を選択する。そして、スライスヘッダ挿入部133は、その選択された格納先となる領域にスライスヘッダを格納する。一方、ヘッダ挿入カウンタ133bは、その出力したスライスヘッダ処理内容通知M1が「非出力」を示していた場合には、ヘッダバッファ133dに格納されているスライスヘッダをそのヘッダバッファ133dから出力させずに、格納された状態に維持しておく。その後、上述と同様、ヘッダ挿入カウンタ133bはスライスヘッダ処理完了通知M3を分割点検出部139に出力する。
ヘッダアドレス更新部133cは、MBラインの境界が検出された直後のカウント値(MBライン境界の直後のスライスヘッダによってリセットされたカウント値=0を含む)に応じて、ヘッダバッファ133dに格納されているスライスヘッダのMBアドレス情報“first_mb_in_slice”を更新する。
例えば、ヘッダアドレス更新部133cは、カウント値n=0のときには、MBアドレス情報を更新せず、カウント値n≠0のときには、MBアドレス情報を(“mbposv”+n)×(“pic_width_in_mbs_minus1”+1)に更新する。なお、ピクチャがMBAFFで構成されている場合には、ヘッダアドレス更新部133cは、MBアドレス情報を(“mbposv”/2+n)×(“pic_width_in_mbs_minus1”+1)により更新する。
図13は、分割ストリームバッファ152の第1領域df1〜第4領域df4に割り当てられるMBラインおよびスライスヘッダを示す図である。
例えば、ストリーム分割部130は、ストリームバッファ151に格納されている符号化ストリームのスライスA〜Cを、スライスA、スライスB、スライスCの順に読み出す。
この場合、まず、スライスヘッダ挿入部133のヘッダバッファ133dは、スライスAの先頭からスライスヘッダhaを取り出して記憶する。このとき、ヘッダ挿入カウンタ133bはカウント値を0にリセットする。したがって、ヘッダバッファ133dは、カウント値が0であるため、記憶しているスライスヘッダhaを出力することにより、そのスライスヘッダhaを分割ストリームバッファ152の第1領域df1に格納する。
スライスヘッダhaがヘッダバッファ133dから出力されると、スライスデータ処理部134は、符号化ストリーム中でスライスAのスライスヘッダhaに続く第1MBラインを出力することにより、その第1MBラインを分割ストリームバッファ152の第1領域df1に格納する。その結果、第1領域df1には、スライスヘッダha、スライスAに属する第1MBラインの順に、それらのデータが格納される。
第1MBラインがスライスデータ処理部134から出力されると、上述のヘッダ挿入カウンタ133bはカウント値を1にカウントアップする。したがって、ヘッダバッファ133dは、第1MBラインの終端でカウント値が1であるため、記憶しているスライスヘッダhaを複製スライスヘッダha’として出力することにより、その複製スライスヘッダha’を分割ストリームバッファ152の第2領域df2に格納する。なお、複製スライスヘッダha’のMBアドレス情報はヘッダアドレス更新部133cによって更新されている。
複製スライスヘッダha’がヘッダバッファ133dから出力されると、スライスデータ処理部134は、符号化ストリーム中で第1MBラインに続く第2MBラインを出力することにより、その第2MBラインを分割ストリームバッファ152の第2領域df2に格納する。
ここで、第2MBラインは、スライスAに属する複数のマクロブロックと、スライスBのスライスヘッダhbと、スライスBに属する複数のマクロブロックとを含んでいる。そこで、スライスデータ処理部134の分割点検出部139は、まず、第2MBラインに含まれるスライスAに属する全てのマクロブロックを第2領域df2に格納する。その格納が終了すると、分割点検出部139は、一時的にマクロブロックの出力処理を中断し、スライスヘッダ挿入部133からスライスヘッダ処理内容通知M1を受けるまで待機する。このとき、スライスヘッダ挿入部133は、スライスBのスライスヘッダhbを検出するため、カウント値を0にリセットし、「出力」を示すスライスヘッダ処理内容通知M1を分割点検出部139に送る。このスライスヘッダ処理内容通知M1を受けた分割点検出部139は、第2領域df2のスライスAの終端に対してスライス終端処理を行い、終端処理完了通知M2をスライスヘッダ挿入部133に送る。この終端処理完了通知M2を受けたスライスヘッダ挿入部133は、スライスBのスライスヘッダhbを第2領域df2に格納し、スライスヘッダ処理完了通知M3を分割点検出部139に送る。このスライスヘッダ処理完了通知M3を受けた分割点検出部139は、中断していた出力処理を再開し、第2MBラインに含まれる次のスライスBに属する複数のマクロブロックを第2領域df2に格納する。
その結果、第2領域df2には、複製スライスヘッダha’に続いて、スライスAに属する第2MBラインの一部を成す複数のマクロブロック、スライスヘッダhb、スライスBに属する第2MBラインの一部を成す複数のマクロブロックの順に、それらのデータが格納される。
第2MBラインがスライスデータ処理部134から出力されると、スライスヘッダ挿入部133のヘッダバッファ133dは、符号化ストリーム中でその第2MBラインに続くスライスCの先頭からスライスヘッダhcを取り出して記憶する。このとき、ヘッダ挿入カウンタ133bはカウント値を0にリセットする。したがって、ヘッダバッファ133dは、第2MBラインの終端でカウント値が0であるため、記憶しているスライスヘッダhcを出力することにより、そのスライスヘッダhcを分割ストリームバッファ152の第3領域df3に格納する。
スライスヘッダhcがヘッダバッファ133dから出力されると、スライスデータ処理部134は、符号化ストリーム中でスライスCのスライスヘッダhcに続く第3MBラインを出力することにより、その第3MBラインを分割ストリームバッファ152の第3領域df3に格納する。その結果、第3領域df3には、スライスヘッダhc、スライスCに属する第3MBラインの順に、それらのデータが格納される。
第3MBラインがスライスデータ処理部134から出力されると、上述のヘッダ挿入カウンタ133bはカウント値を1にカウントアップする。したがって、ヘッダバッファ133dは、第3MBラインの終端でカウント値が1であるため、記憶しているスライスヘッダhcを複製スライスヘッダhc’として出力することにより、その複製スライスヘッダhc’を分割ストリームバッファ152の第4領域df4に格納する。なお、複製スライスヘッダhc’のMBアドレス情報はヘッダアドレス更新部133cによって更新されている。
このような処理が繰り返されることにより、分割ストリームバッファ152の第1領域df1〜第4領域df4にデータが順次格納される。その結果、それらの第1領域df1〜第4領域df4のそれぞれに第1分割ストリーム〜第4分割ストリームが格納される。
図14Aおよび図14Bは、スライス終端情報が設定される位置を示す図である。
例えば、図14Aに示すように、ピクチャはスライスAとスライスBとを含み、スライスAに続くスライスBの先頭のマクロブロックはMBラインの左端にある。このような場合、スライスデータ処理部134の分割点検出部139は、スライスヘッダ挿入部133からスライスBのスライスヘッダhbが出力される直前に、そのスライスBの先頭MBラインから4MBライン前にある、スライスAのMBラインの終端に、スライスAのスライス終端情報ea’を設定する。さらに、スライスデータ処理部134の分割点検出部139は、スライスヘッダ挿入部133からスライスBの複製スライスヘッダhb’が出力される直前に、そのスライスBの先頭MBラインから3MBライン前にある、スライスAのMBラインの終端に、スライスAのスライス終端情報ea’を設定する。
このように、スライスの先頭のマクロブロックがMBラインの左端にある場合には、そのMBラインの1〜4MBライン前にある各MBラインの終端にスライス終端情報ea’が設定される。
また、図14Bに示すように、ピクチャはスライスAとスライスBとを含み、スライスAに続くスライスBの先頭のマクロブロックはMBラインの左端以外にある。このような場合、スライスデータ処理部134の分割点検出部139は、スライスヘッダ挿入部133からスライスBの複製スライスヘッダhb’が出力される直前に、そのスライスBのスライスヘッダhbを含むMBラインから3MBライン前にある、スライスAのMBラインの終端に、スライスAのスライス終端情報ea’を設定する。
このように、スライスの先頭のマクロブロックがMBラインの左端以外にある場合には、そのMBラインにおけるスライスの境界と、そのMBラインの1〜3MBライン前にある各MBラインの終端にスライス終端情報ea’が設定される。
ここで、分割点検出部139の動作について詳細に説明する。
図15は、分割点検出部139の動作を示すフローチャートである。
まず、分割点検出部139は、符号化ストリームの先頭側から処理対象とすべきデータ(例えばマクロブロック)を特定して出力し、分割ストリームバッファ152に格納する(ステップS100)。
ここで、分割点検出部139は、出力されるマクロブロックのアドレス(MBアドレス値)を管理している。つまり、出力されるマクロブロックが、符号化ストリームに含まれるスライスの先頭マクロブロックであれば、分割点検出部139は、出力されるマクロブロックのMBアドレス値を、そのスライスのスライスヘッダに含まれるMBアドレス情報により示される値に更新する。そして、分割点検出部139は、その先頭マクロブロックに続くマクロブロックを出力するごとに、そのMBアドレス値をインクリメントする。なお、MBアドレス値は0以上の整数である。
そして、分割点検出部139は、ステップS100でマクロブロックを出力するときには、そのマクロブロックのMBアドレス値に応じて、分割ストリームバッファ152内の格納先となる領域を選択し、その格納先となる領域にマクロブロックを格納する。具体的には、分割ストリームバッファ152に含まれる4つの領域に1番〜4番までの番号が割り振られている場合、分割点検出部139は、m=((MBアドレス値/W)%N+1)番目の領域を選択し、そのm番目の領域にマクロブロックを格納する。
なお、Wは、W=“pic_width_in_mbs_minus1”+1により示され、ピクチャの水平方向のマクロブロック数を示す。また、Nはデコードエンジン120の総数(N=4)であり、%は(MBアドレス値/W)をNで割ったときの余りを示す。
次に、分割点検出部139は、ステップS100で出力されたマクロブロックがMBラインの終端(境界)であったか否か、つまりマクロブロックの出力処理がMBラインの終端に達したか否かを判別する(ステップS102)。具体的には、分割点検出部139は、ステップS100で出力されたマクロブロックのMBアドレス値が(Wの倍数−1)となるか否かを判別する。MBアドレス値=(Wの倍数−1)のときには、出力処理がMBラインの終端に達し、MBアドレス値≠(Wの倍数−1)のときには、出力処理がMBラインの終端に達していない。
分割点検出部139は、終端に達していないと判別すると(ステップS102のNo)、符号化ストリームにおいて次に処理対象とすべきデータがあるか否か、つまり出力処理を終了すべきか否かを判別する(ステップS114)。一方、分割点検出部139は、終端(MBラインの境界)に達したと判別すると、つまりMBラインの境界を検出すると(ステップS102のYes)、MBラインの境界を検出したことをスライスヘッダ挿入部133に通知するとともに出力処理を中断し、その後、スライスヘッダ挿入部133からスライスヘッダ処理内容通知M1を受けたか否かを判別する(ステップS104)。
分割点検出部139は、スライスヘッダ処理内容通知M1を受けていないと判別すると(ステップS104のNo)、スライスヘッダ処理内容通知M1を受けるまで待機する。一方、分割点検出部139は、スライスヘッダ処理内容通知M1を受けたと判別すると(ステップS104のYes)、そのスライスヘッダ処理内容通知M1が「出力」を示しているか否かを判別する(ステップS106)。
ここで、分割点検出部139は、「出力」を示していると判別すると(ステップS106のYes)、スライス終端処理を実行する(ステップS108)。つまり、分割点検出部139は、符号化ストリームがCABADで復号化される場合には、スライス終端情報として“end_of_slice_flag”に「1」を設定する。また、分割点検出部139は、符号化ストリームがCAVLDで復号化される場合には、スライス終端情報として“rbsp_slice_trailing_bits”を付与する。
分割点検出部139は、ステップS106で「出力」を示していないと判別した後(ステップS106のNo)、またはステップS108でスライス終端処理を実行した後には、スライスヘッダ挿入部133に終端処理完了通知M2を送る(ステップS110)。その後、分割点検出部139は、スライスヘッダ挿入部133からスライスヘッダ処理完了通知M3を受けたか否かを判別する(ステップS112)。ここで、分割点検出部139は、スライスヘッダ処理完了通知M3を受けていないと判別すると(ステップS112のNo)、スライスヘッダ処理完了通知M3を受けるまで待機する。一方、分割点検出部139は、ステップS112でスライスヘッダ処理完了通知M3を受けたと判別したとき(ステップS112のYes)、符号化ストリームにおいて次に処理対象とすべきデータがあるか否か、つまり出力処理を終了すべきか否かを判別する(ステップS114)。
ここで、分割点検出部139は、終了すべきと判別したときには(ステップS114のYes)、処理を終了し、終了すべきでないと判別したときには(ステップS114のNo)、再び、次の処理対象とすべきデータを出力して分割ストリームバッファ152に格納する(ステップS100)。
次に、スキップラン修正部137aの動作について詳細に説明する。
スキップラン修正部137aは、前述したようにMBスキップラン情報である“mb_skip_run”を修正する。MBスキップラン情報は、符号化方法にCAVLCを用いた場合に符号化ストリームに含まれる符号語であり、連続するスキップマクロブロックの個数(以下、「長さ」ともいう。)を示している。また、以下の記載において、MBスキップラン情報の長さとは、MBスキップラン情報が示す、連続するスキップマクロブロックの個数を意味する。
図16Aおよび図16Bは、MBスキップラン情報の修正処理を説明するための説明図である。
図16Aに示されたピクチャでは、MBラインL2の末尾に5個、MBラインL3の先頭に3個、MBラインL5の末尾に2個、MBラインL6の先頭に4個の連続するスキップマクロブロックが存在する。したがって、このようなピクチャを含む符号化ストリームでは、MBラインL2〜L3に跨って連続するスキップマクロブロックの個数を示す長さ8(5+3=8)のMBスキップラン情報が符号化され、MBラインL5〜L6に跨って連続するスキップマクロブロックの個数を示す長さ6(2+4=6)のMBスキップラン情報が符号化されている。
しかし、このような場合にピクチャがMBラインごとに分割され、それらのMBラインが別々の分割ストリームに割り当てられると、それぞれの分割ストリームで、連続してスキップされるマクロブロックの数が変わってしまう。つまり、複数のMBラインに跨って連続するスキップマクロブロックの個数を示すMBスキップラン情報による、その複数のMBライン間の依存関係が崩れてしまう。
すなわち、第1分割ストリームに含まれるMBラインはL1およびL5であり、MBラインL5の末尾に連続する2個のスキップマクロブロックが存在する。また、第2分割ストリームに含まれるMBラインはL2およびL6であり、MBラインはL2からL6に跨って連続する9個のスキップマクロブロックが存在する。また、第3分割ストリームに含まれるMBラインはL3およびL7であり、MBラインはL3の先頭に連続する3個のスキップマクロブロックが存在する。また、第4分割ストリームに含まれるMBラインはL4およびL8であり、スキップマクロブロックは存在しない。
以上のように、もともと符号化ストリームに含まれていたMBスキップラン情報は長さ8と6であったのに対し、第1分割ストリームに対しては長さ2のMBスキップラン情報を、第2分割ストリームに対しては長さ9のMBスキップラン情報を、第3分割ストリームに対しては長さ3のMBスキップラン情報を出力する必要がある。つまり、複数のMBラインに跨って連続するスキップマクロブロックの個数を示すMBスキップラン情報によって、その複数のMBラインが互いに依存関係を有する場合には、その依存関係が、各分割ストリームにおけるMBラインの前後関係に応じた新たな依存関係となるように、MBスキップラン情報を修正する必要がある。
そこでスキップラン修正部137aは、まずスライスデータ層デコード部135aによって復号化されたMBスキップラン情報に対応するスキップマクロブロックの集合が複数のMBラインに跨って存在する場合、MBライン境界でMBスキップラン情報を分割する。ここで、MBライン境界でMBスキップラン情報を分割するとは、複数のMBラインに跨って連続する複数のスキップマクロブロックの個数を分割し、MBラインごとのスキップマクロブロックの個数をそれぞれが示す複数のMBスキップラン情報を生成することを意味する。
すなわち、図16Aに示されたピクチャの場合、スキップラン修正部137aは、MBラインL2〜L3に跨って存在する8個のスキップマクロブロックの集合に対応するMBスキップラン情報を、MBラインL2に含まれる5個のスキップマクロブロックの集合に対応するMBスキップラン情報と、MBラインL3に含まれる3個のスキップマクロブロックの集合に対応するMBスキップラン情報とに分割する。同様に、スキップラン修正部137aは、MBラインL5〜L6に跨って存在する6個のスキップマクロブロックの集合に対応するMBスキップラン情報を、MBラインL5に含まれる2個のスキップマクロブロックの集合に対応するMBスキップラン情報と、MBラインL6に含まれる4個のスキップマクロブロックの集合に対応するMBスキップラン情報とに分割する。
次に、スキップラン修正部137aは、分割されたMBスキップラン情報のうち、各分割ストリームにおいて連続するスキップマクロブロックの集合に対応する複数のMBスキップラン情報を再結合する。ここで複数のMBスキップラン情報の再結合とは、複数のMBスキップラン情報を、その複数のMBスキップラン情報のそれぞれが示す個数の総和を示す1つのMBスキップラン情報に変換することを意味する。
図16Aに示されたピクチャの場合、分割されたMBスキップラン情報に対応するスキップマクロブロックの集合のうち、MBラインL2に含まれる長さ5のスキップマクロブロックの集合と、MBラインL6に含まれる長さ4のスキップマクロブロックの集合とは、第2分割ストリーム内で連続する。そのため、スキップラン修正部137aは、これらの2つのスキップマクロブロックの集合にそれぞれ対応する2つのMBスキップラン情報を結合し、長さ9のMBスキップラン情報に変換する。
最後にスキップラン修正部137aは、このようにして得られたMBスキップラン情報を再び符号化し、符号化されたMBスキップラン情報を出力する。
以上説明したように、スキップラン修正部137aは、入力されたMBスキップラン情報をMBライン境界で分割した後、必要に応じて再結合することで、各分割ストリームに対して適切な長さのMBスキップラン情報を出力することが出来る。
なお、ここで、スキップラン修正部137aが、各分割ストリームにおいて連続するMBスキップラン情報を分割されたままにせずに、必要に応じて再結合するのは、H.264/AVC規格において、複数のMBスキップラン情報が連続して存在することが許されていないためである。つまり、H.264/AVC規格において、連続するスキップマクロブロックの個数を複数のMBスキップラン情報を用いて表現することが許されていないので、スキップラン修正部137aは、その複数のMBスキップラン情報を結合する。このように、スキップラン修正部137aがH.264/AVC規格に準拠した形式でMBスキップラン情報が修正されることにより、各分割ストリームがH.264/AVC規格に準拠した形式で生成される。その結果、後段のデコードエンジン120は、特別な処理を要することなく分割ストリームを復号化することが可能となる。
また、図16Bに示されたピクチャでは、MBラインL2の末尾に5個の連続するスキップマクロブロックと、MBラインL6の先頭に3個の連続するスキップマクロブロックとが存在する。したがって、このようなピクチャを含む符号化ストリームでは、MBラインL2に長さ5のMBスキップラン情報が符号化され、MBラインL6に長さ3のMBスキップラン情報が符号化されている。
このピクチャの場合、複数のMBラインに跨って連続するスキップマクロブロックの個数を示すMBスキップラン情報は存在していないため、スキップラン修正部137aは、MBライン境界でMBスキップラン情報を分割する必要はない。しかしながら、このピクチャがMBラインごとに分割され、それらのMBラインが別々の分割ストリームに割り当てられた場合、第2分割ストリームにおいて、長さ5のMBスキップラン情報と長さ3のMBスキップラン情報とが連続して存在することになる。
したがってこの例のように、複数のMBラインに跨って連続するスキップマクロブロックの個数を示すMBスキップラン情報は存在しない場合においても、スキップラン修正部137aは、各分割ストリームにおいて1つの連続するスキップマクロブロックの個数を示す複数のMBスキップラン情報を再結合する処理を行う。すなわち、スキップラン修正部137aは、第2分割ストリームにおいて、長さ5のMBスキップラン情報と長さ3のMBスキップラン情報とを結合し、長さ8のMBスキップラン情報に変換する。
スキップラン修正部137aは、このようにして得られたMBスキップラン情報を再び符号化し、符号化されたMBスキップラン情報を出力する。
図17は、スキップラン修正部137aの構成を示すブロック図である。
スキップラン修正部137aは、スキップラン抽出部160、スキップラン分割部161、スキップラン累積・保持部162、加算部163、およびスキップラン符号化部164を備えている。
スキップラン抽出部160は、スライスデータ層デコード部から出力されるストリームから、MBスキップラン情報を検出および抽出する。抽出したMBスキップラン情報は、スキップラン分割部161に対して出力され、それ以外の情報は、そのまま分割点検出部139aに対して出力される。
スキップラン分割部161は、MBスキップラン情報の長さとMBスキップラン情報が存在するマクロブロックの位置情報から、入力されたMBスキップラン情報が複数のMBラインに跨って連続するスキップマクロブロックの個数を示すかどうかを判定する。ここで、複数のMBラインに跨って連続するスキップマクロブロックの個数を示すと判定された場合は、スキップラン分割部161は、MBライン境界を分割点として、MBスキップラン情報を分割する。分割されたMBスキップラン情報のうち、MBライン境界を越えたスキップマクロブロックの個数を示すMBスキップラン情報は加算部163に出力され、MBライン境界を越えなかったスキップマクロブロックの個数を示すMBスキップラン情報はスキップラン累積・保持部162に出力される。
なお、MBスキップラン情報は、3つ以上のMBラインに跨って連続するスキップマクロブロックの個数を示す場合もある。その場合、連続するスキップマクロブロックの間に2つ以上のMBライン境界が存在することになるため、スキップラン分割部161はそれぞれのMBライン境界を分割点として、繰り返し分割を行う。その際、分割されたMBスキップラン情報のうち、最後のMBライン境界を越えたスキップマクロブロックの個数を示すMBスキップラン情報が加算部163に出力され、それ以外のMBスキップラン情報はスキップラン累積・保持部162に出力される。
スキップラン累積・保持部162は、スキップラン分割部161から出力される分割されたMBスキップラン情報を受け取り、先行MBスキップラン情報として分割ストリームごとにその値を保持する。すなわち、スキップラン累積・保持部162は、第1分割ストリームに含まれるMBスキップラン情報を受け取った場合は第1分割ストリームの先行MBスキップラン情報として保持する。また、スキップラン累積・保持部162は、第2分割ストリームに含まれるMBスキップラン情報を受け取った場合は第2分割ストリームの先行MBスキップラン情報として保持する。また、スキップラン累積・保持部162は、第3分割ストリームに含まれるMBスキップラン情報を受け取った場合は第3分割ストリームの先行MBスキップラン情報として保持する。また、スキップラン累積・保持部162は、第4分割ストリームに含まれるMBスキップラン情報を受け取った場合は第4分割ストリームの先行MBスキップラン情報として保持する。
このとき、既にスキップラン累積・保持部162に先行MBスキップラン情報が保持されている場合、スキップラン累積・保持部162は、スキップラン分割部161から受け取ったMBスキップラン情報を累積し、新たなMBスキップラン情報として、分割ストリーム毎にその値を保持する。つまり、スキップラン累積・保持部162は、分割ストリームごとに、スキップラン分割部161から受け取ったMBスキップラン情報を、保持されている先行MBスキップラン情報に加算する。
加算部163は、スキップラン分割部161からMBスキップラン情報を受け取るとともに、そのMBスキップラン情報が含まれる分割ストリームに対応した、スキップラン累積・保持部162に保持された先行MBスキップラン情報を読み出す。そして、加算部163は、スキップラン分割部161から受け取ったMBスキップラン情報の値と、スキップラン累積・保持部162にから読み出した先行MBスキップラン情報の値とを加算し、その結果を修正されたMBスキップラン情報として、スキップラン符号化部164に出力する。この処理により、MBスキップラン情報の再結合が行われる。
スキップラン符号化部164は、加算部163から出力される修正されたMBスキップラン情報を再符号化して分割点検出部139aに出力することで、修正されたMBスキップラン情報をストリームに再度埋め込む。
図18は、スキップラン修正部137aによるMBスキップラン情報の修正動作を示すフローチャートである。
まずスキップラン修正部137aは、処理しているストリームがスライス終端に到達しているかどうかを判別する(ステップS200)。これは、MBスキップラン情報がスライス境界を跨って連続するスキップマクロブロックの個数を示すことがないため、スライス終端に到達した際には、スキップラン修正部137aの内部に保持された先行MBスキップラン情報をすべて出力する必要があるためである。ここでスライス終端に到達していると判別すると(ステップS200のYes)、ステップS224の処理に進む。処理の詳細は後述する。
一方、スライス終端に到達していないと判別すると(ステップS200のNo)、スキップラン修正部137aは、MBスキップラン情報“mb_skip_run”を取得したかどうかを調べる(ステップS202)。ここで、まだMBスキップラン情報を取得していない場合(ステップS202のNo)、スキップラン修正部137aは、処理の最初に戻りストリームを再度読み進める。
一方、MBスキップラン情報を取得している場合(ステップS202のYes)、スキップラン修正部137aは、該当のMBスキップラン情報が含まれるマクロブロックのアドレス情報から、ピクチャ内におけるマクロブロックの位置を算出する(ステップS204)。ここで、スキップラン修正部137aは、取得したMBスキップラン情報によって示される連続したスキップマクロブロックのうち、先頭のスキップマクロブロックの位置を特定する。
スキップラン修正部137aは、ステップS204でマクロブロックの位置を算出すると、そのマクロブロックの位置情報とMBスキップラン情報の長さとから、連続するスキップマクロブロックがMBライン境界に到達するかどうかを調べることにより、取得したMBスキップラン情報を分割する必要があるかどうかを判定する(ステップS206)。
より具体的には、先頭のスキップマクロブロックの水平位置および垂直位置をそれぞれ“mbposh”、“mbposv”と表現し、ピクチャの水平方向の総マクロブロック数を“PicWidthInMbs”と表現した場合において、“mb_skip_run ≧ PicWidthInMbs − mbposh”が成立するときは、スキップラン修正部137aは、連続するスキップマクロブロックがMBライン境界に到達すると判定する。
なお、ここではMBライン単位でストリームを分割する構成を示しているが、他の分割単位でストリームを分割する場合においても、同様に、スキップラン修正部137aは、マクロブロックの位置情報とMBスキップラン情報の長さから、連続するスキップマクロブロックが分割境界に到達するかどうかを判定すればよい。
連続するスキップマクロブロックがMBライン境界に到達すると判定された場合(ステップS206のYes)、スキップラン修正部137aは、MBスキップラン情報を分割するためステップS216に進む。詳細は後述する。
連続するスキップマクロブロックがMBライン境界に到達しないと判定された場合(ステップS206のNo)、スキップラン修正部137aは、該当のMBスキップラン情報がMBラインの先頭に位置しているかどうかを判定する(ステップS208)。すなわち、スキップラン修正部137aは、該当のMBスキップラン情報について、先行MBスキップラン情報との結合が必要かどうかを判定する。
該当のMBスキップラン情報がMBラインの先頭に位置していると判定された場合(ステップS208のYes)、スキップラン修正部137aは、MBスキップラン情報“mb_skip_run”に対して先行MBスキップラン情報“prev_mb_skip_run”を加算することにより、MBスキップラン情報の再結合を行う(ステップS210)。なお、このMBスキップラン情報の再結合処理は、分割ストリーム毎に独立して行われる必要がある。すなわち、先行MBスキップラン情報は分割ストリーム毎にスキップラン修正部137aに保持されており、該当のMBスキップラン情報が含まれるMBラインに対応した、先行MBスキップラン情報が加算される。
ステップS208で該当のMBスキップラン情報がMBラインの先頭に位置していないと判定された場合(ステップS208のNo)、またはステップS210でMBスキップラン情報の結合が実行された後、スキップラン修正部137aは、MBスキップラン情報の再符号化処理を行う(ステップS212)。これは、分割ストリームをH.264/AVC規格に準拠した形式にするためである。
その後スキップラン修正部137aは、再符号化されたMBスキップラン情報を分割点検出部139aに出力して処理を終了する(ステップS214)。
また、ステップS206で連続するスキップマクロブロックがMBライン境界に到達すると判定された場合(ステップS206のYes)、スキップラン修正部137aは、MBライン境界を分割点として、該当のMBスキップラン情報を前半部と後半部とに分割する(ステップS216)。なお、連続するスキップマクロブロックがMBライン境界に到達しているがMBライン境界を跨がない場合、後半部は0であることもあり得る。
さらにスキップラン修正部137aは、分割したMBスキップラン情報のうち、前半部を先行MBスキップラン情報“prev_mb_skip_run”として内部に保持する。このとき、既にスキップラン修正部137aに保持された先行MBスキップラン情報が存在する場合、スキップラン修正部137aは、新たに発生したMBスキップラン情報の前半部の長さを保持された先行MBスキップラン情報の長さに加算して保持する(ステップS218)。なお前述したように、先行MBスキップラン情報は、それ自身が含まれるMBラインに対応する分割ストリームの先行MBスキップラン情報として、分割ストリームごとに独立に保持される。
次にスキップラン修正部137aは、分割したMBスキップラン情報のうち、後半部を新たなMBスキップラン情報として設定した後(ステップS220)、その長さが0であるかどうかを判定する(ステップS222)。
ステップS222で新たなMBスキップラン情報の長さが0であると判定された場合(ステップS222のYes)、スキップラン修正部137aは、それ以上処理すべきMBスキップラン情報がないものとして、処理を終了する。
ステップS222で新たなMBスキップラン情報の長さが0でないと判定された場合(ステップS222のYes)、スキップラン修正部137aは、まだ処理すべきMBスキップラン情報が存在するものとしてステップS204に戻り、再度MBスキップラン情報の分割・再結合および出力処理を行う。このように、スキップラン修正部137aがMBスキップラン情報の分割・再結合を繰り返し行うことにより、3MBライン以上に跨ったMBスキップラン情報についても正しく分割・再結合処理が行われる。
一方、ステップS200でスライス終端であると判別された場合(ステップS200のYes)、スキップラン修正部137aに保持された先行MBスキップラン情報を出力するため、先行MBスキップラン情報“prev_mb_skip_run”を、そのままMBスキップラン情報“mb_skip_run”に置き換える(ステップS224)。その後はステップS212の処理に進み、スキップラン修正部137aは、置き換えたMBスキップラン情報を再符号化した後、分割点検出部139aに出力して処理を終了する(ステップS212〜S214)。なお、この先行MBスキップラン情報の出力は、すべての分割ストリームに対して行われる。
以上説明した処理が、スキップラン修正部137aではストリームの終了まで繰り返し行われる。このように、スキップラン修正部137aでは、MBスキップラン情報の分割・再結合が適切に行われる。
次に、QPデルタ修正部138a、138bの動作について詳細に説明する。なお、以降の説明において、QPデルタ修正部138a、138bについて共通する機能および処理動作を説明するときには、それらを区別することなくQPデルタ修正部138と総称する。
QPデルタ修正部138は、マクロブロックごとに原則として存在するQP変化量“mb_qp_delta”を修正する。QP変化量とは、マクロブロックの量子化パラメータであるQP値を復号するために符号化ストリームに含まれる符号語であり、対象マクロブロックと、その直前に処理したマクロブロックのQP値の差分値を示している。
QP値の復号は、次式(1)によって行われる。
QPY = ( ( QPY,PREV + mb_qp_delta + 52 + 2 * QpBdOffsetY )% ( 52 + QpBdOffsetY ) ) − QpBdOffsetY ・・・(1)
ここで、QPYは処理対象マクロブロックの輝度のQP値を、QPY,PREVは直前のマクロブロックの輝度のQP値を示している。なお、QpBdOffsetYはピクチャを構成する画素のビット深度によって決まる値であり、一般的に用いられる8ビット深度の場合、QpBdOffsetY=0である。その場合、上記の式(1)は次式(2)のように書き換えられる。
QPY = ( QPY,PREV + mb_qp_delta + 52 ) % 52 ・・・(2)
式(2)から分かるように、画素のビット深度が8である場合、QP値は0〜51の範囲となるようにQP変化量“mb_qp_delta”を用いて復号化される。なお、“mb_qp_delta”は−26〜+25の範囲を取りうる値である。
量子化パラメータであるQP値の復号は、処理順で連続するマクロブロック間で依存関係があるが、途中でスライスの境界があった場合はそこで依存関係が解消される。すなわち、量子化パラメータであるQP値は、スライスの先頭でスライスQP値によって初期化される。スライスの先頭のマクロブロックには、該当マクロブロックのQP値とスライスQP値との差分値がQP変化量として符号化される。
図19Aおよび図19Bは、QP変化量の修正処理を説明するための説明図である。
図19Aに示されたピクチャにおけるマクロブロックCに着目すると、本来その直前に処理が行われるマクロブロックはマクロブロックBである。したがって、マクロブロックCには、マクロブロックBのQP値とマクロブロックCのQP値との差分値がQP変化量として符号化されている。
しかし、このようなピクチャがMBラインごとに分割され、それらのMBラインが別々の分割ストリームに割り当てられると、それぞれの分割ストリームで、MBライン境界におけるマクロブロックの前後関係が変化してしまう。
すなわち、ストリーム分割後には、マクロブロックCが含まれる第2分割ストリームにおいて、マクロブロックCの直前に位置するマクロブロックはマクロブロックAとなる。したがって、そのまま第2分割ストリームをデコードエンジン120が復号した場合、マクロブロックAのQP値に対して、マクロブロックBのQP値とマクロブロックCのQP値との差分値であるQP変化量を反映してしまうことになり、マクロブロックCのQP値を正しく復号化できない。つまり、2つのMBラインに跨るマクロブロック間の変化量を示すQP変化量による、そのMBライン間の依存関係が崩れてしまう。
そこでQPデルタ修正部138は、ストリームを分割することにより発生するマクロブロックの前後関係の変化を是正するように、QP変化量の修正を行う。つまり、2つのMBラインに跨るマクロブロック間の変化量を示すQP変化量によって、その2つのMBラインが依存関係を有する場合には、その依存関係が、各分割ストリームにおけるMBラインの前後関係に応じた新たな依存関係となるように、QP変化量を修正する。
QP変化量の修正方法としては、全てのマクロブロックについてQP値の復号化(QP値の復元)を行った上で、ストリーム分割後の新たなマクロブロックの前後関係に基づき、QP変化量を算出し直す方法が考えられる。しかしながらこの方法では、QP値復号化とQP変化量算出との2つの処理が必要であり、QPデルタ修正部138における処理量が大きくなってしまう。
そこで本実施の形態では、QPデルタ修正部138は、分割ストリーム毎に、対象分割ストリームに割り当てられなかったマクロブロックのQP変化量を累積することで、QP値を復号化することなく、修正されたQP変化量を直接導出する。
ここで、QP変化量累積による修正QP変化量の導出について、図を用いて説明する。
図20は、QP変化量の累積を説明するための説明図である。
図中において、横軸はQP値を表しており、QP1〜QP4は連続したマクロブロックにおけるQP値を示している。また図中には、各々のQP値の差分値を表す“mb_qp_delta”が示されている。“mb_qp_delta”の末尾に添えられている2桁の数字は、上位側が先行するマクロブロックに対応するQP値の番号を示しており、下位側が後続するマクロブロックに対応するQP値の番号を示している。例えば、“mb_qp_delta12”は、QP1とQP2との差分値を表す。また、図に示されるように、“mb_qp_delta”は、QP値の最小値である0と、最大値である51とが、連続してつながった軸におけるQP値の差分値を表している。
通常のQP値の復号処理では、QP1と“mb_qp_delta12”とから、式(2)を用いてQP2が求められる。また、同様にQP2と“mb_qp_delta23”とからQP3が求められる。また、QP3と“mb_qp_delta34”とからQP4が求められる。
ここで、図に示されているように、“mb_qp_delta12”、“mb_qp_delta23”、“mb_qp_delta34”が表すQP変化量の合計は、QP1とQP4との差分値を示す“mb_qp_delta14”に等しい。すなわち、隣接していないマクロブロック間のQP変化量を求めるには、その間のすべてのQP変化量“mb_qp_delta”を累積すれば良いことが分かる。
なお、累積は次式(3)に従って行う。
acc_mb_qp_delta = ( acc_mb_qp_delta + mb_qp_delta + 52 ) % 52 ・・・(3)
ここで、“acc_mb_qp_delta”は、累積された“mb_qp_delta”を示す。このように、式(2)に合わせた形式で“mb_qp_delta”を累積することで、図20に示したQP値の最小値である0と最大値である51が連続してつながった軸において、QP変化量の合計を求めることが出来る。
具体的な例として、図19Aに示されたピクチャにおけるマクロブロックCのQP変化量の修正処理について説明する。前述のように、ストリーム分割後の第2分割ストリームにおいて、マクロブロックCの直前に位置するマクロブロックはマクロブロックAとなるため、マクロブロックCには、マクロブロックAのQP値とマクロブロックCのQP値の差分値がQP変化量として含まれる必要がある。
そこでQPデルタ修正部138は、MBラインL3〜L5に含まれる全てのマクロブロックのQP変化量と、マクロブロックCのQP変化量を累積する。このように、マクロブロックAとマクロブロックCの間にある全てのマクロブロックのQP変化量を累積することで、マクロブロックAのQP値とマクロブロックCのQP値の差分値である修正QP変化量を求めることが出来る。
なお、ここで求められたQP変化量は式(3)により導出されているため、0〜51の範囲を示す値となっている。本来のQP変化量“mb_qp_delta”は−26〜+25の範囲を取る値であるため、QPデルタ修正部138は次式(4)により、QP変化量“mb_qp_delta”を−26〜+25の範囲となるように修正する。
acc_mb_qp_delta>25の場合:mb_qp_delta = acc_mb_qp_delta − 52
acc_mb_qp_delta≦25の場合:mb_qp_delta = acc_mb_qp_delta ・・・(4)
なお式(4)で示した処理は、ここで示したようにQP変化量“mb_qp_delta”の累積対象の全てのマクロブロックについて累積した後、最後に1回だけで行ってもよいし、累積対象の全てのマクロブロックについて、1マクロブロックごとに行ってもよい。
また、ここではマクロブロックCに着目して説明したが、全てのMBラインの先頭のマクロブロックについても同様な処理を行う。例えば、マクロブロックCの下方向に隣接するマクロブロックについては、MBラインL4〜L6の全てのマクロブロックのQP変化量を累積し、該当のマクロブロックに対して反映を行うことで、修正されたQP変化量を導出する。これらの処理は、分割ストリーム毎に独立して行われる。
最後にQPデルタ修正部138は、このようにして得られた修正QP変化量を再び符号化し、符号化された修正QP変化量を分割点検出部139に対して出力する。なお、QPデルタ修正部138aはCAVLC方式で、QPデルタ修正部138bはCABAC方式で符号化を行う。
以上説明したように、QPデルタ修正部138は、入力されたQP変化量を分割ストリームにおけるマクロブロックの前後関係に合うように修正することで、各分割ストリームに対して適切なQP変化量を設定することができる。その結果、後段のデコードエンジン120は、特別な処理を要することなく分割ストリームを復号化することが可能となる。
また、図19Bには、MBラインL4とL5の境界でスライスが分割されていた場合の例を示している。この例では、MBラインL1〜L4はスライスAに、MBラインL5〜L8はスライスBに含まれる。
このとき、第2分割ストリームにおいて、図19A同様にマクロブロックAとマクロブロックCは連続しているが、それぞれのマクロブロックが含まれるスライスは異なっており、マクロブロックAとマクロブロックCとの間で依存関係はなくなっている。第2分割ストリームにおいて、マクロブロックCはスライスBの先頭のマクロブロックとなるため、マクロブロックCのQP変化量は、マクロブロックCのQP値とスライスBのスライスQP値との差分値を示している必要がある。
すなわちQPデルタ修正部138は、マクロブロックAからマクロブロックCの間に含まれるマクロブロックのうち、スライスBに含まれるものについて、QP変化量の累積を行うことで、スライスBのスライスQP値からの差分値を求めることが出来る。しかしながら、実際にスライスが分割されているかどうかは、スライスBの先頭が到達するまでは判別できない。
そこでQPデルタ修正部138は、マクロブロックAからマクロブロックCの間に含まれるマクロブロックのすべてについてQP変化量の累積を行うとともに、スライスBの先頭のマクロブロック処理開始時に、累積QP変化量“acc_mb_qp_delta”を0にリセットする。このようにすることで、スライスBに含まれるマクロブロックのみについて、QP変化量の累積を行うことができ、正しくマクロブロックCの修正QP変化量を求めることが出来る。
このようにして得られた修正QP変化量を再び符号化し、符号化された修正QP変化量を分割点検出部139に対して出力する。
図21は、QPデルタ修正部138によるQP変化量の修正処理を示すフローチャートである。
マクロブロックの処理が開始されると、まずQPデルタ修正部138は、処理対象マクロブロックのアドレス情報から、ピクチャ内におけるマクロブロックの位置を算出する(ステップS300)。
次にQPデルタ修正部138は、処理対象マクロブロックがスライスの先頭であるかどうかを判定する(ステップS302)。
処理対象マクロブロックがスライスの先頭であると判定された場合(ステップS302のYes)、全ての分割ストリームに対応する累積QP変化量“acc_mb_qp_delta”を0にリセットする(ステップS304)。この処理により、途中でスライスが分割されていた場合、正しくスライスQP値からのQP変化量が導出できる。なお、ここではスライスの先頭のマクロブロックかどうかで累積QP変化量をリセットするかどうかを決定しているが、スライスの先頭で累積QP変化量をリセット出来れば良いため、スライスヘッダが到着した時点で累積QP変化量をリセットするような構成であっても良い。
ステップS302で処理対象マクロブロックがスライスの先頭でないと判定された場合(ステップS302のNo)、またはステップS304で累積QP変化量のリセットを行った後、QPデルタ修正部138は、ステップS300で求めたマクロブロックの位置情報から、処理対象マクロブロックの分割ストリーム出力先を判定する(ステップS306)。
ステップS306で処理対象マクロブロックの出力先が第1分割ストリームであると判定された場合、QPデルタ修正部138は、第2、第3、第4分割ストリームに対応する累積QP変化量に対し、処理対象マクロブロックのQP変化量を、式(3)に従って累積する(ステップS308)。
また、ステップS306で処理対象マクロブロックの出力先が第2分割ストリームであると判定された場合、QPデルタ修正部138は、第1、第3、第4分割ストリームに対応する累積QP変化量に対し、処理対象マクロブロックのQP変化量を、式(3)に従って累積する(ステップS310)。
また、ステップS306で処理対象マクロブロックの出力先が第3分割ストリームであると判定された場合、QPデルタ修正部138は、第1、第2、第4分割ストリームに対応する累積QP変化量に対し、処理対象マクロブロックのQP変化量を、式(3)に従って累積する(ステップS312)。
また、ステップS306で処理対象マクロブロックの出力先が第4分割ストリームであると判定された場合、QPデルタ修正部138は、第1、第2、第3分割ストリームに対応する累積QP変化量に対し、処理対象マクロブロックのQP変化量を、式(3)に従って累積する(ステップS314)。
このように、ステップS308〜ステップS314では、処理対象マクロブロックの出力先となる分割ストリーム以外の分割ストリームに対応するQP変化量の累積が行われる。これは、各分割ストリームにおいて、対象の分割ストリームに割り当てられなかった3MBラインに含まれるマクロブロックのQP変化量累積を行うことを意味している。このような処理により、QPデルタ修正部138は、対象の分割ストリームに割り当てられなかった3MBラインに対する前後のマクロブロックのQP値の差分値を正しく是正することが出来る。
ステップS308、ステップS310、ステップS312、ステップS314でQP変化量の累積を行った後、QPデルタ修正部138は、ステップS300で求めたマクロブロックの位置情報から、処理対象マクロブロックがMBラインの先頭に位置しているかどうかを判定する(ステップS316)。なお、ここではMBライン単位でストリームを分割する構成を示しているが、他の分割単位でストリームを分割する場合においても、同様に、QPデルタ修正部138は、マクロブロックの位置情報から、処理対象マクロブロックが分割単位の先頭に位置しているかどうかを判定すればよい。
処理対象マクロブロックがMBラインの先頭に位置していると判定された場合(ステップS316のYes)、QPデルタ修正部138は、処理対象マクロブロックが含まれる分割ストリームに対応する累積QP変化量に対し、処理対象マクロブロックのQP変化量を、式(3)に従って累積する。そして、QPデルタ修正部138は、得られた累積QP変化量を式(4)に従って−26〜+25の範囲となるように修正したうえで、処理対象マクロブロックのQP変化量として置き換える。さらに、QPデルタ修正部138は、処理対象マクロブロックが含まれる分割ストリームに対応する累積QP変化量を0にリセットする(ステップS318)。このように、ステップS318では、累積したQP変化量が、MBライン先頭のマクロブロックのQP変化量に反映されることで、QP変化量の修正が行われる。
処理対象マクロブロックがMBラインの先頭に位置していないと判定された場合(ステップS316のNo)、またはステップS318で処理対象マクロブロックのQP変化量の修正が行われた後、QPデルタ修正部138は、処理対象マクロブロックのQP変化量の再符号化処理を行う(ステップS320)。これは、分割ストリームをH.264/AVC規格に準拠した形式にするためである。
その後QPデルタ修正部138は、再符号化されたQP変化量を分割点検出部139に出力して処理を終了する(ステップS322)。
以上のように、QPデルタ修正部138は、MBラインの先頭のマクロブロックに対してはQP変化量の修正を行った上で、MBラインの先頭以外のマクロブロックに対してはそのまま、QP変化量の再符号化・出力処理を行う。
このように、本実施の形態における画像復号化装置100では、符号化されたピクチャは複数のMBライン(構成単位)に分割され、複数のMBラインのそれぞれが分割ストリームの一部としてN個のデコードエンジン120に割り当てられて復号化されるため、N個のデコードエンジン120による復号化処理の負担を均等にすることができ、復号化の並列処理を適切に実行することができる。例えば、H.264/AVCの符号化ピクチャが1スライスで構成されている場合であっても、その符号化ピクチャは複数のMBラインに分割されるため、その1スライスの復号化を1つのデコードエンジン120で負担することなく、N個のデコードエンジン120で均等に負担することができる。
ここで、符号化ピクチャが複数のMBラインに分割されると、複数のMBラインに跨るスライスが複数のスライス部分(例えば、図3に示す各MBラインL1〜L6や、MBラインL7のうちの先頭6マクロブロックの集合など)に分割され、それらのスライス部分が互いに異なる分割ストリームに割り当てられることがある。つまり、1つの分割ストリームには、符号化ピクチャのスライスの全体が含まれることなく、そのスライスの断片であるスライス部分が1つ以上集まって構成されるスライス部分群(例えば、図3に示す第2分割ストリームに含まれるMBラインL2、L6)が含まれることとなる。また、このようなスライス部分群(MBラインL2、L6)には、その先頭を示すスライスヘッダや、その終端を示すスライス終端情報が含まれていない場合がある。
さらに、符号化ストリームに含まれる所定の符号語に起因して、複数のMBラインが依存関係を持つ場合がある。例えば、H.264/AVCでは、MBスキップラン情報“mb_skip_run”や、QP変化量“mb_qp_delta”によって複数のMBラインが互いに依存関係を有する場合がある。このような符号化ストリームが複数のMBラインに分割されて互いに異なる分割ストリームに割り当てられると、MBライン間の依存関係を正しく保つことが出来ない。
そこで本実施の形態では、ストリーム分割部130がそのスライス部分群を新たなスライスとして再構成する。その結果、そのスライス部分群を含む分割ストリームを復号化するデコードエンジン120は、そのスライス部分群を認識して適切に復号化するための特別な処理を要することなく、スライス部分群を新たなスライスとして簡単に認識して適切に復号化することができる。つまり、本実施の形態では、N個のデコードエンジン120のそれぞれに特別な処理を行う機能や構成を設ける必要がないため、画像復号化装置100の全体構成を簡単にすることができる。
また、本実施の形態の画像復号化装置100では、上記特許文献1の画像復号化装置と比べて、復号化処理の高速化を図ることができる。具体的には、上記特許文献1の画像復号化装置では、符号化ストリームの可変長復号化およびデブロッキングフィルタ処理の並列化を行っていない。つまり、上記特許文献1の画像復号化装置では、符号化ストリームを適切に分割していない。一方、本実施の形態の画像復号化装置100では、符号化ストリームを複数の分割ストリームに適切に分割しているため、デコードエンジン120のそれぞれは、図49に示すデコードエンジン1421のように、可変長復号化およびデブロッキングフィルタ処理を並列に実行することができる。その結果、本実施の形態の画像復号化装置では、復号化処理の高速化を図ることができる。
また、本実施の形態の画像復号化装置では、上記特許文献3の画像復号化装置と比べて、中間データバッファに必要な容量を削減することが出来る。具体的には、上記特許文献3の画像復号化装置では、符号化ストリームに含まれる可変長符号を、複数の可変長復号処理部を用いてピクチャ単位で並列に復号化し、その復号データを中間データバッファに格納しており、後段の画像復号処理部は、その復号データからMBライン単位で並列に復号処理を行う。つまり、上記特許文献3の画像復号化装置では、可変長符号を復号化した状態で中間データバッファに格納するため、中間データバッファに必要な容量が大きくなる。特に、複数の可変長復号処理部がピクチャ単位で効率的に並列動作するためには、中間データバッファには複数のピクチャを格納できる容量が必要となり、その大きさは膨大である。一方、本実施の形態の画像復号化装置100では、可変長符号を復号化しない状態で分割ストリームを生成するため、分割ストリームバッファ152の容量を節減することができる。
また、このような本実施の形態における画像復号化装置100は、M個のストリーム分割部130に入力される上述のモード情報に応じて、高解像度デコード、高速デコード、および複数チャンネルデコードのうちの何れかを実行する。
図22Aは、高解像度デコードを説明するための説明図である。図22Bは、高速デコードを説明するための説明図である。図22Cは、複数チャンネルデコードを説明するための説明図である。
画像復号化装置100のM個のストリーム分割部130およびストリーム分割制御部140は、図22Aに示すように、高解像度デコードの実行を指示するモード情報を取得すると、4k2kの符号化ストリームを上述のように4つの分割ストリームに分割し、4つの分割ストリームのそれぞれを各デコードエンジン120に復号化させる。
例えば、4つのデコードエンジン120はそれぞれ、HDの画像(1920×1088画素、60i)を2チャンネル分復号可能な処理能力を有するため、画像復号化装置100は、4k2kの画像(3840×2160画素、60p)をリアルタイムに処理することができる。
また、画像復号化装置100のM個のストリーム分割部130およびストリーム分割制御部140は、図22Bに示すように、高速デコードの実行を指示するモード情報を取得すると、HDの符号化ストリームを上述のように4つの分割ストリームに分割し、4つの分割ストリームのそれぞれを各デコードエンジン120に復号化させる。
例えば、4つのデコードエンジン120はそれぞれ、HDの画像(1920×1088画素、60i)を2チャンネル分復号可能な処理能力を有するため、画像復号化装置100は、HDの画像を8倍速(4×2)で処理することができる。
また、画像復号化装置100のM個のストリーム分割部130およびストリーム分割制御部140は、図22Cに示すように、複数チャンネルデコードの実行を指示するモード情報を取得すると、複数のHDの符号化ストリームを分割することなく、その複数の符号化ストリームのそれぞれを各デコードエンジン120に復号化させる。なお、この複数チャンネルデコードの場合、M個のストリーム分割部130は、SPS、PPSおよびスライスなどの各種NALユニットの複製および挿入を行わず、分割ストリームバッファ152の各領域への符号化ストリーム(チャンネル)の振り分けのみを行う。
例えば、4つのデコードエンジン120はそれぞれ、HDの画像(1920×1088画素、60i)を2チャンネル分復号可能な処理能力を有するため、画像復号化装置100は、最大8チャンネル、つまり8つのHDの符号化ストリームを同時にデコードすることができる。また、最大チャンネル数以下のチャンネル(符号化ストリーム)を復号化する場合には、デコードエンジン120のクロック周波数を下げて消費電力の低減を図ることができる。例えば、4チャンネルを復号化する場合には、第1デコードエンジン120と第2デコードエンジン120のそれぞれに2チャンネルの復号化を実行させ、残りの第3デコードエンジン120と第4デコードエンジン120を停止させる。または、第1デコードエンジン120〜第4デコードエンジン120を使用し、それらのクロック周波数を1/2にする。
このように、本実施の形態における画像復号化装置100は、モード情報に応じて、復号化処理を高解像度デコードと高速デコードと複数チャンネルデコードとのいずれかに切り替えることができるので、ユーザの使い勝手を向上させることができる。なお、画像復号化装置100における高解像度デコードおよび高速デコードはそれぞれ、符号化ストリームを4つの分割ストリームに分割してそれらを並列に復号化する処理であって、同一の処理である。つまり、高解像度デコードと高速デコードとでは、復号化対象の符号化ストリームの解像度・フレームレート(4k2kまたはHD)が異なるだけである。したがって、画像復号化装置100は、モード情報に応じて、復号化処理を、高解像度デコードまたは高速デコードと、複数チャンネルデコードとに切り替え、さらに符号化ストリームの解像度・フレームレートに応じて、復号化処理を高解像度デコードと高速デコードとに切り替えている。
(実施の形態2)
次に、本発明の実施の形態2について、詳細に説明する。
実施の形態1における画像復号化装置100は、MBスキップラン情報およびQP変化量を修正することにより、分割前の符号化ストリームにおいて連続するMBライン間の依存関係を、各分割ストリームにおけるMBラインの前後関係に応じた依存関係に修正した。
ここで、符号化ストリームには、QP変化量が含まれていないマクロブロックが含まれる場合がある。QP変化量が含まれていないマクロブロックは、量子化されていないマクロブロックに相当する。具体的には、H.264/AVC規格における、QP変化量が含まれていないマクロブロックは、例えば、(1)スキップマクロブロック、(2)非圧縮のマクロブロック(I_PCM)、または(3)イントラ予測の予測モードが“Intra16×16”ではなく、かつ“coded_block_pattern”が0である(非0係数を1つも含まない)マクロブロックである。
このようなQP変化量が含まれていないマクロブロックがMBラインの先頭に存在する場合、実施の形態1における画像復号化装置100は、修正対象となるQP変化量が存在しないので、QP変化量を修正することができない。
そこで、実施の形態2における画像復号化装置200は、QP変化量が含まれていないマクロブロックをMBラインの先頭に含む符号化ストリームから複数の分割ストリームを生成する際に、そのマクロブロックを含む分割ストリームにQP変化量を挿入することを1つの特徴とする。これにより、画像復号化装置200は、各分割ストリームにおける新たな前後関係に基づくQP変化量を適切に設定することができる。
ここで、分割ストリームにQP変化量が挿入された場合には、MBライン間にQP変化量が存在するため、MBラインを跨って連続するスキップマクロブロックの個数を1つのMBスキップラン情報を用いて示すことができない。そこで、実施の形態2における画像復号化装置200は、MBスキップラン情報の再結合処理を行わないことをもう1つの特徴とする。
以下、図面を用いて、本実施の形態における画像復号化装置200について説明する。
図23は、本発明の実施の形態2における画像復号化装置の構成を示すブロック図である。なお、図23において、図1と同様の構成要素については、同一の符号を付し、説明を省略する。
図23に示すように、画像復号化装置200は、デコーダ210とメモリ150とを備えている。
デコーダ210は、デコーダ110と同様に、メモリ150のストリームバッファ151に格納されている符号化ストリームを読み出して復号化することによって復号画像データを生成し、その復号画像データをメモリ150のフレームメモリ153に格納する。また、このデコーダ210は、ストリーム分割制御部140と、M個のストリーム分割部(第1ストリーム分割部〜第Mストリーム分割部)230と、N個のデコードエンジン(第1デコードエンジン〜第Nデコードエンジン)220とを備えている。
M個のストリーム分割部230は、MBスキップラン情報の修正処理およびQP変化量の修正処理を除き、M個のストリーム分割部130と同等の処理を実行する。ストリーム分割部230の詳細は、図24を用いて後述する。
N個のデコードエンジン220は、N個の分割ストリームのそれぞれを並列に復号化するN個の復号化部に相当する。N個のデコードエンジン220は、ストリーム分割部230によって分割ストリームに挿入された累積QP変化量を用いてQP値を算出する点を除いて、N個のデコードエンジン120と同等の処理を実行する。
続いて、ストリーム分割部230の構成および動作について詳細に説明する。
図24は、ストリーム分割部230の構成を示すブロック図である。
ストリーム分割部230は、処理管理部130m、セレクタSct、スキップラン修正部137aおよびQPデルタ修正部138a、138bの代わりに、スキップラン修正部237aおよびQPデルタ挿入部238a、238bを備えている点が、図10に示すストリーム分割部130と異なる。
処理管理部130mは、実施の形態1と同様、モード情報および振り分け制御情報を取得し、それらの情報にしたがって、ストリーム分割部230に備えられている他の構成要素を制御する。つまり、図6A〜図8に示すようなストリーム分割処理が行われるように、処理管理部130は、例えば、セレクタSctを制御し、SPS、PPS、または、処理対処のスライスから生成された分割ストリームを出力させたり、その出力を停止させたりする。
スキップラン修正部237aは、スキップラン修正部137aと同様に、MBスキップラン情報が、互いに異なる分割ストリームに割り当てられる少なくとも2つのMBラインに跨って連続するマクロブロックの個数を示す場合には、MBラインごとのブロックの個数を示すようにMBスキップラン情報を分割する。
ただし、スキップラン修正部237aは、スキップラン修正部137aと異なり、各分割ストリームにおいて、複数のMBスキップラン情報を1つのMBスキップラン情報に結合しない。
QPデルタ挿入部238a、238bは、QPデルタ修正部138a、138bと同様に、QP変化量が、2つのMBラインに跨るマクロブロック間の変化量を示す場合には、各分割ストリームにおけるマクロブロックの新たな前後関係に基づくQP変化量を計算する。
ただし、QPデルタ挿入部238a、238bは、計算したQP変化量を新たなQP変化量として分割点検出部139に出力する。これにより、各分割ストリームには、新たなQP変化量が挿入(設定)される。つまり、QPデルタ挿入部238a、238bは、各マクロブロックに含まれているQP変化量を修正しない。
分割点検出部139aは、分割ストリームのそれぞれに、スキップラン修正部237aから取得したMBスキップラン情報と、QPデルタ挿入部238aから取得した累積QP変化量とを含める。
分割点検出部139bは、分割ストリームのそれぞれに、QPデルタ挿入部238bから取得した累積QP変化量を含める。
次に、スキップラン修正部237aおよびQPデルタ挿入部238a、238bの動作について、スキップラン修正部137aおよびQPデルタ修正部138a、138bの動作と異なる点を中心に、詳細に説明する。
なお、以降の説明において、QPデルタ挿入部238a、238bについて共通する機能および処理動作を説明するときには、それらを区別することなくQPデルタ挿入部238と総称する。
図25は、MBスキップラン情報の修正処理およびQP変化量の挿入処理を説明するための説明図である。
図25に示されたピクチャには、MBラインL2の末尾に5個、MBラインL3の先頭に3個、MBラインL5の末尾に2個、MBラインL6の先頭に4個の連続するスキップマクロブロックが存在する。
また前述したように、スキップマクロブロックには、QP変化量が含まれない。したがって、マクロブロックCには、マクロブロックBのQP値とマクロブロックCのQP値との差分値がQP変化量として符号化されている。
しかし、このようなピクチャがMBラインごとに分割され、それらのMBラインが別々の分割ストリームに割り当てられると、それぞれの分割ストリームで、MBライン境界におけるマクロブロックの前後関係が変化してしまう。
すなわち、ストリーム分割後には、マクロブロックCが含まれる第2分割ストリームにおいて、マクロブロックCの直前に位置する、QP変化量を含むマクロブロックはマクロブロックAとなる。したがって、そのまま第2分割ストリームをデコードエンジン220が復号した場合、マクロブロックAのQP値に対して、マクロブロックBのQP値とマクロブロックCのQP値との差分値であるQP変化量を反映してしまうことになり、マクロブロックCのQP値を正しく復号化できない。
そこでQPデルタ挿入部238は、ストリームを分割することにより発生するマクロブロックの前後関係の変化を是正するように、MBラインへ挿入するための新たなQP変化量を分割点検出部139に出力する。つまり、QPデルタ挿入部238は、QP変化量が2つのMBラインを跨ぐブロック間のQP値の差分値を示すことにより、その2つのMBラインが依存関係を有する場合に、その依存関係を断つように、MBラインの先頭に挿入するための新たなQP変化量を分割点検出部139に出力する。
なお、本実施の形態では、MBラインの先頭にQP変化量が挿入されているが、必ずしもMBラインの先頭にQP変化量が挿入される必要はない。例えば、MBラインの先頭のマクロブロック内など他の場所にQP変化量が挿入されてもよい。
MBラインの先頭に挿入するためのQP変化量の計算方法としては、実施の形態1と同様に、全てのマクロブロックについてQP値を復元することによりQP変化量を計算する方法と、対象分割ストリームに割り当てられなかったマクロブロックのQP変化量を累積することによりQP変化量を計算する方法とが考えられる。本実施の形態では、後者の計算方法について説明する。
QPデルタ挿入部238は、MBラインL3〜L5に含まれる、QP変化量を含む全てのマクロブロックのQP変化量を累積した累積QP変化量を計算する。そして、QPデルタ挿入部238は、計算した累積QP変化量を再び符号化し、符号化された累積QP変化量を新たなQP変化量として分割点検出部139に出力する。その結果、図25に示すように、累積QP変化量は、MBラインL6の先頭に挿入される。つまり、第2分割ストリームには、累積QP変化量と、もともとマクロブロックCに含まれていたQP変化量とが設定される。なお、累積QP変化量の詳細な計算方法は、実施の形態1と同様であるので説明を省略する。
なお、ここではMBラインL6に着目して説明したが、QPデルタ挿入部238は、他のMBラインについても、累積QP変化量をMBラインの先頭に挿入するために、符号化された累積QP変化量を分割点検出部139に出力する。例えば、QPデルタ挿入部238は、MBラインL7の先頭に挿入するための累積QP変化量として、MBラインL4〜L6に含まれる、QP変化量を含む全てのマクロブロックのQP変化量を累積した累積QP変化量を計算する。そして、QPデルタ挿入部238は、計算した累積QP変化量を符号化し、符号化された累積QP変化量を分割点検出部139に出力する。これらの処理は、分割ストリーム毎に独立して行われる。
このように、本実施の形態では、累積QP変化量がMBラインの先頭に挿入されるので、MBラインを跨いでスキップマクロブロックは連続しない。つまり、スキップラン修正部237aは、実施の形態1におけるスキップラン修正部137aと異なり、MBスキップラン情報の結合処理を行わない。
例えば、図25に示されたピクチャの場合、スキップラン修正部237aは、スキップラン修正部137aと同様に、MBラインL2〜L3に跨って存在する8個のスキップマクロブロックに対応するMBスキップラン情報を、MBラインL2に含まれる5個のスキップマクロブロックに対応するMBスキップラン情報と、MBラインL3に含まれる3個のスキップマクロブロックに対応するMBスキップラン情報とに分割する。同様に、スキップラン修正部237aは、MBラインL5〜L6に跨って存在する6個のスキップマクロブロックに対応するMBスキップラン情報を、MBラインL5に含まれる2個のスキップマクロブロックに対応するMBスキップラン情報と、MBラインL6に含まれる4個のスキップマクロブロックに対応するMBスキップラン情報とに分割する。
ここで、MBラインL2に含まれる5個の連続するスキップマクロブロックと、MBラインL6に含まれる4個の連続するスキップマクロブロックとの間には、上述したように累積QP変化量が新たなQP変化量として挿入される。そこで、スキップラン修正部237aは、MBラインL2に含まれる5個の連続するスキップマクロブロックに対応するMBスキップラン情報と、MBラインL6に含まれる4個の連続するスキップマクロブロックに対応するMBスキップラン情報とを再結合しない。
なお、スキップラン修正部237aは、スキップラン修正部137aと同様に、このようにして得られたMBスキップラン情報を再び符号化し、符号化されたMBスキップラン情報を出力する。
図26は、スキップラン修正部237aの構成を示すブロック図である。なお、図26において、図17と同様の構成要素については、同一の符号を付し、詳細な説明を省略する。
スキップラン修正部237aは、スキップラン抽出部160、スキップラン分割部161、およびスキップラン符号化部164を備えている。つまり、スキップラン修正部237aは、実施の形態1におけるスキップラン修正部137aからスキップラン累積・保持部162と加算部163とを除いた構成と同様である。なお、スキップラン分割部161は、分割したMBスキップラン情報をスキップラン符号化部164に出力する。
図27は、スキップラン修正部237aによるMBスキップラン情報の修正動作を示すフローチャートである。なお、図27において、図18と同様の処理を行うステップについては、同一の符号を付し、説明を省略する。
まずスキップラン修正部237aは、MBスキップラン情報“mb_skip_run”を取得したかどうかを調べる(ステップS202)。すなわち、スキップラン修正部237aは、処理しているストリームがスライス終端に到達しているかどうかを判別しない。これは、後述するように、スキップラン修正部237aは、先行MBスキップラン情報を内部に保持しないため、スライス終端に到達したときの先行MBスキップラン情報の出力処理が不要だからである。
ここで、まだMBスキップラン情報を取得していない場合(ステップS202のNo)、スキップラン修正部237aは、処理の最初に戻りストリームを再度読み進める。
一方、MBスキップラン情報を取得している場合(ステップS202のYes)、スキップラン修正部237aは、実施の形態1と同様に、該当のMBスキップラン情報が含まれるマクロブロックのアドレス情報から、ピクチャ内におけるマクロブロックの位置を算出する(ステップS204)。
続いて、スキップラン修正部237aは、実施の形態1と同様に、取得したMBスキップラン情報を分割する必要があるかどうかを判定する(ステップS206)。
ここで、連続するスキップマクロブロックがMBライン境界に到達すると判定された場合(ステップS206のYes)、スキップラン修正部237aは、MBスキップラン情報を分割するためステップS216に進む。詳細は後述する。
一方、連続するスキップマクロブロックがMBライン境界に到達しないと判定された場合(ステップS206のNo)、スキップラン修正部237aは、MBスキップラン情報の再符号化処理を行う(ステップS212)。ここで、図18に示すステップS208およびステップS210の処理が実行されないのは、本実施の形態におけるスキップラン修正部237aは、MBスキップラン情報を再結合しないからである。
その後、スキップラン修正部237aは、再符号化されたMBスキップラン情報を分割点検出部139aに出力して処理を終了する(ステップS214)。
また、ステップS206で連続するスキップマクロブロックがMBライン境界に到達すると判定された場合(ステップS206のYes)、スキップラン修正部237aは、実施の形態1と同様に、MBライン境界を分割点として、該当のMBスキップラン情報を前半部と後半部とに分割する(ステップS216)。
さらにスキップラン修正部237aは、分割したMBスキップラン情報のうち、前半部をMBスキップラン情報として再符号化する(ステップS250)。その後スキップラン修正部237aは、再符号化されたMBスキップラン情報を分割点検出部139aに出力する(ステップS252)。つまり、本実施の形態では、MBスキップラン情報を再結合する必要がないので、実施の形態1のように先行MBスキップラン情報を内部に保持しない。
次にスキップラン修正部237aは、実施の形態1と同様に、分割したMBスキップラン情報のうち、後半部を新たなMBスキップラン情報として設定した後(ステップS220)、その長さが0であるかどうかを判定する(ステップS222)。
ステップS222で新たなMBスキップラン情報の長さが0であると判定された場合(ステップS222のYes)、スキップラン修正部237aは、それ以上処理すべきMBスキップラン情報がないものとして、処理を終了する。
ステップS222で新たなMBスキップラン情報の長さが0でないと判定された場合(ステップS222のYes)、スキップラン修正部137aは、まだ処理すべきMBスキップラン情報が存在するものとしてステップS204に戻り、再度MBスキップラン情報の分割および出力処理を行う。
以上説明した処理が、スキップラン修正部237aではストリームの終了まで繰り返し行われる。このように、スキップラン修正部237aでは、MBスキップラン情報の分割が適切に行われる。
図28は、QPデルタ挿入部238による累積QP変化量の挿入処理を示すフローチャートである。なお、図28において、図21と同様の処理を行うステップについては、同一の符号を付し、詳細な説明を省略する。
マクロブロックの処理が開始されると、QPデルタ挿入部238は、実施の形態1と同様に、ステップS300〜ステップS316までの処理を実行する。
そして、処理対象マクロブロックがMBラインの先頭に位置していると判定された場合(ステップS316のYes)、QPデルタ挿入部238は、処理対象マクロブロックが割り当てられる分割ストリームに対応する累積QP変化量を符号化し、分割点検出部139に出力する(ステップS352)。つまり、QPデルタ挿入部238は、MB情報を出力する前に、累積QP変化量を出力する。
続いて、QPデルタ挿入部238は、処理対象マクロブロックが含まれる分割ストリームに対応する累積QP変化量を0にリセットする(ステップS354)。そして、QPデルタ挿入部238は、MB情報を分割点検出部139に出力し、処理を終了する(ステップS356)。つまり、QPデルタ挿入部238は、MB情報にQP変化量が含まれている場合には、QP変化量を修正することなくそのまま出力する。
一方、処理対象マクロブロックがMBラインの先頭に位置していないと判定された場合(ステップS316のNo)、QPデルタ挿入部238は、MB情報を分割点検出部139に出力し、処理を終了する(ステップS350)。つまり、QPデルタ挿入部238は、MB情報にQP変化量が含まれている場合には、そのQP変化量を修正することなく、MB情報を出力する。
以上のように、QPデルタ挿入部238は、MBラインの先頭に挿入するために累積した新たなQP変化量(累積QP変化量)と、符号化ストリームに含まれていたQP変化量とを分割点検出部139に出力する。
このように、本実施の形態における画像復号化装置200では、実施の形態1における画像復号化装置100と同様に、N個のデコードエンジン220による復号化処理の負担を均等にすることができ、復号化の並列処理を適切に実行することができる。
特に、MBラインの先頭に位置するマクロブロックがQP変化量を含まない場合であっても、本実施の形態における画像復号化装置200は、新たなQP変化量をMBラインに挿入することにより、並行して復号化処理が行われるときに正しいQP値を得ることができる。
また、このような本実施の形態における画像復号化装置200は、実施の形態1における画像復号化装置100と同様に、M個のストリーム分割部230に入力されるモード情報に応じて、図22A〜図22Cに示した高解像度デコード、高速デコード、および複数チャンネルデコードのうちの何れかを実行する。
これにより、本実施の形態における画像復号化装置200は、モード情報に応じて、復号化処理を高解像度デコードと高速デコードと複数チャンネルデコードとのいずれかに切り替えることができるので、ユーザの使い勝手を向上させることができる。
(実施の形態3)
次に、本発明の実施の形態3について、詳細に説明する。
図29は、本発明の実施の形態3における画像符号化装置の構成を示すブロック図である。
本実施の形態における画像符号化装置300は、簡単な構成で符号化の並列処理を適切に実行する装置であって、エンコーダ310とメモリ360とを備えている。
メモリ360は、エンコーダ310に入力される原画像データ、およびエンコーダ310により中間的に生成されたデータを記憶するための領域を有する。
具体的には、メモリ360は、フレームメモリ361と、分割ストリームバッファ362と、M個の部分ストリームバッファ(第1部分ストリームバッファ〜第M部分ストリームバッファ)363とを備えている。
フレームメモリ361には、符号化対象となるピクチャの原画像データが格納されるとともに、N個のエンコードエンジン(符号化部)320によって生成されたN個の分割ローカルデコード画像データが格納される。分割ストリームバッファ362には、エンコーダ310により生成されるN個の分割ストリームが、上述の中間的に生成されたデータとして格納される。なお、分割ストリームバッファ362には、N個のエンコードエンジン320のそれぞれに対して割り当てられた領域がある。M個の部分ストリームバッファ363のそれぞれには、エンコーダ310により生成される部分ストリーム(結合符号化領域)が格納される。
エンコーダ310は、メモリ360のフレームメモリ361に格納されている原画像データを読み出して符号化することによって符号化ストリームを生成して出力する。また、このエンコーダ310は、N個のエンコードエンジン(第1エンコードエンジン〜第Nエンコードエンジン)320と、M個のストリーム結合部(第1ストリーム結合部〜第Mストリーム結合部)330と、ストリーム結合制御部340と、多重化部350とを備えている。
なお、本実施の形態におけるエンコードエンジン320は、HDの画像(1920×1088画素、60i)を2チャンネル分符号化可能な処理能力を有する。
N個のエンコードエンジン320は、モード情報を取得し、そのモード情報に応じて、符号化対象となるピクチャの原画像データをMBラインもしくはMBラインペア毎に読み出し、並列に符号化を行う。すなわち、本実施の形態における画像符号化装置300は、実施の形態1における画像復号化装置100と同様にピクチャを複数のMBラインもしくはMBラインペアに分割し、それぞれの符号化処理をN個のエンコードエンジン320に割り当てることで、符号化処理の並列化を実現している。
さらに、N個のエンコードエンジン320のそれぞれは、画面内予測によりマクロブロックを符号化するときには、その符号化対象マクロブロックの左上、上および右上にあるマクロブロックを符号化およびローカルデコードしたエンコードエンジン320から、それらのローカルデコードされたマクロブロックの情報を隣接MB情報として取得する。その隣接MB情報を取得したエンコードエンジン320は、その隣接MB情報を用いて、符号化対象マクロブロックを符号化する。また、エンコードエンジン320は、例えばデブロッキングフィルタ処理や動きベクトル予測処理、可変長符号化処理を行う場合にも、上述と同様に、処理対象のマクロブロックの左上、上および右上にある符号化およびローカルデコードされたマクロブロックの情報を隣接MB情報として取得して、上述の処理を行う。
なお、本実施の形態では、説明を簡単にするために、以下、NをN=4として説明する。また、本実施の形態では、N(N=4)個のエンコードエンジン320はそれぞれ、符号化対象のマクロブロックから見て、左、左上、上、および右上のマクロブロックの符号化が終了すると、それらの隣接MB情報を用いて、その符号化対象のマクロブロックの符号化を開始する。その結果、第1エンコードエンジン320〜第4エンコードエンジン320はそれぞれ、各MBラインにおいて水平方向に互いに異なる位置にあるマクロブロックを並列に符号化する。
図30Aは、MBAFFを使用せずにピクチャを符号化する場合の符号化の順序を示す図である。
MBAFFを使用せずにピクチャを符号化する場合、第1エンコードエンジン320は第0MBラインを符号化し、第2エンコードエンジン320は第1MBラインを符号化し、第3エンコードエンジン320は第2MBラインを符号化し、第4エンコードエンジン320は第3MBラインを符号化する。なお、第k(kは0以上の整数)MBラインは、ピクチャの上端からk番目にあるMBラインを示し、例えば、第0MBラインは、ピクチャの上端から0番目にあるMBラインである。
ここで、ピクチャの符号化が開始されるときには、まず、第1エンコードエンジン320が第0MBラインの符号化を開始する。次に、第0MBラインの左端にある2つのマクロブロックの符号化が完了すると、第2エンコードエンジン320が第1MBラインの左端のマクロブロックの符号化を開始する。そして、第1MBラインの左端にある2つのマクロブロックの符号化が完了すると、第3エンコードエンジン320が第2MBラインの左端のマクロブロックの符号化を開始する。同様に、第2MBラインの左端にある2つのマクロブロックの符号化が完了すると、第4エンコードエンジン320が第3MBラインの左端のマクロブロックの符号化を開始する。
したがって、第(k+1)MBラインは、第kMBラインに比べて、2マクロブロック分だけ遅れて、左端のマクロブロックから右端のマクロブロックまで符号化される。
図30Bは、MBAFFを使用してピクチャを符号化する場合の符号化の順序を示す図である。
MBAFFを使用してピクチャを符号化する場合、MBAFFを使用せずにピクチャを符号化する場合と同様に、第1エンコードエンジン320は第0MBラインペアを符号化し、第2エンコードエンジン320が第1MBラインペアを符号化し、第3エンコードエンジン320が第2MBラインペアを符号化し、第4エンコードエンジン320が第3MBラインペアを符号化する。なお、第k(kは0以上の整数)MBラインペアは、ピクチャの上端からk番目にある2つのMBラインからなる構成単位を示し、例えば、第0MBラインペアは、ピクチャの上端から0番目にある2つのMBラインからなる構成単位である。
ここで、ピクチャの符号化が開始されるときには、まず、第1エンコードエンジン320が第0MBラインペアの符号化を開始する。次に、第0MBラインペアの左端にある2つのマクロブロックペアの符号化が完了すると、第2エンコードエンジン320が第1MBラインペアの左上端のマクロブロックの符号化を開始する。そして、第1MBラインペアの左端にある2つのマクロブロックペアの符号化が完了すると、第3エンコードエンジン320が第2MBラインペアの左上端のマクロブロックの符号化を開始する。同様に、第2MBラインペアの左端にある2つのマクロブロックペアの符号化が完了すると、第4エンコードエンジン320が第3MBラインペアの左上端のマクロブロックの符号化を開始する。
したがって、第(k+1)MBラインペアは、第kMBラインペアに比べて、2マクロブロックペア分だけ遅れて、左端のマクロブロックペアから右端のマクロブロックペアまで符号化される。
なお、MBAFFを使用せずにピクチャを符号化する場合、および、MBAFFを使用してピクチャを符号化する場合のそれぞれにおいて、第(k+1)MBラインまたは第(k+1)MBラインペアは、第kMBラインまたは第kMBラインペアに比べて、少なくとも2マクロブロック分または2マクロブロックペア分だけ遅れて符号化されればよい。つまり、3マクロブロック分または3マクロブロックペア分以上遅れて符号化されてもよい。例えば、第(k+1)MBラインまたは第(k+1)MBラインペアが、第kMBラインまたは第kMBラインペアに比べて、2マクロブロック分または2マクロブロックペア分だけ遅れて符号化される場合には、ピクチャの符号化にかかる時間を最短にすることができ、3マクロブロック分または3マクロブロックペア分以上遅れて符号化される場合には、その遅れる分量に応じてピクチャの符号化にかかる時間が長くなる。
なお、N個のエンコードエンジン320は、符号化方法としてCAVLCを用いて符号化を行う場合には、可変長符号化処理を含めて符号化処理を行うが、符号化方法としてCABACを用いて符号化を行う場合には、可変長符号化処理のうち、符号語の2値化のみを行い、算術符号化は行わない。これは、CABAC方式による算術符号化処理において、N個のエンコードエンジン320が複数のMBラインを跨いで依存関係を持つことにより、並列処理ができないためである。ここで、N個のエンコードエンジン320にて実施されない算術符号化処理は、後述するM個のストリーム結合部330にて実施される。ただし、符号化方法としてCABACを用いて符号化を行う場合でも、後段のストリーム結合部330がスライスを正しく認識できるよう、スライス毎に仮のスタートコードを付与するとともに、EPB(エミュレーション防止バイト)を挿入しておく。
このようにN個のエンコードエンジン320によってそれぞれ符号化されたデータは、N個の分割ストリームとして分割ストリームバッファ362に格納される。
ストリーム結合制御部340は、モード情報を取得し、そのモード情報に応じて、M個のストリーム結合部330におけるストリーム結合処理の処理量が均等になるようにするため、各ストリーム結合部330のそれぞれに対し、ストリーム結合処理を所定の単位で振り分けるための振り分け制御情報を通知する。本実施の形態では、ストリーム結合制御部340は、M個のストリーム結合部330におけるストリーム結合処理を、スライス単位で振り分けるものとして説明する。つまり、ストリーム結合制御部340は、振り分け制御情報の通知によって、符号化ストリームに含まれるべき生成対象のスライスごとに、そのスライスに対するストリーム結合処理を、M個のストリーム結合部330の何れか1つに実行させる。例えば、振り分け制御情報は、ストリーム結合処理の対象とされるスライスを識別するためのスライス番号を示す。さらに、ストリーム結合制御部340は、ストリーム結合処理をスライス単位でM個のストリーム結合部330に振り分けた結果から、多重化部350に対し、M個の部分ストリームバッファ363のうちどの部分ストリームバッファ363から部分ストリームを取得すればよいかを示す選択情報を通知する。
M個のストリーム結合部330はそれぞれ、モード情報および振り分け制御情報を取得し、そのモード情報および振り分け制御情報に応じて、分割ストリームバッファ362から処理すべきスライスに含まれるN個の分割ストリーム(第1分割ストリーム〜第N分割ストリーム)を抽出し、抽出したN個の分割ストリームを結合することで、そのスライスを所定の単位として再構成する。つまり、本実施の形態におけるストリーム結合部330は、ストリーム結合制御部340によって振り分けられたスライスごとに、そのスライスを構成するN個の分割ストリームをそれぞれ複数のMBラインに分割する。そして、ストリーム結合部330は、それらの複数のMBラインのそれぞれを、生成対象であるスライスに順に割り当てることにより分割ストリームをひとつに結合し、スライスを再構成する。上述のストリーム結合処理は、このように、N個のエンコードエンジン320によって生成されたN個の分割ストリームのそれぞれに含まれる、原画像データの元のスライスに対応するスライス(部分領域)を、1つのスライス(結合符号化領域)に再構成する処理である。なお、このストリーム結合処理では、符号化された複数のMBライン(構成単位)からスライス(部分領域)が構成されている場合には、そのスライスを符号化された複数のMBラインに分割して組み替えることによって、つまり、上述のように、その複数のMBラインを生成対象であるスライスに順に割り当てることによって、上述の1つのスライス(結合符号化領域)を生成する。また、M個のストリーム結合部330は、そのストリーム結合処理を並列して実行する。これにより、M個のストリーム結合部330はそれぞれ再構成されたスライスを部分ストリームとして生成する。
なお、M個のストリーム結合部330はそれぞれ、分割ストリームバッファ362に格納されたN個の分割ストリームのそれぞれから、スタートコードを探索することで、振り分け制御情報により通知されたスライスを抽出する。
また、符号化方法としてCABACを用いて符号化を行う場合、M個のストリーム結合部330は、N個の分割ストリームに対して算術符号化を行いながらスライスを再構成する。
M個のストリーム結合部330は、このように再構成したスライスを、M個の部分ストリーム(第1部分ストリーム〜第M部分ストリーム)としてM個の対応する部分ストリームバッファ363に格納する。すなわち、第1ストリーム結合部330は、第1部分ストリームを第1部分ストリームバッファ363に格納し、第2ストリーム結合部330は、第2部分ストリームを第2部分ストリームバッファ363に格納し、第Mストリーム結合部330は、第M部分ストリームを第M部分ストリームバッファ363に格納する。
また、M個のストリーム結合部330のそれぞれは、スライスを所定の単位として扱って部分ストリームを生成する際に、SPSやPPS、スライスヘッダなどのヘッダ情報をスライスに付随させて出力する。
多重化部350は、モード情報および選択情報を取得し、そのモード情報および選択情報に応じて、処理すべき部分ストリームをM個の部分ストリームバッファ363のいずれかから読み出し、読み出した部分ストリームを順に出力することでM個の部分ストリームを多重化し、その結果、一つの符号化ストリームを生成して出力する。
例えば、ストリーム結合制御部340からの選択情報により、第1部分ストリームバッファ363から部分ストリームを取得するように通知された場合には、多重化部350は、第1部分ストリームを第1部分ストリームバッファ363から読み出す。また、ストリーム結合制御部340からの選択情報により、第M部分ストリームバッファ363から部分ストリームを取得するように通知された場合には、多重化部350は、第M部分ストリームを第M部分ストリームバッファ363から読み出す。そして、多重化部350は、M個の部分ストリームバッファ363から読み出した部分ストリームを多重化し、符号化ストリームとして出力する。
このような本実施の形態における画像符号化装置300の特徴は、ストリーム結合部330により、N個の分割ストリームに含まれるスライスをそれぞれ複数のMBラインに分割し、それらを結合することによって1つの新たなスライスを再構成することである。スライスの再構成は、スライスヘッダの挿入処理、スライス終端処理、スキップラン修正処理、およびQPデルタ修正処理を含む。
図31は、スライスヘッダの挿入処理およびスライス終端処理を説明するための説明図である。
この図では、ピクチャのMBライン0〜MBライン5から1つのスライスを構成して符号化する場合の例を示している。
N個のエンコードエンジン320は、このスライスに含まれる互いに異なるMBラインを並列に符号化する。その結果、N個のエンコードエンジン320はそれぞれ、1つまたは複数のMBラインからなるデータを単独のスライスとして符号化する。すなわち、第1エンコードエンジン320はMBライン0およびMBライン4からなるデータを単独のスライスとして符号化し、第2エンコードエンジン320はMBライン1およびMBライン5からなるデータを単独のスライスとして符号化し、第3エンコードエンジン320はMBライン2からなるデータを単独のスライスとして符号化し、第4エンコードエンジン320はMBライン3からなるデータを単独のスライスとして符号化する。
その結果、図31の(a)〜(d)に示すように、N個のエンコードエンジン320によって生成される各分割ストリームに含まれるスライスは、1つまたは複数のMBラインのデータとスライス終端情報を含む。すなわち、第1分割ストリームは、MBライン0およびMBライン4のデータとスライス終端情報ec1を含み、第2分割ストリームは、MBライン1およびMBライン5のデータとスライス終端情報ec2を含み、第3分割ストリームは、MBライン2のデータとスライス終端情報ec3を含み、第4分割ストリームはMBライン3のデータとスライス終端情報ec4を含む。
ストリーム結合部330は、これら第1分割ストリーム〜第4分割ストリームのそれぞれのスライスを結合して新たなスライスを再構成することで、部分ストリーム(結合符号化領域)を生成する。
具体的には、ストリーム結合部330は、新たなスライスに対して適切なスライスヘッダを付与して部分ストリームに割り当てる。次にストリーム結合部330は、第1分割ストリームからMBライン0のデータを抽出し、部分ストリームに割り当てる。同様に、ストリーム結合部330は、第2分割ストリームからMBライン1のデータを抽出し、部分ストリームに割り当てる。
次にストリーム結合部330は、第3分割ストリームからMBライン2のデータを抽出する。MBライン2のデータにはスライス終端情報ec3が付随するが、再構成すべき新たなスライスはMBライン5まで継続するため、スライス終端情報ec3を除去し、MBライン2以降もスライスが継続するものとしてMBライン2を部分ストリームに割り当てる。同様に、ストリーム結合部330は、第4分割ストリームからMBライン3のデータおよびスライス終端情報ec4を抽出するが、スライス終端情報ec4を除去し、MBライン3以降もスライスが継続するものとしてMBライン3を部分ストリームに割り当てる。同様に、ストリーム結合部330は、第1分割ストリームからMBライン4のデータおよびスライス終端情報ec1を抽出するが、スライス終端情報ec1を除去し、MBライン4以降もスライスが継続するものとしてMBライン4を部分ストリームに割り当てる。
最後にストリーム結合部330は、第2分割ストリームからMBライン5のデータおよびスライス終端情報ec2を抽出する。ストリーム結合部330は、MBライン5を部分ストリームに割り当てるとともに、スライス終端情報ec2を除去し、再構成される新たなスライスに適切なスライス終端情報eccを生成して部分ストリームに割り当てる。
ここで、再構成される新たなスライスに適切なスライス終端情報eccを付与し直すのは、MBラインの結合により再構成される新たなスライス末尾のビット位置が、元の分割ストリームにおけるスライス末尾のビット位置と異なる可能性があるためである。ストリーム結合部330は、再構成される新たなスライスに適切なスライス終端情報を付与することで、スライスの末尾をバイト境界に合わせる。
このように、ストリーム結合部330は、スライスに対して適切なスライスヘッダの挿入およびスライス終端処理を行うとともに、各分割ストリームから抽出したMBラインのデータを結合することで、画像符号化装置300が出力する符号化ストリームの方式に準じたスライスを再構成することができる。
次に、ストリーム結合制御部340によって行われる、スライスの振り分け処理について説明する。
ここまでで説明したように、本実施の形態における画像符号化装置300は、N個のエンコードエンジン320と、M個のストリーム結合部330とを備えており、動画像データ(原画像データ)の符号化処理を並列化している。このように、システム全体における並列処理を可能とすることにより、符号化処理全体の性能向上を実現している。
ここで、M個のストリーム結合部330は、N個のエンコードエンジン320によって生成される各分割ストリームのスライスを所定の単位として結合することで、新たなスライスを再構成するが、スライスの大きさは一定ではないため、その処理量はスライス毎に変動する。
また、全てのスライスの大きさを一定にするようなシステムであっても、処理の対象は符号化されたストリームであるため、その処理量はスライス毎の符号量に依存する。一般的な動画像符号化方式では、符号化ストリームは可変長符号化されており、データの内容に応じて符号量が変動する。また、H.264/AVC方式におけるスライスには、Iスライス、Pスライス、Bスライスなどと呼ばれる種類がある。画面内符号化処理が行われるIスライスでは符号量が多く、画面内符号化処理に加えて画面間符号化処理が行われるPスライスと、Bスライスでは符号量が少なくなる傾向がある。このように、符号化ストリームに含まれる符号化スライスの符号量は一定ではなく、大きく変動しうる。そのため、N個のエンコードエンジン320によって生成される各分割ストリームのスライスを順番にM個のストリーム結合部330に振り分けるだけでは各ストリーム結合部330の処理量が均等にならず、並列化による処理性能向上の効果が十分に得られない。
そこで、ストリーム結合制御部340は、各ストリーム結合部330の処理量が均等になるように、各スライスをストリーム結合部330のそれぞれに対して振り分ける。
図32Aおよび図32Bは、ストリーム結合制御部340によるスライスの振り分け処理の具体例を示す説明図である。なお、本実施の形態では、説明を簡単にするために、以下、MをM=2として説明する。
図32Aは、N個のエンコードエンジン320により生成されたN個の分割ストリームの例を示している。この例におけるN個の分割ストリーム(第1分割ストリーム〜第4分割ストリーム)は、ピクチャを構成するスライスデータ(スライス)から構成されている。ピクチャ0はスライス0のみから構成される。ピクチャ1はスライス1およびスライス2から構成される。ピクチャ2はスライス3およびスライス4から構成される。
図32Bは、ストリーム結合制御部340による一連のスライスの振り分け処理を示す図である。処理の開始時点で、各ストリーム結合部330は、これから処理するスライスの番号を保持している。例えば、第1ストリーム結合部330はこれから処理するスライスの番号の初期値としてSN1=0を、第2ストリーム結合部330はこれから処理するスライスの番号の初期値としてSN2=0を保持している。
ストリーム結合制御部340は、各ストリーム結合部330の処理状況に応じて、振り分け制御情報を送信することにより、各ストリーム結合部330に対してスライスの再構成を通知するとともに、必要に応じてSPS、PPSなどのヘッダ情報を付与するように各ストリーム結合部330に指示する。
スライスの再構成を通知されたストリーム結合部330は、対象のスライスを含む複数の分割ストリームを分割ストリームバッファ362から読み出し、読み出した複数の分割ストリームをそれぞれMBラインに分割し、分割されたMBラインを再結合するとともに、スライスヘッダの付与などを行うことによって、新たなスライスを再構成する。以下、ストリーム結合部330におけるこれら一連の処理を、ストリーム結合処理と記載する。
タイミングt0で、第1ストリーム結合部330および第2ストリーム結合部330はどちらもストリーム結合処理をしていない。そのためストリーム結合制御部340は、振り分け制御情報を送信することにより、第1ストリーム結合部330に対してスライス0のストリーム結合を通知するとともに、ストリームの先頭に存在すべきSPSの付与を指示し、且つ、ピクチャ0の先頭に存在すべきPPS0の付与を指示する。また、ストリーム結合制御部340は、振り分け制御情報を送信することにより、第2ストリーム結合部330に対してスライス1のストリーム結合処理を通知するとともに、ピクチャ1の先頭に存在すべきPPS1の付与を指示する。なお、本実施の形態では、振り分け制御情報は、例えば、ストリーム結合処理の対象とされるスライスを識別するためのスライス番号と、SPSまたはPPSを付与すべきか否かを指示するための情報とを示す。
第1ストリーム結合部330は、振り分け制御情報により、ストリーム結合制御部340からスライス0のストリーム結合を通知されると、ストリーム結合を通知されたスライスのスライス番号と、これから処理するスライスの番号として保持しているSN1の値とを比較する。このタイミングでは、両者は0で一致しているため、第1ストリーム結合部330は最初に入力されるスライスに対してストリーム結合処理を行う。
具体的には、第1ストリーム結合部330は、まずSPSおよびPPS0を生成して付与する。次に、第1ストリーム結合部330は、スライス0に対してストリーム結合処理を行うとともに、生成した部分ストリームの新たなスライス0を第1部分ストリームバッファ363に対して出力する。
一方、第2ストリーム結合部330は、振り分け制御情報により、ストリーム結合制御部340からスライス1のストリーム結合を通知されると、ストリーム結合を通知されたスライスのスライス番号と、これから処理するスライスの番号として保持しているSN2の値とを比較する。このタイミングでは、ストリーム結合を通知されたスライスのスライス番号は1を示し、SN2は0を示しており、その差分は1である。そこで、第2ストリーム結合部330は、入力される1スライス分の処理をスキップし、2番目に入力されるスライスに対してストリーム結合処理を行う。つまり、第2ストリーム結合部330は、差分の数だけのスライスに対するストリーム結合処理をスキップする。
具体的には、第2ストリーム結合部330は、まず入力されるスライス0のストリーム結合処理をスキップする。なお、ストリーム結合処理のスキップは、分割ストリームに付随するスタートコードを探索することで行われる。ここで、第2ストリーム結合部330は、スライス0のストリーム結合処理をスキップしたことで、SN2をインクリメントしてSN2=1とする。
次に、第2ストリーム結合部330は、ストリーム結合を通知されたスライスのスライス番号とSN2の値とが一致しているため、PPS1を生成して付与するとともに、スライス1に対してストリーム結合処理を行い、生成した部分ストリームの新たなスライス1を第2部分ストリームバッファ363に対して出力する。
タイミングt1では、第2ストリーム結合部330によるスライス1に対するストリーム結合処理が終了するため、第2ストリーム結合部330は、ストリーム結合制御部340に対して処理の完了を通知するとともに、第2部分ストリームバッファ363に出力した部分ストリームの情報を通知する。具体的には、実際に部分ストリームバッファ363に出力したPPS1およびスライス1を構成するNALユニットの個数を通知する。
ここでは、第2ストリーム結合部330は、PPS1とスライス1で合計2個のNALユニットを処理したことをストリーム結合制御部340に対して通知する。同時に第2ストリーム結合部330は、スライス1に対するストリーム結合処理が終了したことで、SN2をインクリメントしてSN2=2とする。第2ストリーム結合部330から処理完了の通知を受けたストリーム結合制御部340は、第2ストリーム結合部330に対してスライス2のストリーム結合を通知する。
第2ストリーム結合部330は、ストリーム結合制御部340からスライス2のストリーム結合を通知されると、ストリーム結合を通知されたスライスのスライス番号と、これから処理するスライスの番号として保持しているSN2の値とを比較する。このタイミングでは、両者は2で一致しているため、第2ストリーム結合部330は最初に入力されるスライスに対してストリーム結合処理を行う。具体的には、第2ストリーム結合部330は、スライス2に対してストリーム結合処理を行う。
タイミングt2では、第1ストリーム結合部330によるスライス0に対するストリーム結合処理が終了するため、第1ストリーム結合部330は、ストリーム結合制御部340に対して処理の完了を通知するとともに、第1部分ストリームバッファ363に出力した部分ストリームの情報として、SPS、PPS0およびスライス0を構成するNALユニットの個数「3」を通知する。同時に第1ストリーム結合部330は、スライス0に対するストリーム結合処理が終了したことで、SN1をインクリメントしてSN1=1とする。第1ストリーム結合部330から処理完了の通知を受けたストリーム結合制御部340は、振り分け制御情報により、第1ストリーム結合部330に対してスライス3のストリーム結合を通知するとともに、ピクチャ2の先頭に存在すべきPPS2の付与を指示する。
第1ストリーム結合部330は、ストリーム結合制御部340からスライス3のストリーム結合を通知されると、ストリーム結合を通知されたスライスのスライス番号と、これから処理するスライスの番号として保持しているSN1の値とを比較する。このタイミングでは、ストリーム結合を通知されたスライスのスライス番号は3を示し、SN2は1を示しており、その差分は2である。そこで、第1ストリーム結合部330は入力される2スライス分の処理をスキップし、3番目に入力されるスライスに対してストリーム結合処理を行う。
具体的には、第1ストリーム結合部330は、まず入力されるスライス1のストリーム結合処理をスキップする。ここで、第1ストリーム結合部330は、スライス1のストリーム結合処理をスキップしたことで、SN1をインクリメントしてSN1=2とする。次に、第1ストリーム結合部330にはスライス2が入力されるが、ストリーム結合を通知されたスライスのスライス番号とSN1の値とがまだ一致していないため、入力されるスライス2の処理をスキップする。ここで、第1ストリーム結合部330は、スライス2の処理をスキップしたことで、SN1をインクリメントしてSN1=3とする。
次に、第1ストリーム結合部330は、ストリーム結合を通知されたスライスのスライス番号とSN1の値とが一致しているため、PPS2を生成して付与するとともに、スライス3に対してストリーム結合処理を行い、生成した部分ストリームの新たなスライス3を第1部分ストリームバッファ363に対して出力する。
タイミングt3では、第2ストリーム結合部330によるスライス2に対するストリーム結合処理が終了するため、第2ストリーム結合部330は、ストリーム結合制御部340に対して処理の完了を通知するとともに、第2部分ストリームバッファ363に出力した部分ストリームの情報として、スライス2を構成するNALユニットの個数「1」を通知する。同時に第2ストリーム結合部330は、スライス2に対するストリーム結合処理が終了したことで、SN2をインクリメントしてSN2=3とする。第2ストリーム結合部330から処理完了の通知を受けたストリーム結合制御部340は、第2ストリーム結合部330に対してスライス4のストリーム結合を通知する。
第2ストリーム結合部330は、ストリーム結合制御部340からスライス4のストリーム結合を通知されると、ストリーム結合を通知されたスライスのスライス番号と、これから処理するスライスの番号として保持しているSN2の値とを比較する。このタイミングでは、ストリーム結合を通知されたスライスのスライス番号は4を示し、SN2は3を示しており、その差分は1である。そこで、第2ストリーム結合部330は入力される1スライス分の処理をスキップし、2番目に入力されるスライスに対してストリーム結合処理を行う。
具体的には、第2ストリーム結合部330は、まず入力されるスライス3の処理をスキップする。ここで、第2ストリーム結合部330は、スライス3の処理をスキップしたことで、SN2をインクリメントしてSN2=4とする。
次に、第2ストリーム結合部330は、ストリーム結合を通知されたスライスのスライス番号とSN2の値とが一致しているため、スライス4に対してストリーム結合処理を行うとともに、生成した部分ストリームの新たなスライス4を第2部分ストリームバッファ363に対して出力する。
タイミングt4では、第1ストリーム結合部330によるスライス3に対するストリーム結合処理が終了するため、第1ストリーム結合部330は、ストリーム結合制御部340に対して処理の完了を通知するとともに、第1部分ストリームバッファ363に出力した部分ストリームの情報として、PPS2およびスライス3を構成するNALユニットの個数「2」を通知する。同時に第1ストリーム結合部330は、スライス3に対するストリーム結合処理が終了したことで、SN1をインクリメントしてSN1=4とする。
同様に、タイミングt5では、第2ストリーム結合部330によるスライス4に対するストリーム結合処理が終了するため、第2ストリーム結合部330は、ストリーム結合制御部340に対して処理の完了を通知するとともに、第2部分ストリームバッファ363に出力した部分ストリームの情報、スライス4を構成するNALユニットの個数「1」を通知する。同時に第2ストリーム結合部330は、スライス4に対するストリーム結合処理が終了したことで、SN2をインクリメントしてSN2=5とする。
以上説明したように、ストリーム結合制御部340は、処理を完了したストリーム結合部330に対して順次スライスのストリーム結合処理を振り分けていく。これにより、各ストリーム結合部330の処理量が均等になる。
図33は、図32Bで示したスライスの振り分け、およびストリーム結合処理を行った場合における部分ストリームバッファ363の状態を示す図である。
第1部分ストリームバッファ363には、スライス0およびスライス3に対応する部分ストリームが格納される。また、第2部分ストリームバッファ363には、スライス1、スライス2およびスライス4に対応する部分ストリームが格納される。このように、2つの部分ストリームバッファ363には各ストリーム結合部330における処理量に応じてスライスが分散して格納されるため、各スライスの格納順序は一定とはならない。
そのためストリーム結合制御部340は、多重化部350がストリーム結合処理前の分割ストリームと同じスライス順で部分ストリームを取得できるよう、M個の部分ストリームバッファ363のうち、どの部分ストリームバッファから部分ストリームを取得すればよいかを示す選択情報を、その多重化部350に通知する。
図34は、図32Bで示したスライスの振り分け、およびストリーム結合処理を行った場合における選択情報の形式の一例を示す図である。
図34に示すように、選択情報は、1スライスにつき、部分ストリームバッファ情報と、NALユニット数情報とを含んでおり、ストリーム結合制御部340によるスライスの振り分け処理を行う毎に生成される。部分ストリームバッファ情報は、ストリーム結合制御部340が、第1ストリーム結合部330と第2ストリーム結合部330のどちらにスライスを振り分けたかを示す。つまり、部分ストリームバッファ情報は、ストリーム結合部330によるストリーム結合処理によって生成された新たなスライス(新たなスライスを含む部分ストリーム)が格納されている部分ストリームバッファを示す。また、NALユニット数情報は、ストリーム結合部330において、対象となるスライスの処理を行った際に出力されたNALユニット個数を示しており、ストリーム結合部330の処理完了時に、ストリーム結合部330からストリーム結合制御部340に対して通知される。
ストリーム結合制御部340によって生成された選択情報は、多重化部350に対して通知され、例えば多重化部350内のFIFO(先入れ先出し)メモリに格納される。FIFOに格納された選択情報は、通知された順番に多重化部350によって読み出され、部分ストリームバッファ363からのストリーム取得処理に利用される。
具体的には、まず多重化部350は、スライス0の選択情報として、部分ストリームバッファ情報=1およびNALユニット数情報=3を読み出す。多重化部350はスライス0の選択情報に従い、第1部分ストリームバッファ363から、3個のNALユニット(SPS、PPS0、スライス0)を取得する。次に、多重化部350は、スライス1の選択情報として、部分ストリームバッファ情報=2およびNALユニット数情報=2を読み出す。多重化部350はスライス1の選択情報に従い、第2部分ストリームバッファ363から、2個のNALユニット(PPS1、スライス1)を取得する。次に、多重化部350は、スライス2の選択情報として、部分ストリームバッファ情報=2およびNALユニット数情報=1を読み出す。多重化部350はスライス2の選択情報に従い、第2部分ストリームバッファ363から、1個のNALユニット(スライス2)を取得する。次に、多重化部350は、スライス3の選択情報として、部分ストリームバッファ情報=1およびNALユニット数情報=2を読み出す。多重化部350はスライス3の選択情報に従い、第1部分ストリームバッファ363から、2個のNALユニット(PPS2、スライス3)を取得する。次に、多重化部350は、スライス4の選択情報として、部分ストリームバッファ情報=2およびNALユニット数情報=1を読み出す。多重化部350はスライス4の選択情報に従い、第2部分ストリームバッファ363から、1個のNALユニット(スライス4)を取得する。
このように、多重化部350は、ストリーム結合制御部340から通知される選択情報を用いることで、N個のエンコードエンジン320で生成した分割ストリームと同じスライス順序で、M個の部分ストリームバッファ363から部分ストリーム(部分ストリームのスライス)を取得することが出来る。
なお、図32A〜図34を用いて説明したスライスの振り分け処理は、本発明の画像符号化装置300の処理動作の一例であって、本発明は、ここで説明した処理動作に限定されない。
例えば、図32Bでは、ストリーム結合制御部340が、ストリーム結合部330に対してスライスのストリーム結合を通知する際にスライス番号を指定したが、スライス番号ではなく、処理をスキップするスライス数を指定してもよい。この場合、ストリーム結合制御部340は、M個のストリーム結合部330のそれぞれに対して振り分けたスライス数を記憶しておき、それをもとに処理をスキップするスライス数を計算する。また、図32Bでは、ストリーム結合部330によるスライスのストリーム結合処理が終了した際、ストリーム結合部330は、ストリーム結合制御部340に対して処理の完了および部分ストリームバッファ363に出力したNALユニットの個数を通知したが、部分ストリームバッファ363に出力したNALユニットの個数の代わりに、部分ストリームバッファ363に出力した部分ストリームのビット数を通知してもよい。つまり、多重化部350が部分ストリームバッファ363から取得すべき部分ストリームのサイズが判定可能な情報を通知できればよい。
また、例えば図34では、部分ストリームバッファ情報は、部分ストリームバッファ363の番号を直接指定したが、その番号と異なる情報であってもよい。つまり、M=2の場合には、部分ストリームバッファ情報は、処理対象のスライスに対応する部分ストリームが格納されている部分ストリームバッファ363が、直前のスライスに対応する部分ストリームが格納されていた部分ストリームバッファ363と同じであるかどうかを示す情報であってもよい。すなわち部分ストリームバッファ情報は、複数の部分ストリームバッファ363から適切に部分ストリームを取得できる情報であればよい。また、例えば図34では、選択情報はNALユニット数情報を含むものとしたが、前述したように、NALユニット数情報の代わりに部分ストリームのビット数を示す情報を含むものとしてもよい。
ここで、ストリーム結合部330の構成および動作について詳細に説明する。
図35は、ストリーム結合部330の構成を示すブロック図である。
ストリーム結合部330は、処理管理部330m、セレクタSct1、スタートコード検出部331、EPB除去部332a、EPB挿入部332b、ヘッダ挿入部333、およびスライスデータ処理部334a、334bを備えている。
処理管理部330mは、モード情報および振り分け制御情報を取得し、それらの情報にしたがって、ストリーム結合部330に備えられている他の構成要素を制御する。つまり、図32A〜図34に示すようなストリーム結合処理が行われるように、処理管理部330mは、例えば、これから処理するスライスの番号(SN1またはSN2など)を保持し、その番号に基づいてセレクタSct1を制御する。その結果、処理管理部330mは、SPS、PPS、または、処理対処のスライスから再構成された新たなスライス(新たなスライスを含む部分ストリーム)を出力させたり、その出力を停止させたりする。
スタートコード検出部331は、分割ストリームバッファ352からN個の分割ストリームのいずれかを読み出して、スタートコードを検出することでスライスを認識する。
EPB除去部332aは、EPB(エミュレーション防止バイト)を分割ストリームから除去し、EPBが除去された分割ストリームをスライスデータ処理部334a、334bに出力する。
EPB挿入部332bは、分割ストリームを結合することによって生成される部分ストリームに、EPB除去部332aによって除去されたEPBを挿入する。
ヘッダ挿入部333は、SPS、PPS、スライスヘッダといったヘッダ情報を生成し、EPB挿入部332bに出力する。
スライスデータ処理部334a、334bは、EPBが除去されたN個の分割ストリームを結合することによりスライスデータを再構成し、その再構成されたスライスデータを出力する。ここで、スライスデータ処理部334aは、CAVLD(Context−Adaptive Variable Length Decoding)に応じた処理を実行し、CAVLC(Context−Adaptive Variable Length Coding)によって生成されたN個の分割ストリームを結合し、部分ストリームを生成する。また、スライスデータ処理部334bは、CABAD(Context−Adaptive Binary Arithmetic Decoding)に応じた処理を実行し、CABAC(Context−Adaptive Binary Arithmetic Coding)によって生成されたN個の分割ストリームを結合し、部分ストリームを生成する。
スライスデータ処理部334aは、スライスデータ層解析部335a、マクロブロック層解析部336a、スキップラン修正部337a、QPデルタ修正部338aおよび分割点検出部339aを備えている。
スライスデータ層解析部335aは、分割ストリームに含まれるスライスデータ層の符号化データを解析し、ストリーム結合処理に必要な情報を抽出する。マクロブロック層解析部336aは、分割ストリームに含まれるマクロブロック層の符号化データを解析し、ストリーム結合処理に必要な情報を抽出する。
スキップラン修正部337aは、スライスデータ層解析部335aによって抽出されたMBスキップラン情報“mb_skip_run”を修正し、修正されたMBスキップラン情報を再び符号化し、符号化されたMBスキップラン情報を出力する。すなわち、スキップラン修正部337aは、MBスキップラン情報が、分割ストリームにおいて連続する少なくとも2つのスライス部分に跨って連続するブロックの個数を示すときには、その連続するブロックの個数を分割し、スライス部分ごとのブロックの個数を示すように修正したMBスキップラン情報を、少なくとも2つの連続するスライス部分がそれぞれ割り当てられる分割ストリームに設定する。さらに、スキップラン修正部337aは、分割ストリームを結合して生成される部分ストリームにおいて、設定される複数のMBスキップラン情報に対応する複数のブロックが当該分割ストリーム内で連続するときには、複数のMBスキップラン情報を、その複数のMBスキップラン情報のそれぞれが示す個数の総和を示す1つのMBスキップラン情報に変換する。
ここで、MBスキップラン情報は、符号化ピクチャに含まれるスライス内で特定の種類のブロックが連続する場合に連続する当該ブロックの個数を示す第1の符号語の一例である。具体的には、MBスキップラン情報は、連続してスキップされるマクロブロックの数を示している。
例えば、分割ストリームのスライスの中で、連続してスキップされるマクロブロックの集合が複数のMBラインに跨って存在する場合、スライスデータ層解析部335aによって抽出されたMBスキップラン情報は、その集合に含まれる連続してスキップされるマクロブロックの数を示している。このような場合に、N個の分割ストリームがMBラインごとに分割され、それらのN個の分割ストリームに含まれるMBラインが1つの部分ストリームに順に割り当てられると、部分ストリーム内で、連続してスキップされるマクロブロックの数が変わってしまう。つまり、MBスキップラン情報による、MBライン間の依存関係が崩れてしまう。
そこで、スキップラン修正部337aは、上述の集合の一部を含むMBラインごとに、そのMBラインに含まれている上記一部を成す、連続してスキップされるマクロブロックの数を特定する。そして、スキップラン修正部337aは、MBラインごとに、MBスキップラン情報により示される数が、そのMBラインに対して特定された数となるように、MBスキップラン情報を修正する。
QPデルタ修正部338aは、マクロブロックごとに、マクロブロック層解析部336aによって抽出された、そのマクロブロックのQP変化量“mb_qp_delta”を修正し、修正されたQP変化量を再び符号化し、符号化されたQP変化量を出力する。すなわち、QPデルタ修正部338aは、QP変化量が、2つのMBラインに跨るブロック間の変化量を示す場合には、部分ストリームにおけるブロックの新たな前後関係に基づく符号化係数の変化量を計算する。そしてQPデルタ修正部338aは、計算した変化量にQP変化量を修正する。
なお、QP変化量は、符号化ピクチャに含まれるスライス内で連続するブロック間における符号化係数の変化量を示す第2の符号語の一例である。具体的には、QP変化量は、マクロブロック(対象マクロブロック)に含まれており、その対象マクロブロックのQP値と、その対象マクロブロックの直前に位置するマクロブロックのQP値との差分値を示す。
つまり、N個の分割ストリームがMBラインごとに分割され、それらのN個の分割ストリームに含まれるMBラインが1つの部分ストリームに順に割り当てられると、MBラインの境界を挟んで互いに連続していたマクロブロックはそれぞれ部分ストリーム内で離れた位置に割り当てられる。その結果、生成される部分ストリームを含む符号化ストリームを復号する復号化器は、対象マクロブロックのQP変化量から、その対象マクロブロックのQP値を導出することができない。つまり、QP変化量による、MBライン間の依存関係が崩れてしまう。
そこで、QPデルタ修正部338aは、マクロブロックごとに、そのマクロブロック(対象マクロブロック)のQP変化量を、部分ストリームにおける新たなマクロブロックの前後関係に基づいて再計算する。
分割点検出部339aは、分割ストリームをMBラインに分割し、そのMBラインを結合することで部分ストリームを生成する。具体的には、分割点検出部339aは、スライスデータ層解析部335aおよびマクロブロック層解析部336aにより抽出された情報から分割ストリーム内のMBラインの境界を検出し、MBラインの境界ごとに、ストリーム結合部330が分割ストリームバッファ352から読み出す分割ストリームを切り替えることで、N個の分割ストリームをMBライン単位で結合する。また、分割点検出部339aは、部分ストリームに対して、スキップラン修正部337aから取得したMBスキップラン情報と、QPデルタ修正部338aから取得したQP変化量とを含める。
さらに、分割点検出部339aは、入力される分割ストリームに含まれるスライス終端情報を検出・除去するとともに、分割ストリームを結合することで再構成したスライスに対して、適切なスライス終端情報を付与して部分ストリームに割り当てる。
スライスデータ処理部334bは、スライスデータ層解析部335b、マクロブロック層解析部336b、QPデルタ修正部338bおよび分割点検出部339bを備えている。
スライスデータ層解析部335bは、分割ストリームに含まれるスライスデータ層の符号化データを解析し、ストリーム結合処理に必要な情報を抽出する。マクロブロック層解析部336bは、分割ストリームに含まれるマクロブロック層の符号化データ(2値データ)を解析し、ストリーム結合処理に必要な情報を抽出する。
QPデルタ修正部338bは、上述のQPデルタ修正部338aと同様、マクロブロックごとに、マクロブロック層解析部336bによって抽出された、そのマクロブロックのQP変化量“mb_qp_delta”を修正し、修正されたQP変化量を再び符号化し、符号化されたQP変化量を出力する。
分割点検出部339bは、分割点検出部339aと同様、分割ストリームをMBラインに分割し、そのMBラインを結合することで部分ストリームを生成する。このとき、分割点検出部339bは、分割ストリームのそれぞれに、QPデルタ修正部138bから取得したQP変化量を含める。さらに、分割点検出部139bは、入力される分割ストリームに含まれるスライス終端情報を検出・除去するとともに、分割ストリームを結合することで再構成したスライスに対して、適切なスライス終端情報を付与して部分ストリームに割り当てる。さらに、分割点検出部139bは、分割ストリームに含まれる2値データに対して算術符号化を行う。
ここで、スキップラン修正部337aの動作について詳細に説明する。
スキップラン修正部337aは、前述したようにMBスキップラン情報である“mb_skip_run”を修正する。MBスキップラン情報は、符号化方法にCAVLCを用いた場合に符号化ストリームに含まれる符号語であり、連続するスキップマクロブロックの個数(以下、「長さ」ともいう。)を示している。また、以下の記載において、MBスキップラン情報の長さとは、MBスキップラン情報が示す、連続するスキップマクロブロックの個数を意味する。
図36は、MBスキップラン情報の修正処理を説明するための説明図である。
図36には、N個のエンコードエンジン320によって、MBラインL2の末尾に5個、MBラインL3の先頭に3個、MBラインL5の末尾に2個、MBラインL6の先頭に4個の連続するスキップマクロブロックが存在するように符号化されたピクチャを示している。したがって、このように符号化したピクチャを含む分割ストリームでは、第1分割ストリームのMBラインL5の末尾に連続するスキップマクロブロックの個数を示す長さ2のMBスキップラン情報が符号化され、第2分割ストリームのMBラインL2〜L3に跨って連続するスキップマクロブロックの個数を示す長さ9(5+4=9)のMBスキップラン情報が符号化され、第3分割ストリームのMBラインL3の先頭に連続するスキップマクロブロックの個数を示す長さ3のMBスキップラン情報が符号化されている。第4分割ストリームには、MBスキップラン情報は符号化されていない。
しかし、このような場合にN個の分割ストリームがMBラインごとに分割され、それらのMBラインが1つのストリームとして結合されると、結合されたストリームで、連続してスキップされるマクロブロックの数が変わってしまう。つまり、複数のMBラインに跨って連続するスキップマクロブロックの個数を示すMBスキップラン情報による、その複数のMBライン間の依存関係が崩れてしまう。
すなわち、結合されたストリームでは、MBラインL2からL3に跨って連続する8個のスキップマクロブロックが存在し、MBラインL5からL6に跨って連続する6個のスキップマクロブロックが存在するが、それ以外のスキップマクロブロックは存在しない。
以上のように、もともと分割ストリームに含まれていたMBスキップラン情報は、第1分割ストリームに長さ2のMBスキップラン情報が、第2分割ストリームに長さ9のMBスキップラン情報が、第3分割ストリームに長さ3のMBスキップラン情報が存在していたのに対し、結合されたストリームでは、長さ8と6のMBスキップラン情報を出力する必要がある。つまり、各分割ストリーム内で複数のMBラインに跨って連続するスキップマクロブロックの個数を示すMBスキップラン情報によって、その複数のMBラインが互いに依存関係を有する場合には、その依存関係が、結合されたストリームにおけるMBラインの前後関係に応じた新たな依存関係となるように、MBスキップラン情報を修正する必要がある。
そこでスキップラン修正部337aは、まずスライスデータ層解析部335aによって抽出されたMBスキップラン情報に対応するスキップマクロブロックの集合が、1つの分割ストリーム内で複数のMBラインに跨って存在する場合、MBライン境界でMBスキップラン情報を分割する。ここで、MBライン境界でMBスキップラン情報を分割するとは、1つの分割ストリーム内で複数のMBラインに跨って連続する複数のスキップマクロブロックの個数を分割し、MBラインごとのスキップマクロブロックの個数をそれぞれが示す複数のMBスキップラン情報を生成することを意味する。
すなわち、図36に示されたピクチャの場合、スキップラン修正部337aは、第2分割ストリーム内でMBラインL2〜L6に跨って存在する9個のスキップマクロブロックの集合に対応するMBスキップラン情報を、MBラインL2に含まれる5個のスキップマクロブロックの集合に対応するMBスキップラン情報と、MBラインL6に含まれる4個のスキップマクロブロックの集合に対応するMBスキップラン情報とに分割する。
次に、スキップラン修正部337aは、分割されたMBスキップラン情報のうち、結合されたストリームにおいて連続するスキップマクロブロックの集合に対応する複数のMBスキップラン情報を再結合する。ここで複数のMBスキップラン情報の再結合とは、複数のMBスキップラン情報を、その複数のMBスキップラン情報のそれぞれが示す個数の総和を示す1つのMBスキップラン情報に変換することを意味する。
図36に示されたピクチャの場合、分割されたMBスキップラン情報に対応するスキップマクロブロックの集合のうち、MBラインL2に含まれる長さ5のスキップマクロブロックの集合と、MBラインL3に含まれる長さ3のスキップマクロブロックの集合とは、結合されたストリーム内で連続する。そのため、スキップラン修正部337aは、これらの2つのスキップマクロブロックの集合にそれぞれ対応する2つのMBスキップラン情報を結合し、長さ8のMBスキップラン情報に変換する。また、MBラインL5に含まれる長さ2のスキップマクロブロックの集合と、MBラインL6に含まれる長さ4のスキップマクロブロックの集合とは、結合されたストリーム内で連続する。そのため、スキップラン修正部337aは、これらの2つのスキップマクロブロックの集合にそれぞれ対応する2つのMBスキップラン情報を結合し、長さ6のMBスキップラン情報に変換する。
最後にスキップラン修正部337aは、このようにして得られたMBスキップラン情報を再び符号化し、符号化されたMBスキップラン情報を出力する。
以上説明したように、スキップラン修正部337aは、入力されたMBスキップラン情報をMBライン境界で分割した後、必要に応じて再結合することで、結合されたストリームに対して適切な長さのMBスキップラン情報を出力することが出来る。
なお、ここで、スキップラン修正部337aが、結合されたストリームにおいて連続するMBスキップラン情報を分割されたままにせずに、必要に応じて再結合するのは、H.264/AVC規格において、複数のMBスキップラン情報が連続して存在することが許されていないためである。つまり、H.264/AVC規格において、連続するスキップマクロブロックの個数を複数のMBスキップラン情報を用いて表現することが許されていないので、スキップラン修正部337aは、その複数のMBスキップラン情報を結合する。このように、スキップラン修正部337aがH.264/AVC規格に準拠した形式でMBスキップラン情報が修正されることにより、結合されたストリームがH.264/AVC規格に準拠した形式で生成される。
なお、ここでは、MBスキップラン情報が各分割ストリーム内で複数のMBラインに跨って存在する場合に、スキップラン修正部337aがMBスキップラン情報の分割・再結合を行う例を示したが、MBスキップラン情報が各分割ストリーム内で複数のMBラインに跨って存在しない場合でも、MBスキップラン情報が結合されたストリーム内で複数のMBラインに跨って存在する場合には、スキップラン修正部337aは、MBスキップラン情報の分割は行わず、MBスキップラン情報の再結合のみを行う。
次に、QPデルタ修正部338a、338bの動作について詳細に説明する。なお、以降の説明において、QPデルタ修正部338a、338bについて共通する機能および処理動作を説明するときには、それらを区別することなくQPデルタ修正部338と総称する。
QPデルタ修正部338は、マクロブロックごとに原則として存在するQP変化量“mb_qp_delta”を修正する。
図37Aおよび図37Bは、QP変化量の修正処理を説明するための説明図である。
図37Aに示されたピクチャにおけるマクロブロックCに着目すると、第2分割ストリーム内でその直前に処理が行われるマクロブロックはマクロブロックAである。したがって、マクロブロックCには、マクロブロックAのQP値とマクロブロックCのQP値との差分値がQP変化量として符号化されている。
しかし、このような分割ストリームがMBラインごとに分割され、それらのMBラインが結合されて1つのストリームに割り当てられると、結合されたストリームで、MBライン境界におけるマクロブロックの前後関係が変化してしまう。
すなわち、ストリーム結合後には、マクロブロックCの直前に位置するマクロブロックはマクロブロックBとなる。したがって、このように符号化された符号化ストリームを復号化器が復号した場合、マクロブロックBのQP値に対して、マクロブロックAのQP値とマクロブロックCのQP値との差分値であるQP変化量を反映してしまうことになり、マクロブロックCのQP値を正しく復号化できない。つまり、2つのMBラインに跨るマクロブロック間の変化量を示すQP変化量による、そのMBライン間の依存関係が崩れてしまう。
そこでQPデルタ修正部338は、ストリームを結合することにより発生するマクロブロックの前後関係の変化を是正するように、QP変化量の修正を行う。つまり、1つの分割ストリーム内で2つのMBラインに跨るマクロブロック間の変化量を示すQP変化量によって、その2つのMBラインが依存関係を有する場合には、その依存関係が、結合されたストリームにおけるMBラインの前後関係に応じた新たな依存関係となるように、QP変化量を修正する。
QP変化量の修正方法としては、全てのマクロブロックについてQP値の復号化(QP値の復元)を行った上で、ストリーム結合後の新たなマクロブロックの前後関係に基づき、QP変化量を算出し直す方法が考えられる。しかしながらこの方法では、QP値復号化とQP変化量算出との2つの処理が必要であり、QPデルタ修正部338における処理量が大きくなってしまう。
そこで本実施の形態では、QPデルタ修正部338は、分割ストリーム毎に、対象分割ストリームに割り当てられなかったマクロブロックのQP変化量を累積し、累積したQP変化量を減算することで、QP値を復号化することなく、修正されたQP変化量を直接導出する。QP変化量の累積は、式(3)に従って行われる。
具体的な例として、図37Aに示されたピクチャにおけるマクロブロックCのQP変化量の修正処理について説明する。前述のように、結合されたストリームにおいて、マクロブロックCの直前に位置するマクロブロックはマクロブロックBとなるため、マクロブロックCには、マクロブロックBのQP値とマクロブロックCのQP値の差分値がQP変化量として含まれる必要がある。
そこでQPデルタ修正部338は、MBラインL3〜L5に含まれる全てのマクロブロックのQP変化量を累積する。このように、マクロブロックAとマクロブロックCの間にある全てのマクロブロックのQP変化量を累積することで、マクロブロックBのQP値とマクロブロックCのQP値の差分値であるQP変化量を導出するための補正値を求めることができる。
次にQPデルタ修正部338は、次式(5)に従って、マクロブロックCのQP変化量から、求めたQP変化量の累積値を減算し、マクロブロックBのQP値とマクロブロックCのQP値の差分値であるQP変化量を導出する。
mb_qp_delta = (mb_qp_delta − acc_mb_qp_delta + 52 ) % 52 ・・・(5)
ここで、“mb_qp_delta”はマクロブロックCのQP変化量を、“acc_mb_qp_delta”はMBラインL3〜L5に含まれる全てのマクロブロックのQP変化量の累積値を示している。
なお、ここで求められたQP変化量は式(5)により導出されているため、0〜51の範囲を示す値となっている。本来のQP変化量“mb_qp_delta”は−26〜+25の範囲を取る値であるため、QPデルタ修正部338は次式(6)により、QP変化量“mb_qp_delta”を−26〜+25の範囲となるように修正する。
mb_qp_delta>25の場合:mb_qp_delta = mb_qp_delta − 52
mb_qp_delta≦25の場合:mb_qp_delta = mb_qp_delta ・・・(6)
以上示したように、マクロブロックCのQP変化量の修正が行われる。
なお、ここではマクロブロックCに着目して説明したが、全てのMBラインの先頭のマクロブロックについても同様な処理を行う。例えば、マクロブロックCの下方向に隣接するマクロブロックについては、MBラインL4〜L6の全てのマクロブロックのQP変化量を累積し、その累積値を該当のマクロブロックのQP変化量から減算することで、修正されたQP変化量を導出する。これらの処理は、MBライン毎に独立して行われる。
また、N個のエンコードエンジン320はそれぞれ、各MBラインの先頭にあるマクロブロックを符号化するときには、その先頭にあるマクロブロックがQP変化量を含むマクロブロックとなるように符号化する。なお、H.264/AVC規格におけるQP変化量が含まれていないマクロブロックとは、(1)スキップマクロブロック、(2)非圧縮のマクロブロック(I_PCM)、または(3)イントラ予測の予測モードが“Intra16×16”ではなく、かつ“coded_block_pattern”が0である(非0係数を1つも含まない)マクロブロックである。これにより、各MBラインの先頭のマクロブロックに対して、QP変化量の修正を正しく行うことができる。
もし該当のMBラインに含まれる全てのマクロブロックがQP変化量を含まない場合は、QP変化量の修正対象となるマクロブロックが出現するまでQP変化量の累積を継続する。
最後にQPデルタ修正部338は、このようにして得られた修正QP変化量を再び符号化し、符号化された修正QP変化量を分割点検出部339a、339bに対して出力する。なお、QPデルタ修正部338aはCAVLC方式で、QPデルタ修正部338bはCABAC方式で符号化を行う。
以上説明したように、QPデルタ修正部338は、入力されたQP変化量を結合されたストリームにおけるマクロブロックの前後関係に合うように修正することで、結合されたストリームに対して適切なQP変化量を設定することができる。
また、図37Bには、MBラインL4とL5の境界でスライスを分割する場合の例を示している。この例では、MBラインL1〜L4はスライスAに、MBラインL5〜L8はスライスBに含まれる。
このとき、第2分割ストリームにおいて、図37A同様にマクロブロックAとマクロブロックCは連続しているが、それぞれのマクロブロックが含まれるスライスは異なっており、マクロブロックAとマクロブロックCとの間で依存関係はなくなっている。第2分割ストリームにおいて、マクロブロックCはスライスBの先頭のマクロブロックとなるため、マクロブロックCのQP変化量は、マクロブロックCのQP値とスライスBのスライスQP値との差分値を示している。
すなわちQPデルタ修正部338は、マクロブロックAからマクロブロックCの間に含まれるマクロブロックのうち、スライスBに含まれるものについて、QP変化量の累積を行い、累積したQP変化量を減算することで、マクロブロックBとマクロブロックCのQP差分値を求めることが出来る。
具体的には、QPデルタ修正部338は、マクロブロックAからマクロブロックCの間に含まれるマクロブロックのすべてについてQP変化量の累積を行うが、スライスBの先頭のマクロブロック処理開始時に、累積QP変化量“acc_mb_qp_delta”を0にリセットする。このようにすることで、スライスBに含まれるマクロブロックのみについて、QP変化量の累積を行うことができ、正しくマクロブロックCの修正QP変化量を求めることが出来る。
このようにして得られた修正QP変化量を再び符号化し、符号化された修正QP変化量を分割点検出部339a、339bに対して出力する。
このように、本実施の形態における画像符号化装置300では、ピクチャは複数のMBライン(構成単位)に分割され、複数のMBラインのそれぞれがN個のエンコードエンジン320に割り当てられて符号化されるため、N個のエンコードエンジン320による符号化処理の負担を均等にすることができ、符号化の並列処理を適切に実行することができる。例えば、H.264/AVC形式で1枚のピクチャを1つのスライスで構成する場合であっても、そのピクチャは複数のMBラインに分割されるため、その1つのスライスの符号化を1つのエンコードエンジン320で負担することなく、N個のエンコードエンジン320で均等に負担することができる。
ここで、ピクチャがN個のエンコードエンジン320によって独立に符号化されると、本来は1つのピクチャ内で複数のMBラインに跨るスライスが複数のスライス部分に分割され、それらのスライス部分が互いに異なる分割ストリームに割り当てられることがある。つまり、1つの分割ストリームには、符号化ピクチャのスライスの全体が含まれることなく、そのスライスの断片であるスライス部分が1つ以上集まって構成されるスライス部分群が含まれることとなる。
さらに、符号化ストリームに含まれる所定の符号語に起因して、複数のMBラインが依存関係を持つ場合がある。例えば、H.264/AVCでは、MBスキップラン情報“mb_skip_run”や、QP変化量“mb_qp_delta”によって複数のMBラインが互いに依存関係を有する場合がある。このような符号化ストリームが複数のMBラインに分割されて互いに異なる分割ストリームに割り当てられると、MBライン間の依存関係を正しく保つことが出来ない。
そこで本実施の形態では、ストリーム結合部330がN個の分割ストリームを結合することで新たなスライスを再構成する。その結果、画像符号化装置300は、H.264/AVC形式に準じた符号化ストリームを生成することができる。また、このようにすることで、本実施の形態では、N個のエンコードエンジン320のそれぞれに特別な処理を行う機能や構成を設ける必要がないため、画像符号化装置300の全体構成を簡単にすることができる。
また、本実施の形態における画像符号化装置300では、上述のストリーム結合処理をM個のストリーム結合部330で処理するとともに、ストリーム結合制御部340が、M個のストリーム結合部330の処理量が均等になるよう、M個のストリーム結合部330に対してスライス単位でストリーム結合処理を振り分ける。このような構成により、ストリーム結合処理をM個のストリーム結合部330で均等に負担することができ、システム全体で符号化の並列処理を実現している。
なお、本実施の形態では、エンコーダ310はM個のストリーム結合部330を備えたが、ストリーム結合部330を1つだけ備えてもよい。
図38Aは、ストリーム結合部を1つだけ備えた画像符号化装置の構成を示すブロック図である。
この画像符号化装置300aはエンコーダ310aとメモリ360aとを備える。メモリ360aは、上述のメモリ360と同様、フレームメモリ361および分割ストリームバッファ362を備えているが、部分ストリームバッファ363を備えていない。また、エンコーダ310aは、上述のエンコーダ310と同様、N個のエンコードエンジン320とを備えているが、M個のストリーム結合部330の代わりに、1つのストリーム結合部330bを備えている。
つまり、ストリーム結合部330bは、M個のストリーム結合部330によって並列に行われる複数のストリーム結合処理をシリアルに行う。つまり、ストリーム結合部330bは、N個のエンコードエンジン320から出力されるN個の分割ストリームのそれぞれに複数のスライスが含まれていれば、それらのスライスの配列にしたがって、ストリーム結合処理を順次行う。例えば、N個の分割ストリームのそれぞれに、スライス0、スライス1、スライス2、…スライスnが含まれていれば、ストリーム結合部330bは、N個の分割ストリームに含まれる複数のスライス0を結合するストリーム結合処理を行い、次に、複数のスライス1を結合するストリーム結合処理を行い、次に、複数のスライス2を結合するストリーム結合処理を行う。そして、最後に、ストリーム結合部330bは、複数のスライスnを結合するストリーム結合処理を行う。なお、ストリーム結合部330bによって行われるストリーム結合処理は、上述のストリーム結合部330による処理と同様である。
そして、ストリーム結合部330bは、上述のように順次行われるストリーム結合処理によって生成される新たなスライス(再構成されたスライス)を順次出力する。その結果、ストリーム結合部330bから符号化ストリームが出力される。
つまり、画像符号化装置300aは、画像データを符号化することにより符号化ストリームを生成する画像符号化装置であって、前記画像データに含まれるピクチャごとに、当該ピクチャに含まれる複数の構成単位を並列に符号化することにより、N個(Nは2以上の整数)の分割ストリームを生成するN個の符号化部(エンコードエンジン320)と、前記符号化ストリームを構成する処理対象領域ごとに、N個の分割ストリームのそれぞれに含まれる、当該処理対象領域に対応する部分領域を結合することによって、前記処理対象領域である結合符号化領域を生成する結合処理を実行するストリーム結合部(330b)とを備え、前記ストリーム結合部は、前記結合処理を行う際に、符号化された複数の前記構成単位から前記部分領域が構成されている場合には、前記部分領域を符号化された複数の前記構成単位に分割して組み替えることによって前記結合符号化領域を生成し、前記組み替えを行う際に、前記画像データに含まれるスライスが複数のスライス部分に分割および符号化されて前記N個の分割ストリームに割り当てられているときには、前記結合符号化領域内において、符号化された複数のスライス部分からなるスライス部分群を新たなスライスとして再構成する。
なお、構成単位は例えばマクロブロックラインであり、処理対象領域は符号化ストリームのスライスなどであり、部分領域は分割ストリームのスライスなどである。
図38Bは、画像符号化装置300aの動作を示すフローチャートである。
まず、画像符号化装置300aのN個のエンコードエンジン320は、画像データに含まれるピクチャごとに、当該ピクチャに含まれる複数の構成単位を並列に符号化することにより、N個(Nは2以上の整数)の分割ストリームを生成する(ステップS30)。次に、ストリーム結合部330bは、符号化ストリームを構成する処理対象領域ごとに、N個の分割ストリームのそれぞれに含まれる、当該処理対象領域に対応する部分領域を結合することによって、その処理対象領域である結合符号化領域を生成する結合処理を実行する(ステップS31)。ここで、ステップS31では、ストリーム結合部330bは、上述の結合処理を行う際に、符号化された複数の構成単位から部分領域が構成されている場合には、その部分領域を符号化された複数の前記構成単位に分割して組み替えることによって結合符号化領域を生成する。また、ストリーム結合部330bは、その組み替えを行う際に、画像データに含まれるスライスが複数のスライス部分に分割および符号化されてN個の分割ストリームに割り当てられているときには、結合符号化領域内において、符号化された複数のスライス部分からなるスライス部分群を新たなスライスとして再構成する。
このように、ストリーム結合部が1つだけあるような場合であっても、そのストリーム結合部によるストリーム結合処理の速度が、N個のエンコードエンジン320による並列符号化処理の速度と同等か、それ以上であるようなときには、並列符号化処理による高い符号化処理性能を十分に発揮できるとともに、画像符号化装置の構成を簡単にすることができる。さらに、ストリーム結合制御部340、多重化部350およびM個の部分ストリームバッファ363などを備える必要がないため、全体的な画像符号化装置の構成および処理を簡単にすることができる。
次に、上記実施の形態1および2に係る画像復号化装置の適用例について説明する。
図39は、上記実施の形態1および2に係る画像復号化装置、および上記実施の形態3に係る画像符号化装置の適用例を示す図である。
例えば、上述の画像復号化装置および画像符号化装置は、図39に示すように、放送波を受信してその放送波に含まれる符号化ストリームを再生・録画する再生・録画装置101に備えられる。再生・録画装置101は、BSデジタル放送の放送波を受信するアンテナ101aと装置本体101bとを備え、装置本体101bは上述の画像復号化装置および画像符号化装置を備える。
装置本体101bに備えられた画像復号化装置は、アンテナ101aによって受信された放送波から例えば4k2kの符号化ストリームを抽出する。そして、その画像復号化装置は、上述のように、抽出された符号化ストリームを分割してN個の分割ストリームを生成し、N個の分割ストリームを並列に復号化する。
また、装置本体101bに備えられた画像符号化装置は、画像復号化装置によって復号化された4k2kのピクチャを並列に再符号化して、装置本体101bに備えられた記憶媒体に記録する。
以上、本発明に係る画像復号化装置および画像復号化方法について、実施の形態を用いて説明したが、本発明は、これらに限定されるものではない。本発明の趣旨を逸脱しない限り、当業者が思いつく各種変形を上記実施の形態に施したもの、あるいは異なる実施の形態における構成要素を組み合わせて構築される形態も、本発明の範囲内に含まれる。
例えば、上記実施の形態では、画像復号化装置100、200は分割ストリームバッファ152などを備えていたが、これらを備えていなくてもよい。
図40は、本発明に係る画像復号化装置の最小構成を示すブロック図である。
画像復号化装置10は、画像データが符号化された符号化ストリームを復号化する装置であって、本発明を実現するための最小構成を有し、第1の分割制御部11、M個のストリーム分割部12、第2の分割制御部13、およびN個の復号化部14を備えている。ここで、第1の分割制御部11および第2の分割制御部13を含む構成要素は、実施の形態1および2のストリーム分割制御部140に相当する。また、M個のストリーム分割部12は、実施の形態1のM個のストリーム分割部130または実施の形態2のM個のストリーム分割部230に相当する。また、N個の復号化部14は、実施の形態1のN個のデコードエンジン部120または実施の形態2のN個のデコードエンジン220に相当する。
第1の分割制御部11は、符号化ストリームに含まれる処理対象領域(例えば、スライスまたはピクチャなど)を指定する。つまり、第1の分割制御部11は、その処理対象領域を示す振り分け制御情報を送信する。M個のストリーム分割部12のそれぞれは、第1の分割制御部11によって処理対象領域が指定されるごとに、その処理対象領域からN個(Nは2以上の整数)の分割ストリームの少なくとも一部を生成するストリーム分割処理を実行する。ここで、M個のストリーム分割部12は、第1の分割制御部11によって指定されたM個(Mは2以上の整数)の処理対象領域に対して上述のストリーム分割処理を並列に実行することによって、M×N個の分割ストリームを生成する。
第2の分割制御部13は、第1の分割制御部11によって指定された処理対象領域ごとに、その処理対象領域の符号化ストリーム内における配置に基づいて、M個のストリーム分割部12によって生成されるM×N個の分割ストリームから、少なくとも1つの分割ストリームの一部を選択する。なお、上述の配置は、符号化ストリーム内で配置されている処理対象領域の順番などである。また、このように、M×N個の分割ストリームから少なくとも1つの分割ストリームの一部が選択されることは、実施の形態1および2のM個の分割ストリームバッファ152から1つの分割ストリームバッファ152が選択されることに相当する。そして、N個の復号化部14は、第2の分割制御部13によって選択された少なくとも1つの分割ストリームの一部を含む、N個の分割ストリームのそれぞれの一部を並列に復号化する。
ここで、M個のストリーム分割部12のそれぞれは、処理対象領域を複数の構成単位(例えば、マクロブロックライン)に分割し、複数の前記構成単位のそれぞれを、生成対象であるN個の分割ストリームのうちの何れかの一部に割り当てることにより、上述のストリーム分割処理を実行する。また、M個のストリーム分割部12のそれぞれは、処理対象領域を複数の構成単位に分割することによって、その処理対象領域に含まれるスライスが複数のスライス部分に分割されて複数の分割ストリームに割り当てられるときには、分割ストリームごとに、その分割ストリームに割り当てられる少なくとも1つのスライス部分からなるスライス部分群を新たなスライスとして再構成する。
図41は、画像復号化装置10による画像復号化方法を示すフローチャートである。
この画像復号化方法は、画像復号化装置10が符号化ストリームを復号化する方法であって、符号化ストリームに含まれる処理対象領域を指定する第1の分割制御ステップS50と、第1の分割制御ステップS50によって処理対象領域が指定されるごとに、その処理対象領域からN個(Nは2以上の整数)の分割ストリームの少なくとも一部を生成するストリーム分割処理を、第1の分割制御ステップS50によって指定されたM個(Mは2以上の整数)の処理対象領域に対して並列に実行することによって、M×N個の分割ストリームを生成するストリーム分割ステップS51と、第1の分割制御ステップS51によって指定された処理対象領域ごとに、その処理対象領域の符号化ストリーム内における配置に基づいて、ストリーム分割ステップS51によって生成されるM×N個の分割ストリームから、少なくとも1つの分割ストリームの一部を選択する第2の分割制御ステップS52と、第2の分割制御ステップS52によって少なくとも1つの分割ストリームの一部が選択されるごとに、当該少なくも1つの分割ストリームの一部を含む、N個の分割ストリームのそれぞれの一部を並列に復号化する復号化ステップS53とを含む。ストリーム分割ステップS51では、処理対象領域を複数の構成単位に分割し、複数の前記構成単位のそれぞれを、生成対象であるN個の分割ストリームのうちの何れかの一部に割り当てることにより、上述のストリーム分割処理を実行する。また、ストリーム分割ステップS51では、処理対象領域を複数の構成単位に分割することによって、その処理対象領域に含まれるスライスが複数のスライス部分に分割されて複数の分割ストリームに割り当てられるときには、分割ストリームごとに、その分割ストリームに割り当てられる少なくとも1つのスライス部分からなるスライス部分群を新たなスライスとして再構成する。
このような画像復号化装置10およびその画像復号化方法では、符号化されたピクチャまたはスライスなどの処理対象領域は例えば複数のマクロブロックラインなどの構成単位に分割され、複数のマクロブロックラインのそれぞれが分割ストリームの一部としてN個の復号化部に割り当てられて復号化される。したがって、N個の復号化部による復号化処理の負担を均等にすることができ、復号化の並列処理を適切に実行することができる。例えば、H.264/AVCの符号化ピクチャが1スライスで構成されている場合であっても、その符号化ピクチャは複数のマクロブロックラインに分割されるため、その1スライスの復号化を1つの復号化部で負担することなく、N個の復号化部で均等に負担することができる。
ここで、符号化ピクチャが複数のマクロブロックラインに分割されると、複数のマクロブロックラインに跨るスライスが複数のスライス部分に分割され、それらのスライス部分が互いに異なる分割ストリームに割り当てられることがある。つまり、1つの分割ストリームには、符号化ピクチャのスライスの全体が含まれることなく、そのスライスの断片であるスライス部分が1つ以上集まって構成されるスライス部分群が含まれることとなる。また、このようなスライス部分群には、その先頭を示すヘッダや、その終端を示す終端情報が含まれていない場合がある。また、複数のスライス部分のうち、符号化ストリームにおいて連続する少なくとも2つのスライス部分が、符号化ストリームに含まれる所定の符号語による依存関係を有する場合がある。
そこで、画像復号化装置10およびその画像復号化方法では、そのスライス部分群を新たなスライスとして再構成するため、そのスライス部分群を含む分割ストリームを復号化する復号化部14は、そのスライス部分群を認識して適切に復号化するための特別な処理を要することなく、スライス部分群を新たなスライスとして簡単に認識して適切に復号化することができる。つまり、画像復号化装置10およびその画像復号化方法では、N個の復号化部14のそれぞれに特別な処理を行う機能や構成を設ける必要がないため、分割ストリームを復号化する復号化部14に従来方式の復号化回路を流用することができ、画像復号化装置の全体構成を簡単にすることができる。
また、ここで示したストリーム分割処理は、M個のストリーム分割部12によって、例えばスライス単位で並列に実行されるため、ストリーム分割部12のそれぞれにおけるストリーム分割処理の負担を軽減することが出来る。さらに、第1の分割制御部11によって、M個のストリーム分割部12における処理量が均等になるように制御されるため、ストリーム分割処理の処理量がスライス毎に変動する場合であっても、ストリーム分割処理をM個のストリーム分割部12で均等に負担することができる。
また、ストリーム分割処理がM個の処理対象領域に対して並列に実行されるため、符号化ストリームのデータ量が大きい場合には、復号化部の数を増加し、並列処理の数を増加することによって、処理速度を上げることができるとともに、ストリーム分割部についても、その数を増加することができ、処理速度を上げることができる。
また、画像復号化装置10およびその画像復号化方法では、M個の処理対象領域がM個のストリーム分割部12に対して指定される。つまり、処理対象領域を複数の構成単位(例えばマクロブロックライン)に分割するストリーム分割処理が、M個のストリーム分割部のそれぞれに対して振り分けられる。その結果、符号化ストリームに含まれる複数の処理対象領域の順序関係を、M個のストリーム分割部12によって生成されるM×N個の分割ストリームにおいて維持することができなくなり、M×N個の分割ストリームをそのままを復号化することはできない。そこで、画像復号化装置10およびその画像復号化方法では、指定された処理対象領域ごとに、その処理対象領域の配置、つまり符号化ストリームにおける処理対象領域の復号化の順序などに基づいて、M個のストリーム分割部12によって生成されるM×N個の分割ストリームから、少なくとも1つの分割ストリームの一部が選択される。そして、その選択された一部を含むN個の分割ストリームのそれぞれの一部が並列に復号化される。したがって、正しい順序関係でM×N個の分割ストリームを復号化することができる。さらに、画像復号化装置10およびその画像復号化方法では、処理対象領域の指定と、分割ストリームの一部の選択とが、M個のストリーム分割部12およびN個の復号化部14と異なる構成要素によって一元的に行われる。したがって、上述のように正しい順序関係でM×N個の分割ストリームを復号化するために、M個のストリーム分割部12およびN個の復号化部14などの各構成要素に対して、特別な処理および構成を要することなく、簡単な構成で復号化の並列処理を適切に実行することができる。
したがって、画像復号化装置10およびその画像復号化方法では、上記実施の形態における分割ストリームバッファ152などを必要とせず、それらがなくても上述の本発明に特有の作用効果を奏し、上記目的を達成することができる。
図42は、本発明に係る画像符号化装置の最小構成を示すブロック図である。
画像符号化装置20は、画像データを符号化することにより符号化ストリームを生成する装置であって、本発明を実現するための最小構成を有し、N個の符号化部21、第1の結合制御部22、M個のストリーム結合部23、第2の結合制御部24、および多重化部25を備えている。ここで、第1の結合制御部22および第2の結合制御部24を含む構成要素は、実施の形態3のストリーム結合制御部340に相当する。また、N個の符号化部21は、実施の形態3のN個のエンコードエンジン320に相当し、M個のストリーム結合部23は、実施の形態3のM個のストリーム結合部330に相当する。また、多重化部25は、実施の形態3の多重化部350に相当する。
N個の符号化部21は、画像データに含まれるピクチャごとに、そのピクチャに含まれるN個の構成単位(例えば、マクロブロックラインなど)を並列に符号化することにより、N個(Nは2以上の整数)の分割ストリームを生成する。
第1の結合制御部22は、符号化ストリームを構成する処理対象領域(例えば、スライスまたはピクチャなど)を指定する。つまり、第1の結合制御部22は、その処理対象領域を示す振り分け制御情報を送信する。
M個のストリーム結合部23は、N個の分割ストリームのそれぞれに含まれる、処理対象領域に対応する部分領域を結合することによって、処理対象領域である結合符号化領域を生成する結合処理を、第1の結合制御部22によって指定されたM個の処理対象領域に対して並列に実行する。つまり、M個のストリーム結合部23のそれぞれは、上述の結合処理(ストリーム結合処理)を並列に実行する。ここで、部分領域は、処理対象領域から分割された領域である。その処理対象領域に対応する各部分領域は、N個の符号化部21による処理によって、N個の分割ストリームのそれぞれに含められている。これらの部分領域は、上述の結合処理によって1つの結合符号化領域となる。例えば、処理対象領域がスライスであれば、N個の符号化部21によって、そのスライスが複数のスライス部分に分割され、上述の結合処理によって、結合符号化領域として新たなスライスが再構成される。なお、ストリーム結合部23は、その結合符号化領域(スライス)を順次生成することによって、それらの結合符号化領域を含む部分ストリームを生成して出力する。
第2の結合制御部24は、第1の結合制御部22によって指定されたM個の処理対象領域の符号化ストリーム内での配置に基づいて、M個のストリーム結合部23によって生成されるM個の結合符号化領域から、多重化されるべき結合符号化領域を順次選択する。例えば、その選択結果は、実施の形態3のように、選択情報として多重化部350に通知される。
多重化部25は、第2の結合制御部24によって選択された順に、M個の結合符号化領域を多重化することによって符号化ストリームを生成する。
ここで、M個のストリーム結合部330のそれぞれは、結合処理を行う際に、符号化された複数の構成単位(例えば、マクロブロックラインなど)から部分領域が構成されている場合には、その部分領域を符号化された複数の前記構成単位に分割して組み替えることによって上述の結合符号化領域を生成する。ここで、M個のストリーム結合部330のそれぞれは、組み替えを行う際に、画像データに含まれるスライスが複数のスライス部分に分割および符号化されてN個の分割ストリームに割り当てられているときには、結合符号化領域内において、符号化された複数のスライス部分からなるスライス部分群を新たなスライスとして再構成する。
図43は、画像符号化装置20による画像符号化方法を示すフローチャートである。
この画像符号化方法は、画像符号化装置20が画像データを符号化することにより符号化ストリームを生成する方法であって、画像データに含まれるピクチャごとに、そのピクチャに含まれる複数の構成単位を並列に符号化することにより、N個(Nは2以上の整数)の分割ストリームを生成するN個の符号化ステップS60と、符号化ストリームを構成する処理対象領域を指定する第1の結合制御ステップS61と、N個の分割ストリームのそれぞれに含まれる、処理対象領域に対応する部分領域を結合することによって、処理対象領域である結合符号化領域を生成する結合処理を、第1の結合制御ステップS61によって指定されたM個の処理対象領域に対して並列に実行するストリーム結合ステップS62と、第1の結合制御ステップS61によって指定されたM個の処理対象領域の符号化ストリーム内での配置に基づいて、ストリーム結合ステップS62によって生成されるM個の結合符号化領域から、多重化されるべき結合符号化領域を順次選択する第2の結合制御ステップS63と、第2の結合制御ステップS63によって選択された順に、M個の結合符号化領域を多重化することによって符号化ストリームを生成する多重化ステップS64とを含む。
ここで、ストリーム結合ステップS62では、結合処理を行う際に、符号化された複数の構成単位から部分領域が構成されている場合には、その部分領域を符号化された複数の前記構成単位に分割して組み替えることによって上述の結合符号化領域を生成する。ここで、ストリーム結合ステップS62では、組み替えを行う際に、画像データに含まれるスライスが複数のスライス部分に分割および符号化されてN個の分割ストリームに割り当てられているときには、結合符号化領域内において、符号化された複数のスライス部分からなるスライス部分群を新たなスライスとして再構成する。
なお、画像符号化装置20およびその画像符号化方法では、結合処理を並列に行ったが、シリアルに結合処理を行ってもよい。この場合には、画像符号化装置20は、ストリーム結合部23を1つだけ備える。
このような画像符号化装置20およびその画像符号化方法では、ピクチャは例えば複数のマクロブロックラインなどの構成単位に分割され、複数のマクロブロックラインのそれぞれがN個の符号化部に割り当てられて符号化される。したがって、N個の符号化部21による符号化処理の負担を均等にすることができ、符号化の並列処理を適切に実行することができる。例えば、H.264/AVCの符号化ピクチャを1スライスで構成する場合であっても、ピクチャは複数のマクロブロックラインに分割されるため、その1スライスの符号化を1つの符号化部21で負担することなく、N個の符号化部21で均等に負担することができる。
さらに、結合処理は、第1の結合制御部22による処理対象領域の指定によって、M個のストリーム結合部23に対して処理対象領域単位で振り分けられるため、その結合処理をM個のストリーム結合部23で並列に行うことができる。
ここで、ピクチャが複数のマクロブロックラインに分割されて符号化されると、複数のマクロブロックラインに跨るスライスが複数のスライス部分に分割され、それらのスライス部分が分割ストリームに順に割り当てられることがある。つまり、各分割ストリームには、スライスの断片であるスライス部分が分散されている。そのため、このように分散された複数のスライス部分は、画像データ内における前後関係を有していない。したがって、連続する複数のマクロブロックラインが、所定の符号語による依存関係を有する場合、分散された複数のスライス部分はその依存関係を保てなくなり、そのままでは符号化方式に準じた符号化ストリームを生成できない。そこで画像符号化装置20およびその画像符号化方法では、結合処理において、その分散された複数のスライス部分の集合であるスライス部分群を新たなスライスとして再構成するため、そのスライス部分群を含む結合符号化領域を符号化方式に準じた形式とすることができる。
また、結合処理がM個のストリーム結合部23に対して処理対象領域単位で振り分けられ、M個のストリーム結合部23で並列に行われると、符号化ストリームに含まれる複数の処理対象領域の順序関係を、並列化された結合処理により生成されるM個の結合符号化領域(部分ストリーム)において維持することができなくなり、M個の結合符号化領域を正しい順序で多重化することができない。
そこで、画像符号化装置20およびその画像符号化方法では、指定された処理対象領域ごとに、その処理対象領域の配置、つまり符号化ストリームにおける処理対象領域の符号化の順序に基づいて、M個のストリーム結合部23によって生成されるM個の結合符号化領域から、多重化されるべき結合符号化領域が順次選択される。そして、その選択された順にM個の結合符号化領域が多重化される。したがって、正しい順序関係でM個の結合符号化領域を多重化することができる。さらに、画像符号化装置20およびその画像符号化方法では、処理対象領域の指定と、多重化されるべき結合符号化領域の選択とが、M個のストリーム結合部23およびN個の符号化部21と異なる構成要素によって一元的に行われる。したがって、上述のように正しい順序関係でM個の結合符号化領域を多重化するために、M個のストリーム結合部23およびN個の符号化部21などの各構成要素に対して、特別な処理および構成を要することなく、簡単な構成で符号化の並列処理を適切に実行することができる。
したがって、画像符号化装置20およびその画像符号化方法では、上記実施の形態における部分ストリームバッファ363などを必要とせず、それらがなくても上述の本発明に特有の作用効果を奏し、上記目的を達成することができる。
なお、上記実施の形態1〜3では、1MBラインを1つの構成単位として扱い、ピクチャを複数の構成単位に分割したが、その構成単位は1MBラインに限らず、2MBラインや、3MBラインであってもよく、ピクチャの垂直方向に一列に配列される複数のマクロブロックであってもよい。例えば、ピクチャがMBAFFで構成されている場合には、2MBラインを構成単位として扱い、ピクチャがMBAFFで構成されていない場合には、1MBラインを構成単位として扱ってもよい。
また、上記実施の形態1および2では、ストリーム分割制御部が、M個のストリーム分割部に対してスライス単位で処理を振り分けたが、より大きな単位、例えばピクチャの単位、あるいは複数ピクチャをまとめたピクチャ群の単位で処理を振り分けてもよい。
同様に、上記実施の形態3では、ストリーム結合制御部が、M個のストリーム結合部に対してスライス単位で処理を振り分けたが、より大きな単位、例えばピクチャの単位、あるいは複数ピクチャをまとめたピクチャ群の単位で処理を振り分けてもよい。
また、上記実施の形態1および2では、ストリーム分割部が複製スライスヘッダを分割ストリームに挿入し、デコードエンジンがその複製スライスヘッダが挿入された分割ストリームを読み出して復号化した。しかし、ストリーム分割部が複製スライスヘッダを分割ストリームに挿入することなく、その複製スライスヘッダをデコードエンジンに直接出力してもよい。例えば、ストリーム分割部は、デコードエンジンに読み込まれる分割ストリーム中のMBラインの直前に複製スライスヘッダが存在すべきか否かを判別し、存在すべきと判別したときには、そのMBラインがデコードエンジンに読み込まれる直前に、その複製スライスヘッダをデコードエンジンに出力する。ここで、ストリーム分割部は複製スライスヘッダ自体をデコードエンジンに出力することなく、複製スライスヘッダに含まれている一部の情報だけをデコードエンジンに出力してもよい。
また、上記実施の形態3では、ストリーム結合部がSPS、PPS、およびスライスヘッダなどのヘッダ情報を生成して付与するものとしたが、他の処理部でヘッダ情報を生成して付与することとしてもよい。具体的には、N個のエンコードエンジンのそれぞれが分割ストリームを生成する際、スライスヘッダを付与した状態で分割ストリームを生成しても良い。その場合、ストリーム結合部で分割ストリームを結合する際、同一のスライスに対するスライスヘッダが重複することがあるが、その場合はストリーム結合部が不要なスライスヘッダを除去する。また、SPS、PPS、およびスライスヘッダの生成と付与は、多重化部が行うこととしてもよい。
また、上記実施の形態1および2では、ストリーム分割部は、QP変化量の修正およびQP変化量の挿入のどちらか一方を実行していたが、両方を実行してもよい。その場合、ストリーム分割部は、例えば、MBラインの先頭のマクロブロックがQP変化量を含んでいるか否かを判定すればよい。ここで、MBラインの先頭のマクロブロックがQP変化量を含んでいる場合、ストリーム分割部は、当該マクロブロックのQP変化量の置き換え等を行えばよい(図21のステップS318〜S322)。一方、MBラインの先頭のマクロブロックがQP変化量を含んでいない場合、ストリーム分割部は、累積QP変化量の出力等を行えばよい(図28のステップS352〜S356)。
さらに、ストリーム分割部がQP変化量の修正およびQP変化量の挿入の両方を実行する場合、スキップラン修正部は、例えば、MBスキップラン情報がMBラインの先頭に位置しているときに、そのMBラインの先頭にQP変化量が挿入されるか否かを判定することが好ましい。ここで、MBラインの先頭にQP変化量が挿入されない場合、スキップラン修正部は、MBスキップラン情報に先行MBスキップラン情報を加算すればよい(図18のS210)。一方、MBラインの先頭にQP変化量が挿入される場合、先行MBスキップラン情報とMBスキップラン情報とをそれぞれMBスキップラン情報として出力すればよい。
また、上記実施の形態1〜3では、第1の符号語がMBスキップラン情報である場合について説明したが、必ずしも第1の符号語はMBスキップラン情報である必要はない。例えば、第1の符号語は、スキップマクロブロックとは異なる種類のマクロブロックが連続することを示す符号語であってもよい。
また、上記実施の形態1〜3では、第2の符号語がQP変化量である場合について説明したが、必ずしも第2の符号語はQP変化量である必要はない。例えば、第2の符号語は、QP変化量とは異なる、マクロブロック間における符号化係数の変化量を示す符号語であってもよい。
なお、ブロック図(図1、図10、図12、図17、図23、図24、図26、図29、図35、および図38Aなど)の各機能ブロックは典型的には集積回路であるLSI(Large Scale Integration)として実現される。これらは個別に1チップ化されても良いし、一部または全てを含むように1チップ化されても良い。例えば、図1のデコーダ110で表される部分(M個のストリーム分割部130と、第1デコードエンジン〜第Nデコードエンジン120とを含んだもの)が1チップに含まれていても良い。
ここでは、LSIとしたが、集積度の違いにより、IC(Integrated Circuit)、システムLSI、スーパーLSI、ウルトラLSIと呼称されることもある。
また、集積回路化の手法はLSIに限るものではなく、専用回路または汎用プロセッサで実現してもよい。LSI製造後に、プログラムすることが可能なFPGA(Field Programmable Gate Array)や、LSI内部の回路セルの接続や設定を再構成可能なリコンフィギュラブル・プロセッサを利用しても良い。
さらには、半導体技術の進歩または派生する別技術によりLSIに置き換わる集積回路化の技術が登場すれば、当然、その技術を用いて機能ブロックの集積化を行ってもよい。バイオ技術の適応等が可能性としてありえる。