Condividi tramite


Controlli fotocamera estesi

I controlli estesi usano il meccanismo KSPROPERTY per esporre i controlli della fotocamera all'applicazione.

L'elenco seguente di controlli estesi standardizzati (definiti da Media Foundation) abilita funzionalità aggiuntive della fotocamera di Windows:

Alcuni controlli vengono esposti alle applicazioni come controlli asincroni e altri vengono esposti come controlli sincroni.

Controlli sincroni

Per questi controlli, la pipeline di acquisizione genera una struttura di controllo della fotocamera KSPROPERTY e prevede che il driver restituisca in modo sincrono la richiesta.

Controlli asincroni

Per questi controlli, la pipeline di acquisizione genera un KSPROPERTY, abilita un KSEVENT associato a tale proprietà e attende che l'evento venga segnalato. Il driver deve completare in modo sincrono KSPROPERTY e usarlo come trigger per avviare l'operazione asincrona. Al termine dell'operazione asincrona, il driver deve segnalare il KSEVENT associato in cui la pipeline di acquisizione è in attesa. La pipeline di acquisizione notifica all'applicazione il completamento dell'operazione quando riceve il segnale.

Se un controllo asincrono può essere annullato, deve specificare il flag KSCAMERA_EXTENDEDPROP_FLAG_CANCELOPERATION nel controllo. Se il controllo non può essere annullato, l'operazione del controllo non deve superare 5 ms.

Questi controlli estesi fanno parte del set di proprietà KS seguente definito in 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);

Metadati

Per recuperare i metadati, il componente modalità utente (DevProxy) deve eseguire query sul driver per il requisito del buffer dei metadati. Una volta che il componente modalità utente ha queste informazioni, alloca il buffer dei metadati appropriato per il driver per riempire e tornare al componente modalità utente.

L'ID proprietà KSPROPERTY_CAMERACONTROL_EXTENDED_METADATA definito nell'enumerazione KSPROPERTY_CAMERACONTROL_EXTENDED_PROPERTY viene usato dal client per eseguire query sui requisiti del buffer dei metadati, ad esempio le dimensioni dei metadati necessarie, i requisiti di allineamento della memoria e il tipo di allocazione di memoria desiderato, per l'allocazione del buffer dei metadati.

Dopo aver ottenuto i requisiti del buffer dei metadati dal driver, il componente modalità utente assegna il buffer dei metadati di dimensioni appropriate con l'allineamento di memoria desiderato dal pool di memoria desiderato. Questo buffer di metadati, insieme al buffer di frame effettivo, verrà inviato al driver per soddisfare e quindi restituito al componente della modalità utente quando compilato. Per gli scenari multishot, un buffer di metadati corrispondente viene allocato e recapitato al driver della fotocamera per ogni buffer di fotogrammi allocato.

La struttura KSSTREAM_METADATA_INFO , insieme al flag seguente, viene usata per inviare il buffer dei metadati al driver.

#define KSSTREAM_HEADER_OPTIONSF_METADATA           0x00001000

Una volta accodato il buffer (metadati + frame) al driver, DevProxy invia una strutturadi KSSTREAM_HEADER standard, seguita da una struttura KS_FRAME_INFO e seguita da una struttura KSSTREAM_METADATA_INFO. DevProxy maschera ulteriormente KSSTREAM_HEADER. OptionFlags con KSSTREAM_HEADER_OPTIONSF_METADATA prima di passare il buffer al driver.

Se il driver non supporta i metadati o se KSPROPERTY_CAMERACONTROL_EXTENDED_METADATA non viene implementato, il controllo della proprietà KSPROPERTY_CAMERACONTROL_EXTENDED_METADATA avrà esito negativo. In questo caso, DevProxy non allocherà un buffer di metadati e il payload passato al driver da DevProxy non conterrà la struttura di KSSTREAM_METADATA_INFO .

Se il driver supporta i metadati e il client non vuole metadati, DevProxy non alloca il buffer dei metadati né passa KSSTREAM_METADATA_INFO quando si invia il buffer al driver. Questo comportamento riduce l'allocazione di memoria dei metadati non necessaria se un'app non vuole i metadati in un pin specificato.

Le strutture seguenti descrivono il layout degli elementi di metadati da riempire dal driver della fotocamera nel buffer dei metadati.

L'elenco seguente contiene il layout di un elemento di metadati. Questo deve essere allineato a 8 byte.

I metadati di conferma foto sono identificati da MetadataId_PhotoConfirmation. Quando presente, indica che il frame di anteprima associato è una cornice di conferma foto. I metadati di conferma foto vengono analizzati da DevProxy.

I metadati personalizzati vengono identificati da un MetadataId che inizia da MetadataId_Custom_Start. L'elemento metadati personalizzato può contenere un BLOB di metadati che può essere uno stato attivo e/o visi rilevati per il pin di anteprima, EXIF e/o i metadati OEM per un pin immagine. Il formato esatto del BLOB personalizzato è determinato dall'OEM che implementa il driver e MFT0. MFT0 è responsabile dell'analisi del BLOB personalizzato e del collegamento di ogni elemento di metadati come attributo raggruppato nel contenitore di attributi MFSampleExtension_CaptureMetadata in un formato leggibile dalla pipeline di acquisizione MF e/o WinRT.

I seguenti FMAttribute sono definiti in mfapi.h. Questi sono necessari dalla pipeline di acquisizione MF e/o WinRT. Si noti che MFT0 non imposta alcun FMAttributes per la conferma foto poiché la cornice di conferma foto non scorrerà oltre DevProxy.

Attributo (GUID) Tipo di dati
MF_CAPTURE_METADATA_FOCUSSTATE UINT32
MF_CAPTURE_METADATA_FACEROIS BLOB
MF_CAPTURE_METADATA_FRAME_RAWSTREAM IUnknown

I MF_CAPTURE_METADATA_FRAME_RAWSTREAM IMFAttributes vengono creati e collegati a MFSampleExtension_CaptureMetadata da DevProxy, che contiene un puntatore all'interfaccia FMMediaBuffer associata al buffer di metadati non elaborato (KSSTREAM_METADATA_INFO. Dati.

Quando il MFT0 riceve un fmiSample, ottiene il buffer dei metadati non elaborato dal MF_CAPTURE_METADATA_FRAME_RAWSTREAM e analizza eventuali elementi di metadati personalizzati aggiuntivi, ad esempio lo stato attivo e li converte in fmiAttributes corrispondenti definiti sopra e li collega al contenitore di attributi MFSampleExtension_CaptureMetadata . I seguenti fmiAttribute devono essere eseguiti dalla pipeline MF e da qualsiasi MMT fornito da terze parti:

Nome Tipo
MFSampleExtension_CaptureMetadata IUnknown (FMAttributes)
MFSampleExtension_EOS UINT32 (booleano)
MFSampleExtension_PhotoThumbnail IUnknown (FMMediaBuffer)
MFSampleExtension_PhotoThumbnailMediaType IUnknown (FMMediaType)

Per accedere al buffer dei metadati non elaborato, MFT0 esegue le operazioni seguenti:

  1. Chiama GetUnknown in MFSampleExtension_CaptureMetadata dall'interfaccia FMSample per ottenere l'interfaccia FMIAttributes per l'attributo bag.

  2. Chiama GetUnknown su MF_CAPTURE_METADATA_FRAME_RAWSTREAM dall'interfaccia FMIAttributes ottenuta dal passaggio precedente per ottenere l'interfaccia FMIMediaBuffer.

  3. Chiama Lock per ottenere il buffer dei metadati non elaborato associato a IMFMediaBuffer.

Per aggiungere l'fmiAttributes richiesto al sacchetto di attributi MFSampleExtension_CaptureMetadata , MFT0 esegue le operazioni seguenti:

  1. Chiama GetUnknown in MFSampleExtension_CaptureMetadata dall'interfaccia FMSample per ottenere l'interfaccia FMIAttributes per l'attributo bag.

  2. Chiama SetUINT32, SetBlob o SetUnknown in MF_CAPTURE_METADATA_XXX dall'interfaccia IMFAttributes ottenuta dal passaggio precedente in base al GUID e al tipo di dati specificato nella tabella precedente.

Attributi di metadati obbligatori

L'elenco completo degli attributi dei metadati disponibili è disponibile in Capture Stats Metadata Attributes (Attributi dei metadati delle statistiche di acquisizione)

Priorità dello stato attivo

L'ID della proprietà KSPROPERTY_CAMERACONTROL_EXTENDED_FOCUSPRIORITY è l'unico controllo associato alla DDI con priorità dello stato attivo.

Stato attivo

L'ID proprietà KSPROPERTY_CAMERACONTROL_EXTENDED_FOCUSSTATE è l'unico controllo associato allo stato attivo DDI.

Area estesa del ROI di interesse

Gli ID proprietà seguenti sono i controlli associati all'DDI ROI:

Conferma foto

L'ID proprietà KSPROPERTY_CAMERACONTROL_EXTENDED_PHOTOCONFIRMATION è l'unico controllo associato alla conferma foto DDI.

Sottomode della sequenza di foto

L'ID proprietà KSPROPERTY_CAMERACONTROL_EXTENDED_PHOTOMODE è l'unico controllo associato alla sequenza di foto DDI.

Codificatore EXIF e HW JPEG

La pipeline non è necessaria per elaborare o preparare qualsiasi dato EXIF per il codificatore JPEG HW; pertanto, il formato di dati EXIF viene fornito dal driver, MFT0 e codificatore JPEG OEM HW. I partner OEMs possono definire qualsiasi GUID di attributo personalizzato e tipo variant per l'attributo EXIF e collegarlo al contenitore di attributi MFSampleExtension_CaptureMetaData per usarlo dai componenti OEM. Se è disponibile un codificatore HW JPEG, il componente del sink foto della pipeline caricherà il codificatore HW JPEG e imposta i dati EXIF contenuti nel contenitore di attributi MFSampleExtension_CaptureMetaData nel codificatore HW JPEG come opzione di codificatore EXIF usando il metodo IPropertyBag2::Write .

Il contenitore delle proprietà dell'opzione codificatore contiene una matrice di strutture PROPBAG2 che specificano le proprietà dell'opzione di codifica disponibili. L'opzione del codificatore EXIF impostata sul codificatore JPEG HW è identificata dalla proprietà seguente nel contenitore delle proprietà dell'opzione codificatore:

Nome proprietà VARTYPE Valore Codec applicabili
SampleMetaData VT_UNKNOWN Puntatore a un'interfaccia FMAttributes per MFSampleExtension_CaptureMetaData contenitore di attributi che contiene un attributo secondario OEM contenente i dati EXIF. JPEG

Il contenitore di attributi MFSampleExtension_CaptureMetaData può contenere solo qualsiasi attributo secondario EXIF definito dall'OEM che il codificatore MFT0 e HW JPEG può leggere per contenere i dati EXIF. Per passare i dati EXIF dal driver al codificatore HW JPEG, il driver e MFT0 devono eseguire le operazioni seguenti:

  1. Il driver fornisce metadati EXIF personalizzati nel buffer dei metadati fornito dalla pipeline. Questo è collegato a MFSampleExtension_CaptureMetadata come MF_CAPTURE_METADATA_FRAME_RAWSTREAM FMAttribute di DevProxy quando l'esempio viene restituito a DevProxy.

  2. Quando il MFT0 riceve un fmiSample, ottiene il buffer dei metadati non elaborato da MF_CAPTURE_METADATA_FRAME_RAWSTREAM e analizza l'elemento di metadati EXIF personalizzato e lo converte in un FMAttribute definito OEM e lo collega al contenitore di attributi MFSampleExtension_CaptureMetadata .

Per passare i dati EXIF dal codificatore MFT0 al codificatore JPEG HW, il sink foto della pipeline esegue le operazioni seguenti:

  1. Chiama GetUnknown su MFSampleExtension_CaptureMetadata da FMISample per ottenere l'interfaccia FMIAttributes per la borsa degli attributi quando viene ricevuto FMSample.

  2. Chiama IPropertyBag2::Write per impostare la proprietà dell'opzione del codificatore, identificata da SampleMetadata, sul codificatore HW JPEG. La proprietà dell'opzione codificatore contiene l'interfaccia IMFAttributes ottenuta dal passaggio precedente. Questa interfaccia contiene tutti gli attributi secondari personalizzati, tra cui l'attributo secondario OEM EXIF e gli attributi secondari standardizzati nella sezione Metadati descritti in precedenza in questo argomento.

Per recuperare i dati EXIF per un'ulteriore elaborazione, il codificatore JPEG HW esegue le operazioni seguenti:

  1. Chiama IPropertyBag2::Read per recuperare il valore della proprietà per la proprietà identificata dal nome della proprietà SampleMetadata e VT_UNKNOWN tipo. Quando restituito, il VARIANT.punkVal riceve l'interfaccia FMAttributes per MFSampleExtension_CaptureMetadata.

  2. Chiama GetBlob o GetUnknown nell'attributo secondario OEM EXIF ottenuto dal passaggio precedente per ottenere il BLOB di dati EXIF in base al GUID e al tipo di dati dell'attributo secondario OEM EXIF.

Anteprima

MFT0 non è necessario per produrre alcuna anteprima per il driver della fotocamera. L'app fotocamera è prevista per generare la propria anteprima. L'anteprima può essere prodotta dall'immagine di conferma foto, dal codificatore JPEG HW o ridimensionando un'immagine a dimensioni complete. Si tratta di uno sviluppatore di app. Per mantenere la compatibilità dell'API e dell'app con le app Windows 8.1, il driver della fotocamera non deve implementare il controllo KSPROPERTY_CAMERACONTROL_EXTENDED_PHOTOTHUMBNAIL.

ISO intero

L'ID proprietà KSPROPERTY_CAMERACONTROL_EXTENDED_ISO_ADVANCED è l'unico controllo associato all'intero ISO DDI.

Stato attivo avanzato

L'ID proprietà KSPROPERTY_CAMERACONTROL_EXTENDED_FOCUSMODE è l'unico controllo associato all'intero ISO DDI.

Flash

L'ID proprietà KSPROPERTY_CAMERACONTROL_EXTENDED_FLASHMODE è l'unico controllo associato all'DDI flash.

Zoom

L'ID proprietà KSPROPERTY_CAMERACONTROL_EXTENDED_ZOOM è l'unico controllo associato allo zoom DDI.

Modalità scena

L'ID della proprietà KSPROPERTY_CAMERACONTROL_EXTENDED_SCENEMODE è l'unico controllo associato alla modalità scena DDI.