Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
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 verfügbar gemacht, andere werden 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 Aufnahmepipeline ein KSPROPERTY aus, aktiviert ein mit dieser Eigenschaft verknüpftes KSEVENT und wartet auf das Ereignis, um signalisiert zu werden. Der Treiber muss die KSPROPERTY synchron abschließen und dies als Trigger zum Starten der asynchronen Operation verwenden. Nach Abschluss des asynchronen Vorgangs muss der Treiber das zugehörige KSEVENT signalisieren, auf das die Aufnahmepipeline wartet. Die Aufnahmepipeline benachrichtigt die Anwendung über den Abschluss des Vorgangs, wenn sie das Signal empfängt.
Wenn eine asynchrone Steuerung abgebrochen werden kann, muss sie das Flag KSCAMERA_EXTENDEDPROP_FLAG_CANCELOPERATION in der Steuerung festlegen. Wenn das Steuerelement nicht abgebrochen werden kann, darf der Vorgang des Steuerelements 5 ms nicht überschreiten.
Diese erweiterten Steuerelemente sind Teil des folgenden KS-Eigenschaftensatzes, 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 Benutzermoduskomponente über diese Informationen verfügt, weist sie dem Treiber den entsprechenden Metadatenpuffer zu und kehrt zur Benutzermoduskomponente zurück.
Die KSPROPERTY_CAMERACONTROL_EXTENDED_METADATA Eigenschaften-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ünschten Speicherzuordnungstyp, für die Metadatenpufferzuweisung.
Sobald die Benutzermoduskomponente die Metadatenpufferanforderungen vom Treiber abgerufen hat, weist sie den entsprechend angepassten Metadatenpuffer mit der gewünschten Speicherausrichtung aus dem gewünschten Speicherpool zu. Dieser Metadatenpuffer wird zusammen mit dem tatsächlichen Framepuffer an den Treiber gesendet, um ihn zu erfüllen und dann bei der Füllung wieder an die Benutzermoduskomponente zurückzugeben. Für Multishotszenarien wird ein entsprechender Metadatenpuffer zugewiesen und an den Kameratreiber für jeden zugeordneten Framepuffer ü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
Nachdem der Puffer (Metadaten + Frame) an den Treiber in die Warteschlange gestellt wurde, sendet DevProxy eine Standardstruktur KSSTREAM_HEADER , gefolgt von einer KS_FRAME_INFO Struktur und gefolgt von einer KSSTREAM_METADATA_INFO Struktur. DevProxy wird KSSTREAM_HEADER.OptionFlags weiter mit KSSTREAM_HEADER_OPTIONSF_METADATA maskieren, bevor der Puffer an den Treiber übergeben wird.
Wenn der Treiber keine Metadaten unterstützt oder wenn KSPROPERTY_CAMERACONTROL_EXTENDED_METADATA nicht implementiert ist, schlägt das KSPROPERTY_CAMERACONTROL_EXTENDED_METADATA-Eigenschaftensteuerelement fehl. In diesem Fall weist DevProxy keinen Metadatenpuffer zu, und die Nutzlast, die an den Treiber von DevProxy übergeben wird, enthält nicht die KSSTREAM_METADATA_INFO Struktur.
Wenn der Treiber Metadaten unterstützt und der Client keine Metadaten wünscht, weist DevProxy beim Senden des Puffers an den Treiber weder einen Metadatenpuffer zu noch übergibt er KSSTREAM_METADATA_INFO. Dieses Verhalten reduziert die unnötige Metadatenspeicherzuweisung, wenn eine App keine Metadaten für eine bestimmte Pin erhalten 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 Bytes ausgerichtet sein.
Metadaten
Die Fotobestätigungsmetadaten werden durch MetadataId_PhotoConfirmation identifiziert. Wenn vorhanden, gibt es an, dass der zugehörige Vorschauframe 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 einen Blob mit Metadaten enthalten, der einen Fokusstatus und/oder erkannte Gesichter für den Vorschau-Pin, sowie EXIF- und/oder OEM-Metadaten für eine Bild-Pin umfassen kann. Das genaue Format des benutzerdefinierten Blobs wird vom OEM bestimmt, der den Treiber und MFT0 implementiert. Der MFT0 ist für die Analyse des benutzerdefinierten Blobs und das Anfügen jedes Metadatenelements als Attribut verantwortlich, das unter dem attributbehälter MFSampleExtension_CaptureMetadata in einem Format gruppiert ist, das von der MF-Aufnahmepipeline und/oder WinRT lesbar ist.
Die folgenden IMFAttributes werden in mfapi.h definiert. Diese sind von der MF-Aufnahmepipeline und/oder WinRT erforderlich. Beachten Sie, dass MFT0 keine IMFAttribute für die Fotobestätigung festgelegt, 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 vom DevProxy erstellt und an MFSampleExtension_CaptureMetadata angefügt, das einen Zeiger auf die IMFMediaBuffer-Schnittstelle enthält, die dem rohen Metadatenpuffer zugeordnet ist (KSSTREAM_METADATA_INFO.Data).
Wenn der MFT0 einen IMFSample empfängt, ruft er den Rohmetadatenpuffer aus dem MF_CAPTURE_METADATA_FRAME_RAWSTREAM ab und analysiert alle zusätzlichen benutzerdefinierten Metadatenelemente wie den Fokuszustand und konvertiert sie in entsprechende oben definierte IMFAttribute und fügt sie an den MFSampleExtension_CaptureMetadata Attributbehälter an. Die folgenden IMFAttribute müssen von der MF-Pipeline und allen von Drittanbietern bereitgestellten MFTs übertragen werden:
| Name | Typ |
|---|---|
| MFSampleExtension_CaptureMetadata | IUnknown (IMFAttributes) |
| MFSampleExtension_EOS | UINT32 (boolean) |
| MFSampleExtension_PhotoThumbnail | IUnknown (IMFMediaBuffer) |
| MFSampleExtension_PhotoThumbnailMediaType | IUnknown (IMFMediaType) |
Um auf den Unformatierten Metadatenpuffer zuzugreifen, führt MFT0 die folgenden Aktionen aus:
Ruft GetUnknown auf MFSampleExtension_CaptureMetadata über die IMFSample-Schnittstelle auf, um die IMFAttributes-Schnittstelle für den Attributbehälter abzurufen.
Ruft GetUnknown auf MF_CAPTURE_METADATA_FRAME_RAWSTREAM von der IMFAttributes-Schnittstelle auf, die aus dem vorherigen Schritt abgerufen wurde, um die IMFMediaBuffer-Schnittstelle abzurufen.
Ruft "Lock" auf, um den unformatierten Metadatenpuffer abzurufen, der IMFMediaBuffer zugeordnet ist.
Zum Hinzufügen der erforderlichen IMFAttributes zur MFSampleExtension_CaptureMetadata Attributsammlung führt der MFT0 folgende Aktionen aus:
Ruft GetUnknown auf MFSampleExtension_CaptureMetadata über die IMFSample-Schnittstelle auf, um die IMFAttributes-Schnittstelle für den Attributbeutel abzurufen.
Ruft SetUINT32, SetBlob oder SetUnknown für MF_CAPTURE_METADATA_XXX aus 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 Capture Stats Metadata Attributes
Fokuspriorität
Die KSPROPERTY_CAMERACONTROL_EXTENDED_FOCUSPRIORITY Eigenschaften-ID ist das einzige Steuerelement, das der Fokuspriorität DDI zugeordnet ist.
Fokusstatus
Die KSPROPERTY_CAMERACONTROL_EXTENDED_FOCUSSTATE Eigenschafts-ID ist das einzige Steuerelement, das dem Fokuszustand DDI zugeordnet ist.
Erweiterte Region des Interesses ROI
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 der Fotobestätigung DDI zugeordnet ist.
Untermodus der Fotosequenz
Die KSPROPERTY_CAMERACONTROL_EXTENDED_PHOTOMODE Eigenschafts-ID ist die einzige Steuerung, die 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 verzerren. Das EXIF-Datenformat wird vom Treiber, von MFT0 und vom OEM-HW-JPEG-Encoder bereitgestellt. OEM-Partner können jedes benutzerdefinierte Attribut-GUID und jeden Varianten-Typ für das EXIF-Attribut definieren und an den Attributbehälter MFSampleExtension_CaptureMetaData anfügen, damit sie von den OEM-Komponenten verwendet werden können. Wenn ein HW JPEG-Encoder verfügbar ist, lädt die Pipeline Photo Sink-Komponente den HW JPEG-Encoder und legt die EXIF-Daten im MFSampleExtension_CaptureMetaData Attributbehälter auf den HW JPEG-Encoder als EXIF-Encoderoption mit der IPropertyBag2::Write-Methode fest.
Der Eigenschaftsbeutel für Encoderoptionen enthält ein Array von PROPBAG2-Strukturen, die die verfügbaren Kodierungsoptionseigenschaften angeben. Die auf dem HW JPEG-Encoder festgelegte EXIF-Encoderoption wird durch die folgende Eigenschaft im Eigenschaftenspeicher der Encoderoption identifiziert.
| Eigenschaftsname | VARTYPE | Wert | Anwendbare Codecs |
|---|---|---|---|
| SampleMetaData | VT_UNKNOWN | Zeiger auf eine IMFAttributes-Schnittstelle für den Attributbehälter MFSampleExtension_CaptureMetaData, der ein OEM-Subattribut mit den EXIF-Daten enthält. | JPEG |
Der MFSampleExtension_CaptureMetaData Attributbehälter kann nur ein oem-definiertes 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, muss der Treiber und MFT0 Folgendes ausführen:
Der Treiber stellt benutzerdefinierte EXIF-Metadaten im Metadatenpuffer bereit, der von der Pipeline bereitgestellt wird. Dies wird als MF_CAPTURE_METADATA_FRAME_RAWSTREAM IMFAttribute an MFSampleExtension_CaptureMetadata von DevProxy angefügt, wenn die Probe an DevProxy zurückgesendet wird.
Wenn der MFT0 ein IMFSample empfängt, ruft er den Rohmetadatenpuffer von MF_CAPTURE_METADATA_FRAME_RAWSTREAM ab, analysiert das benutzerdefinierte EXIF-Metadatenelement, konvertiert es in ein vom OEM definiertes IMF-Attribut und fügt dieses an den MFSampleExtension_CaptureMetadata-Attribut-Behälter an.
Um EXIF-Daten aus dem MFT0 an den HW JPEG-Encoder zu übergeben, führt die Pipeline-Fotospüle die folgenden Aktionen aus:
Ruft GetUnknown für MFSampleExtension_CaptureMetadata von IMFSample auf, um die IMFAttributes-Schnittstelle für den Attributbehälter abzurufen, wenn IMFSample empfangen wird.
Ruft IPropertyBag2::Write auf, um die durch SampleMetadata identifizierte Encoderoptionseigenschaft für den HW JPEG-Encoder festzulegen. Die Encoder-Optionseigenschaft enthält die IMFAttributes-Schnittstelle, die aus dem vorherigen Schritt abgerufen wurde. Diese Schnittstelle enthält alle benutzerdefinierten Unterattribute, einschließlich des OEM EXIF-Unterattributes und der standardisierten Unterattribute im Abschnitt "Metadaten ", die weiter oben in diesem Thema erläutert wurden.
Um die EXIF-Daten zur weiteren Verarbeitung abzurufen, führt der HW JPEG-Encoder folgende Aktionen aus:
Ruft IPropertyBag2::Read auf, um den Eigenschaftswert für die Eigenschaft abzurufen, die durch den Namen der SampleMetadata-Eigenschaft und VT_UNKNOWN Typ identifiziert wird. Bei Rückgabe empfängt VARIANT.punkVal die IMFAttributes-Schnittstelle für MFSampleExtension_CaptureMetadata.
Ruft GetBlob oder GetUnknown für das OEM EXIF-Subattribut aus der Schnittstelle auf, die aus dem vorherigen Schritt abgerufen wurde, um den EXIF-Daten-Blob basierend auf der GUID und dem Datentyp des OEM EXIF-Subattributs abzurufen.
Miniaturbild
MFT0 ist nicht erforderlich, um ein Thumbnail für den Kameratreiber zu erzeugen. Die Kamera-App wird voraussichtlich eine eigene Miniaturansicht generieren. Die Miniaturansicht kann aus dem Fotobestätigungsbild, dem Hardware-JPEG-Encoder oder durch eine Größenanpassung eines Bildes in voller Größe erstellt werden. Dies liegt an den App-Entwicklern. Um die API- und App-Kompatibilität mit Windows 8.1-Apps aufrechtzuerhalten, darf der Kameratreiber das KSPROPERTY_CAMERACONTROL_EXTENDED_PHOTOTHUMBNAIL-Steuerelement nicht implementieren.
Ganzzahlige ISO
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.
Blitzlicht
Die KSPROPERTY_CAMERACONTROL_EXTENDED_FLASHMODE Eigenschafts-ID ist das einzige Steuerelement, das mit dem Flash-DDI in Verbindung steht.
Zoomen
Die KSPROPERTY_CAMERACONTROL_EXTENDED_ZOOM Eigenschaften-ID ist das einzige Steuerelement, das dem Zoom-DDI zugeordnet ist.
Szenenmodus
Die KSPROPERTY_CAMERACONTROL_EXTENDED_SCENEMODE Eigenschaften-ID ist das einzige Steuerelement, das dem Szenenmodus DDI zugeordnet ist.