IDE-RAID カードである Promise FastTrak66 を利用して YUV16, 704x480, 29.97 fps に必要な 20M/sec の転送速度を確保し、ドロップフレームの発生しないキャプチャ環境を構築する。
Promise FastTrak66, IBM DJNA372200 x 2, により RAID-0 を構築。20M/sec を超えるデータ書きこみ速度を持つドライブを準備する。
MV-300 から YUV16 無圧縮形式、704x480, 29.97 fps 指定の設定にて、上で構築した RAID ドライブにビデオキャプチャを行い、ドロップフレーム無しの環境が構築可能か検証する。
FastTrak66 + (DJNA372200 x 2) RAID-0 の構成で、どれだけのデータ書きこみ速度が達成できるかを確認するため、HDBench2.61 を利用し 512M の設定でディスクのベンチマークを取る。
結果、READ: 34970 KB/s, WRITE: 32527 KB/s と充分な書きこみ速度を達成できている事が確認できた。
失敗。MV-300 の PCI コントローラ Zoran ZR36067 の DMA 転送能力の上限がボトルネックとなり、YUV16 での 704x480 29.97 fps ドロップフレーム無しのキャプチャは不可能であることが判明した。
オーバレイオフ、29.97 fps 設定で 4 秒、8 秒、16 秒、32 秒間のキャプチャを行い各条件でのドロップフレーム数を記録し平均を取ってフレームレートの設定値から引き、実効 fps を求める。
使用ソフト | ドロップフレーム | ||||
4 秒 | 8 秒 | 16 秒 | 32 秒 | 平均 [1/秒] | |
VidCap32 | 42 | 82 | 166 | 332 | 10.37 |
VideoShot | 42 | 82 | 166 | 334 | 10.40 |
表1 無圧縮キャプチャでの欠落フレーム |
上記測定値より 実効 fps は 19.59 fps と求まる。またキャプチャ中 システムモニタ で CPU 負荷を記録していたが 50% を超えることは無かった。
まず、キャプチャ時の CPU 負荷の低さから、この結果は FastTrak66 がボトルネックとなっているわけでは無いと判断する。何故ならば、ベンチマーク時やファイルコピー時など、FastTrak66 で構成した RAID に対して無制限にデータを書きこむ場合、基本的に CPU 負荷は 100% に張り付き、余裕の無い状況まで行くからである。
では、何が原因かと考えると、MV-300 の使用している PCI コントローラ ZR36067 がボトルネックとなっていると考える。
その根拠として、ZR36067 のデータシート(PDF)1 ページ目にある "Bidirectional DMA transfer of compressed data up to 11M bytes/sec" という記述がある。現実には 12.63M bytes/sec の転送速度が達成できているが、この数字はデータシートの記述と非常に近い。またここに限界があるとすれば Motion JPEG の AVI ファイルをハードウェアを通して再生した場合にインタレースが目立つ原因も理解できる。
Y = 480 クラスの動画の無圧縮キャプチャは(ソフトウェア圧縮キャプチャも) MV-300 を利用する限り不可能である。また ZR36067 を利用するビデオキャプチャカードではどれも同じ問題点があると推測できるので、Buz & MJ-600 でもこれらの症状は同様であると判断する。
以上の結果より、無圧縮キャプチャも選択肢に入れたい場合、ZR36067 を利用したカードは避けるべきであると結論できる。また、ハードウェア圧縮をサポートしたカードの場合、無圧縮でのキャプチャは期待しない方が賢明であると判断する。何故ならば、ハードウェア圧縮を行うキャプチャカードの場合、もともとデータ転送速度がそれほど必要とならないので PCI バスを通した DMA 転送能力に劣る可能性が高いからである。
さらに、704x480 クラスの Motion JPEG AVI をハードウェアで展開して表示する場合は、PC のディスプレイ上で再生して確認するよりも、ビデオ出力を通して TV に表示させた方が動画の動きについて適切な判断が出来ると考える。
704x480 での YUV 無圧縮キャプチャは失敗したが、MV-300 で無圧縮キャプチャを行った場合どれだけのフレームレートが出せるのかを 352x240 のサイズで YUV 無圧縮キャプチャを行い測定する。(ハードの性能ではなく、キャプチャドライバの性能を測る)
MV-300 から YUV16 無圧縮形式、352x240, 29.97 fps の設定でビデオキャプチャを行い、ドロップフレームを測定、実効 fps を算出する。
FastTrak66 の実験時と同一
FastTrak66 の実験時と同様に測定を行い次の値を得た。
使用ソフト | ドロップフレーム | ||||
4 秒 | 8 秒 | 16 秒 | 32 秒 | 平均 [1/秒] | |
VidCap32 | 0 | 1 | 4 | 10 | 0.25 |
VideoShot | 2 | 3 | 4 | 9 | 0.30 |
表2 352x240 キャプチャでの欠落フレーム |
これらのデータから実効 fps は 29.70 と測定される。29.97 fps は 352x240 でも達成することが出来なかった。
YUV16 形式 352x240 29.97fps で必要となるデータ転送速度は 5M bytes/sec 程度であるため ZR36067 の DMA 転送速度範囲内で収まり、理論上はドロップフレームが発生しないはずである。しかし現実には 2 秒で 1 枚程度の欠落が発生してしまっている。
Motion JPEG 形式で取り込む場合は 29.97 fps を達成できる事から、これはハードウェアの問題などではなく、単純に Video for Windows キャプチャドライバの作り込みが甘いために欠落が発生していると考える。
MV-300 は Motion JPEG キャプチャカードであり、Motion JPEG 以外のキャプチャ形式を選択した場合に問題が発生するのは仕方のないことなのかもしれない。しかし、それでもこれはひどすぎるのではないだろうか。
今後ドライバのバージョンアップなどでこの問題が解決する可能性もあるが、少なくとも現状では MV-300 には問題が多く購入を勧めることが出来ない。MV-300 の購入を考えているのならば、もう少し待った方が良いというのが私の考えである。
YUV422 16bit 形式でのキャプチャでは上記のような結果となったが、より負荷の高い RGB 24bit 形式でのキャプチャを行い MV-300 の限界性能を見極める。
RGB24 形式、704x480 29.97 fps の設定で FastTrak66 + DJNA372200 x 2 の RAID にキャプチャを行いドロップフレームを計測する事で実効 fps 及びデータ転送速度を測定する。
FastTrak66 の実験時と同一
FastTrak66 の実験時と同様に測定を行い次の値を得た。
使用ソフト | ドロップフレーム | ||||
4 秒 | 8 秒 | 16 秒 | 32 秒 | 平均 [1/秒] | |
VidCap32 | 42 | 86 | 170 | 336 | 10.57 |
VideoShot | 42 | 86 | 168 | 340 | 10.60 |
表3 RGB24 キャプチャでの欠落フレーム |
これらの計測値より実効 fps は 19.39 fps と推定される。この時、RGB24 形式でのデータレートは 18.75 M bytes/sec となる。
まず、YUV422 16bit 形式でキャプチャしたときと比較し、実効 fps は 19.59 から 19.39 に落ちただけと、16 bit データから 24 bit データへの増加(1.5 倍)と比較して変化が小さい事が指摘できる。
このためデータ転送速度は 12.63 M bytes/sec から 18.75 M bytes/sec と約 1.5 倍に増えている。
この結果から、FastTrak66 で構築した RAID は YUV16 形式でキャプチャを行った際にも十分な余裕があった事が言える。
では、なぜ RGB24 形式に変更しても fps が 2/3 に落ちなかったのかということを考えると、これは MV-300 で RGB24 形式のキャプチャを行った場合、MV-300 から送り出されるデータは YUV16 のままで、それを CPU で RGB に色空間変換を行ってからハードディスクに出力しているためであると考える。
この結果から、ZR36067 の DMA データ転送速度に制限があり、無圧縮キャプチャが上手く働かないという説の補強材料を得る事ができた。
352 x 240 キャプチャ実験 でも 29.7 fps でしかキャプチャを行う事ができなかったが、そもそも NTSC の信号元として利用している TV のビデオ出力は 29.97 fps で送信しているのか確認する。
今までキャプチャに利用していた NTSC 信号をサウンドカードのアナログ入力から 48000 Hz 16bit モノラル PCM 形式で録音し、記録された PCM の波形を観察する事でキャプチャに利用している NTSC 信号の fps を調査する。
TV から出力されているビデオ信号は、59.94 Hz で、29.97 fps であることが確認できた。
録音できた PCM データは次の図1のようになっており、丸で囲んだ部分が垂直同期信号である。
図1 NTSC 信号 |
この垂直同期信号について、その間隔をしらべると、1つ目の垂直同期信号は 116 サンプルにあり、2つ目の垂直同期信号は 917 サンプルにあるので、その間隔は 801 サンプルである。
同様に、50 個の垂直同期信号についてその間隔の平均を取ると、800.8 サンプルとなった。これは 48000 Hz でサンプリングしたデータなので fps は次の式で計算できる。
48000 / 800.8 = 59.94
59.94 / 2 = 29.97
サンプルレートを垂直同期の間隔で割る事により、1秒間のフィールド数を求めることができ、これを2で割ったものがフレームレートとなる。
この結果から、少なくともキャプチャカードに入る段階のビデオ信号は 29.97 fps であり、NTSC 信号の規格に合致していることを確認できた。
Linux 用ドライバを作成し、AverMedia 製ドライバよりも安定かつ高画質なキャプチャが可能か検討する。
The Iomega Buz under Linux で公開されている Iomega Buz のドライバを改変して MV-300 を Linux で利用できるようにする。
現在実験中。とりあえず MJPEG 形式による動画のキャプチャに関してはほぼ不満の無い状況までドライバの完成度が上がっている。しかし、未だに Linux 上での再生はできない問題点が解決できていない。
kazhiro@a2.ocv.ne.jp まで、「どの段階で失敗したのか」「表示されたエラーメッセージ」を添えてメールをください。私に判ることでしたら助言します。
以下に現在の Linux 用ドライバで取りこんだ AVI ファイルから、Windows 上で Pegasus Imaging Corp. の PICVideo Codec を利用してデコードした後 BMP から JPEG に再圧縮した画像をサンプルとして載せる。
いずれも SONY の CM より抜き出した 1 フレームであるが、一応引用として一般に認められる範囲内に収まっていると考えている。
サンプル1 自然画 フルサイズ |
|
サンプル2 CG フルサイズ |
|
サンプル3 フラッシュ フルサイズ |
MV-300 では PC の使用している電源やメインボードによって正方ピクセルで波打ち(水平)ノイズが発生する事がある。
AverMedia 製ドライバの動作時に KS0127 のレジスタ値を読みこみ、正方ピクセルと CCIR で比較を行ってこの原因がハードウェアにあるのか、ドライバにあるのかを考察する。
Morry's Un'Gramming Page で公開されている PhysMap.c と V4L の I2C 通信コードを参考に、Windows 上で一般アプリケーションから ZR36067 のメモリ領域を直接マッピングし KS0127 のレジスタを読み出すプログラムを作成。それを用いて正方ピクセル時と CCIR 時のレジスタの変化を比較する。
比較の結果、特にノイズの原因となりそうな値があれば、ドライバの欠陥と判断する。
正方ピクセルと CCIR でレジスタの値が異なるのは、次の表で示す場所だけであった。
Addres | BitMap | Default | Composit | S-Video | |||||||||
7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | CCIR | Square | CCIR | Square | ||
0x01 | POWDN | VSE | HFSEL[1:0] | XT24 | PIXSEL | MNFMT | IFMT | 0x2C | 0x6F | 0x6B | 0x6F | 0x6B | |
0x07 | HS1B[8:1] | 0x00 | 0xC8 | 0xC9 | 0xC8 | 0xC9 | |||||||
0x08 | HS1E[8:1] | 0x00 | 0xC8 | 0xC9 | 0xC8 | 0xC9 | |||||||
0x0C | HAVB[10:8] | HAVE[10:8] | HS1BE0 | HS2BE0 | 0x00 | 0x02 | 0x00 | 0x02 | 0x00 | ||||
表4 違いのあったレジスタ |
このうち、0x01 の PIXSEL は正方ピクセルと CCIR を切り替えるためのものであり、ノイズに影響するとは考えられない。0x07, 0x08, 0x0C も水平同期信号の位置を指定するために使用されるレジスタなので、同じくノイズには影響しないと判断する。
少なくとも、KS0127 のレジスタに関しては、ドライバが波打ちノイズの原因であると結論するための証拠を得ることはできなかった。
AverMedia 製ドライバ動作時の KS0127 の全レジスタ値を下表5に示す。各レジスタの意味については、データシート を参照のこと。
Addres | BitMap | Default | Composit | S-Video | |||||||||
7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | CCIR | Square | CCIR | Square | ||
0x00 | CHIPID | VBIFLG | NOVID | FFRDET | PALDET | CDET | HLOCK | CLOCK | -- | 0xA1 | 0xA1 | 0xA1 | 0xA1 |
0x01 | POWDN | VSE | HFSEL[1:0] | XT24 | PIXSEL | MNFMT | IFMT | 0x2C | 0x6F | 0x6B | 0x6F | 0x6B | |
0x02 | AGCGN | VALIGN | AGCOVF | AGCFRZ | INSEL[3:0] | 0x20 | 0x41 | 0x41 | 0x48 | 0x48 | |||
0x03 | VMEN | TSTGE1 | 0 | TSTGPK | TSTGPH | TSTGFR[1:0] | TSTGEN | 0x00 | 0x44 | 0x44 | 0x44 | 0x44 | |
0x04 | EAV | 0 | CKDIR | INPSL[1:0] | SYNDIR | Y1MHZ | GPPORT | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | |
0x05 | HAVB[7:0] | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | |||||||
0x06 | HAVE[7:0] | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | |||||||
0x07 | HS1B[8:1] | 0x00 | 0xC8 | 0xC9 | 0xC8 | 0xC9 | |||||||
0x08 | HS1E[8:1] | 0x00 | 0xC8 | 0xC9 | 0xC8 | 0xC9 | |||||||
0x09 | HS2B[8:1] | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | |||||||
0x0A | HS2E[8:1] | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | |||||||
0x0B | AGC | 0x60 | 0x60 | 0x60 | 0x60 | 0x60 | |||||||
0x0C | HAVB[10:8] | HAVE[10:8] | HS1BE0 | HS2BE0 | 0x00 | 0x02 | 0x00 | 0x02 | 0x00 | ||||
0x0D | OUTHIZ | FSEC | 0 | CIFCMP[1:0] | 0 | 0 | 0 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | |
0x0E | DIRB | DATAB[2:0] | DIRA | DATAA[2:0] | 0x00 | 0x0f | 0x0f | 0x0f | 0x0f | ||||
0x0F | 0 | UNIT | RGBH | PED | HYBWR | CTRAP | HYPK[1:0] | 0x00 | 0x16 | 0x16 | 0x12 | 0x12 | |
0x10 | CONT[7:0] | 0x00 | 0x09 | 0x09 | 0x09 | 0x09 | |||||||
0x11 | BRT[7:0] | 0x00 | 0x04 | 0x04 | 0x04 | 0x04 | |||||||
0x12 | ACCFRZ | PALM | PALN | CBW | CORE[1:0] | CKILL[1:0] | 0x08 | 0x0A | 0x0A | 0x0A | 0x0A | ||
0x13 | CDLY[3:0] | SCHCMP[3:0] | 0x00 | 0xC0 | 0xC0 | 0xC0 | 0xC0 | ||||||
0x14 | FSCDET | SECDET | CDMLPF | CTRACK | MNFSC[1:0] | MNSECAM[1:0] | -- | 0x00 | 0x00 | 0x00 | 0x00 | ||
0x15 | SAT[7:0] | 0x00 | 0x04 | 0x04 | 0x04 | 0x04 | |||||||
0x16 | HUE[7:0] | 0x00 | 0xFB | 0xFB | 0xFB | 0xFB | |||||||
0x17 | MNYCMB | YCMBCO[2:0] | VRT2X | VCTRL[2:0] | 0x00 | 0x30 | 0x30 | 0x30 | 0x30 | ||||
0x18 | HYLPF[2:0] | HYBWI | HYDEC | VSCLEN[1:0] | 0 | 0x00 | 0x14 | 0x14 | 0x14 | 0x14 | |||
0x19 | MNCCMB | CCMBCO[2:0] | ACMBEN | VYBW | EVAVEV | EVAVOD | 0x00 | 0x5B | 0x5B | 0x5B | 0x5B | ||
0x1A | HSCL[6:0] | CMBMOD | 0x00 | 0xFF | 0xFF | 0xFF | 0xFF | ||||||
0x1B | HSCL[14:7] | 0x00 | 0xFF | 0xFF | 0xFF | 0xFF | |||||||
0x1C | VSCL[5:0] | ACMBCO | ACMBRE | 0xFC | 0xFC | 0xFC | 0xFC | 0xFC | |||||
0x1D | VSCL[13:0] | 0xFF | 0xFF | 0xFF | 0xFF | 0xFF | |||||||
0x1E | 0 | 0 | OENC[1:0] | OFMT[3:0] | 0x20 | 0x10 | 0x10 | 0x10 | 0x10 | ||||
0x1F | VSVAV | EVAND[1:0] | EVHS1 | EVHAV | EVEHAV | EVAVG | - | 0x00 | 0xE2 | 0xE2 | 0xE2 | 0xE2 | |
0x20 | VBCVBS | VYFMT[1:0] | VBINSRT | ODDEN | EVENEN | ODDOS[1:0] | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | ||
0x21 | b0 | b1 | b2 | b3 | b4 | b5 | b6 | P2 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 |
0x22 | b0 | b1 | b2 | b3 | b4 | b5 | b6 | P1 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 |
0x23 | VBIL3 | VBIL2 | VBIL1 | VBIL0 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | ||||
0x24 | VBIL7 | VBIL6 | VBIL5 | VBIL4 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | ||||
0x25 | VBIL11 | VBIL10 | VBIL9 | VBIL8 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | ||||
0x26 | VBIL15 | VBIL14 | VBIL13 | VBIL12 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | ||||
0x27 | TTFRAM[7:0] | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | |||||||
0x28 | - | - | 0 | 0 | - | - | - | - | -- | 0x0B | 0x0B | 0x0B | 0x0B |
0x29 | TSTCLC | TSTCGN | 0 | TSTCFR | UOFFST[5:4] | VOFFST[5:4] | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | ||
0x2A | UOFFST[3:0] | VOFFST[3:0] | 0x33 | 0x33 | 0x33 | 0x33 | 0x33 | ||||||
0x2B | UGAIN[7:0] | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | |||||||
0x2C | VGAIN[7:0] | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | |||||||
0x2D | VAVB[6:1] | VAVOD0 | VAVEV0 | 0x23 | 0x0B | 0x0B | 0x0B | 0x0B | |||||
0x2E | VAVE[8:1] | 0x82 | 0x00 | 0x00 | 0x00 | 0x00 | |||||||
0x2F | 0 | 0 | DMCTL[1:0] | CGTC[1:0] | CFTC[1:0] | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | |||
0x30 | EVAVPL | VSPL | ODDPL | HAVPL | EHAVPL | HS2PL | VAVPL | HS1PL | 0x00 | 0x22 | 0x22 | 0x22 | 0x22 |
0x31 | YCRANG | VSINST | 1 | HSINST[1:0] | 1 | 0 | 0 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | |
0x32 | INVALY[7:0] | 0x10 | 0x10 | 0x10 | 0x10 | 0x10 | |||||||
0x33 | INVALU[7:0] | 0x80 | 0x80 | 0x80 | 0x80 | 0x80 | |||||||
0x34 | INVALV[7:0] | 0x80 | 0x80 | 0x80 | 0x80 | 0x80 | |||||||
0x35 | UNUSEY[7:0] | 0x10 | 0x10 | 0x10 | 0x10 | 0x10 | |||||||
0x36 | UNUSEU[7:0] | 0x80 | 0x80 | 0x80 | 0x80 | 0x80 | |||||||
0x37 | UNUSEV[7:0] | 0x80 | 0x80 | 0x80 | 0x80 | 0x80 | |||||||
0x38 | Reserved | -- | 0x00 | 0x00 | 0x00 | 0x00 | |||||||
0x39 | Reserved | -- | 0x00 | 0x00 | 0x00 | 0x00 | |||||||
0x3A | SHS1A[7:0] | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | |||||||
0x3B | SHS1B[7:0] | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | |||||||
0x3C | SHS1C[7:0] | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | |||||||
0x3D | ODDFST | VSALG | - | - | - | - | - | - | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 |
0x3E | -- | -- | VSDEL[5:0] | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | |||||
0x3F | - | - | EVAVY | UVDLEN | UVDLSL | REGUD | TASKB | CBWI | 0x00 | 0x04 | 0x04 | 0x04 | 0x04 |
表5 全レジスタ |