以下、一実施形態を図面に従って説明する。
図1に示すように、符号器10は、入力画像11を符号化信号12に変換する。
入力画像11は、符号器10のマクロブロック(MB)分割部101に供給される。MB分割部101は、入力画像11をマクロブロック(MB)単位の画像(以下、マクロブロックという)に分割し、減算器102と動きベクトル検出部112に出力する。
減算器102は、マクロブック単位の入力画像と、予測モード選択部114から出力される予測画像との差分を算出し、その差分値を直交変換量子化部103に出力する。直交変換量子化部103は、上記減算結果を直交変換(DCT:Discrete Cosine Transform)した後に、量子化を行い、量子化したデータをエントロピー符号化部104と逆量子化逆直交変換部105に出力する。エントロピー符号化部104は、直交変換量子化部103により量子化されたデータを可変長符号化変換し、符号化したデータを符号化信号12として出力する。
逆量子化逆直交変換部105は、直交変換量子化部103により量子化されたデータを逆量子化した後、逆DCTを行い加算器106に出力する。加算器106は、逆量子化逆直交変換部105の出力データに、予測モード選択部114から出力される予測画像を加算する。この加算結果は、参照画像として現フレームバッファ107に保持される。
フレーム内予測部108は、現フレームバッファ107に保持された参照画像を入力し、隣接ブロックからの画素レベルに基づいて、参照画像のフレーム内予測を行う。デブロッキングフィルタ109は、現フレームバッファ107に保持された参照画像を入力し、マクロブロック境界を平滑化して出力する。これにより、デブロッキングフィルタ109は、画像を符号化した際に生じるブロック歪を減少させる。デブロッキングフィルタ109の出力データは、フレームバッファ管理部110を経由して、過去のフレームバッファ111に格納される。
動きベクトル検出部112は、MB分割部101から入力されたMB単位の画像信号と、過去のフレームバッファ111に格納された参照画像とを用いて、対象マクロブロックの動きベクトル(以下、MV(Motion Vector)という)を検出する。MVは、通常、周辺領域との相関が高いので、フレーム間予測部113は、周辺領域のMVを予測値として、周辺のMVに基づいて動きベクトル予測値(以下、MVP(Motion Vector Predictor)という)を算出し、MVとMVPとの間の予測差分値(以下、MVD(Motion Vector Difference)という)を算出する。
予測モード選択部114は、フレーム間予測部113とフレーム内予測部108の予測誤差を比較し、当該マクロブロックを最も効率よく符号化することができる符号化モードを選択し、符号化モード情報を生成する。この符号化モード情報は、符号化対象情報として、エントロピー符号化部104へ受け渡される。符号化モード情報には、マクロブロックを分割した分割マクロブロックのサイズと、分割マクロブロックをさらに分割したサブマクロブロックのサイズが含まれる。
次に、復号器について説明する。
図2に示すように、復号器20は、符号化信号12を出力画像13に復号する。
エントロピー復号化部201は、符号化信号12をエントロピー復号(可変長復号)して逆量子化逆直交変換部202に出力する。逆量子化逆直交変換部202は、可変長復号化されたデータを逆量子化した後、逆直交変換(逆DCT変換)して出力する。加算器203は、逆量子化逆直交変換部202の出力データに、予測モード選択部204の出力データを加算する。この加算結果は、参照画像として現フレームバッファ205に保持される。
予測モード選択部204は、逆量子化逆直交変換部202によって復元された符号化モード情報に基づき、フレーム内予測部206またはフレーム間予測部207を選択する。フレーム内予測部206は、現フレームバッファ205に保持された参照画像を入力し、隣接ブロックからの画素レベルに基づいて、参照画像のフレーム内予測を行う。フレーム間予測部207は、過去のフレームバッファ210に格納された画像データからMVPを算出し、このMVPと符号化信号12に含まれるMVDに基づいて、動きベクトル(MV)を復元する。そして、フレーム間予測部207は、復元したMVに基づいて、予測画像を復元する。
予測モード選択部204によりフレーム内予測部206が選択される場合は、逆量子化逆直交変換部202によって復元された画像が現フレームバッファ205に書き込まれる。予測モード選択部204によりフレーム間予測部207が選択される場合は、逆量子化逆直交変換部202により復号された予測誤差が、フレーム間予測部207により復元された予測画像に加算されることによって画像が復号され、現フレームバッファ205に格納される。
デブロッキングフィルタ208は、現フレームバッファ205に保持された参照画像を入力し、マクロブロック境界を平滑化して出力する。これにより、デブロッキングフィルタ208は、画像を符号化した際に生じるブロック歪を減少させる。デブロッキングフィルタ208の出力データは、フレームバッファ管理部209を経由して、過去のフレームバッファ210に格納される。過去のフレームバッファ210に格納された画像データは、復号化された出力データ13として出力される。
次に、復号器20における動きベクトルの復号について説明する。
動きベクトルは現フレームを再生する際に用いるパラメータであり、過去に復号化(デコード)した画像からの移動距離を示すものである。
例えば、図3に示すように、現フレームFCに含まれるマクロブロックMB0は、時間的に過去のフレームFPと未来のフレームFFとを参照している。これら2つのフレームFP,FFは、現フレームFCよりも先にデコードされている必要がある。尚、表示順(又は撮影順)は、過去フレームFP、現フレームFC、未来フレームFFの順番である。
現フレームFCのマクロブロックMB0と同じ画像データは、過去フレームFPにおいてブロックMBPに含まれる。現フレームFCのマクロブロックMB0と同じ位置にある過去フレームFPのマクロブロックMB1を、ブロックMBPへ移動させるときの動き、すなわち、過去フレームFPにおいて示す矢印が、過去フレームFPにおける動きベクトルMVPとなる。
同様に、現フレームFCのマクロブロックMB0と同じ画像データは、未来フレームFFにおいてブロックMBFにある。現フレームFCのマクロブロックMB0と同じ位置にある未来フレームFFのマクロブロックMB2を、ブロックMBFへ移動させるときの動き、すなわち、未来フレームFFにおいて示す矢印が、未来フレームFFにおける動きベクトルMVFとなる。
従って、現フレームFCのマクロブロックMB0について、このマクロブロックMB0に含まれる画像データに替えて、マクロブロックMB0が参照するフレームFP,FFにおける移動を示す動きベクトルMVP,MVFを用いることにより、符号化信号12のデータ量を削減する。
1つのフレームにおける動きベクトルの生成処理は、図4に示すように、フレームFC内の16×16画素のMB単位で、水平方向の並列順に処理される。つまり、図4において、フレームFCに含まれる複数のマクロブロックMBは、左上のマクロブロックMBから右方向に向かって順次処理され、右端のマクロブロックMBが処理されると、次段のマクロブロックMBが処理される。
復号器20において処理されるマクロブロックを図5に示す。なお、図中、紙面上側を「上」、下側を「下」、左側を「左」、右側を「右」という。まあ、図中の数字は処理の順番を示している。
マクロブロック31は、基本の16×16画素のマクロブロックである。以下、マクロブロックを、画素サイズを含めて「MB(画素サイズ)」と表記する。例えば、マクロブロック31を、MB(16×16)31と表す。
MB(16×8)32は、MB(16×16)31を上下2つに分割した形状の16×8画素サイズのマクロブロックである。MB(8×16)33は、MB(16×16)31を左右2つに分割した形状の8×16画素サイズのマクロブロックである。MB(8×8)34は、MB(16×16)31を上下左右に4等分した形状の8×8画素サイズのマクロブロックである。なお、マクロブロック間の処理順は図に示したように、MB(16×8)32は上から下、MB(8×16)33は左から右、MB(8×8)34は、左上、右上、左下、右下の順に処理を行う。
さらに、H.264では、MB(8×8)34のマクロブロックをさらに分割したサブマクロブロック分割を指定することもできる。マクロブロックと同様に、所定の画素サイズのサブマクロブロックを「サブMB(画素サイズ)」と表記する。サブMB(8×8)35は8×8画素で構成される。サブMB(8×4)36は8×4画素で構成される。サブMB(4×8)37は4×8画素で構成される。サブMB(4×4)38は4×4画素で構成される。サブマクロブロック内の処理順は、同一形状のマクロブロックと同じである。
マクロブロックMBにおけるMVは、周辺予測から算出される。つまり、処理の対象となるマクロブロックMBにおけるMVは、そのマクロブロックと隣接するマクロブロックにおいて予測されたMVに基づいて算出される。
例えば、図6に示すように、処理の対象を、16×16画素のマクロブロックCuとする。マクロブロックCuのMVを算出するとき、このマクロブロックCuより過去に処理され、マクロブロックCuと隣接するマクロブロックを参照する。つまり、マクロブロックCuに対し、左側に隣接するマクロブロックA、真上に隣接するマクロブロックB、右上に隣接するマクロブロックC、及び左上に隣接するマクロブロックDを参照する。そして、各マクロブロックA,B,C,Dの動きベクトルMV_A,MV_B,MV_C,MV_Dの中間値をMVP(動きベクトル予測値)とし、MVPに復号したMVD(予測差分値)を加算し、加算結果をマクロブロックCuのMV(=MVP+MVD)とする。
マクロブロックが分割されている場合、分割されたそれぞれのマクロブロック(マクロブロックパーティション)毎に、上記の方法によりMVを算出する。
例えば、マクロブロックのサイズが8×8画素の場合、図6に示すように、各マクロブロックをパーティションMP0〜MP3とする。そして、各パーティションに、隣接するパーティションのMVを参照して、処理の対象とするパーティションのMVを算出する。例えば、パーティションMP3を処理の対象とするとき、隣接するパーティションMP2,MP0,MP1をそれぞれ隣接ブロックA,B,Dとする。パーティションMP3の右上のパーティションは未処理であるため、隣接ブロックCは存在しないことになる。この場合、隣接ブロックA,B,D(パーティションMP2,MP0,MP1)のMVにより、パーティションMP3のMVを算出する。
上記したように、マクロブロックの最小サイズは4×4画素である。このため、従って、上記のパーティションMP0〜MP3は、最小単位のパーティション(サブパーティション)に分割されることがある。このサブパーティションについても、同様に処理されてMVが算出される。サブパーティションが含まれるマクロブロックパーティション(MP0〜MP3と、サブパーティションに対する参照ブロックとの関係を図7(a)〜(d)にしたがって説明する。なお、各マクロブロックパーティションMP0〜MP3におけるサブパーティションの代表例として、各マクロブロックパーティションMP0〜MP3の先頭位置のサブパーティションに対する隣接ブロックを説明する。
ここで、説明のため、サブパーティションに対し、便宜的に番号を付す。図4に示すように、マクロブロック(MB)は4×4個のサブパーティション(マクロブロック)を含み、各サブパーティションは4×4個の画素を含む。そして、サブパーティションについて、マクロブロックパーティション毎に番号を付す。具体的には、左上のパーティションMP0について、左上、右上、左下、右下の順に0,1,2,3と付す。そして、サブパーティションをSPとする。従って、「0」を付したサブパーティションを「SP0」と表す。同様に、右上のパーティションMP1について、同様の順番で4,5,6,7と付す。同様に、左下のパーティションMP2について8,9,10,11と付し、右下のパーティションMP3について12,13,14,15と付す。
図7(a)に示すように、パーティションMP0のSP0に対して、隣接ブロックAは左側に隣接するマクロブロックのパーティションMP1に含まれるSP5となる。同様に、隣接ブロックBは直上に隣接するマクロブロックのSP10、隣接ブロックCは直上に隣接するマクロブロックのSP11、隣接ブロックDは左上に隣接するマクロブロックのSP15となる。
SP0が参照する隣接ブロックA〜Dは、SP0が含まれるMBよりも過去に処理されたMBに含まれる。従って、MBに対する処理を開始するとき、SP0の処理が実行可能である。SP1が参照する隣接ブロックAは当該MBに含まれるSP0であり、隣接ブロックB〜DはSP1が含まれるMBよりも過去に処理されたMBに含まれる。そして、SP0はSP1より先だって処理される。従って、SP1の処理は、SP0の処理に続いて実行可能である。同様に、SP2,SP3の処理は、SP1,SP2の処理に続いて実行可能である。
図7(b)に示すように、パーティションMP1のSP4に対して、隣接ブロックAはパーティションMP0のSP1、隣接ブロックBは直上に隣接するマクロブロックのSP14、隣接ブロックCは直上に隣接するマクロブロックのSP15、隣接ブロックDは直上に隣接するマクロブロックのSP11となる。
SP4が参照する隣接ブロックAは当該MBのMP0に含まれるSP1であり、隣接ブロックB〜DはSP4が含まれるMBよりも過去に処理されたMBに含まれる。そして、SP1はSP4より先だって処理される。従って、SP4の処理は、MP0のSP1の処理に続いて実行可能となる。そして、SP4は、SP2,SP3を参照しない。従って、SP4の処理を、SP2の処理と並行して行うことが可能である。SP5が参照する隣接ブロックAは当該MBに含まれるSP4であり、隣接ブロックB〜DはSP1が含まれるMBよりも過去に処理されたMBに含まれる。そして、SP4はSP5より先だって処理される。従って、SP5の処理は、SP4の処理に続いて実行可能である。SP6に対する処理は、先行して処理されるMP0のSP1,SP3と、当該MP1のSP4,SP5を参照する。SP4,SP5はSP6に先だって処理され、SP1はSP3に先だって処理される。従って、SP6の処理は、MP0のSP3の処理終了により実行可能となる。SP7の処理は、SP4〜SP6を参照するため、SP6の処理に続いて実行可能である。
図7(c)に示すように、パーティションMP2のSP8に対して、隣接ブロックAは左側に隣接するマクロブロックのパーティションMP3に含まれるSP13、隣接ブロックBはパーティションMP0のSP2、隣接ブロックCはパーティションMP0のSP3、隣接ブロックDは左側に隣接するマクロブロックのパーティションMP1に含まれるSP7となる。
SP8が参照する隣接ブロックA,Dは過去に処理されたMBに含まれ、隣接ブロックB,Cは当該MBのMP0に含まれるSP2,SP3である。従って、SP8の処理は、SP3の処理終了により実行可能となる。SP9に対する処理は、先行して処理されるMP0のSP2,SP3と、先行して処理されるMP1のSP6と、当該MP1のSP8を参照する。そして、SP6はSP3を参照する。従って、SP9の処理は、MP1のSP6の処理終了により実行可能となる。SP10,SP11に対する処理は、SP2,SP3と同様に、SP9,SP10の処理に続いて実行可能である。
図7(d)に示すように、パーティションMP3のSP12に対して、隣接ブロックAはパーティションMP2のSP9、隣接ブロックBはパーティションMP1のSP6、隣接ブロックCはパーティションMP1のSP7、隣接ブロックDはパーティションMP0のSP3となる。
SP12に対する処理は、先行して処理されるMP0のSP3と、MP1のSP6,SP7と、MP3のSP9を参照する。そして、SP9はMP1のSP6を参照する。また、SP7は、SP6を参照し、SP6に続いてSP7の処理が実行される。従って、SP7の処理は、SP9の処理終了よりも前か、SP9の処理と同時に終了する。このため、SP12の処理は、MP2のSP9の処理終了により実行可能となる。SP13に対する処理は、SP12,SP7,SP6を参照する。従って、SP13の処理は、SP12の処理に続いて実行可能である。SP14に対する処理は、SP6と同様に、SP11の処理終了により実行可能となる。SP15に対する処理は、SP7と同様に、SP14の処理に続いて実行可能である。
図7(a)〜(d)により説明した実行可能なタイミングは、MB(16×16)が、最小サイズ(4×4画素)のサブマクロブロック(SP0〜SP15)に分割されたときである。分割サイズが異なる場合は、上記の説明におけるSP0〜SP15が含まれるサブマクロブロック(パーティション)が処理されるタイミングとなる。例えば、図7(b)において、SP1とSP3の画素を含むように分割されたパーティションの場合、SP6又はSP6の画素を含むパーティションは、SP1とSP3を含むパーティションの処理終了、つまりSP1の処理終了のタイミングで実行可能となる。
図8に示すように、フレームFCは基本マクロブロックであるMB(16×16)31(図5参照)に分割されて処理される。マクロブロックのブロックサイズは、可変可能であり、必要に応じて設定される。MVを格納するメモリの容量は、フレームFCが最小サイズのマクロブロックに分割された時に応じて設定される。つまり、処理対象のマクロブロック(現MB)31cについて、16個のマクロブロック(サブパーティション)のデータが必要となる。そして、現MB31cに対して、左側に隣接するブロックA,Dのために5個のマクロブロックのデータが必要となる。また、現MB31cに対して、上側に隣接するブロックB,Cのために、フレームFCを構成する1ラインのマクロブロックの数の4倍の個数のデータが必要となる。
例えば、1つのフレームを構成する水平画素数の最大値を1920とすると、1ラインのマクロブロックの数は120(=1920/16)となる。基本サイズのマクロブロックMBに必要なデータ数は、16個である。従って、処理に必要なメモリの容量は、500個(=16+120×4+5−1)のデータを保持可能な容量となる。なお、「−1」は、隣接するブロックAのために必要なSP15(図4参照)のデータは、次ラインのマクロブロックにおいて参照されるブロックB,C,Dとなる。従って、隣接ブロックAのデータを保持するために必要なメモリは、3個(=4−1)となる。
上記の容量(データ数)は、1つのフレームに対するものである。フレーム間予測では、前方や後方の複数のフレームを参照してMVを生成する。従って、周辺のMVを記憶するメモリ(周辺メモリ)の容量は、参照するフレームの数に応じて設定される。
次に、動きベクトル(MV)の生成処理について説明する。
図2に示すフレーム間予測部207は、図9に示す動きベクトル生成部(MV生成部)40と周辺メモリ41を含む。
周辺メモリ41には、対象マクロブロックのMVP生成時に参照する隣接マクロブロックのMVが格納される。MV生成部40は、スタート信号(Start)42が入力されると、周辺メモリ41から読み出した隣接マクロブロックのMVに基づいてMVPを算出し、そのMVPと対象マクロブロックのMVD45に基づいて、対象マクロブロックのMVを算出する。そして、MV生成部40は、対象マクロブロックのMVを周辺メモリ41に格納する。
MV生成部40の解析部(MBTYPE/SubMBTYPE解析部と表記)401には、マクロブロックタイプ(MBTYPE)43とサブマクロブロックタイプ(SubMBTYPE)44が入力される。マクロブロックタイプ43は、基本マクロブロックの分割状況、参照方向、分割サイズに応じたコードである。サブマクロブロックタイプ44は、MB(8×8)の分割状況、参照方向、分割サイズに応じたコードである。分割状況は、ブロックが含むパーティションの数である。
解析部401は、ブロックタイプ43,44を解析し、その解析結果を振り分け制御部402と演算開始判定部403に出力する。解析結果(タイプ情報)は、分割状況、参照方向、分割サイズを含む。
振り分け制御部402は、解析部401の解析結果に基づいて生成した振り分け選択情報を演算開始判定部403と第1及び第2のアドレス生成部405a,405bに出力する。振り分け選択情報は、処理対象のマクロブロックに含まれるパーティション(MB又はSMB)を、第1のMV演算部406aと第2のMV演算部406bに振り分けるための情報である。振り分け選択情報は、それぞれのMV演算部406a.406bに処理させるパーティションを指定するために必要な各種の情報、例えば、処理対象のパーティションの位置、サイズ、参照方向を含む。
演算開始判定部403は、解析部401の解析結果と、振り分け制御部402の振り分け選択情報とに基づいて、第1及び第2のパーティション管理部(Part管理部と表記)404a,404bに対する処理開始を指示するタイミングを判定する。そして、演算開始判定部403は、その判定結果に応じたタイミングで第1及び第2のパーティション管理部404a,404bに開始信号を出力する。
第1のパーティション管理部404aは、開始信号に応答して、解析部401の解析結果に応じてカウントアップし、カウント情報を第1のアドレス生成部405aに出力する。カウント情報は、隣接ブロックのMVを読み出す、つまりMVが格納された周辺メモリ41の領域を特定するための情報である。
第1のアドレス生成部405aは、振り分け選択情報と、パーティション管理部404aから供給されるカウント情報とに基づいて、処理対象のパーティションが参照する周辺領域の隣接アドレスを順次生成する。つまり、処理対象のパーティション(ブロック)に対して隣接するパーティション(ブロックA〜D)(図6参照)のMVが記憶された領域を示す隣接アドレスを順次出力する。そして、第1のアドレス生成部405aは、生成した隣接アドレスを周辺メモリ41に出力する。更に、第1のアドレス生成部405aは、周辺メモリ41に対するアドレスの出力を、第1のMV演算部406aに通知する。
第1のMV演算部406aは、第1のアドレス生成部405aからの通知を受けて、周辺メモリ41から出力されるデータを受け取る。そして、第1のMV演算部406aは、参照するパーティションのMVを受け取ると、それらのMVに基づいてMVPを算出し、このMVPと処理対象のマクロブロックのMVDに基づいて、処理対象のマクロブロックに対するMVを算出する。
また、第1のアドレス生成部405aは、処理対象のパーティションのMVを格納するための対象アドレスを生成し、その対象アドレスを周辺メモリ41に出力するとともに、その出力を第1のMV演算部406aに通知する。第1のMV演算部406aは、その通知に応答してMVを周辺メモリ41に出力する。これにより、周辺メモリ41には、第1のMV演算部406aにより算出された処理対象のパーティションに対するMVが、対応する領域に記憶される。
第2のパーティション管理部404b、第2のアドレス生成部405b、第2のMV演算部406bの動作は、それぞれ、第1のパーティション管理部404a、第1のアドレス生成部405a、第1のMV演算部406aの動作と同じである。従って、周辺メモリ41には、第2のMV演算部406bにより算出された処理対象のパーティションに対するMVが、対応する領域に記憶される。
第1及び第2のパーティション管理部404a,404bは、互いに同じ構成を有し、互いに独立して動作可能である。また、第1及び第2のアドレス生成部405a,405bは、互いに同じ構成を有し、互いに独立して動作可能である。そして、第1及び第2のMV演算部406a.406bは、互いに同じ構成を有し、互いに独立して動作可能である。従って、第1及び第2のMV演算部406a.406bに対して、互いに異なるパーティションを処理対象として設定することにより、2つの処理対象のパーティションに対するMVが並行して算出されるため、MVを算出する処理時間が短くなる。また、第1及び第2のMV演算部406a.406bに対して、1つのパーティションにおいて異なる参照方向をそれぞれ指定することにより、互いに異なる参照方向におけるMVが並行して算出されるため、MVを算出する処理時間が短くなる。
また、演算開始判定部403は、フラグ制御部(Flg制御と表記)407を含む。フラグ制御部407は、演算開始判定部403により処理が開始されるパーティションの位置(番号)とサイズとに応じてフラグを制御する。
対象ブロックに対する演算処理は、基本的に、その対象ブロックに対する隣接ブロックの演算処理が終了している必要がある。従って、処理対象の基本MBに含まれるパーティション(MB又はSMB)を参照するパーティションにおける処理は、参照する隣接ブロックの演算処理が終了した後に実行可能となる。言い換えれば、参照する隣接ブロックの演算処理が終了すれば、処理対象のパーティションに対する処理を何時でも開始することができる。
隣接ブロックの演算が終了するタイミングは、その隣接ブロックの分割状態、つまりブロックサイズにより異なる。例えば、図7(b)に示すように、サブマクロブロックパーティション4(SP4)は、同じ基本MBに含まれるSP1の位置(画素)におけるMVを参照する。SP1は、マクロブロックパーティション0(MP0)に含まれる。このMP0が最大サイズ、すなわちMB(8×8)の場合、MP0の演算により、SP1の位置におけるMVが確定する。従って、SP4に対する処理は、MP0の演算の終了後に実行可能となる。
MP0が2つのパーティションに分割されている場合、その分割状態により演算の終了タイミングが異なる。例えば、8×4画素のパーティションに分割されている場合、第1のパーティションはSP0の画素とSP1の画素を含む。従って、第1のパーティションに対する演算の終了後に、SP4に対する処理が実行可能となる。しかし、4×8画素のパーティションに分割されている場合、SP1の画素は、第2のパーティションに含まれる。そして、第2のパーティションに対する処理は、第1のパーティションに対する処理の後に実行される。従って、第1のパーティションと第2のパーティションの処理の終了後に、SP4に対する処理が実行可能となる。
したがって、フラグ制御部407は、第1及び第2のMV演算部406a.406bにて処理されるパーティションの位置(番号)とサイズに応じて、処理終了フラグを設定する。演算開始判定部403は、その処理終了フラグに従って、処理可能なパーティションを、処理可能な演算部にて処理させるように、パーティション管理部に開始信号を出力する。従って、マクロブロックパーティションに対する演算処理の終了を待つことなく、つまり、マクロブロックパーティションに対する演算処理中に、他のマクロブロックパーティションに対する演算処理を開始することが可能となるため、処理対象のMBにかかる処理時間を短縮することが可能となる。
次に、演算部406a.406bに対する振り分けを、図10,図11に従って説明する。
尚、第1及び第2のアドレス生成部405a,405b、第1及び第2のMV演算部406a.406bの組合せを判りやすくするために、図9に示すように、第1のアドレス生成部405a及び第1のMV演算部406aを「A側」、第2のアドレス生成部405b及び第2のMV演算部406bを「B側」とする。従って、第1のパーティション管理部404aは「A側用」、第2のパーティション管理部404bは「B側用」と示す。これに基づき、図10,図11において、第1のMV演算部406aにおける処理を「A側」と示し、第2のMV演算部406bにおける処理を「B側」と示す。また、図10,図11において、参照方向が前方の場合には「F」を、参照方向が後方の場合には「B」を示す。
先ず、ステップ501において、MP0〜MP3の参照方向が片側かつ同一方向か否かを判定する。MP0〜MP3の参照方向が片側かつ同一方向の場合、つまり「YES」と判定した場合、ステップ511に移行する。一方、「NO」と判定した場合、ステップ502に移行する。ステップ502において、MP0〜MP2の参照方向が片側かつ同一方向であり、MP3が双方向か否かを判定する。「YES」と判定した場合、ステップ512に移行する。一方、「NO」と判定した場合、ステップ503に移行する。
ステップ503において、MP0の参照方向が双方向か否かを判定する。「YES」と判定した場合、ステップ504に移行する。一方、「NO」と判定した場合、ステップ513に移行する。ステップ504において、MP0の処理を、2つのMV演算部に参照方向に応じて振り分ける。例えば、「F」をA側のMV演算部406aにて処理し、「B」をB側のMV演算部にて処理する。そして、ステップ505に移行する。
次いで、ステップ505において、MP1の参照方向が双方向か否かを判定する。「YES」と判定した場合、ステップ506に移行する。一方、「NO」と判定した場合、ステップ520に移行する。ステップ506において、MP1の処理を、2つのMV演算部に参照方向に応じて振り分ける。例えば、「F」をA側のMV演算部406aにて処理し、「B」をB側のMV演算部にて処理する。そして、図11に示すステップ507に移行する。
次いで、ステップ507において、MP2の参照方向が双方向か否かを判定する。「YES」と判定した場合、ステップ508に移行する。一方、「NO」と判定した場合、ステップ529に移行する。ステップ508において、MP2の処理を、2つのMV演算部に参照方向に応じて振り分ける。例えば、「F」をA側のMV演算部406aにて処理し、「B」をB側のMV演算部にて処理する。そして、ステップ509に移行する。
次いで、ステップ509において、MP3の参照方向が双方向か否かを判定する。「YES」と判定した場合、ステップ510に移行する。一方、「NO」と判定した場合、ステップ536に移行する。ステップ510において、MP3の処理を、2つのMV演算部に参照方向に応じて振り分ける。例えば、「F」をA側のMV演算部406aにて処理し、「B」をB側のMV演算部にて処理する。MP0〜MP3の全てについて処理したため、処理を終了する。
図10に示すステップ511において、MP0〜MP3の処理を2つのMV演算部406a.406bに交互に振り分け、連続MP並列演算処理を行う。例えば、MP0,MP3の処理をA側に振り分け、MP1,MP4の処理をB側に振り分ける。MP0〜MP3の全てについて処理したため、処理を終了する。
連続MP並列演算処理は、連続して処理されるように設定された複数のMPについて、MPの処理中に次のMPの処理を開始することで、2つのMPに対する処理を並列して実行する処理である。例えば、図7(b)において説明したように、MP1のSP4に対する処理は、MP0に含まれるSP1の処理終了により実行可能となる。従って、MP1のSP4に対する処理は、MP0のSP2に対する処理と並行して実行することが可能である。従って、同様に構成された2つのMV演算部406a.406bを用い、一方(図10ではA側)のMV演算部406a(図9参照)にMP0の処理を振り分け、他方(図10ではB側)のMV演算部406b(図9参照)にMP1の処理を振り分けことで、MP0の処理とMP1の処理を並列実行する。次いで、MP0の処理が終了すると、MP2の処理をA側のMV演算部406aに振り分けることで、MP1の処理とMP2の処理を並列実行する。次いで、MP1の処理が終了すると、MP3の処理をB側のMV演算部406bに振り分けることで、MP2の処理とMP3の処理を並列実行する。このように、連続MP並列演算処理を実行することで、1つのMBに対する処理時間が、各MP0〜MP4を逐次処理する場合の処理時間よりも短縮することができる。
図10に示すステップ512において、MP0〜MP2の処理を2つのMV演算部406a.406bに交互に振り分け、連続MP並列演算処理を行う。そして、図11に示すステップ509を経由してステップ510に移行する。このステップ510において、MP3の処理を、2つのMV演算部に参照方向に応じて振り分ける。例えば、「F」をA側のMV演算部406aにて処理し、「B」をB側のMV演算部にて処理する。
図10に示すステップ513において、MP1の参照方向が双方向か否かを判定する。「YES」と判定した場合、ステップ514に移行する。一方、「NO」と判定した場合、ステップ516に移行する。ステップ514において、MP0を一方(例えばA側)のMV演算部406aにて処理する。次いで、ステップ515において、MP1の処理を、2つのMV演算部に参照方向に応じて振り分ける。例えば、「F」をA側のMV演算部406aにて処理し、「B」をB側のMV演算部にて処理する。そして、図11に示すステップ507に移行する。
図10に示すステップ516において、MP0及びMP1の参照方向が片側同一方向か否かを判定する。「YES」と判定した場合、ステップ519に移行する。一方、「NO」と判定した場合、ステップ517に移行する。ステップ517において、MP0とMP1の処理を2つのMV演算部406a.406bに振り分け、並列して処理を行う。次いで、ステップ518において、ステップ517における双方の処理が終了するのを待ち、図11に示すステップ507に移行する。これは、並列に処理するMPの分割サイズが異なる場合、演算に係る時間が異なる可能性があるからである。
図10に示すステップ519において、MP0とMP1の処理を2つのMV演算部406a.406bに振り分け、連続MP並列演算処理を行う。そして、図11に示すステップ507に移行する。
図10に示すステップ520において、MP1〜MP3の参照方向が片側かつ同一方向か否かを判定する。「YES」と判定した場合、ステップ521に移行する。一方、「NO」と判定した場合、図11に示すステップ522に移行する。図10に示すステップ521において、MP1〜MP3の処理を2つのMV演算部406a.406bに交互に振り分け、連続MP並列処理を行う。MP0〜MP3の全てについて処理したため、処理を終了する。
図11に示すステップ522において、MP2の参照方向が双方向か否かを判定する。「YES」と判定した場合、ステップ523に移行する。一方、「NO」と判定した場合、ステップ525に移行する。ステップ523において、MP1を一方(例えばA側)のMV演算部406aにて処理する。次いで、ステップ524において、MP2の処理を、2つのMV演算部に参照方向に応じて振り分ける。例えば、「F」をA側のMV演算部406aにて処理し、「B」をB側のMV演算部にて処理する。そして、ステップ509に移行する。
ステップ525において、MP1及びMP2の参照方向が片側かつ同一方向か否かを判定する。「YES」と判定した場合、ステップ528に移行する。一方、「NO」と判定した場合、ステップ526に移行する。ステップ526において、MP1とMP2の処理を2つのMV演算部406a.406bに振り分け、並列して処理を行う。次いで、ステップ527において、図10のステップ518と同様の理由により、ステップ526における双方の処理が終了するのを待ち、次のステップ509に移行する。
ステップ528において、MP1とMP2の処理を2つのMV演算部406a.406bに振り分け、連続MP並列演算処理を行う。そして、ステップ509に移行する。
ステップ529において、MP3の参照方向が双方向か否かを判定する。「YES」と判定した場合、ステップ530に移行する。一方、「NO」と判定した場合、ステップ532に移行する。ステップ530において、MP2を一方(例えばA側)のMV演算部406aにて処理する。次いで、ステップ531において、MP3の処理を、2つのMV演算部に参照方向に応じて振り分ける。例えば、「F」をA側のMV演算部406aにて処理し、「B」をB側のMV演算部にて処理する。MP0〜MP3の全てについて処理したため、処理を終了する。
ステップ532において、MP2及びMP3の参照方向が片側かつ同一方向か否かを判定する。「YES」と判定した場合、ステップ535に移行する。一方、「NO」と判定した場合、ステップ533に移行する。ステップ533において、MP2とMP3の処理を2つのMV演算部406a.406bに振り分け、並列して処理を行う。次いで、ステップ534において、図10のステップ518と同様の理由により、ステップ533における双方の処理が終了するのを待ち、処理を終了する。
ステップ535において、MP2とMP3の処理を2つのMV演算部406a.406bに振り分け、連続MP並列演算処理を行う。そして、処理を終了する。
ステップ536において、MP3を一方(例えばA側)のMV演算部406aにて処理する。そして、処理を終了する。
次に、上記の処理を、図12〜図18に従って説明する。
なお、MV演算において、マクロブロックの分割数が多い、つまり、SMB(パーティション)の数が多いほど、演算に要する時間が長い。従って、最小サイズ(4×4画素)のSMB(パーティション)に分割したMBに対する処理手順を説明する。
なお、図12〜図18において、MB(16×16)に含まれるパーティションを、それぞれの番号(0〜15)を用いて示す。また、参照方向について、前方を「Fwd」、後方を「Bwd」と示す。また、第1のMV演算部406aを「A」、第2のMV演算部406bを「B」と示す。
図12(a)に示すように、SP0〜SP15の全てが前方を参照し、後方を参照していないMBの場合、図10のステップ501において「YES」と判定され、ステップ511において連続MP並列演算処理される。
図12(b)に示すように、SP0〜SP3(MP0)とSP8〜SP11(MP2)を(A)演算部406aに振り分け、SP4〜SP7((MP1)とSP12〜SP15(MP3)を(B)演算部406bに振り分ける。そして、SP1の処理終了を待ってSP4の処理を開始する。SP3の処理に続いてSP8の処理を開始する。そして、(A)演算部406aにおいて、SP8の処理が終了すると、(B)演算部406bにおいてSP6が終了するため、続いてSP9の処理を開始する。
(B)演算部406bにおいて、SP7の処理を終了すると、(A)演算部406aにおいてSP9の処理が終了するため、続いてSP12の処理を開始する。そして、(B)演算部406bにおいて、SP13の処理を終了すると、(A)演算部406aにおいてSP11の処理が終了するため、続いてSP14の処理を開始する。そして、(B)演算部406bにおいて、SP15の処理が終了すると、1つのMBに対する処理が終了する。
図12(b)において、「Fwd」「Bwd」は、従来例のように、参照方向に応じて処理を振り分ける場合における処理の順番を示している。図12(a)に示すように、全てのSP0〜SP15が同一方向(Fwd)を参照するため、SP0〜SP15は、「Fwd」のMV演算部にて逐次処理される。
1つのSPにおいてMVの算出に要するサイクルを「8」とすると、本実施形態のように、A,BのMV演算部406a.406bに処理を振り分ける場合、80サイクル(=10×8)でMBに対するMV演算処理が終了する。これに対し、従来例では、128サイクル(=16×8)必要とする。従って、図12(a)に示すケースの処理時間は、従来例の62.5%となり、短縮される。
図13(a)に示すように、SP12〜SP15(MP3)が前方を参照し、SP0〜SP15の全てが後方を参照するMBの場合、図10のステップ502において「YES」と判定されてステップ512において連続MP並列演算処理された後、図11のステップ509において「YES」と判定されてステップ510においてMP3について並列処理される。
図13(b)に示すように、SP0〜SP11(MP0〜MP2)については、図12(b)と同様である。そして、SP12〜SP15について、前方参照の演算処理を(A)演算部406aに振り分け、後方参照の演算処理を(B)演算部406bに振り分ける。この結果、96サイクル(=12×8)でMBに対するMV演算処理が終了する。
従来例の場合、後方参照するSP0〜SP15が「Bwd」のMV演算部にて逐次処理されるため、128サイクル(=16×8)必要とする。従って、図13(a)に示すケースの処理時間は、従来例の75%となり、短縮される。
図14(a)に示すように、SP12〜SP15(MP3)が前方を参照し、SP0〜SP15の全てが後方を参照するMBの場合、図10のステップ502において「YES」と判定されてステップ512において連続MP並列演算処理された後、図11のステップ509において「YES」と判定されてステップ510においてMP3について並列処理される。
図14(b)に示すように、SP0〜SP3について、前方参照の演算処理を(A)演算部406aに振り分け、後方参照の演算処理を(B)演算部406bに振り分ける。そして、SP4〜SP15(MP1〜MP3)については、図12(b)と同様である。この結果、96サイクル(=12×8)でMBに対するMV演算処理が終了する。
従来例の場合、後方参照するSP0〜SP15が「Bwd」のMV演算部にて逐次処理されるため、128サイクル(=16×8)必要とする。従って、図14(a)に示すケースの処理時間は、従来例の75%となり、短縮される。
なお、前方を参照するパーティションがSP4〜SP7の場合、同一方向を参照し連続するMP2,MP3のSP8〜SP16が連続MP並列演算処理される。また、前方を参照するパーティションがSP8〜SP11の場合、同一方向を参照し連続するMP0,MP1のSP0〜SP7が連続MP並列演算処理される。従って、MV演算に要する時間は、112サイクル(=14×8)となり、短縮される。
図15(a)に示すように、SP0〜SP15の全てが前方及び後方を参照するMBの場合、図10のステップ503,505、図11のステップ507,509において「YES」と判定される。そして、ステップ504において、MP0の前方参照の処理を(A)演算部406aに、後方参照の処理を(B)演算部406bに振り分ける。同様に、ステップ506,508,510において、MP1,MP2,MP3の前方参照の処理を(A)演算部406aに、後方参照の処理を(B)演算部406bに振り分ける。
従って、図15(b)に示すように、SP0〜SP15がそれぞれのMV演算部406a.406bにおいて逐次処理される。従来例では、参照方向に応じた演算部においてSP0〜SP15が逐次処理される。従って、図15(a)に示すケースの処理時間は、従来例と同じとなる。すなわち、図15(a)に示すケースの場合、本実施形態の構成を採用しても、従来例と同じ時間で処理を行うことができる。
図16(a)に示すように、SP4〜SP15(MP1〜MP3)が前方を参照し、SP0〜SP15の全てが後方を参照するMBの場合、図10のステップ513において「YES」と判定され、ステップ514において、MP0のSP0〜SP3について、一方のMV演算部(図16(b)では(B)演算部406b)により処理される。SP4〜SP15については、図15(b)と同様に、前方参照の処理を(A)演算部406aに、後方参照の処理を(B)演算部406bに振り分ける。この結果、図16(a)に示すケースの場合、図15(a)に示すケースと同様に、従来例と同じ時間で処理される。尚、図16(a)(b)では、MP0が前方を参照しないMBについて説明したが、MP1〜MP3のうちの何れか1つが前方を参照しないMBについても、図16(b)に示す処理手順と同様になる。
図17(a)に示すように、SP0〜SP3(MP0)とSP12〜SP15(MP3)が前方を参照し、SP4〜SP11(MP1,MP2)の全てが後方を参照するMBの場合、図10のステップ516において「NO」と判定されてステップ517においてMP0とMP1の処理がそれぞれ異なる演算部にて処理される。また、図11のステップ532において「NO」と判定されてステップ533においてMP2とMP3の処理がそれぞれ異なる演算部にて処理される。
すなわち、図17(b)に示すように、SP0〜SP3,SP8〜SP11が(A)演算部406aにて処理され、SP4〜SP7,SP12〜SP15が(B)演算部406bにて処理される。この結果、64サイクル(=8×8)でMBに対するMV演算処理が終了する。従来例の場合、SP0〜SP15が参照方向に応じて逐次「Fwd」「Bwd」に振り分けられて処理されるため、128サイクル(=16×8)必要とする。従って、図17(a)に示すケースの処理時間は、従来例の50%となり、短縮される。
なお、連続する2つのMPにおいて片方向かつ参照方向が互いに異なればよく、例えば、SP0〜SP3(MP0)が後方参照、SP4〜SP7(MP1)が前方参照であってもよい。SP8〜SP15(MP2,MP3)についても同様である。
図18(a)に示すように、SP0〜SP7(MP0,MP1)が前方のみを参照し、SP8〜SP15(MP2,MP3)が双方向(前方及び後方)を参照するMBの場合、図10のステップ516において「YES」と判定されてステップ519においてMP0とMP1が連続MP並列演算処理される。そして、図11のステップ507,509において「YES」と判定されてステップ508,510においてMP2とMP3の処理が参照方向に応じてそれぞれ異なる演算部にて処理される。
すなわち、図18(b)に示すように、SP0〜SP3,SP4〜SP7が(A)演算部406aと(B)演算部406bにより連続MP並列演算処理され、SP8〜SP15について、前方参照の処理が(A)演算部406aにて、後方参照の処理が(B)演算部406bにて実行される。この結果、112サイクル(=14×8)でMBに対するMV演算処理が終了する。従来例の場合、SP0〜SP15が参照方向に応じて逐次「Fwd」「Bwd」に振り分けられて処理されるため、128サイクル(=16×8)必要とする。従って、図17(a)に示すケースの処理時間は、従来例の87.5%となり、短縮される。
次に、フラグ制御について説明する。
図19は、図9に示す演算開始判定部403(フラグ制御部407)にて参照されるフラグの説明図である。なお、図19は、フラグの位置を、マクロブロックに対応して表示している。そして、本実施形態におけるフラグは、SPの処理に関わる。従って、関連性のあるSPの番号を用いてフラグ[n](nはSPの番号)として説明する。
なお、SPの番号は、SPのサイズに応じて、そのパーティションに含まれる最小サイズのSMBの番号のうち、最初に処理されるSPの番号(数が小さな番号)を用いるものとする。例えば、図4に示すマクロブロックにおいて、MP0が1つのパーティションとして定義されている場合、このMP0に含まれる最小のSP0〜SP3のうち、最初に処理されるSP0を代表として用いる。従って、MP1の場合には、SP4が代表となる。
図19に示すように、演算開始判定部403(図9参照)は、5つのフラグを有している。フラグ制御部407は、対応するSPの処理が開始されると、フラグをセットする。そして、フラグ制御部407は、所定のタイミング、例えば、1つのMBに対するMV演算処理を終了するタイミングで、全てのフラグをリセットする。尚、フラグをリセットするタイミングを互いに相違するように設定してもよい。
図7(a)〜(d)において説明したように、次のMPに対する処理を可能とするのは、SP1,SP3,SP6,SP9,SP11である。このため、これらのSPに対応してフラグ[1],[3],[6],[9],[11]を備え、これらのフラグを適宜セットすることにより、次のMPの処理開始を可能とする。つまり、処理中のMPにおいてフラグをセットすることで、演算開始判定部403は、次のMPに対する処理の開始を指示することで、連続MP並列演算処理を容易に実行することができる。
次に、MPに含まれるSPの開始とフラグの制御を、説明する。
図20は、MP0に対する処理を示すフローチャートである。
ステップ601において、MP0に含まれるSMB(パーティション)のサイズを判定する。そして、判定したサイズに応じて、ステップ602a,602b,602c,602dの何れかに移行する。
サイズが「8×8」の場合、SP0が含まれる。従って、ステップ602aにおいてSP0の処理を開始し、フラグ[1]及びフラグ[3]をセット(図中、「Flag[1,3]=1」と表記)する。
サイズが「8×4」の場合、MP0はSP0とSP2を含む。従って、ステップ602bにおいて、SP0の処理を開始し、フラグ[1]をセットする。次いで、ステップ603bにおいてSP2の処理を開始し、フラグ[3]をセットする。
サイズが「4×8」の場合、MP0はSP0とSP1を含む。従って、ステップ602cにおいて、SP0の処理を開始する。次いで、ステップ603cにおいてSP1の処理を開始し、フラグ[1],[3]をセットする。
サイズが「4×4」の場合、MP0はSP0〜SP3を含む。従って、ステップ602dにおいて、SP0の処理を開始する。次いで、ステップ603dにおいてSP1の処理を開始し、フラグ[1]をセットする。次いで、ステップ604dにおいて、SP2の処理を開始する。次いで、ステップ605dにおいてSP3の処理を開始し、フラグ[3]をセットする。
図21は、MP1に対する処理を示すフローチャートである。
ステップ611において、フラグ[1]がセットされている(=1)か否かを判定する。そして、フラグ[1]がセットされると、次のステップ612に移行する。つまり、フラグ[1]がセットされるまで待機する。
ステップ612において、MP1に含まれるSMB(パーティション)のサイズを判定する。そして、判定したサイズに応じて、ステップ613a,613b,613c,613dの何れかに移行する。
サイズが「8×8」の場合、SP4が含まれる。従って、ステップ613aにおいてSP4の処理を開始し、フラグ[6]をセットする。
サイズが「8×4」の場合、MP1はSP4とSP6を含む。従って、ステップ613bにおいて、SP4の処理を開始する。次いで、ステップ614bにおいて、フラグ[3]がセットされている(=1)か否かを判定し、フラグ[3]がセットされるまで待機する。フラグ[3]がセットされると、ステップ615bにおいてSP6の処理を開始し、フラグ[6]をセットする。
サイズが「4×8」の場合、MP1はSP4とSP5を含む。従って、ステップ613cにおいて、SP4の処理を開始し、フラグ[6]をセットする。次いで、ステップ614cにおいてSP5の処理を開始する。
サイズが「4×4」の場合、MP1はSP4〜SP7を含む。従って、ステップ613dにおいて、SP4の処理を開始する。次いで、ステップ614dにおいて、SP5の処理を開始する。次いで、ステップ615dにおいてSP6の処理を開始し、フラグ[6]をセットする。次いで、ステップ616dにおいてSP7の処理を開始する。
図22は、MP2に対する処理を示すフローチャートである。
ステップ621において、フラグ[3]がセットされている(=1)か否かを判定する。そして、フラグ[3]がセットされると、次のステップ622に移行する。つまり、フラグ[3]がセットされるまで待機する。
ステップ622において、MP2に含まれるSMB(パーティション)のサイズを判定する。そして、判定したサイズに応じて、ステップ623a,623b,623c,623dの何れかに移行する。
サイズが「8×8」の場合、SP8が含まれる。ステップ623aにおいて、フラグ[6]がセットされている(=1)か否かを判定し、フラグ[6]がセットされるまで待機する。フラグ[6]がセットされると、ステップ624aにおいてSP8の処理を開始し、フラグ[9],[11]をセットする。
サイズが「8×4」の場合、MP2はSP8とSP10を含む。ステップ623bにおいて、フラグ[6]がセットされている(=1)か否かを判定し、フラグ[6]がセットされるまで待機する。フラグ[6]がセットされると、ステップ624bにおいて、SP8の処理を開始し、フラグ[9]をセットする。次いで、ステップ625bにおいてSP10の処理を開始し、フラグ[11]をセットする。
サイズが「4×8」の場合、MP2はSP8とSP9を含む。ステップ623cにおいて、SP8の処理を開始する。次いで、ステップ624cにおいて、フラグ[6]がセットされている(=1)か否かを判定し、フラグ[6]がセットされるまで待機する。フラグ[6]がセットされると、ステップ625cにおいてSP9の処理を開始し、フラグ[9],[11]をセットする。
サイズが「4×4」の場合、MP2はSP8〜SP11を含む。ステップ623dにおいて、SP8の処理を開始する。次いで、ステップ624dにおいて、SP9の処理を開始し、フラグ[9]をセットする。次いで、ステップ625dにおいてSP10の処理を開始する。次いで、ステップ626dにおいてSP11の処理を開始し、フラグ[11]をセットする。
図23は、MP3に対する処理を示すフローチャートである。
ステップ631において、フラグ[9]がセットされている(=1)か否かを判定する。そして、フラグ[9]がセットされると、次のステップ632に移行する。つまり、フラグ[9]がセットされるまで待機する。
ステップ632において、MP3に含まれるSMB(パーティション)のサイズを判定する。そして、判定したサイズに応じて、ステップ633a,633b,633c,633dの何れかに移行する。
サイズが「8×8」の場合、SP12が含まれる。従って、ステップ633aにおいてSP12の処理を開始する。
サイズが「8×4」の場合、MP3はSP12とSP14を含む。従って、ステップ633bにおいて、SP12の処理を開始する。次いで、ステップ634bにおいて、フラグ[11]がセットされている(=1)か否かを判定し、フラグ[11]がセットされるまで待機する。フラグ[11]がセットされると、ステップ635bにおいてSP14の処理を開始する。
サイズが「4×8」の場合、MP3はSP12とSP13を含む。従って、ステップ633cにおいて、SP12の処理を開始する。次いで、ステップ634cにおいてSP13の処理を開始する。
サイズが「4×4」の場合、MP3はSP12〜SP15を含む。従って、ステップ633dにおいて、SP12の処理を開始する。次いで、ステップ634dにおいて、SP13の処理を開始する。次いで、ステップ635dにおいてSP14の処理を開始する。次いで、ステップ636dにおいてSP15の処理を開始する。
次に、MPの構成と、MPに含まれるSPの処理順序及びフラグの設定のタイミングを説明する。
先ず、MP0について説明する。
図24(a)に示すように、MP0の分割サイズを「8×8」とする。この場合、図24(b)に示すように、SP0を処理し、フラグ[1],[3]をセットする。
図25(a)に示すように、MP0の分割サイズを「8×4」とする。この場合、図25(b)に示すように、SP0を処理し、フラグ[1]をセットする。次いで、SP2を処理し、フラグ[3]をセットする。
図26(a)に示すように、MP0の分割サイズを「4×8」とする。この場合、図26(b)に示すように、SP0を処理し、フラグ[1],[3]をセットする。次いで、SP1を処理する。
図27(a)に示すように、MP0の分割サイズを「4×4」とする。この場合、図27(b)に示すように、SP0を処理する。次いで、SP1を処理し、フラグ[1]をセットする。次いで、SP2を処理する。次いで、SP3を処理し、フラグ[3]をセットする。
次に、MP1について説明する。
図28(a)に示すように、MP0の分割サイズを「4×4」、MP1の分割サイズを「8×8」とする。この場合、図28(b)に示すように、フラグ[1]がセットされる(図27(b)参照)まで待機し、SP4を処理し、フラグ[6]をセットする。
図29(a)に示すように、MP0の分割サイズを「4×4」、MP1の分割サイズを「8×4」とする。この場合、図29(b)に示すように、フラグ[1]がセットされる(図27(b)参照)まで待機し、SP4を処理する。次いで、フラグ[3]がセットされる(図27(b)参照)まで待機し、SP6を処理し、フラグ[6]をセットする。
図30(a)に示すように、MP0の分割サイズを「4×4」、MP1の分割サイズを「4×8」とする。この場合、図30(b)に示すように、フラグ[1]がセットされる(図27(b)参照)まで待機し、SP4を処理し、フラグ[6]をセットする。次いで、SP5を処理する。
図31(a)に示すように、MP0の分割サイズを「4×4」、MP1の分割サイズを「4×4」とする。この場合、図31(b)に示すように、フラグ[1]がセットされる(図27(b)参照)まで待機し、SP4を処理する。次いで、SP5を処理する。次いで、フラグ[3]がセットされる(図27(b)参照)まで待機し、SP6を処理し、フラグ[6]をセットする。次いで、SP7を処理する。
図32(a)に示すように、MP0の分割サイズを「8×8」、MP1の分割サイズを「8×4」とする。この場合、図32(b)に示すように、フラグ[1]がセットされる(図24(b)参照)まで待機し、SP4を処理する。フラグ[3]はSP0の処理においてセットされている(図24(b)参照)ため、SP4に続いてSP6を処理し、フラグ[6]をセットする。
次に、MP2について説明する。
図33(a)に示すように、MP1の分割サイズを「4×4」、MP2の分割サイズを「8×8」とする。この場合、図33(b)に示すように、フラグ[3]がセットされる(図27(b)参照)まで待機する。次いで、フラグ[6]がセットされる(図31(b)参照)まで待機し、SP8を処理し、フラグ[9]、「11」をセットする。
図34(a)に示すように、MP1の分割サイズを「4×4」、MP2の分割サイズを「8×4」とする。この場合、図34(b)に示すように、フラグ[3]がセットされる(図27(b)参照)まで待機する。次いで、フラグ[6]がセットされる(図31(b)参照)まで待機し、SP8を処理し、フラグ[9]をセットする。次いで、SP10を処理し、フラグ[11]をセットする。
図35(a)に示すように、MP1の分割サイズを「4×4」、MP2の分割サイズを「4×8」とする。この場合、図35(b)に示すように、フラグ[3]がセットされる(図27(b)参照)まで待機し、SP8を処理する。つまり、SP3に続いてSP8を処理する。次いで、フラグ[6]がセットされる(図31(b)参照)まで待機し、SP9を処理し、フラグ[9],[11]をセットする。
図36(a)に示すように、MP1の分割サイズを「4×4」、MP2の分割サイズを「4×4」とする。この場合、図36(b)に示すように、フラグ[3]がセットされる(図27(b)参照)まで待機し、SP8を処理する。次いで、SP9を処理し、不ラブ[9]をセットする。次いで、SP10を処理する。次いで、SP11を処理し、フラグ[11]をセットする。つまり、SP3に続いてSP8〜SP11を連続的に処理する。
次に、MP3について説明する。
図37(a)に示すように、MP1の分割サイズを「4×4」、MP3の分割サイズを「8×8」とする。この場合、図37(b)に示すように、フラグ[9]がセットされる(図36(b)参照)まで待機し、SP12を処理する。
図38(a)に示すように、MP1の分割サイズを「4×4」、MP3の分割サイズを「8×4」とする。この場合、図38(b)に示すように、フラグ[9]がセットされる(図36(b)参照)まで待機し、SP12を処理する。次いで、フラグ[11]がセットされる(図31(b)参照)まで待機し、SP14を処理する。
図39(a)に示すように、MP1の分割サイズを「4×4」、MP3の分割サイズを「4×8」とする。この場合、図39(b)に示すように、フラグ[9]がセットされる(図36(b)参照)まで待機し、SP12を処理する。次いで、SP13を処理する。
図40(a)に示すように、MP1の分割サイズを「4×4」、MP3の分割サイズを「4×4」とする。この場合、図40(b)に示すように、フラグ[9]がセットされる(図36(b)参照)まで待機し、SP12を処理する。次いで、SP13を処理する。次いで、SP14を処理する。次いで、SP15を処理する。
次に、各MPにおいて、分割サイズが異なる場合について説明する。
図41(a)に示すように、MBは、MP0の分割サイズが「4×4」、MP1の分割サイズが「8×4」、MP2の分割サイズが「4×8」、MP3の分割サイズが「8×8」、設定されている。従って、このMBは、SP0〜SP4,SP6,SP8,SP9,SP12を含む。そして、全てのSPは前方を参照し、後方を参照するSPは無い。
このようなMBの場合、図10のステップ501において「YES」と判定され、ステップ511において連続MP並列演算処理される。
図41(b)に示すように、SP0〜SP3(MP0)とSP8,SP9(MP2)を(A)演算部406aに振り分け、SP4,SP6((MP1)とSP12(MP3)を(B)演算部406bに振り分ける。
次に、MP0において、SP0〜SP3の逐次処理し、フラグ[1],[3]をセットする(図27(b)参照)。
MP1において、フラグ[1]がセットされると、SP4を処理する。次いで、フラグ[3]がセットされると、SP6を処理し、フラグ[6]をセットする(図29(b)参照)。
MP2において、フラグ[3]がセットされると、SP8を処理する。次いで、フラグ[6]がセットされると、SP9を処理し、フラグ[9],[11]をセットする(図35(b)参照)。
MP3において、フラグ[9]がセットされると、SP12を処理する。
各SPにおける処理時間は変わらないため、図41(a)に示すケースの処理時間は、56サイクル(=7×8)となる。これに対し、従来例では、72サイクル(=9×8)必要とする。従って、図41(a)に示すケースの処理時間は、従来例の約77.7%となり、短縮される。
以上記述したように、本実施形態によれば、以下の効果を奏する。
(1)第1及び第2のMV演算部406a,406bは、それぞれ参照ブロックのMVに基づいて対象ブロックのMVを生成する。解析部401は、マクロブロックタイプ及びサブマクロブロックタイプを解析し、その解析結果を出力する。振り分け制御部402は、解析部401の解析結果に基づいて、基本マクロブロックを分割した各パーティションの参照方向を判定し、一つのフレームを参照するパーティションが連続する場合にその連続する複数のパーティションを第1のMV演算部406aと第2のMV演算部406bに振り分けるようにした。
各演算部406a,406bに振り分けたSPについて、それぞれ独立して演算が可能であるため、2つのSPに対する演算を並列して行うことにより、MV演算に係る時間を短縮することができる。
(2)演算開始判定部403は、解析部401の解析結果に基づいて、演算部406a,406bの処理開始を判定し、判定結果に応じて演算部406a,406bの演算開始を制御する。従って、演算部406a,406bの演算開始を例えば同時にすることで、MV演算に係る時間を短縮することができる。
(3)演算開始判定部403は、連続する2つのMPの参照方向が同じ場合に、複数の前記演算部における演算開始を、MPの処理順序に応じて制御する。従って、演算部406a,406bの演算が並列に行われる分だけ、MV演算に係る時間を短縮することができる。
(4)演算開始判定部403は、連続する2つのMPが一つのフレームを参照し、且つ参照方向が異なる場合に、2つのMV演算部406a,406bにおける演算をそれぞれ開始させる。参照するフレームが異なる場合、各演算部406a,406bに振り分けたMPについて、それぞれ独立して演算が可能であるため、2つのMPに対する演算を同時に行うことにより、MV演算に係る時間を短縮することができる。
(5)各パーティションは、分割サイズに応じた少なくとも1つのサブパーティションを含む。フラグ制御部407は、処理中のパーティションについて、そのパーティションの分割サイズに応じて、次に処理するパーティションが参照するサブパーティションの処理に応じてフラグをセットする。フラグのセットにより、次のMPに対する演算を開始することができる。従って、フラグのセットと監視により、各演算部406a,406bおける処理を容易に並列的とすることができる。
尚、上記実施形態は、以下の態様で実施してもよい。
・上記実施形態では、参照するフレームが前方(F)か後方(B)かに応じて処理を第1及び第2のMV演算部406a,406bに振り分けるようにしたが、参照するフレームは、前方と後方に限らず、前方の2つのフレーム、後方の2つのフレームを参照場合でもよい。つまり、2つのフレームを参照するか、1つのフレームを参照する場合には同一のフレームを参照するか異なるフレームを参照するかを判定して処理を振り分けるようにしてもよい。
・上記実施形態は、MV生成部40が、各MV演算部406a,406bについて、演算の開始を判定する演算開始判定部403を含む構成としたが、演算開始判定部を省略してもよい。例えば、各MV演算部406a,406bが、互いに処理の終了を通知する構成とし、処理対象のMPに対して所定のSPの処理終了に応じて処理を開始するようにしてもよい。