Freigeben über


Erweiterte Kamerasteuerungen

Erweiterte Steuerelemente verwenden den KSPROPERTY-Mechanismus , um Kamerasteuerelemente für die Anwendung verfügbar zu machen.

Die folgende Liste der standardisierten erweiterten Steuerelemente (definiert durch Media Foundation) ermöglichen zusätzliche Windows-Kamerafeatures:

Einige der Steuerelemente werden Anwendungen als asynchrone Steuerelemente und andere als synchrone Steuerelemente verfügbar gemacht.

Synchrone Steuerelemente

Für diese Steuerelemente gibt die Aufnahmepipeline eine KSPROPERTY-Kamerasteuerungsstruktur aus und erwartet, dass der Treiber die Anforderung synchron zurückgibt.

Asynchrone Steuerelemente

Für diese Steuerelemente gibt die Erfassungspipeline eine KSPROPERTY aus, aktiviert ein KSEVENT , das dieser Eigenschaft zugeordnet ist, und wartet, bis das Ereignis signalisiert wird. Der Treiber muss die KSPROPERTY synchron abschließen und als Trigger verwenden, um den asynchronen Vorgang zu starten. Nach Abschluss des asynchronen Vorgangs muss der Treiber dem zugeordneten KSEVENT signalisieren, auf dem die Erfassungspipeline wartet. Die Erfassungspipeline benachrichtigt die Anwendung über den Abschluss des Vorgangs, wenn sie das Signal empfängt.

Wenn ein asynchrones Steuerelement abgebrochen werden kann, muss es das Flag angeben , das im Steuerelement KSCAMERA_EXTENDEDPROP_FLAG_CANCELOPERATION . Wenn das Steuerelement nicht abgebrochen werden kann, darf der Vorgang des Steuerelements 5 ms nicht überschreiten.

Diese erweiterten Steuerelemente sind Teil des folgenden KS-Eigenschaftssatzes, der in ksmedia.h definiert ist:

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

Metadaten

Zum Abrufen von Metadaten muss die Benutzermoduskomponente (DevProxy) den Treiber für die Metadatenpufferanforderung abfragen. Sobald die Komponente für den Benutzermodus über diese Informationen verfügt, weist sie den entsprechenden Metadatenpuffer zu, damit der Treiber die Komponente des Benutzermodus füllen und zurück zur Komponente des Benutzermodus zurückkehren kann.

Die KSPROPERTY_CAMERACONTROL_EXTENDED_METADATA-Eigenschafts-ID, die in der KSPROPERTY_CAMERACONTROL_EXTENDED_PROPERTY-Enumeration definiert ist, wird vom Client verwendet, um die Metadatenpufferanforderungen abzufragen, z. B. erforderliche Metadatengröße, Speicherausrichtungsanforderungen und gewünschter Speicherzuordnungstyp, für die Metadatenpufferzuordnung.

Sobald die Benutzermoduskomponente die Metadatenpufferanforderungen vom Treiber abgerufen hat, weist sie den Metadatenpuffer mit der entsprechenden Größe der gewünschten Speicherausrichtung aus dem gewünschten Speicherpool zu. Dieser Metadatenpuffer wird zusammen mit dem tatsächlichen Framepuffer zum Erfüllen an den Treiber gesendet und beim Füllen wieder an die Komponente des Benutzermodus zurückgegeben. Bei Multishotszenarien wird ein entsprechender Metadatenpuffer zugeordnet und für jeden zugeordneten Framepuffer an den Kameratreiber übermittelt.

Die KSSTREAM_METADATA_INFO-Struktur wird zusammen mit dem folgenden Flag verwendet, um den Metadatenpuffer an den Treiber zu senden.

#define KSSTREAM_HEADER_OPTIONSF_METADATA           0x00001000

Sobald der Puffer (Metadaten + Frame) in die Warteschlange für den Treiber eingereiht ist, sendet DevProxy eine Standard-KSSTREAM_HEADER-Struktur , gefolgt von einer KS_FRAME_INFO-Struktur und gefolgt von einer KSSTREAM_METADATA_INFO-Struktur . DevProxy maskieren KSSTREAM_HEADER weiter. OptionFlags mit KSSTREAM_HEADER_OPTIONSF_METADATA , bevor der Puffer an den Treiber übergeben wird.

Wenn der Treiber keine Metadaten unterstützt oder KSPROPERTY_CAMERACONTROL_EXTENDED_METADATA nicht implementiert ist, schlägt das KSPROPERTY_CAMERACONTROL_EXTENDED_METADATA-Eigenschaftssteuerelement fehl. In diesem Fall weist DevProxy keinen Metadatenpuffer zu, und die Nutzlast, die von DevProxy an den Treiber übergeben wird, enthält nicht die KSSTREAM_METADATA_INFO-Struktur .

Wenn der Treiber Metadaten unterstützt und der Client keine Metadaten möchte, weist DevProxy beim Senden des Puffers an den Treiber weder Metadatenpuffer zu, noch übergibt er KSSTREAM_METADATA_INFO . Dieses Verhalten reduziert die unnötige Metadatenspeicherbelegung, wenn eine App keine Metadaten an einer bestimmten Pin haben möchte.

Die folgenden Strukturen beschreiben das Layout der Metadatenelemente, die vom Kameratreiber im Metadatenpuffer ausgefüllt werden sollen.

Die folgende Liste enthält das Layout eines Metadatenelements. Dies muss auf 8 Byte ausgerichtet sein.

Die Metadaten zur Fotobestätigung werden durch MetadataId_PhotoConfirmation identifiziert. Wenn vorhanden, gibt es an, dass der zugeordnete Vorschaurahmen ein Fotobestätigungsrahmen ist. Fotobestätigungsmetadaten werden vom DevProxy analysiert.

Die benutzerdefinierten Metadaten werden durch eine MetadataId identifiziert, die mit MetadataId_Custom_Start beginnt. Das benutzerdefinierte Metadatenelement kann ein Blob mit Metadaten enthalten, bei dem es sich um einen Fokuszustand und/oder Gesichter handeln kann, die für den Vorschaupin, EXIF und/oder die OEM-Metadaten für einen Bildpin erkannt wurden. Das genaue Format des benutzerdefinierten Blobs wird vom OEM bestimmt, der den Treiber und MFT0 implementiert. MFT0 ist für die Analyse des benutzerdefinierten Blobs und das Anfügen jedes Metadatenelements als Attribut verantwortlich, das unter dem MFSampleExtension_CaptureMetadata Attributbehälter in einem Format gruppiert ist, das von der MF-Erfassungspipeline und/oder WinRT lesbar ist.

Die folgenden IMFAttributes sind in mfapi.h definiert. Diese werden von der MF-Erfassungspipeline und/oder WinRT benötigt. Beachten Sie, dass MFT0 keine IMFAttributes für die Fotobestätigung festgelegt hat, da der Fotobestätigungsrahmen nicht über DevProxy hinaus fließt.

Attribut (GUID) Datentyp
MF_CAPTURE_METADATA_FOCUSSTATE UINT32
MF_CAPTURE_METADATA_FACEROIS Blob
MF_CAPTURE_METADATA_FRAME_RAWSTREAM IUnknown

Die MF_CAPTURE_METADATA_FRAME_RAWSTREAM IMFAttributes werden erstellt und an MFSampleExtension_CaptureMetadata vom DevProxy angefügt, der einen Zeiger auf die IMFMediaBuffer-Schnittstelle enthält, die dem Rohdatenpuffer (KSSTREAM_METADATA_INFO) zugeordnet ist. Daten).

Wenn MFT0 einen IMFSample empfängt, ruft er den Rohdatenpuffer aus dem MF_CAPTURE_METADATA_FRAME_RAWSTREAM ab und analysiert alle zusätzlichen benutzerdefinierten Metadatenelemente wie den Fokuszustand, konvertiert sie in die oben definierten entsprechenden IMFAttributes und fügt sie dem MFSampleExtension_CaptureMetadata Attributbehälter an. Die folgenden IMFAttributes müssen von der MF-Pipeline und allen von Drittanbietern bereitgestellten MFTs übertragen werden:

Name Typ
MFSampleExtension_CaptureMetadata IUnknown (IMFAttributes)
MFSampleExtension_EOS UINT32 (Boolesch)
MFSampleExtension_PhotoThumbnail IUnknown (IMFMediaBuffer)
MFSampleExtension_PhotoThumbnailMediaType IUnknown (IMFMediaType)

Um auf den Rohdatenpuffer zuzugreifen, führt MFT0 folgende Schritte aus:

  1. Ruft GetUnknown auf MFSampleExtension_CaptureMetadata von der IMFSample-Schnittstelle auf, um die IMFAttributes-Schnittstelle für den Attributbehälter abzurufen.

  2. Ruft GetUnknown auf MF_CAPTURE_METADATA_FRAME_RAWSTREAM von der im vorherigen Schritt abgerufenen IMFAttributes-Schnittstelle auf, um die IMFMediaBuffer-Schnittstelle abzurufen.

  3. Ruft Lock auf, um den rohen Metadatenpuffer abzurufen, der IMFMediaBuffer zugeordnet ist.

Um die erforderlichen IMFAttributes zum MFSampleExtension_CaptureMetadata-Attributbehälter hinzuzufügen, führt MFT0 die folgenden Schritte aus:

  1. Ruft GetUnknown auf MFSampleExtension_CaptureMetadata von der IMFSample-Schnittstelle auf, um die IMFAttributes-Schnittstelle für den Attributbehälter abzurufen.

  2. Ruft SetUINT32, SetBlob oder SetUnknown auf MF_CAPTURE_METADATA_XXX von der IMFAttributes-Schnittstelle auf, die aus dem vorherigen Schritt basierend auf der GUID und dem in der obigen Tabelle angegebenen Datentyp abgerufen wurde.

Obligatorische Metadatenattribute

Die vollständige Liste der verfügbaren Metadatenattribute finden Sie unter Metadatenattribute von Erfassungsstatistiken.

Fokuspriorität

Die KSPROPERTY_CAMERACONTROL_EXTENDED_FOCUSPRIORITY-Eigenschafts-ID ist das einzige Steuerelement, das dem DDI der Fokuspriorität zugeordnet ist.

Fokuszustand

Die KSPROPERTY_CAMERACONTROL_EXTENDED_FOCUSSTATE-Eigenschafts-ID ist das einzige Steuerelement, das dem Fokusstatus DDI zugeordnet ist.

Roi für erweiterte Interessenregion

Die folgenden Eigenschaften-IDs sind die Steuerelemente, die dem ROI-DDI zugeordnet sind:

Fotobestätigung

Die KSPROPERTY_CAMERACONTROL_EXTENDED_PHOTOCONFIRMATION-Eigenschafts-ID ist das einzige Steuerelement, das dem DDI der Fotobestätigung zugeordnet ist.

Fotosequenz-Untermodus

Die KSPROPERTY_CAMERACONTROL_EXTENDED_PHOTOMODE-Eigenschafts-ID ist das einzige Steuerelement, das der Fotosequenz-DDI zugeordnet ist.

EXIF- und HW JPEG-Encoder

Die Pipeline ist nicht erforderlich, um EXIF-Daten für den HW JPEG-Encoder zu verarbeiten oder zu verziehen. Daher wird das EXIF-Datenformat vom Treiber, MFT0 und OEM HW JPEG-Encoder bereitgestellt. OEMs-Partner können jede benutzerdefinierte Attribut-GUID und jeden Variantentyp für das EXIF-Attribut definieren und an den MFSampleExtension_CaptureMetaData-Attributbehälter anfügen, damit es von den OEM-Komponenten verwendet wird. Wenn ein HW JPEG-Encoder verfügbar ist, lädt die Pipeline-Fotosenke den HW JPEG-Encoder und legt die exif-Daten, die in der MFSampleExtension_CaptureMetaData-Attributtasche gespeichert sind, mit der IPropertyBag2::Write-Methode auf den HW JPEG-Encoder als EXIF-Encoderoption fest.

Der Eigenschaftenbehälter für Encoderoptionen enthält ein Array von PROPBAG2 Strukturen, die die verfügbaren Eigenschaften der Codierungsoption angeben. Die auf den HW JPEG-Encoder festgelegte EXIF-Encoderoption wird durch die folgende Eigenschaft im Eigenschaftenbehälter der Encoderoption identifiziert:

Eigenschaftenname VARTYPE Wert Anwendbare Codecs
SampleMetaData VT_UNKNOWN Zeiger auf eine IMFAttributes-Schnittstelle für MFSampleExtension_CaptureMetaData Attributbehälter, der ein OEM-Subattribut enthält, das die EXIF-Daten enthält. JPEG

Der MFSampleExtension_CaptureMetaData-Attributbehälters darf nur jedes vom OEM definierte EXIF-Sub-Attribut enthalten, das der MFT0- und HW-JPEG-Encoder lesen kann, um die EXIF-Daten aufzunehmen. Um EXIF-Daten vom Treiber an den HW JPEG-Encoder zu übergeben, müssen der Treiber und MFT0 folgendes tun:

  1. Der Treiber stellt benutzerdefinierte EXIF-Metadaten im Metadatenpuffer bereit, der von der Pipeline bereitgestellt wird. Dies wird an MFSampleExtension_CaptureMetadata als MF_CAPTURE_METADATA_FRAME_RAWSTREAM IMFAttribute von DevProxy angefügt, wenn das Beispiel zurück an DevProxy zurückgegeben wird.

  2. Wenn MFT0 einen IMFSample empfängt, ruft er den Rohdatenpuffer von MF_CAPTURE_METADATA_FRAME_RAWSTREAM ab, analysiert das benutzerdefinierte EXIF-Metadatenelement, konvertiert es in ein vom OEM definiertes IMFAttribute und fügt es an den MFSampleExtension_CaptureMetadata Attributbehälter an.

Um EXIF-Daten vom MFT0 an den HW JPEG-Encoder zu übergeben, führt die Pipelinefotosenke folgende Schritte aus:

  1. Ruft GetUnknown auf MFSampleExtension_CaptureMetadata von IMFSample auf, um die IMFAttributes-Schnittstelle für den Attributbehälter abzurufen, wenn IMFSample empfangen wird.

  2. Ruft IPropertyBag2::Write auf, um die durch SampleMetadata identifizierte Encoderoptionseigenschaft auf den HW JPEG-Encoder festzulegen. Die Encoderoptionseigenschaft enthält die im vorherigen Schritt abgerufene IMFAttributes-Schnittstelle. Diese Schnittstelle enthält alle benutzerdefinierten Unterattribute, einschließlich des OEM EXIF-Subattributes und der standardisierten Unterattribute im Abschnitt Metadaten , die weiter oben in diesem Thema erläutert wurden.

Um die EXIF-Daten für die weitere Verarbeitung abzurufen, führt der HW JPEG-Encoder folgende Schritte aus:

  1. Ruft IPropertyBag2::Read auf, um den Eigenschaftswert für die Eigenschaft abzurufen, die durch den Namen der SampleMetadata-Eigenschaft und VT_UNKNOWN Typs identifiziert wird. Bei der Rückgabe empfängt VARIANT.punkVal die IMFAttributes-Schnittstelle für MFSampleExtension_CaptureMetadata.

  2. Ruft GetBlob oder GetUnknown für das OEM EXIF-Subattribut aus der Schnittstelle aus dem vorherigen Schritt auf, um das EXIF-Datenblob basierend auf der GUID und dem Datentyp des OEM EXIF-Subattributs abzurufen.

Miniaturansicht

MFT0 ist nicht erforderlich, um eine Miniaturansicht für den Kameratreiber zu erstellen. Es wird erwartet, dass die Kamera-App eine eigene Miniaturansicht generiert. Die Miniaturansicht kann aus dem Fotobestätigungsbild, dem HW JPEG-Encoder oder der Größe eines Bilds in voller Größe erstellt werden. Dies liegt bei den App-Entwicklern. Um die API- und App-Kompatibilität mit Windows 8.1 Apps zu gewährleisten, darf der Kameratreiber das KSPROPERTY_CAMERACONTROL_EXTENDED_PHOTOTHUMBNAIL-Steuerelement nicht implementieren.

Ganzzahlige ISO-Werte

Die KSPROPERTY_CAMERACONTROL_EXTENDED_ISO_ADVANCED-Eigenschafts-ID ist das einzige Steuerelement, das der ganzzahligen ISO-DDI zugeordnet ist.

Erweiterter Fokus

Die KSPROPERTY_CAMERACONTROL_EXTENDED_FOCUSMODE-Eigenschafts-ID ist das einzige Steuerelement, das der ganzzahligen ISO-DDI zugeordnet ist.

Blinken

Die KSPROPERTY_CAMERACONTROL_EXTENDED_FLASHMODE-Eigenschafts-ID ist das einzige Steuerelement, das dem Flash-DDI zugeordnet ist.

Zoom

Die KSPROPERTY_CAMERACONTROL_EXTENDED_ZOOM-Eigenschafts-ID ist das einzige Steuerelement, das dem Zoom-DDI zugeordnet ist.

Szenenmodus

Die KSPROPERTY_CAMERACONTROL_EXTENDED_SCENEMODE-Eigenschafts-ID ist das einzige Steuerelement, das dem Szenenmodus DDI zugeordnet ist.