UVC(USB Video Class)とは

UVC

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.12005/6より細かい制御が可能となった、一部ディスクリプタのサイズ変更
1.52012/6H.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規格ではリクエストのフォーマットは以下のようになっています。

Offset01246
FieldbmRequestTypebRequestwValuewIndexwLength
Size11222

UVC規格のリクエストを発行するためには、bmRequestTypeにD6..5=01(クラス固有リクエスト)を指定します。また、リクエストの受信先としてVCもしくはVSインターフェースの場合はD4..0=0001(インターフェース)を、エンドポイントの場合はD4..0=0010(エンドポイント)を指定します。bRequestにはコントロールの属性を指定します。wValueの上位バイトには、ほとんどの場合、コントロールセレクタ(CS)が設定されます。コントロールセレクタはコントロールを指定します。

以下はbRequestに指定するコントロールの属性です。コントロール毎にサポートされる属性は異なり、UVC規格書では必須とされる属性が定義されています。

属性概要
SET_CUR0x01設定
SET_CUR_ALL0x11設定(UVC1.5で追加)
GET_CUR0x81現在設定属性の取得
GET_MIN0x82最小設定属性の取得
GET_MAX0x83最大設定属性の取得
GET_RES0x84分解能属性の取得
GET_LEN0x85データ長属性の取得
GET_INFO0x86情報属性の取得
GET_DEF0x87標準設定属性の取得
GET_CUR_ALL0x91
現在設定属性の取得(UVC1.5で追加)
GET_MIN_ALL0x92
最小設定属性の取得(UVC1.5で追加)
GET_MAX_ALL0x93
最大設定属性の取得(UVC1.5で追加)
GET_RES_ALL0x94
分解能属性の取得(UVC1.5で追加)
GET_DEF_ALL0x97
標準設定属性の取得(UVC1.5で追加)

VCリクエスト

VCリクエストは2つに分類できます。

VCリクエスト概要
インターフェースコントロールリクエストVCインターフェース内のインターフェースコントロールに対して発行されるリクエストです。
Unit及びTerminalコントロールリクエストUnitもしくはTerminalコントロールに対して発行されるリクエストです。
インターフェースコントロールリクエスト

リクエストフォーマットのwValueとwIndexは以下を設定します。

上位バイト下位バイト
wValueコントロールセレクタ(CS)0
wIndex0インターフェース

コントロールセレクタには以下のようなものがあります。

  • VC_VIDEO_POWER_MODE_CONTROL
  • VC_REQUEST_ERROR_CODE_CONTROL
TerminalおよびUnitコントロールリクエスト

リクエストフォーマットのwValueとwIndexは以下を設定します。

上位バイト下位バイト
wValueコントロールセレクタ(CS)0
wIndexUnitもしくはTerminalのIDインターフェース

但し、リクエストの属性(bRequest)が###_###_ALLの場合は以下を設定します。

上位バイト下位バイト
wValue0
wIndexUnitもしくはTerminalのID0

コントロールセレクタには以下のようなものがあります。

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
wIndex0インターフェース

コントロールセレクタには以下のようなものがあります。

  • 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以外)を指定することでストリーミングが開始されます。