Partager via


Contrôles de caméra étendus

Les contrôles étendus utilisent le mécanisme KSPROPERTY pour exposer les contrôles de caméra à l’application.

La liste suivante de contrôles étendus standardisés (définis par Media Foundation) permet d’activer des fonctionnalités supplémentaires de caméra Windows :

Certains contrôles sont exposés aux applications en tant que contrôles asynchrones, tandis que d’autres sont exposés en tant que contrôles synchrones.

Contrôles synchrones

Pour ces contrôles, le pipeline de capture émet une structure de contrôle de caméra KSPROPERTY et s’attend à ce que le pilote retourne la requête de manière synchrone.

Contrôles asynchrones

Pour ces contrôles, le pipeline de capture émet un KSPROPERTY, active un KSEVENT associé à cette propriété et attend que l’événement soit signalé. Le pilote doit effectuer le KSPROPERTY de façon synchrone et l’utiliser comme déclencheur pour démarrer l’opération asynchrone. Une fois l’opération asynchrone terminée, le pilote doit signaler l’événement KSEVENT associé sur lequel le pipeline de capture est en attente. Le pipeline de capture informe l’application de la fin de l’opération lorsqu’elle reçoit le signal.

Si un contrôle asynchrone peut être annulé, il doit spécifier l’indicateur KSCAMERA_EXTENDEDPROP_FLAG_CANCELOPERATION dans le contrôle. Si le contrôle ne peut pas être annulé, l’opération du contrôle ne doit pas dépasser 5 ms.

Ces contrôles étendus font partie du jeu de propriétés KS suivant défini dans ksmedia.h :

#define STATIC_KSPROPERTYSETID_ExtendedCameraControl \
     0x1CB79112, 0xC0D2, 0x4213, 0x9C, 0xA6, 0xCD, 0x4F, 0xDB, 0x92, 0x79, 0x72
DEFINE_GUIDSTRUCT("1CB79112-C0D2-4213-9CA6-CD4FDB927972", KSPROPERTYSETID_ExtendedCameraControl);
#define KSPROPERTYSETID_ExtendedCameraControl DEFINE_GUIDNAMED(KSPROPERTYSETID_ExtendedCameraControl);

Métadonnées

Pour récupérer des métadonnées, le composant en mode utilisateur (DevProxy) doit interroger le pilote pour connaître l’exigence de mémoire tampon de métadonnées. Une fois que le composant en mode utilisateur dispose de ces informations, il alloue la mémoire tampon de métadonnées appropriée pour que le pilote remplisse et retourne au composant en mode utilisateur.

L’ID de propriété KSPROPERTY_CAMERACONTROL_EXTENDED_METADATA qui est défini dans l’énumération KSPROPERTY_CAMERACONTROL_EXTENDED_PROPERTY est utilisé par le client pour interroger les exigences de mémoire tampon de métadonnées, telles que la taille de métadonnées requise, les exigences d’alignement de la mémoire et le type d’allocation de mémoire souhaité pour l’allocation de mémoire tampon de métadonnées.

Une fois que le composant du mode utilisateur a obtenu les exigences de mémoire tampon de métadonnées à partir du pilote, il alloue la mémoire tampon de métadonnées de taille appropriée avec l’alignement de mémoire souhaité à partir du pool de mémoires souhaité. Cette mémoire tampon de métadonnées, ainsi que la mémoire tampon de trame réelle, sont envoyées au pilote pour qu’elles soient remplies, puis retournées au composant en mode utilisateur lorsqu’elle est remplie. Pour les scénarios multihots, une mémoire tampon de métadonnées correspondante est allouée et remise au pilote de caméra pour chaque mémoire tampon de trame allouée.

La structure KSSTREAM_METADATA_INFO , ainsi que l’indicateur suivant, est utilisée pour envoyer la mémoire tampon de métadonnées au pilote.

#define KSSTREAM_HEADER_OPTIONSF_METADATA           0x00001000

Une fois la mémoire tampon (métadonnées + trame) mise en file d’attente vers le pilote, DevProxy envoie une structure de KSSTREAM_HEADER standard, suivie d’une structure KS_FRAME_INFO et d’une structure KSSTREAM_METADATA_INFO . DevProxy masque davantage KSSTREAM_HEADER. OptionFlags avec KSSTREAM_HEADER_OPTIONSF_METADATA avant de transmettre la mémoire tampon au pilote.

Si le pilote ne prend pas en charge les métadonnées ou si KSPROPERTY_CAMERACONTROL_EXTENDED_METADATA n’est pas implémenté, le contrôle de propriété KSPROPERTY_CAMERACONTROL_EXTENDED_METADATA échoue. Dans ce cas, DevProxy n’alloue pas de mémoire tampon de métadonnées et la charge utile transmise au pilote à partir de DevProxy ne contient pas la structure KSSTREAM_METADATA_INFO .

Si le pilote prend en charge les métadonnées et que le client ne veut pas de métadonnées, DevProxy n’alloue pas de mémoire tampon de métadonnées ni ne transmet KSSTREAM_METADATA_INFO lors de l’envoi de la mémoire tampon au pilote. Ce comportement réduit l’allocation inutile de mémoire des métadonnées si une application ne veut pas de métadonnées sur une broche donnée.

Les structures suivantes décrivent la disposition des éléments de métadonnées à remplir par le pilote de caméra dans la mémoire tampon de métadonnées.

La liste ci-dessous contient la disposition d’un élément de métadonnées. Il doit être aligné sur 8 octets.

Les métadonnées de confirmation de la photo sont identifiées par MetadataId_PhotoConfirmation. Lorsqu’il est présent, il indique que le cadre d’aperçu associé est un cadre de confirmation de photo. Les métadonnées de confirmation de photo sont analysées par devProxy.

Les métadonnées personnalisées sont identifiées par un MetadataId qui commence à partir de MetadataId_Custom_Start. L’élément de métadonnées personnalisé peut contenir un objet blob de métadonnées qui peut être un état de focus et/ou des visages détectés pour l’épingle d’aperçu, EXIF et/ou les métadonnées OEM pour une broche d’image. Le format exact de l’objet blob personnalisé est déterminé par l’OEM qui implémente le pilote et MFT0. Le MFT0 est chargé d’analyser l’objet blob personnalisé et d’attacher chaque élément de métadonnées en tant qu’attribut regroupé sous le conteneur d’attributs MFSampleExtension_CaptureMetadata dans un format lisible par le pipeline de capture MF et/ou WinRT.

Les attributs IMFAttributes suivants sont définis dans mfapi.h. Celles-ci sont requises par le pipeline de capture MF et/ou WinRT. Notez que MFT0 ne définit pas d’attributs IMFAttributes pour la confirmation de la photo, car le cadre de confirmation de photo n’est pas transmis au-delà de DevProxy.

Attribut (GUID) Type de données
MF_CAPTURE_METADATA_FOCUSSTATE UINT32
MF_CAPTURE_METADATA_FACEROIS Objet blob
MF_CAPTURE_METADATA_FRAME_RAWSTREAM IUnknown

Les MF_CAPTURE_METADATA_FRAME_RAWSTREAM IMFAttributes sont créées et attachées à MFSampleExtension_CaptureMetadata par devProxy, qui contient un pointeur vers l’interface IMFMediaBuffer associée à la mémoire tampon de métadonnées brutes (KSSTREAM_METADATA_INFO. Données).

Lorsque le MFT0 reçoit un IMFSample, il obtient la mémoire tampon de métadonnées brutes de l’MF_CAPTURE_METADATA_FRAME_RAWSTREAM et analyse tous les éléments de métadonnées personnalisés supplémentaires tels que l’état du focus, les convertit en IMFAttributes correspondants définis ci-dessus et les attache au conteneur d’attributs MFSampleExtension_CaptureMetadata . Les attributs IMFAttributes suivants doivent être transférés par le pipeline MF et tous les MFT fournis par un tiers :

Nom Type
MFSampleExtension_CaptureMetadata IUnknown (IMFAttributes)
MFSampleExtension_EOS UINT32 (booléen)
MFSampleExtension_PhotoThumbnail IUnknown (IMFMediaBuffer)
MFSampleExtension_PhotoThumbnailMediaType IUnknown (IMFMediaType)

Pour accéder à la mémoire tampon de métadonnées brutes, le MFT0 effectue les opérations suivantes :

  1. Appelle GetUnknown sur MFSampleExtension_CaptureMetadata à partir de l’interface IMFSample pour obtenir l’interface IMFAttributes pour le conteneur d’attributs.

  2. Appelle GetUnknown sur MF_CAPTURE_METADATA_FRAME_RAWSTREAM à partir de l’interface IMFAttributes obtenue à l’étape précédente pour obtenir l’interface IMFMediaBuffer.

  3. Appelle Lock pour obtenir la mémoire tampon de métadonnées brutes associée à IMFMediaBuffer.

Pour ajouter les attributs IMFAttributes requis au conteneur d’attributs MFSampleExtension_CaptureMetadata , le MFT0 effectue les opérations suivantes :

  1. Appelle GetUnknown sur MFSampleExtension_CaptureMetadata à partir de l’interface IMFSample pour obtenir l’interface IMFAttributes pour le conteneur d’attributs.

  2. Appelle SetUINT32, SetBlob ou SetUnknown sur MF_CAPTURE_METADATA_XXX à partir de l’interface IMFAttributes obtenue à l’étape précédente en fonction du GUID et du type de données spécifiés dans le tableau ci-dessus.

Attributs de métadonnées obligatoires

La liste complète des attributs de métadonnées disponibles est disponible dans Capture Stats Metadata Attributes

Priorité du focus

L’ID de propriété KSPROPERTY_CAMERACONTROL_EXTENDED_FOCUSPRIORITY est le seul contrôle associé à l’ID de priorité du focus.

État du focus

L’ID de propriété KSPROPERTY_CAMERACONTROL_EXTENDED_FOCUSSTATE est le seul contrôle associé à l’id DDI d’état du focus.

Retour sur investissement de la région d’intérêt étendue

Les ID de propriété suivants sont les contrôles associés au DDI roi :

Photo de confirmation

L’ID de propriété KSPROPERTY_CAMERACONTROL_EXTENDED_PHOTOCONFIRMATION est le seul contrôle associé au DDI de confirmation de la photo.

Sous-modèle de séquence de photos

L’ID de propriété KSPROPERTY_CAMERACONTROL_EXTENDED_PHOTOMODE est le seul contrôle associé à la séquence photo DDI.

Encodeur JPEG EXIF et HW

Le pipeline n’est pas nécessaire pour traiter ou dériver les données EXIF pour l’encodeur JPEG HW ; par conséquent, le format de données EXIF est fourni par le pilote, MFT0 et l’encodeur JPEG OEM HW. Les partenaires OEM peuvent définir n’importe quel GUID d’attribut personnalisé et type de variante pour l’attribut EXIF et l’attacher au MFSampleExtension_CaptureMetaData sac d’attributs pour qu’il soit consommé par les composants OEM. Si un encodeur JPEG HW est disponible, le composant récepteur de photos de pipeline charge l’encodeur JPEG HW et définit les données EXIF contenues dans le sac d’attributs MFSampleExtension_CaptureMetaData sur l’encodeur JPEG HW en tant qu’option d’encodeur EXIF à l’aide de la méthode IPropertyBag2 ::Write .

Le sac de propriétés d’option d’encodeur contient un tableau de structures PROPBAG2 qui spécifient les propriétés d’option d’encodage disponibles. L’option d’encodeur EXIF définie sur l’encodeur JPEG HW est identifiée par la propriété suivante dans le sac de propriétés d’option de l’encodeur :

Nom de la propriété VARTYPE Valeur Codecs applicables
SampleMetaData VT_UNKNOWN Pointeur vers une interface IMFAttributes pour MFSampleExtension_CaptureMetaData sac d’attribut qui contient un sous-attribut OEM contenant les données EXIF. JPEG

Le sac d’attributs MFSampleExtension_CaptureMetaData ne peut contenir que n’importe quel sous-attribut EXIF défini par OEM que l’encodeur JPEG MFT0 et HW peut lire pour contenir les données EXIF. Pour passer des données EXIF du pilote à l’encodeur JPEG HW, le pilote et MFT0 doivent effectuer les opérations suivantes :

  1. Le pilote fournit des métadonnées EXIF personnalisées dans la mémoire tampon de métadonnées fournie par le pipeline. Il est attaché à MFSampleExtension_CaptureMetadata en tant que MF_CAPTURE_METADATA_FRAME_RAWSTREAM IMFAttribute par DevProxy lorsque l’exemple est retourné à DevProxy.

  2. Lorsque le MFT0 reçoit un IMFSample, il obtient la mémoire tampon de métadonnées brutes de MF_CAPTURE_METADATA_FRAME_RAWSTREAM et analyse l’élément de métadonnées EXIF personnalisé, le convertit en un IMFAttribute défini par OEM et l’attache au sac d’attributs MFSampleExtension_CaptureMetadata .

Pour passer des données EXIF du MFT0 à l’encodeur JPEG HW, le récepteur photo de pipeline effectue les opérations suivantes :

  1. Appelle GetUnknown sur MFSampleExtension_CaptureMetadata à partir de IMFSample pour obtenir l’interface IMFAttributes pour le sac d’attribut lorsque IMFSample est reçu.

  2. Appelle IPropertyBag2 ::Write pour définir la propriété d’option d’encodeur, identifiée par SampleMetadata, sur l’encodeur JPEG HW. La propriété d’option d’encodeur contient l’interface IMFAttributes obtenue à l’étape précédente. Cette interface contient tous les sous-attributs personnalisés, y compris le sous-attribut OEM EXIF et les sous-attributs standardisés dans la section Métadonnées décrite plus haut dans cette rubrique.

Pour récupérer les données EXIF en vue d’un traitement ultérieur, l’encodeur JPEG HW effectue les opérations suivantes :

  1. Appelle IPropertyBag2 ::Read pour récupérer la valeur de la propriété identifiée par le nom de la propriété SampleMetadata et VT_UNKNOWN type. Lorsqu’il est retourné, variant.punkVal reçoit l’interface IMFAttributes pour MFSampleExtension_CaptureMetadata.

  2. Appelle GetBlob ou GetUnknown sur le sous-attribut OEM EXIF de l’interface obtenue à l’étape précédente pour obtenir l’objet blob de données EXIF en fonction du GUID et du type de données du sous-attribut EXIF OEM.

Thumbnail

MFT0 n’est pas nécessaire pour produire une miniature pour le pilote de caméra. L’application caméra doit générer sa propre miniature. La miniature peut être produite à partir de l’image de confirmation de la photo, de l’encodeur JPEG HW ou du redimensionnement d’une image pleine taille. Cela appartient aux développeurs d’applications. Pour maintenir la compatibilité de l’API et des applications avec Windows 8.1 applications, le pilote de caméra ne doit pas implémenter le contrôle KSPROPERTY_CAMERACONTROL_EXTENDED_PHOTOTHUMBNAIL.

ISO entier

L’ID de propriété KSPROPERTY_CAMERACONTROL_EXTENDED_ISO_ADVANCED est le seul contrôle associé à l’entier ISO DDI.

Focus avancé

L’ID de propriété KSPROPERTY_CAMERACONTROL_EXTENDED_FOCUSMODE est le seul contrôle associé à l’entier ISO DDI.

Clignote

L’ID de propriété KSPROPERTY_CAMERACONTROL_EXTENDED_FLASHMODE est le seul contrôle associé au DDI flash.

Zoom

L’ID de propriété KSPROPERTY_CAMERACONTROL_EXTENDED_ZOOM est le seul contrôle associé au zoom DDI.

Mode scène

L’ID de propriété KSPROPERTY_CAMERACONTROL_EXTENDED_SCENEMODE est le seul contrôle associé au DDI en mode scène.