Insta360 Airの360度USBウェブカメラ(UVC)としての性能はなかなか優秀

概要

あるしおうねさんのこちらのツイートを見て、おっ!となって検証してみました。

PCとつなぐとこんな感じ。PC接続用の硬めのケーブルも標準でついてきます。

f:id:hammm:20170422233711p:plain:w400

Insta360 Airは、スマホと連携して360度カメラとして動作するというのが通常の使い方といえますが、VR/AR 関連開発者にとって見過ごせないのがそのUSBウェブカメラ、つまりUVC(USB Video Class)規格での動作です。UVC規格で動作すれば、PCやあるいはラズベリーパイ等で、様々なアプリや自作アプリから利用可能になります。

Insta360 Airから直接出力される映像はDual Fisheye(魚眼x2)形式です。今回はこのまま扱う前提での話です。

  • Dual Fisheyeはこのような出力になります。

    f:id:hammm:20170422230648p:plain:w300
    ※画像はカメラを寝かせた状態での結果なので参考まで。

  • リアルタイムスティッチソフトについて

    Insta360 Air用に、Windowsでリアルタイムにスティッチしてくれるソフトがあります。つまり、Dual Fisheye形式から、各種動画サイト等で一般的なEquirectangular(正距円筒図法)形式に変換した上で、ウェブカメラと同様のインタフェースで扱うことができるものです。

    以下のページから、英語モードにして、"Webcam Software" というタイトルのものが、この変換用のソフトです。

    https://www.insta360.com/download/insta360-air

今回は、利用用途として遅延を増やしたくない関係で、上記ソフトは一旦無視でいきます。Dual Fisheyeのまま使います。Unityのシェーダーとかでなんとかする前提です。

Unityのシェーダーとかの話は近いうちに書こうと思います。

amazonのリンクを置いておきますが、ヨドバシのほうがポイントがついてお得でした。

結論

先に結論を書きますが、Insta360 Air、360度対応のUSBウェブカメラとしてなかなか優秀です。MJPG 3008x1504 30フレーム というモードが特に有用で、ノイズはあるものの非常に高い解像感があります。今までTHETA SとキャプチャカードFEBON178を組み合わせていましたが、それを凌駕している印象です。特にUSB2.0環境でもつなぐだけで動作しますし、各種のウェブカメラ接続の手法がそのまま利用できます。

なお、入力したDual Fisheye画像をどう料理するかは今回は省略しますが、簡単に触れますと、右と左の正方形にわけたときに、それぞれの正方形の中央にレンズのセンターがきています。ただセンサーの配置の関係か、経度方向に4度程度傾いているようです。ご注意ください。

やや大きな難点としては、2つのレンズの間の視差がTHETAと比べると大きいため、近くのものと遠くのものを同時に綺麗に合成(スティッチ)することは難しくなります。この点はTHETA Sに分があります。Insta360 Airではスティッチソフトの高度化によってこれに対処しようとしているようです。

以下、詳細になります。

動作モード

USB2.0で動作します。USB3.0ではありません。USB3.0ではないため、帯域幅的にすべて圧縮ありのモードになります。 Insta360 AirをUSBポートに接続すると、"Video Control"という名前のデバイスが追加されます。

  • バイス名: “Video Control”

  • MJPGエンコーディング

    • 3008 x 1504 (30フレーム/秒)
    • 2176 x 1088 (30フレーム/秒)
    • 1472 x 736 (30フレーム/秒)
  • H.264エンコーディング ※Windows10で動作させるには後述の細工が必要です。
    • 2560 x 1280 (30フレーム/秒)
    • 1920 x 960 (30フレーム/秒)

エンコーディング(動画圧縮手法)について簡単に解説しておくと、MJPG (Motion JPEG)は各フレームをそれぞれJPEGで圧縮して、それをつなげて転送する方法で、最近の動画系のエンコーディングH.264MPEG1/2/4)と比べると圧縮率が悪い(同画質で転送量が多くなる)です。H.264は最近良く使われる動画の圧縮方法で、圧縮率の高さに定評があります。ウェブカメラにH.264を利用する手法は、USB2.0に対応しつつ解像度を上げる方法としてここ数年で広まってきています。

画質

モード間の画質比較

MJPGでの画質は、精細さは感じるものの、ノイズが常に乗る感じです。とはいえ時間でならせば平均的にはそこそこ良い色味になっているように思います。 H.264での画質は、時間、空間方向でなめらかさは出るものの、解像感でいうとMJPGより劣るという印象です。

コーデック 解像感 ノイズ 総合評価
MJPG 多い
H.264 少ない

そもそもの解像度が高いこともあり、素材としてはMJPGのほうが総合的に評価が高いです。MJPGモードの解像度の違いでは、3008x1504がもちろん解像感は高いですがJPEG由来のノイズが明らかに見えます。解像度が低いほどJPEG由来のノイズが低減される感じですので、ノイズ少ない安定した画質を求めるならば低い解像度を選択するのもアリという感じがあります。

以下、比較用の画像です。おおかた同じ場所を切り出しています。

  • MJPG 1472x736

    f:id:hammm:20170422230033p:plain:w500

  • MJPG 2176x1088

    f:id:hammm:20170422225920p:plain:w500

  • MJPG 3008x1504

    f:id:hammm:20170422225326p:plain:w500

  • H.264 2560x1280

    f:id:hammm:20170422225528p:plain:w500

THETA Sとの比較

手持ちのTHETA Sと比較してみました。THETA Sは、USB接続とHDMI接続とで画質が異なるため、両方と比較してみました。 エアコンを同じ場所から撮影して比較してみました。画像は下のほうにありますが、以下に表でまとめます。

※ちなみに、THETA SC にはHDMIポートが搭載されていないのでご注意ください。

バイス、接続方法 エンコーディング 解像感 ノイズ 総合評価
Insta360 Air USB MJPG 3008x1504 多い
THETA S USB MJPG 1280x720 × 少ない
THETA S HDMI、FEBON178でキャプチャ YUV 1920x1080 少ない

というわけで、Insta360 Airは、解像感の上では、直接USB接続する上ではTHETA Sよりだいぶ上、HDMI経由の場合でも「上ではないか?」という印象です。Insta360 Airのノイズは、静止画にするとだいぶ目立ちますが、動画で動いているとザワザワ感は多少あるものの、平均化されてそんなにひどい感じはないです。ノイズの多いInsta360 Airか、ノイズは少ないが多少解像感に欠けるTHETA S (HDMI)か?という選択で、嗜好によるところもありそうです。また後述しますがスティッチ難度にも違いがあります。これを考慮に入れると互角に近いかもしれません。

  • Insta360 Air MJPG 3008x1504 (USB直接)

    f:id:hammm:20170423011550p:plain:w400

  • THETA S 1280x720 (USB直接)

    f:id:hammm:20170423011651p:plain:w400

  • THETA S HDMI 1920x1080 (FEBON178 USB3.0にて取り込み)

    f:id:hammm:20170423011744p:plain:w400

遅延

ブラウザ上のストップウォッチをInsta360 Airで動画撮影しつつ、それをhunuaaで表示し、両方の画面を入れて静止画撮影して計測した遅延です。読み取りもいいかげんなため、正確なものではないですが、感覚的には合致する数字ではあります。

モード 遅延
MJPG 1472 x 736 モード 約180ms
MJPG 3008 x 1504 モード 約260ms

Windows 10での動作についての注意

Windows 10 Anniversary Update (1607)の前後で、MJPGおよびH.264の動作に問題が出ていますので注意が必要です。

  • MJPG

    MJPGについては、Windows 10 Anniversary Updateによって一時動作不可になり、その後の更新で動作するようになったそうです。自動更新にしていれば動作する状態になっていると思います。

  • H.264

    H.264については、Windows 10 Anniversary Updateによって動作不可になった後、現時点(2017/4/22)では未修正と思われます。以下の項目を御覧ください。

Windows 10でH264モードを使えない問題の解消方法

参考:

要はregeditで以下の2つのキーを追加します。

  • HKEY_LOCAL_MACHINE > SOFTWARE > Microsoft > Windows Media Foundation > Platform 内に以下のキーを作る

    • タイプ: DWORD (32-bit) Value
    • キー名: EnableFrameServerMode
    • 値: 0
  • HKEY_LOCAL_MACHINE > SOFTWARE > WOW6432Node > Microsoft > Windows Media Foundation > Platform 内に以下のキーを作る

    • タイプ: DWORD (32-bit) Value
    • キー名: EnableFrameServerMode
    • 値: 0

デメリット

三脚穴がない

Insta360 Airで微妙にこまることもあります。三脚穴がないことです。くねくね三脚のような素材のUSB延長ケーブルがついており、USBポートからなんとなく位置が固定されるのですが、USBポートってそんなに揺れに強くないので、ちょっとの振動でガタガタ揺れます。 三脚ネジに固定できる方法があると良いと思います。

三脚ネジではなくGoPro互換のマウント用ですが、3D Printできるマウントのデータが公開されているようです。 http://360rumors.blogspot.jp/2017/03/gopro-mount-for-insta360-air.html

熱を持つ

ウェブカメラとして動画を撮影している状態では、結構熱を持ちます。さわれない程ではないですが、「結構熱いな」という程度です。今のところ、それによる誤動作や停止はありませんでしたが、気になるところです。

(THETAシリーズと比較すると)スティッチが難しい

THETA S(レンズ間距離約2cm)と比較するとInsta360 Airでは4cm弱と、レンズ間の距離が2倍程度あるため、2つのレンズの間に視差が生じてしまい、近い距離にあわせてスティッチすると遠くがあわず、遠くにあわせてスティッチすると近くがあわない、という状況になります。 Insta360公式のスティッチソフトおよびアプリでは、より高度はスティッチを行うことで可能な限り解消しているようです。Dual Fisheyeを直接シェーダでマッピングするような場合は、THETA Sと比較して明らかに問題がでてきます。

USBパラメータ

以下にusbviewのアウトプットを掲載しておきます。何かの役に立つかもしれないし。

[Port1]  :  USB Composite Device


Is Port User Connectable:         yes
Is Port Debug Capable:            no
Companion Port Number:            0
Companion Hub Symbolic Link Name:
Protocols Supported:
 USB 1.1:                         yes
 USB 2.0:                         yes
 USB 3.0:                         no

Device Power State:               PowerDeviceD0

       ---===>Device Information<===---
English product name: "Insta360 Air"

ConnectionStatus:                 
Current Config Value:              0x01  -> Device Bus Speed: High (is not SuperSpeed or higher capable)
Device Address:                    0x08
Open Pipes:                           2

          ===>Device Descriptor<===
bLength:                           0x12
bDescriptorType:                   0x01
bcdUSB:                          0x0200
bDeviceClass:                      0xEF  -> This is a Multi-interface Function Code Device
bDeviceSubClass:                   0x02  -> This is the Common Class Sub Class
bDeviceProtocol:                   0x01  -> This is the Interface Association Descriptor protocol
bMaxPacketSize0:                   0x40 = (64) Bytes
idVendor:                        0x2E1A = Vendor ID not listed with USB.org as of 02-15-2012
idProduct:                       0x1000
bcdDevice:                       0x0100
iManufacturer:                     0x01
     English (United States)  "Arashi Vision"
iProduct:                          0x02
     English (United States)  "Insta360 Air"
iSerialNumber:                     0x00
bNumConfigurations:                0x01

          ---===>Open Pipes<===---

          ===>Endpoint Descriptor<===
bLength:                           0x07
bDescriptorType:                   0x05
bEndpointAddress:                  0x83  -> Direction: IN - EndpointID: 3
bmAttributes:                      0x03  -> Interrupt Transfer Type
wMaxPacketSize:                  0x0040 = 1 transactions per microframe, 0x40 max bytes
bInterval:                         0x08

          ===>Endpoint Descriptor<===
bLength:                           0x07
bDescriptorType:                   0x05
bEndpointAddress:                  0x81  -> Direction: IN - EndpointID: 1
bmAttributes:                      0x02  -> Bulk Transfer Type
wMaxPacketSize:                  0x0200 = 0x200 max bytes
bInterval:                         0x00

       ---===>Full Configuration Descriptor<===---

          ===>Configuration Descriptor<===
bLength:                           0x09
bDescriptorType:                   0x02
wTotalLength:                    0x01B9  -> Validated
bNumInterfaces:                    0x02
bConfigurationValue:               0x01
iConfiguration:                    0x00
bmAttributes:                      0x80  -> Bus Powered
MaxPower:                          0xFA = 500 mA

          ===>IAD Descriptor<===
bLength:                           0x08
bDescriptorType:                   0x0B
bFirstInterface:                   0x00
bInterfaceCount:                   0x02
bFunctionClass:                    0x0E  -> Video Interface Class
bFunctionSubClass:                 0x03  -> Video Interface Collection
bFunctionProtocol:                 0x00  -> PC_PROTOCOL_UNDEFINED protocol
iFunction:                         0x04
     English (United States)  "Video Control"

          ===>Interface Descriptor<===
bLength:                           0x09
bDescriptorType:                   0x04
bInterfaceNumber:                  0x00
bAlternateSetting:                 0x00
bNumEndpoints:                     0x01
bInterfaceClass:                   0x0E  -> Video Interface Class
bInterfaceSubClass:                0x01  -> Video Control Interface SubClass
bInterfaceProtocol:                0x00
iInterface:                        0x04
     English (United States)  "Video Control"

          ===>Class-Specific Video Control Interface Header Descriptor<===
bLength:                           0x0D
bDescriptorType:                   0x24
bDescriptorSubtype:                0x01
bcdVDC:                          0x0100
wTotalLength:                    0x0084  -> Validated
dwClockFreq:                 0x08954400 = (144000000) Hz
bInCollection:                     0x01
baInterfaceNr[1]:                  0x01
USB Video Class device: spec version 1.0

          ===>Video Control Output Terminal Descriptor<===
bLength:                           0x09
bDescriptorType:                   0x24
bDescriptorSubtype:                0x03
bTerminalID:                       0x04
wTerminalType:                   0x0101 = (TT_STREAMING)
bAssocTerminal:                    0x00
bSourceID:                         0x02
iTerminal:                         0x00

          ===>Video Control Extension Unit Descriptor<===
bLength:                           0x1B
bDescriptorType:                   0x24
bDescriptorSubtype:                0x06
bUnitID:                           0x02
guidExtensionCode:                 {BFFF09E1-E40B-42C9-9582-90FE23C07388}
bNumControls:                      0x06
bNrInPins:                         0x01
===>List of Connected Units and Terminal ID's
baSourceID[1]:                     0x06
bControlSize:                      0x02
bmControls : 0x3F 0x00
     D00 = 1  yes -  Vendor-Specific (Optional)
     D01 = 1  yes -  Vendor-Specific (Optional)
     D02 = 1  yes -  Vendor-Specific (Optional)
     D03 = 1  yes -  Vendor-Specific (Optional)
     D04 = 1  yes -  Vendor-Specific (Optional)
     D05 = 1  yes -  Vendor-Specific (Optional)
     D06 = 0   no -  Vendor-Specific (Optional)
     D07 = 0   no -  Vendor-Specific (Optional)
     D08 = 0   no -  Vendor-Specific (Optional)
     D09 = 0   no -  Vendor-Specific (Optional)
     D10 = 0   no -  Vendor-Specific (Optional)
     D11 = 0   no -  Vendor-Specific (Optional)
     D12 = 0   no -  Vendor-Specific (Optional)
     D13 = 0   no -  Vendor-Specific (Optional)
     D14 = 0   no -  Vendor-Specific (Optional)
     D15 = 0   no -  Vendor-Specific (Optional)
iExtension:                        0x00

          ===>Video Control Extension Unit Descriptor<===
bLength:                           0x1B
bDescriptorType:                   0x24
bDescriptorSubtype:                0x06
bUnitID:                           0x06
guidExtensionCode:                 {FAF1672D-B71B-4793-8C91-7B1C9B7F95F8}
bNumControls:                      0x05
bNrInPins:                         0x01
===>List of Connected Units and Terminal ID's
baSourceID[1]:                     0x05
bControlSize:                      0x02
bmControls : 0xFF 0x6F
     D00 = 1  yes -  Vendor-Specific (Optional)
     D01 = 1  yes -  Vendor-Specific (Optional)
     D02 = 1  yes -  Vendor-Specific (Optional)
     D03 = 1  yes -  Vendor-Specific (Optional)
     D04 = 1  yes -  Vendor-Specific (Optional)
     D05 = 1  yes -  Vendor-Specific (Optional)
     D06 = 1  yes -  Vendor-Specific (Optional)
     D07 = 1  yes -  Vendor-Specific (Optional)
     D08 = 1  yes -  Vendor-Specific (Optional)
     D09 = 1  yes -  Vendor-Specific (Optional)
     D10 = 1  yes -  Vendor-Specific (Optional)
     D11 = 1  yes -  Vendor-Specific (Optional)
     D12 = 0   no -  Vendor-Specific (Optional)
     D13 = 1  yes -  Vendor-Specific (Optional)
     D14 = 1  yes -  Vendor-Specific (Optional)
     D15 = 0   no -  Vendor-Specific (Optional)
iExtension:                        0x00

          ===>Video Control Extension Unit Descriptor<===
bLength:                           0x1B
bDescriptorType:                   0x24
bDescriptorSubtype:                0x06
bUnitID:                           0x05
guidExtensionCode:                 {B42153BD-35D6-45CA-B203-4E0149B301BC}
bNumControls:                      0x10
bNrInPins:                         0x01
===>List of Connected Units and Terminal ID's
baSourceID[1]:                     0x03
bControlSize:                      0x02
bmControls : 0x7F 0x7E
     D00 = 1  yes -  Vendor-Specific (Optional)
     D01 = 1  yes -  Vendor-Specific (Optional)
     D02 = 1  yes -  Vendor-Specific (Optional)
     D03 = 1  yes -  Vendor-Specific (Optional)
     D04 = 1  yes -  Vendor-Specific (Optional)
     D05 = 1  yes -  Vendor-Specific (Optional)
     D06 = 1  yes -  Vendor-Specific (Optional)
     D07 = 0   no -  Vendor-Specific (Optional)
     D08 = 0   no -  Vendor-Specific (Optional)
     D09 = 1  yes -  Vendor-Specific (Optional)
     D10 = 1  yes -  Vendor-Specific (Optional)
     D11 = 1  yes -  Vendor-Specific (Optional)
     D12 = 1  yes -  Vendor-Specific (Optional)
     D13 = 1  yes -  Vendor-Specific (Optional)
     D14 = 1  yes -  Vendor-Specific (Optional)
     D15 = 0   no -  Vendor-Specific (Optional)
iExtension:                        0x00

          ===>Video Control Input Terminal Descriptor<===
bLength:                           0x12
bDescriptorType:                   0x24
bDescriptorSubtype:                0x02
bTerminalID:                       0x01
wTerminalType:                   0x0201 = (ITT_CAMERA)
bAssocTerminal:                    0x00
iTerminal:                         0x00
===>Camera Input Terminal Data
wObjectiveFocalLengthMin:        0x0000
wObjectiveFocalLengthMax:        0x0000
wOcularFocalLength:              0x0000
bControlSize:                      0x03
bmControls : 0x00 0x00 0x00
     D00 = 0   no -  Scanning Mode
     D01 = 0   no -  Auto-Exposure Mode
     D02 = 0   no -  Auto-Exposure Priority
     D03 = 0   no -  Exposure Time (Absolute)
     D04 = 0   no -  Exposure Time (Relative)
     D05 = 0   no -  Focus (Absolute)
     D06 = 0   no -  Focus (Relative)
     D07 = 0   no -  Iris (Absolute)
     D08 = 0   no -  Iris (Relative)
     D09 = 0   no -  Zoom (Absolute)
     D10 = 0   no -  Zoom (Relative)
     D11 = 0   no -  PanTilt (Absolute)
     D12 = 0   no -  PanTilt (Relative)
     D13 = 0   no -  Roll (Absolute)
     D14 = 0   no -  Roll (Relative)
     D15 = 0   no -  Reserved
     D16 = 0   no -  Reserved
     D17 = 0   no -  Focus, Auto
     D18 = 0   no -  Privacy
     D19 = 0   no -  Focus, Simple
     D20 = 0   no -  Window
     D21 = 0   no -  Region of Interest
     D22 = 0   no -  Reserved
     D23 = 0   no -  Reserved

          ===>Video Control Processing Unit Descriptor<===
bLength:                           0x0B
bDescriptorType:                   0x24
bDescriptorSubtype:                0x05
bUnitID:                           0x03
bSourceID:                         0x01
wMaxMultiplier:                  0x0000
bControlSize:                      0x02
bmControls : 0x7F 0x15
     D00 = 1  yes -  Brightness
     D01 = 1  yes -  Contrast
     D02 = 1  yes -  Hue
     D03 = 1  yes -  Saturation
     D04 = 1  yes -  Sharpness
     D05 = 1  yes -  Gamma
     D06 = 1  yes -  White Balance Temperature
     D07 = 0   no -  White Balance Component
     D08 = 1  yes -  Backlight Compensation
     D09 = 0   no -  Gain
     D10 = 1  yes -  Power Line Frequency
     D11 = 0   no -  Hue, Auto
     D12 = 1  yes -  White Balance Temperature, Auto
     D13 = 0   no -  White Balance Component, Auto
     D14 = 0   no -  Digital Multiplier
     D15 = 0   no -  Digital Multiplier Limit
iProcessing :                      0x00

          ===>Endpoint Descriptor<===
bLength:                           0x07
bDescriptorType:                   0x05
bEndpointAddress:                  0x83  -> Direction: IN - EndpointID: 3
bmAttributes:                      0x03  -> Interrupt Transfer Type
wMaxPacketSize:                  0x0040 = 1 transactions per microframe, 0x40 max bytes
bInterval:                         0x08

          ===>Class-specific VC Interrupt Endpoint Descriptor<===
bLength:                           0x05
bDescriptorType:                   0x25
bDescriptorSubtype:                0x03
wMaxTransferSize:                0x0040 = (64) Bytes

          ===>Interface Descriptor<===
bLength:                           0x09
bDescriptorType:                   0x04
bInterfaceNumber:                  0x01
bAlternateSetting:                 0x00
bNumEndpoints:                     0x01
bInterfaceClass:                   0x0E  -> Video Interface Class
bInterfaceSubClass:                0x02  -> Video Streaming Interface SubClass
bInterfaceProtocol:                0x00
iInterface:                        0x05
     English (United States)  "Video Stream"

          ===>Video Class-Specific VS Video Input Header Descriptor<===
bLength:                           0x0F
bDescriptorType:                   0x24
bDescriptorSubtype:                0x01
bNumFormats:                       0x02
wTotalLength:                    0x00FF  -> Validated
bEndpointAddress:                  0x81  -> Direction: IN - EndpointID: 1
bmInfo:                            0x00  -> Dynamic Format Change not Supported
bTerminalLink:                     0x04
bStillCaptureMethod:               0x02  -> Still Capture Method 2
bTriggerSupport:                   0x01  -> Hardware Triggering Support
bTriggerUsage:                     0x00  -> Host will initiate still image capture
bControlSize:                      0x01
Video Payload Format 1             0x00
     D00 = 0   no -  Key Frame Rate
     D01 = 0   no -  P Frame Rate
     D02 = 0   no -  Compression Quality
     D03 = 0   no -  Compression Window Size
     D04 = 0   no -  Generate Key Frame
     D05 = 0   no -  Update Frame Segment
     D06 = 0   no -  Reserved
     D07 = 0   no -  Reserved
Video Payload Format 2             0x00
     D00 = 0   no -  Key Frame Rate
     D01 = 0   no -  P Frame Rate
     D02 = 0   no -  Compression Quality
     D03 = 0   no -  Compression Window Size
     D04 = 0   no -  Generate Key Frame
     D05 = 0   no -  Update Frame Segment
     D06 = 0   no -  Reserved
     D07 = 0   no -  Reserved

          ===>Video Streaming MJPEG Format Type Descriptor<===
bLength:                           0x0B
bDescriptorType:                   0x24
bDescriptorSubtype:                0x06
bFormatIndex:                      0x01
bNumFrameDescriptors:              0x03
bmFlags:                           0x00  -> Sample Size is Not Fixed
bDefaultFrameIndex:                0x03
bAspectRatioX:                     0x00
bAspectRatioY:                     0x00
bmInterlaceFlags:                  0x00
     D00   = 0  non-Interlaced stream or variable
     D01   = 0  2 fields per frame
     D02   = 0  Field 1 not first
     D03   = 0  Reserved
     D4..5 = 0  Field patterns  -> Field 1 only
     D6..7 = 0  Display Mode  -> Bob only
bCopyProtect:                      0x00  -> Duplication Unrestricted

          ===>Video Streaming MJPEG Frame Type Descriptor<===
bLength:                           0x1E
bDescriptorType:                   0x24
bDescriptorSubtype:                0x07
bFrameIndex:                       0x01
bmCapabilities:                    0x00
wWidth:                          0x05C0 = 1472
wHeight:                         0x02E0 = 736
dwMinBitRate:                0x00384000
dwMaxBitRate:                0x05A00000
dwMaxVideoFrameBufferSize:   0x00100000
dwDefaultFrameInterval:      0x00051615 = 33.333300 mSec (30.00 Hz)
bFrameIntervalType:                0x01
*!*WARNING:  if bFrameIntervalType is 1 then dwMinBitRate should equal dwMaxBitRate
===>Additional Discrete Frame TypeData
dwFrameInterval[1]:          0x00051615 = 33.333300 mSec (30.00 Hz)

          ===>Video Streaming MJPEG Frame Type Descriptor<===
bLength:                           0x1E
bDescriptorType:                   0x24
bDescriptorSubtype:                0x07
bFrameIndex:                       0x02
bmCapabilities:                    0x00
wWidth:                          0x0880 = 2176
wHeight:                         0x0440 = 1088
dwMinBitRate:                0x00384000
dwMaxBitRate:                0x05A00000
dwMaxVideoFrameBufferSize:   0x00100000
dwDefaultFrameInterval:      0x00051615 = 33.333300 mSec (30.00 Hz)
bFrameIntervalType:                0x01
*!*WARNING:  if bFrameIntervalType is 1 then dwMinBitRate should equal dwMaxBitRate
===>Additional Discrete Frame TypeData
dwFrameInterval[1]:          0x00051615 = 33.333300 mSec (30.00 Hz)

          ===>Video Streaming MJPEG Frame Type Descriptor<===
          --->This is the Default (optimum) Frame index
bLength:                           0x1E
bDescriptorType:                   0x24
bDescriptorSubtype:                0x07
bFrameIndex:                       0x03
bmCapabilities:                    0x00
wWidth:                          0x0BC0 = 3008
wHeight:                         0x05E0 = 1504
dwMinBitRate:                0x00384000
dwMaxBitRate:                0x05A00000
dwMaxVideoFrameBufferSize:   0x00100000
dwDefaultFrameInterval:      0x00051615 = 33.333300 mSec (30.00 Hz)
bFrameIntervalType:                0x01
*!*WARNING:  if bFrameIntervalType is 1 then dwMinBitRate should equal dwMaxBitRate
===>Additional Discrete Frame TypeData
dwFrameInterval[1]:          0x00051615 = 33.333300 mSec (30.00 Hz)

          ===>Still Image Frame Type Descriptor<===
bLength:                           0x17
bDescriptorType:                   0x24
bDescriptorSubtype:                0x03
bEndpointAddress:                  0x00
bNumImageSizePatterns:             0x04
wWidth[1]:                       0x0BC0
wHeight[1]:                      0x05E0
wWidth[2]:                       0x0780
wHeight[2]:                      0x0438
wWidth[3]:                       0x0500
wHeight[3]:                      0x02D0
wWidth[4]:                       0x0280
wHeight[4]:                      0x01E0
bNumCompressionPattern:            0x01
bCompression[1]:                   0x03


          ===>Color Matching Descriptor<===
bLength:                           0x06
bDescriptorType:                   0x24
bDescriptorSubtype:                0x0D
bColorPrimaries:                   0x01
bTransferCharacteristics:          0x01
bMatrixCoefficients:               0x04
*!*ERROR: bDescriptorSubtype did not exist in UVC 1.0

          ===>Descriptor Hex Dump<===
bLength:                           0x1C
bDescriptorType:                   0x24
1C 24 10 02 02 48 32 36 34 00 00 10 00 80 00 00
AA 00 38 9B 71 10 01 00 00 00 00 01
*!*ERROR: bDescriptorSubtype did not exist in UVC 1.0

          ===>Descriptor Hex Dump<===
bLength:                           0x26
bDescriptorType:                   0x24
26 24 11 01 00 80 07 C0 03 00 00 80 07 00 00 00
0F 15 16 05 00 03 00 00 00 00 15 16 05 00 9A 5B
06 00 20 A1 07 00
*!*ERROR: bDescriptorSubtype did not exist in UVC 1.0

          ===>Descriptor Hex Dump<===
bLength:                           0x26
bDescriptorType:                   0x24
26 24 11 02 00 00 0A 00 05 00 00 80 07 00 00 00
0F 15 16 05 00 03 00 00 00 00 15 16 05 00 9A 5B
06 00 20 A1 07 00

          ===>Color Matching Descriptor<===
bLength:                           0x06
bDescriptorType:                   0x24
bDescriptorSubtype:                0x0D
bColorPrimaries:                   0x01
bTransferCharacteristics:          0x01
bMatrixCoefficients:               0x04

          ===>Endpoint Descriptor<===
bLength:                           0x07
bDescriptorType:                   0x05
bEndpointAddress:                  0x81  -> Direction: IN - EndpointID: 1
bmAttributes:                      0x02  -> Bulk Transfer Type
wMaxPacketSize:                  0x0200 = 0x200 max bytes
bInterval:                         0x00

          ===>Additional Error Checking<===
PASS: number of MJPEG frame descriptors (3) == number of frame descriptors (3) specified in MJPEG format descriptor(s)