以下、本発明を実施するための最良の形態として、本発明を適用したMPEGエンコーダについて図面を参照して詳細に説明する。
全体構成
図1は、本発明を適用したMPEGエンコーダの構成を示すブロック図である。
図1に示すMPEGエンコーダ10は、画像並べ替え部11と、動き検出部12と、差分検出部13と、DCT(Discrete Cosine Transform)演算部14と、量子化部15と、可変長符号化(VLC)部16と、送信バッファ17と、視覚パラメータ検出部18と、符号量制御部20と、逆量子化部21と、IDCT(Inverse Discrete Cosine Transform)演算部22と、加算器23と、フレームメモリ24と、動き補償部25と、スイッチ26とを備えている。
MPEGエンコーダ10には、デジタル化された動画像データが入力される。入力された動画像データは、ピクチャ単位で画像並べ替え部11に入力される。
画像並べ替え部11は、表示時間に従って並べられたピクチャ順序を、符号化する順序に並べ替える。例えば、I0→B1→B2→P3→B4→B5→P6→B7→・・・という画像順序で入力された動画像を、I0→P3→B1→B2→P6→B4→B5→P9→B7→・・・といったような符号化を行う画像順序に並べ替えを行う。なお、I、P、Bは、ピクチャの符号化方法の種別、その下付け添え字は、画像の入力順序を示している。並べ替えをされた画像データは、動き補償の画素単位であるマクロブロック(例えば輝度16×16画素,色差8×8画素)単位で、動き検出部12、差分検出部13及び視覚パラメータ検出部18に送られる。
動き検出部12は、動きベクトルを各マクロブロックに対して検出する。また、動き検出部12では、参照方向を示す情報等の動き補償に関連する情報も生成し、動きベクトルとともに出力する。検出された動きベクトル及び関連情報は、動き補償部25及びVLC部16に送られる。
差分検出部13には、符号化順序にピクチャの並べ替えがされた動画像データが、マクロブロック単位で入力される。それとともに、差分検出部13には、逆量子化部21,IDCT演算部22,加算器23,フレームメモリ24,動き補償部25,スイッチ26によって、局部復号処理がされることによって生成された予測画像データが、マクロブロック単位で入力される。
差分検出部13は、イントラ予測パス31と、インター予測パス32と、これらの一方のパスを選択するスイッチ33とから構成されている。イントラ予測パス31では、入力されたマクロブロックに対して何ら処理を行わず、データを通過させる。インター予測パス32では、減算器34によって、マクロブロック単位の入力画像データから、参照画像に対して動き補償がされたマクロブロック単位の予測画像データを減算する。スイッチ34は、そのマクロブロックがイントラマクロブロックであればイントラ予測パス31を選択してマクロブロック単位の画像データを出力し、インターマクロブロックであればインター予測パス32を選択してマクロブロック単位の画像データを出力する。減算処理部16によって処理がされたマクロブロックは、DCT演算部14に供給される。
DCT演算部14は、入力されたマクロブロック単位の動画像データに対して、2次元の離散コサイン変換(DCT)を施して直交変換し、空間領域の動画像データを周波数領域の動画像データ(DCT係数)に変換する。DCT変換された動画像データは、量子化部15に供給される。
量子化部15は、DCT係数を量子化スケールと呼ぶ値で除算することにより、DCT係数の量子化を行う。量子化スケールは、符号量制御部20によりその値が増減される。量子化スケールが大きくなれば量子化後の値が少なくなり、量子化スケールが小さくなれば量子化後の値が大きくなる。従って、符号量制御部20により量子化スケールを増減する制御を行うことによって、出力する符号化ストリームのビットレートを制御することができる。さらに、量子化部15は、マクロブロック毎に量子化したDCT係数を、直流成分のデータから高域成分方向へスキャンをして、1次元のデータストリームとする。量子化部15により量子化されたデータは、VLC部16に送られる。
VLC部16は、量子化された画像データ(DCT係数)を可変長符号化して、係数0のランレングスとそれに続く非0係数の値の組に、データを符号化する。さらに、VLC部16は、画像データ(DCT係数)とともに、動きベクトル等の各種MPEGのシステムデータが入力され、これらのデータをMPEGフォーマットに従って多重化し、MPEGビデオストリームを生成する。生成されたMPEGビデオストリームは、送信バッファ17に格納される。
送信バッファ17は、生成したMPEGビデオストリームを格納し、後段の伝送路符号化やMPEG多重化装置等に読み出されるまで、その格納したMPEGビデオストリームを格納する。
視覚パラメータ検出部18は、その画像の符号化の難易度を示すパラメータをピクチャ毎に検出する。例えば、視覚パラメータ検出部18は、Iピクチャに対してはピクチャ内のアクティビティを算出し、B,Pピクチャに対してはBD(Block Difference)値又はBD値の分散値を算出し、これらの値を符号化の難易度を示すパラメータとして出力する。
符号量制御部20は、量子化部15の量子化スケールの値をコントロールして、送信バッファ17から出力されるMPEG-2ビデオストリームの発生符号量の制御、すなわち、ビットレート制御を行う。
符号量制御部20は、具体的には、各ピクチャに割り当てる符号量を算出し、その割り当て符号量に基づきピクチャ毎に量子化スケールを出力する。すなわち、1つのピクチャ内の同一種類のマクロブロックでは、量子スケールが変更せずに量子化処理が行われることとなる。また、符号量制御部20は、送信バッファ17から出力されるMPEG-2データストリームのビットレートが変動するように符号量を制御する方式(VBR(Variable Bit Rate)制御)、又は、送信バッファ17から出力されるMPEG-2データストリームのビットレートが一定であるように符号量を制御する方式(CBR(Constant Bit Rate)制御)のいずれか一方の符号量制御方式を選択し、選択した符号量制御方式に基づき各ピクチャの発生符号量を算出している。
逆量子化部21,IDCT演算部22,加算器23,フレームメモリ24,動き補償部25及びスイッチ26は、参照画像を生成するための局部復号器として機能している。
逆量子化部21は、量子化部15から出力される動画像データ(DCT係数)のうち、Iピクチャ又はPピクチャを構成するデータのみをマクロブロック単位で抽出する。Iピクチャ又はPピクチャを構成するデータのみを抽出するのは、参照画像となるのがIピクチャ又はPピクチャのみだからである。逆量子化部21は、量子化部15によって行われたスキャン方式に応じて、1次元のデータストリームを2次元のマクロブロック単位のデータに変換する。さらに、逆量子化部21は、量子化部15で用いられた量子化スケールを用いて逆量子化処理を行う。逆量子化処理がされた動画像データ(DCT係数)は、IDCT演算部22に供給される。
IDCT演算部22は、入力された動画像データ(DCT係数)に対して、2次元の逆離散コサイン変換(DCT)を施して、周波数領域の動画像データ(DCT係数)を逆直交変換し、空間領域の動画像データに変換する。空間領域のデータとされた動画像データは、加算器23に供給される。
加算器23には、IDCT演算部22からの動画像データと、動き補償部25により動き補償がされた予測画像データがそれぞれマクロブロック単位で入力され、それらを加算して参照画像データを生成する。なお、ここで、予測画像データとして加算器23に供給されるマクロブロックは、IDCT演算部22から出力されるPピクチャの参照画像とされたI又はPピクチャを構成しているマクロブロックである。また、IDCT演算部22から入力されるマクロブロックが、イントラマクロブロックである場合には、スイッチ26がオープンとなり、加算器23に予測画像データが入力されない。つまり、IDCT演算部22から入力されるマクロブロックが、予測がされたマクロブロックである場合のみ、予測画像データが加算器23に入力される。加算器23から出力された参照画像データ(I又はPピクチャ)は、フレームメモリ24に格納される。
フレームメモリ24は、過去参照画像及び未来参照画像を格納する。フレームメモリ24は、新たなIピクチャ又はPピクチャが加算器23から入力される毎に、格納する画像を更新する。
動き補償部25は、フレームメモリ24に格納されている参照画像に対して、動きベクトルを用いて動き補償をし、予測画像をマクロブロック単位で生成する。予測画像データは、差分検出部13及び加算器23に供給される。
以上のようなMPEGエンコーダ10では、入力された動画像データをMPEG-2方式で圧縮符号化し、MPEG-2データストリームを生成することができる。
符号量制御部の処理
以下、符号量制御部20の処理内容についてさらに詳細に説明する。
(全体フロー)
図2に、符号量制御部20による処理の全体処理フローを示す。
符号量制御部20は、ステップST1で、1枚のピクチャに対するビット割り当て処理を行う。すなわち、ある1枚のピクチャに対してどれだけの符号量を割り当てるかを決定する。このステップST1で決定される1枚のピクチャに対して割り当てる符号量のことを、以下、割当符号量という。続いて、ステップST2において、符号量制御部20は、ステップST1で決定した割当符号量に基づき、そのピクチャ内の最初のマクロブロック(MB)に対する量子化スケールを決定する。続いて、ステップST3において、ピクチャの最後のMBであるか否かを判断し、最後のMBでない場合にはステップST2に戻り次のMBに対して量子化スケールを決定し、最後のMBである場合には、ステップST4に進む。
ステップST3で最後のMBであると判断されたら、ステップST4において、その動画像信号の最後のピクチャであるか否かを判断する。最後のピクチャでなければステップST1に戻り、次のピクチャに対してステップST1からステップST3までの処理を繰り返し行う。そして、最後のピクチャであれば、制御処理を終了する。
以上のようにMPEGエンコーダ10では、1ピクチャ毎に割当符号量を決定し、決定した割当符号量に基づき量子化スケールを制御している。このことにより、ピクチャの途中で急激に量子化スケールが変動することがなくなる。
(ビット割り当て処理)
次に、ステップST1における任意のピクチャに対するビット割り当て処理について詳細に説明をする。
符号量制御部20は、図3に示すステップST5〜ステップST11の処理を行うことによって、任意の1枚のピクチャに対する割当符号量を決定する。
まず、ステップST5において、符号対象となっているピクチャの1ピクチャ前のピクチャの実際の符号発生量を、送信バッファ17のバッファ量を参照して検出する。
続いて、ステップST6において、符号化対象となっているピクチャに対して割り当てが可能な最大の符号量(最大割当符号量Pmax)をVBVバッファの使用量を考慮して計算する。なお、最大割当符号量Pmaxの計算方法等については、その詳細を後述する。
続いて、ステップST7において、CBR制御を行った場合の符号化対象のピクチャに対する割当符号量(元CBR割当符号量(tbit_CBR_org))を計算する。元CBR割当符号量(tbit_CBR_org)の計算には、例えば、TM5のSTEP1におけるアルゴリズム等を用いる。続いて、ステップST8において、ステップST7で算出した元CBR割当符号量(tbit_CBR_org)の上限値を、ステップST6で算出した最大割当符号量Pmaxで制限した割当符号量(CBR割当符号量(tbit_CBR))を算出する。
すなわち、CBR割当符号量(tbit_CBR)は、元CBR割当符号量(tbit_CBR_org)が最大割当符号量Pmaxより大きい場合には、その値が最大割当符号量Pmaxと同一となり、元CBR割当符号量(tbit_CBR_org)が最大割当符号量Pmax以下である場合には、その値が元CBR割当符号量(tbit_CBR_org)と同一となる。
続いて、ステップST9において、VBR制御を行った場合の符号化対象のピクチャに対する割当符号量(元VBR割当符号量(tbit_VBR_org))を計算する。元VBR割当符号量(tbit_VBR_org)の計算には、視覚パラメータ18により検出されたそのピクチャの符号化の難易度を示すパラメータに基づき算出を行う。なお、VBR制御を行った場合の符号化対象のピクチャに対する割当符号量の具体的な算出方法については、その詳細を後述する。
続いて、ステップST10において、ステップST9で算出した元VBR割当符号量(tbit_VBR _org)の上限値を、ステップST6で算出した最大割当符号量Pmaxで制限した割当符号量(VBR割当符号量(tbit_ VBR))を算出する。すなわち、VBR割当符号量(tbit_VBR)は、元VBR割当符号量(tbit_VBR_org)が最大割当符号量Pmaxより大きい場合には、その値が最大割当符号量Pmaxと同一となり、元VBR割当符号量(tbit_VBR_org)が最大割当符号量Pmax以下である場合には、その値が元VBR割当符号量(tbit_VBR_org)と同一となる。
続いて、ステップST11において、ステップST8で算出したCBR割当符号量(tbit_ CBR)、又は、ステップST10で算出したVBR割当符号量(tbit_ VBR)のうちいずれか一方を選択し、選択した割当符号量(tbit)を出力する。すなわち、CBR制御とVBR制御の切り換えを行っている。なお、ステップST11における選択処理については、その詳細を後述する。
ステップST11での処理を終えると、1枚のピクチャに対するビット割当処理が完了する。
最大割当符号量P max
つぎに、ステップST6の最大割当符号量Pmaxの計算方法について説明をする。
最大割当符号量Pmaxは、割当符号量がこの値よりも大きくなると、VBVバッファがオーバーフローする可能性が非常に高くなる、というピクチャに対する割当符号量の上限値を規定する値である。最大割当符号量Pmaxを割当符号量の上限リミットとすることにより、符号量制御部20は、VBVバッファをオーバーフローさせないような量子化スケールの制御、すなわち、ビットレート制御を行うことができる。
最大割当符号量Pmaxは、VBVバッファの使用量に基づき、次のように算出される。
VBVバッファは、エンコーダ側で仮想されたデコーダの入力バッファの仮想モデルである。エンコーダは、VBVバッファの使用量(ビット占有量)を仮想し、その使用量を一定の範囲(0から所定の正の値)内で維持しながらストリームを生成することによって、復号時に破綻しないようなストリームを保障をしている。VBVバッファについては、ISO13818-2 Annex Cに説明されており、デコーダ側での制約を規定しているが、ここでは、エンコーダ側に置き換えて説明する。すなわち、エンコーダの出力段にVBVバッファが設けられているものとして説明をする。また、VBVバッファに対する制約に関しては、通常、MPEG-2ストリーム一般について述べられるが、ここでは、MPEG-2ストリームをDVDフォーマットに適用した場合について説明する。
なお、以下の説明で用いる変数及び定数について、次のように定義するものとする。
T=ピクチャの発生周期。すなわち、フレームレートの逆数。
n=任意のピクチャのピクチャ番号。各ピクチャは、ピクチャ番号順に並んで符号化がされている。nは整数である。
PX=X番目のピクチャの実際の符号発生量(Xは整数)。従って、Pnは、n番目に符号化されたピクチャの符号発生量となる。
BX=X番目のピクチャの符号化直前のVBVバッファの使用量。従って、Bnは、n番目のピクチャの符号化直前のVBVバッファの使用量となる。
Bmax=VBVバッファの使用量の最大値。すなわち、VBVバッファの容量。
(1) まず、DVDフォーマットにMPEG-2を適用した場合、図4に示すように、エンコーダとVBVバッファとの関係は、「エンコーダから出力されたMPEG-2ストリームは瞬時にVBVバッファに転送される」、「VBVバッファからはビットレートRmaxでMPEG-2データストリームは出力されるが、VBVバッファが空の場合にはビットレートは0となる」といった関係となる。
(2) VBVバッファの使用量(ビット占有量)の変動について説明をする。図5にVBVバッファの使用量の推移の一例を示す。図5の縦軸はVBVバッファの使用量、図5の横軸は時間を表している。
エンコーダは、入力された動画像信号をピクチャ番号の順(0,1,2,3,4,…,(n-1),n,…)に従って符号化する。
0番目のピクチャが符号化された直後(時刻0)、VBVバッファに符号量P0が瞬時に転送され、VBVバッファの使用量がB0+P0となる。続いて、次の1番目のピクチャの符号化が終了するまでの間は、VBVバッファからレートRmaxで符号の送出が行われて、VBVバッファ中の使用量が時間とともに減少していく。
1番目のピクチャが符号化される直前(時刻T)となると、VBVバッファの使用量がB1となり、そこに符号量P1の1番目のピクチャが瞬時に転送される。この結果、時刻Tでは、VBVバッファの使用量がB1+P1となる。
以下、同様にVBVバッファからの転送と、符号化されたピクチャの符号のVBVバッファへの格納とが続き、n番目のピクチャが符号化される直前(時刻n×T)となると、VBVバッファの使用量がBn(=Bn−1+Pn−1)となり、そこに符号量Pnのn番目のピクチャが瞬時に転送される。この結果、時刻n×Tでは、VBVバッファの使用量がBn+Pnとなる。
ここで、符号の送出量が送入量を上回ると、時刻Txに示されるようにVBVバッファの使用量が0になり、VBVバッファからのデータの送出が行われなくなる。DVDフォーマットの場合、このようにエンコーダ側でバッファのアンダーフローが発生することは許容される。
しかしながら、DVDフォーマットであっても、VBVバッファのオーバーフローは許容されていない。
そこで、符号量制御部20では、X番目のピクチャを符号化する直前のVBVバッファの使用量(BX)に基づき、X番目のピクチャを符号化した後のVBVバッファの許容最大値を定める関数を設定しておく。すなわち、この値よりもVBVバッファの使用量が大きくなると、VBVバッファがオーバーフローする可能性が非常に高くなる、という使用量を、符号化する直前のVBVバッファの使用量を変数として求める関数を設定しておく。そして、符号量制御部20では、この関数に基づき決定された許容最大値を、X番目のピクチャの符号量を決定する量子化スケールに反映させ、ビットレート制御を行っている。
このように符号量制御部20では、VBVバッファがオーバーフローする可能性が高いか否かをピクチャを符号化する前に予め決定し、可能性が高ければそのピクチャの量子化スケールを大きくするといったようにフィードフォワード制御を行う。このことによって、より早いタイミングでVBVバッファの使用量をビットレートに反映させることができ、この結果、急峻な画像劣化を抑制することができる。
以下、このような関数のことをVBV関数といい、VBV()として表すものとする。なお、VBV()の()内には変数が入る。
(3)つぎに、VBV関数の条件について説明をする。
X番目のピクチャを符号化する前のVBVバッファの使用量をBXとし、X番目のピクチャを符号化した後のVBVバッファの許容最大値をBYとしたとき、BXとBYとの関係は、VBV関数“VBV()”を用いて次の式(1)に示すように表す。
BY=VBV(BX) …(1)
ここで、VBV関数は、次のような特徴を有する関数である。
特徴1:By=VBV(Bx)は、Bxの区間[0,Bmax]で、Bxに対する単調増加関数である。
特徴2:関数{By=Bx}と関数{By=VBV(Bx)−(Rmax×T)}とは、Bxの区間[0,Bmax]ではBx=Bth(ただし、0<Bth<Bmax)で交わる。
特徴3:Bx≦Bthである場合には{VBV(Bx)−(Rmax×T)}≧Bxであり、Bx>Bthである場合には{VBV(Bx)−(Rmax×T)}<Bxである。
図6に、以上のような3つの特徴を有するVBV関数の一例を示す。この図6に示すVBV関数は、BXが[0,Bth]の区間ではByが所定の値(Bth以上の値)で一定となっており、BXが[Bth,Bmax]の区間ではByが増加率1未満の割合で徐々に増加している。
(4)つぎに、VBV関数を用いた最大割当符号量Pmaxの算出方法について、図7のフローチャートを参照して説明をする。
なお、ここでは、現在のピクチャ{(n−1)番目のピクチャ}の符号化直後のタイミング(時刻(n−1)×T)で、次のピクチャ{n番目のピクチャ}に対する最大割当符号量Pmaxを算出する手法を示す。
まず、ステップST16において、次ピクチャ(n番目のピクチャ)の符号化直前のVBVバッファの使用量Bnを算出する。使用量Bnは、現在のピクチャ{(n−1)番目のピクチャ}の符号化直前のVBVバッファの使用量Bn−1、現在のピクチャ{(n−1)番目のピクチャ}の実際の発生符号量Pn−1、及び、転送レートRmaxに基づき次の式に基づき算出することができる。
Bn=Pn−1+Bn−1−(Rmax×T)
続いて、ステップST17において、ステップST16で算出したVBVバッファの使用量Bnが、計算上でマイナスの値となっているか否かを判断し、計算上マイナスの値となっていればステップST18においてBn=0として次のステップST19に進み、そうでなければそのまま次のステップST19に進む。
続いて、ステップST19において、次ピクチャ(n番目のピクチャ)の符号化直前のVBVバッファの使用量Bnを、VBV関数の変数に代入して、次ピクチャを符号化した後のVBVバッファの許容最大値(VBV(Bn))を算出する。
続いて、ステップST20において、VBV(Bn)からBnを減算して、次ピクチャに対する最大割当符号量Pmaxを算出する。
続いて、ステップST21において、ステップST20で算出した最大割当符号量Pmaxから、現在のピクチャでの超過符号量を減算し、その減算値を再度最大割当符号量Pmaxに代入する。
このステップST21での処理は、現在のピクチャ((n−1)番目のピクチャ)に対しても前回の処理ルーチンにおいて最大割当符号量Pmaxが求められているが、現時点(時刻(n−1)×T)では、その現在のピクチャを実際に符号化して発生した符号量(Pn−1)もすでにわかっている。ここで、実際に現在のピクチャを符号化したところ、符号量(Pn−1)が、現在のピクチャの最大割当符号量Pmaxより大きくなってしまう、という可能性もある。このような場合、符号量(Pn−1)から現在のピクチャの最大割当符号量Pmaxを減算した値を超過符号量として記憶しておき、ステップST21の処理においてその超過符号量分次ピクチャの最大割当符号量Pmaxに対して補正を加えるようにしている。
続いて、ステップST22では、ステップST21で超過符号量の補正がされた最大割当符号量Pmaxが計算上でマイナスの値となっているか否かを判断し、計算上マイナスの値となっていればステップST23においてPmax=0とする。そうでなければそのまま処理を進める。なお、Pmax=0になった場合には、次ピクチャに対して割り当てられる符号量が無いということを意味するが、実際には量子化部に対して最も大きい量子化スケールが与えられることとなる。
以上の処理を終えると最大割当符号量Pmaxが算出される。算出された最大割当符号量Pmaxは、図3のステップST6に引き渡される。
(5)つぎに、図6に示したVBV関数を用いた場合におけるVBVバッファの使用量の推移について説明し、ピクチャに対する割当符号量の上限値を最大割当符号量Pmaxとするとによって、VBVバッファがオーバーフローしにくくなることを証明する。
まず、Bx≦Bthの範囲でVBVバッファを使用した場合について、図8、図9及び図10を参照して説明をする。
図8に示すように、n−1番目のピクチャの符号化直前のVBVバッファの使用量がBx=Bn−1であるとき、VBV関数で指定する許容最大値までVBVバッファが使用されるようにn−1番目のピクチャを符号化すると、符号化直後のVBVバッファ使用量はBy=Vn−1になる(図8中矢印A1)。ここで、図8中Pn−1は、図示してあるとおりVn−1とBn−1との差であるので符号化したn−1番目のピクチャの符号量である。
この後、n番目のピクチャの符号化までにレートRmaxで転送が行われ、その結果、VBVバッファ使用量は、“By=Vn−1−Rmax・T”となる(図8中矢印A2)。この値は、n番目のピクチャの符号化直前のVBVバッファ使用量である。従って、By=Bxの直線で折り返し(図8中矢印A3,A4)、n番目のピクチャの符号化直前のVBVバッファ使用量をBnとする。ここで、Bx≦Bthの範囲でVBVバッファを使用した場合、VBV関数の特徴(特徴3参照。)より、必ず、Bnは、Bn−1以上の値となる。
同様に、VBV関数で指定する許容最大値までVBVバッファが使用されるようにn番目のピクチャを符号化すると、n番目のピクチャの符号化直後のVBVバッファ使用量はBy=Vnになり(図8中矢印A5)、n番目のピクチャの符号量はPnとなる。
Pn−1とPnとの間には、図8から、Pn−1≧Pnの関係があり、VBVバッファ使用量は、Vn=Vn−1であるので、VBVバッファ使用量は1ピクチャ前と変化しないことがわかる。
さらに、これを繰り返していくと、VBVバッファ使用量がBx=Bthを目指して動いていくことがわかる。つまり、Bx≦Bthの範囲でVBVバッファを使用した場合、VBV関数により指定する符号量まで使ってピクチャを符号化してもVBVバッファのオーバーフローは発生しないことがわかる。
また、図9に示すように、VBV関数で指定する許容最大値までVBVバッファが使用されない場合には、図9中の矢印A1〜A5の動きによってBxの値が減少する方向に動く。従って、これを繰り返していくと、VBVバッファ使用量がBx=0を目指して動いていくことがわかる。つまり、Bx≦Bthの範囲でVBVバッファを使用した場合、VBV関数により指定する符号量まで使わずにピクチャを符号化してもVBVバッファのオーバーフローは発生しないことがわかる。
図10に示すように、n−1番目のピクチャの符号化直前のVBVバッファの使用量がBx=Bn−1であるときに、n−1番目のピクチャをVBV関数で指定する許容最大値を目標に符号化した結果(図10中矢印A1)、符号化直後のVBVバッファ使用量が許容最大値からΔ1だけ超過してVn−1になったとする。
この後、n番目のピクチャの符号化までにレートRmaxで転送が行われ、その結果、VBVバッファ使用量は、“By=Vn−1−Rmax・T”となる(図10中矢印A2)。また、この値(By=Vn−1−Rmax・T)は、n番目のピクチャの符号化直前のVBVバッファ使用量である。従って、n番目のピクチャの符号化直前のVBVバッファ使用量を、By=Bxの直線で折り返して(図10中矢印A3,A4)、Bnとする。ここで、Bx≦Bthの範囲でVBVバッファを使用した場合、VBV関数の特徴(特徴3参照。)より、必ず、Bnは、Bn−1以上の値となる。
続いて、n番目のピクチャの符号化直前のVBVバッファの使用量がBx=Bnであるときに、n番目のピクチャは、VBV関数の許容最大値から超過符号量Δ1だけ小さい値を目標に符号化される(図10中矢印A5)。図8の場合と比較すると、n番目のピクチャの符号化前のVBVバッファ使用量がΔ2だけ増えてしまっているが、一方で、符号化した後のVBVバッファ使用量がΔ1だけ減少している。そのため、Δ1とΔ2とがほぼ等しければ、符号量としてはn−1番目のピクチャの超過分を次のn番目のピクチャの減少分によってほぼ差し引き0とすることができることとなり、VBVバッファがオーバーフローしにくいことがわかる。
続いて、Bx>Bthの範囲でVBVバッファを使用した場合について、図11、図12及び図13を参照して説明をする。
図11に示すように、n−1番目のピクチャの符号化直前のVBVバッファの使用量がBx=Bn−1であるときに、VBV関数で指定する許容最大値までVBVバッファが使用されるようにn−1番目のピクチャを符号化すると、符号化直後のVBVバッファ使用量はBy=Vn−1になる(図11中矢印A1)。ここで、図11中Pn−1は、図示してあるとおりVn−1とBn−1との差であるので符号化したn−1番目のピクチャの符号量である。
この後、n番目のピクチャの符号化までにレートRmaxで転送が行われ、その結果、VBVバッファ使用量は、“By=Vn−1−Rmax・T”となる(図11中矢印A2)。また、この値(By=Vn−1−Rmax・T)は、n番目のピクチャの符号化直前のVBVバッファ使用量である。従って、n番目のピクチャの符号化直前のVBVバッファ使用量を、By=Bxの直線で折り返して(図11中矢印A3,A4)、Bnとする。ここで、Bx>Bthの範囲でVBVバッファを使用した場合、VBV関数の特徴(特徴3参照。)より、必ず、Bnは、Bn−1以下の値となる。
同様に、VBV関数で指定する許容最大値までVBVバッファが使用されるようにn番目のピクチャを符号化すると、n番目のピクチャの符号化直後のVBVバッファ使用量はBy=Vnになり(図11中矢印A5)、n番目のピクチャの符号量はPnとなる。
Pn−1とPnとの間には、図11から、Pn−1<Pnの関係があり、VBVバッファ使用量は、Vn>Vn−1であるので、VBVバッファ使用量は1ピクチャ前から減少することがわかる。
さらに、これを繰り返していくと、VBVバッファ使用量がBx=Bthを目指して動いていくことがわかる。つまり、VBV関数により指定する符号量まで使ってピクチャを符号化してもVBVバッファのオーバーフローは発生しないことがわかる。
また、図12に示すように、VBV関数で指定する許容最大値までVBVバッファが使用されない場合には、図12中の矢印A1〜A5の動きによってBxの値が減少する方向に動く。従って、これを繰り返していくと、VBVバッファ使用量がBx=Bthを目指して動いていくことがわかる。つまり、Bx>Bthの範囲でVBVバッファを使用した場合、VBV関数により指定する符号量まで使わずにピクチャを符号化してもVBVバッファのオーバーフローは発生しないことがわかる。
図13に示すように、n−1番目のピクチャの符号化直前のVBVバッファの使用量がBx=Bn−1であるときに、n−1番目のピクチャをVBV関数の許容最大値を目標に符号化した結果(図13中矢印A1)、符号化直後のVBVバッファ使用量が許容最大値からΔ1だけ超過してVn−1になったとする。
この後、n番目のピクチャの符号化までにレートRmaxで転送が行われ、その結果、VBVバッファ使用量は、“By=Vn−1−Rmax・T”となる(図13中矢印A2)。また、この値(By=Vn−1−Rmax・T)は、n番目のピクチャの符号化直前のVBVバッファ使用量である。従って、n番目のピクチャの符号化直前のVBVバッファ使用量を、By=Bxの直線で折り返して(図13中矢印A3,A4)、Bnとする。ここで、Bx>Bthの範囲でVBVバッファを使用した場合、VBV関数の特徴(特徴3参照。)より、必ず、Bnは、Bn−1以下の値となる。
続いて、n番目のピクチャの符号化直前のVBVバッファの使用量がBx=Bnであるときに、n番目のピクチャは、VBV関数の許容最大値から超過符号量Δ1だけ小さい値を目標に符号化される(図13中矢印A5)。図11の場合と比較すると、n番目のピクチャの符号化前のVBVバッファ使用量がΔ2だけ増えてしまっているが、一方で、符号化した後のVBVバッファ使用量がΔ1だけ減少している。そのため、Δ1とΔ2とがほぼ等しければ、符号量としてはn−1番目のピクチャの超過分を次のn番目のピクチャの減少分によってほぼ差し引き0とすることができることとなり、VBVバッファがオーバーフローしにくいことがわかる。
(6)MPEGエンコーダ10では、以上のようにVBV関数を用いて最大割当符号量Pmaxを算出し、最大割当符号量Pmaxを各ピクチャに対する割当符号量の上限値とすることで、VBVバッファをオーバフローさせずに、最適な量子化スケールの算出制御、すなわち、ビットレート制御を行うことができる。
CBR又はVBRの選択
つぎに、CBR制御又はVBR制御の選択処理について説明をする。
符号量制御部20では、上述したステップST11において、CBR制御に基づくアルゴリズムで算出された割当符号量(tbit_ CBR)又はVBR制御に基づくアルゴリズムで算出された割当符号量(tbit_ VBR)のいずれか一方を選択する処理を行っている。
符号量制御部20では、CBR制御を行った場合の1つのピクチャに対する割当符号量の算出方法として、例えば、TM5のSTEP1におけるアルゴリズム等を用いている。
一方、符号量制御部20では、VBR制御を行った場合のピクチャの割当符号量の算出方法として、符号化前のピクチャから求めた、そのピクチャの符号化の難易度を示すパラメータに基づき算出を行っている。具体的には、Iピクチャであれば、画面のアクティビティを符号化の難易度を示すパラメータとして用いる。アクティビティが大きければ、そのピクチャには符号量を大きく割り当て、アクティビティが小さければそのピクチャには少ない符号量を割り当てる、といったアクティビティに対する単調増加関数を用いて割当符号量を算出する。また、B,Pピクチャであれば、BD値やBD値の分散を符号化の難易度を示すパラメータとして用いる。BD値が大きければ、そのピクチャには符号量を大きく割り当て、BD値が小さければそのピクチャには少ない符号量を割り当てる、といったBD値に対する単調増加関数を用いて割当符号量を算出する。
このようにVBR制御を行う場合には、符号化前の画面の特徴から符号化の難易度を検出して、その難易度に基づき可変ビットレート制御が行われる。この結果、符号量が必要とされるピクチャに対しては符号量を多く、符号量が少なくてもよい画質が得られるピクチャに対しては符号量を少なく割り当てることができ、非常に効率的なビットレート制御が可能となる。さらに、フィードフォワード制御によるレートコントロールが行われるので、符号量が大量に必要となるピクチャが突然入力されても、そのピクチャに対して充分に符号量を割り当てることができ、そのため、シーンチェンジ時にも画質の劣化が生じづらい。
CBR制御又はVBR制御の選択処理フローについて、図14を参照して説明をする。
図14に示す選択処理フローは、ステップST11のサブルーチンとして機能する。従って、図14に示す選択処理フローは、1ピクチャ毎に行われることとなる。
まず、ステップST31において、そのピクチャがGOPの先頭のピクチャであるか否かを判断する。判断した結果、そのピクチャがGOPの先頭であれば、ステップST32に進んでVBRフラグを偽(VBR_Flag=False)に設定し、ステップST33に進む。判断した結果、そのピクチャがGOPの先頭でなければ、そのままステップST33に進む。
続いて、ステップST33において、VBRフラグが真(VBR_Flag=True)であるか否かを判断する。判断した結果、VBRフラグが真(VBR_Flag=True)であればステップST35に進み、VBRフラグが偽(VBR_Flag=False)であればステップST34に進む。続いて、ステップST34において、BD値が第1の閾値よりも大きく且つBD値の分散が第2の閾値よりも大きいか、否かを判断する。つまり、そのピクチャの符号化の難易度を判断する。BD値が第1の閾値よりも大きく且つBD値の分散が第2の閾値よりも大きい場合(つまり、ピクチャの符号化の難易度が高い場合)にはステップST35に進み、それ以外の場合(つまり、ピクチャの符号化の難易度が高くない場合)にはステップST36に進む。
ステップST35では、VBRフラグを真(VBR_Flag=True)に設定し、ステップST37に進む。
ステップST36では、そのピクチャをCBR制御で符号化した場合の割当符号量(CBR割当符号量:tbit_CBR)と、そのピクチャをVBR制御で符号化した場合の割当符号量(VBR割当符号量:tbit_VBR)とを比較する。比較した結果、VBR制御で符号化した場合の割当符号量の方が小さい場合にはステップST37に進み、CBR制御で符号化した場合の割当符号量の方が小さい場合にはステップST38に進む。
そして、ステップST37では、そのピクチャに対してVBR制御での符号割り当てを選択し、ステップST38では、そのピクチャに対してCBR制御での符号割り当てを選択する。ステップST37又はステップST38の処理を終了すると、そのピクチャに対する選択処理フローが終了する。
以上のようにMPEGエンコーダ10では、では、CBR制御又はVBR制御の選択をピクチャ毎に行っている。また、MPEGエンコーダ10では、符号化前の信号から求められたそのピクチャの符号化の難易度(例えば、BD値、BD値の分散)を参照し、その難易度が高ければVBR制御を行い、低ければCBR制御を行うようにしている。また、難易度が低い場合であっても、VBR制御の割当符号量の方がCBR制御の割当符号量の方が小さければ、VBR制御を行う。
さらに、上記のフローにおけるVBRフラグ(VBR_Flag)は、過去のピクチャの符号化の際に、符号化の難易度が高いためVBR制御を選択したことを示すフラグであり、符号量制御部20では、VBRフラグ(VBR_Flag)が真(True)となった場合には、そのGOP内の以後のピクチャへの符号割り当てを強制的にVBR制御に設定をしている。
これは、一度でもVBR制御が入ると、ピクチャの発生符号量がCBR制御の場合よりも極端に大きくなることがあり、GOP全体での発生符号量を一定にするCBR制御にとっては以後のピクチャに対して割り当てる符号の絶対量が不足し、符号の割り当てができなくなってしまうことがある。このため、一度でも、符号化の難易度が高いためVBR制御を選択した場合には、GOP内の以後のピクチャに対しては常にVBR制御を行うこととしている。
この理由を図15を参照してさらに説明する。
図15(A)は、CBR制御がGOPの終わりまで継続した場合を示したものであり、このGOPでは、当然であるが総符号量がCBR制御のGOPに対する総符号量とほぼ一致する。
図15(B)は、GOPの途中からVBR制御によって符号割り当てを増やしたい場合があるが、そのような制御を行うとこのGOPの総符号量がCBR制御を使った場合の総符号量よりも多くなる必要がある。例えばTM5で示されているCBR制御を例にとると、ピクチャの符号化結果によって次のピクチャへの符合割り当て量を調整しなおすというフィードバック制御を行うことでGOP全体で一定の符号量を使い切っている。従って図15(B)のようなケースで、GOP途中のピクチャでいったん符号量が増えた場合、以後のピクチャに対してCBR制御に復帰させる制御を行うと、GOPの残りの符号量が不足しピクチャへビット割り当てが行えなくなる可能性がある。具体的には、図15(B)は、GOPの総符号量をCBR制御のGOP総符号量と一致させるために、最後のピクチャへの符号割当量をマイナスにせざるを得ない、という状況を表している。ただ、実際にはマイナスの符号量は無いのでこのような符号割り当ては不可能である。
図15(C)では、このような状況に対処するために、GOPの途中で符号化の難易度に応じたVBR制御による符号割り当てが入ったときには、GOP中の以後のピクチャでCBR制御の枠をはずし、必ずVBR制御による符号割り当てを行うようにする。もっとも、図15(D)に示すように、CBR制御を行った場合よりも符号量が少ないためにVBR制御が選択された場合には、GOP内での符号量に自由度があるため、VBR制御の後にCBR制御が選択されてもよい。
続いて、CBR, VBR制御を適応的に切り替える様子を図16に示す。
図16(A)には、VBR制御による記録レートの時間推移(実線)及びCBR制御による記録レートの時間推移(点線)を示している。ここでのVBR制御(実線)は、符号化の難易度によって符号量が変化するタイプのもので、簡単な画像が来るとレートが下がり、難しい画像が来るとレートが上がっている様子を示している。これに対してCBR制御(点線)は、符号化の難易度に関わらず、一定のレートで符号化を行うことを示している。
図16(A)で示したレート制御の切り替えが行われた結果、本システムのレートがどのように選択されるかを示したものを図16(B)に示す。
区間Aでは、ピクチャの符号化が簡単であるとステップST34で判断されて、さらにST37で符号発生量がVBR制御がCBR制御を下回ると判断されたために、VBR制御が選択されていることを示している。区間Bでは、ピクチャの符号化が難しいとステップST34で判断されたため、VBR制御が選択されたことを表している。区間Cでは、ピクチャの符号化が簡単であるとステップST34で判断されて、さらにST37で符号発生量がCBR制御がVBR制御を下回ると判断されたために、CBR制御が選択されていることを示している。
以上のように、MPEGエンコーダ10では、符号化の簡単な区間でCBR制御より符号量が少なくなるならVBR制御を使用して符号発生量を軽減させるので、例えば有限の記録容量を持つ記録媒体への記録時間をできるだけ延ばすことができ、伝送容量を有効に活用することができる。また、MPEGエンコーダ10では、符号化の難しい区間ではVBR制御を用いて充分な符号量を割り当てて画質を上げることができる。また、MPEGエンコーダ10では、中程度の符号化難易度区間ではCBRを使うことで、おおよその平均的記録時間の目安を提供し、ユーザーの使い勝手も向上するようにしている。