Bagikan melalui


Panduan implementasi kamera USB Video Class (UVC)

Mulai Windows 10, driver USB Video Class (UVC) kotak masuk disediakan untuk perangkat yang sesuai dengan spesifikasi USB Video Class (versi 1.0 hingga 1.5). Driver ini mendukung kamera jenis sensor dan warna. Dokumen ini menguraikan cara mengekspos kemampuan tertentu dari kamera yang mematuhi UVC ke aplikasi melalui driver kotak masuk.

Terminologi

Kata kunci Deskripsi
UVC Kelas Video USB
Driver UVC USBVideo.sys pengemudi yang dikirim dengan OS
IR Inframerah
Kamera warna Kamera yang menghasilkan aliran warna (misalnya, kamera RGB atau YUV)
Kamera sensor Kamera yang menghasilkan aliran non-warna (misalnya, IR atau kamera Kedalaman)
BOS Penyimpanan Objek Perangkat Biner
Deskriptor MS OS 2.0 Pendeskripsi kemampuan perangkat BOS khusus platform Microsoft

Kamera sensor

Windows mendukung dua kategori kamera. Salah satunya adalah kamera warna dan yang lainnya adalah kamera sensor non-warna. Kamera RGB atau YUV dikategorikan sebagai kamera warna dan kamera non-warna seperti skala abu-abu, kamera IR dan Kedalaman dikategorikan sebagai kamera sensor. Driver UVC mendukung kedua jenis kamera. Kami merekomendasikan firmware kamera menentukan nilai berdasarkan driver UVC mana yang akan mendaftarkan kamera di bawah satu atau kedua kategori yang didukung.

Kamera yang mendukung jenis format warna saja harus didaftarkan di bawah KSCATEGORY_VIDEO_CAMERA. Kamera yang mendukung IR atau jenis format Khusus kedalaman harus didaftarkan di bawah KSCATEGORY_SENSOR_CAMERA. Kamera yang mendukung jenis format warna dan non-warna harus didaftarkan di bawah KSCATEGORY_VIDEO_CAMERA dan KSCATEGORY_SENSOR_CAMERA. Kategorisasi ini membantu aplikasi untuk memilih kamera yang ingin mereka kerjakan.

Kamera UVC dapat menentukan preferensi kategorinya melalui atribut, SensorCameraMode dan SkipCameraEnumeration, dalam Deskriptor BOS MS OS 2.0 yang dirinci di bagian berikut.

Atribut SensorCameraMode mengambil nilai 1 atau 2.

Nilai 1 akan mendaftarkan perangkat di bawah KSCATEGORY_SENSOR_CAMERA. Selain itu, tentukan nilai 1 untuk SkipCameraEnumeration untuk membuat kamera tersedia untuk aplikasi yang hanya mencari kamera sensor. Kamera yang hanya mengekspos jenis media kamera sensor yang harus menggunakan nilai ini.

Nilai 2 untuk SensorCameraMode akan mendaftarkan perangkat di bawah KSCATEGORY_SENSOR_CAMERA & KSCATEGORY_VIDEO_CAMERA. Hal ini membuat kamera tersedia untuk aplikasi yang mencari sensor dan kamera warna. Kamera yang mengekspos kamera sensor dan jenis media kamera warna harus menggunakan nilai ini.

Kami sarankan Anda menentukan nilai registri yang disebutkan di atas menggunakan deskriptor BOS. Lihat bagian Contoh perangkat komposit di bawah ini untuk contoh deskriptor BOS dengan pendeskripsi MS OS 2.0 tertentu platform.

Jika Anda tidak dapat memperbarui firmware perangkat seperti yang dijelaskan di atas, Anda dapat menggunakan INF kustom dan menentukan bahwa kamera Anda perlu didaftarkan sebagai kamera sensor dengan menentukan nilai untuk SensorCameraMode dan SkipCameraEnumeration sebagai berikut:

File INF kustom (berdasarkan driver UVC kotak masuk) harus menyertakan entri AddReg berikut:

SensorCameraMode: REG_DWORD: 1 (untuk mendaftar sebagai kamera sensor)

SkipCameraEnumeration: REG_DWORD: 1 (membuatnya hanya tersedia untuk aplikasi runtime integrasi)

Contoh bagian INF kustom adalah sebagai berikut:

[USBVideo.NT.HW]
AddReg=USBVideo.HW.AddReg

[USBVideo.HW.AddReg]
HKR,, SensorCameraMode, 0x00010001,1      ; places the value under device HW
                                          ; Registry key

HKR,, SkipCameraEnumeration, 0x00010001,1 ; This makes the camera available
                                          ; only for application looking for
                                          ; IR cameras

Jika atribut SensorCameraMode dan SkipCameraEnumeration tidak ditentukan dalam firmware atau INF, kamera terdaftar sebagai kamera warna dan hanya akan terlihat oleh aplikasi sadar kamera warna.

Aliran runtime integrasi

Driver kelas video USB kotak masuk (UVC) Windows mendukung kamera yang menangkap adegan dalam format YUV dan mengirimkan data piksel melalui USB sebagai YUV yang tidak dikompresi atau sebagai bingkai MJPEG terkompresi.

JENIS format GUID berikut harus ditentukan dalam deskriptor format video aliran, seperti yang didefinisikan dalam file header WDK ksmedia.h:

Jenis Deskripsi
KSDATAFORMAT_SUBTYPE_L8_IR Bidang luma 8-bit yang tidak dikompresi. Jenis ini memetakan ke MFVideoFormat_L8.
KSDATAFORMAT_SUBTYPE_L16_IR Bidang luma 16-bit yang tidak dikompresi. Jenis ini memetakan ke MFVideoFormat_L16.
KSDATAFORMAT_SUBTYPE_MJPG_IR Bingkai MJPEG terkompresi. Media Foundation mengubahnya menjadi bingkai NV12 yang tidak dikompresi dan hanya menggunakan bidang luma.

Ketika GUID jenis format ini ditentukan di bidang guidFormat dari deskriptor bingkai, alur penangkapan Media Foundation menandai aliran sebagai aliran runtime integrasi. Aplikasi yang ditulis dengan Media Foundation FrameReader API akan dapat menggunakan aliran IR. Tidak ada penskalaan atau konversi bingkai runtime integrasi yang didukung oleh alur untuk aliran runtime integrasi.

Aliran yang mengekspos jenis format runtime integrasi tidak boleh mengekspos jenis format RGB atau Kedalaman.

// Example Format Descriptor for UVC 1.1 frame based format

typedef struct _VIDEO_FORMAT_FRAME
{
    UCHAR bLength;
    UCHAR bDescriptorType;
    UCHAR bDescriptorSubtype;
    UCHAR bFormatIndex;
    UCHAR bNumFrameDescriptors;
    GUID  guidFormat;  // this field should contain the IR subtype GUID
    UCHAR bBitsPerPixel;
    UCHAR bDefaultFrameIndex;
    UCHAR bAspectRatioX;
    UCHAR bAspectRatioY;
    UCHAR bmInterlaceFlags;
    UCHAR bCopyProtect;
    UCHAR bVariableSize;
} VIDEO_FORMAT_FRAME, *PVIDEO_FORMAT_FRAME;

Catatan

Aliran IR akan muncul sebagai aliran pengambilan reguler di DShow.

Aliran kedalaman

Driver Windows inbox USB Video Class mendukung kamera yang menghasilkan aliran Kedalaman. Kamera ini menangkap informasi kedalaman (Misalnya, waktu penerbangan) adegan dan mengirimkan peta kedalaman sebagai bingkai YUV yang tidak dikompresi melalui USB. Jenis format berikut GUID harus ditentukan dalam deskriptor format video aliran, seperti yang didefinisikan dalam file header WDK ksmedia.h:

Jenis Deskripsi
KSDATAFORMAT_SUBTYPE_D16 Nilai peta kedalaman 16-bit. Jenis ini identik dengan MFVideoFormat_D16. Nilainya dalam milimeter.

Ketika jenis format GUID ditentukan dalam anggota guidFormat dari deskriptor bingkai, alur penangkapan Media Foundation menandai aliran sebagai aliran kedalaman. Aplikasi yang ditulis dengan FrameReader API akan dapat menggunakan aliran kedalaman. Tidak ada penskalaan atau konversi bingkai kedalaman yang didukung oleh alur untuk aliran kedalaman.

Aliran yang mengekspos jenis format Kedalaman tidak boleh mengekspos jenis format RGB atau IR.

// Example Format Descriptor for UVC 1.1 frame based format
typedef struct _VIDEO_FORMAT_FRAME
{
    UCHAR bLength;
    UCHAR bDescriptorType;
    UCHAR bDescriptorSubtype;
    UCHAR bFormatIndex;
    UCHAR bNumFrameDescriptors;
    GUID guidFormat; // this field should contain the IR subtype GUID
    UCHAR bBitsPerPixel;
    UCHAR bDefaultFrameIndex;
    UCHAR bAspectRatioX;
    UCHAR bAspectRatioY;
    UCHAR bmInterlaceFlags;
    UCHAR bCopyProtect;
    UCHAR bVariableSize;
} VIDEO_FORMAT_FRAME, *PVIDEO_FORMAT_FRAME;

Catatan

Aliran kedalaman muncul sebagai aliran pengambilan reguler di DShow.

Mengelompokkan kamera

Windows mendukung pengelompokan kamera berdasarkan ID kontainer mereka untuk membantu aplikasi bekerja dengan kamera terkait. Misalnya, kamera IR dan kamera Warna yang ada pada perangkat fisik yang sama dapat diekspos ke OS sebagai kamera terkait. Hal ini membuat aplikasi seperti Windows Hello menggunakan kamera terkait untuk skenarionya.

Hubungan antara fungsi kamera dapat ditentukan dalam deskriptor BOS kamera di firmware. Driver UVC akan menggunakan informasi ini dan mengekspos fungsi kamera ini sebagai terkait. Hal ini membuat tumpukan kamera OS mengeksposnya sebagai sekelompok kamera terkait ke aplikasi.

Firmware kamera harus menentukan UVC-FSSensorGroupID, yang merupakan GUID dalam bentuk string dengan tanda kurung keriting. Kamera yang memiliki UVC-FSSensorGroupID yang sama akan dikelompokkan bersama.

Grup sensor dapat diberi nama dengan menentukan UVC-FSSensorGroupName, string Unicode, di firmware.

Lihat bagian Contoh perangkat komposit di bawah ini untuk contoh ilustrasi BOS yang menentukan UVC-FSSensorGroupID dan UVC-FSSensorGroupName.

Jika Anda tidak dapat memperbarui firmware perangkat seperti yang dijelaskan di atas, Anda dapat menggunakan INF kustom dan menentukan bahwa kamera Anda adalah bagian dari grup sensor dengan menentukan ID grup sensor dan nama sebagai berikut. File INF kustom (berdasarkan driver UVC kotak masuk) harus menyertakan entri AddReg berikut:

FSSensorGroupID: REG_SZ: "{ID grup sensor ANDA GUID}"

FSSensorGroupName: REG_SZ: "nama ramah grup sensor Anda"

Contoh untuk bagian INF kustom adalah sebagai berikut:

[USBVideo.NT.Interfaces]
AddInterface=%KSCATEGORY_CAPTURE%,GLOBAL,USBVideo.Interface
AddInterface=%KSCATEGORY_RENDER%,GLOBAL,USBVideo.Interface
AddInterface=%KSCATEGORY_VIDEO%,GLOBAL,USBVideo.Interface
AddInterface=%KSCATEGORY_RENDER_EXT%,GLOBAL,USBVideo.Interface
AddInterface=%KSCATEGORY_VIDEO_CAMERA%,GLOBAL,USBVideo.Interface

[USBVideo.Interface]
AddReg=USBVideo.Interface.AddReg

[USBVideo.Interface.AddReg]
HKR,,CLSID,,%ProxyVCap.CLSID%
HKR,,FriendlyName,,%USBVideo.DeviceDesc%
HKR,,RTCFlags,0x00010001,0x00000010
HKR,, FSSensorGroupID,0x00000000,%FSSensorGroupID%
HKR,, FSSensorGroupName,0x00000000,%FSSensorGroupName%

Catatan

Grup Sensor tidak didukung dalam alur penangkapan DShow.

Metode 2 atau Metode 3 masih menangkap dukungan

Spesifikasi UVC memang menyediakan mekanisme untuk menentukan apakah antarmuka streaming video mendukung pengambilan gambar jenis metode 1/2/3 diam. Untuk membuat OS memanfaatkan dukungan penangkapan gambar metode 2/3 diam perangkat, melalui driver UVC, firmware perangkat dapat menentukan nilai dalam deskriptor BOS.

Nilai yang ditentukan untuk mengaktifkan pengambilan gambar diam Metode 2/3 adalah DWORD bernama UVC-EnableDependentStillPinCapture. Tentukan nilainya menggunakan deskriptor BOS. Contoh perangkat komposit di bawah ini menggambarkan mengaktifkan pengambilan gambar diam dengan contoh deskriptor BOS.

Jika Anda tidak dapat memperbarui firmware perangkat seperti yang dijelaskan di atas, Anda dapat menggunakan INF kustom untuk menentukan bahwa kamera Anda mendukung Metode 2 atau Metode 3 masih mengambil metode.

File INF kustom (berdasarkan driver UVC kustom atau driver UVC kotak masuk) harus menyertakan entri AddReg berikut:

EnableDependentStillPinCapture: REG_DWORD: 0x0 (Dinonaktifkan) ke 0x1 (Diaktifkan)

Ketika entri ini diatur ke Diaktifkan (0x1), alur pengambilan memanfaatkan Metode 2/3 untuk pengambilan gambar diam (dengan asumsi firmware juga mengiklankan dukungan untuk Metode 2/3 seperti yang ditentukan oleh spesifikasi UVC).

Contoh untuk bagian INF kustom adalah sebagai berikut:

[USBVideo.NT.Interfaces]
AddInterface=%KSCATEGORY_CAPTURE%,GLOBAL,USBVideo.Interface
AddInterface=%KSCATEGORY_RENDER%,GLOBAL,USBVideo.Interface
AddInterface=%KSCATEGORY_VIDEO%,GLOBAL,USBVideo.Interface
AddInterface=%KSCATEGORY_RENDER_EXT%,GLOBAL,USBVideo.Interface
AddInterface=%KSCATEGORY_VIDEO_CAMERA%,GLOBAL,USBVideo.Interface

[USBVideo.Interface]
AddReg=USBVideo.Interface.AddReg

[USBVideo.Interface.AddReg]
HKR,,CLSID,,%ProxyVCap.CLSID%
HKR,,FriendlyName,,%USBVideo.DeviceDesc%
HKR,,RTCFlags,0x00010001,0x00000010
HKR,,EnableDependentStillPinCapture,0x00010001,0x00000001

Rantai MFT Perangkat

MFT perangkat adalah mekanisme plugin mode pengguna yang direkomendasikan untuk IHV dan OEM untuk memperluas fungsionalitas kamera di Windows.

Sebelum Windows 10, versi 1703, alur kamera hanya mendukung satu plugin ekstensi DMFT.

Dimulai dengan Windows 10, versi 1703, alur kamera Windows mendukung rantai DMFTs opsional dengan maksimum dua DMFT.

Mulai Windows 11, versi 22H2, alur kamera Windows mendukung rantai DMFTs opsional dengan maksimum empat DMFT.

Ini memberikan fleksibilitas yang lebih besar bagi OEM dan IHV untuk memberikan nilai tambah dalam bentuk aliran kamera pasca pemrosesan. Misalnya, perangkat dapat menggunakan PDMFT bersama dengan IHV DMFT dan OEM DMFT.

Gambar berikut menggambarkan arsitektur yang melibatkan rantai DMFTs.

Rantai DMFT.

Ambil sampel aliran dari driver kamera ke DevProxy, lalu pergi melalui rantai DMFT. Setiap DMFT dalam rantai memiliki kesempatan untuk memproses sampel. Jika DMFT tidak ingin memproses sampel, DMFT dapat bertindak sebagai pass-through hanya meneruskan sampel ke DMFT berikutnya.

Untuk kontrol seperti KsProperty, panggilan berjalan di hulu - DMFT terakhir dalam rantai mendapatkan panggilan terlebih dahulu, panggilan dapat ditangani di sana atau diteruskan ke DMFT sebelumnya dalam rantai.

Kesalahan disebarkan dari DMFT ke DTM kemudian ke aplikasi. Untuk DMFTs IHV/OEM, jika salah satu DMFT gagal diinstansiasi, itu akan menjadi kesalahan fatal untuk DTM.

Persyaratan tentang DMFTs:

  • Jumlah pin input DMFT harus cocok dengan jumlah pin output DMFT sebelumnya, jika tidak, DTM akan gagal selama inisialisasi. Namun, jumlah pin input dan output dari DMFT yang sama tidak perlu cocok.

  • DMFT perlu mendukung antarmuka - IMFDeviceTransform, IMFShutdown, IMFRealTimeClientEx, IKsControl dan IMFMediaEventGenerator; IMFTransform mungkin perlu didukung jika ada MFT0 yang dikonfigurasi atau DMFT berikutnya dalam rantai memerlukan dukungan IMFTransform.

  • Pada sistem 64-bit yang tidak menggunakan Frame Server, DMFT 32-bit dan 64-bit harus didaftarkan. Mengingat bahwa kamera USB mungkin dicolokkan ke sistem arbitrer, untuk kamera USB "eksternal" (atau non-kotak masuk), vendor kamera USB harus menyediakan DMFT 32-bit dan 64-bit.

Mengonfigurasi rantai DMFT

Perangkat kamera dapat secara opsional menyediakan objek DMFT COM di DLL menggunakan file INF kustom yang menggunakan bagian kotak masuk USBVideo.INF.

Dalam kustom . Bagian "Interface AddReg" file INF, tentukan DMFT CLSID dengan menambahkan entri registri berikut:

CameraDeviceMftCLSIDChain (REG_MULTI_SZ) %Dmft0.CLSID%,%Dmft.CLSID%,%Dmft2.CLSID%

Seperti yang ditunjukkan dalam contoh pengaturan INF di bawah ini (ganti %Dmft0.CLSID% dan % Dmft1.CLSID% dengan string CLSID aktual yang Anda gunakan untuk DMFTs Anda), ada maksimum 2 CLSID yang diizinkan dalam Windows 10, versi 1703, dan yang pertama paling dekat dengan DevProxy dan yang terakhir adalah DMFT terakhir dalam rantai.

Platform DMFT CLSID adalah {3D096DDE-8971-4AD5-98F9-C74F56492630}.

Beberapa contoh pengaturan CameraDeviceMftCLSIDChain :

  • Tidak ada IHV/OEM DMFT atau Platform DMFT

    • CameraDeviceMftCLSIDChain = "" (atau tidak perlu menentukan entri registri ini)
  • IHV/OEM DMFT

    • CameraDeviceMftCLSIDChain = %Dmft.CLSID%
  • Platform DMFT <-> IHV/OEM DMFT

    • CameraDeviceMftCLSIDChain = "{3D096DDE-8971-4AD5-98F9-C74F56492630}",%Dmft.CLSID%

    • Berikut adalah cuplikan layar kunci registri hasil untuk kamera USB dengan Platform DMFT dan DMFT (dengan GUID {D671BE6C-FDB8-424F-81D7-03F5B1CE2CC7}) dalam rantai.

Rantai DMFT editor registri.

  • IHV/OEM DMFT0 <-> IHV/OEM DMFT1

    • CameraDeviceMftCLSIDChain = %Dmft0.CLSID%,%Dmft1.CLSID%,

Catatan

CameraDeviceMftCLSIDChain dapat memiliki maksimum 2 CLSID.

Jika CameraDeviceMftCLSIDChain dikonfigurasi, pengaturan CameraDeviceMftCLSID warisan dilewati oleh DTM.

Jika CameraDeviceMftCLSIDChain tidak dikonfigurasi dan CameraDeviceMftCLSID warisan dikonfigurasi, maka rantai akan terlihat seperti (jika kamera USB-nya dan didukung oleh Platform DMFT dan Platform DMFT diaktifkan) DevProxy <–> Platform DMFT <–> OEM/IHV DMFT atau (jika kamera tidak didukung oleh Platform DMFT atau Platform DMFT dinonaktifkan) DevProxy <-> OEM/IHV DMFT.

Contoh pengaturan file INF:

[USBVideo.Interface.AddReg]
HKR,,CLSID,,%ProxyVCap.CLSID%
HKR,,FriendlyName,,%USBVideo.DeviceDesc%
HKR,,RTCFlags,0x00010001,0x00000010
HKR,,EnablePlatformDmft,0x00010001,0x00000001
HKR,,DisablePlatformDmftFeatures,0x00010001,0x00000001
HKR,,CameraDeviceMftCLSIDChain, 0x00010000,%Dmft0.CLSID%,%Dmft1.CLSID%

MFT Perangkat Platform

Mulai Windows 10, versi 1703, Windows menyediakan Perangkat MFT kotak masuk untuk kamera UVC yang dikenal sebagai Platform DMFT (PDMFT) berdasarkan keikutsertaan. DMFT ini memungkinkan IHV dan OEM untuk memanfaatkan algoritma pemrosesan pasca yang disediakan Windows.

Fitur yang didukung oleh Platform DMFT Rilis Windows
Memungkinkan Region of Interest (ROI) berbasis wajah untuk penyesuaian 3A dalam kamera USB berkemampuan ROI. Windows 10, versi 1703

Catatan

Jika kamera tidak mendukung ROI berbasis UVC 1.5, maka PDMFT tidak akan memuat meskipun perangkat memilih untuk menggunakan PDMFT.

Kamera UVC dapat memilih untuk menggunakan platform DMFT dengan menentukan EnablePlatformDmft melalui deskriptor BOS.

Nilai yang ditentukan untuk mengaktifkan Platform DMFT adalah DWORD dengan nama UVC-EnablePlatformDmft dan menentukan nilainya menggunakan deskriptor BOS. Bagian Contoh perangkat komposit di bawah ini mengilustrasikan pengaktifan Platform DMFT dengan contoh deskriptor BOS.

Jika Anda tidak dapat memperbarui firmware perangkat seperti yang dijelaskan di atas, Anda dapat menggunakan file INF kustom untuk mengaktifkan Platform DMFT untuk perangkat.

File INF kustom (berdasarkan driver UVC kustom atau driver UVC kotak masuk) harus menyertakan entri AddReg berikut:

EnablePlatformDmft: REG_DWORD: 0x0 (Dinonaktifkan) ke 0x1 (Diaktifkan)

Ketika entri ini diatur ke Diaktifkan (0x1), alur pengambilan menggunakan platform kotak masuk DMFT untuk perangkat. Berikut ini memperlihatkan contoh bagian INF kustom ini:

[USBVideo.NT.Interfaces]
AddInterface=%KSCATEGORY_CAPTURE%,GLOBAL,USBVideo.Interface
AddInterface=%KSCATEGORY_RENDER%,GLOBAL,USBVideo.Interface
AddInterface=%KSCATEGORY_VIDEO%,GLOBAL,USBVideo.Interface
AddInterface=%KSCATEGORY_RENDER_EXT%,GLOBAL,USBVideo.Interface
AddInterface=%KSCATEGORY_VIDEO_CAMERA%,GLOBAL,USBVideo.Interface

[USBVideo.Interface]
AddReg=USBVideo.Interface.AddReg

[USBVideo.Interface.AddReg]
HKR,,CLSID,,%ProxyVCap.CLSID%
HKR,,FriendlyName,,%USBVideo.DeviceDesc%
HKR,,RTCFlags,0x00010001,0x00000010
HKR,,EnablePlatformDmft,0x00010001,0x00000001

Dalam Windows 10, versi 1703, jika perangkat memilih untuk menggunakan PDMFT maka semua fitur yang didukung oleh PDMFT diaktifkan (berdasarkan kemampuan perangkat). Konfigurasi granular fitur PDMFT tidak didukung.

Catatan

Koordinat ROI berbasis wajah dihitung relatif terhadap bidang tampilan gambar yang dikirimkan ke PDMFT. Jika bidang tampilan telah dimodifikasi karena penggunaan kontrol seperti Zoom, Pan atau Kemiringan atau Jendela Digital, kamera bertanggung jawab untuk memetakan koordinat yang disediakan kembali ke bidang pandang penuh sensor, mengingat jendela zoom/pan saat ini.

Profil Face Auth melalui Deskriptor MS OS

Windows 10 RS5 sekarang memberlakukan persyaratan Face Auth Profile V2 untuk kamera apa pun dengan dukungan Windows Hello. Untuk sistem berbasis MIPI dengan tumpukan driver kamera kustom, dukungan ini dapat diterbitkan baik melalui INF (atau Extension INF) atau melalui plug-in mode pengguna (Device MFT).

Namun, untuk perangkat USB Video, batasan dengan kamera berbasis UVC adalah bahwa untuk Windows 10 19H1, driver kamera kustom tidak diizinkan. Semua kamera berbasis UVC harus menggunakan driver Usb Video Class kotak masuk dan ekstensi vendor apa pun harus diimplementasikan dalam bentuk MFT Perangkat.

Untuk banyak OEM/ODM, pendekatan yang disukai untuk modul kamera adalah menerapkan banyak fungsionalitas dalam firmware modul, yaitu melalui Deskriptor OS Microsoft.

Kamera berikut didukung untuk menerbitkan Profil Face Auth melalui Deskriptor MSOS (juga disebut deskriptor BOS):

  • Hanya kamera RGB yang akan digunakan dalam Grup Sensor dengan kamera IR terpisah.

  • IR hanya kamera yang akan digunakan dalam Grup Sensor dengan kamera RGB terpisah.

  • Kamera RGB+IR dengan pin IR dan RGB terpisah.

Catatan

Jika firmware kamera tidak dapat memenuhi salah satu dari tiga persyaratan yang dijelaskan di atas, ODM/OEM harus menggunakan INF Ekstensi untuk mendeklarasikan Profil Kamera V2.

Contoh Tata Letak Deskriptor Microsoft OS

Contoh disertakan di bawah ini untuk spesifikasi berikut:

  • Spesifikasi deskriptor diperluas Microsoft OS 1.0

  • Spesifikasi deskriptor Microsoft OS 2.0

Spesifikasi Microsoft OS Extended Descriptor 1.0

Deskriptor OS properti yang diperluas memiliki dua komponen

  • Bagian header dengan panjang tetap
  • Satu atau beberapa bagian properti kustom panjang variabel, yang mengikuti bagian header

Bagian Header Deskriptor Microsoft OS 1.0

Bagian Header menjelaskan satu properti kustom (Profil Face Auth).

Offset Bidang Ukuran (byte) Nilai Deskripsi
0 dwLength 4 <>
4 bcdVersion 2 0x0100 Versi 1.0
6 Windex 2 0x0005 Deskriptor OS properti yang diperluas
8 wCount 2 0x0001 Satu properti kustom

Bagian Properti Kustom Deskriptor Microsoft OS 1.0

Offset Bidang Ukuran (byte) Nilai Deskripsi
0 dwSize 4 0x00000036 (54) Ukuran total (dalam byte) untuk properti ini.
4 dwPropertyDataType 4 0x00000004 REG_DWORD_LITTLE_ENDIAN
8 wPropertyNameLength 2 0x00000024 (36) Ukuran (dalam byte) dari nama properti.
10 bPropertyName 36 UVC-CPV2FaceAuth String "UVC-CPV2FaceAuth" di Unicode.
46 dwPropertyDataLength 4 0x00000004 4 byte untuk data properti (sizeof(DWORD)).
50 bPropertyData 4 Lihat Skema Data Di Bawah Ini Lihat Skema Data di bawah ini.
Skema Payload

Payload data UVC-CPV2FaceAuth adalah bilangan bulat yang tidak ditandatangani 32-bit. Urutan tinggi 16-bit mewakili indeks berbasis 0 dari daftar jenis media yang diekspos oleh pin RGB. Urutan rendah 16-bit mewakili indeks berbasis 0 dari daftar jenis media yang diekspos oleh pin IR.

Misalnya, Kamera Tipe 3 yang mengekspos jenis media berikut, dalam urutan yang dideklarasikan dari pin RGB:

  • YUY2, 640x480@30fps

  • MJPG, 1280x720@30fps

  • MJPG, 800x600@30fps

  • MJPG, 1920x1080@30fps

Dan jenis media berikut untuk IR:

  • L8, 480x480@30fps

  • L8, 480x480@15fps

  • L8, 480x480@10fps

Nilai payload 0x00010000 akan mengakibatkan Profil Face Auth berikut diterbitkan:

Pin0:(RES==1280,720; FRT==30,1; SUT==MJPG) // Jenis media kedua (0x0001)
Pin1:(RES==480,480; FRT==30,1; SUT==L8) // Tipe media pertama (0x0000)

Catatan

Pada saat penulisan ini, Windows Hello memiliki persyaratan minimum 480x480@7,5fps untuk aliran RGB dan 340x340@15fps untuk aliran IR. IHV/OEM diperlukan untuk memilih jenis media yang memenuhi persyaratan ini saat mengaktifkan Profil Face Auth.

Sampel Kamera Tipe 1

Untuk Kamera Tipe 1, karena tidak ada pin IR (dengan harapan bahwa Kamera Tipe 1 akan dipasangkan ke Kamera Tipe 2 pada mesin dalam Grup Sensor), hanya indeks jenis media RGB yang diterbitkan. Untuk indeks jenis media IR, nilai payload 16-bit urutan rendah harus diatur ke 0xFFFF.

Misalnya, jika Kamera Tipe 1 mengekspos daftar jenis media berikut:

  • YUY2, 640x480@30fps

  • MJPG, 1280x720@30fps

  • MJPG, 800x600@30fps

  • MJPG, 1920x1080@30fps

Untuk menerbitkan CPV2FaceAuth menggunakan MJPG, 1280x720@30fps jenis media, payload harus diatur ke 0x0001FFFF.

Sampel Kamera Tipe 2

Untuk Kamera Tipe 2, urutan tinggi 16-bit harus diatur ke 0xFFFF, dengan urutan rendah 16-bit yang menunjukkan jenis media runtime integrasi yang akan digunakan.

Misalnya, untuk Kamera Tipe 2 dengan jenis media berikut:

  • L8, 480x480@30fps

  • L8, 480x480@15fps

  • L8, 480x480@10fps

Jika jenis media pertama digunakan untuk Face Auth, nilainya harus: 0xFFFF0000.

Spesifikasi Microsoft OS Extended Descriptor 2.0

MSOS Extended Descriptor 2.0 dapat digunakan untuk menentukan nilai registri untuk menambahkan dukungan Profil Face Auth. Ini dilakukan menggunakan Deskriptor Properti Registri Microsoft OS 2.0.

Untuk entri registri UVC-CPV2FaceAuth, berikut ini memperlihatkan contoh set deskriptor MSOS 2.0:

UCHAR Example2_MSOS20DescriptorSet_UVCFaceAuthForFutureWindows[0x3C] =
{
    //
    // Microsoft OS 2.0 Descriptor Set Header
    //
    0x0A, 0x00,               // wLength - 10 bytes
    0x00, 0x00,               // MSOS20_SET_HEADER_DESCRIPTOR
    0x00, 0x00, 0x0?, 0x06,   // dwWindowsVersion – 0x060?0000 for future Windows version
    0x3C, 0x00,               // wTotalLength – 60 bytes

    //
    // Microsoft OS 2.0 Registry Value Feature Descriptor
    //
    0x32, 0x00,               // wLength - 50 bytes
    0x04, 0x00,               // wDescriptorType – 4 for Registry Property
    0x04, 0x00,               // wPropertyDataType - 4 for REG_DWORD_LITTLE_ENDIAN
    0x30, 0x00,               // wPropertyNameLength – 36 bytes
    0x55, 0x00, 0x56, 0x00,   // Property Name - "UVC-CPV2FaceAuth"
    0x43, 0x00, 0x2D, 0x00,
    0x43, 0x00, 0x50, 0x00,
    0x56, 0x00, 0x32, 0x00,
    0x46, 0x00, 0x61, 0x00,
    0x63, 0x00, 0x65, 0x00,
    0x41, 0x00, 0x75, 0x00,
    0x74, 0x00, 0x68, 0x00,
    0x00, 0x00, 0x00, 0x00,
    0x04, 0x00,               // wPropertyDataLength – 4 bytes
    0x00, 0x00, 0x01, 0x00    // PropertyData – 0x00010000 (see Payload Schema)
}

Saat entri registri UVC-CPV2FaceAuth ditambahkan, perangkat tidak perlu menerbitkan entri registri EnableDshowRedirection seperti yang dijelaskan dalam panduan implementasi DShow Bridge untuk perangkat UVC.

Namun, jika vendor perangkat harus mendukung versi Windows yang lebih lama dan/atau perlu mengaktifkan dekompresi MJPEG dalam Frame Server, entri registri EnableDshowRedirection harus ditambahkan.

Pembuatan Grup Sensor

Ketika OEM membangun sistem menggunakan Kamera Tipe 1 dan Tipe 2 untuk menyediakan aliran RGB dan IR untuk dukungan Windows Hello, OEM harus menyatakan kedua kamera tersebut menjadi bagian dari Grup Sensor yang disintesis.

Ini dilakukan dengan mendeklarasikan tag FSSensorGroupId dan FSSensorGroupName dalam Extension INF yang akan dibuat di bawah properti antarmuka perangkat untuk setiap kamera.

Namun, jika Extension INF tidak disediakan, ODM dapat menggunakan Deskriptor MSOS yang sama untuk menerbitkan nilai FSSensorGroupId dan FSSensorGroupName. Driver Kelas Video USB Windows 10 kotak masuk akan secara otomatis mengambil Deskriptor MSOS yang Nama Payload-nya telah diawali dengan "UVC-" dan memigrasikan tag ke penyimpanan properti antarmuka perangkat (menghapus awalan "UVC-").

Jadi Kamera Tipe 1 dan Tipe 2 yang menerbitkan hal berikut akan memungkinkan OS untuk mensintesis kamera ke dalam Grup Sensor multi-perangkat untuk digunakan dengan Windows Hello:

UVC-FSSensorGroupId
UVC-FSSensorGroupName

Payload untuk setiap tag harus berupa Untai (karakter) Unicode. Payload UVC-FSSensorGroupId harus berupa string GUID dalam format berikut:

{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXX}

Nilai GUID harus sama antara Kamera Tipe 1 dan Tipe 2 dan kedua kamera harus ditambahkan ke sasis fisik yang sama. Untuk kamera bawaan, sasis fisik adalah komputer itu sendiri. Untuk kamera eksternal, modul Kamera Tipe 1 dan Tipe 2 harus dibangun ke dalam perangkat fisik yang sama yang terhubung ke komputer.

Kategori Antarmuka Perangkat Kustom untuk Grup Sensor

Mulai tahun 19H1, Windows menyediakan mekanisme ekstensi yang ditentukan IHV/OEM untuk memungkinkan penerbitan Grup Sensor yang disintesis ke dalam kategori kustom atau yang telah ditentukan sebelumnya. Pembuatan Grup Sensor didefinisikan oleh IHV/OEM yang menyediakan kunci ID Grup Sensor di INF kustom:

FSSensorGroupId: {Custom GUID}
FSSensorGroupName: <Nama ramah yang digunakan untuk Grup Sensor>

Selain dua entri AddReg di atas dalam INF, entri AddReg baru didefinisikan untuk kategori kustom:

FSSensorGroupCategoryList: {GUID}; {GUID};...; {GUID}

Beberapa kategori ditentukan menggunakan titik koma (;) daftar GUID yang dibatasi.

Setiap perangkat yang menyatakan FSSensorGroupId yang cocok harus mendeklarasikan FSSensorGroupCategoryList yang sama. Jika daftar tidak cocok, semua daftar diabaikan dan Grup Sensor diterbitkan secara default ke dalam KSCATEGORY_SENSOR_GROUP seolah-olah tidak ada kategori kustom yang ditentukan.

Rotasi Kamera

Lihat Orientasi Perangkat Kamera

Cache Kontrol UVC

Lihat Cache Kontrol UVC

Deskriptor BOS dan MS OS 2.0

Kamera yang mematuhi UVC dapat menentukan nilai konfigurasi perangkat spesifik Windows dalam deskriptor BOS kemampuan platform di firmware-nya menggunakan Deskriptor Microsoft OS 2.0. Lihat dokumentasi tentang deskriptor MS OS 2.0 untuk memahami cara menentukan deskriptor BOS yang valid yang menyampaikan konfigurasi perangkat ke OS.

Microsoft OS 2.0 Descriptor Set Header

Offset Bidang Ukuran (byte) Deskripsi
0 wLength 2 Panjang dalam byte header ini, harus 10.
2 wDescriptorType 2 MSOS20_SET_HEADER_DESCRIPTOR
4 dwWindowsVersion 4 Versi Windows.
8 wTotalLength 2 Ukuran seluruh set deskriptor MS OS 2.0 termasuk ukuran header ini.

Deskriptor Properti Registri Microsoft OS 2.0

Offset Bidang Ukuran (byte) Deskripsi
0 wLength 2 Panjang dalam byte deskriptor ini
2 wDescriptorType 2 MS_OS_20_FEATURE_REG_PROPERTY
4 wPropertyDataType 2 0x04 (REG_DWORD_LITTLE_ENDIAN)
6 wPropertyNameLength 2 Panjang nama properti.
8 PropertyName Variabel Nama properti registri.
8+M wPropertyDataLength 2 Panjang data properti.
10+M PropertyData Variabel Data Properti

Ketika deskriptor MS OS 2.0 yang valid ditentukan dalam firmware, tumpukan USB menyalin nilai konfigurasi ke dalam kunci registri HW perangkat yang ditampilkan di bawah ini:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\USB\<Device ID>\<Instance ID>\Device Parameters

Driver UVC membaca nilai konfigurasi dari kunci registri HW perangkat dan mengonfigurasi perangkat pada OS yang sesuai. Misalnya, jika firmware menentukan perangkat yang akan didaftarkan sebagai kamera sensor menggunakan nilai konfigurasi, driver UVC mendaftarkan perangkat tepat di bawah kategori tersebut.

Mengonfigurasi perangkat UVC melalui deskriptor BOS platform adalah mekanisme yang diaktifkan di Windows 10, versi 1703 untuk membantu vendor perangkat UVC mengonfigurasi perangkat tanpa perlu file INF di OS Windows.

Mengonfigurasi perangkat UVC melalui INF kustom masih didukung dan yang lebih diutamakan daripada mekanisme berbasis deskriptor BOS. Saat menentukan properti perangkat melalui INF, Anda tidak perlu menambahkan awalan "UVC-". Awalan ini hanya diperlukan untuk properti perangkat yang ditentukan melalui deskriptor BOS dan yang spesifik per instans antarmuka. Jika perangkat Anda memerlukan plugin mode pengguna seperti DMFT, maka Anda perlu menyediakan INF untuk menginstal DMFT. Ini tidak dapat dikonfigurasi menggunakan firmware.

Nilai konfigurasi yang saat ini didukung melalui deskriptor BOS

Nama konfigurasi Jenis Deskripsi
SensorCameraMode REG_DWORD Daftarkan kamera di bawah kategori tertentu.
UVC-FSSensorGroupID, UVC-FSSensorGroupName REG_SZ Mengelompokkan kamera dengan UVC-FSSensorGroupID yang sama
UVC-EnableDependentStillPinCapture REG_DWORD Untuk mengaktifkan masih mengambil Metode 2/3
UVC-EnablePlatformDmft REG_DWORD Untuk mengaktifkan Platform DMFT

Ketika driver UVC melihat nilai registri dengan awalan "UVC-", driver UVC mengisi kunci registri instans antarmuka kategori perangkat, dengan nilai yang sama tanpa awalan. Driver melakukan ini untuk variabel apa pun yang ditentukan oleh firmware, bukan hanya yang tercantum di atas.

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\DeviceClasses\{e5323777-f976-4f5b-9b55-b94699c46e44}\<Device Symbolic Link>\Device Parameters

Agar OS dapat menggunakan Bos Platform Device Capability dan deskriptor MS OS 2.0, deskriptor perangkat harus menentukan versi bcdUSB agar 0x0210 atau lebih besar.

Contoh perangkat komposit

Bagian ini menyediakan deskriptor BOS dan deskriptor MS OS 2.0 untuk contoh perangkat komposit dengan dua fungsi kamera. Salah satu fungsinya adalah kamera warna UVC dan fungsi kedua adalah kamera IR UVC.

Contoh deskriptor adalah sebagai berikut:

  1. Daftarkan fungsi kamera warna di bawah KSCATEGORY_VIDEO_CAMERA

  2. Daftarkan fungsi kamera runtime integrasi di bawah KSCATEGORY_SENSOR_CAMERA

  3. Aktifkan tangkapan gambar masih fungsi kamera warna

  4. Mengaitkan warna dan fungsi kamera IR sebagai grup

Setelah enumerasi perangkat, tumpukan USB mengambil deskriptor BOS dari perangkat. Mengikuti deskriptor BOS adalah kemampuan perangkat khusus platform.

#include <usbspec.h>

const BYTE USBVideoBOSDescriptor[0x21] =
{
    /* BOS Descriptor */
    0x05,                       // Descriptor size
    USB_BOS_DESCRIPTOR_TYPE,    // Device descriptor type BOS
    0x21, 0x00,                 // Length 0x21 (33) this and all sub descriptors
    0x01,                       // Number of device capability descriptors

    /* Platform Device Capability Descriptor */
    0x1C,                                   // 28 bytes bLength
    USB_DEVICE_CAPABILITY_DESCRIPTOR_TYPE,  // Platform Descriptor type
    USB_DEVICE_CAPABILITY_PLATFORM,         // bDevCapabilityType PLATFORM
    0,                                      // bReserved
    0xDF, 0x60, 0xDD, 0xD8,                 // PlatformCapabilityUUID
    0x89, 0x45,                             // MS OS2.0 Descriptor
    0xC7, 0x4C,                             // D8DD60DF-4589-4CC7-9CD2-659D9E648A9F
    0x9C, 0xD2, 0x65, 0x9D, 0x9E, 0x64, 0x8A, 0x9F,
                                            // CapabilityData
    0x00, 0x00, 0x00, 0x0A,                 // dwWindowsVersion for Windows 10 and later
    0xC8, 0x02,                             // wLength 0x2C8 (712)
    0x01,                                   // bMS_VendorCode - any value. e.g. 0x01
    0x00                                    // bAltEnumCmd 0
};

Deskriptor kemampuan platform BOS menentukan:

  1. GUID kemampuan platform deskriptor MS OS 2.0

  2. Kode kontrol vendor bMS_VendorCode (di sini diatur ke 1. Dibutuhkan nilai apa pun yang lebih disukai vendor) untuk mengambil deskriptor MS OS 2.0.

  3. Deskriptor BOS ini berlaku untuk versi OS Windows 10 dan yang lebih baru.

Setelah melihat deskriptor BOS, tumpukan USB akan mengeluarkan permintaan kontrol khusus vendor untuk mengambil deskriptor MS OS 2.0.

Format permintaan kontrol untuk mengambil deskriptor khusus vendor MS OS 2.0:

bmRequestType BRequest wValue Windex wLength Data
1100 0000B bMS_VendorCode 0x00 0x07 Panjang Blob Set Deskriptor MS OS 2.0 yang dikembalikan

bmRequestType

  • Arah Transfer Data – Perangkat ke Host

  • Jenis – Vendor

  • Penerima - Perangkat

bRequest

Nilai bMS_VendorCode yang dikembalikan dalam struktur informasi set deskriptor.

wValue

Atur ke 0x00.

Windex

0x7 untuk MS_OS_20_DESCRIPTOR_INDEX.

wLength

Panjang set deskriptor MS OS 2.0, seperti yang dikembalikan dalam deskriptor BOS. 0x25C (604) dalam contoh ini.

Perangkat diharapkan mengembalikan deskriptor MS OS 2.0 seperti yang ditentukan dalam USBVideoMSOS20DescriptorSet.

USBVideoMSOS20DescriptorSet menjelaskan warna dan fungsi IR. Ini menentukan nilai Deskriptor MS OS 2.0 berikut:

  1. Atur Header

  2. Header Subset Konfigurasi

  3. Header Subset Fungsi Kamera Warna

  4. Deskriptor Fitur Nilai Registri untuk ID grup sensor

  5. Deskriptor Fitur Nilai Registri untuk nama grup sensor

  6. Deskriptor Fitur Nilai Registri untuk mengaktifkan pengambilan gambar diam

  7. Deskriptor Fitur Nilai Registri untuk mengaktifkan Platform DMFT

  8. Header Subset Fungsi Kamera IR

  9. Deskriptor Fitur Nilai Registri untuk ID grup sensor

  10. Deskriptor Fitur Nilai Registri untuk nama grup sensor

  11. Deskriptor Fitur Nilai Registri untuk mendaftarkan kamera sebagai kamera sensor

Firmware akan memiliki handler untuk permintaan vendor yang akan mengembalikan deskriptor MS OS 2.0 berikut untuk perangkat imajiner yang dijelaskan di awal bagian ini.

UCHAR USBVideoMSOS20DescriptorSet[0x2C8] =
{
    /* Microsoft OS 2.0 Descriptor Set Header */
    0x0A, 0x00,             // wLength of MSOS20_SET_HEADER_DESCRIPTOR
    0x00, 0x00,             // wDescriptorType == MSOS20_SET_HEADER_DESCRIPTOR
    0x00, 0x00, 0x00, 0x0A, // dwWindowsVersion – 0x10000000 for Windows 10
    0xC8, 0x02,             // wTotalLength - Total length 0x2C8 (712)

    /* Microsoft OS 2.0 Configuration Subset Header */
    0x08, 0x00,             // wLength of MSOS20_SUBSET_HEADER_CONFIGURATION
    0x01, 0x00,             // wDescriptorType == MSOS20_SUBSET_HEADER_CONFIGURATION
    0x00,                   // bConfigurationValue set to the first configuration
    0x00,                   // bReserved set to 0.
    0xBE, 0x02,             // wTotalLength - Total length 0x2BE (702)

    /****************Color Camera Function******************/

    /* Microsoft OS 2.0 Function Subset Header */
    0x08, 0x00,             // wLength of MSOS20_SUBSET_HEADER_FUNCTION
    0x02, 0x00,             // wDescriptorType == MSOS20_SUBSET_HEADER_FUNCTION
    0x00,                   // bFirstInterface field of the first IAD
    0x00,                   // bReserved set to 0.
    0x6E, 0x01,             // wSubsetLength - Length 0x16E (366)

    /****************Register the Color Camera in a sensor group******************/

    /* Microsoft OS 2.0 Registry Value Feature Descriptor */
    0x80, 0x00,             // wLength 0x80 (128) in bytes of this descriptor
    0x04, 0x00,             // wDescriptorType – MSOS20_FEATURE_REG_PROPERTY
    0x01, 0x00,             // wPropertyDataType - REG_SZ
    0x28, 0x00,             // wPropertyNameLength – 0x28 (40) bytes
    'U', 0x00, 'V', 0x00,   // Property Name - "UVC-FSSensorGroupID"
    'C', 0x00, '-', 0x00,
    'F', 0x00, 'S', 0x00,
    'S', 0x00, 'e', 0x00,
    'n', 0x00, 's', 0x00,
    'o', 0x00, 'r', 0x00,
    'G', 0x00, 'r', 0x00,
    'o', 0x00, 'u', 0x00,
    'p', 0x00, 'I', 0x00,
    'D', 0x00, 0x00, 0x00,
    0x4E, 0x00,             // wPropertyDataLength – 0x4E (78) bytes
                            // FSSensorGroupID GUID in string format:
                            // "{20C94C5C-F402-4F1F-B324-0C1CF0257870}"
    '{', 0x00, '2', 0x00,   // This is just an example GUID.
    '0', 0x00, 'C', 0x00,   // You need to generate and use your
    '9', 0x00, '4', 0x00,   // own GUID for the sensor group ID
    'C', 0x00, '5', 0x00,
    'C', 0x00, '-', 0x00,
    'F', 0x00, '4', 0x00,
    '0', 0x00, '2', 0x00,
    '-', 0x00, '4', 0x00,
    'F', 0x00, '1', 0x00,
    'F', 0x00, '-', 0x00,
    'B', 0x00, '3', 0x00,
    '2', 0x00, '4', 0x00,
    '-', 0x00, '0', 0x00,
    'C', 0x00, '1', 0x00,
    'C', 0x00, 'F', 0x00,
    '0', 0x00, '2', 0x00,
    '5', 0x00, '7', 0x00,
    '8', 0x00, '7', 0x00,
    '0', 0x00, '}', 0x00,
    0x00, 0x00,

    /* Microsoft OS 2.0 Registry Value Feature Descriptor */
    0x56, 0x00,             // wLength 0x56 (86) in bytes of this descriptor
    0x04, 0x00,             // wDescriptorType – MSOS20_FEATURE_REG_PROPERTY
    0x01, 0x00,             // wPropertyDataType - REG_SZ
    0x2C, 0x00,             // wPropertyNameLength – 0x2C (44) bytes
    'U', 0x00, 'V', 0x00,   // Property Name - "UVC-FSSensorGroupName"
    'C', 0x00, '-', 0x00,
    'F', 0x00, 'S', 0x00,
    'S', 0x00, 'e', 0x00,
    'n', 0x00, 's', 0x00,
    'o', 0x00, 'r', 0x00,
    'G', 0x00, 'r', 0x00,
    'o', 0x00, 'u', 0x00,
    'p', 0x00, 'N', 0x00,
    'a', 0x00, 'm', 0x00,
    'e', 0x00, 0x00, 0x00,
    0x20, 0x00,             // wPropertyDataLength – 0x20 (32) bytes
                            // FSSensorGroupName "YourCameraGroup"
    'Y', 0x00, 'o', 0x00,
    'u', 0x00, 'r', 0x00,
    'C', 0x00, 'a', 0x00,
    'm', 0x00, 'e', 0x00,
    'r', 0x00, 'a', 0x00,
    'G', 0x00, 'r', 0x00,
    'o', 0x00, 'u', 0x00,
    'p', 0x00, 0x00, 0x00,

    /****************Enable Still Image Capture for Color Camera************/

    /* Microsoft OS 2.0 Registry Value Feature Descriptor */
    0x54, 0x00,             // wLength 0x54 (84) in bytes of this descriptor
    0x04, 0x00,             // wDescriptorType – MSOS20_FEATURE_REG_PROPERTY
    0x04, 0x00,             // wPropertyDataType - REG_DWORD
    0x46, 0x00,             // wPropertyNameLength – 0x46 (70) bytes
    'U', 0x00, 'V', 0x00,   // Property Name - "UVC-EnableDependentStillPinCapture"
    'C', 0x00, '-', 0x00,
    'E', 0x00, 'n', 0x00,
    'a', 0x00, 'b', 0x00,
    'l', 0x00, 'e', 0x00,
    'D', 0x00, 'e', 0x00,
    'p', 0x00, 'e', 0x00,
    'n', 0x00, 'd', 0x00,
    'e', 0x00, 'n', 0x00,
    't', 0x00, 'S', 0x00,
    't', 0x00, 'i', 0x00,
    'l', 0x00, 'l', 0x00,
    'P', 0x00, 'i', 0x00,
    'n', 0x00, 'C', 0x00,
    'a', 0x00, 'p', 0x00,
    't', 0x00, 'u', 0x00,
    'r', 0x00, 'e', 0x00,
    0x00, 0x00,
    0x04, 0x00,              // wPropertyDataLength – 4 bytes
    0x01, 0x00, 0x00, 0x00,   // Enable still pin capture using Method 2 or Method 3

    /****************Enable Platform DMFT for ROI-capable USB Camera************/

    /* Microsoft OS 2.0 Registry Value Feature Descriptor */
    0x3C, 0x00,             // wLength 0x3C (60) in bytes of this descriptor
    0x04, 0x00,             // wDescriptorType – MSOS20_FEATURE_REG_PROPERTY
    0x04, 0x00,             // wPropertyDataType - REG_DWORD
    0x2E, 0x00,             // wPropertyNameLength – 0x2E (46) bytes
    'U', 0x00, 'V', 0x00,   // Property Name - "UVC-EnablePlatformDmft"
    'C', 0x00, '-', 0x00,
    'E', 0x00, 'n', 0x00,
    'a', 0x00, 'b', 0x00,
    'l', 0x00, 'e', 0x00,
    'P', 0x00, 'l', 0x00,
    'a', 0x00, 't', 0x00,
    'f', 0x00, 'o', 0x00,
    'r', 0x00, 'm', 0x00,
    'D', 0x00, 'm', 0x00,
    'f', 0x00, 't', 0x00,
    0x00, 0x00,
    0x04, 0x00,              // wPropertyDataLength – 4 bytes
    0x01, 0x00, 0x00, 0x00,  // Enable Platform DMFT

    /****************IR Camera Function*********************************************/

    /* Microsoft OS 2.0 Function Subset Header */
    0x08, 0x00,             // wLength of MSOS20_SUBSET_HEADER_FUNCTION
    0x02, 0x00,             // wDescriptorType == MSOS20_SUBSET_HEADER_FUNCTION
    0x01,                   // bFirstInterface set of the second function
    0x00,                   // bReserved set to 0.
    0x48, 0x01,             // wSubsetLength - Length 0x148 (328)

    /********Register the IR Camera to the same sensor group as the Color Camera*****/

    /* Microsoft OS 2.0 Registry Value Feature Descriptor */
    0x80, 0x00,             // wLength 0x80 (128) in bytes of this descriptor
    0x04, 0x00,             // wDescriptorType – MSOS20_FEATURE_REG_PROPERTY
    0x01, 0x00,             // wPropertyDataType - REG_SZ
    0x28, 0x00,             // wPropertyNameLength – 0x28 (40) bytes
    'U', 0x00, 'V', 0x00,   // Property Name - "UVC-FSSensorGroupID"
    'C', 0x00, '-', 0x00,
    'F', 0x00, 'S', 0x00,
    'S', 0x00, 'e', 0x00,
    'n', 0x00, 's', 0x00,
    'o', 0x00, 'r', 0x00,
    'G', 0x00, 'r', 0x00,
    'o', 0x00, 'u', 0x00,
    'p', 0x00, 'I', 0x00,
    'D', 0x00, 0x00, 0x00,
    0x4E, 0x00,             // wPropertyDataLength – 78 bytes
                            // FSSensorGroupID GUID in string format:
                            // "{20C94C5C-F402-4F1F-B324-0C1CF0257870}"
    '{', 0x00, '2', 0x00,
    '0', 0x00, 'C', 0x00,
    '9', 0x00, '4', 0x00,
    'C', 0x00, '5', 0x00,
    'C', 0x00, '-', 0x00,
    'F', 0x00, '4', 0x00,
    '0', 0x00, '2', 0x00,
    '-', 0x00, '4', 0x00,
    'F', 0x00, '1', 0x00,
    'F', 0x00, '-', 0x00,
    'B', 0x00, '3', 0x00,
    '2', 0x00, '4', 0x00,
    '-', 0x00, '0', 0x00,
    'C', 0x00, '1', 0x00,
    'C', 0x00, 'F', 0x00,
    '0', 0x00, '2', 0x00,
    '5', 0x00, '7', 0x00,
    '8', 0x00, '7', 0x00,
    '0', 0x00, '}', 0x00,
    0x00, 0x00,

    /* Microsoft OS 2.0 Registry Value Feature Descriptor */
    0x56, 0x00,             // wLength 0x56 (86) in bytes of this descriptor
    0x04, 0x00,             // wDescriptorType – MSOS20_FEATURE_REG_PROPERTY
    0x01, 0x00,             // wPropertyDataType - REG_SZ
    0x2C, 0x00,             // wPropertyNameLength – 0x2C (44) bytes
    'U', 0x00, 'V', 0x00,   // Property Name - "UVC-FSSensorGroupName"
    'C', 0x00, '-', 0x00,
    'F', 0x00, 'S', 0x00,
    'S', 0x00, 'e', 0x00,
    'n', 0x00, 's', 0x00,
    'o', 0x00, 'r', 0x00,
    'G', 0x00, 'r', 0x00,
    'o', 0x00, 'u', 0x00,
    'p', 0x00, 'N', 0x00,
    'a', 0x00, 'm', 0x00,
    'e', 0x00, 0x00, 0x00,
    0x20, 0x00,             // wPropertyDataLength – 32 bytes
                            // FSSensorGroupName "YourCameraGroup"
    'Y', 0x00, 'o', 0x00,
    'u', 0x00, 'r', 0x00,
    'C', 0x00, 'a', 0x00,
    'm', 0x00, 'e', 0x00,
    'r', 0x00, 'a', 0x00,
    'G', 0x00, 'r', 0x00,
    'o', 0x00, 'u', 0x00,
    'p', 0x00, 0x00, 0x00,

    /****************Make IR camera visible to applications*********************/

    /* Microsoft OS 2.0 Registry Value Feature Descriptor */
    0x30, 0x00,             // wLength 0x30 (48) in bytes of this descriptor
    0x04, 0x00,             // wDescriptorType – MSOS20_FEATURE_REG_PROPERTY
    0x04, 0x00,             // wPropertyDataType - REG_DWORD
    0x22, 0x00,             // wPropertyNameLength – 0x22 (34) bytes
    'S', 0x00, 'e', 0x00,
    'n', 0x00, 's', 0x00,
    'o', 0x00, 'r', 0x00,
    'C', 0x00, 'a', 0x00,
    'm', 0x00, 'e', 0x00,
    'r', 0x00, 'a', 0x00,
    'M', 0x00, 'o', 0x00,
    'd', 0x00, 'e', 0x00,
    0x00, 0x00,
    0x04, 0x00,              // wPropertyDataLength – 4 bytes
    0x01, 0x00, 0x00, 0x00, // This exposes the camera to OS as an IR only camera
                            // i.e. KSCATEGORY_SENSOR_CAMERA

    /* Microsoft OS 2.0 Registry Value Feature Descriptor */
    0x3A, 0x00,             // wLength 0x3A (58) in bytes of this descriptor
    0x04, 0x00,             // wDescriptorType – MSOS20_FEATURE_REG_PROPERTY
    0x04, 0x00,             // wPropertyDataType - REG_DWORD
    0x2C, 0x00,             // wPropertyNameLength – 0x2C (44) bytes
    'S', 0x00, 'k', 0x00,
    'i', 0x00, 'p', 0x00,
    'C', 0x00, 'a', 0x00,
    'm', 0x00, 'e', 0x00,
    'r', 0x00, 'a', 0x00,
    'E', 0x00, 'n', 0x00,
    'u', 0x00, 'm', 0x00,
    'e', 0x00, 'r', 0x00,
    'a', 0x00, 't', 0x00,
    'i', 0x00, 'o', 0x00,
    'n', 0x00, 0x00, 0x00,
    0x04, 0x00,             // wPropertyDataLength – 4 bytes
    0x01, 0x00, 0x00, 0x00  // This exposes the camera to applications looking for IR only cameras
};