UVC(USB Video Class)とは

UVC(USB Video Class)とはUSBデバイスクラスのひとつで、主にUSBカメラ※の通信方法に関する規格です。非圧縮ビデオ、MJPEG(Motion-Jpeg)、H.264等のビデオ通信、さらにはズームやホワイトバランス等のカメラ制御方法も定義されています。
UVC対応カメラはWindowsやmacOS等のUVCドライバを持つUSBホストで動作します。ただし「必ず」動作するとは限りません。UVC規格はUSB上のデータ転送方法を定義しているだけです。例えば、カメラが出力する画像をデコードできるか、カメラが持つ機能を使用できるかは、ホストOSもしくはアプリケーションに依存するので動作しない可能性があります。動作させるためには、カメラメーカーが提供するアプリケーション等が必要になる場合があります。
※ 規格上は逆方向通信も可能であるので例えばUSBディスプレイにも応用可能ですが、そのようなデバイスは恐らくないです。
最新バージョンはUVC1.5ですが、一般的なWebカメラの大半はUVC1.5の機能を必要としていないため、UVC1.0(a)もしくは1.1が採用されています。規格書はUSB規格団体であるUSB-IF(USB Implementers Forum, Inc.)より無償で入手できます(UVC1.1, UVC1.5)。
| バージョン | 発表時期 | 備考 |
|---|---|---|
| 1.0(a) | 2003 | 初版 |
| 1.1 | 2005/6 | より細かい制御が可能となった、一部ディスクリプタのサイズ変更 |
| 1.5 | 2012/6 | H.264ペイロード規格変更、VP8ペイロード規格追加、Encoding Unit追加 |
技術概要
ビデオ機能、インターフェース
ここで述べるビデオ機能とはUVCデバイスの全体構造を定義する重要な概念です。この構造はUSBディスクリプタで記述されます。ビデオ機能は1つのVC(VideoControl)インターフェースと、複数のVS(VideoStreaming)インターフェースで構成されます。1つのビデオ機能に属する1つのVCインターフェースと複数のVSインターフェースは、IAD(Interface Association Descriptor)というディスクリプタで関連付けられます。以下は一般的なUVCデバイスの構成例です。

- VCインターフェース
- ビデオ機能を制御するために使用されます。必ず1つだけ持ちます。
- 以下のエンドポイントを持つことができます。
- ビデオ機能を制御するためのコントロールエンドポイント。このエンドポイントは必須で、エンドポイント0を使用します。
- ホストに状態を返すためのインタラプトエンドポイント。このエンドポイントはオプションです。
- VSインターフェース
- ビデオストリームを転送するために使用されます。一般的には解像度/フレームレートごとに複数持ちます。
- ビデオ用に1つのアイソクロナスもしくはバルクエンドポイントを持つことができます。また、オプションとして静止画(Method 3)用にバルクエンドポイントを持つことができます。
- アイソクロナスエンドポイントを持つVSインターフェースは代替設定を持つ必要があります。
- 代替設定は帯域幅要件を変更する手段を提供します。
- エンドポイントを持たない帯域幅ゼロのデフォルト代替設定(代替設定0)を持つ必要があります。
- バルクエンドポイントを持つVSインターフェースは代替設定0のみ持つ必要があります。
ビデオ機能トポロジー (Video Function Topology)
VC内ではTerminalとUnitというエンティティを用いてビデオ機能を詳細に定義します。エンティティは入出力のピンを持ち、ピンを相互接続することによってビデオ機能トポロジーを構築します。このトポロジーもUSBディスクリプタで記述されます。以下の図はUVC規格書に例示されているトポロジーです。Sensor(CT)とComposite(IT)の2つのビデオソースを持ち、それらはSelector Unit(SU)で切り替えられ、Processing Unit(PU)でビデオ処理され、Output Trrminal(OT)で出力される構造です。

Terminal
Terminalとはカメラから見た入力または出力を司るエンティティです。
| 名称(略称) | ピン数 | 概要 |
|---|---|---|
| Input Terminal (IT) | 入力:0 出力:1 | 外部からデバイスへの入力を処理します。 |
| Camera Terminal (CT) | 入力:0 出力:1 | カメラ用に拡張されたInput Terminalです。 |
| Output Terminal (OT) | 入力:1 出力:0 | デバイスから外部への出力を処理します。 |
Camera Terminal
Camera Terminalでは以下カメラ固有機能(コントロール)をオプションとして持つことができます。
- Scanning Mode (Progressive/Interlace)
- Auto-Exposure Mode
- Auto-Exposure Priority
- Exposure Time
- Focus
- Auto-Focus
- Simple Focus(UVC1.5で追加)
- Iris(絞り)
- Zoom
- Pan
- Roll
- Tilt
- Digital Windowing(UVC1.5で追加)
- Region of Interest(UVC1.5で追加)
Unit
UnitとはInput/Camera TerminalとOutput Terminalの間に配置できるエンティティです。ビデオ画像の処理や、複数ビデオ入力を1つにまとめることができます。PUは頻繁に、EXはたまに使われます。SUとEUは滅多に使われないようです。
| 名称(略称) | ピン数 | 概要 |
|---|---|---|
| Selector Unit (SU) | 入力:複数 出力:1 | 複数の入力データストリームを1つの出力ストリームにルーティングします。 |
| Processing Unit (PU) | 入力:1 出力:1 | ビデオの画像属性を制御します。 |
| Extension Unit (XU) | 入力:複数 出力:1 | ベンダー固有の処理を処理します。ホスト側ソフトウェアの対応が必要です。 |
| Encoding Unit (EU) | 入力:1 出力:複数 | エンコーダーの属性を制御します。UVC1.5で追加されました。 |
Processing Unit
Processing Unitでは以下機能(コントロール)をオプションとして持つことができます。ユーザーコントロールはカメラユーザーによって設定されるプロパティで、デバイスによる自動設定の対象ではありません。オートコントロールはデバイスによる自動設定をサポートしています。
ユーザーコントロール
- Brightness
- Contrast
- Hue(色調)
- Saturation(彩度)
- Sharpness
- Gamma
- Digital Multiplier(ズーム)
オートコントロール
- White Balance Temperature
- White Balance Component
- Backlight Compensation
- Contrast(UVC1.5で自動設定追加)
その他
- Gain
- Power Line Frequency
- Analog Video Standard
- Analog Video Lock Status
Extenion Unit
カメラの外部ボタン(カメラからUSBホスト)や、カメラへの独自コマンド発行(USBホストからカメラ)等、カメラ固有の機能を実装できます。
UVCリクエスト
USBホストからのリクエスト発行方法です。一般にはUVCドライバ内で勝手に実行されるので、USBホスト側のアプリ技術者は気にしなくても大丈夫です。UVCデバイスの技術者は気にしなくてはならないかも入れません。
| クラス固有リクエスト | 概要 |
|---|---|
| VCリクエスト | VCインターフェースまたはVCインターフェースに含まれるUnitとTerminalに対して発行されるリクエストです。例えば、前述したCTやPUがサポートしている機能を制御します。 |
| VSリクエスト | VSインターフェースまたは関連するエンドポイントに対して発行されるリクエストです。例えば、ビデオの解像度やフレームレートといったストリーミングパラメータの取得やネゴシエーションを行い、決定したストリーミングパラメータを使用してハードウェアを設定します。 |
USB規格ではリクエストのフォーマットは以下のようになっています。
| Offset | 0 | 1 | 2 | 4 | 6 |
|---|---|---|---|---|---|
| Field | bmRequestType | bRequest | wValue | wIndex | wLength |
| Size | 1 | 1 | 2 | 2 | 2 |
UVC規格のリクエストを発行するためには、bmRequestTypeにD6..5=01(クラス固有リクエスト)を指定します。また、リクエストの受信先としてVCもしくはVSインターフェースの場合はD4..0=0001(インターフェース)を、エンドポイントの場合はD4..0=0010(エンドポイント)を指定します。bRequestにはコントロールの属性を指定します。wValueの上位バイトには、ほとんどの場合、コントロールセレクタ(CS)が設定されます。コントロールセレクタはコントロールを指定します。
以下はbRequestに指定するコントロールの属性です。コントロール毎にサポートされる属性は異なり、UVC規格書では必須とされる属性が定義されています。
| 属性 | 値 | 概要 |
|---|---|---|
| SET_CUR | 0x01 | 設定 |
| SET_CUR_ALL | 0x11 | 設定(UVC1.5で追加) |
| GET_CUR | 0x81 | 現在設定属性の取得 |
| GET_MIN | 0x82 | 最小設定属性の取得 |
| GET_MAX | 0x83 | 最大設定属性の取得 |
| GET_RES | 0x84 | 分解能属性の取得 |
| GET_LEN | 0x85 | データ長属性の取得 |
| GET_INFO | 0x86 | 情報属性の取得 |
| GET_DEF | 0x87 | 標準設定属性の取得 |
| GET_CUR_ALL | 0x91 | 現在設定属性の取得(UVC1.5で追加) |
| GET_MIN_ALL | 0x92 | 最小設定属性の取得(UVC1.5で追加) |
| GET_MAX_ALL | 0x93 | 最大設定属性の取得(UVC1.5で追加) |
| GET_RES_ALL | 0x94 | 分解能属性の取得(UVC1.5で追加) |
| GET_DEF_ALL | 0x97 | 標準設定属性の取得(UVC1.5で追加) |
VCリクエスト
VCリクエストは2つに分類できます。
| VCリクエスト | 概要 |
|---|---|
| インターフェースコントロールリクエスト | VCインターフェース内のインターフェースコントロールに対して発行されるリクエストです。 |
| Unit及びTerminalコントロールリクエスト | UnitもしくはTerminalコントロールに対して発行されるリクエストです。 |
インターフェースコントロールリクエスト
リクエストフォーマットのwValueとwIndexは以下を設定します。
| 上位バイト | 下位バイト | |
|---|---|---|
| wValue | コントロールセレクタ(CS) | 0 |
| wIndex | 0 | インターフェース |
コントロールセレクタには以下のようなものがあります。
- VC_VIDEO_POWER_MODE_CONTROL
- VC_REQUEST_ERROR_CODE_CONTROL
TerminalおよびUnitコントロールリクエスト
リクエストフォーマットのwValueとwIndexは以下を設定します。
| 上位バイト | 下位バイト | |
|---|---|---|
| wValue | コントロールセレクタ(CS) | 0 |
| wIndex | UnitもしくはTerminalのID | インターフェース |
但し、リクエストの属性(bRequest)が###_###_ALLの場合は以下を設定します。
| 上位バイト | 下位バイト | |
|---|---|---|
| wValue | 0 | 0 |
| wIndex | UnitもしくはTerminalのID | 0 |
コントロールセレクタには以下のようなものがあります。
Camera Terminal (CT)
- CT_SCANNING_MODE_CONTROL
- CT_AE_MODE_CONTROL
- CT_AE_PRIORITY_CONTROL
- CT_EXPOSURE_TIME_ABSOLUTE_CONTROL
- CT_EXPOSURE_TIME_RELATIVE_CONTROL
- CT_FOCUS_ABSOLUTE_CONTROL
- CT_FOCUS_RELATIVE_CONTROL
- CT_FOCUS_AUTO_CONTROL
- CT_IRIS_ABSOLUTE_CONTROL
- CT_IRIS_RELATIVE_CONTROL
- CT_ZOOM_ABSOLUTE_CONTROL
- CT_ZOOM_RELATIVE_CONTROL
- CT_PANTILT_ABSOLUTE_CONTROL
- CT_PANTILT_RELATIVE_CONTROL
- CT_ROLL_ABSOLUTE_CONTROL
- CT_ROLL_RELATIVE_CONTROL
- CT_PRIVACY_CONTROL
- CT_FOCUS_SIMPLE_CONTROL(UVC1.5で追加)
- CT_WINDOW_CONTROL(UVC1.5で追加)
- CT_REGION_OF_INTEREST_CONTROL(UVC1.5で追加)
Selector Unit (SU)
- SU_INPUT_SELECT_CONTROL
Processing Unit (PU)
- PU_BACKLIGHT_COMPENSATION_CONTROL
- PU_BRIGHTNESS_CONTROL
- PU_CONTRAST_CONTROL
- PU_GAIN_CONTROL
- PU_POWER_LINE_FREQUENCY_CONTROL
- PU_HUE_CONTROL
- PU_SATURATION_CONTROL
- PU_SHARPNESS_CONTROL
- PU_GAMMA_CONTROL
- PU_WHITE_BALANCE_TEMPERATURE_CONTROL
- PU_WHITE_BALANCE_TEMPERATURE_AUTO_CONTROL
- PU_WHITE_BALANCE_COMPONENT_CONTROL
- PU_WHITE_BALANCE_COMPONENT_AUTO_CONTROL
- PU_DIGITAL_MULTIPLIER_CONTROL
- PU_DIGITAL_MULTIPLIER_LIMIT_CONTROL
- PU_HUE_AUTO_CONTROL
- PU_ANALOG_VIDEO_STANDARD_CONTROL
- PU_ANALOG_LOCK_STATUS_CONTROL
- PU_CONTRAST_AUTO_CONTROL(UVC1.5で追加)
Encoding Unit (EU)(UVC1.5で追加)
- EU_SELECT_LAYER_CONTROL
- EU_PROFILE_TOOLSET_CONTROL
- EU_VIDEO_RESOLUTION_CONTROL
- EU_MIN_FRAME_INTERVAL_CONTROL
- EU_SLICE_MODE_CONTROL
- EU_RATE_CONTROL_MODE_CONTROL
- EU_AVERAGE_BITRATE_CONTROL
- EU_CPB_SIZE_CONTROL
- EU_PEAK_BIT_RATE_CONTROL
- EU_QUANTIZATION_PARAMS_CONTROL
- EU_SYNC_REF_FRAME_CONTROL
- EU_LTR_BUFFER_ CONTROL
- EU_LTR_PICTURE_CONTROL
- EU_LTR_VALIDATION_CONTROL
- EU_LEVEL_IDC_LIMIT_CONTROL
- EU_SEI_PAYLOADTYPE_CONTROL
- EU_QP_RANGE_CONTROL
- EU_PRIORITY_CONTROL
- EU_START_OR_STOP_LAYER_CONTROL
- EU_ERROR_RESILIENCY_CONTROL
VSリクエスト
リクエストフォーマットのwValueとwIndexは以下を設定します。
| 上位バイト | 下位バイト | |
|---|---|---|
| wValue | コントロールセレクタ(CS) | 0 |
| wIndex | 0 | インターフェース |
コントロールセレクタには以下のようなものがあります。
- VS_PROBE_CONTROL
- VS_COMMIT_CONTROL
- VS_STILL_PROBE_CONTROL
- VS_STILL_COMMIT_CONTROL
- VS_STILL_IMAGE_TRIGGER_CONTROL
- VS_STREAM_ERROR_CODE_CONTROL
- VS_GENERATE_KEY_FRAME_CONTROL
- VS_UPDATE_FRAME_SEGMENT_CONTROL
- VS_SYNCH_DELAY_CONTROL
リクエスト実行例
以下の図はUVC規格書に例として示されているビデオ(アイソクロナス)のネゴシエーションの抜粋です。PROBEコントロールで解像度やフレームレートといったストリーミングパラメータのネゴシエーションを行い、COMMITコントロールで決定したストリーミングパラメータをハードウェアに反映します。アイソクロナスの場合はSET_INTERFACEリクエストで代替設定(0以外)を指定することでストリーミングが開始されます。


当社では長年USBカメラを開発してきました。その経験を活かしたカメラを販売、カスタムを行っています。


