MPEGよりはずーっと簡単なので、なんとかなるでしょう.
とりあえず1フレームの絵をデコードするまでを追ってみましょう.
今回はVideoについてだけ見ていきます
参考文献 adaptec Digital Video Recording, cont.
オーム社 デジタルビデオ読本
まずデータ構造(テープの場合)を見てみましょう.
1フレーム = 10 DIF sequences ( = 10トラック)
1 DIF sequence = 135 DIF blocks(ビデオ) +3DIF blocks(ビデオAUX) + (その他 )
テープの場合
1 DIF block = 90 bytes = 2 bytes(sync) + 3bytes(ID) + 1bytes(ヘッダー) + 76bytes(ビデオデータ) + 8bytes(パリティ)
となっています.
これからビデオの転送レートが計算できます.
10トラック*138DIFblocks*76bytes* 8bits/byte * 29.97 = 25.146Mbps
(とadaptecのページでは計算してますが, ちょっと間違ってますね.)
となり良く見かける25Mbpsという数字が算出されます.
それではこれをデコードしていくことを考えます.
テープの場合、誤り訂正符号化が行なわれています.
ビデオデータはGF(2^8)のリードソロモン積符号(内符号と外符号の2回符号化を行なう)により通信路符号化されています.
内符号
(85, 77)符号により1つのDIFblock毎に符号化
外符号
(149,138)符号により 138DIFblocksを符号化
(D1,D2,D5, D7, デジベタ, MVDISC,DVD等でも同様のリードソロモン積符号化が行なわれてます.)
なおIEEE1394を介してデータ転送する際は誤り訂正符号化(リードソロモン積符号化)は行われません.
1394の場合DIF blockが以下の様になっています.
1 DIF block = 80 bytes = 3bytes(ID) + 1bytes(ヘッダー) + 76bytes(ビデオデータ)
ということで
10トラック*135DIFblocks*77 bytes
のデータが得られたとします。このデータから1フレームを復号しましょう.
そこでマクロブロックというものを考えます.
マクロブロックは 4つのYブロック+1つのCrブロック+1つのCbブロックで構成されます.
マクロブロックの総数はというと,
ブロックの大きさが8x8,DVの場合サンプリングが4:1:1,NTSCの画面サイズは720x480なので,
Y,Cr,Cbのブロック総数は
Y(輝度)のブロック総数は (720*480)/(8x8) =5400
Crのブロック総数は(180*480)/(8x8) = 1350
Cbのブロック総数は(180*480)/(8x8) = 1350
となり
したがってマクロブロックの総数は,
(5400+1350+1350)/6 = 1350
となる. よってマクロブロックの総数とDIFblocksの数が等しいことがわかります
この二つは対応関係があります.
(しかし1つのDIFblockからマクロブロックが再構成できるとはかぎらないということは読んでいけばわかるはず.)
DIFblockのはビデオデータ部分は
各ブロックを符号化したデータ
ヘッダー (1byte) +4つのYブロック(14bytes x4) +1つのCrブロック(10bytes) +1つのCbブロック(10bytes)
の77bytesとなります.
(1)ビデオセグメントを構成してアンパック
テープに記録する際にデシャッフルするのでシャッフルされた
5マクロブロックの組(ビデオセグメントと呼ぶ)をつくる.
またビデオセグメント毎に固定長とするためパッキングが行なわているので
それを元に戻す.
シャッフリングは以下の様に行なわれるのでこの逆を行なう
パッキングは以下の様に行なう.
(2)VLC(可変長符号化)されているのでこれを復号します.
VLCにはモデファイド2次元ハフマン符号化が使用されています.
0ランレングス符号を組み合わせた2次元ハフマン符号です.
MPEGでも同様の方式が使われています.
0の連続個数(run)とその後のDCT係数(amp)により
下記のテーブルのような符号長の符号語が割りあてられます.
テーブルに割りあてられてない場合は
(run, amp) = (run -1 ,0) + (0, amp)
と分割してテーブルに当てはめる
最後の0の連続はEOB符号(4bit)が付加されます.
(3)逆量子化
量子化は,ビデオセグメント毎の量子化器Noと各ブロック毎のクラスNoとブロック内のエリアNo
という3つのパラメータにより量子化の精度が以下のテーブルの様に決まるのでそれに
従って逆量子化を行なう.
量子化の粗度は下のテーブルで定まった数で除算する(シフトを行なう)ことによって決まる.
クラス3のときはさらにAC係数を2で割る(シフトさせる).
(量子化時のパラメーター選択がエンコード時の画質にいちば影響与えそうです.)
(4)IDCT
DVではDCTの際,二つのモード 静止モードと動きモードがある.
静止モードでは8x8のブロックでDCTを行なう.
動きモードでは、奇数ライン、偶数ラインごと各4x8でDCTを行なう.
そして動きモードでは4x8の同じ次数の係数同士での和と差を計算して
8x8の領域に格納する.こうすることによって静止モードと同様に扱かう
ことができる.
どっちのモードで符号化おこなったかは符号化したデータに書いてあるのでそれを見てIDCTする.
(ここのモード選択のところでもコーデックのクセが出そうですね.)
を繰り換えして行けば,すべてのブロックのY,Cr,Cbの情報が得られて
1フレームの画像がデコードできるはずです.
デコード時に差が出るとは思えないんですけど差がでる原因はなんなんでしょうかね.
(YUV-RGB変換がダメなんでしたっけ?)
ということでdviewとかのソースもある程度は理解できるようになりました。
DVの特徴は,
○ シャッフリングをすることにより情報量を均一化.
○ 量子化の精度を選ぶのに自由度がある.
ってことだと思いました.
おわり.
(なお、図はオーム社 図解デジタルビデオ読本 久保田幸雄 編著の
P48, P58, P53, P57 の各ページより引用させていただきました. )
次回はSMPTE 314Mを参考に実際の処理を追ってみましょう.
感想とかコメントあったらメールしてください.
update
2000.09.27 加筆修正はなるべくしないこととする. でもちゃんとしたHTMLにはしたい.
(c) eggman ,2000
|