"#"で始まる行は翻訳者のコメントです。

デバイスファイル

Video4Linux には次のデバイスファイルがあります。 これらはキャラクタ型のデバイスであり、"/dev/bttv" として知られていま すが、普通 /dev/bttv は /dev/video0 へのシンボリックリンクになっていま す。
# bttv,bttv?, bttv-fm, bttv-fm?, bttv-vbi, bttv-vbi? は過去の名前です
# 現在これらは互換性の為に残っています。

デバイスファイル名マイナー番号の範囲機能
/dev/video0-63ビデオキャプチャのためのデバイス
/dev/radio64-127AM/FM ラジオ
/dev/vtx192-223Teletext チップ
/dev/vbi224-239VBIの生データ(Intercast/Teletext)
#Teletext とは文字放送です
#Intercastは Intel が提唱しているVBIを利用した、TVとインターネットを 融合させたシステムです
#VBI とは Vertical Blanking Interval の略で、テレビ信号の垂直帰線消去期間の部分です。
#つまり画面には見えない部分ですが、この部分を利用してデジタルデータが放送されています。
#日本では、文字放送、Adams, BitCast等がVBIを利用した放送です。

Video4Linuxを利用するプログラムは、まずデバイスファイルをオープンし、利用したい機能を探し出します。機能の検索で各インターフェースが何をサポートしているのかが分かります。このAPIはビデオキャプチャーカードのためだけに定義されました。ラジオカードの場合にはこのサブセットが用いられます。Teletextのインターフェースには既に定義されているVTX APIを利用します。

機能の検索のIoctl

ビデオデバイスがサポートする機能に関する情報を得るにはVIDIOCGCAP ioctl を使います。 struct video_capability を ioctl に渡すと中身を埋めて 返してくれます。struct video_capabilityには以下にあげる項目が含まれています。

struct video_capability {
charname[32]このデバイスの本来の名前
inttypeデバイスのタイプ
intchannelsradio/tv の入力ソースの数 if appropriate
intaudiosオーディオデバイスの数 if appropriate
intmaxwidth最大のキャプチャ幅(単位:ピクセル)
intmaxheight最大のキャプチャ高さ(単位:ピクセル)
intminwidth最小のキャプチャ幅(単位:ピクセル)
intminheight最小のキャプチャ高さ(単位:ピクセル)
};

type の項目はデバイスの機能に関する情報がフラグとして列記されています。 これには次のものがあります。
#つまり以下の値の論理和で表されます。

名前説明
VID_TYPE_CAPTUREメモリ上にキャプチャする機能がある
VID_TYPE_TUNERなんらかの形式のチュナーがある
VID_TYPE_TELETEXTteletextの機能がある
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信号のタイプを変更する場合には注意して下さい。

フレームバッファ

キャプチャーカードから直接フレームバッファにデータを書かせるためには、 フレームバッファのベースアドレス、サイズ、構造をデバイスドライバに 教えておかなくてはなりません。 これは特権モードの ioctl であり、本当は Xサーバ自身が設定するべきものです。

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 サーバ経由ではなく、直接フレームバッファ
# に描画するのをサポートするために加えられた拡張機能です。

Capture Windows

キャプチャする領域は struct video_window を使って設定します。 この構造体はキャプチャする領域と、必要ならばクリッピングする領域を設定します。 VIDIOCGWIN ioctl で現在の設定を取得でき、 VIDIOCSWIN で新しい値を設定できます。 VIDIOCSWIN の ioctl に成功した場合、これは要求されたパラメータに 合わせた、より良いパラメータを設定した事を意味し、要求されたパラメータ通りに 正確に設定したという意味ではありません。 ユーザプログラムは、VIDIOCGWIN を使って、実際に設定されたパラメータを 確認する必要があります。 struct video_window には次のような項目があります。

struct video_window {
__u32xXウインドウでの X 座標
__u32yXウインドウでの Y 座標
__u32widthキャプチャする幅
__u32heightキャプチャする高さ
__u32chromakeyクロマキーの値(ホストオーダでのRGB32の値)
__u32flags追加キャプチャーフラグ
struct video_clip *clipsクリッピングする長方形のリスト(設定のみ)
intclipcountクリッピング長方形の数(設定のみ)
};

クリッピング長方形は配列で渡します。クリッピング長方形の各要素には 次の項目があります。

struct video_clip {
__s32xスキップする長方形のX座標
__s32yスキップする長方形のY座標
__s32widthスキップする長方形の幅
__s32heightスキップする長方形の高さ
#struct video_clip *next アプリケーション 側で自由に使って構いません、設定しても、しなくても影響はありません
};

単にキャプチャ領域を設定しただけでは、キャプチャリングは有効に なりません。 VIDIOCCAPTURE ioctl で1を設定することにより、 オーバーレイキャプチャリングを始めます。そして0を設定することにより、 止める事ができます。

キャプチャーデバイスによっては、実際に見えている領域の一部を キャプチャできるものもあります。この場合、VIDEO_TYPE_SUBCAPTURE が 設定されています。 video_capture構造体で、取り込みの領域とレートを指定します。 video_capture構造体には次の項目があります。

struct video_capture {
__u32x取り込みの領域のX座標
__u32y取り込みの領域のY座標
__u32width取り込みの領域の幅
__u32height取り込みの領域の高さ
__u16decimation取り込みレート
__u16flags取り込むときのフラグ
};

取り込むときのフラグ(flags)には次のものがあります

名前説明
VIDEO_CAPTURE_ODD奇数フレームのみをキャプチャーする
VIDEO_CAPTURE_EVEN偶数フレームのみをキャプチャーする
#decimation には、1秒間にスキップするフレーム数を指定します。(多分)
#現在 video_capture 構造体および、VIDIOCGCAPTURE、VIDIOCSCAPTURE ioctlは使われていません。

ビデオソース

それぞれのvideo4linuxのビデオやオーディオドライバは1つもしくは複数のソース チャンネルからキャプチャーします。 それぞれのチャンネルに関する情報はVIDIOCGCHAN ioctl を使って得られます。 このioctlを使う前に、呼出側は情報を得たいチャンネルの番号を channelの項目に 設定しなくてはなりません。 このioctlに成功した場合、struct video_channel に、そのチャンネル自身 についての情報が埋められます。

VIDIOCSCHAN ioctl は int の引数を渡す事により、キャプチャする入力 を切替えます。色の設定や、チューニングに関する設定は同時には渡せません。 呼出側で、チャンネル毎にこれらを管理し設定し直して下さい。(ビデオ入力毎に 別々の設定を保存するのは理にかなっています。)
#すこし間違ってます。VIDIOCSCHANの引数は int ではなく、struct video_channel* です。
#channel と、norm を正しく設定してVIDIOCSCHAN ioctl を呼んで下さい
#struct video_pictureは全体で一つしかありません。
#ユーザプログラムの方でビデオソース毎に管理した方がよいでしょう。

struct video_channel には次の項目があります。

struct video_channel {
intchannelチャンネル番号
charname入力の名前 - カードの入力ラベルが反映されるのが望ましい。
inttunersこの入力につながっているチュナーの数
__u32flagsチュナーの設定
__u16type入力のタイプ(もし分かっている場合のみ)
__u16normこのチャンネルのTV信号のモード
};

flagsの値は、

VIDEO_VC_TUNERチャンネルにはチュナーがある
VIDEO_VC_AUDIOチャンネルにはオーディオがある
VIDEO_VC_NORMチャンネルにはTV信号のモードの設定がある

types の値は

VIDEO_TYPE_TV入力はTVである
VIDEO_TYPE_CAMERA入力はカメラである

イメージ属性の設定

取り込み画像のイメージ属性はVIDIOCGPICT ioctlを使えば、 struct video_pictureに得られます。 VIDIOCSPICT ioctl を使ってこれらの値を変更できます。 paletteを除く全ての値は0-65535の間の値にスケーリングします。

struct video_picture には次の項目があります。

struct video_picture {
__u16brightness明るさ
__u16hue色合い(カラーの場合のみ)
__u16colour色の濃さ(カラーの場合のみ)
__u16contrastコントラスト
__u16whitenessホワイトネス (グレースケールの場合のみ)
__u16depthキャプチャーデプス(フレームバッファのデプスと合わせる必要があるでしょう)
__u16paletteパレット
};

パレットの値には次のものがあります

VIDEO_PALETTE_GREYグレイスケール(255が白).
VIDEO_PALETTE_HI240BT848の 8bitカラー
VIDEO_PALETTE_RGB565RGB565 を16 bitにパック
VIDEO_PALETTE_RGB555RGB555 を16 bitにパック、一番上のビットは未定義
VIDEO_PALETTE_RGB24RGB888 を 24bitにパック
VIDEO_PALETTE_RGB32RGB888 を 下位3バイトにいれた32bit. 一番上のバイトは未定義
VIDEO_PALETTE_YUV422YUV422のビデオのフォーマット - 4bits を Y, 2bits を U, 2bits を Vに割り当てた 8bits
VIDEO_PALETTE_YUYVDescribe me
VIDEO_PALETTE_UYVYDescribe me
VIDEO_PALETTE_YUV420YUV420 capture
VIDEO_PALETTE_YUV411YUV411 capture
VIDEO_PALETTE_RAWRAW capture (BT848)
VIDEO_PALETTE_YUV422PYUV 4:2:2 Planar
VIDEO_PALETTE_YUV411PYUV 4:1:1 Planar

チューニング

それぞれのビデオ入力チャンネルには複数のチュナーがつながってもよい事 になっています。多くのデバイスはチュナーを持っていませんが、TVカード や、ラジオカードにはいくつかのチュナーが付いているでしょう。
#しかし、現在のドライバは1つ目しかアクセス出来ません。

チュナーについての情報は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 {
inttunerチュナーの番号
charnameチュナーの本来の名前 (例 FM/AM/TV)
ulongrangelow設定可能な最低周波数
ulongrangehigh設定可能な最高周波数
__u32flagsチュナーのフラグ
__u16modeTV信号のモード(関連する場合のみ)
__u16signal信号の強度(分かる場合) - 0-65535の間
};

flagsには次のものがあります

VIDEO_TUNER_PALPAL を受信する機能がある
VIDEO_TUNER_NTSCNTSC を受信する機能がある
VIDEO_TUNER_SECAMSECAM を受信する機能がある
VIDEO_TUNER_LOW周波数の設定は詳細モードである
VIDEO_TUNER_NORMTV信号のモードを設定できる
VIDEO_TUNER_STEREO_ONチュナーのオーディオがステレオになっている

mode には次のものがあります。

VIDEO_MODE_PAL PAL のモードになっている
VIDEO_MODE_NTSCNTSC のモードになっている
VIDEO_MODE_SECAMSECAM のモードになっている
VIDEO_MODE_AUTO自動的にスイッチするモードかモードが設定できない場合

チュナーに設定する周波数は、unsigned の 32bit の値で、実際の周波数の 1/16 MHz の値です。ただし、VIDEO_TUNER_LOW のフラグが設定されて いる場合には、実際の周波数の 1/16 KHzの値です。 現在の周波数は unsigned long で管理されていて、VIDIOCGFREQ ioctl で取り出せ、VIDIOCSFREQ ioctl で設定できます。

オーディオ

TVとラジオデバイスは複数のオーディオチャンネルを持っている場合があります。 オーディオの設定はVIDIOCGAUDIO ioctl にstruct video_audio を渡すことで得られます。また。VIDIOCSAUDIO ioctl で設定できます。

struct video_audioには次の項目があります。

struct video_audio {
intaudioチャンネル番号
__u16volumeボリューム
__u16bassbass
__u16trebletreble
__u32flagsオーディオチャンネルの設定
char name[16]本来の名前
__u16modeオーディオ入力のモード
__u16balance左右のバランス
__u16stepハードウエアで設定可能な最小ステップ
};

オーディオチャンネルの設定の flags には次のものがあります

VIDEO_AUDIO_MUTEミュートされている
VIDEO_AUDIO_MUTABLEミュートの出来る
VIDEO_AUDIO_VOLUMEボリュームのコントロールが出来る
VIDEO_AUDIO_BASSbassのコントロールが出来る
VIDEO_AUDIO_TREBLEtrebleのコントロールが出来る
VIDEO_AUDIO_BALANCEバランスのコントロールが出来る

オーディオ入力のモード

VIDEO_SOUND_MONOモノラルの信号
VIDEO_SOUND_STEREOステレオの信号(NICAM for TV)
VIDEO_SOUND_LANG1European TV alternate language 1
VIDEO_SOUND_LANG2European TV alternate language 2

イメージの取り込み

readのシステムコールからかえって来るたびに、デバイスから次のイ メージが取り込めます。 フォーマットの設定や、正しいサイズのバッファを用意するのは呼出側の 責任です。全てのデバイスが read のシステムコールをサポートしている わけではありません。

別の方法の取り込み方として、デバイスがサポートしていれば、 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 {
intvideoビデオキャプチャデバイス
intvbiVBI キャプチャデバイス
intradioラジオデバイス
intaudioオーディオミキサ
intteletextTeletextデバイス
};