다음을 통해 공유


USB UVC(비디오 클래스) 카메라 구현 가이드

Windows 10 시작하여 USB 비디오 클래스 사양(버전 1.0~1.5)을 준수하는 디바이스에 대해 받은 편지함 USB 비디오 클래스(UVC) 드라이버가 제공됩니다. 이 드라이버는 색상 및 센서 유형 카메라를 지원합니다. 이 문서에서는 받은 편지함 드라이버를 통해 UVC 규격 카메라의 특정 기능을 애플리케이션에 노출하는 방법을 간략하게 설명합니다.

용어

키워드 Description
Uvc USB 비디오 클래스
UVC 드라이버 OS와 함께 제공되는 USBVideo.sys 드라이버
IR 적외선 연결
컬러 카메라 색 스트림을 출력하는 카메라(예: RGB 또는 YUV 카메라)
센서 카메라 비색 스트림을 출력하는 카메라(예: IR 또는 깊이 카메라)
BOS 이진 디바이스 개체 저장소
MS OS 2.0 설명자 Microsoft 플랫폼별 BOS 디바이스 기능 설명자

센서 카메라

Windows는 두 가지 카메라 범주를 지원합니다. 하나는 컬러 카메라이고 다른 하나는 비색 센서 카메라입니다. RGB 또는 YUV 카메라는 컬러 카메라로 분류되고 회색 눈금, IR 및 깊이 카메라와 같은 비색 카메라는 센서 카메라로 분류됩니다. UVC 드라이버는 두 가지 유형의 카메라를 모두 지원합니다. 카메라 펌웨어는 UVC 드라이버가 지원되는 범주 중 하나 또는 둘 다에서 카메라를 등록할 값을 지정하는 것이 좋습니다.

색 전용 형식 형식을 지원하는 카메라는 KSCATEGORY_VIDEO_CAMERA 아래에 등록해야 합니다. IR 또는 깊이 전용 형식 형식을 지원하는 카메라는 KSCATEGORY_SENSOR_CAMERA 아래에 등록해야 합니다. 색 및 비색 형식 형식을 모두 지원하는 카메라는 KSCATEGORY_VIDEO_CAMERA 및 KSCATEGORY_SENSOR_CAMERA 등록해야 합니다. 이 분류는 애플리케이션이 작업할 카메라를 선택하는 데 도움이 됩니다.

UVC 카메라는 다음 섹션에 자세히 설명된 BOS MS OS 2.0 설명자에서 SensorCameraModeSkipCameraEnumeration 특성을 통해 범주 기본 설정을 지정할 수 있습니다.

SensorCameraMode 특성은 값 1 또는 2를 사용합니다.

값 1은 KSCATEGORY_SENSOR_CAMERA 디바이스를 등록합니다. 이 외에도 SkipCameraEnumeration 에 값 1을 지정하여 센서 카메라만 찾는 애플리케이션에서 카메라를 사용할 수 있도록 합니다. 센서 카메라 미디어 유형만 노출하는 카메라는 이 값을 사용해야 합니다.

SensorCameraMode에 대한 값 2는 KSCATEGORY_SENSOR_CAMERA & KSCATEGORY_VIDEO_CAMERA 디바이스를 등록합니다. 이렇게 하면 센서 및 컬러 카메라를 찾는 애플리케이션에서 카메라를 사용할 수 있습니다. 센서 카메라와 컬러 카메라 미디어 유형을 모두 노출하는 카메라는 이 값을 사용해야 합니다.

BOS 설명자를 사용하여 위에서 언급한 레지스트리 값을 지정하는 것이 좋습니다. 플랫폼별 MS OS 2.0 설명자를 사용하는 샘플 BOS 설명자는 아래 복합 디바이스 예제 섹션을 참조하세요.

위에서 설명한 대로 디바이스 펌웨어를 업데이트할 수 없는 경우 다음과 같이 SensorCameraModeSkipCameraEnumeration 값을 지정하여 사용자 지정 INF를 사용하고 카메라를 센서 카메라로 등록하도록 지정할 수 있습니다.

사용자 지정 INF 파일(받은 편지함 UVC 드라이버 기반)에는 다음 AddReg 항목이 포함되어야 합니다.

SensorCameraMode: REG_DWORD: 1(센서 카메라로 등록)

SkipCameraEnumeration: REG_DWORD: 1(IR 애플리케이션에서만 사용할 수 있도록 설정)

사용자 지정 INF 섹션의 예는 다음과 같습니다.

[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

SensorCameraModeSkipCameraEnumeration 특성이 펌웨어 또는 INF에 지정되지 않은 경우 카메라는 컬러 카메라로 등록되며 컬러 카메라 인식 애플리케이션에만 표시됩니다.

IR 스트림

Windows 받은 편지함 USB 비디오 클래스(UVC) 드라이버는 장면을 YUV 형식으로 캡처하고 USB를 통해 압축되지 않은 YUV 또는 압축된 MJPEG 프레임으로 픽셀 데이터를 전송하는 카메라를 지원합니다.

WDK ksmedia.h 헤더 파일에 정의된 대로 다음 형식 형식 GUID를 스트림 비디오 형식 설명자로 지정해야 합니다.

형식 Description
KSDATAFORMAT_SUBTYPE_L8_IR 압축되지 않은 8비트 루마 평면. 이 형식은 MFVideoFormat_L8 매핑됩니다.
KSDATAFORMAT_SUBTYPE_L16_IR 압축되지 않은 16비트 루마 평면. 이 형식은 MFVideoFormat_L16 매핑됩니다.
KSDATAFORMAT_SUBTYPE_MJPG_IR 압축된 MJPEG 프레임. Media Foundation은 이를 NV12 압축되지 않은 프레임으로 변환하고 루마 평면만 사용합니다.

이러한 형식 형식 GUID가 프레임 설명자의 guidFormat 필드에 지정되면 Media Foundation 캡처 파이프라인은 스트림을 IR 스트림으로 표시합니다. Media Foundation FrameReader API로 작성된 애플리케이션은 IR 스트림을 사용할 수 있습니다. IR 스트림에 대한 파이프라인에서는 IR 프레임의 크기 조정 또는 변환이 지원되지 않습니다.

IR 형식 형식을 노출하는 스트림은 RGB 또는 깊이 형식 형식을 노출해서는 안 됩니다.

// 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;

참고

IR 스트림은 DShow에서 일반 캡처 스트림으로 표시됩니다.

깊이 스트림

Windows 받은 편지함 USB 비디오 클래스 드라이버는 깊이 스트림을 생성하는 카메라를 지원합니다. 이러한 카메라는 장면의 깊이 정보(예: 비행 시간)를 캡처하고 USB를 통해 압축되지 않은 YUV 프레임으로 깊이 맵을 전송합니다. WDK ksmedia.h 헤더 파일에 정의된 대로 다음 형식 형식 GUID를 스트림 비디오 형식 설명자로 지정해야 합니다.

형식 Description
KSDATAFORMAT_SUBTYPE_D16 16비트 깊이 맵 값입니다. 이 형식은 MFVideoFormat_D16 동일합니다. 값은 밀리미터 단위입니다.

형식 형식 GUID가 프레임 설명자의 guidFormat 멤버에 지정되면 Media Foundation 캡처 파이프라인은 스트림을 깊이 스트림으로 표시합니다. FrameReader API로 작성된 애플리케이션은 깊이 스트림을 사용할 수 있습니다. 깊이 스트림에 대한 파이프라인에서는 깊이 프레임의 크기 조정 또는 변환이 지원되지 않습니다.

깊이 형식 형식을 노출하는 스트림은 RGB 또는 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;

참고

깊이 스트림은 DShow에서 일반 캡처 스트림으로 표시됩니다.

카메라 그룹화

Windows는 컨테이너 ID에 따라 카메라를 그룹화하여 애플리케이션이 관련 카메라로 작업할 수 있도록 지원합니다. 예를 들어 IR 카메라와 동일한 물리적 디바이스에 있는 Color 카메라는 관련 카메라로 OS에 노출될 수 있습니다. 따라서 Windows Hello 같은 애플리케이션은 관련 카메라를 시나리오에 사용합니다.

카메라 함수 간의 관계는 펌웨어에서 카메라의 BOS 설명자에 지정할 수 있습니다. UVC 드라이버는 이 정보를 사용하고 이러한 카메라 기능을 관련된 것으로 노출합니다. 이렇게 하면 OS 카메라 스택이 관련 카메라 그룹으로 애플리케이션에 노출됩니다.

카메라 펌웨어는 중괄호가 있는 문자열 형식의 GUID인 UVC-FSSensorGroupID를 지정해야 합니다. 동일한 UVC-FSSensorGroupID가 있는 카메라는 함께 그룹화됩니다.

센서 그룹은 펌웨어에서 유니코드 문자열 인 UVC-FSSensorGroupName을 지정하여 이름을 지정할 수 있습니다.

UVC-FSSensorGroupID 및 UVC-FSSensorGroupName을 지정하는 예제 BOS는 아래 복합 디바이스 예제 섹션을 참조하세요.

위에서 설명한 대로 디바이스 펌웨어를 업데이트할 수 없는 경우 사용자 지정 INF를 사용하고 다음과 같이 센서 그룹 ID 및 이름을 지정하여 카메라가 센서 그룹의 일부임을 지정할 수 있습니다. 사용자 지정 INF 파일(받은 편지함 UVC 드라이버 기반)에는 다음 AddReg 항목이 포함되어야 합니다.

FSSensorGroupID: REG_SZ: "{센서 그룹 ID GUID}"

FSSensorGroupName: REG_SZ: "센서 그룹 식별 이름"

사용자 지정 INF 섹션의 예는 다음과 같습니다.

[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%

참고

센서 그룹은 DShow 캡처 파이프라인에서 지원되지 않습니다.

메서드 2 또는 메서드 3은 여전히 지원을 캡처합니다.

UVC 사양은 비디오 스트리밍 인터페이스가 메서드 1/2/3 형식 스틸 이미지 캡처를 지원하는지 지정하는 메커니즘을 제공합니다. OS가 디바이스의 메서드 2/3 스틸 이미지 캡처 지원을 활용하도록 UVC 드라이버를 통해 디바이스 펌웨어는 BOS 설명자에 값을 지정할 수 있습니다.

메서드 2/3 스틸 이미지 캡처를 사용하도록 지정하는 값은 UVC-EnableDependentStillPinCapture라는 DWORD입니다. BOS 설명자를 사용하여 해당 값을 지정합니다. 아래 의 예제 복합 디바이스 는 예제 BOS 설명자를 사용하여 스틸 이미지 캡처를 사용하도록 설정하는 것을 보여 줍니다.

위에서 설명한 대로 디바이스 펌웨어를 업데이트할 수 없는 경우 사용자 지정 INF를 사용하여 카메라가 메서드 2 또는 메서드 3을 계속 캡처하도록 지정할 수 있습니다.

사용자 지정 INF 파일(사용자 지정 UVC 드라이버 또는 받은 편지함 UVC 드라이버 기반)에는 다음 AddReg 항목이 포함되어야 합니다.

EnableDependentStillPinCapture: REG_DWORD: 0x0(사용 안 함)에서 0x1(사용)

이 항목이 사용(0x1)으로 설정되면 캡처 파이프라인은 스틸 이미지 캡처를 위해 메서드 2/3을 활용합니다(펌웨어가 UVC 사양에 지정된 메서드 2/3에 대한 지원도 보급한다고 가정).

사용자 지정 INF 섹션의 예는 다음과 같습니다.

[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

디바이스 MFT 연결

디바이스 MFT는 Windows에서 카메라 기능을 확장하기 위해 IHV 및 OEM에 권장되는 사용자 모드 플러그 인 메커니즘입니다.

버전 1703을 Windows 10 전에 카메라 파이프라인은 하나의 DMFT 확장 플러그 인만 지원했습니다.

Windows 10 버전 1703부터 Windows 카메라 파이프라인은 최대 2개의 DMFT가 있는 선택적 DMFT 체인을 지원합니다.

Windows 11 버전 22H2부터 Windows 카메라 파이프라인은 최대 4개의 DMFT가 있는 선택적 DMFT 체인을 지원합니다.

이렇게 하면 OEM 및 IHV가 후처리 카메라 스트림의 형태로 부가 가치를 제공할 수 있는 유연성이 향상됩니다. 예를 들어 디바이스는 IHV DMFT 및 OEM DMFT와 함께 PDMFT를 사용할 수 있습니다.

다음 그림에서는 DMFT 체인과 관련된 아키텍처를 보여 줍니다.

DMFT 체인.

카메라 드라이버에서 DevProxy로 샘플 흐름을 캡처한 다음 DMFT 체인을 통과합니다. 체인의 모든 DMFT는 샘플을 처리할 수 있습니다. DMFT가 샘플을 처리하지 않으려면 다음 DMFT에 샘플을 전달하는 통과 역할을 할 수 있습니다.

KsProperty와 같은 컨트롤의 경우 호출이 업스트림 진행됩니다. 체인의 마지막 DMFT는 먼저 호출을 가져오고, 호출을 처리하거나 체인의 이전 DMFT에 전달될 수 있습니다.

오류는 DMFT에서 DTM으로 전파된 다음 애플리케이션으로 전파됩니다. IHV/OEM DMFT의 경우 DMFT가 인스턴스화되지 않으면 DTM에 심각한 오류가 발생합니다.

DMFT에 대한 요구 사항:

  • DMFT의 입력 핀 수는 이전 DMFT의 출력 핀 수와 일치해야 합니다. 그렇지 않으면 초기화 중에 DTM이 실패합니다. 그러나 동일한 DMFT의 입력 및 출력 핀 개수는 일치시킬 필요가 없습니다.

  • DMFT는 인터페이스를 지원해야 합니다. IMFDeviceTransform, IMFShutdown, IMFRealTimeClientEx, IKsControl 및 IMFMediaEventGenerator; MFT0이 구성되어 있거나 체인에 다음 DMFT가 IMFTransform 지원이 필요한 경우 IMFTransform을 지원해야 할 수 있습니다.

  • 프레임 서버를 사용하지 않는 64비트 시스템에서는 32비트 및 64비트 DMFT를 모두 등록해야 합니다. USB 카메라가 임의 시스템에 연결될 수 있다는 점을 감안할 때 "외부"(또는 받은 편지함이 아닌) USB 카메라의 경우 USB 카메라 공급업체는 32비트 및 64비트 DMFT를 모두 제공해야 합니다.

DMFT 체인 구성

카메라 디바이스는 필요에 따라 받은 편지함 USBVideo.INF의 섹션을 사용하는 사용자 지정 INF 파일을 사용하여 DLL에서 DMFT COM 개체를 제공할 수 있습니다.

사용자 지정 에서 INF 파일의 "Interface AddReg" 섹션에서 다음 레지스트리 항목을 추가하여 DMFT CLSID를 지정합니다.

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

아래의 샘플 INF 설정(%Dmft0.CLSID% 및 % Dmft1.CLSID%을 DMFT에 사용하는 실제 CLSID 문자열로 바꾸기)에 표시된 것처럼 Windows 10, 버전 1703에서 허용되는 CLSID는 최대 2개이며, 첫 번째 설정은 DevProxy에 가장 가깝고 마지막 DMFT는 체인의 마지막 DMFT입니다.

플랫폼 DMFT CLSID는 {3D096DDE-8971-4AD5-98F9-C74F56492630}입니다.

CameraDeviceMftCLSIDChain 설정 예제:

  • IHV/OEM DMFT 또는 플랫폼 DMFT 없음

    • CameraDeviceMftCLSIDChain = ""(또는 이 레지스트리 항목을 지정할 필요가 없음)
  • IHV/OEM DMFT

    • CameraDeviceMftCLSIDChain = %Dmft.CLSID%
  • 플랫폼 DMFT <-> IHV/OEM DMFT

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

    • 다음은 체인에 플랫폼 DMFT 및 DMFT(GUID {D671BE6C-FDB8-424F-81D7-03F5B1CE2CC7})가 있는 USB 카메라의 결과 레지스트리 키 스크린샷입니다.

레지스트리 편집기 DMFT 체인.

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

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

참고

CameraDeviceMftCLSIDChain에는 최대 2개의 CLSID가 있을 수 있습니다.

CameraDeviceMftCLSIDChain이 구성된 경우 레거시 CameraDeviceMftCLSID 설정은 DTM에서 건너뜁니다.

CameraDeviceMftCLSIDChain이 구성되지 않고 레거시 CameraDeviceMftCLSID가 구성된 경우 그러면 체인은 (USB 카메라가 플랫폼 DMFT 및 플랫폼 DMFT에서 지원되는 경우) DevProxy <– 플랫폼 DMFT <–>> OEM/IHV DMFT 또는 (플랫폼 DMFT 또는 플랫폼 DMFT에서 카메라가 지원되지 않는 경우) DevProxy <-> OEM/IHV DMFT와 같습니다.

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

Windows 10 버전 1703부터 Windows는 옵트인 기준으로 PDMFT(Platform DMFT)라고 하는 UVC 카메라용 받은 편지함 디바이스 MFT를 제공합니다. 이 DMFT를 사용하면 IHV 및 OEM이 Windows 제공 사후 처리 알고리즘을 활용할 수 있습니다.

플랫폼 DMFT에서 지원하는 기능 Windows 릴리스
ROI 지원 USB 카메라에서 3A 조정에 대한 ROI(얼굴 기반 관심 영역)를 사용하도록 설정합니다. Windows 10, 버전 1703

참고

카메라가 UVC 1.5 기반 ROI를 지원하지 않는 경우 디바이스가 PDMFT를 사용하도록 옵트인한 경우에도 PDMFT가 로드되지 않습니다.

UVC 카메라는 BOS 설명자를 통해 EnablePlatformDmft를 지정하여 플랫폼 DMFT를 사용하도록 옵트인할 수 있습니다.

Platform DMFT를 사용하도록 지정하는 값은 이름 UVC-EnablePlatformDmft 별 DWORD이며 BOS 설명자를 사용하여 해당 값을 지정합니다. 아래 의 복합 디바이스 예제 섹션에서는 예제 BOS 설명자를 사용하여 플랫폼 DMFT를 사용하도록 설정하는 것을 보여 줍니다.

위에서 설명한 대로 디바이스 펌웨어를 업데이트할 수 없는 경우 사용자 지정 INF 파일을 사용하여 디바이스에 플랫폼 DMFT를 사용하도록 설정할 수 있습니다.

사용자 지정 INF 파일(사용자 지정 UVC 드라이버 또는 받은 편지함 UVC 드라이버 기반)에는 다음 AddReg 항목이 포함되어야 합니다.

EnablePlatformDmft: REG_DWORD: 0x0(사용 안 함)에서 0x1(사용)

이 항목이 사용(0x1)으로 설정되면 캡처 파이프라인은 디바이스에 대해 받은 편지함 플랫폼 DMFT를 사용합니다. 다음은 이 사용자 지정 INF 섹션의 예제를 보여줍니다.

[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

Windows 10 버전 1703에서 디바이스가 PDMFT를 사용하도록 선택하면 PDMFT에서 지원하는 모든 기능이 활성화됩니다(디바이스 기능에 따라). PDMFT 기능의 세분화된 구성은 지원되지 않습니다.

참고

얼굴 기반 ROI 좌표는 PDMFT로 전송되는 이미지의 보기 필드를 기준으로 계산됩니다. 확대/축소, 팬 또는 기울기 또는디지털 창과 같은 컨트롤을 사용하여 보기 필드를 수정한 경우 카메라는 제공된 좌표를 현재 확대/이동 창을 고려하여 센서의 전체 보기 필드에 다시 매핑합니다.

MS OS 설명자를 통한 얼굴 인증 프로필

Windows 10 RS5는 이제 Windows Hello 지원되는 모든 카메라에 대해 Face Auth 프로필 V2 요구 사항을 적용합니다. 사용자 지정 카메라 드라이버 스택이 있는 MIPI 기반 시스템의 경우 이 지원은 INF(또는 확장 INF) 또는 디바이스 MFT(사용자 모드 플러그 인)를 통해 게시할 수 있습니다.

그러나 USB 비디오 디바이스의 경우 UVC 기반 카메라의 제약 조건은 Windows 10 19H1의 경우 사용자 지정 카메라 드라이버가 허용되지 않는다는 것입니다. 모든 UVC 기반 카메라는 받은 편지함 USB 비디오 클래스 드라이버를 사용해야 하며 모든 공급업체 확장은 디바이스 MFT 형식으로 구현되어야 합니다.

많은 OEM/ODM의 경우 카메라 모듈에 대한 기본 접근 방식은 모듈의 펌웨어, 즉 Microsoft OS 설명자를 통해 많은 기능을 구현하는 것입니다.

다음 카메라는 MSOS 설명자(BOS 설명자라고도 함)를 통해 얼굴 인증 프로필을 게시하는 데 지원됩니다.

  • 센서 그룹에서 별도의 IR 카메라로 사용할 RGB 전용 카메라입니다.

  • 별도의 RGB 카메라가 있는 센서 그룹에서 사용할 IR 전용 카메라입니다.

  • 별도의 IR 및 RGB 핀이 있는 RGB+IR 카메라.

참고

카메라 펌웨어가 위에서 설명한 세 가지 요구 사항 중 하나를 충족할 수 없는 경우 ODM/OEM은 확장 INF를 사용하여 카메라 프로필 V2를 선언해야 합니다.

예제 Microsoft OS 설명자 레이아웃

다음 사양에 대한 예제가 아래에 포함되어 있습니다.

  • Microsoft OS 확장 설명자 사양 1.0

  • Microsoft OS 2.0 설명자 사양

Microsoft OS 확장 설명자 1.0 사양

확장 속성 OS 설명자에는 두 가지 구성 요소가 있습니다.

  • 고정 길이 헤더 섹션
  • 헤더 섹션을 따르는 하나 이상의 가변 길이 사용자 지정 속성 섹션

Microsoft OS 1.0 설명자 헤더 섹션

헤더 섹션에서는 단일 사용자 지정 속성(Face Auth Profile)을 설명합니다.

Offset 필드 크기(바이트) Description
0 dwLength 4 <>
4 bcdVersion 2 0x0100 버전 1.0
6 wIndex 2 0x0005 확장 속성 OS 설명자
8 wCount 2 0x0001 하나의 사용자 지정 속성

Microsoft OS 1.0 설명자 사용자 지정 속성 섹션

Offset 필드 크기(바이트) Description
0 dwSize 4 0x00000036 (54) 이 속성의 총 크기(바이트)입니다.
4 dwPropertyDataType 4 0x00000004 REG_DWORD_LITTLE_ENDIAN
8 wPropertyNameLength 2 0x00000024 (36) 속성 이름의 크기(바이트)입니다.
10 bPropertyName 36 UVC-CPV2FaceAuth 유니코드의 "UVC-CPV2FaceAuth" 문자열입니다.
46 dwPropertyDataLength 4 0x00000004 속성 데이터(sizeof(DWORD))의 경우 4바이트입니다.
50 bPropertyData 4 아래 데이터 스키마를 참조하세요. 아래 데이터 스키마를 참조하세요.
페이로드 스키마

UVC-CPV2FaceAuth 데이터 페이로드는 32비트 부호 없는 정수입니다. 상위 16비트 는 RGB 핀에 의해 노출되는 미디어 유형 목록의 0 기반 인덱스를 나타냅니다. 낮은 순서 16비트 는 IR 핀에 의해 노출되는 미디어 유형 목록의 0 기반 인덱스를 나타냅니다.

예를 들어 RGB 핀에서 선언된 순서대로 다음 미디어 형식을 노출하는 Type 3 카메라입니다.

  • YUY2, 640x480@30fps

  • MJPG, 1280x720@30fps

  • MJPG, 800x600@30fps

  • MJPG, 1920x1080@30fps

IR에 대한 다음 미디어 유형은 다음과 같습니다.

  • L8, 480x480@30fps

  • L8, 480x480@15fps

  • L8, 480x480@10fps

페이로드 값이 0x00010000 다음과 같은 Face Auth 프로필이 게시됩니다.

Pin0:(RES==1280,720; FRT==30,1; SUT==MJPG) // 두 번째 미디어 형식(0x0001)
Pin1:(RES==480,480; FRT==30,1; SUT==L8) // 첫 번째 미디어 형식(0x0000)

참고

이 작성 당시 Windows Hello RGB 스트림에 대해 최소 480x480@7.5fps의 요구 사항을 가지고 있으며 IR 스트림에 대한 340x340@15fps. 얼굴 인증 프로필을 사용하도록 설정할 때 이 요구 사항을 충족하는 미디어 유형을 선택하려면 IHV/OEM이 필요합니다.

유형 1 카메라 샘플

Type 1 카메라의 경우 IR 핀이 없으므로(Type 1 카메라가 센서 그룹의 컴퓨터에서 Type 2 카메라와 페어링될 것으로 예상됨) RGB 미디어 형식 인덱스만 게시됩니다. IR 미디어 유형 인덱스의 경우 페이로드의 낮은 순서 16비트 값을 0xFFFF 설정해야 합니다.

예를 들어 유형 1 카메라가 다음 미디어 형식 목록을 노출한 경우:

  • YUY2, 640x480@30fps

  • MJPG, 1280x720@30fps

  • MJPG, 800x600@30fps

  • MJPG, 1920x1080@30fps

MJPG를 사용하여 CPV2FaceAuth를 게시하려면 미디어 형식을 1280x720@30fps 페이로드를 0x0001FFFF 설정해야 합니다.

유형 2 카메라 샘플

Type 2 카메라의 경우 높은 순서의 16비트 를 0xFFFF 설정해야 하며, 낮은 순서의 16비트에서는 사용할 IR 미디어 유형을 나타냅니다.

예를 들어 다음 미디어 형식이 있는 Type 2 카메라의 경우:

  • L8, 480x480@30fps

  • L8, 480x480@15fps

  • L8, 480x480@10fps

Face Auth에 첫 번째 미디어 형식을 사용하는 경우 값은 0xFFFF0000 이어야 합니다.

Microsoft OS 확장 설명자 2.0 사양

MSOS 확장 설명자 2.0을 사용하여 Face Auth 프로필 지원을 추가하는 레지스트리 값을 정의할 수 있습니다. 이 작업은 Microsoft OS 2.0 레지스트리 속성 설명자를 사용하여 수행됩니다.

UVC-CPV2FaceAuth 레지스트리 항목의 경우 다음은 샘플 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)
}

UVC-CPV2FaceAuth 레지스트리 항목이 추가되면 디바이스는 UVC 디바이스에 대한 DShow Bridge 구현 지침에 설명된 대로 EnableDshowRedirection 레지스트리 항목을 게시할 필요가 없습니다.

그러나 디바이스 공급업체가 이전 버전의 Windows를 지원해야 하거나 프레임 서버 내에서 MJPEG 압축 해제를 사용하도록 설정해야 하는 경우 EnableDshowRedirection 레지스트리 항목을 추가해야 합니다.

센서 그룹 생성

OEM이 Type 1 및 Type 2 카메라를 사용하여 시스템을 빌드하여 Windows Hello 지원을 위한 RGB 및 IR 스트림을 모두 제공하는 경우 OEM은 두 카메라를 합성 센서 그룹의 일부로 선언해야 합니다.

이 작업은 각 카메라의 디바이스 인터페이스 속성 아래에 만들 확장 INF에서 FSSensorGroupId 및 FSSensorGroupName 태그를 선언하여 수행됩니다.

그러나 확장 INF가 제공되지 않으면 ODM은 동일한 MSOS 설명자를 사용하여 FSSensorGroupId 및 FSSensorGroupName 값을 게시할 수 있습니다. 받은 편지함 Windows 10 USB 비디오 클래스 드라이버는 페이로드 이름 접두사가 "UVC-"인 MSOS 설명자를 자동으로 가져와서 태그를 디바이스 인터페이스 속성 저장소로 마이그레이션합니다("UVC-" 접두사 제거).

따라서 다음을 게시하는 Type 1 및 Type 2 카메라를 사용하면 OS에서 Windows Hello 사용할 수 있도록 카메라를 다중 디바이스 센서 그룹으로 합성할 수 있습니다.

UVC-FSSensorGroupId
UVC-FSSensorGroupName

각 태그에 대한 페이로드는 유니코드 문자열이어야 합니다. UVC-FSSensorGroupId 페이로드는 다음 형식의 GUID 문자열이어야 합니다.

{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXX}

GUID 값은 Type 1과 Type 2 카메라 간에 동일해야 하며 두 카메라를 동일한 물리적 섀시에 추가해야 합니다. 내장 카메라의 경우 물리적 섀시는 컴퓨터 자체입니다. 외부 카메라의 경우 유형 1 및 유형 2 카메라 모듈을 모두 컴퓨터에 연결된 동일한 물리적 디바이스에 빌드해야 합니다.

센서 그룹에 대한 사용자 지정 디바이스 인터페이스 범주

19H1부터 Windows는 합성된 센서 그룹을 사용자 지정 또는 미리 정의된 범주에 게시할 수 있도록 IHV/OEM 지정 확장 메커니즘을 제공합니다. 센서 그룹 생성은 사용자 지정 INF에서 센서 그룹 ID 키를 제공하는 IHV/OEM에 의해 정의됩니다.

FSSensorGroupId: {Custom GUID}
FSSensorGroupName: <센서 그룹에 사용되는 이름>

INF에서 위의 두 AddReg 항목 외에도 사용자 지정 범주에 대해 새 AddReg 항목이 정의됩니다.

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

여러 범주는 세미콜론(;) 구분된 GUID 목록을 사용하여 정의됩니다.

일치하는 FSSensorGroupId를 선언하는 각 디바이스는 동일한 FSSensorGroupCategoryList를 선언해야 합니다. 목록이 일치하지 않으면 모든 목록이 무시되고 사용자 지정 범주가 정의되지 않은 것처럼 센서 그룹이 기본적으로 KSCATEGORY_SENSOR_GROUP 게시됩니다.

카메라 회전

카메라 디바이스 방향을 참조하세요.

UVC 제어 캐시

UVC 제어 캐시를 참조하세요.

BOS 및 MS OS 2.0 설명자

UVC 규격 카메라는 Microsoft OS 2.0 설명자를 사용하여 펌웨어의 플랫폼 기능 BOS 설명자에서 Windows 특정 디바이스 구성 값을 지정할 수 있습니다. 디바이스 구성을 OS로 전달하는 유효한 BOS 설명자를 지정하는 방법을 이해하려면 MS OS 2.0 설명자에 대한 설명서를 참조하세요.

Microsoft OS 2.0 설명자 집합 헤더

Offset 필드 크기(바이트) Description
0 wLength 2 이 헤더의 길이(바이트)는 10이어야 합니다.
2 wDescriptorType 2 MSOS20_SET_HEADER_DESCRIPTOR
4 dwWindowsVersion 4 Windows 버전.
8 wTotalLength 2 이 헤더 크기를 포함하여 전체 MS OS 2.0 설명자 집합의 크기입니다.

Microsoft OS 2.0 레지스트리 속성 설명자

Offset 필드 크기(바이트) Description
0 wLength 2 이 설명자의 길이(바이트)
2 wDescriptorType 2 MS_OS_20_FEATURE_REG_PROPERTY
4 wPropertyDataType 2 0x04(REG_DWORD_LITTLE_ENDIAN)
6 wPropertyNameLength 2 속성 이름의 길이입니다.
8 PropertyName 변수 레지스트리 속성의 이름입니다.
8+M wPropertyDataLength 2 속성 데이터의 길이입니다.
10+M PropertyData 변수 속성 데이터

유효한 MS OS 2.0 설명자가 펌웨어에 지정되면 USB 스택은 아래 표시된 디바이스 HW 레지스트리 키에 구성 값을 복사합니다.

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

UVC 드라이버는 디바이스 HW 레지스트리 키에서 구성 값을 읽고 그에 따라 OS에서 디바이스를 구성합니다. 예를 들어 펌웨어가 구성 값을 사용하여 센서 카메라로 등록할 디바이스를 지정하는 경우 UVC 드라이버는 해당 범주 바로 아래에 디바이스를 등록합니다.

플랫폼 BOS 설명자를 통해 UVC 디바이스를 구성하는 것은 UVC 디바이스 공급업체가 Windows OS에서 INF 파일 없이도 디바이스를 구성할 수 있도록 Windows 10 버전 1703에서 사용하도록 설정된 메커니즘입니다.

사용자 지정 INF를 통해 UVC 디바이스를 구성하는 것은 여전히 지원되며 BOS 설명자 기반 메커니즘보다 우선합니다. INF를 통해 디바이스 속성을 지정하는 동안 접두사 "UVC-"를 추가할 필요가 없습니다. 이 접두사는 BOS 설명자를 통해 지정되고 인터페이스별 instance 특정한 디바이스 속성에만 필요합니다. 디바이스에 DMFT와 같은 사용자 모드 플러그 인이 필요한 경우 DMFT를 설치하기 위한 INF를 제공해야 합니다. 펌웨어를 사용하여 구성할 수 없습니다.

BOS 설명자를 통해 현재 지원되는 구성 값

구성 이름 형식 Description
SensorCameraMode REG_DWORD 특정 범주에 카메라를 등록합니다.
UVC-FSSensorGroupID, UVC-FSSensorGroupName REG_SZ 동일한 UVC-FSSensorGroupID 사용하여 카메라 그룹화
UVC-EnableDependentStillPinCapture REG_DWORD 계속 캡처 방법 2/3을 사용하도록 설정하려면
UVC-EnablePlatformDmft REG_DWORD 플랫폼 DMFT를 사용하도록 설정하려면

UVC 드라이버는 "UVC-" 접두사가 있는 레지스트리 값을 볼 때 접두사가 없는 동일한 값으로 레지스트리 키에 instance 디바이스의 범주 인터페이스를 채웁니다. 드라이버는 위에 나열된 변수뿐만 아니라 펌웨어에서 지정한 변수에 대해 이 작업을 수행합니다.

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

OS가 BOS 플랫폼 디바이스 기능 및 MS OS 2.0 설명자를 사용하려면 디바이스 설명자가 bcdUSB 버전을 0x0210 이상으로 지정해야 합니다.

복합 디바이스 예제

이 섹션에서는 두 개의 카메라 함수가 있는 복합 디바이스 예제에 대한 BOS 설명자 및 MS OS 2.0 설명자를 제공합니다. 한 가지 함수는 UVC 색 카메라이고 두 번째 함수는 UVC IR 카메라입니다.

샘플 설명자는 다음과 같습니다.

  1. KSCATEGORY_VIDEO_CAMERA 아래에 색 카메라 함수 등록

  2. KSCATEGORY_SENSOR_CAMERA IR 카메라 함수 등록

  3. 색 카메라 함수 스틸 이미지 캡처 사용

  4. 색상 및 IR 카메라 함수를 그룹으로 연결

디바이스 열거 시 USB 스택은 디바이스에서 BOS 설명자를 검색합니다. BOS 설명자를 따르는 것은 플랫폼별 디바이스 기능입니다.

#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
};

BOS 플랫폼 기능 설명자는 다음을 지정합니다.

  1. MS OS 2.0 설명자 플랫폼 기능 GUID

  2. 공급업체 제어 코드 bMS_VendorCode(다음은 1로 설정). MS OS 2.0 설명자를 검색하려면 공급업체가 선호하는 모든 값을 사용할 수 있습니다.

  3. 이 BOS 설명자는 OS 버전 Windows 10 이상에 적용됩니다.

BOS 설명자가 표시되면 USB 스택은 공급업체별 제어 요청을 실행하여 MS OS 2.0 설명자를 검색합니다.

MS OS 2.0 공급업체별 설명자를 검색하기 위한 제어 요청의 형식:

bmRequestType BRequest wValue WIndex wLength 데이터
1100 0000B bMS_VendorCode 0x00 0x07 길이 반환된 MS OS 2.0 설명자 Blob 설정

bmRequestType

  • 데이터 전송 방향 – 디바이스에서 호스트로

  • 형식 – 공급업체

  • 받는 사람 - 디바이스

bRequest

설명자 집합 정보 구조에 반환된 bMS_VendorCode 값입니다.

wValue

0x00 로 설정합니다.

wIndex

MS_OS_20_DESCRIPTOR_INDEX 대한 0x7.

wLength

BOS 설명자에 반환된 MS OS 2.0 설명자 집합의 길이입니다. 이 예제의 0x25C(604)입니다.

디바이스는 USBVideoMSOS20DescriptorSet에 지정된 것과 같은 MS OS 2.0 설명자를 반환해야 합니다.

USBVideoMSOS20DescriptorSet은 색 및 IR 함수를 설명합니다. 다음 MS OS 2.0 설명자 값을 지정합니다.

  1. 머리글 설정

  2. 구성 하위 집합 헤더

  3. Color Camera 함수 하위 집합 헤더

  4. 센서 그룹 ID에 대한 레지스트리 값 기능 설명자

  5. 센서 그룹 이름에 대한 레지스트리 값 기능 설명자

  6. 여전히 이미지 캡처를 사용하도록 설정하기 위한 레지스트리 값 기능 설명자

  7. 플랫폼 DMFT를 사용하도록 설정하기 위한 레지스트리 값 기능 설명자

  8. IR 카메라 함수 하위 집합 헤더

  9. 센서 그룹 ID에 대한 레지스트리 값 기능 설명자

  10. 센서 그룹 이름에 대한 레지스트리 값 기능 설명자

  11. 카메라를 센서 카메라로 등록하기 위한 레지스트리 값 기능 설명자

펌웨어에는 이 섹션의 시작 부분에 설명된 가상 디바이스에 대해 다음 MS OS 2.0 설명자를 반환하는 공급업체 요청에 대한 처리기가 있습니다.

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
};