今回はMPEG2デコードIPの全体構成についてです。
その前に、まず動画像の基本を軽く解説します。
動画像とは、パラパラ漫画のように複数の静止画を連続して表示することで実現されます。これについてはご存じの方が大半でしょう。この静止画のことをフレームと呼びます。
問題はフレームの情報をどうやって圧縮するかです。1枚1枚をJPEGなどで圧縮すれば良さそうに思えますが、それだけでは圧縮率を上げることが出来ません。
そこで、動画像の時間的連続性を利用します。
動画像では多くの場合、連続する2枚のフレームの間に共通要素があります。シーンチェンジの瞬間を除き、前後2枚が全く別の画像になることは稀で、
・カメラの動きによる背景の移動
・物が動くことによる、一部の画像の移動
・全く変化無し
など、少なからずとも共通点があります。そこで、1枚前のフレームからの差分を用いることで、データ量を減らす工夫をします。
また、MPEG2ではフレーム内を図のように空間的に分けて取り扱います。16x16ピクセルの領域をマクロブロック と呼び、1つのマクロブロック(MB)は6つの小ブロック からなります。(分かりやすくするために私は「小」ブロックと読んでますが、規格書ではただの "block" と表されています)
小ブロックは 8x8 のサイズで、輝度成分4つと色差成分2つの計6つです。
なお、MPEG-2規格そのものについては書き始めるときりがないので、当ブログではあまり詳しく解説しません。
その代わり、
・「MPEG Video 技術」 http://home.catv.ne.jp/dd/pub/book/mpeg.html
・規格仕様書「ISO/IEC13818-2 Information technology -- Generic coding
of moving pictures and associated audio
information: Video」
などが参考になります。規格書は本来無料で手に入るものではありませんが、ドラフト版ならばネットで探せば手に入ります。
(大学の理工系図書館や、けいはんなの国立図書館なら正式版を読めるかと思います)
青色の枠が自作するモジュールです。
vctrl ・・・ 入力したビットストリームを解析し、デコードの必要な情報の取り出しと、画素データをrun&lengthペアに分解するところまで行います。run&lengthペアとは、量子化されたデータから、非ゼロの値と、その間にあったゼロの個数とをペアで表したものです。8x8の小ブロック単位で取り扱うので、最大64項目あります。
vdequant ・・・ run&lengthペアと量子化係数を用いて逆量子化を行います。vdequantを出る時点で、各ブロックのデータは8x8の周波数領域画素データになっています。
vidct ・・・ 8x8のIDCT(逆離散コサイン変換)を行います。vidctの出力は、8x8の空間領域画素データになります。
vmc ・・・ 動き補償を行います。前述の通り、MPEG2では直前のフレームとの差分を用いるので、前フレームの参照MBを計算し、vidctからの画素データを足し合わせて、最終的な画像を作ります。作った画像はフレームバッファにいったん格納します。
vdispdrv ・・・ 1枚のフレームをすべて処理し終わったあと、フレームバッファから画像を読み取ってLCDに転送します。
ざっとこんな感じ。すでに全てのモジュールを書き終えていて、単体でのデバッグを進めている段階です。
さて、次回はもうちょっと詳しい内容に踏み込んで書こうと思います。今日はここまで。
その前に、まず動画像の基本を軽く解説します。
動画像とは、パラパラ漫画のように複数の静止画を連続して表示することで実現されます。これについてはご存じの方が大半でしょう。この静止画のことをフレームと呼びます。
問題はフレームの情報をどうやって圧縮するかです。1枚1枚をJPEGなどで圧縮すれば良さそうに思えますが、それだけでは圧縮率を上げることが出来ません。
そこで、動画像の時間的連続性を利用します。
動画像では多くの場合、連続する2枚のフレームの間に共通要素があります。シーンチェンジの瞬間を除き、前後2枚が全く別の画像になることは稀で、
・カメラの動きによる背景の移動
・物が動くことによる、一部の画像の移動
・全く変化無し
など、少なからずとも共通点があります。そこで、1枚前のフレームからの差分を用いることで、データ量を減らす工夫をします。
また、MPEG2ではフレーム内を図のように空間的に分けて取り扱います。16x16ピクセルの領域をマクロブロック と呼び、1つのマクロブロック(MB)は6つの小ブロック からなります。(分かりやすくするために私は「小」ブロックと読んでますが、規格書ではただの "block" と表されています)
小ブロックは 8x8 のサイズで、輝度成分4つと色差成分2つの計6つです。
なお、MPEG-2規格そのものについては書き始めるときりがないので、当ブログではあまり詳しく解説しません。
その代わり、
・「MPEG Video 技術」 http://home.catv.ne.jp/dd/pub/book/mpeg.html
・規格仕様書「ISO/IEC13818-2 Information technology -- Generic coding
of moving pictures and associated audio
information: Video」
などが参考になります。規格書は本来無料で手に入るものではありませんが、ドラフト版ならばネットで探せば手に入ります。
(大学の理工系図書館や、けいはんなの国立図書館なら正式版を読めるかと思います)
青色の枠が自作するモジュールです。
vctrl ・・・ 入力したビットストリームを解析し、デコードの必要な情報の取り出しと、画素データをrun&lengthペアに分解するところまで行います。run&lengthペアとは、量子化されたデータから、非ゼロの値と、その間にあったゼロの個数とをペアで表したものです。8x8の小ブロック単位で取り扱うので、最大64項目あります。
vdequant ・・・ run&lengthペアと量子化係数を用いて逆量子化を行います。vdequantを出る時点で、各ブロックのデータは8x8の周波数領域画素データになっています。
vidct ・・・ 8x8のIDCT(逆離散コサイン変換)を行います。vidctの出力は、8x8の空間領域画素データになります。
vmc ・・・ 動き補償を行います。前述の通り、MPEG2では直前のフレームとの差分を用いるので、前フレームの参照MBを計算し、vidctからの画素データを足し合わせて、最終的な画像を作ります。作った画像はフレームバッファにいったん格納します。
vdispdrv ・・・ 1枚のフレームをすべて処理し終わったあと、フレームバッファから画像を読み取ってLCDに転送します。
ざっとこんな感じ。すでに全てのモジュールを書き終えていて、単体でのデバッグを進めている段階です。
さて、次回はもうちょっと詳しい内容に踏み込んで書こうと思います。今日はここまで。
コメントする