Guia de implementação da câmera da classe de vídeo USB (UVC)

A partir de Windows 10, um driver UVC (Classe de Vídeo USB) de caixa de entrada é fornecido para dispositivos compatíveis com a especificação de Classe de Vídeo USB (versões 1.0 a 1.5). Esse driver dá suporte a câmeras de tipo de sensor e cor. Este documento descreve como expor determinadas funcionalidades de uma câmera compatível com UVC para os aplicativos por meio do driver de caixa de entrada.

Terminologia

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

Câmeras de sensor

O Windows dá suporte a duas categorias de câmeras. Uma é uma câmera colorida e a outra é uma câmera de sensor não colorida. As câmeras RGB ou YUV são categorizadas como câmeras coloridas e câmeras não coloridas, como escala cinza, câmeras IR e Profundidade são categorizadas como câmeras de sensor. O driver UVC dá suporte a 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 com suporte.

Uma câmera que dá suporte apenas a tipos de formato de cor deve ser registrada em KSCATEGORY_VIDEO_CAMERA. Uma câmera que dá suporte a tipos de formato ir ou somente profundidade deve ser registrada em KSCATEGORY_SENSOR_CAMERA. Uma câmera que dá suporte a tipos de formato de cor e não colorida 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 eles desejam trabalhar.

Uma câmera UVC pode especificar sua preferência de categoria por meio de atributos, SensorCameraMode e SkipCameraEnumeration, em seu Descritor bos MS OS 2.0 detalhado nas seções a seguir.

O atributo SensorCameraMode usa um valor 1 ou 2.

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

Um valor 2 para SensorCameraMode registrará o dispositivo em KSCATEGORY_SENSOR_CAMERA & KSCATEGORY_VIDEO_CAMERA. Isso disponibiliza a câmera para aplicativos que procuram câmeras de sensor e cores. Uma câmera que expõe os tipos de mídia da câmera de sensor e da câmera colorida deve usar esse valor.

Recomendamos que você especifique o valor do Registro mencionado acima usando 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 você não puder atualizar o firmware do dispositivo conforme descrito acima, 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 de sensor)

SkipCameraEnumeration: REG_DWORD: 1 (disponibilize-o somente para aplicativos IR)

Um exemplo da seção personalizada do INF é 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 da classe de vídeo USB da caixa de entrada do Windows (UVC) dá suporte a 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 do tipo de formato a seguir devem ser especificados no descritor de formato de vídeo de fluxo, conforme definido no arquivo de cabeçalho ksmedia.h do WDK:

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

Quando esses GUIDs de tipo de formato são especificados no campo guidFormat do descritor de quadro, o pipeline de captura do Media Foundation marca o fluxo como fluxo de IR. Os aplicativos escritos com a API Do Media Foundation FrameReader poderão consumir o fluxo de IR. Não há suporte para dimensionamento ou conversões de quadros de IR pelo pipeline para fluxos de IR.

Um fluxo que expõe tipos de formato IR não deve expor tipos de formato RGB ou Depth.

// 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 IR aparecerão como fluxos de captura regulares no DShow.

Fluxo de profundidade

O driver da Classe de Vídeo USB da caixa de entrada do Windows dá suporte a câmeras que produzem fluxos de profundidade. Essas câmeras capturam as informações de profundidade (por exemplo, o 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 vídeo de fluxo, conforme definido no arquivo de cabeçalho ksmedia.h do WDK:

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

Quando o guid do tipo de formato é especificado no membro guidFormat do descritor de quadro, o pipeline de captura do Media Foundation marca o fluxo como fluxo de profundidade. Os aplicativos gravados com a API FrameReader poderão consumir o fluxo de profundidade. Não há suporte para dimensionamento ou conversões dos quadros de profundidade pelo pipeline para fluxos de profundidade.

Um fluxo que expõe tipos de formato depth 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.

Agrupando câmeras

O Windows dá 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 Color presentes no mesmo dispositivo físico podem ser expostos ao sistema operacional como câmeras relacionadas. Isso faz com que aplicativos como Windows Hello usem as câmeras relacionadas para seus cenários.

A relação entre as funções de câmera pode ser especificada no descritor BOS da câmera no firmware. O driver UVC usará essas informações e exporá essas funções de câmera como relacionadas. Isso faz com que a pilha de câmeras do sistema operacional as exponha como um grupo relacionado de câmeras para os aplicativos.

O firmware da câmera deve especificar um UVC-FSSensorGroupID, que é um GUID no formato 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 BOS que especifica UVC-FSSensorGroupID e UVC-FSSensorGroupName.

Se você não puder atualizar o firmware do dispositivo conforme descrito acima, poderá usar um INF personalizado e especificar que sua câmera faz parte de um grupo de sensores especificando uma 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 da ID do grupo de sensores}"

FSSensorGroupName: REG_SZ: "nome amigável do 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

Não há suporte para grupos de sensores 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 dá suporte à captura de imagem do tipo Método 1/2/3. Para fazer com que o sistema operacional aproveite o suporte à captura de imagem do método 2/3 do dispositivo, por meio 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 do Método 2/3 ainda é um DWORD chamado UVC-EnableDependentStillPinCapture. Especifique seu valor usando o descritor BOS. O exemplo de dispositivo composto abaixo ilustra a habilitação da captura de imagem ainda com um descritor BOS de exemplo.

Se você não puder atualizar o firmware do dispositivo conforme descrito acima, poderá usar um INF personalizado para especificar que sua câmera dá suporte ao método de captura do Método 2 ou método 3.

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

EnableDependentStillPinCapture: REG_DWORD: 0x0 (Desabilitado) para 0x1 (Habilitado)

Quando essa entrada é definida como Habilitada (0x1), o pipeline de captura aproveita o Método 2/3 para captura de imagem ainda (supondo que o firmware também anuncie suporte para o Método 2/3, conforme especificado pela especificação 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 do dispositivo

O MFT do dispositivo é 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 de Windows 10, versão 1703, o pipeline de câmera tinha suporte apenas para um plug-in de extensão DMFT.

A partir do Windows 10, versão 1703, o pipeline de câmera do Windows dá suporte a uma cadeia opcional de DMFTs com no máximo duas DMFTs.

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

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

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

Cadeia DMFT.

Os exemplos de captura fluem do driver da câmera para o DevProxy e, em seguida, passam pelas cadeias DMFT. Cada DMFT na cadeia tem a chance de processar o exemplo. Se o DMFT não quiser processar o exemplo, ele poderá atuar como uma passagem apenas passar o exemplo para o próximo DMFT.

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

Os erros são propagados de DMFT para DTM e, em seguida, para aplicativos. Para DMFTs IHV/OEM, se qualquer um dos DMFT não for instanciado, será um erro fatal para dTM.

Requisitos em DMFTs:

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

  • A DMFT precisa dar suporte a interfaces - IMFDeviceTransform, IMFShutdown, IMFRealTimeClientEx, IKsControl e IMFMediaEventGenerator; IMFTransform pode precisar ter suporte se houver MFT0 configurado ou o próximo DMFT na cadeia exigir suporte a IMFTransform.

  • Em sistemas de 64 bits que não usam o Servidor de Quadros, as DMFTs de 32 e 64 bits devem ser registradas. Considerando que uma câmera USB pode ser conectada a um sistema arbitrário, para câmeras USB "externas" (ou não de caixa de entrada), o fornecedor da câmera USB deve fornecer DMFTs de 32 bits e 64 bits.

Configurando a cadeia DMFT

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

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

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

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

O DMFT CLSID da plataforma é {3D096DDE-8971-4AD5-98F9-C74F56492630}.

Alguns exemplos de configurações de CameraDeviceMftCLSIDChain :

  • Nenhuma DMFT IHV/OEM ou DMFT de plataforma

    • CameraDeviceMftCLSIDChain = "" (ou não é necessário especificar essa entrada do Registro)
  • IHV/OEM DMFT

    • CameraDeviceMftCLSIDChain = %Dmft.CLSID%
  • DMFT da <plataforma –> IHV/OEM DMFT

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

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

Cadeia DMFT do editor do Registro.

  • 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 CameraDeviceMftCLSIDChain não estiver configurado e o CameraDeviceMftCLSID herdado estiver configurado, em seguida, a cadeia se pareceria com (se sua câmera USB e compatível com a Plataforma DMFT e a Plataforma DMFT estiver habilitada) DevProxy <–> Platform DMFT <–> OEM/IHV DMFT ou (se a câmera não tiver suporte da Plataforma DMFT ou da Plataforma DMFT estiver desabilitada) 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 do Windows 10, versão 1703, o Windows fornece uma caixa de entrada MFT de dispositivo para câmeras UVC conhecidas como PDMFT (Platform DMFT) em uma base de aceitação. Essa DMFT permite que IHVs e OEMs aproveitem os algoritmos de pós-processamento fornecidos pelo Windows.

Recursos compatíveis com a Plataforma DMFT Versão do Windows
Habilita a ROI (Região de Interesse) baseada em face para ajustes 3A em câmeras USB compatíveis com ROI. Windows 10, versão 1703

Observação

Se a câmera não der suporte ao ROI baseado em UVC 1.5, o PDMFT não será carregado mesmo que o dispositivo tenha optado por usar PDMFT.

Uma câmera UVC pode optar por usar a plataforma DMFT especificando EnablePlatformDmft por meio do descritor BOS.

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

Se você não puder atualizar o firmware do dispositivo conforme descrito acima, poderá usar um arquivo INF personalizado para habilitar a plataforma DMFT para o dispositivo.

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

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

Quando essa entrada é definida como Habilitada (0x1), o pipeline de captura usa a caixa de entrada Platform DMFT para o dispositivo. Veja a seguir um exemplo desta seção personalizada do 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

No Windows 10, versão 1703, se um dispositivo optar por usar o PDMFT, todos os recursos compatíveis com o PDMFT serão habilitados (com base nos recursos do dispositivo). Não há suporte para a configuração granular de recursos PDMFT.

Observação

As coordenadas ROI baseadas em face são calculadas em relação ao campo de exibição da imagem transmitida para o PDMFT. Se o campo de exibição tiver sido modificado devido ao uso de um controle como Zoom, Panorâmica ou Inclinação ou Janela Digital, a câmera será responsável por mapear as coordenadas fornecidas de volta para o campo de exibição completo do sensor, considerando a janela de zoom/panorâmica atual.

Perfil de Autenticação Facial por meio de Descritores do SISTEMA OPERACIONAL MS

Windows 10 RS5 agora impõe um requisito de Perfil de Autenticação Facial V2 para qualquer câmera com suporte 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 por meio de um plug-in de modo de usuário (Dispositivo MFT).

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

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

As câmeras a seguir têm suporte para publicar o Perfil de Autenticação Facial por meio dos Descritores do MSOS (também chamados de descritores BOS):

  • Somente câmera RGB a ser usada no Grupo de Sensores com uma câmera IR separada.

  • Somente câmera IR a ser usada em um Grupo de Sensores com uma câmera RGB separada.

  • Câmera RGB+IR 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 deverá usar um INF de extensão para declarar o Perfil de Câmera V2.

Exemplo de layout do descritor do sistema operacional da Microsoft

Os exemplos estão incluídos abaixo para as seguintes especificações:

  • Especificação de descritores estendidos do sistema operacional da Microsoft 1.0

  • Especificação de descritores do Microsoft OS 2.0

Especificação do Descritor Estendido do Sistema Operacional da Microsoft 1.0

O descritor do sistema operacional 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 Cabeçalho do Descritor do Microsoft OS 1.0

A Seção Cabeçalho descreve uma única propriedade personalizada (Face Auth Profile).

Deslocamento Campo Tamanho (bytes) Valor Descrição
0 dwLength 4 <>
4 bcdVersion 2 0x0100 Versão 1.0
6 Windex 2 0x0005 Descritor de sistema operacional de propriedade estendida
8 wCount 2 0x0001 Uma propriedade personalizada

Seção Propriedade Personalizada do Descritor do Microsoft OS 1.0

Deslocamento Campo Tamanho (bytes) Valor Descrição
0 dwSize 4 0x00000036 (54) Tamanho total (em bytes) para essa propriedade.
4 dwPropertyDataType 4 0x00000004 REG_DWORD_LITTLE_ENDIAN
8 wPropertyNameLength 2 0x00000024 (36) Tamanho (em bytes) do nome da propriedade.
10 bPropertyName 36 UVC-CPV2FaceAuth Cadeia de caracteres "UVC-CPV2FaceAuth" em Unicode.
46 dwPropertyDataLength 4 0x00000004 4 bytes para dados de propriedade (sizeof(DWORD)).
50 bPropertyData 4 Veja o esquema de dados abaixo Veja o esquema de dados abaixo.
Esquema de conteúdo

A carga de dados UVC-CPV2FaceAuth é um inteiro sem sinal de 32 bits. A ordem alta de 16 bits representa o índice baseado 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 de 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 IR:

  • L8, 480x480@30fps

  • L8, 480x480@15fps

  • L8, 480x480@10fps

Um valor de conteúdo de 0x00010000 resultará na publicação do seguinte Perfil de Autenticação Facial:

Pin0:(RES==1280,720; FRT==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 desta redação, Windows Hello tem um requisito mínimo de 480x480@7,5fps para o fluxo RGB e 340x340@15fps para o fluxo de IR. IHV/OEMs são necessários para selecionar tipos de mídia que atendam a 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á nenhum pino de IR (com a expectativa de que uma câmera tipo 1 será emparelhada com uma câmera tipo 2 no computador em um grupo de sensores), somente 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 baixa da carga 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, o conteúdo deve ser definido 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 Autenticação Facial, o valor deverá ser: 0xFFFF0000.

Especificação do Descritor Estendido do Sistema Operacional da Microsoft 2.0

O Descritor Estendido do MSOS 2.0 pode ser usado para definir os valores do Registro para adicionar suporte ao Perfil de Autenticação Facial. Isso é feito usando o Descritor de Propriedade do Registro do Microsoft OS 2.0.

Para a entrada do registro UVC-CPV2FaceAuth, o seguinte mostra um exemplo de conjunto de descritores do 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)
}

Quando UVC-CPV2FaceAuth entrada do Registro é adicionada, os dispositivos não precisam publicar a entrada do Registro EnableDshowRedirection, conforme descrito em Diretrizes de implementação da Ponte DShow para dispositivos UVC.

No entanto, se o fornecedor do dispositivo precisar dar suporte a versões mais antigas do Windows e/ou precisar habilitar a descompactação MJPEG no Frame Server, a entrada do Registro EnableDshowRedirection deverá ser adicionada.

Geração de Grupo de Sensores

Quando os OEMs criam sistemas usando as câmeras Tipo 1 e Tipo 2 para fornecer fluxos RGB e IR para Windows Hello suporte, 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 uma extensão INF a ser criada na propriedade interface do dispositivo para cada câmera.

No entanto, se a extensão INF não for fornecida, os ODMs poderão usar os mesmos descritores MSOS para publicar os valores FSSensorGroupId e FSSensorGroupName. A caixa de entrada Windows 10 driver de Classe de Vídeo USB pegará automaticamente qualquer Descritor MSOS cujo Nome de Carga foi prefixado com "UVC-" e migrará a marca para o repositório de propriedades da interface do dispositivo (removendo o prefixo "UVC-").

Portanto, 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 de vários dispositivos para uso com Windows Hello:

UVC-FSSensorGroupId
UVC-FSSensorGroupName

O conteúdo de cada marca deve ser uma Cadeia de Caracteres Unicode. O conteúdo UVC-FSSensorGroupId deve ser uma cadeia de caracteres GUID no seguinte formato:

{XXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXXXX}

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 internas, o chassi físico é o próprio computador. Para câmeras externas, os módulos Câmera tipo 1 e Tipo 2 devem ser integrados ao mesmo dispositivo físico conectado ao computador.

Categorias de interface de dispositivo personalizadas para grupos de sensores

A partir do 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 do 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}

Várias categorias são definidas usando dois-pontos (;) lista guid delimitada.

Cada dispositivo declarando 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 fosse definida.

Rotação da Câmera

Consulte Orientação do dispositivo de câmera

Cache de Controle UVC

Consulte Cache de Controle do UVC

Descritor do BOS e do MS OS 2.0

A câmera compatível com UVC pode especificar valores de configuração de dispositivo específicos do Windows em um descritor BOS de funcionalidade de plataforma em 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 transmite a configuração do dispositivo para o sistema operacional.

Cabeçalho do Conjunto de Descritores do Microsoft OS 2.0

Deslocamento Campo Tamanho (bytes) Descrição
0 wLength 2 O comprimento em bytes desse cabeçalho deve ser 10.
2 wDescriptorType 2 MSOS20_SET_HEADER_DESCRIPTOR
4 dwWindowsVersion 4 Versão do Windows.
8 wTotalLength 2 O tamanho de todo o descritor do MS OS 2.0 definido, incluindo esse tamanho de cabeçalho.

Descritor de propriedade do Registro do Microsoft OS 2.0

Deslocamento Campo Tamanho (bytes) Descrição
0 wLength 2 Comprimento em bytes deste descritor
2 wDescriptorType 2 MS_OS_20_FEATURE_REG_PROPERTY
4 wPropertyDataType 2 0x04 (REG_DWORD_LITTLE_ENDIAN)
6 wPropertyNameLength 2 O comprimento do nome da propriedade.
8 PropertyName Variável O nome da propriedade do Registro.
8+M wPropertyDataLength 2 O comprimento dos dados da propriedade.
10+M PropertyData Variável Dados da propriedade

Quando um descritor ms os 2.0 válido é especificado no firmware, a pilha USB copia os valores de configuração para o dispositivo HW registry key show 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 do Registro HW do dispositivo e configura o dispositivo no sistema operacional adequadamente. Por exemplo, se o firmware especificar o dispositivo a ser registrado como uma câmera de sensor usando um valor de configuração, o driver UVC registrará o dispositivo logo abaixo dessa categoria.

Configurar dispositivos UVC por meio 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.

Ainda há suporte para a configuração de dispositivos UVC por meio do INF personalizado e isso tem precedência sobre o mecanismo baseado no descritor BOS. Ao especificar as propriedades do dispositivo por meio do INF, você não precisa adicionar o prefixo "UVC-". Esse prefixo só é necessário para propriedades de dispositivo especificadas por meio do descritor BOS e que são específicas por instância de interface. Se o dispositivo precisar de plug-ins do modo de usuário como o DMFT, você precisará fornecer um INF para instalar o DMFT. Ele não pode ser configurado usando firmware.

Valores de configuração com suporte no momento por meio do descritor BOS

Nome da configuração Tipo Descrição
SensorCameraMode REG_DWORD Registre a câmera em uma categoria específica.
UVC-FSSensorGroupID, UVC-FSSensorGroupName REG_SZ Agrupar câmeras com o mesmo UVC-FSSensorGroupID
UVC-EnableDependentStillPinCapture REG_DWORD Para habilitar ainda capturar o Método 2/3
UVC-EnablePlatformDmft REG_DWORD Para habilitar a plataforma DMFT

Quando o driver UVC vê os valores do Registro com o prefixo "UVC-", ele preenche a chave do Registro da instância de 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 para as listadas acima.

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

Para que o sistema operacional use a funcionalidade de dispositivo da plataforma BOS e os descritores do MS OS 2.0, o descritor do dispositivo deve especificar a versão bcdUSB para ser 0x0210 ou maior.

Exemplo de dispositivo composto

Esta seção fornece um descritor BOS e um descritor do 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. Registrar a função de câmera colorida em KSCATEGORY_VIDEO_CAMERA

  2. Registrar a função de câmera do IR em KSCATEGORY_SENSOR_CAMERA

  3. Habilitar a captura de imagem da função de câmera colorida

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

Após a enumeração do dispositivo, a pilha USB recupera o descritor BOS do dispositivo. Seguir o descritor BOS é uma funcionalidade 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 funcionalidade da plataforma BOS especifica:

  1. GUID de funcionalidade de plataforma de descritor do MS OS 2.0

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

  3. Esse descritor BOS é aplicável à versão do sistema operacional Windows 10 e posteriores.

Depois de ver o descritor BOS, a pilha USB emitirá a solicitação de controle específica do fornecedor para recuperar o descritor do 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 wValue Windex wLength Dados
1100 0000B bMS_VendorCode 0x00 0x07 Comprimento Blob de conjunto de descritores do MS OS 2.0 retornado

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.

wValue

Defina como 0x00.

Windex

0x7 para MS_OS_20_DESCRIPTOR_INDEX.

wLength

Comprimento do descritor do MS OS 2.0 definido, 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 de Descritor do MS OS 2.0:

  1. Definir cabeçalho

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

  3. Cabeçalho de subconjunto de função de câmera de cores

  4. Descritor de Recurso de Valor do Registro para ID do grupo de sensores

  5. Descritor de Recurso de Valor do Registro para o nome do grupo de sensores

  6. Descritor de Recurso de Valor do Registro para habilitar a captura de imagem ainda

  7. Descritor de recurso de valor do registro para habilitar a plataforma DMFT

  8. Cabeçalho de subconjunto de função de câmera do IR

  9. Descritor de Recurso de Valor do Registro para ID do grupo de sensores

  10. Descritor de Recurso de Valor do Registro para o 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 descritor do MS OS 2.0 a seguir 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
};