まず、本発明の第1の実施の形態による符号化データ復号装置について図面を参照しつつ説明を行う。図1は、本発明の第1の実施の形態による符号化データ復号装置の一構成例を示す図である。図1に示すように、本実施の形態による符号化データ復号装置は、ヘッダを復号するヘッダ復号部11と、ヘッダに続くデータを復号する符号化データ復号部12と、ヘッダ復号部11でヘッダ中にエラーを検出した場合にヘッダを推定するヘッダ推定部13と、ヘッダ推定部13で決定されたビット数だけ符号化データを読み飛ばすヘッダ読み飛ばし部14と、を有している。このデータ復号装置は、ヘッダ復号部11でエラーが検知されない場合は、ヘッダ復号部11でヘッダを復号し符号化データ復号部12でヘッダに続くデータを復号する。ヘッダ復号部11は、復号したヘッダの情報をヘッダ推定部13に伝達する。ヘッダ復号部11でエラーが検出された場合には、ヘッダ推定部13においてヘッダを推定し、ヘッダの長さをヘッダ読み飛ばし部14に通知する。ヘッダ推定部13は、また、推定したヘッダの情報をヘッダ復号部11に伝える。ヘッダ読み飛ばし部14では、通知されたヘッダ長だけ符号化データを読み飛ばす。ヘッダ読み飛ばし部14は、ヘッダを読み飛ばすとヘッダ復号部11にヘッダを読み飛ばしたことを伝える。ヘッダ復号部11は、ヘッダをエラーなく復号した時点もしくはヘッダ読み飛ばし部14でヘッダを読み飛ばした時点で、符号化データ復号部12に対して、ヘッダの情報を伝える。このとき、ヘッダがエラーなく復号できた場合には復号したヘッダの情報を符号化データ復号部12に伝え、ヘッダの復号でエラーが生じてヘッダを推定した場合にはヘッダ推定部13から伝達されたヘッダの情報を符号化データ復号部12に伝える。符号化データ復号部12では、ヘッダ復号部11から伝達されたヘッダの情報を用いて読み飛ばされた後の符号化データを継続して復号する。
なお、第1の実施の形態は、エラーが検知された場合においてヘッダ全体を推定しヘッダ全体分のビット長の符号化データを読み飛ばす例である。ヘッダの所定の部分(一部分)だけを推定し所定の部分のみを読み飛ばす方法については第2の実施の形態で説明する。
図2は、本発明の第1の実施の形態による符号化データ復号方法を示すフローチャート図である。処理を開始すると(開始)、ステップS201では、入力したデータのヘッダを復号する。ステップS202では、ヘッダ復号においてエラーが検出されたか否かを判定する。エラーが検出されない場合には(N)、ステップS203に移行しヘッダに続くデータを復号する。エラーが検出された場合には(Y)、ステップS204に移行しヘッダを推定する。ステップS205では推定されたヘッダの長さ分だけ、符号化データを読み飛ばす。続いてS203に移行する。ステップS203では、エラーが検出されなかった場合と同様ヘッダに続くデータを復号する。
上記の場合の動作を、図3を参照して説明する。図3に示すように、符号化データは、同期ワード、ヘッダ情報、符号化データの繰り返しにより構成される。ここで、符号化データ中には図中×印の位置にエラーが存在する場合を仮定する。この場合、本実施の形態では、復号は(1)、(3)、(4)の順に進む。(1)では、ヘッダの復号を行うが途中のX点ではエラーを検出できずに復号を続ける。途中A点でエラーを検出し復号を停止する。この時点でヘッダを推定する。続く(3)では推定されたヘッダ長だけデータを読み飛ばす。続く(4)ではエラーになったヘッダの直後の符号化データから継続して復号を行う。図中実線の矢印(1)、(4)は復号を示し、点線の矢印(3)は読み飛ばしを意味する。
ヘッダ復号部11(図1)の動作の詳細を、MPEG−4ビデオ符号化データにおけるVOPヘッダの復号とVPヘッダの復号を例に説明する。VOPヘッダの構造を図12に示す。VOPヘッダの復号では、VOPスタートコードの確認の後、vop_coding_type、modulo_time_base、vop_time_increment、vop_coded、vop_codedがゼロの場合next_start_code、vop_rounding_type、complexity_estimation_header、intra_dc_vlc_thr、vop_quant、IVOP以外の場合vop_fcode_forward、next_start_codeの順に復号を行う。
ここで、vop_coding_typeはフレームのタイプを示し、modulo_time_baseと、vop_time_incrementは時間情報、vop_codedはフレームが符号化されているかどうか、next_start_codeは符号化データのアライメントを取るためのパディングデータ、vop_rounding_typeは予測画像の生成時の計算における丸めの方向、complexity_estimation_headerは各種情報、intra_dc_vlc_thrはどの符号表を用いるかを判定するための閾値、vop_quantは量子化係数、vop_fcode_forwardは動きベクトルの範囲を示す。各情報の詳細は、公知文献のISO/IEC 14496-2に記載されているのでここでは省略する。
復号時において、
・ vop_time_incrementがvop_time_increment_resolution以上である場合
・ vop_codedがゼロであるのに次にnext_start_codeが無い場合
・ vop_quantがゼロの場合
・ vop_fcode_forwardがゼロの場合
・ marker_bitがゼロの場合
・ next_start_codeが規格で規定されているビット列と異なる場合
は、規格上禁止されている場合である。よってこのような場合にはエラーが発生したと判定できる。
また符号化データが全ての値の範囲を使うことは少なく、ある一定の範囲の値を使うものと仮定できることもある。この場合には、復号された値が所定の範囲に入っているかどうかを基準にしてエラーを判定することができる。例えば、フレームの時間間隔を示すmodulo_time_baseは、実時間動作を必要とするテレビ電話や監視カメラでは2秒よりも大きい値を取ることはないと見做せることがある。この場合、復号された値をこの閾値(ここでは2秒)と比較することでエラーを検出できる。また、MPEG−4ビデオは、使用可能な機能をプロファイルという形で示しており、示されたプロファイルによって使用できる機能が制限される。プロファイルの1つであるシンプルプロファイルでは、vop_coding_typeがIフレーム(フレーム内符号化フレーム)もしくはPフレーム(片方向予測フレーム)に制限されているので、シンプルプロファイルという条件で符号化されている場合にIフレームやPフレーム以外が復号された場合もエラーと検出できる。
VPヘッダの復号では、VPスタートコードの確認の後、macroblock_number(マクロブロック番号)、quant_scale、header_extention_code(以後HECと呼ぶ)を復号する。ここでHECが1の場合にはヘッダ拡張情報があるので、続いてmodulo_time_base、vop_time_increment、vop_coding_type、intra_dc_vlc_thr、vop_fcode_forwardを復号する。これらのヘッダ拡張の値は、VOPヘッダにおいて既に符号化されているものを再度符号化したものであるので、VOPヘッダの復号において既に値が得られている。なお、macroblock_numberはパケットに格納されているマクロブロックデータの先頭マクロブロック番号、quant_scaleは量子化係数、header_extention_codeは、ヘッダ拡張情報の有無を示す。各情報の詳細は、公知文献であるISO/IEC 14496-2に記載されているのでここでは省略する。
VPヘッダの復号においては、ヘッダを復号して得られたマクロブロック番号が、画像の大きさで決まる範囲を超えている場合にはエラーであると判断できる。さらに、マクロブロック番号が、直前までに復号したマクロブロック数+1ではない場合にもヘッダにエラーがあったものと判定することができる(VPヘッダではなくマクロブック層でエラーが発生した可能性もあるが、本実施例ではヘッダにエラーがあったものと判定する)。またHECが1の場合は、VOPヘッダの復号で得られている値と、今回VPヘッダの復号で得られた値とを比較する。VOPヘッダで復号された値とVPヘッダで復号された値とが異なる場合にはVPヘッダにエラーがあったものと判定する。このように同じ値が複数回伝送される場合には、前回復号した値を記録しておき、今回復号した値と比較することでエラーを検出することができる。
続いて、ヘッダ推定部13の動作について説明する。ヘッダ推定部13はヘッダ復号部11からエラー検出を通知された場合に動作し、エラーとなったヘッダを推定する。さらに推定したヘッダのビット長を算出し、そのビット長をヘッダ読み飛ばし部14に伝達する。
以下、ヘッダの推定方法を説明する。まず、ヘッダの符号化データは、シンボルを符号化して得られる符号(ビット列)を並べたものである。シンボルS1、シンボルS2・・・を符号化して得られるヘッダの符号化データHencは、次式のように表現できる。
Henc = E1(S1)、E2(S2)、E3(S3)、・・・、En(Sn)
ここで、E1()、E2()、・・・En()は、シンボルから対応する符号化データを得る関数を示す。さらに、シンボルとシンボルを符号化して得られる符号は1対1対応をしているので、ヘッダHは、以下の式のようにシンボルS1、シンボルS2・・・を順に並べた形で表現できる。
H = S1、S2、S3、・・・、Sn
シンボルSiが、シンボル候補Si1、Si2、・・・、Simのいずれかを値とする場合、ヘッダを推定するとは、各iについて、シンボルの候補Si1、Si2、・・・、Simから最適なシンボルを選択することと等しい。例えば、1番目のシンボルではS12を選択し、2番目ではS24を、3番目ではS31、n番目ではSn5を選択した場合、ヘッダHは
H = S12、S24、S31、・・・、Sn5
と推定される。
なお、ヘッダの符号化データを得るためには、シンボルを選択した後にシンボルを符号化する必要がある。しかしながら、本実施の形態におけるヘッダの推定は、ヘッダの読み飛ばしを可能にするために行うものである。そのため、必ずしもヘッダの符号化データは必要ではなく、ヘッダの長さだけ得られれば良い。従って、本実施の形態のヘッダ推定部13は内部にシンボル符号化部を持つものであるが、このシンボル符号化部は符号化したシンボルの長さだけが得られれば良い。
ヘッダを推定するためには、ヘッダを構成する各シンボルにおいて、シンボル候補の中から適切な値を選択する必要があるが、このシンボル候補からシンボルを選択する方法として以下の方法がある。
(a)固定値を選択する。
(b)直前に復号した値を選択する。
(c)周期的パターンに従って選択する。
(d)前に位置するシンボルに基づいて選択する。
(e)位置に基づいて選択する。
(f)確率に基づいて選択する。
ここで、(a)の固定値を選択する方法は、単純に予め決められた値を選択する方法である。例えばMPEG−4ビデオのフレームタイプを示すvop_coding_typeは、シンプルプロファイルの場合、片方向予測フレームのPフレームであることが多い。このためPフレームを固定的に選択する方法が好適である。
他にもMPEG−4ビデオのvop_codedは“1”であることが多いため“1”を選択するのが好適であり、marker_bitは“1”であることが規格で決まっているので“1”とするのが好適である。
(b)の直前に復号した値を選択する方法とは、前回、復号された値を用いて今回の値を推定する方法である。例えばMPEG−4ビデオの量子化係数を示すvop_quantは、直前のフレームでの値と同じことが多い。そのため、直前のフレームで復号した値を選択する方法が好適である。
(c)の周期的パターンに従って選択する方法とは、周期的なパターンに従って符号化されることが多い場合に使用される。例えばMPEG−4ビデオのフレームタイプを示すvop_coding_typeは、基本的には、片方向予測フレームのPフレームで符号化し、定期的にフレーム内符号化フレームのIフレームを挿入する方法で符号化されることが多い。この場合、定期的にIフレームが現れることになる。この場合には、復号する間にIフレームの挿入間隔を測定しておき、推定するときには、前回のIフレームとの間隔がその挿入間隔に等しい場合はIフレームを選択し、それ以外の場合はPフレームを選択する方法が好適である。
(d)の前に位置するシンボルに基づいて選択する方法とは、前に位置するシンボルの値によって、後に位置するシンボルが存在するかどうか(もしくはシンボルの値)が決まる場合に使用される。例えば、MPEG−4ビデオのVOPヘッダを推定する場合において、シンボルvop_coding_typeをIフレームとした場合には、後に位置するシンボルの動きベクトルの範囲を示すvop_fcode_forwardは規格上存在しないので、選択しないという方法が好適である。この場合、このシンボルは符号化されないので、この部分のヘッダ長はゼロになる。
他にも、例えば、VPヘッダを推定する場合において、シンボルHECを1とした場合は、その後に位置するシンボルであるmodulo_time_base、vop_time_increment、vop_coding_type、intra_dc_vlc_thr、vop_fcode_forwardは、直前のVOPヘッダで復号された値を選択するのが好適である。
(e)の位置に基づいて選択する方法とは、そのシンボルを符号化する位置に応じて値を選択する方法である。例えば、MPEG−4ビデオのnext_start_codeは、next_start_codeを挿入する位置におけるバイト内ビット位置に応じて決まる符号であるため、next_start_codeを挿入する位置でのバイト内ビット位置が決まれば自動的に選択すべき値が決まる。ここでバイト内ビット位置とは、符号化データ中での位置を、Nバイト目+Mビットとして表した場合のMビットのことである。つまり、符号化データ中での位置がバイトアライメントされていればバイト内ビット位置は0、バイトアライメントされている位置から3ビット進んだ位置にあればバイト内ビット位置は3となる。
他にも、例えば、MPEG−4ビデオのVPヘッダで符号化されるマクロブロック番号を推定する方法として(e)の方法が使える。VPヘッダで符号化されるマクロブロック番号は、符号化されている位置でのマクロブロック番号を示す。そのためMPEG−4ビデオのVPヘッダを推定する場合は、マクロブロック番号として、直前までに復号したマクロブロック数+1を選択するのが好適である。この場合には、マクロブロック数に基づいて定めた位置という意味で、シンボルを符号化する位置に基づいて値を選択している。
以下、(f)の確率に基づいて選択する方法を説明する。既に説明したように、ヘッダHは、以下の式のようにシンボルS1、シンボルS2・・・を順に並べた形で表現できる。
H = S1、S2、S3、・・・、Sn
シンボルSiが、シンボル候補Si1、Si2、・・・、Simのいずれかを値とする場合、ヘッダを推定するとは、各iについて、シンボルの候補Si1、Si2、・・・、Simから最適なシンボルを選択することと等しい。
ここでシンボルSiについてシンボルの候補Sijが生起する確率をPijとする。
本発明の1つの推定方法は、確率Pijが既知である場合に、各iについて最もPijが大きいシンボルを選択しヘッダを推定することである。この方法を用いる場合には、各iについて最大のPijとなるシンボルをヘッダ推定部13に記憶させておけば良く、必ずしも確率Pijをヘッダ推定部13に記憶させておく必要は無い。
尚、確率Pijは実験などにより前もって求めておく方法と、データを復号しながら動的に求める方法と、がある。
まず実験により確率Pijを求めておく方法を説明する。1つの求め方は、復号装置に、復号して得られるシンボルとその度数とを測定する手段を設けておき、用意しておいた符号化データをその復号装置で復号することにより求める方法である。もう1つの求め方は、符号化装置に、符号化しようとするシンボルとその度数を測定する手段を設けておき、用意しておいたデータをその復号装置で符号化することで求める方法である。
確率Pijは上述のように実験的に求めなくとも、既知である場合がある。例えばMPEG−2ビデオのvop_coding_typeの場合、フレーム内符号化フレームをI、片方向予測フレームをP、両方向予測フレームをBと呼べば、I、B、B、P、B、B、P、B、B、P、B、B、P、B、Bの順で符号化する方法が知られている。対象となる符号化データがこのようなデータである場合、Bとなる確率が10/15と最も高いことが予め判明しているため、確率が最大のシンボルを選択する場合には、Bを選択すれば良い。これは前述した固定値を選択する方法(a)と同じである。
次に、現在復号している符号化データに対しデータを復号しながら動的に確率Pijを求める場合について説明する。動的に確率Pijを求める方法では、ヘッダ推定部13は、エラーの検知が通知されない通常時に、ヘッダ復号部11から通知された復号したヘッダの情報を元に生起したシンボルとその度数を記録する。エラーの検知が通知された場合には、記録しておいた度数を元に、最大の度数となるシンボルを選択することでヘッダの推定を行う。例えば、MPEG−4ビデオのVOPヘッダを推定するためにヘッダ情報の一つのvop_coding_typeを選択する場合、現在までに復号したvop_coding_typeの各シンボルの度数が、Iが2回、Pが20回、Bが0回であった場合、最大の度数となるシンボルはPであるためヘッダ推定部13ではPを選択する。
上記では確率Pijが一定であることを仮定していたが、実際にはPijが動的に変化する場合も考えられる。この場合に対応するため、ここではPijが前回までに復号したシンボルの関数であると考える。すなわち、シンボルSiについて、k回目に復号されるシンボルの生起確率が、過去に復号されたシンボルにより決まると仮定する。k回目に復号されるシンボルをSi(k)、k回目にシンボルSijが復号される確率をPij(k)と表現すると、確率Pij(k)は過去に復号されたシンボルの関数として表現できる。
Pij(k) = f(Sij, Si(k-1), Si(k-2), Si(k-3)…., Si(k-l))
この関数fの最も単純な場合は、
Pij(k) = f(Sij, Si(k-1))
の場合、すなわち前回復号されたシンボルに依存して、今回発生するシンボルの生起確率が決まる場合である。たとえば、関数fとしては、
f = 0.9 (Sij=Si(k-1) の場合)
が考えられる。
この関数fの意味は、生起確率Pij(k)は前回復号されたシンボルに依存し、前回のシンボルと同じシンボルである確率が0.9、前回と異なるシンボルである確率が0.1ということである。このシンボルを推定する場合は、前回のシンボルを選択することになる。例えば、MPEG−4ビデオのVOPヘッダ中の情報である量子化係数vop_quantは、前回復号した値と同じである確率が高く、この方法を用いるのが好適である。これは前述した直前に復号した値を選択する方法(b)と同一である。
Pij(k)はデータを復号しながら求めることもできる。MPEG−4ビデオのVOPヘッダ中の情報のvop_rounding_type は、0又は1を取る情報である。例えば、vop_rounding_typeが、0,0,1,1,0,0,1,1,0,0,1,1,・・・のように0,0,1,1を周期的に繰り返すパターンにより符号化されているとする。この場合、vop_rounding_typeを復号するときに、過去3回の値のパターン毎に今回復号した値となる場合の度数を測定しておけばPij(k)を求めることができる。このパターンのデータを41回復号した場合の度数は図4のようになる。図4より、過去3回のvop_rounding_typeの値のパターンが{0, 0, 1}の場合の度数を見ると、次が0である場合の度数が0、次が1である場合の度数は9である。このことから過去3回のvop_rounding_typeの値のパターンが{0, 0, 1}の場合に対して、
Pij(k) = 1 (=9/9) (Sij=0の場合)、 Pij(k) = 0 (Sij=1の場合)というようにPij(k)が得られる。このように、一般に過去N回の値のパターン毎に今回復号した値となる場合の度数を測定しておけばPij(k)を求めることができる。
ところで、ディジタル放送では、トランスポートストリームレベルで第1の誤り訂正符号を付加し、さらにインターリーブして第2の誤り訂正符号を付加した上で伝送する。復号時には第2の誤り訂正符号により訂正したデータを、逆インターリーブし、さらに第1の誤り訂正符号により訂正して符号化データが得られる。このような場合、伝送時にバースト誤りが生じても逆インターリーブされた後のデータではランダム誤り(ビット誤り)となる。そのため、符号化データに訂正されずに残るエラーはランダム誤り(ビット誤り)である確率が高い。この性質を考慮すると、シンボルを選択する際に、該シンボルを符号化して得られるビット列と符号化データのビット列とを比較し、ビット違いの少ないものを選ぶ(符号化データ中のビット列に近いものを選ぶ)と有利である。
上記の性質を考慮してシンボルを選択する方法を図5のフローチャートを用いて説明する。ここではシンボルの生起確率がPijであることが分かっているものとする。処理を開始し、ステップS501では、Pijの中で確率が最も高いものから順にシンボルを仮に選び出す(仮選択)。ステップS502ではステップS501で仮選択されたシンボルを符号化する。ステップS503では、ステップS502で符号化して得られるビット列と符号化データのビット列を比較しビットが異なる数を数える。ステップS504で、ビット違いが所定ビットN(例えば1ビット)以内であるか否かを判定する。N以内であればステップS505に移行し仮選択したシンボルを選択する。ステップS504において、所定ビットより大きい場合と判定された場合には、ステップS501に移行し次に確率の高いシンボルを仮選択する。このようなステップを行うことにより、符号化した場合のビット列が、符号化データ中のビット列と比較して違いがNビット以下の違いとなるシンボルの中で最も確率の高いものを選択することができる。
次に、シンボルを符号化して得られるビット列と符号化データとのビット列を比較し、ビット違いの少ないものを選ぶことによりシンボルを選択する他の方法を説明する。この方法では、生起確率を用いない。ヘッダを復号する際に、あるシンボルについて復号された値を過去L回分、記録しておくものとする。こうしておけば、図6のフローチャートで示される以下の方法により、このシンボルを推定できる。まず、ステップS601で過去に復号されたL個のシンボルのうち最近復号されたシンボルを仮選択する。次に、ステップS602で仮選択されたステップシンボルを符号化する。ステップS603で、符号化して得られるビット列と符号化データのビット列を比較しビットが異なる数を数える。ステップS604で、ビット違いが所定ビットN(例えば1ビット)以内であるかを判定する。N以内であればステップS605に移行し仮選択したシンボルを選択する。ステップS604において、所定ビットより大きい場合と判定された場合には、ステップS601に移行し次に最近復号されたシンボルを仮選択する。このようなステップを行うことにより、符号化した場合のビット列が、符号化データ中のビット列と比較して違いがNビット以下の違いとなるシンボルの中で直近に復号されたものを選択することができる。
以上ヘッダの推定におけるシンボルの選択方法を幾つか説明したが、推定対象となるヘッダの全てのシンボルについて同じ選択方法を用いる必要はなく、シンボル毎に異なる選択方法を用いても良い。例として、MPEG−4ビデオのVOPヘッダを推定する方法を以下に示す。まずフレームタイプを示すvop_coding_typeは、符号化データ毎に割合が異なるので、復号する度に出現度数を数えておき、推定する時点で最大の度数であったシンボルを選択する。続くmodulo_time_baseとvop_time_incrementについては、同じ時間情報を2つのシンボルに分けて符号化したものなので、復号時にはmodulo_time_baseとvop_time_incrementを組にして出現度数を数えておく。推定する時点では図5で説明したフローに従いビット違いが1ビット以内の候補の中で最も度数の大きいものを選択する。フレームが符号化されているかを示すvop_codedは1である可能性が高いと分かっているので固定的に1を選択し、丸め方向を示すvop_rounding_typeは一定パターンで符号化されることが多いので、過去3回のパターンと今回の値の度数を記録しておいて、推定する時点以前の3回のパターンから最大の度数となるシンボルを選択する。各種情報のcomplexity_estimation_headerは存在しない可能性が高いので無しとし、符号表を選択するための閾値intra_dc_vlc_thr及び量子化係数vop_quantは前回の値との相関が高いために前回復号して得られた値を用いる。動きベクトルの範囲を示すvop_fcode_forwardは符号化データ毎に異なるが、ストリーム中では一定であることが多いため、復号するたびにvop_fcode_forwardの生起度数を記録しておき、その中で最大となる値を選択する。next_start_codeは、挿入する場所のビット位置に応じて値を選択する。上記の方法で、ヘッダ中の各シンボルを選択し符号化することでVOPヘッダが推定できる。
上記の例において、modulo_time_baseとvop_time_incrementとを組にして出現度数を求め、それに基づいてシンボルの組を推定する方法を説明したように、シンボルの組を一まとまりと考え、そのシンボルの組に対して、シンボルの組の候補から値を選択することによりヘッダの推定を行っても良い。
また、エラーの発生した位置は、エラーを検知した位置もしくはその前に存在していることから、エラーの検知された位置によって推定方法を変えることもできる。具体的には、エラーが検出された位置より前に復号された値については、復号された値をそのまま用いて推定し、エラーの検出された位置及びその後の情報のみをシンボル候補から選択して推定することでヘッダを推定することができる。なお、エラーの検出された位置の前と後とで区間を分けるのではなく、エラーが検出された位置より所定数以上前に位置するシンボルについては、復号した値を使い、その後のシンボルについては推定するという様に区間を分けることもできる。
最後に、ヘッダ読み飛ばし部14(図1)の動作を説明する。ヘッダ読み飛ばし部14では、ヘッダ推定部13から通知されたヘッダのビット数Phから、ヘッダ先頭を基準とした現在のビット位置Pnを引いて、必要な読み飛ばしビット数Lを計算する。L = Ph − Pn
次に、Lビットだけ符号化データを読み飛ばす。現在位置がPnのところ、Ph − Pnだけ読み飛ばすので、読み飛ばした後のビット位置はPh、すなわちヘッダが終了した後の位置(ヘッダに続く符号化データの先頭)となる。
なお、ヘッダ復号部12が内部に符号化データを一時的に記憶しておくバッファを持ち、ヘッダ復号中に符号化データを巻き戻すことができる場合においては、ヘッダ復号部12でエラー検知した場合に、ヘッダ復号部12で予めヘッダ先頭まで巻き戻しておき、ヘッダ読み飛ばし部14では推定されたビット数Phだけ読み飛ばすという方法にしても良い。
次に、本発明の第2の実施の形態について説明する。本実施の形態は、図1で示される第1の実施の形態と同じ装置で実現できる。
第1の実施の形態においては、エラーが検知された場合においてヘッダ全体を推定し、ヘッダ全体分のビット長の符号化データを読み飛ばす例を説明した。これに対し、第2の実施の形態では、ヘッダの所定の部分(一部分)を推定し所定の部分のみを読み飛ばす方法を説明する。
ヘッダの復号でエラーを検知した場合にもエラーがヘッダ全体で生じている可能性は低く、エラーを検知した位置もしくはその直前にのみエラーが存在している可能性が高い。この仮定が正しい場合、エラーが発生した部分以外のヘッダについては通常通り復号することができる。この性質を考慮すると、エラーが実際に発生したと考えられるエラーを検知した位置及びその前の部分にあるヘッダの一部のみを推定して読み飛ばし、他のエラーがないと考えられる部分のヘッダについてはそのまま復号する方法が好適であると考えられる。第2の実施の形態はこの方法を実現するものである。
本実施の形態による方法は以下の手順により実現できる。ヘッダ中のシンボルSiの復号においてエラーが検出された場合には、シンボルSiの位置の所定数前のシンボルSi-aから所定数後のシンボルSi+bまでの部分的についてヘッダの推定を行い、推定された部分のビット長だけ読み飛ばす。この後のシンボルSi+b+1から後のシンボルについては読み飛ばした後の位置から符号化データを復号して値を得る。
この動作を図7に示すフローチャート図を用いて説明する。処理を開始し、ステップS701では、入力したデータのヘッダを復号する。ステップS702では、ヘッダ復号においてエラーが検出されたか否かを判定する。エラーが検出されない場合には(N)、ステップS703に移行しヘッダに続くデータを復号する。次いで、ステップS704では、復号されたデータを出力する。ステップS702でエラーが検出された場合には(Y)、ステップS705に移行する。ステップS705では、エラーが検出された位置のa個前のシンボルからb個後のシンボルまでのヘッダを推定する。ステップS706では、推定したヘッダ長だけ符号化データを読み飛ばす。ステップS707では、ヘッダの続きを復号する。ヘッダの復号が終わるとステップS703に移行しヘッダに続くデータを復号し、ステップS704で復号されたデータを出力する。
例えば、MPEG−4ビデオのVOPヘッダのvop_time_incrementでエラーが検出された場合で、ヘッダを推定する範囲(a, b)が(1, 0)の場合には、エラーを検知したシンボルの1つ前のシンボルのmodulo_time_baseとエラーを検知した位置のシンボルのvop_time_incrementを推定し、その推定されたヘッダのビット長だけ読み飛ばす。エラーを検知した位置の次のシンボルであるvop_coded及びそれ以降のシンボルについては、読み飛ばした後のヘッダを復号することで値を得る。
ところで、推定する範囲のシンボルが複数の場合、個々のシンボルについて生起確率Pijの最も高いものを選択する方法によりヘッダの部分を推定しても良いが、この場合推定する範囲のシンボルを全て変更することになる。しかしながらエラーが発生したシンボルは高々1つであることが多いことを考えると、予め定めた範囲の全てのシンボルを変更するのは好適ではない。
ヘッダを復号して得られたシンボルの生起確率は、確率Pijを元に求めることができるが、エラーを検出したシンボルの前に位置するシンボルの中でこの確率が特に低いシンボルがある場合には、そのシンボルでエラーが発生した可能性が高い。
しかしながら、ヘッダが可変長符号化されている場合、エラーが発生したシンボルだけでなく、エラーが発生したシンボルの後に位置するシンボルも正しい値では復号できない。よって、生起確率が低くエラーが発生したと考えられるシンボルより後に復号されたシンボルは信頼できない。そのため、生起確率が低いシンボルが複数ある場合には、生起確率が低いシンボル群の内、後に位置するシンボルの生起確率が低かったのは、前に位置するシンボルでエラーが発生したためと考えられる。従って、生起確率の低いシンボルが複数ある場合には、そのシンボル群の中で最も前に位置するシンボルにおいてエラーが発生したと考えるのが好ましい。
このように考えると、推定する範囲のシンボルが複数ある場合に、ヘッダを復号して得られたシンボルの生起確率を、推定する範囲の先頭のシンボルから後のシンボルの順に求めていき、この生起確率が所定値未満であると判定された時点で、この生起確率の低かったシンボルを推定し直すことでヘッダを推定すると良い。
この方法は以下のようにして実現する。エラーを検出したシンボルSiから所定数前のシンボルSi-aを起点として、シンボルSi-aから後のシンボルの順に、ヘッダを復号して得られたシンボルの生起確率を求めていき、この生起確率が所定値未満であると判定された時点で、この生起確率の低かったシンボル(ここではScとする)をエラーが発生したシンボルと推測する。このとき、ヘッダを推定する範囲をシンボルScの前後とする。例えばSc-2からSc+1の範囲とする方法や、Scのみを推定する方法などがある。尚、推定し直すシンボルの範囲が、エラーを検知したシンボルSiの前に位置するときには、シンボルSiの位置からの読み飛ばすのではなく、巻き戻す必要がある。従って、この方法では、ヘッダ復号部11において符号化データを一度巻き戻した上で、ヘッダ読み飛ばし部で推定したヘッダの部分を読み飛ばす。
エラーが発生したと考えられるシンボルを推測する方法としては以下の方法も好適である。エラーを検知したシンボルSiと、その所定数前のシンボルSaの範囲のシンボルについて、ヘッダを復号して得られたシンボルの生起確率を求める。エラーを検知したシンボルSiを除くシンボルの中で、生起確率が所定の閾値よりも小さいものがあれば、そのシンボル群の中で最も生起確率が小さいものをエラーの発生したシンボルScと推測する。ここでエラーを検知したシンボルSiを除外しているのは、エラーを検知したシンボルは、有り得ない値であるはずなので、この場合の生起確率が最低であるはずであるからである。所定の閾値よりも小さい生起確率となるシンボルがない場合には、エラーを検知したシンボルSiをエラーが発生したシンボルScと推測する。
また、シンボル候補の数が相対的に多いシンボルの場合、そのシンボルに対するシンボル候補の生起確率が平均的に低くなってしまい、そのため上記の方法でエラーの発生したシンボルを推測すると、シンボル候補の数が相対的に多いシンボルが常に推測されてしまうこともありうる。この問題を避けるために、生起確率をそのまま用いてエラーが発生したと考えられるシンボルを推測するのではなく、正規化された生起確率を用いて、エラーのシンボルを推測しても良い。
ここで正規化された生起確率を求める一つの方法は、シンボル候補のうち生起確率が最大となるシンボルの生起確率をQとした場合に、各シンボルの生起確率PijをQで割ることによって求める方法である。例えば、シンボル候補が0、1、2であり、各生起確率が0.6、0.3、0.1であった場合、各シンボルの正規化された生起確率は、1(=0.6/0.6)、0.5(0.3/0.6)、0.16(=0.1/0.6)となる。ヘッダを復号して得られたシンボルが1であった場合、エラーのシンボルを推測するために用いられる正規化された生起確率は0.5となる。
さらに、シンボル候補が極めて多いために、どのシンボル候補の生起確率も非常に低くなってしまうシンボルについては、生起確率が意味をなさないので、エラーと推測するシンボルの候補から除外しても良い。例えば、シンボル候補のうち生起確率が最大となるシンボルの生起確率Qが0.1を超えない場合には、このシンボル候補をエラーと推測するシンボル候補から除外する方法が好適である。
第2の実施の形態は、ヘッダの所定の部分を推定し読み飛ばすものである。上記に説明したように、所定の部分を定める方法としては、1)エラーが発生した位置の所定数前のシンボルSi-aから所定数後のシンボルSi+bまでの部分を所定の部分とする方法と、2)エラーが発生した位置の所定数前のシンボルSi-aから生起確率に基づいてエラーの発生した確率が最も高いと判断されるシンボルScを推定し、シンボルScの前後所定の範囲のシンボルを推定する方法と、がある。
次に、本発明の第3の実施の形態による符号化データ復号装置について図面を参照しつつ説明を行う。図8は、本実施の形態による符号化データ復号装置の構成を示す図である。本実施の形態による符号化データ復号装置は、ヘッダを復号するヘッダ復号部81と、ヘッダに続くデータを復号する符号化データ復号部82と、ヘッダ復号部81でヘッダ中にエラーを検出した場合にヘッダを推定するヘッダ推定部83と、ヘッダ復号部で決定されたビット数だけ符号化データを読み飛ばすヘッダ読み飛ばし部84と、エラー制御部85と、を備える。このデータ復号装置は、第1の実施の形態と同様に、エラーが検出されない場合は、ヘッダ復号部81でヘッダを復号し符号化データ復号部82でヘッダに続くデータを復号する。ヘッダ復号部81はまた、復号したヘッダの情報をヘッダ推定部83に伝達する。エラーのある場合で、ヘッダ復号部81でエラーが検出された場合には、ヘッダ推定部83においてヘッダを推定し、ヘッダの長さをヘッダ読み飛ばし部84に通知する。ヘッダ推定部83は、ヘッダ復号部81に、推定したヘッダの情報を伝える。ヘッダ読み飛ばし部84では通知されたヘッダ長だけ符号化データを読み飛ばす。ヘッダ復号部81は、ヘッダをエラーなく復号した時点、もしくはヘッダ読み飛ばし部84でヘッダを読み飛ばした時点で、符号化データ復号部82に対して、ヘッダの情報を伝える。このとき、ヘッダがエラーなく復号できた場合には復号したヘッダの情報を符号化データ復号部82に伝え、ヘッダの復号でエラーが生じてヘッダを推定した場合にはヘッダ推定部83から伝達されたヘッダの情報を符号化データ復号部82に伝える。符号化データ復号部82では、ヘッダ復号部81から伝達されたヘッダの情報を用いて読み飛ばされた後の符号化データを継続して復号する。このように、エラーの検出されたヘッダを読み飛ばす動作は、第1の実施の形態と同じである。
以下、第1の実施の形態と異なる点に重点をおいて説明する。符号化データ復号部82は、第1の実施の形態では備えていなかったエラー検出手段82aを内部に備え、符号化データ復号中のエラーを検出することができる。
本実施の形態の符号化データ復号装置では、符号化データ復号部82でエラーが検出された場合、データをヘッダ先頭まで巻き戻した上で、ヘッダ推定部83を用いてヘッダを推定し直し、続くヘッダ読み飛ばし部84においてヘッダを読み飛ばす。さらに符号化データ復号部82で復号を行う。このヘッダの推定・読み飛ばし・符号化データ復号を制御するのがエラー制御部85である。このように、ヘッダに続く符号化データの復号でエラーが検出された場合でも、ヘッダの推定、読み飛ばしを行うことが本実施の形態の特徴である。
第1の実施の形態の場合には、ヘッダの推定に誤りがあった場合には符号化データの復号でエラーになりこれ以上復号することができない。しかし、第3の実施の形態では、符号化データの復号でエラーを検出した際にヘッダの推定を再度行うようにするため、ヘッダの推定の失敗により復号できない問題を解決することができる。尚、エラー制御部85は、ヘッダ推定部83において、所定回数もしくは所定方法の推定が終了した後は、推定を停止することとする。これにより無限ループを避けることができる。
ヘッダ推定部83の詳細な動作について説明する。ヘッダ推定部83は、エラーの検知が通知される度に、ヘッダの推定をやり直すことになる。そのため1回目の推定と2回目の推定、3回目の推定などと、推定する度に別のシンボルを選択してヘッダを推定する必要がある。一つの方法は、第1の実施の形態で説明したようにシンボルの生起確率Pijを用いて、1回目の推定では最も確率の高いシンボルを選択し、2回目の選択ではその次に高い確率のシンボル、3回目ではその次に高い確率のシンボルというように選択する方法である。
例えばMPEG−4ビデオのVOPヘッダを推定する場合では、フレームタイプを示すvop_coding_typeの生起確率が、B、P、Iの順に高いという知見がある場合には、1回目の推定では、vop_coding_typeをBフレームとして推定し、2回目の推定ではPフレームとして推定、3回目の推定ではIフレームとすれば推定する毎に異なった推定を行うことができる。また別の方法では、VOPヘッダを復号するたびに時間情報を示すmodulo_time_baseの値とその度数を記憶しておき、1回目の推定では最も多く現れた値を使って推定し、2回目の推定ではその次の頻度で現れた値を使って推定するなどの処理を行う。また、VPヘッダを推定する場合は、1回目の推定ではHECである0として推定し、2回目の推定ではHECが1であるとして推定を行う方法がある。
上記では、ヘッダ中のある位置のシンボルについて、推定する度に値を変更して推定し直していたが、どのシンボルを推定し直すたびに変更するシンボルとして用いるかという課題がある。一つの方法では、最も重要な位置の情報を変更することである。MPEG−4ビデオのVOPヘッダであればフレームタイプを示すvop_coding_typeが最も重要な情報あるので、このシンボルを変更する方法がある。また別の方法では、エラーを検知した位置のシンボルについて変更する方法である。またエラーを検知した位置の一つ前のシンボルを変更する方法もある。
また、第2の実施の形態では、推定する範囲のシンボルが複数ある場合において、ヘッダを復号して得られたシンボルの生起確率を、確率Pijを元に求めておき、この確率が、推定する範囲のシンボルの中で最も小さいシンボルをエラーの発生したシンボルとして推定する方法を説明した。この方法と同様の方法でエラーの発生したシンボルを推定し、このシンボルを変更対象とする方法は好適である。
ところで、ヘッダだけではなく、ヘッダに続く符号化データにもエラーが発生する可能性があることを考慮すると、エラー制御部85の動作を以下のようにすることができる。
ヘッダに続く符号化データが、動画像や画像を符号化する単位であるマクロブロックである場合について、エラーを検出した位置のマクロブロック番号がヘッダの直後のマクロブロック番号から数えて所定数以内であれば、ヘッダを推定する動作に戻ることとする。これは、ヘッダに続く符号化データにもエラーが検出される可能性があることを考慮し、ヘッダを検出してから所定数より多くのマクロブロックをエラーの検出無しで復号できる場合にはヘッダにはエラーが無かったと見做し、所定数以内にエラーが検出された場合にはヘッダにエラーが有ったと見做すものであり、この場合のみヘッダの推定を再度行う。すなわち、エラーを検出した時点のマクロブロック番号をMe、ヘッダ直後のマクロブロック番号をMh、ある閾値をTmとした場合、Me - Mh <= Tmの場合は、ヘッダの推定を行い、
Me - Mh > Tmの場合には、ヘッダの推定は行わない。ヘッダの推定を行わない場合には、次のヘッダまで符号化データを読み飛ばし、次のヘッダから復号を再開すれば良い。
また、ヘッダにエラーが発生した場合にもヘッダの復号においてエラーが検出されず、ヘッダに続く符号化データの復号においてエラーが検出されることがある。このようにヘッダの復号でエラーが検出されなかった場合についても、ヘッダに続く符号化データの復号において所定数以内のマクロブロックでエラーが検出された場合には、実際にはヘッダが正しく復号されていなかったと見做し、ヘッダの推定を行う。これにより、ヘッダでのエラーを符号化データの復号において検出した場合にも符号化データを復号し直すことが可能になる。
ところで、上記ではマクロブロック番号が所定数以内であるかを用いて判定を行ったが、エラーを検出した位置のビット位置がヘッダの直後のビット位置から数えて所定ビット以内かどうかを用いて判定を行ってもよい。すなわち、エラーを検出した時点のビット位置をPe、ヘッダ直後のビット位置をPh、ある閾値をTbとした場合、Pe - Ph <= Tbの場合は、ヘッダの推定を行い、 Pe - Ph > Tbの場合には、ヘッダの推定は行わない。ヘッダの推定を行わない場合には、マクロブロック番号で判定したときと同様でよい。
ここで、符号化データ復号部82でエラーを検出する方法の1つを説明する。符号化データがMPEG−4ビデオである場合には、ヘッダに続くデータはマクロブロックから構成され、そのマクロブロックはマクロブロックヘッダとマクロブロック内のデータから構成される。ここで、マクロブロック内のデータの一つは、DCT係数の係数データである。この係数の数は必ずブロック内の係数の最大個数である64個以下であるので、復号された係数の数が64個を越えた場合にはエラーがあったと検出することができる。
図9は、本発明の第3の実施の形態による符号化データ復号方法の流れを示すフローチャート図である。ステップS901では、入力したデータのヘッダを復号する。ステップS902では、ヘッダ復号においてエラーが検出されたかどうかを判定する。ステップS902でエラーが検出されない場合には(N)、ステップS903に移行しヘッダに続くマクロブロックを復号する。エラーが検出された場合には(Y)、ステップS904に移行しヘッダを推定する。ステップS905では推定されたヘッダの長さを元に、符号化データを読み飛ばす。続いてステップS903に移行する。ステップS903では、ヘッダに続く符号化データを復号する。ステップS903の符号化データ復号においてエラーが検出された場合には(Y)、ステップS906の分岐で、ステップS904に移行しヘッダを推定する。ステップS905では推定されたヘッダの長さを元に、符号化データを読み飛ばす。ここで再度、ステップS903に移行し符号化データを復号する。復号が完了したら最後にステップS907で、復号データを出力する。
上記の場合の動作を、図10を参照しつつ説明を行う。図10に示すように、符号化データは、同期ワード、ヘッダ情報、符号化データの繰り返しにより構成される。ここで、符号化データ中には図中×印の位置にエラーが存在するものとする。この場合、本実施の形態では、復号は(1)(2)(3)(4)(5)の順に進む。(1)では、ヘッダの復号を行うが途中のX点ではエラーを検出できずに復号を続ける。途中A点でエラーを検出し復号を停止する。ここでヘッダを推定する。続く(2)では推定されたヘッダ長だけデータを読み飛ばす。続く(3)ではエラーになったヘッダの直後のマクロブロックから継続して復号を行う。符号化データの復号途中、点Bでエラーを検知したため復号を停止する。エラーを検知したため(4)に進み再度ヘッダの推定及びヘッダの読み飛ばしを行う。続く(5)では正しいヘッダの推定が行なわれたため、ヘッダの直後の符号化データがエラーなく復号できる。図中実線の矢印(1)(3)(5)は復号を示し、点線の矢印(2)(4)は、巻き戻し及び読み飛ばしを意味する。
以上に説明したように、本発明の各実施の形態によるデータ復号装置及びデータ復号方法によれば、
(1)ヘッダの復号中にエラーを検出した場合に、ヘッダを推定しそのヘッダ長だけ符号化データを読み飛ばすことで、正常な復号処理を継続することができる。これにより、ヘッダ中にエラーが発生した場合にもヘッダ直後の符号化データから復号を行うことが可能となり、特許文献1の課題を解決することができる。また、特許文献2のような誤り訂正回路を必要としないため、符号化装置側に誤り訂正符号を付加する必要がなく、また回路規模の削減および処理量の削減が可能となる。
(2)符号化データの復号を行う装置の一部であるヘッダ復号部がエラーを検出するので、ヘッダの先頭位置が、符号化データ復号前に既知である必要がない。また、エラー推定部でエラーの発生したヘッダの推定を行い、そこでヘッダの長さを算出するため、符号化データ復号前に、ヘッダの長さが予め既知である必要もない。これにより、ヘッダの先頭位置やヘッダの長さが予め既知でなくてはならないという特許文献2の問題を解決できる。
(3)エラーが生じたヘッダを以前のエラーの無いヘッダでそのまま置き換えるのではなく、ヘッダを構成するシンボル毎に、シンボル候補から値を選択することによりヘッダの推定を行うため、エラーの発生したヘッダが直前のヘッダと完全に一致していない場合にも、ヘッダ後に続くデータを復号できる。
という利点がある。
11 ヘッダ復号部、12 符号化データ復号部、13 ヘッダ推定部、14 ヘッダ読み飛ばし部、81 ヘッダ復号部、82 符号化データ復号部、83 ヘッダ推定部、84 ヘッダ読み飛ばし部、85 エラー制御部、141 誤り訂正回路、142 遅延回路、143 メモリ回路、144 セレクタ回路、145 エラー制御回路。