| デバイスファイル名 | マイナー番号の範囲 | 機能 |
|---|---|---|
| /dev/video | 0-63 | ビデオキャプチャのためのデバイス |
| /dev/radio | 64-127 | AM/FM ラジオ |
| /dev/vtx | 192-223 | Teletext チップ |
| /dev/vbi | 224-239 | VBIの生データ(Intercast/Teletext) |
Video4Linuxを利用するプログラムは、まずデバイスファイルをオープンし、利用したい機能を探し出します。機能の検索で各インターフェースが何をサポートしているのかが分かります。このAPIはビデオキャプチャーカードのためだけに定義されました。ラジオカードの場合にはこのサブセットが用いられます。Teletextのインターフェースには既に定義されているVTX APIを利用します。
struct video_capability {
| char | name[32] | このデバイスの本来の名前 |
| int | type | デバイスのタイプ |
| int | channels | radio/tv の入力ソースの数 if appropriate |
| int | audios | オーディオデバイスの数 if appropriate |
| int | maxwidth | 最大のキャプチャ幅(単位:ピクセル) |
| int | maxheight | 最大のキャプチャ高さ(単位:ピクセル) |
| int | minwidth | 最小のキャプチャ幅(単位:ピクセル) |
| int | minheight | 最小のキャプチャ高さ(単位:ピクセル) |
type の項目はデバイスの機能に関する情報がフラグとして列記されています。
これには次のものがあります。
#つまり以下の値の論理和で表されます。
| 名前 | 説明 |
|---|---|
| VID_TYPE_CAPTURE | メモリ上にキャプチャする機能がある |
| VID_TYPE_TUNER | なんらかの形式のチュナーがある |
| VID_TYPE_TELETEXT | teletextの機能がある |
| VID_TYPE_OVERLAY | フレームバッファ上にイメージをオーバーレイする機能がある |
| VID_TYPE_CHROMAKEY | クロマキーでオーバーレイする機能がある |
| VID_TYPE_CLIPPING | オーバーレイのクリッピングをする機能がある |
| VID_TYPE_FRAMERAM | オーバーレイはフレームバッファのメモリを上書きする機能がある |
| VID_TYPE_SCALES | イメージのスケーリングをする機能がある |
| VID_TYPE_MONOCHROME | キャプチャはグレースケールのみである |
| VID_TYPE_SUBCAPTURE | イメージの一部分のみをキャプチャできる |
キャプチャーデバイスが返して来る最小と最大のサイズは、その範囲内で組合せ可能な全ての高さと幅の割合やサイズが使えるわけではありません。
キャプチャーサイズを設定する場合、要求されたサイズを越えない範囲で可能な最大のサイズに設定されます。
例えば quickcam では 3つの固定的な設定しか出来ません。
#取り込み領域は、NTSCとかPAL等のTVの入力信号のタイプによっても変わります。
#後述の ioctl で TV信号のタイプを変更する場合には注意して下さい。
VIDIOCSFBUF ioctl でキャプチャーデバイスのためにフレームバッファのパラメータを設定します。キャプチャカードがフレームバッファへの直接の書き込みを サポートしていない場合、この ioctl は利用できません。 VIDIOCGFBUF ioctl は現在設定されているパラメータを返します。 どちらの場合でも struct video_buffer を使ってパラメータを受渡しします。
struct video_buffer {
| void* | base | バッファの物理ベースアドレス |
| int | height | フレームバッファの高さ |
| int | width | フレームバッファの幅 |
| int | depth | フレームバッファのデプス |
| int | bytesperline | 次の同じ横位置までのメモリ上でのバイト数 |
これらの値はフレームバッファの物理的なレイアウトを反映させなければ
いけないことに注意して下さい。
実際に表示されている領域は実際のフレームバッファより小さい事もあります。
実際、XFree86 ではこれは普通の事です。
XFree86 の DGAエクステンションで、この ioctl で設定するパラメータを得
ることが出来ます。
ベースアドレスをNULLに設定する事で、フレームバッファへアクセスをする方法が
無い事を示せます。
# XFree86 DGA は プログラムが、X サーバ経由ではなく、直接フレームバッファ
# に描画するのをサポートするために加えられた拡張機能です。
struct video_window {
| __u32 | x | Xウインドウでの X 座標 |
| __u32 | y | Xウインドウでの Y 座標 |
| __u32 | width | キャプチャする幅 |
| __u32 | height | キャプチャする高さ |
| __u32 | chromakey | クロマキーの値(ホストオーダでのRGB32の値) |
| __u32 | flags | 追加キャプチャーフラグ |
| struct video_clip * | clips | クリッピングする長方形のリスト(設定のみ) |
| int | clipcount | クリッピング長方形の数(設定のみ) |
クリッピング長方形は配列で渡します。クリッピング長方形の各要素には 次の項目があります。
struct video_clip {
| __s32 | x | スキップする長方形のX座標 |
| __s32 | y | スキップする長方形のY座標 |
| __s32 | width | スキップする長方形の幅 |
| __s32 | height | スキップする長方形の高さ |
| #struct video_clip * | next | アプリケーション 側で自由に使って構いません、設定しても、しなくても影響はありません |
単にキャプチャ領域を設定しただけでは、キャプチャリングは有効に なりません。 VIDIOCCAPTURE ioctl で1を設定することにより、 オーバーレイキャプチャリングを始めます。そして0を設定することにより、 止める事ができます。
キャプチャーデバイスによっては、実際に見えている領域の一部を キャプチャできるものもあります。この場合、VIDEO_TYPE_SUBCAPTURE が 設定されています。 video_capture構造体で、取り込みの領域とレートを指定します。 video_capture構造体には次の項目があります。
struct video_capture {
| __u32 | x | 取り込みの領域のX座標 |
| __u32 | y | 取り込みの領域のY座標 |
| __u32 | width | 取り込みの領域の幅 |
| __u32 | height | 取り込みの領域の高さ |
| __u16 | decimation | 取り込みレート |
| __u16 | flags | 取り込むときのフラグ |
取り込むときのフラグ(flags)には次のものがあります
| 名前 | 説明 |
|---|---|
| VIDEO_CAPTURE_ODD | 奇数フレームのみをキャプチャーする |
| VIDEO_CAPTURE_EVEN | 偶数フレームのみをキャプチャーする |
VIDIOCSCHAN ioctl は int の引数を渡す事により、キャプチャする入力
を切替えます。色の設定や、チューニングに関する設定は同時には渡せません。
呼出側で、チャンネル毎にこれらを管理し設定し直して下さい。(ビデオ入力毎に
別々の設定を保存するのは理にかなっています。)
#すこし間違ってます。VIDIOCSCHANの引数は int ではなく、struct video_channel* です。
#channel と、norm を正しく設定してVIDIOCSCHAN ioctl を呼んで下さい
#struct video_pictureは全体で一つしかありません。
#ユーザプログラムの方でビデオソース毎に管理した方がよいでしょう。
struct video_channel には次の項目があります。
struct video_channel {
| int | channel | チャンネル番号 |
| char | name | 入力の名前 - カードの入力ラベルが反映されるのが望ましい。 |
| int | tuners | この入力につながっているチュナーの数 |
| __u32 | flags | チュナーの設定 |
| __u16 | type | 入力のタイプ(もし分かっている場合のみ) |
| __u16 | norm | このチャンネルのTV信号のモード |
flagsの値は、
| VIDEO_VC_TUNER | チャンネルにはチュナーがある |
| VIDEO_VC_AUDIO | チャンネルにはオーディオがある |
| VIDEO_VC_NORM | チャンネルにはTV信号のモードの設定がある |
types の値は
| VIDEO_TYPE_TV | 入力はTVである |
| VIDEO_TYPE_CAMERA | 入力はカメラである |
struct video_picture には次の項目があります。
struct video_picture {
| __u16 | brightness | 明るさ |
| __u16 | hue | 色合い(カラーの場合のみ) |
| __u16 | colour | 色の濃さ(カラーの場合のみ) |
| __u16 | contrast | コントラスト |
| __u16 | whiteness | ホワイトネス (グレースケールの場合のみ) |
| __u16 | depth | キャプチャーデプス(フレームバッファのデプスと合わせる必要があるでしょう) |
| __u16 | palette | パレット |
パレットの値には次のものがあります
| VIDEO_PALETTE_GREY | グレイスケール(255が白). |
| VIDEO_PALETTE_HI240 | BT848の 8bitカラー |
| VIDEO_PALETTE_RGB565 | RGB565 を16 bitにパック |
| VIDEO_PALETTE_RGB555 | RGB555 を16 bitにパック、一番上のビットは未定義 |
| VIDEO_PALETTE_RGB24 | RGB888 を 24bitにパック |
| VIDEO_PALETTE_RGB32 | RGB888 を 下位3バイトにいれた32bit. 一番上のバイトは未定義 |
| VIDEO_PALETTE_YUV422 | YUV422のビデオのフォーマット - 4bits を Y, 2bits を U, 2bits を Vに割り当てた 8bits |
| VIDEO_PALETTE_YUYV | Describe me |
| VIDEO_PALETTE_UYVY | Describe me |
| VIDEO_PALETTE_YUV420 | YUV420 capture |
| VIDEO_PALETTE_YUV411 | YUV411 capture |
| VIDEO_PALETTE_RAW | RAW capture (BT848) |
| VIDEO_PALETTE_YUV422P | YUV 4:2:2 Planar |
| VIDEO_PALETTE_YUV411P | YUV 4:1:1 Planar |
チュナーについての情報はVIDIOCGTUNER ioctlを使って
struct video_tunerに得る事が出来ます。
チュナーの番号を設定して ioctl を出せば、中身を埋めてきます。
チュナーの切替えはVIDIOCSTUNERで使いたいチュナーの
番号(int)の引数を与える事で出来ます。
#VIDIOCSTUNERの引数は int ではなく、struct video_tuner* です。
#tuner と、mode を正しく設定して VIDIOCSTUNER ioctl を呼んで下さい
#また、VIDIOCSCHANで設定してからでないと VIDIOCGTUNERに失敗します。
struct video_tunerには次の項目があります。
struct video_tuner {
| int | tuner | チュナーの番号 |
| char | name | チュナーの本来の名前 (例 FM/AM/TV) |
| ulong | rangelow | 設定可能な最低周波数 |
| ulong | rangehigh | 設定可能な最高周波数 |
| __u32 | flags | チュナーのフラグ |
| __u16 | mode | TV信号のモード(関連する場合のみ) |
| __u16 | signal | 信号の強度(分かる場合) - 0-65535の間 |
flagsには次のものがあります
| VIDEO_TUNER_PAL | PAL を受信する機能がある |
| VIDEO_TUNER_NTSC | NTSC を受信する機能がある |
| VIDEO_TUNER_SECAM | SECAM を受信する機能がある |
| VIDEO_TUNER_LOW | 周波数の設定は詳細モードである |
| VIDEO_TUNER_NORM | TV信号のモードを設定できる |
| VIDEO_TUNER_STEREO_ON | チュナーのオーディオがステレオになっている |
mode には次のものがあります。
| VIDEO_MODE_PAL | PAL のモードになっている |
| VIDEO_MODE_NTSC | NTSC のモードになっている |
| VIDEO_MODE_SECAM | SECAM のモードになっている |
| VIDEO_MODE_AUTO | 自動的にスイッチするモードかモードが設定できない場合 |
チュナーに設定する周波数は、unsigned の 32bit の値で、実際の周波数の 1/16 MHz の値です。ただし、VIDEO_TUNER_LOW のフラグが設定されて いる場合には、実際の周波数の 1/16 KHzの値です。 現在の周波数は unsigned long で管理されていて、VIDIOCGFREQ ioctl で取り出せ、VIDIOCSFREQ ioctl で設定できます。
struct video_audioには次の項目があります。
struct video_audio {
| int | audio | チャンネル番号 |
| __u16 | volume | ボリューム |
| __u16 | bass | bass |
| __u16 | treble | treble |
| __u32 | flags | オーディオチャンネルの設定 |
| char | name[16] | 本来の名前 |
| __u16 | mode | オーディオ入力のモード |
| __u16 | balance | 左右のバランス |
| __u16 | step | ハードウエアで設定可能な最小ステップ |
オーディオチャンネルの設定の flags には次のものがあります
| VIDEO_AUDIO_MUTE | ミュートされている |
| VIDEO_AUDIO_MUTABLE | ミュートの出来る |
| VIDEO_AUDIO_VOLUME | ボリュームのコントロールが出来る |
| VIDEO_AUDIO_BASS | bassのコントロールが出来る |
| VIDEO_AUDIO_TREBLE | trebleのコントロールが出来る |
| VIDEO_AUDIO_BALANCE | バランスのコントロールが出来る |
オーディオ入力のモード
| VIDEO_SOUND_MONO | モノラルの信号 |
| VIDEO_SOUND_STEREO | ステレオの信号(NICAM for TV) |
| VIDEO_SOUND_LANG1 | European TV alternate language 1 |
| VIDEO_SOUND_LANG2 | European TV alternate language 2 |
別の方法の取り込み方として、デバイスがサポートしていれば、 mmap システムコールを経由した取り込みが行えます。 mmap システムコールを経由して取り込むにはまず最初に、 取り込み領域やデプスを設定し、VIDIOCGMBUF ioctlを使います。 この ioctl は、mmap するべきバッファのサイズとフレーム毎のオフセット を答えてくれます。 サポートされるフレームの数はデバイスによりますが、大抵の場合は1フレームのみでしょう。
video_mbuf structure には次の項目があります。
| size | マップするバイト数 |
| frames | フレームの数 |
| offsets | フレーム毎のオフセットバイト数 |
mmap を行ったら、VIDIOCMCAPTURE ioctl で、取り込みたいイメージのサイズ を設定します(この領域は、最初に行った設定と同じか、小さくなくてはいけ ません)。 設定が終るとメモリマップドされたバッファにキャプチャが始まります。 ユーザプログラムがバッファを読み終ったら、VIDIOCSYNC ioctl を呼んで、 そのフレームをフリーし、キャプチャを続けさせなければいけません。 メモ:VIDIOCSYNC はフリーしたいフレーム番号を引数にとります。 バッファが unmap されるか、全てのバッファが埋まると、キャプチャリン グは止まります。 ドライバにメモリと画面の両方にキャプチャする用設定した場合、 ドライバは出来る限りの事をします。つまり、メモリマップされた領域 にキャプチャ出来なかったフレームが画面に表示されます。
最後に紹介するioctlは、一つのデバイスが複数のデバイスドライバを使って いる時に、同じデバイスにつながっているデバイスを知るためのものです。 (例えば、video0 は、vbi0 にいつも関連があるとは限りませんので、 intercast の表示プログラムは混乱するかもしれません) VIDIOCGUNIT ioctl は、関連のあるデバイスがある場合にそのマイナー番号 を教えてくれます。 video_unit 構造体には次の項目があります
struct video_unit {
| int | video | ビデオキャプチャデバイス |
| int | vbi | VBI キャプチャデバイス |
| int | radio | ラジオデバイス |
| int | audio | オーディオミキサ |
| int | teletext | Teletextデバイス |