Partager via


Spécification des extensions Microsoft pour la classe vidéo USB 1.5

1 Vue d’ensemble

1.1 Résumé

Les extensions Microsoft à la spécification de la classe vidéo USB permettent de nouveaux contrôles et la capacité de véhiculer des métadonnées d'images bien définies dans un format standard.

1.2 Décisions d’architecture

La prise en charge des métadonnées de trames USB Video Class (UVC) est disponible pour les terminaux « ISOCH » et « BULK ». Toutefois, dans le cas d’un point de terminaison BULK, la taille des métadonnées est limitée à 240 octets (car toutes les données de trame vidéo sont transférées dans un seul paquet d’images vidéo sur les points de terminaison BULK).

La prise en charge des métadonnées UVC est disponible uniquement pour les charges utiles basées sur des images.

La prise en charge des métadonnées UVC est disponible uniquement via le pipeline de capture Media Foundation (MF).

Les métadonnées UVC nécessitent une adhésion volontaire. Chaque IHV/OEM qui a besoin de la prise en charge des métadonnées doit être activé via un fichier INF personnalisé.

Les métadonnées UVC prennent uniquement en charge la mémoire allouée par le système. Les surfaces VRAM ou DX ne sont pas prises en charge.

Vue d’ensemble de l’architecture 2

2.1 Description

2.2.1 Détection des capacités via INF

2.2.1.1 Capture d'image fixe – Méthode 2

Certains appareils UVC existants peuvent ne pas prendre en charge la méthode 2 décrite dans la section 2.4.2.4 (Capture d'images fixes) de la classe UVC 1.5 specification.pdf, qu'on peut télécharger sur le site web de spécification de la classe vidéo USB.

Dans Windows 10, version 1607 et antérieure, le pipeline de capture n’a pas utilisé la méthode 2, même si un appareil a annoncé la prise en charge de celui-ci conformément aux spécifications UVC 1.5.

Dans Windows 10, version 1703, les appareils qui utilisent cette méthode doivent utiliser un fichier INF personnalisé pour le pilote de caméra, mais un INF personnalisé est requis pour le matériel donné pour activer la capture d’image de méthode 2.

Remarque : Le pilote de caméra peut être basé sur le USBVIDEO.SYS Windows ou peut être basé sur un fichier binaire de pilote personnalisé.

Le fichier INF personnalisé, basé sur un pilote UVC personnalisé ou un pilote UVC de boîte de réception, doit inclure l’entrée AddReg suivante :

EnableDependentStillPinCapture : REG_DWORD : de 0x0 (désactivé) à 0x1 (activé)

Lorsque cette entrée est activée (0x1), le pipeline de capture utilise la méthode 2 pour la capture d’images fixes (en supposant que le microprogramme publie également la prise en charge de la méthode 2, comme spécifié par UVC 1.5).

Voici un exemple pour la section INF personnalisée :

[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

Contrôles d’unité d’extension 2.2.2

L’extension de Microsoft à la spécification de la classe vidéo USB pour l’activation de nouveaux contrôles est effectuée via une unité d’extension identifiée par guid MS_CAMERA_CONTROL_XU (appelée Microsoft-XU).

// {0F3F95DC-2632-4C4E-92C9-A04782F43BC8}
DEFINE_GUID(MS_CAMERA_CONTROL_XU,
    0xf3f95dc, 0x2632, 0x4c4e, 0x92, 0xc9, 0xa0, 0x47, 0x82, 0xf4, 0x3b, 0xc8);

Une Microsoft-XU implémentée par le microprogramme de l’appareil héberge les nouveaux contrôles définis dans les sous-sections suivantes. Les définitions de requête suivantes s’appliquent à tous ces contrôles, sauf si une définition de substitution est spécifiée explicitement pour ce contrôle. Reportez-vous à la classe UVC 1.5 specification.pdf pour les définitions de D3, D4, GET_INFO, et ainsi de suite.

La demande GET_INFO doit signaler le contrôle sans les fonctionnalités AutoUpdate et asynchrones (par exemple, les bits D3 et D4 doivent être réglés sur 0).

GET_LEN demande doit indiquer la longueur maximale de la charge utile pour ce contrôle (wLength).

GET_RES demande doit signaler la résolution (taille de l’étape) pour qwValue/dwValue. Tous les autres champs doivent être définis sur 0.

GET_MIN demande doit signaler la valeur minimale prise en charge pour qwValue/dwValue. Tous les autres champs doivent être définis sur 0.

GET_MAX demande doit signaler la valeur maximale prise en charge pour qwValue/dwValue. En outre, tous les indicateurs pris en charge doivent être définis sur 1 dans bmControlFlags. Tous les autres champs doivent être définis sur 0.

GET_DEF et les demandes de GET_CUR signalent respectivement les paramètres par défaut et actuels pour les champs qwValue/dwValue et bmControlFlags. Tous les autres champs doivent être définis sur 0.

Une demande de SET_CUR est émise par l’hôte après avoir défini tous les champs.

Le tableau suivant mappe les sélecteurs de contrôle pour Microsoft-XU à leurs valeurs respectives et à la position du bit pour le champ bmControls dans le descripteur d’unité d’extension :

Sélecteur de contrôle Valeur Position du bit
(bmControls Field)
MSXU_CONTROL_NON_DÉFINI 0x00 NA
MSXU_CONTROL_FOCUS 0x01 D0
Contrôle d'exposition MSXU 0x02 D1
MSXU_CONTROL_EVCOMPENSATION 0x03 D2
MSXU_CONTROL_WHITEBALANCE 0x04 D3
Réservé à une utilisation ultérieure 0x05 D4
Contrôle Authentification Faciale 0x06 D5
Contrôle des paramètres extrinsèques de la caméra MSXU 0x07 D6
MSXU_CONTROL_CAMERA_INTRINSICS 0x08 D7
MSXU_CONTROL_METADATA 0x09 D8
MSXU_CONTROL_IR_TORCH 0x0A D9
MSXU_CONTROL_DIGITALWINDOW 0X0B J10
MSXU_CONTROL_DIGITALWINDOW_CONFIG 0X0C D11
MSXU_CONTROL_VIDEO_HDR 0X0D D12
MSXU_CONTROL_FRAMERATE_THROTTLE 0x0E D13
MSXU_CONTROL_FIELDOFVIEW2_CONFIG 0x0F D14
MSXU_CONTROL_FIELDOFVIEW2 0x10 D15
2.2.2.1 Contrôles annulables

Un contrôle annulable est défini ici à l’aide de la fonctionnalité de mise à jour automatique.

La demande GET_INFO doit signaler un contrôle comme un contrôle de mise à jour automatique (par exemple, le bit D3 doit être défini sur 1), mais pas comme un contrôle asynchrone (par exemple, le bit D4 doit être défini sur 0).

Pour ce type de contrôle, une demande de SET_CUR peut être émise pour définir une nouvelle valeur (une requête SET_CUR(NORMAL) où bmOperationFlags :D0 bits est définie sur 0) ou annuler une requête SET_CUR(NORMAL) précédente (une requête SET_CUR(CANCEL) où est défini le bit bmOperationFlags :D0 sur 1). Une demande de SET_CUR doit être effectuée immédiatement par l’appareil dès que la demande est reçue (même si le matériel n’est pas configuré ou convergé vers les nouveaux paramètres demandés). Pour chaque requête SET_CUR(NORMAL), l’appareil produit une interruption de modification de contrôle correspondante pour ce contrôle déclenché lorsque les nouveaux paramètres ont été appliqués ou lorsqu’une demande SET_CUR(CANCEL) arrive ; jusqu’à ce que cette interruption arrive, la demande SET_CUR(NORMAL) est considérée comme en cours. Lorsqu’une demande SET_CUR(NORMAL) est en cours, des demandes supplémentaires SET_CUR(NORMAL) pour ce contrôle particulier entraînent un échec. Une demande SET_CUR(CANCEL) aboutit toujours. S’il n’y a rien à annuler, l’appareil ne fait rien.

La charge utile d’interruption de changement de contrôle doit avoir le bit bmOperationFlags:D0 réglé à 0 si les paramètres spécifiés par SET_CUR(NORMAL) ont été appliqués (par exemple, la convergence a eu lieu) et à 1 si les paramètres n'ont pas été appliqués en raison d'une requête SET_CUR(CANCEL) survenue après la requête SET_CUR(NORMAL) (par exemple, la convergence n'a pas encore eu lieu).

2.2.2.2 Contrôle focus

Ce contrôle permet au logiciel hôte de spécifier les paramètres de focus de la caméra. Il s’agit d’un contrôle global qui affecte tous les points de terminaison sur toutes les interfaces de streaming vidéo associées à l’interface de contrôle vidéo.

contrôle de la mise au point.

Ce contrôleur fonctionnera comme un contrôleur annulable (voir la section 2.2.2.1 pour les exigences de requête GET_INFO, et le comportement fonctionnel de la requête SET_CUR).

GET_MAX exigence: ce contrôle doit indiquer la prise en charge des bits D0, D1, D2, D8 et D18 dans bmControlFlags.

GET_DEF exigence : la valeur par défaut pour bmControlFlags doit être D0 et D18 définie sur 1 et dwValue définie sur 0.

Pour les requêtes GET_CUR/SET_CUR, les restrictions suivantes s’appliquent pour le champ bmControlFlags :

  • Parmi les bits D0, D1 et D8, un seul bit peut être défini ; aucun d’entre eux n’est valide si D2 bits est défini.

  • Parmi D16, D17, D18, D19 et D20, un seul bit ne peut être défini, aucun d’entre eux n’est également valide.

  • D1 est incompatible avec tous les autres bits actuellement définis (D0, D2, D8, D16, D17, D18, D19 et D20).

  • D2 est incompatible avec D1 et D8.

  • D2 est incompatible avec D16, D17, D18, D19 et D20 si D0 n’est pas défini.

2.2.2.3 Contrôle d’exposition

Ce contrôle permet au logiciel hôte de spécifier les paramètres d’exposition de la caméra. Il s’agit d’un contrôle global qui affecte tous les points de terminaison sur toutes les interfaces de streaming vidéo associées à l’interface de contrôle vidéo.

contrôle d’exposition.

GET_INFO demande doit signaler ce contrôle en tant que contrôle asynchrone (par exemple, le bit D4 doit être défini sur 1), mais pas comme contrôle AutoUpdate (par exemple, le bit D3 doit être défini sur 0).

GET_MAX Exigence : ce contrôle doit publier la prise en charge des bits D0, D1 et D2 dans bmControlFlags.

GET_DEF exigence : la valeur par défaut pour bmControlFlags est D0 définie sur 1 et qwValue définie sur 0.

Pour les requêtes GET_CUR/SET_CUR, les restrictions suivantes s’appliquent pour le champ bmControlFlags :

  • Parmi les bits D0, D1 et D2, au moins un bit doit être défini.
  • D1 est incompatible avec D0 et D2.
2.2.2.4 Contrôle de compensation EV

Ce contrôle permet au logiciel de l'hôte de spécifier les paramètres de compensation EV pour la caméra. Il s’agit d’un contrôle global qui affecte tous les points de terminaison sur toutes les interfaces de streaming vidéo associées à l’interface de contrôle vidéo.

Contrôle de compensation E V.

GET_INFO demande doit signaler ce contrôle en tant que contrôle asynchrone (par exemple, le bit D4 doit être défini sur 1), mais pas comme contrôle AutoUpdate (par exemple, le bit D3 doit être défini sur 0).

La demande GET_RES doit signaler toutes les résolutions prises en charge (taille d'incrément) en définissant les bits correspondants dans bmControlFlags. Tous les autres champs doivent être définis sur 0.

GET_MIN et les demandes de GET_MAX indiquent la valeur minimale et maximale prise en charge pour dwValue. Le bit D4 (indiquant la taille de l’étape 1) doit être le seul et seul bit défini dans bmControlFlags. Tous les autres champs doivent être définis sur 0.

GET_DEF, GET_CUR, SET_CUR requêtes doivent suivre les définitions de la section 2.2.2.1, mais doivent avoir un seul bit défini entre D0, D1, D2, D3 et D4 bits pour le champ bmControlFlags. En outre, la requête GET_DEF doit avoir dwValue défini à 0.

2.2.2.5 Contrôle de l’équilibre blanc

Ce contrôle permet au logiciel hôte de spécifier les paramètres d’équilibre blanc de l’appareil photo. Il s’agit d’un contrôle global qui affecte tous les points de terminaison sur toutes les interfaces de streaming vidéo associées à l’interface de contrôle vidéo.

contrôle d’équilibre blanc.

GET_INFO demande doit signaler ce contrôle en tant que contrôle asynchrone (par exemple, le bit D4 doit être défini sur 1), mais pas comme contrôle AutoUpdate (par exemple, le bit D3 doit être défini sur 0).

GET_RES, GET_MIN, GET_MAX demandes doivent suivre les définitions de la section 2.2.2.1 mais doivent avoir dwValueFormat réglé à 1.

Exigence GET_MAX : ce dispositif doit déclarer la prise en charge des bits D0, D1 et D2 dans bmControlFlags.

GET_DEF exigence : la valeur par défaut pour bmControlFlags doit être D0 définie sur 1 et dwValueFormat et dwValue définie sur 0.

Pour les requêtes GET_CUR/SET_CUR, les restrictions suivantes s’appliquent pour le champ bmControlFlags :

  • Parmi les bits D0, D1 et D2, au moins un bit doit être défini.
  • D1 est incompatible avec D0 et D2.
2.2.2.6 Contrôle d’authentification faciale

Ce contrôle permet au logiciel hôte de spécifier si la caméra prend en charge les modes de diffusion en continu utilisés pour l’authentification faciale. La prise en charge de ce contrôle implique que la caméra est capable d’authentification faciale. Ce contrôle ne doit pas être pris en charge dans le cas contraire.

Ce contrôle s’applique uniquement aux caméras qui peuvent produire des données Infra-Red (IR) et qui s’appliquent uniquement aux interfaces de diffusion en continu spécifiées (qui est un sous-ensemble de toutes les interfaces de diffusion vidéo associées à l’interface de contrôle vidéo).

contrôle de reconnaissance faciale.

GET_RES et les demandes de GET_MIN signalent le champ bNumEntries défini sur 0 et n’ont donc pas de champs supplémentaires.

Pour une requête GET_MAX, un bit défini sur 1 sur le champ bmControlFlags indique que le mode correspondant est pris en charge pour cette interface de diffusion en continu. Une sortie de demande de GET_MAX répertorie toutes et uniquement les interfaces de diffusion en continu capables de D1 ou D2 (par exemple, si une interface de diffusion en continu est capable de D1 ou D2, elle est répertoriée ; sinon, elle n’est pas répertoriée). En outre, aucune interface de diffusion en continu ne doit être annoncée pour être compatible avec D1 et D2. Si une interface de diffusion en continu est également destinée à être utilisée de manière générale (par exemple, en dehors de l’objectif de l’authentification faciale), D0 doit être défini sur 1 pour cette interface de diffusion en continu (en plus de D1/D2).

Pour les requêtes GET_DEF/GET_CUR/SET_CUR, un bit défini sur 1 sur le champ bmControlFlags indique que le mode correspondant est choisi pour cette interface de diffusion en continu. Dans ces demandes, un et un seul bit (entre D0, D1 &D2) doit être défini pour une interface de diffusion en continu particulière. Pour la requête GET_DEF qui retourne le choix par défaut (qui est spécifique à l’implémentation), si une interface de diffusion en continu est également destinée à être utilisée de manière générale (par exemple, en dehors de l’objectif de l’authentification faciale), D0 doit être défini sur 1 par défaut sur cette interface de diffusion en continu ; sinon, D1 ou D2 (mais pas les deux) doit être défini sur 1 par défaut. Une sortie de requête GET_DEF/GET_CUR doit contenir des informations sur toutes les interfaces de diffusion en continu répertoriées dans GET_MAX sortie de requête, mais une demande de SET_CUR peut inclure uniquement un sous-ensemble des interfaces de diffusion en continu répertoriées dans GET_MAX sortie de requête.

Exemple :

Supposons qu’une caméra a quatre interfaces de diffusion vidéo avec des nombres 0x03, 0x05, 0x08 et 0x0b respectivement où l’interface de diffusion vidéo 0x05 produit des données RVB et les trois interfaces de streaming vidéo restantes produisent des données IR. Parmi les interfaces de diffusion en continu qui produisent des données ir, supposons que les interfaces de diffusion en continu 0x03 et les 0x0b sont toutes deux capables de D1, mais l’interface de diffusion en continu 0x03 est également capable de D0. Dans cet exemple, le contrôle d’authentification faciale s’applique uniquement aux interfaces de diffusion en continu numérotées 0x03 et 0x0b et, par conséquent, seules ces interfaces apparaissent dans les requêtes.

Le résultat de la demande GET_MAX doit être le suivant :

Authentification faciale GET_MAX.

La sortie de GET_DEF demande doit être la suivante :

Authentification faciale GET_DEF.

Une demande de SET_CUR pour modifier le paramètre sur l’interface de diffusion en continu 0x03 sur D1 serait la suivante :

Authentification faciale SET_CUR.

La sortie d’une demande de GET_CUR après la demande de SET_CUR ci-dessus doit être la suivante :

Authentification faciale GET_CUR.

2.2.2.7 Contrôle d’extrinsique de caméra

Ce contrôle permet au logiciel hôte d’obtenir les données extrinsiques de la caméra pour les points de terminaison sur les interfaces de streaming vidéo associées à l’interface de contrôle vidéo. Les données obtenues pour chaque point de terminaison s’affichent sous forme d’attribut MFStreamExtension_CameraExtrinsics sur le magasin d’attributs du flux correspondant (obtenue à l’aide de l’appel IMFDeviceTransform ::GetOutputStreamAttributes).

contrôle extrinsique de caméra.

GET_RES, GET_MIN, GET_MAX, les requêtes GET_CUR signalent le champ bNumEntries défini sur 0 et n’ont donc pas de champs supplémentaires.

GET_DEF demande doit répertorier tous les points de terminaison qui disposent des informations extrinsiques disponibles.

Exemple :

Supposons qu’une caméra a trois interfaces de diffusion vidéo avec des nombres 0x03, 0x05 et 0x08 respectivement où l’interface de diffusion vidéo 0x05 prend en charge la capture d’images toujours à l’aide de la méthode 2 en plus de la capture vidéo prise en charge par toutes les interfaces de diffusion vidéo. Parmi ces interfaces de diffusion en continu, supposons que les interfaces de diffusion en continu 0x05 et 0x08 disposent d’informations extrinsiques disponibles pendant que l’interface de diffusion en continu 0x03 n’a pas les informations extrinsiques disponibles.

Dans cet exemple, la sortie de GET_DEF demande doit être la suivante :

paramètres externes de la caméra GET_DEF.

2.2.2.8 Contrôle intrinsèque de la caméra

Ce contrôle permet au logiciel hôte d’obtenir les données intrinsèques de la caméra pour les points de terminaison sur les interfaces de streaming vidéo associées à l’interface de contrôle vidéo. Les données obtenues pour chaque point de terminaison s’affichent sous forme d’attribut MFStreamExtension_PinholeCameraIntrinsics sur le magasin d’attributs pour le flux correspondant (obtenue à l’aide de l’appel IMFDeviceTransform ::GetOutputStreamAttributes).

contrôle intrinsèque de caméra.

GET_RES, GET_MIN, GET_MAX, les requêtes GET_CUR signalent le champ bNumEntries défini sur 0 et n’ont donc pas de champs supplémentaires.

La demande GET_DEF doit répertorier tous les points de terminaison qui ont les propriétés intrinsèques disponibles.

Exemple :

Supposons qu’une caméra a trois interfaces de diffusion vidéo avec des nombres 0x03, 0x05 et 0x08 respectivement où l’interface de diffusion vidéo 0x05 prend en charge la capture d’images toujours à l’aide de la méthode 2 en plus de la capture vidéo prise en charge par toutes les interfaces de diffusion vidéo. Parmi ces interfaces de diffusion en continu, supposons que les interfaces de diffusion en continu 0x05 et 0x08 disposent d’informations intrinsèques disponibles pendant que l’interface de diffusion en continu 0x03 n’a pas les informations intrinsèques disponibles.

Dans cet exemple, la sortie de GET_DEF demande doit être la suivante :

paramètres intrinsèques de la caméra GET_DEF.

2.2.2.9 Contrôle de métadonnées

Ce contrôle permet au logiciel hôte d’interroger et de contrôler les métadonnées produites par l’appareil photo. Il s’agit d’un contrôle global qui affecte tous les points de terminaison sur toutes les interfaces de streaming vidéo associées à l’interface de contrôle vidéo.

Ce contrôle est mappé à KSPROPERTY_CAMERACONTROL_EXTENDED_METADATA par le pilote de la caméra.

contrôle de métadonnées.

Si SET_CUR demande est prise en charge par le microprogramme, les éléments suivants s’appliquent :

  • GET_MIN, GET_DEF demandes doivent signaler le champ dwValue défini sur 0.

  • GET_RES requête doit signaler que le champ dwValue doit être la même valeur que celle signalée par la requête GET_MAX.

  • Lorsqu’une demande de SET_CUR est reçue avec dwValue définie sur 0, la caméra ne produit aucune métadonnées. Lorsqu’une demande de SET_CUR est reçue avec dwValue définie sur la même valeur que celle signalée par GET_MAX demande, la caméra peut produire des métadonnées et la taille de ces métadonnées ne peut pas dépasser dwValue pour n’importe quel frame.

Si SET_CUR demande n’est pas prise en charge par le microprogramme, les éléments suivants s’appliquent :

  • GET_MIN, GET_DEF demandes doivent signaler le champ dwValue comme étant la même valeur que celle signalée par GET_MAX demande.

  • GET_RES demande doit signaler le champ dwValue défini sur 0.

  • L'appareil photo peut produire des métadonnées et la taille totale de ces métadonnées ne peut pas dépasser la valeur dwValue, comme le rapporte la requête GET_MAX, multipliée par 1024 octets, moins la taille d'une charge utile de métadonnées UsbVideoHeader, pour n'importe quelle trame.

  • Une charge utile de métadonnées UsbVideoHeader correspond à sizeof(KSCAMERA_METADATA_ITEMHEADER) + sizeof(KSTREAM_UVC_METADATA), soit 24 octets.

Les métadonnées produites sont conformes aux métadonnées au format standard Microsoft décrites dans la section 2.2.3.

2.2.2.10 Contrôle de torche IR

Ce contrôle fournit un moyen flexible pour le matériel LED IR de signaler la mesure dans laquelle il peut être contrôlé et fournit la possibilité de le contrôler. Il s’agit d’un contrôle global qui affecte tous les points de terminaison sur toutes les interfaces de streaming vidéo associées à l’interface de contrôle vidéo en ajustant la puissance à une lampe IR connectée à la caméra.

Ce contrôle est mappé à KSPROPERTY_CAMERACONTROL_EXTENDED_IRTORCHMODE par le pilote de la caméra.

Commande de lampe électrique IR.

Les règles suivantes s’appliquent :

  • GET_LEN demande doit indiquer une valeur de 8.

  • GET_INFO demande doit signaler une valeur de 3. Cette valeur indique un contrôle synchrone qui prend en charge GET_CUR et SET_CUR.

  • GET_MIN demande doit signaler le champ dwMode défini sur 0 et dwValue défini sur une valeur indiquant la puissance minimale. Un niveau de puissance de 0 peut indiquer off, mais le niveau minimal de puissance opérationnelle n’a pas besoin d’être 0.

  • GET_RES demande doit indiquer le champ dwMode défini sur 0 et dwValue défini sur un nombre inférieur ou égal à GET_MAX(dwValue) – GET_MIN(dwValue) et tel que GET_MAX(dwValue) – GET_MIN(dwValue) est uniformément divisible par cette valeur. dwValue peut ne pas être zéro (0).

  • GET_MAX demande doit signaler le champ dwMode défini avec les bits D[0-2] définis pour identifier les fonctionnalités de ce contrôle. dwMode doit avoir le bit D0 défini, indiquant que OFF est pris en charge et qu’il doit avoir au moins un autre jeu de bits, prenant en charge un état actif. dwValue doit être défini sur une valeur indiquant la puissance normale.

  • La requête GET_DEF doit signaler le champ dwMode défini sur le mode par défaut dans lequel le système doit se trouver avant le début du streaming. dwMode doit être défini sur 2 (ON) ou 4 (ALTER). dwValue doit être défini sur le niveau d’alimentation normalement utilisé pour le contrôle FaceAuth. dwValue est défini par le fabricant.

  • GET_CUR requête doit indiquer que le champ dwMode est configuré sur le mode de fonctionnement actuel et dwValue ajusté à l’éclairage actuel.

  • Lorsqu’une demande de SET_CUR est reçue, la torche IR définit l’éclairage sur une intensité prorate à l’aide du mode d’exploitation demandé.

La torche IR doit émettre l’attribut MF_CAPTURE_METADATA_FRAME_ILLUMINATION pour chaque image. Il peut le fournir par le biais d'un dispositif MFT ou en incluant l'attribut MetadataId_FrameIllumination dans la charge utile des métadonnées à partir de l’appareil photo. Consultez la section 2.2.3.4.4.

Le seul objectif de ces métadonnées est d’indiquer si un cadre est éclairé ou non. Il s’agit des mêmes métadonnées requises par la KSPROPERTY_CAMERACONTROL_EXTENDED_FACEAUTH_MODE DDI et le MSXU_FACE_AUTHENTICATION_CONTROL défini dans la section 2.2.2.6.

2.2.2.11 Contrôle de fenêtre numérique

La fenêtre numérique spécifie le champ d’affichage et le zoom de la caméra pendant la diffusion en continu de la caméra. Ce contrôle est un substitut potentiel du panoramique, de l’inclinaison et du zoom. Ce contrôle s’applique uniquement lorsque l’appareil photo est activement en streaming.

Ce contrôle est disponible pour tous les types de caméras et est indépendant du type de média en cours de diffusion en continu.

Ce contrôle permet au logiciel hôte d’interroger et de contrôler la fenêtre numérique associée à une caméra.

Il s’agit d’un contrôle global qui affecte tous les points de terminaison sur toutes les interfaces de streaming vidéo associées à l’interface de contrôle vidéo. Il ajuste la source de données de pixels utilisées par l’ISP. Cela inclut les broches de capture fixes pour la méthode 2 et la méthode 3.

Ce contrôle est mappé à KSPROPERTY_CAMERACONTROL_EXTENDED_DIGITALWINDOW par le pilote de caméra de boîte de réception.

contrôle de fenêtre numérique.

Les règles suivantes s’appliquent :

  • GET_LEN demande doit indiquer une valeur de 16.

  • GET_INFO demande doit signaler une valeur de 3. Cette valeur indique un contrôle synchrone qui prend en charge GET_CUR et SET_CUR.

  • GET_MIN doit signaler le champ dwMode mis à 0, OriginX et OriginY mis à 0,0 et WindowSize mis à 1,0. Cette demande n’est actuellement pas utilisée.

  • La requête GET_RES doit indiquer que le champ dwMode est défini sur 0, OriginX et OriginY sont définis sur 0.0, et WindowSize est défini sur 1.0. Cette demande n’est actuellement pas utilisée.

  • La demande GET_MAX doit signaler le champ dwMode avec le bit D0 activé pour identifier les capacités de ce contrôle. La valeur 0 indique que seul le mode manuel est pris en charge. Une valeur de 1 indique que le mode de cadrage automatique du visage est pris en charge. Toutefois, le reste de ces champs n’est pas utilisé, nous vous recommandons de définir OriginX et OriginY sur 0.0 et WindowSize défini sur 1.0.

  • GET_DEF demande doit indiquer le champ dwMode défini sur 0, OriginX et OriginY définis chacun sur 0.0, et WindowSize défini sur 1.0. Il s’agit toujours de la fenêtre par défaut.

  • GET_CUR demande doit indiquer le champ dwMode défini sur le mode d’exploitation actuel et OriginX, OriginY et WindowSize décrivent la fenêtre numérique actuelle.

  • Lorsqu’une demande de SET_CUR est reçue, l’appareil photo ajuste son champ de vue pour qu’il corresponde au mode d’exploitation sélectionné et à la fenêtre numérique.

  • Si le mode de cadrage automatique du visage est sélectionné, la caméra sélectionne une fenêtre qui englobe entièrement le visage dominant dans la scène et les paramètres OriginX, OriginY et WindowSize transmis sont ignorés. Si aucun visage n’est trouvé, la fenêtre par défaut est utilisée.

  • Toutes les modifications apportées à la fenêtre numérique doivent être reflétées dans la charge utile des métadonnées de chaque échantillon.

  • Les modifications apportées à la fenêtre numérique peuvent ne pas être immédiatement effectives, mais le contrôle doit répondre immédiatement. Les modifications apportées à la fenêtre numérique doivent être signalées dans la charge utile des métadonnées du frame dès qu’elles entrent en vigueur.

2.2.2.12 Contrôle de configuration de fenêtre numérique

Les paramètres de configuration numérique des fenêtres définissent les limites du redimensionnement de l'appareil photo selon toutes les résolutions disponibles. Les résolutions sont indépendantes du type multimédia, de sorte que deux types multimédias qui annoncent la même résolution d’affichage sont combinés en une seule fonctionnalité.

En raison des limitations de taille d’un point de terminaison de contrôle, ce contrôle peut décrire au maximum 1820 résolutions uniques.

Ce contrôle doit toujours être disponible pour signaler les fonctionnalités du contrôle Fenêtre numérique si ce contrôle est également présent.

Ce contrôle est mappé à KSPROPERTY_CAMERACONTROL_EXTENDED_DIGITALWINDOW_CONFIGCAPS par le pilote de caméra de boîte de réception.

contrôle de configuration de fenêtre numérique.

Les règles suivantes s’appliquent :

  • GET_LEN demande doit signaler la taille entière de la charge utile. La taille de la charge utile doit être un multiple de 36, car chaque définition de résolution est de 36 octets de longueur.

  • GET_INFO demande doit signaler un 1. Cette valeur indique un contrôle synchrone qui prend uniquement en charge GET_CUR.

  • La requête GET_CUR doit signaler un tableau de fonctionnalités. Les champs de la structure de capacité sont définis ci-dessus.

  • GET_MIN, GET_MAX, GET_RES et les requêtes GET_DEF sont inutilisées, mais doivent retourner les mêmes valeurs que GET_CUR.

  • Les demandes SET_CUR ne sont pas prises en charge.

2.2.2.13 Contrôle HDR vidéo

Ce contrôle permet au logiciel hôte de spécifier si l’appareil photo prend en charge Video HDR. La prise en charge de ce contrôle implique que l’appareil photo est capable de réaliser des vidéos HDR avec son meilleur potentiel. Si l’appareil photo ne prend pas en charge video HDR, il ne doit pas implémenter ce contrôle.

Ce contrôle est mappé à KSPROPERTY_CAMERACONTROL_EXTENDED_VIDEOHDR par le pilote de la caméra.

contrôle vidéo H D R.

Les règles suivantes s’appliquent :

  • GET_LEN demande doit signaler la taille entière de la charge utile (par exemple, 4 octets).

  • GET_INFO demande doit signaler une valeur 3. Cette valeur indique un contrôle synchrone qui prend en charge GET_CUR, SET_CUR.

  • La demande GET_CUR doit indiquer que le champ dwMode est réglé sur le mode de fonctionnement actuel.

  • GET_DEF a un paramètre dwMode défini sur OFF (0).

  • La demande GET_MAX doit annoncer la prise en charge des modes de fonctionnement disponibles : [1 (ON/OFF), 3 (ON/OFF/Auto)]. Le support de ON (1) est obligatoire pour cette commande.

  • GET_MIN et les demandes de GET_RES doivent signaler 0.

  • SET_CUR demande doit définir le mode sur OFF (0), ON (1) ou AUTO (2).

2.2.2.14 Contrôle de régulation de la fréquence d'images

Ce contrôle permet au logiciel hôte de spécifier si l’appareil photo prend en charge la limitation framerate.

Ce contrôle s’applique uniquement lorsque l’appareil photo est activement en streaming. Pour être en streaming actif, un aperçu ou une broche d’enregistrement doit être dans KSSTATE_RUN, prêt et capable de fournir des images. Sur un jeu si un flux n’est pas actif, ce contrôle doit retourner STATUS_INVALID_DEVICE_STATE.

Même s'il s'agit d'un contrôle de portée de filtre, le contrôle de la fréquence d'images ne devrait pas affecter la broche photo ou les flux non-RVB tels que l'infrarouge/la profondeur. En outre, lorsque la limitation de fréquence d’images est en vigueur, la durée de l’échantillon doit également être ajustée en conséquence.

Ce contrôle est mappé à KSPROPERTY_CAMERACONTROL_EXTENDED_FRAMERATE_THROTTLE par le pilote de la caméra.

Sélecteur de contrôle MSXU_CONTROL_FRAMERATE_THROTTLE
Demandes obligatoires GET_INFO, GET_LEN, GET_RES, GET_MIN, GET_MAX, GET_DEF, GET_CUR, SET_CUR
Demandes facultatives
wLength 20
Compenser Terrain Taille Valeur Descriptif
0 dwMode 4 Drapeaux D0 : 0 (OFF) ou 1 (ON)
D1-D31 : réservé et défini sur 0
4 scaleFactorPercentage 4 Numéro Cette valeur doit se trouver dans la plage Min et Max, et elle doit être définie sur un multiple de la valeur Step. Par exemple : si Min = 5, Max = 100 et Step = 5 et si une application a décidé de réduire la fréquence d’images à 80% de valeur d’origine, cette valeur membre doit être définie sur 80. En définissant cette valeur de manière appropriée, une application peut s’assurer que la nouvelle fréquence d’images ne dépasse jamais la valeur d’origine, ni passe à zéro, mais la fréquence d’images d’origine est possible.
8 min 4 Numéro Min doit être égal à au moins une taille de pas ou être un multiple de la taille de pas (Exemple : pas1, pas2, etc.). La valeur minimale ne peut pas être définie sur 0.
12 max 4 Numéro Le nombre maximal doit être défini sur 100, ce qui signifie qu’aucune modification n’est apportée à la fréquence d’images.
16 étape 4 Numéro L’étape doit être un facteur strict de Max, par exemple {Max % Étape == 0}. Exemple : 1, 2, 4, 5, etc.

Les règles suivantes s’appliquent :

  • GET_LEN demande doit indiquer la taille entière de la charge utile (par exemple, 20 octets). 

  • GET_INFO demande doit signaler une valeur 3. Cette valeur indique un contrôle synchrone qui prend en charge GET_CUR, SET_CUR. 

  • La requête GET_CUR doit indiquer que le champ dwMode est défini sur le mode d'exploitation actuel et que scaleFactorPercentage est défini sur la valeur actuelle de scaleFactor. Min, max et step doivent signaler les valeurs décrites dans le tableau ci-dessus.

  • GET_DEF a un paramètre dwMode défini sur OFF(0), scaleFactorPercentage=100, Min défini sur la valeur minimale par défaut, la valeur maximale définie sur 100 et l’étape définie sur la valeur d’étape par défaut. Les valeurs de min et d’étape doivent être définies par le fabricant, mais doivent suivre les instructions mentionnées dans le tableau ci-dessus.

  • La demande GET_MAX présentera la prise en charge des modes de fonctionnement disponibles et indiquera la valeur 1 [ ON | OFF ]. La prise en charge de ON et OFF est obligatoire pour ce contrôle. Min, max, step et scaleFactorPercentage peuvent être définis sur les valeurs par défaut.

  • GET_MIN et les demandes de GET_RES doivent signaler 0. 

  • SET_CUR demande doit définir le mode sur OFF(0), ON(1). Si dwMode est défini sur ON, scaleFactorPercentage prend effet. Pour les cas OFF et ON, scaleFactorPercentage doit être valide comme décrit dans le tableau ci-dessus.

2.2.2.15 Champ de vue 2 Contrôle de configuration

Le contrôle de configuration du Champ d'affichage 2 spécifie les valeurs des degrés du champ de vision diagonal prises en charge sous forme de tableau de valeurs. Toutes les valeurs prises en charge doivent être comprises dans la plage de valeurs théoriques minimales et maximales, de 1 degré à 360 degrés.

Si l’appareil souhaite prendre en charge les valeurs de champ d’affichage continus, il doit signaler toutes les valeurs prises en charge. Par exemple, si l’appareil souhaite prendre en charge le champ diagonal de vue de 85 degrés à 60 degrés avec une taille d’étape de 1, ce contrôle doit signaler le tableau de valeurs [85, 84, 83, 82, ..., 62, 61, 60].

Ce contrôle doit être disponible pour signaler les fonctionnalités lorsque le contrôle Champ d’affichage 2 est présent.

Il s’agit d’un contrôle de niveau de filtre synchrone.

Ce contrôle est mappé à KSPROPERTY_CAMERACONTROL_EXTENDED_ FIELDOFVIEW2_CONFIGCAPS par le pilote de caméra.

Sélecteur de contrôle MSXU_CONTROL_FIELDOFVIEW2_CONFIG
Demandes obligatoires GET_INFO, GET_LEN, GET_RES, GET_MIN, GET_MAX, GET_DEF, GET_CUR
Demandes facultatives
wLength 4 octets + Nombre fois 4 octets, où Count est le nombre de valeurs de champ d’affichage uniques.
Compenser Terrain Taille Valeur Descriptif
0 dwDefaultFieldOfView 4 Numéro Le champ diagonal par défaut de la vue doit être l’une des valeurs signalées dans le tableau FieldOfViewValues.
4 FieldOfViewValues[0] 4 Numéro Première valeur champ de vue, il doit s’agir de la valeur FoV la plus large (champ d’affichage).
4 + 4*(Count-1) ValeursDuChampDeVision [Nombre -1] 4 Numéro Dernière valeur du champ de vision, elle doit être la valeur FoV la plus étroite.

Les règles suivantes s’appliquent :

  • GET_LEN demande doit signaler la taille entière de la charge utile.

  • La requête GET_INFO doit indiquer un 1. Cette valeur indique un contrôle synchrone qui prend uniquement en charge GET_CUR.

  • La requête GET_CUR doit fournir des données contenant le champ de vision (FoV) par défaut et un tableau des valeurs de FoV prises en charge dans l'ordre décroissant. Les champs de la structure sont définis ci-dessus.

  • La demande GET_DEF doit rapporter la même chose que GET_CUR.

  • GET_MIN, GET_MAX et GET_RES demandes ne sont pas utilisées, mais doivent retourner les mêmes valeurs que GET_CUR.

  • Les demandes SET_CUR ne sont pas prises en charge.

Les valeurs de champ d’affichage doivent être dans l’ordre décroissant, par exemple, le champ de vue le plus large est d’abord et le plus étroit est le dernier.

Contrôle du champ de vue 2

Ce contrôle spécifie le champ de base de vue utilisé par l’appareil photo lors de la diffusion en continu. Ce contrôle peut être appliqué avant ou pendant la diffusion en continu.

Ce contrôle est disponible pour tous les types de caméras et est indépendant du type de média en cours de diffusion en continu.

Ce contrôle permet au logiciel hôte d’interroger et de contrôler le champ d’affichage associé à une caméra.

Il s’agit d’un contrôle global qui affecte tous les points de terminaison sur toutes les interfaces de streaming vidéo associées à l’interface de contrôle vidéo. Il ajuste la source de données de pixel (ou capteur) utilisées par le fournisseur de services Internet (Processeur de signal d’image). Cela inclut les broches de fixation pour les méthodes 2 et 3.

Il s’agit d’un contrôle de niveau de filtre synchrone.

Ce contrôle est mappé à KSPROPERTY_CAMERACONTROL_EXTENDED_ FIELDOFVIEW2 par le pilote de la caméra.

Sélecteur de contrôle MSXU_CONTROL_FIELDOFVIEW2
Demandes obligatoires GET_INFO, GET_LEN, GET_RES, GET_MIN, GET_MAX, GET_DEF, GET_CUR, SET_CUR
Demandes facultatives
wLength 4
Compenser Terrain Taille Valeur Descriptif
0 dwValue 4 Numéro Champ diagonal de vue en degrés.

Les règles suivantes s’appliquent :

  • GET_LEN demande doit indiquer une valeur de 4.

  • La requête GET_INFO doit indiquer un 3. Cette valeur indique un contrôle synchrone qui prend en charge GET_CUR et SET_CUR.

  • La demande GET_MIN doit signaler que le champ dwValue est défini sur la valeur minimale de champ de vision prise en charge.

  • La demande GET_RES doit signaler que le champ dwValue est réglé à 0. Cette demande n’est actuellement pas utilisée.

  • La demande GET_MAX doit signaler le champ dwValue défini sur la valeur maximale de champ de vision prise en charge.

  • La demande GET_DEF doit signaler que le champ dwValue est défini sur la valeur par défaut du champ de vision.

  • La demande GET_CUR doit signaler que le champ dwValue est défini sur la valeur actuelle du champ de vision.

  • Lorsqu’une demande de SET_CUR est reçue, la caméra définit son champ d’affichage pour qu’il corresponde à la valeur dwValue donnée.

  • Si la caméra implémente CT_ZOOM_RELATIVE_CONTROL et/ou CT_ZOOM_ABSOLUTE_CONTROL, ces contrôles sont réinitialisés à leurs valeurs par défaut lorsque MSXU_CONTROL_FIELDOFVIEW2 SET_CUR est appelée.

Si la caméra implémente MSXU_CONTROL_DIGITALWINDOW, elle reflète le changement de fenêtre lorsqu’une nouvelle valeur champ d’affichage est définie. Et vice versa, le champ d’affichage reflète les modifications apportées via la fenêtre numérique. Pour plus d’informations, consultez KSPROPERTY_CAMERACONTROL_EXTENDED_ FIELDOFVIEW2 .

2.2.3 Métadonnées

La conception des métadonnées de cadre au format standard repose sur la conception de métadonnées personnalisées UVC basée sur Windows 10. Dans Windows 10, les métadonnées personnalisées sont prises en charge pour UVC à l’aide d’un INF personnalisé pour le pilote de caméra (remarque : le pilote de caméra peut être basé sur windows USBVIDEO.SYS, mais un INF personnalisé est requis pour le matériel donné pour que les métadonnées soient exécutées). Si l'entrée de Registre MetadataBufferSizeInKB<PinIndex> est présente et non nulle, alors les métadonnées personnalisées sont prises en charge pour ce pin, et la valeur indique la taille de mémoire tampon utilisée pour les métadonnées. Le <PinIndex> champ définit l'index de la broche vidéo basé sur 0.

Dans Windows 10, version 1703, un pilote de caméra peut signaler la prise en charge des métadonnées au format standard Microsoft en incluant l’entrée AddReg suivante :

StandardFormatMetadata<PinIndex>: REG_DWORD : 0x0 (Non pris en charge) à 0x1 (pris en charge)

Cette clé de Registre est lue par DevProxy et informe le pilote UVC que les métadonnées sont au format standard en définissant l’indicateur KSSTREAM_METADATA_INFO_FLAG_STANDARDFORMAT dans le champ Indicateurs pour KSSTREAM_METADATA_INFO structure.

2.2.3.1 Métadonnées au format Standard Microsoft

Les métadonnées au format standard Microsoft sont une ou plusieurs instances de la structure suivante :

métadonnées de format standard.

typedef struct tagKSCAMERA_METADATA_ITEMHEADER {
    ULONG MetadataId;
    ULONG Size; // Size of this header + metadata payload following
} KSCAMERA_METADATA_ITEMHEADER, *PKSCAMERA_METADATA_ITEMHEADER;

Le champ MetadataId est rempli par un identificateur de la définition d’énumération suivante qui contient des identificateurs bien définis et des identificateurs personnalisés (identificateurs >= MetadataId_Custom_Start).

typedef enum {
    MetadataId_Standard_Start = 1,
    MetadataId_PhotoConfirmation = MetadataId_Standard_Start,
    MetadataId_UsbVideoHeader,
    MetadataId_CaptureStats,
    MetadataId_CameraExtrinsics,
    MetadataId_CameraIntrinsics,
    MetadataId_FrameIllumination,
    MetadataId_Standard_End = MetadataId_FrameIllumination,
    MetadataId_Custom_Start = 0x80000000,
} KSCAMERA_MetadataId;

Le champ Taille est défini sur sizeof(KSCAMERA_METADATA_ITEMHEADER) + sizeof(Charge utile des métadonnées).

2.2.3.2 Métadonnées de format standard générées par microprogramme à partir de paquets d’images vidéo USB

Pendant un transfert sur UVC pour la vidéo basée sur des images, l’image vidéo est paquetée dans une série de paquets, chacune précédée d’un en-tête de charge utile UVC. Chaque en-tête de charge utile UVC est défini par la spécification de charge utile basée sur le pilote de classe vidéo USB :

En-tête de la charge

Voici une description du format d’en-tête de charge utile pour les formats Frame Based.

en-tête de charge utile.

Champ HLE (Longueur de l’en-tête)

Le champ de longueur d’en-tête spécifie la longueur de l’en-tête, en octets.

Champ d’en-tête de champ de bits

FID : Identificateur de frame

  • Ce bit bascule à chaque limite de début d’image et reste constant pour le reste de l’image.

EOF : Fin du frame

  • Ce bit indique la fin d’une image vidéo et est défini dans le dernier exemple vidéo appartenant à une image. L’utilisation de ce bit est une optimisation pour réduire la latence à l’achèvement d’un transfert d’images, et est facultative.

PTS : Horodatage de présentation

  • Ce bit, quand il est défini, indique la présence d’un champ PTS.

SCR : Référence d'horloge source

  • Ce bit, quand il est défini, indique la présence d’un champ SCR.

RES : Réservé.

  • Défini sur 0.

STI : Image fixe

  • Ce bit, lorsqu'il est défini, identifie un échantillon vidéo comme appartenant à une image fixe.

ERR : Bit d’erreur

  • Ce bit, lorsqu’il est défini, indique une erreur dans la diffusion en continu de l’appareil.

EOH : Fin de l’en-tête

  • Ce bit, quand il est défini, indique la fin des champs BFH.

PTS : Horodatage de présentation, Taille : 4 octets, Valeur : Nombre

  • Le champ PTS est présent lorsque le bit PTS est défini dans le champ BFH[0]. Consultez la section 2.4.3.3 « En-têtes de charge utile vidéo et image fixe » dans la spécification de la définition de classe de périphérique USB pour les appareils vidéo.

SCR : Référence de l’horloge source, Taille : 6 octets, Valeur : Nombre

  • Le champ SCR est présent lorsque le bit SCR est défini dans le champ BFH[0]. Consultez la section 2.4.3.3 Vidéo et en-têtes de charge utile des images fixes dans la spécification de la définition de la classe de périphérique USB pour les appareils vidéo.

Le champ HLE dans le pilote UVC existant est fixe à 2 octets (aucun PTS/SCR présent) ou jusqu’à 12 octets (PTS/SCR présent). Toutefois, le champ HLE, en tant que champ de taille d’octet, peut éventuellement spécifier jusqu’à 255 octets de données d’en-tête. Si PTS/SCR sont présents et que le HLE est supérieur à 12 octets, toutes les données supplémentaires qui suivent les 12 premiers octets de l’en-tête de charge utile sont récupérées comme métadonnées standard spécifiques à l’image vidéo lorsque l'entrée StandardFormatMetadata<PinIndex> INF est définie.

Les métadonnées de format standard (générées par microprogramme) pour une image sont obtenues en concaténant les objets blob partiels trouvés dans les paquets d’images vidéo représentant cette image.

paquets de trames de métadonnées.

2.2.3.3 Mémoire tampon de métadonnées fournie au composant en mode utilisateur

La mémoire tampon de métadonnées fournie au composant en mode utilisateur aurait un élément de métadonnées pour les horodatages UVC (générés par le pilote UVC) suivis des éléments de métadonnées générés par le microprogramme et ils sont disposés comme suit :

mémoire tampon de métadonnées.

2.2.3.4 Format de métadonnées pour les identificateurs de métadonnées standard

Le microprogramme peut choisir s’il faut produire ou non des métadonnées correspondant à un identificateur. Si le microprogramme choisit de produire des métadonnées correspondant à un identificateur, les métadonnées de cet identificateur sont présentes sur toutes les images émises par le microprogramme.

2.2.3.4.1 MetadataId_CaptureStats

Le format de métadonnées de cet identificateur est défini par la structure suivante :

typedef struct tagKSCAMERA_METADATA_CAPTURESTATS {
    KSCAMERA_METADATA_ITEMHEADER Header;
    ULONG Flags;
    ULONG Reserved;
    ULONGLONG ExposureTime;
    ULONGLONG ExposureCompensationFlags;
    LONG ExposureCompensationValue;
    ULONG IsoSpeed;
    ULONG FocusState;
    ULONG LensPosition; // a.k.a Focus
    ULONG WhiteBalance;
    ULONG Flash;
    ULONG FlashPower;
    ULONG ZoomFactor;
    ULONGLONG SceneMode;
    ULONGLONG SensorFramerate;
} KSCAMERA_METADATA_CAPTURESTATS, *PKSCAMERA_METADATA_CAPTURESTATS;

Le champ Indicateurs indique quels champs ultérieurs de la structure sont remplis et ont des données valides. Le champ Indicateurs ne doit pas varier d’un cadre à l’autre. Actuellement, les indicateurs suivants sont définis :

#define KSCAMERA_METADATA_CAPTURESTATS_FLAG_EXPOSURETIME            0x00000001
#define KSCAMERA_METADATA_CAPTURESTATS_FLAG_EXPOSURECOMPENSATION    0x00000002
#define KSCAMERA_METADATA_CAPTURESTATS_FLAG_ISOSPEED                0x00000004
#define KSCAMERA_METADATA_CAPTURESTATS_FLAG_FOCUSSTATE              0x00000008
#define KSCAMERA_METADATA_CAPTURESTATS_FLAG_LENSPOSITION            0x00000010
#define KSCAMERA_METADATA_CAPTURESTATS_FLAG_WHITEBALANCE            0x00000020
#define KSCAMERA_METADATA_CAPTURESTATS_FLAG_FLASH                   0x00000040
#define KSCAMERA_METADATA_CAPTURESTATS_FLAG_FLASHPOWER              0x00000080
#define KSCAMERA_METADATA_CAPTURESTATS_FLAG_ZOOMFACTOR              0x00000100
#define KSCAMERA_METADATA_CAPTURESTATS_FLAG_SCENEMODE               0x00000200
#define KSCAMERA_METADATA_CAPTURESTATS_FLAG_SENSORFRAMERATE         0x00000400

Le champ Réservé est réservé à l’avenir et doit être défini sur 0.

Le champ ExposureTime contient le temps d’exposition, en 100 ns, appliqué au capteur lorsque le cadre a été capturé. Cela s’affiche en tant qu’attribut MF_CAPTURE_METADATA_EXPOSURE_TIME sur l’exemple MF correspondant.

Le champ ExposureCompensationFlags contient l’étape de compensation EV (exactement l’un des indicateurs d’étape KSCAMERA_EXTENDEDPROP_EVCOMP_XXX doit être défini) utilisée pour transmettre la valeur de compensation EV. Le champ ExposureCompensationValue contient la valeur compensation EV en unités de l’étape appliquée au capteur lorsque le frame a été capturé. Celles-ci s’affichent en tant qu’attribut MF_CAPTURE_METADATA_EXPOSURE_COMPENSATION sur l’exemple MF correspondant.

Le champ IsoSpeed contient la valeur de vitesse ISO appliquée au capteur lorsque le cadre a été capturé. C’est sans unité. Cela s’affiche en tant qu’attribut MF_CAPTURE_METADATA_ISO_SPEED sur l’exemple MF correspondant.

Le champ FocusState contient l’état de focus actuel qui peut prendre l’une des valeurs définies dans l’énumération KSCAMERA_EXTENDEDPROP_FOCUSSTATE. Cela s’affiche en tant qu’attribut MF_CAPTURE_METADATA_FOCUSSTATE sur l’exemple MF correspondant.

Le champ LensPosition contient la position logique de l’objectif lorsque le cadre a été capturé, ce qui est sans unité. Il s’agit de la même valeur que celle qui peut être interrogée à partir de KSPROPERTY_CAMERACONTROL_EXTENDED_FOCUS dans un appel GET. Cela s’affiche en tant qu’attribut MF_CAPTURE_METADATA_LENS_POSITION sur l’exemple MF correspondant.

Le champ WhiteBalance contient l’équilibre blanc appliqué au capteur lorsque le cadre a été capturé, qui est une valeur dans Kelvin. Cela s’affiche en tant qu’attribut MF_CAPTURE_METADATA_WHITEBALANCE sur l’exemple MF correspondant.

Le champ Flash contient une valeur booléenne avec 1 signification flash activé, et 0, ce qui signifie flash off, lorsque l’image a été capturée. Cela s’affiche en tant qu’attribut MF_CAPTURE_METADATA_FLASH sur l’exemple MF correspondant.

Le champ FlashPower contient la puissance flash appliquée au cadre capturé, qui est une valeur dans la plage de [0, 100]. Ce champ doit être omis si le pilote ne prend pas en charge la puissance ajustable du flash. Cela s’affiche en tant qu’attribut MF_CAPTURE_METADATA_FLASH_POWER sur l’exemple MF correspondant.

Le champ ZoomFactor contient la valeur de zoom au format Q16 appliqué au cadre capturé. Cela s’affiche en tant qu’attribut MF_CAPTURE_METADATA_ZOOMFACTOR sur l’exemple MF correspondant.

Le champ SceneMode contient le mode scène appliqué au frame capturé, qui est un indicateur de KSCAMERA_EXTENDEDPROP_SCENEMODE_XXX 64 bits. Cela s’affiche en tant qu’attribut MF_CAPTURE_METADATA_SCENE_MODE sur l’exemple MF correspondant.

Le champ SensorFramerate contient le taux de lecture du capteur mesuré en hertz lorsque l’image est capturée, qui se compose d’une valeur de numérateur dans le 32 bits supérieur et dénominateur dans la valeur inférieure de 32 bits. Cela s’affiche en tant qu’attribut MF_CAPTURE_METADATA_SENSORFRAMERATE sur l’exemple MF correspondant.

2.2.3.4.2 MetadataId_CameraExtrinsics

Le format de métadonnées pour cet identificateur implique le KSCAMERA_METADATA_ITEMHEADER standard suivi d'une charge utile sous forme de tableau d’octets. La charge utile doit être conforme à une structure MFCameraExtrinsics suivie de zéro ou plusieurs structures MFCameraExtrinsic_CalibratedTransform. La charge utile doit être alignée sur 8 octets et tous les octets inutilisés doivent se produire à la fin de la charge utile et être définis sur 0.

2.2.3.4.3 MetadataId_CameraIntrinsics

Le format de métadonnées de cet identificateur implique la KSCAMERA_METADATA_ITEMHEADER standard suivie d’une charge utile de tableau d’octets. La charge utile doit être alignée sur une structure MFPinholeCameraIntrinsics . La charge utile doit être alignée sur 8 octets et tous les octets inutilisés doivent se produire à la fin de la charge utile et être définis sur 0.

2.2.3.4.4 MetadataId_FrameIllumination

Le format de métadonnées de cet identificateur est défini par la structure suivante :

typedef struct tagKSCAMERA_METADATA_FRAMEILLUMINATION {
    KSCAMERA_METADATA_ITEMHEADER Header;
    ULONG Flags;
    ULONG Reserved;
} KSCAMERA_METADATA_FRAMEILLUMINATION, *PKSCAMERA_METADATA_FRAMEILLUMINATION;

Le champ Indicateurs indique des informations sur le cadre capturé. Actuellement, les indicateurs suivants sont définis :

#define KSCAMERA_METADATA_FRAMEILLUMINATION_FLAG_ON 0x00000001

Si un cadre a été capturé lors de l’éclairage, l’indicateur KSCAMERA_METADATA_FRAMEILLUMINATION_FLAG_ON doit être défini. Sinon, cet indicateur ne doit pas être activé.

Le champ Réservé est réservé pour une utilisation ultérieure et doit être défini sur 0.

Exemple :

Par exemple, une structure KSCAMERA_METADATA_FRAMEILLUMINATION indiquant que l’éclairage était activé serait la suivante :

KSCAMERA_METADATA_FRAMEILLUMINATION.Header.MetadataId = MetadataId_FrameIllumination;
KSCAMERA_METADATA_FRAMEILLUMINATION.Header.Size = 16; // 4 ULONG variables in total inside the structure
KSCAMERA_METADATA_FRAMEILLUMINATION.Flags = KSCAMERA_METADATA_FRAMEILLUMINATION_FLAG_ON;
KSCAMERA_METADATA_FRAMEILLUMINATION.Reserved = 0;
2.2.3.4.5 MetadataId_USBVideoHeader

Le format de métadonnées de cet identificateur est défini par un KSCAMERA_METADATA_ITEMHEADER commun suivi d’une structure KSSTREAM_UVC_METADATA :

typedef struct
{
    ULONG       PresentationTimeStamp;
    ULONG       SourceClockReference;
    union
    {
        struct
        {
            USHORT    Counter : 11;
            USHORT  Reserved : 5;
        };
        USHORT    SCRToken;
    };
    USHORT      Reserved0;
    ULONG       Reserved1;
} KSSTREAM_UVC_METADATATYPE_TIMESTAMP, *PKSSTREAM_UVC_METADATATYPE_TIMESTAMP;

typedef struct {
    KSSTREAM_UVC_METADATATYPE_TIMESTAMP StartOfFrameTimestamp;
    KSSTREAM_UVC_METADATATYPE_TIMESTAMP EndOfFrameTimestamp;
} KSSTREAM_UVC_METADATA, *PKSSTREAM_UVC_METADATA;

Les champs StartOfFrameTimestamp et EndOfFrameTimestamp sont les horodatages contenus dans les en-têtes UVC des premières et dernières charges utiles UVC émises par l’appareil photo pour construire cette trame.

Cette charge utile ne doit pas être envoyée par un appareil.

Cette charge utile de métadonnées est unique, car il s’agit de la seule charge utile de métadonnées générée directement par le pilote de classe VIDÉO USB à partir des informations obtenues à partir d’en-têtes de charge utile compatibles UVC.

Cette charge utile est ajoutée à la mémoire tampon de métadonnées de chaque image.

Si l’appareil prend en charge les métadonnées standardisées, il doit inclure l’espace nécessaire pour stocker cette charge utile dans ses exigences de mémoire tampon, comme indiqué par le contrôle de métadonnées défini dans la section 2.2.2.9.