Partilhar via


Guia de implementação da câmera USB Video Class (UVC)

A partir do Windows 10, é fornecido um driver UVC (Classe de Vídeo USB) nativo para dispositivos compatíveis com a especificação da Classe de Vídeo USB (versões 1.0 a 1.5). Este driver suporta câmeras coloridas e do tipo sensor. Este documento descreve como expor certos recursos de uma câmera compatível com UVC para os aplicativos através do driver da caixa de entrada.

Terminologia

Palavra-chave Descrição
UVC Classe de vídeo USB
Driver UVC USBVideo.sys driver fornecido com o sistema operacional
IR Infravermelho
Câmara a cores A câmera que emite fluxos de cores (por exemplo, câmeras RGB ou YUV)
Câmera do sensor A câmara que produz fluxos não coloridos (por exemplo, câmaras IR ou de profundidade)
BOS Armazenamento de objetos de dispositivo binário
Descritor do MS OS 2.0 Descritor de capacidade de dispositivo BOS específico da plataforma Microsoft

Câmaras de sensor

O Windows suporta duas categorias de câmaras. Uma é uma câmera colorida e a outra é uma câmera de sensor não colorido. Câmeras RGB ou YUV são categorizadas como câmeras coloridas e câmeras não coloridas como escala de cinza, IR e câmeras de profundidade são categorizadas como câmeras de sensor. O driver UVC suporta ambos os tipos de câmeras. Recomendamos que o firmware da câmera especifique um valor com base no qual o driver UVC registraria a câmera em uma ou ambas as categorias suportadas.

Uma câmara que suporte apenas tipos de formato de cor deve ser registada em KSCATEGORY_VIDEO_CAMERA. Uma câmara que suporte os tipos de formato IR ou Depth-only deve ser registada em KSCATEGORY_SENSOR_CAMERA. Uma câmera que suporte os tipos de formato colorido e não colorido deve ser registrada em KSCATEGORY_VIDEO_CAMERA e KSCATEGORY_SENSOR_CAMERA. Essa categorização ajuda os aplicativos a selecionar a câmera com a qual desejam trabalhar.

Uma câmara UVC pode especificar a sua preferência de categoria por meio de atributos, SensorCameraMode e SkipCameraEnumeration, no seu descritor BOS MS OS 2.0 detalhadas nas seções a seguir.

O atributo SensorCameraMode tem um valor 1 ou 2.

Um valor de 1 registará o dispositivo em KSCATEGORY_SENSOR_CAMERA. Além disso, especifique um valor de 1 para SkipCameraEnumeration para tornar a câmera disponível para aplicativos que procuram apenas câmeras de sensor. Uma câmera que expõe apenas tipos de mídia de câmera de sensor deve usar esse valor.

Um valor de 2 para SensorCameraMode registrará o dispositivo em KSCATEGORY_SENSOR_CAMERA & KSCATEGORY_VIDEO_CAMERA. Isso torna a câmera disponível para aplicações que procuram câmeras de sensor e coloridas. Uma câmera que expõe os tipos de mídia de câmera de sensor e câmera colorida deve usar esse valor.

Recomendamos que especifique o valor de registo acima mencionado utilizando o descritor BOS. Consulte a seção Exemplo de dispositivo composto abaixo para obter um descritor BOS de exemplo com um descritor MS OS 2.0 específico da plataforma.

Se não for possível atualizar o firmware do dispositivo conforme descrito acima, você poderá usar um INF personalizado e especificar que sua câmera precisa ser registrada como uma câmera de sensor especificando um valor para SensorCameraMode e SkipCameraEnumeration da seguinte maneira:

Um arquivo INF personalizado (com base no driver UVC da caixa de entrada) deve incluir as seguintes entradas AddReg:

SensorCameraMode: REG_DWORD: 1 (para se registrar como uma câmera sensor)

SkipCameraEnumeration: REG_DWORD: 1 (disponibilizá-lo apenas para aplicações IR)

Um exemplo da seção INF personalizada é o seguinte:

[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

Se os atributos SensorCameraMode e SkipCameraEnumeration não forem especificados no firmware ou no INF, a câmera será registrada como uma câmera colorida e ficará visível apenas para aplicativos com reconhecimento de câmera colorida.

Fluxo de IR

O driver de classe de vídeo USB (UVC) da caixa de entrada do Windows suporta câmeras que capturam a cena no formato YUV e transmitem os dados de pixel por USB como YUV não compactado ou como quadros MJPEG compactados.

Os GUIDs de tipo de formato a seguir devem ser especificados no descritor de formato de vídeo em fluxo contínuo, conforme definido no arquivo de cabeçalho WDK ksmedia.h:

Tipo Descrição
KSDATAFORMAT_SUBTYPE_L8_IR Plano luma de 8 bits não comprimido. Este tipo mapeia para MFVideoFormat_L8.
KSDATAFORMAT_SUBTYPE_L16_IR Plano luma de 16 bits não comprimido. Este tipo mapeia para MFVideoFormat_L16.
KSDATAFORMAT_SUBTYPE_MJPG_IR Quadros MJPEG comprimidos. Media Foundation converte isso em quadros não compactados NV12 e usa apenas o plano luma.

Quando estes GUIDs de tipo de formato são especificados no campo guidFormat do descritor de quadro, o Media Foundation pipeline de captura identifica o fluxo como um fluxo IR. Aplicativos escritos com Media Foundation FrameReader API serão capazes de consumir o fluxo de IR. Nenhum dimensionamento ou conversão dos quadros de IR é suportada pelo pipeline para os streams de IR.

Um fluxo de dados que exponha tipos de formato IR não deve expor tipos de formato RGB ou de Profundidade.

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

Observação

Os fluxos IR aparecerão como fluxos de captura regulares no DShow.

Fluxo de profundidade

O driver de classe de vídeo USB da caixa de entrada do Windows suporta câmeras que produzem fluxos de profundidade. Essas câmeras capturam as informações de profundidade (por exemplo, tempo de voo) da cena e transmitem o mapa de profundidade como quadros YUV não compactados por USB. O seguinte tipo de formato GUID deve ser especificado no descritor de formato de fluxo de vídeo, conforme definido no arquivo de cabeçalho WDK ksmedia.h:

Tipo Descrição
KSDATAFORMAT_SUBTYPE_D16 Valores de mapa de profundidade de 16 bits. Este tipo é idêntico ao MFVideoFormat_D16. Os valores são em milímetros.

Quando o GUID do tipo de formato é especificado no membro guidFormat do descritor de quadros, o pipeline de captura do Media Foundation marca o fluxo como fluxo de profundidade. Aplicativos escritos com a API FrameReader serão capazes de consumir o fluxo de profundidade. Nenhum dimensionamento ou conversões dos quadros de profundidade é suportado pelo pipeline para fluxos de profundidade.

Um fluxo que expõe tipos de formato de Profundidade não deve expor tipos de formato RGB ou 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;

Observação

Os fluxos de profundidade aparecem como fluxos de captura regulares no DShow.

Agrupamento de câmaras

O Windows oferece suporte ao agrupamento de câmeras com base em sua ID de contêiner para ajudar os aplicativos a trabalhar com câmeras relacionadas. Por exemplo, uma câmera IR e uma câmera colorida presentes no mesmo dispositivo físico podem ser expostas ao sistema operacional como câmeras relacionadas. Isso faz com que aplicativos como o Windows Hello usem as câmeras relacionadas para seus cenários.

A relação entre as funções da câmera pode ser especificada no descritor BOS da câmera no firmware. O driver UVC fará uso dessas informações e exporá essas funções da câmera como relacionadas. Isto faz com que a pilha de câmaras do sistema operativo as exponha como um grupo relacionado de câmaras para as aplicações.

O firmware da câmera deve especificar um UVC-FSSensorGroupID, que é um GUID em forma de cadeia de caracteres com o parêntese encaracolado. As câmeras que têm o mesmo UVC-FSSensorGroupID serão agrupadas.

O grupo de sensores pode receber um nome especificando UVC-FSSensorGroupName, uma cadeia de caracteres Unicode, no firmware.

Consulte a seção Exemplo de dispositivo composto abaixo para obter um exemplo ilustrativo de BOS que especifica UVC-FSSensorGroupID e UVC-FSSensorGroupName.

Se não for possível atualizar o firmware do dispositivo conforme descrito acima, você poderá usar um INF personalizado e especificar que sua câmera faz parte de um grupo de sensores, especificando um ID e um nome do grupo de sensores da seguinte maneira. O arquivo INF personalizado (com base no driver UVC da caixa de entrada) deve incluir as seguintes entradas AddReg:

FSSensorGroupID: REG_SZ: "{GUID do ID do grupo de sensores}"

FSSensorGroupName: REG_SZ: "seu nome amigável para o grupo de sensores"

Um exemplo para a seção INF personalizada seria o seguinte:

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

Observação

Os grupos de sensores não são suportados no pipeline de captura do DShow.

O método 2 ou o método 3 ainda capturam o suporte

A especificação UVC fornece um mecanismo para especificar se a interface de streaming de vídeo suporta o método 1/2/3 tipo captura de imagem estática. Para fazer com que o sistema operacional aproveite o suporte de captura de imagem estática do método 2/3 do dispositivo, através do driver UVC, o firmware do dispositivo pode especificar um valor no descritor BOS.

O valor a ser especificado para habilitar a captura de imagem estática do método 2/3 é um DWORD chamado UVC-EnableDependentStillPinCapture. Especifique seu valor usando o descritor BOS. O dispositivo composto de exemplo abaixo ilustra a ativação da captura de imagens estáticas com um descritor BOS de exemplo.

Se não conseguir atualizar o firmware do dispositivo conforme descrito acima, pode utilizar um INF personalizado para especificar que a câmara suporta os métodos 2 ou 3 de captura estática.

O arquivo INF personalizado (baseado no driver UVC personalizado ou no driver UVC da caixa de entrada) deve incluir a seguinte entrada AddReg:

EnableDependentStillPinCapture: REG_DWORD: 0x0 (desativado) a 0x1 (habilitado)

Quando esta entrada é definida como Ativado (0x1), o pipeline de captura aproveita o Método 2/3 para captura de imagem estática (assumindo que o firmware também anuncia suporte para o Método 2/3, conforme especificado pelas especificações UVC).

Um exemplo para a seção INF personalizada é o seguinte:

[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

Encadeamento MFT de dispositivos

Device MFT é o mecanismo de plug-in de modo de usuário recomendado para IHVs e OEMs para estender a funcionalidade da câmera no Windows.

Antes do Windows 10, versão 1703, o pipeline da câmera suportava apenas um plug-in de extensão DMFT.

A partir do Windows 10, versão 1703, o pipeline de câmara do Windows suporta uma cadeia opcional de DMFTs, com um máximo de dois DMFTs.

A partir do Windows 11, versão 22H2, o pipeline de câmera do Windows suporta uma cadeia opcional de DMFTs com máximo de quatro DMFTs.

Isso proporciona maior flexibilidade para OEMs e IHVs fornecerem valor agregado na forma de fluxos de câmeras de pós-processamento. Por exemplo, um dispositivo pode usar PDMFT juntamente com um IHV DMFT e um OEM DMFT.

A figura a seguir ilustra a arquitetura que envolve uma cadeia de DMFTs.

Cadeia DMFT.

Captura de amostras fluindo do driver da câmara para o DevProxy e, em seguida, através das cadeias DMFT. Cada CPO-D na cadeia pode processar a amostra. Se o DMFT não quiser processar a amostra, pode agir como um intermediário e simplesmente passar a amostra para o próximo DMFT.

Para controles como KsProperty, a chamada vai para cima – o último DMFT na cadeia recebe a chamada primeiro, a chamada pode ser tratada lá ou ser passada para DMFT anterior na cadeia.

Os erros são propagados do DMFT para o DTM e, em seguida, para os aplicativos. Para os DMFTs da IHV/OEM, se qualquer um dos DMFT falhar na instanciação, será um erro fatal para o DTM.

Requisitos relativos aos CPOD:

  • A contagem de pinos de entrada do DMFT deve corresponder à contagem de pinos de saída do DMFT anterior, caso contrário, o DTM falharia durante a inicialização. No entanto, as contagens de pinos de entrada e saída do mesmo DMFT não precisam ser iguais.

  • DMFT precisa de suportar interfaces - IMFDeviceTransform, IMFShutdown, IMFRealTimeClientEx, IKsControl e IMFMediaEventGenerator; o IMFTransform pode necessitar de ser suportado se o MFT0 estiver configurado ou se o próximo DMFT na cadeia exigir suporte para o IMFTransform.

  • Em sistemas de 64 bits que não usam o Frame Server, os DMFTs de 32 bits e 64 bits devem ser registrados. Dado que uma câmera USB pode ser conectada a um sistema arbitrário, para câmeras USB "externas" (ou não inbox), o fornecedor da câmera USB deve fornecer DMFTs de 32 bits e 64 bits.

Configurando a cadeia DMFT

Um dispositivo de câmera pode opcionalmente fornecer um objeto DMFT COM em uma DLL usando um arquivo INF personalizado que usa seções da caixa de entrada USBVideo.INF.

No ficheiro .INF personalizado, a seção "Interface AddReg", especifique os CLSIDs DMFT adicionando a seguinte entrada do registo:

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

Como mostrado nas configurações INF de exemplo abaixo (substitua o% 0.CLSID %Dmfte %% Dmft1.CLSID pelas cadeias de caracteres CLSID reais que você está usando para seus DMFTs), há no máximo 2 CLSIDs permitidos no Windows 10, versão 1703, e o primeiro está mais próximo do DevProxy e o último é o último DMFT na cadeia.

Plataforma DMFT CLSID é {3D096DDE-8971-4AD5-98F9-C74F56492630}.

Alguns exemplos de configurações CameraDeviceMftCLSIDChain :

  • Sem IHV/OEM DMFT ou plataforma DMFT

    • CameraDeviceMftCLSIDChain = "" (ou não é necessário especificar esta entrada de registo)
  • IHV/OEM DMFT

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

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

    • Aqui está uma captura de tela da chave de registro de resultado para uma câmera USB com a plataforma DMFT e um DMFT (com GUID {D671BE6C-FDB8-424F-81D7-03F5B1CE2CC7}) na cadeia.

Cadeia do Editor de Registo DMFT.

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

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

Observação

O CameraDeviceMftCLSIDChain pode ter um máximo de 2 CLSIDs.

Se CameraDeviceMftCLSIDChain estiver configurado, as configurações herdadas de CameraDeviceMftCLSID serão ignoradas pelo DTM.

Se o CameraDeviceMftCLSIDChain não estiver configurado e o legado CameraDeviceMftCLSID estiver configurado, então a cadeia seria assim: (se for uma câmera USB e for suportada pela Platform DMFT, e a Platform DMFT estiver ativada) DevProxy <–> Platform DMFT <–> OEM/IHV DMFT ou (se a câmera não for suportada pela Platform DMFT ou a Platform DMFT estiver desativada) DevProxy <-> OEM/IHV DMFT.

Exemplo de configurações de arquivo 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%

Dispositivo de plataforma MFT

A partir da versão 1703 do Windows 10, o Windows fornece uma MFT de Dispositivo integrada para câmeras UVC, conhecida como Platform DMFT (PDMFT), em regime de adesão. Esse DMFT permite que IHVs e OEMs aproveitem os algoritmos de pós-processamento fornecidos pelo Windows.

Recursos suportados pela plataforma DMFT Versão do Windows
Permite a Região de Interesse (ROI) baseada no rosto para ajustes 3A em câmaras USB com capacidade de ROI. Windows 10, versão 1703

Observação

Se a câmara não suportar o ROI baseado no UVC 1.5, então o PDMFT não carregará, mesmo que o dispositivo opte por utilizar o PDMFT.

Uma câmera UVC pode optar por usar a plataforma DMFT especificando o EnablePlatformDmft através do descritor BOS.

O valor a ser especificado para habilitar o Platform DMFT é um DWORD pelo nome UVC-EnablePlatformDmft e especificar seu valor usando o descritor BOS. A seção Exemplo de dispositivo composto abaixo ilustra a ativação do Platform DMFT com um descritor BOS de exemplo.

Se não for possível atualizar o firmware do dispositivo conforme descrito acima, você poderá usar um arquivo INF personalizado para habilitar o Platform DMFT para o dispositivo.

O arquivo INF personalizado (baseado no driver UVC personalizado ou no driver UVC da caixa de entrada) deve incluir a seguinte entrada AddReg:

EnablePlatformDmft: REG_DWORD: 0x0 (Desativado) para 0x1 (Habilitado)

Quando essa entrada é definida como Habilitado (0x1), o pipeline de captura usa a caixa de entrada Platform DMFT para o dispositivo. A seguir mostra um exemplo dessa seção INF personalizada:

[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

No Windows 10, versão 1703, se um dispositivo optar por usar o PDMFT, todos os recursos suportados pelo PDMFT serão habilitados (com base nos recursos do dispositivo). A configuração granular dos recursos do PDMFT não é suportada.

Observação

As coordenadas ROI baseadas no rosto são calculadas em relação ao campo de visão da imagem transmitida para o PDMFT. Se o campo de visão foi modificado devido ao uso de um controle como Zoom, Pan ou Tilt ou Digital Window, a câmera é responsável por mapear as coordenadas fornecidas de volta para o campo de visão completo do sensor, considerando a janela de zoom / pan atual.

Perfil de autenticação facial via descritores do MS OS

O Windows 10 RS5 agora impõe um requisito de Face Auth Profile V2 para qualquer câmera com suporte ao Windows Hello. Para sistemas baseados em MIPI com pilha de driver de câmera personalizada, esse suporte pode ser publicado por meio de um INF (ou um INF de extensão) ou através de um plug-in de modo de usuário (MFT de dispositivo).

No entanto, para dispositivos de vídeo USB, uma restrição com câmeras baseadas em UVC é que, para o Windows 10 19H1, drivers de câmera personalizados não são permitidos. Todas as câmaras baseadas em UVC devem usar o driver de classe de vídeo USB integrado, e quaisquer extensões de fornecedor devem ser implementadas na forma de um dispositivo MFT.

Para muitos OEM/ODMs, a abordagem preferida para módulos de câmera é implementar grande parte da funcionalidade dentro do firmware do módulo, ou seja, por meio de Descritores do Microsoft OS.

As seguintes câmeras são suportadas para publicar Face Auth Profile através dos descritores MSOS (também chamados de descritores BOS):

  • Câmara apenas RGB para ser usada no Grupo de Sensores com uma câmara IR separada.

  • Câmara IR apenas para ser usada num Grupo de Sensores com uma câmara RGB separada.

  • RGB + IR câmara com pinos IR e RGB separados.

Observação

Se o firmware da câmera não puder atender a um dos três requisitos detalhados acima, o ODM/OEM deve usar uma extensão INF para declarar o perfil da câmera V2.

Exemplo de layout do descritor do sistema operacional Microsoft

Seguem-se exemplos para as seguintes especificações:

  • Especificação de descritores estendidos do Microsoft OS 1.0

  • Especificação dos descritores do Microsoft OS 2.0

Especificação do Microsoft OS Extended Descriptor 1.0

O descritor de SO de propriedades estendidas tem dois componentes:

  • Uma seção de cabeçalho de comprimento fixo
  • Uma ou mais seções de propriedades personalizadas de comprimento variável, que seguem a seção de cabeçalho

Seção de cabeçalho do descritor do Microsoft OS 1.0

A seção Header descreve uma única propriedade personalizada (Face Auth Profile).

Compensação Campo Tamanho (bytes) Valor Descrição
0 dwComprimento 4 <>
4 bcdVersão 2 0x0100 Versão 1.0
6 wÍndice 2 0x0005 Descritor de SO de propriedade estendida
8 wContagem 2 0x0001 Uma propriedade personalizada

Seção de propriedade personalizada do descritor do Microsoft OS 1.0

Compensação Campo Tamanho (bytes) Valor Descrição
0 dwSize 4 0x00000036 (54) Tamanho total (em bytes) para esta propriedade.
4 dwPropertyDataType 4 0x00000004 REG_DWORD_LITTLE_ENDIAN
8 wPropertyNameLength 2 0x00000024 (36) Tamanho (em bytes) do nome da propriedade.
10 bNome da propriedade 36 UVC-CPV2FaceAuth String "UVC-CPV2FaceAuth" em Unicode.
46 dwPropertyDataLength 4 0x00000004 4 bytes para dados de propriedade (sizeof(DWORD)).
50 bPropertyData 4 Consulte o esquema de dados abaixo Consulte o esquema de dados abaixo.
Esquema de carga útil

A carga de dados UVC-CPV2FaceAuth é um inteiro não assinado de 32 bits. Os 16 bits de ordem superior representam o índice com base em 0 da lista de tipos de mídia exposta pelo pino RGB. A ordem baixa de 16 bits representa o índice baseado em 0 da lista de tipos de mídia exposta pelo pino IR.

Por exemplo, uma câmera tipo 3 que expõe os seguintes tipos de mídia, na ordem declarada do pino RGB:

  • YUY2, 640x480@30fps

  • MJPG, 1280x720@30fps

  • MJPG, 800x600@30fps

  • MJPG, 1920x1080@30fps

E o seguinte tipo de mídia para RI:

  • L8, 480x480@30fps

  • L8, 480x480@15fps

  • L8, 480x480@10fps

Um valor de carga útil de 0x00010000 terá como resultado a publicação do seguinte Perfil de Autenticação de Face:

Pin0:(RES==1280,720; TRF==30,1; SUT==MJPG) // Segundo tipo de mídia (0x0001)
Pin1:(RES==480,480; FRT==30,1; SUT==L8) // Primeiro tipo de mídia (0x0000)

Observação

No momento em que este artigo foi escrito, o Windows Hello tem um requisito mínimo de 480x480@7,5 fps para o fluxo RGB e 340x340@15fps para o fluxo IR. Os IHV/OEMs são obrigados a selecionar tipos de mídia que satisfaçam esse requisito ao habilitar o Perfil de Autenticação Facial.

Exemplo de câmera tipo 1

Para uma câmera Tipo 1, como não há pino IR (com a expectativa de que uma Câmera Tipo 1 será emparelhada com uma Câmera Tipo 2 na máquina em um Grupo de Sensores), apenas o índice de tipo de mídia RGB é publicado. Para o índice de tipo de mídia IR, o valor de 16 bits de ordem inferior da carga útil deve ser definido como 0xFFFF.

Por exemplo, se uma câmera tipo 1 expôs a seguinte lista de tipos de mídia:

  • YUY2, 640x480@30fps

  • MJPG, 1280x720@30fps

  • MJPG, 800x600@30fps

  • MJPG, 1920x1080@30fps

Para publicar o CPV2FaceAuth usando o MJPG, 1280x720@30fps tipo de mídia, a carga útil deve ser definida como 0x0001FFFF.

Exemplo de câmera tipo 2

Para uma câmera tipo 2, a ordem alta de 16 bits deve ser definida como 0xFFFF, com a ordem baixa de 16 bits indicando o tipo de mídia IR a ser usado.

Por exemplo, para uma câmera tipo 2 com os seguintes tipos de mídia:

  • L8, 480x480@30fps

  • L8, 480x480@15fps

  • L8, 480x480@10fps

Se o primeiro tipo de mídia for usado para Face Auth, o valor deverá ser: 0xFFFF0000.

Especificação do Microsoft OS Extended Descriptor 2.0

MSOS Extended Descriptor 2.0 pode ser usado para definir os valores do Registro para adicionar suporte ao Face Auth Profile. Isso é feito usando o Microsoft OS 2.0 Registry Property Descriptor.

Para a entrada de registo UVC-CPV2FaceAuth, o seguinte mostra um conjunto de descritores MSOS 2.0 de exemplo:

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

Quando a entrada de registo UVC-CPV2FaceAuth é adicionada, os dispositivos não precisam publicar a entrada de registo EnableDshowRedirection conforme descrito nas diretrizes de implementação do DShow Bridge para dispositivos UVC.

No entanto, se o fornecedor do dispositivo tiver de suportar versões mais antigas do Windows e/ou necessitar de ativar a descompressão MJPEG no Frame Server, a entrada de registo EnableDshowRedirection tem de ser adicionada.

Geração de Grupo de Sensores

Quando os OEMs criam sistemas usando câmeras Tipo 1 e Tipo 2 para fornecer fluxos RGB e IR para suporte ao Windows Hello, os OEMs devem declarar as duas câmeras como parte de um Grupo de Sensores sintetizado.

Isso é feito declarando uma marca FSSensorGroupId e FSSensorGroupName em um INF de extensão a ser criado sob a propriedade de interface do dispositivo para cada câmera.

No entanto, se a extensão INF não for fornecida, as ODMs poderão usar os mesmos descritores MSOS para publicar os valores FSSensorGroupId e FSSensorGroupName. O driver de classe de vídeo USB do Windows 10 na caixa de entrada pegará automaticamente qualquer descritor MSOS cujo nome de carga tenha sido prefixado com "UVC-" e migrará a tag para o armazenamento de propriedades da interface do dispositivo (removendo o prefixo "UVC-").

Assim, uma câmera Tipo 1 e Tipo 2 que publica o seguinte permitirá que o sistema operacional sintetize as câmeras em um grupo de sensores multi-dispositivo para uso com o Windows Hello:

UVC-FSSensorGroupId
UVC-FSSensorGroupName

A carga útil para cada tag deve ser uma cadeia de caracteres Unicode. A carga útil UVC-FSSensorGroupId deve ser uma cadeia de caracteres GUID no seguinte formato:

{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}

O valor do GUID deve ser o mesmo entre as câmeras Tipo 1 e Tipo 2 e ambas as câmeras devem ser adicionadas ao mesmo chassi físico. Para câmeras integradas, o chassi físico é o próprio computador. Para câmeras externas, os módulos de câmera Tipo 1 e Tipo 2 devem ser integrados no mesmo dispositivo físico conectado ao computador.

Categorias de interface de dispositivo personalizadas para grupos de sensores

A partir de 19H1, o Windows está fornecendo um mecanismo de extensão especificado por IHV/OEM para permitir a publicação de Grupos de Sensores sintetizados em qualquer categoria personalizada ou predefinida. A geração de um Grupo de Sensores é definida por IHV/OEMs que fornecem uma chave de ID de Grupo de Sensores no INF personalizado:

FSSensorGroupId: {GUID personalizado}
FSSensorGroupName: <Nome amigável usado para o grupo de sensores>

Além das duas entradas AddReg acima no INF, uma nova entrada AddReg é definida para categorias personalizadas:

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

As várias categorias são definidas usando uma lista GUID delimitada por ponto-e-vírgula (;).

Cada dispositivo que declara um FSSensorGroupId correspondente deve declarar o mesmo FSSensorGroupCategoryList. Se a lista não corresponder, todas as listas serão ignoradas e o Grupo de Sensores será publicado por padrão em KSCATEGORY_SENSOR_GROUP como se nenhuma categoria personalizada tivesse sido definida.

Rotação da câmara

Consulte a orientação do dispositivo da câmera

Cache de controle UVC

Consulte Cache de controle UVC

Descritor de BOS e MS OS 2.0

A câmera compatível com UVC pode especificar valores específicos de configuração de dispositivo do Windows num descritor BOS de capacidade de plataforma no seu firmware usando Descritores do Microsoft OS 2.0. Consulte a documentação no descritor do MS OS 2.0 para entender como especificar um descritor BOS válido que transmita a configuração do dispositivo para o sistema operacional.

Microsoft OS 2.0 Cabeçalho do Conjunto de Descritores

Compensação Campo Tamanho (bytes) Descrição
0 wComprimento 2 O comprimento em bytes deste cabeçalho deve ser 10.
2 wDescriptorType 2 MSOS20_SET_HEADER_DESCRIPTOR
4 dwWindowsVersion 4 Versão para Windows.
8 wTotalLength 2 O tamanho de todo o conjunto de descritores do MS OS 2.0, incluindo o tamanho deste cabeçalho.

Descritor de Propriedade do Registo do Microsoft OS 2.0

Compensação Campo Tamanho (bytes) Descrição
0 wComprimento 2 Comprimento em bytes deste descritor
2 wDescriptorType 2 MS_OS_20_FEATURE_REG_PROPERTY
4 TipoDeDadosDaPropriedade 2 0x04 (REG_DWORD_LITTLE_ENDIAN)
6 wPropertyNameLength 2 O comprimento do nome da propriedade.
8 Nome da propriedade Variável O nome da propriedade do registro.
8+M wPropertyDataLength 2 O comprimento dos dados da propriedade.
Mais de 10 milhões Dados de Propriedade Variável Dados da propriedade

Quando um descritor válido do MS OS 2.0 é especificado no firmware, a pilha USB copia os valores de configuração para a chave de registo HW do dispositivo mostrada abaixo:

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

O driver UVC lê os valores de configuração da chave de registro HW do dispositivo e configura o dispositivo no sistema operacional de acordo. Por exemplo, se o firmware especifica o dispositivo a ser registrado como uma câmera de sensor usando um valor de configuração, o driver UVC registra o dispositivo logo abaixo dessa categoria.

Configurar dispositivos UVC através do descritor BOS da plataforma é um mecanismo que foi habilitado no Windows 10, versão 1703 para ajudar os fornecedores de dispositivos UVC a configurar o dispositivo sem a necessidade de um arquivo INF no sistema operacional Windows.

A configuração de dispositivos UVC por meio de INF personalizado ainda é suportada e tem precedência sobre o mecanismo baseado em descritor BOS. Ao especificar as propriedades do dispositivo através do INF, não é necessário adicionar o prefixo "UVC-". Esse prefixo só é necessário para propriedades de dispositivo especificadas por meio do descritor BOS e específicas por instância de interface. Se o seu dispositivo precisa de plugins de modo de usuário como DMFT, então você precisa fornecer um INF para instalar o DMFT. Ele não pode ser configurado usando firmware.

Valores de configuração atualmente suportados através do descritor BOS

Nome da configuração Tipo Descrição
SensorCameraMode REG_DWORD Registe a câmara numa categoria específica.
UVC-FSSensorGroupID, UVC-FSSensorGroupName REG_SZ Câmeras de grupo com a mesma UVC-FSSensorGroupID
UVC-EnableDependentStillPinCapture REG_DWORD Para habilitar a captura de imagem estática Método 2/3
UVC-EnablePlatformDmft REG_DWORD Para habilitar a plataforma DMFT

Quando o driver UVC vê os valores do registo com o prefixo "UVC-", ele preenche a chave do registo da instância da interface de categoria do dispositivo com os mesmos valores sem o prefixo. O driver faz isso para qualquer variável especificada pelo firmware, não apenas as listadas acima.

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

Para que o SO possa utilizar a capacidade de dispositivo da plataforma BOS e os descritores do MS OS 2.0, o descritor do dispositivo deve especificar que a versão bcdUSB é 0x0210 ou superior.

Exemplo de dispositivo composto

Esta seção fornece um descritor BOS e um descritor MS OS 2.0 para um dispositivo composto de exemplo com duas funções de câmera. Uma função é uma câmera colorida UVC e a segunda função é uma câmera UVC IR.

Os descritores de exemplo são os seguintes:

  1. Registre a função de câmera colorida em KSCATEGORY_VIDEO_CAMERA

  2. Registre a função de câmera IR sob KSCATEGORY_SENSOR_CAMERA

  3. Ativar a função de captura de imagens estáticas com a câmera colorida

  4. Associa as funções de cor e câmera IR como um grupo

Após a enumeração do dispositivo, a pilha USB recupera o descritor BOS do dispositivo. A seguir ao descritor BOS, encontra-se uma capacidade de dispositivo específica da plataforma.

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

O descritor de recursos da plataforma BOS especifica:

  1. Capacidade GUID da plataforma do descritor MS OS 2.0

  2. Um código de controle de fornecedor bMS_VendorCode (aqui está definido como 1. Pode tomar qualquer valor que o fornecedor preferir) para recuperar o descritor do MS OS 2.0.

  3. Este descritor BOS é aplicável para a versão do SO Windows 10 e posterior.

Após visualizar o descritor BOS, a pilha USB emitirá uma solicitação de controlo específica do fornecedor para recuperar o descritor MS OS 2.0.

Formato da solicitação de controle para recuperar o descritor específico do fornecedor do MS OS 2.0:

bmRequestType BRequest wValor WIndex wComprimento Dados
1100 0000B bMS_VendorCode 0x00 0x07 Duração Blob do Conjunto de Descritores Microsoft OS 2.0 devolvido

bmRequestType

  • Direção de transferência de dados – Dispositivo para host

  • Tipo – Fornecedor

  • Destinatário - Dispositivo

bRequest

O valor bMS_VendorCode retornado na estrutura de informações do conjunto de descritores.

wValor

Defina como 0x00.

wIndex

0x7 para MS_OS_20_DESCRIPTOR_INDEX.

wLength

Comprimento do conjunto de descritores do MS OS 2.0, conforme retornado no descritor BOS. 0x25C (604) neste exemplo.

Espera-se que o dispositivo retorne o descritor do MS OS 2.0 como o especificado em USBVideoMSOS20DescriptorSet.

O USBVideoMSOS20DescriptorSet descreve as funções de cor e IR. Ele especifica os seguintes valores do descritor do MS OS 2.0:

  1. Definir cabeçalho

  2. Cabeçalho do subconjunto de configuração

  3. Cabeçalho do subconjunto da função da câmera colorida

  4. Descritor de Valor de Registo para ID de Grupo de Sensores

  5. Descritor de Funcionalidade de Valor do Registo para nome do grupo de sensores

  6. Descritor de Recurso de Valor do Registo para habilitar a captura de imagens estáticas

  7. Descritor de valor de registo para ativar o DMFT da plataforma

  8. Cabeçalho do Subconjunto da Função da Câmera IR

  9. Descritor de Valor de Registo para ID de grupo de sensores

  10. Descritor de Valor de Recurso do Registo para nome do grupo de sensores

  11. Descritor de recurso de valor do Registro para registrar a câmera como uma câmera de sensor

O firmware terá um manipulador para a solicitação do fornecedor que retornará o seguinte descritor do MS OS 2.0 para o dispositivo imaginário descrito no início desta seção.

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