コーデックの最近のブログ記事

コミックマーケット80で暑い中ブースを見に来ていただいた方、どうもありがとうございました。
そして、本が売り切れだった方、行ってみたら撤収した後だった方、すみませんでした。
今度からのイベント参加では、十分な数を用意するようにします。

さて、頒布していた本の「FPGA向けMPEG2デコーダ」の記事について、現状のソースコードを公開します。

m2v_dec_impl_r250.zip

1つめはデコーダIP本体、2つめはデコーダIPのテストに用いるソフトウェアデコーダです。
いずれも最初にreadme.txtをお読みください。

現状、
・単体テストは入力データ終端の取り扱いが上手く行かないかもしれません(=テストの最後でデータの取りこぼし等発生するかもしれません)
・結合テストは3フレーム目以降は動かないかもしれません。
・実機ではまだ動きません(ダレカタスケテ...)。回路図等もまだ含まれていません。
と、ひどい有様です。ただ、完璧を目指していてはいつまで経っても公開できないので、
大きな修正がある毎にアップしていきたいと思います。要望が多ければ管理しているsubversionのリポジトリ自体を見てもらえるようにできるかも。

前回のmakeから取り組んでいるプロジェクトなので、やりきってしまいたいですね。もうちょっと頑張ろうと思います。

気がついたら3ヶ月ちかく更新さぼってました...。

いきなりですが、夏コミに出展しています!本日(土曜日)、東地区T-02b サークル「silicombi」です!

今回の記事は「FPGA向けMPEG2デコーダをほぼフルスクラッチで作ってみた」です。
動画再生挑戦結局結合デバッグが通り始めたところまで進捗しましたので、そこまでの内容を書いています。

なお、ソースコードを当ブログで配布しますが、会場からのネットワークでトラブっているため、後日アップロードします。
ソースコード目当てで来られた方、申し訳ないですが少々お待ちください。

今回はMPEG2デコードIPの全体構成についてです。

その前に、まず動画像の基本を軽く解説します。
動画像とは、パラパラ漫画のように複数の静止画を連続して表示することで実現されます。これについてはご存じの方が大半でしょう。この静止画のことをフレームと呼びます。

問題はフレームの情報をどうやって圧縮するかです。1枚1枚をJPEGなどで圧縮すれば良さそうに思えますが、それだけでは圧縮率を上げることが出来ません。
そこで、動画像の時間的連続性を利用します。

動画像では多くの場合、連続する2枚のフレームの間に共通要素があります。シーンチェンジの瞬間を除き、前後2枚が全く別の画像になることは稀で、
・カメラの動きによる背景の移動
・物が動くことによる、一部の画像の移動
・全く変化無し
など、少なからずとも共通点があります。そこで、1枚前のフレームからの差分を用いることで、データ量を減らす工夫をします。

mpeg2mb.png

また、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」
などが参考になります。規格書は本来無料で手に入るものではありませんが、ドラフト版ならばネットで探せば手に入ります。
(大学の理工系図書館や、けいはんなの国立図書館なら正式版を読めるかと思います)


ふぅ、導入だけで書き疲れてしまいましたが、ここから本題のIP構成です。

mpeg2blocks.png

青色の枠が自作するモジュールです。

vctrl ・・・ 入力したビットストリームを解析し、デコードの必要な情報の取り出しと、画素データをrun&lengthペアに分解するところまで行います。run&lengthペアとは、量子化されたデータから、非ゼロの値と、その間にあったゼロの個数とをペアで表したものです。8x8の小ブロック単位で取り扱うので、最大64項目あります。

vdequant ・・・ run&lengthペアと量子化係数を用いて逆量子化を行います。vdequantを出る時点で、各ブロックのデータは8x8の周波数領域画素データになっています。

vidct ・・・ 8x8のIDCT(逆離散コサイン変換)を行います。vidctの出力は、8x8の空間領域画素データになります。

vmc ・・・ 動き補償を行います。前述の通り、MPEG2では直前のフレームとの差分を用いるので、前フレームの参照MBを計算し、vidctからの画素データを足し合わせて、最終的な画像を作ります。作った画像はフレームバッファにいったん格納します。

vdispdrv ・・・ 1枚のフレームをすべて処理し終わったあと、フレームバッファから画像を読み取ってLCDに転送します。

ざっとこんな感じ。すでに全てのモジュールを書き終えていて、単体でのデバッグを進めている段階です。

さて、次回はもうちょっと詳しい内容に踏み込んで書こうと思います。今日はここまで。

復活後一発目の記事では、まず現在作業している内容について紹介しようかと思います。

過去にはMP3プレイヤー(を途中まで)とかアンプ(今は訳あって使ってないけど)とかを書いてましたが、今はちょっとお休みしています。

現在はというと、MPEG2デコーダIPの製作を進めています。
この手のものって市販のIPが存在するので新規性はないんですが、動画コーデックの勉強を兼ねているので良しとします。

その代わり、
  • XC3S250E (Xilinx Spantan3E) ×1の中に収める。すなわち、DWM2007年7月号の付録基板で使えるようにする。
  • フルスクラッチで作る (=OpenCores等からIPの一部をコピーしたりしない。全部自分で書く)
  • (後に述べる)制約条件さえ満たしていれば、MPEG2の規格通りのストリームを処理する。(=コーデック仕様を都合に合わせて勝手に改変しない)
を目標にしています。

まあ、規模の小さいFPGAなんで、解像度が高いのとかはもちろん無理で、以下のように条件を設定しています。
  • MPEG2 PS (ISO13818-2) に準拠
  • 解像度は最高 320x240 (QVGA) まで
  • フレームレートは30fps固定
  • プログレッシブ形式限定
  • フレームタイプは I と P のみ許可
などです。
実は、これをmakeで出したくて前回のMTM06に参加してました。もちろん完成してませんでしたが^^;
会場で見に来てくれた方に次回こそは完成品持ってきます!なんて言っちゃったので頑張って作らないとw

というわけで、これから何回かに分けて製作の様子を公開していこうと思います。
実機で走るレベルまで達成したら、ソースは公開するつもりです。お楽しみに。(MPEG2はライセンス問題とかグレーなところがありますが、趣味でだれでも使えるようオープンにして、いろんな人に使ってもらってこそ取り組んだ甲斐があるので...)

今回は取り組みの紹介まででしたー。

このアーカイブについて

このページには、過去に書かれたブログ記事のうちコーデックカテゴリに属しているものが含まれています。

前のカテゴリはオーディオです。

次のカテゴリはマイコンです。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。

ウェブページ

Powered by Movable Type 6.1.2