Riferimento alla struttura camera3_capture_result
#include <
camera3.h
>
Campi dati |
|
uint32_t | frame_number |
const camera_metadata_t * | result |
uint32_t | num_output_buffers |
const camera3_stream_buffer_t * | output_buffers |
const camera3_stream_buffer_t * | input_buffer |
uint32_t | partial_result |
Descrizione dettagliata
camera3_capture_result_t:
Il risultato di una singola acquisizione/rielaborazione da parte del dispositivo HAL della fotocamera. Viene inviato al framework in modo asincrono con process_capture_result(), in risposta a una singola richiesta di acquisizione inviata all'HAL con process_capture_request(). L'HAL può eseguire più chiamate a process_capture_result() per ogni richiesta.
Ogni chiamata, con lo stesso numero di frame, può contenere un sottoinsieme dei buffer di output e/o i metadati del risultato. I metadati possono essere forniti una sola volta per un determinato numero di frame; tutte le altre chiamate devono impostare i metadati del risultato su NULL.
La struttura del risultato contiene i metadati di output di questa acquisizione e l'insieme di buffer di output che sono stati/verranno riempiti per questa acquisizione. Ogni buffer di output può essere associato a una barriera di sincronizzazione di rilascio che il framework attenderà prima di leggere, nel caso in cui il buffer non sia ancora stato riempito dall'HAL.
>= CAMERA_DEVICE_API_VERSION_3_2:
I metadati possono essere forniti più volte per un singolo numero di frame. Il framework accumulerà l'insieme di risultati finali combinando ogni risultato parziale nell'insieme di risultati totale.
Se in una richiesta viene specificato un buffer di input, l'HAL deve restituirlo in una delle chiamate process_capture_result e la chiamata può essere solo per restituire il buffer di input, senza metadati e buffer di output; le barriere di sincronizzazione devono essere gestite nello stesso modo in cui vengono gestite per i buffer di output.
Considerazioni sulle prestazioni:
Le applicazioni riceveranno anche immediatamente questi risultati parziali, pertanto l'invio di risultati parziali è un'ottimizzazione delle prestazioni altamente consigliata per evitare la latenza totale della pipeline prima di inviare i risultati di ciò che è noto molto presto nella pipeline.
Un caso d'uso tipico potrebbe essere il calcolo dello stato dell'AF a metà della pipeline; inviando immediatamente lo stato al framework, otteniamo un aumento del 50% del rendimento e della reattività percepita dell'autofocus.
Documentazione dei campi
uint32_t frame_number |
Il numero di frame è un numero intero crescente impostato dal framework nella richiesta inviata per identificare in modo univoco questa acquisizione. Viene utilizzato anche per identificare la richiesta nelle notifiche asincrone inviate a camera3_callback_ops_t.notify() .
const camera3_stream_buffer_t * input_buffer |
>= CAMERA_DEVICE_API_VERSION_3_2:
L'handle per il buffer dello stream di input per questa acquisizione. Potrebbe non essere ancora stato utilizzato al momento in cui l'HAL chiama process_capture_result(); il framework attenderà le barriere di sincronizzazione di rilascio fornite dall'HAL prima di riutilizzare il buffer.
L'HAL deve gestire le barriere di sincronizzazione nello stesso modo in cui vengono gestite per output_buffers.
È consentito inviare un solo buffer di input per richiesta. Analogamente ai buffer di output, l'ordine dei buffer di input restituiti deve essere mantenuto dall'HAL.
Considerazioni sulle prestazioni:
Il buffer di input deve essere restituito il prima possibile. Se l'HAL supporta le barriere di sincronizzazione, può chiamare process_capture_result per restituirla con le barriere di sincronizzazione impostate in modo appropriato. Se le barriere di sincronizzazione non sono supportate, il buffer può essere restituito solo quando viene consumato, il che potrebbe richiedere molto tempo. L'HAL potrebbe scegliere di copiare questo buffer di input per restituirlo prima.
uint32_t num_output_buffers |
Il numero di buffer di output restituiti in questa struttura del risultato. Deve essere inferiore o uguale al conteggio della richiesta di acquisizione corrispondente. Se questo valore è inferiore al conteggio dei buffer nella richiesta di acquisizione, è necessario effettuare almeno un'altra chiamata a process_capture_result con lo stesso frame_number per restituire al framework i buffer di output rimanenti. Questo valore può essere pari a zero solo se la struttura include metadati del risultato validi o se in questo risultato viene restituito un buffer di input.
const camera3_stream_buffer_t * output_buffers |
Gli handle per i buffer dello stream di output per questa acquisizione. Potrebbero non essere ancora stati compilati al momento in cui l'HAL chiama process_capture_result(); il framework attenderà le barriere di sincronizzazione di rilascio fornite dall'HAL prima di leggere i buffer.
L'HAL deve impostare la barriera di sincronizzazione di rilascio del buffer dello stream su un fd di sincronizzazione valido o su -1 se il buffer è già stato riempito.
Se l'HAL rileva un errore durante l'elaborazione del buffer e il buffer non è compilato, il campo dello stato del buffer deve essere impostato su CAMERA3_BUFFER_STATUS_ERROR. Se l'HAL non ha aspettato la barriera di acquisizione prima di rilevare l'errore, la barriera di acquisizione deve essere copiata nella barriera di rilascio per consentire al framework di attendere la barriera prima di riutilizzare il buffer.
La recinzione di acquisizione deve essere impostata su -1 per tutti i buffer di output. Se num_output_buffers è zero, può essere NULL. In questo caso, l'HAL deve effettuare almeno un'altra chiamata a process_capture_result per fornire i buffer di output.
Quando process_capture_result viene chiamato con un nuovo buffer per un frame, tutti i buffer dei frame precedenti per lo stream corrispondente devono essere già stati inviati (non è necessario che i recinti siano stati ancora segnalati).
>= CAMERA_DEVICE_API_VERSION_3_2:
I buffer Gralloc per un frame possono essere inviati al framework prima dell'istruzione SHUTTER-notify corrispondente.
Considerazioni sulle prestazioni:
I buffer inviati al framework non verranno inviati al livello di applicazione finché non verrà ricevuto un timestamp di inizio esposizione tramite una chiamata notify() di SHUTTER. Ti consigliamo vivamente di inviare la chiamata il prima possibile.
uint32_t partial_result |
>= CAMERA_DEVICE_API_VERSION_3_2:
Per sfruttare i risultati parziali, l'HAL deve impostare i metadati statici android.request.partialResultCount sul numero di risultati parziali che invierà per ogni frame.
Ogni nuovo risultato di acquisizione con un risultato parziale deve impostare questo campo (partial_result) su un valore compreso tra 1 e android.request.partialResultCount.
Gli HAL che non vogliono usufruire di questa funzionalità non devono impostare un valore diverso da 1 per android.request.partialResultCount o partial_result.
Questo valore deve essere impostato su 0 quando un risultato di acquisizione contiene solo buffer e nessun metadato.
const camera_metadata_t * result |
I metadati del risultato per questa acquisizione. Contiene informazioni sui parametri di acquisizione finali, sullo stato dell'hardware di acquisizione e post-elaborazione, sullo stato degli algoritmi 3A, se abilitati, e sull'output di eventuali unità di statistiche abilitate.
Solo una chiamata a process_capture_result() con un determinato frame_number può includere i metadati del risultato. Per tutte le altre chiamate con lo stesso frame_number, questo valore deve essere impostato su NULL.
Se si è verificato un errore durante la generazione dei metadati del risultato, il risultato deve essere un buffer di metadati vuoto e notify() deve essere chiamato con ERROR_RESULT.
>= CAMERA_DEVICE_API_VERSION_3_2:
Più chiamate a process_capture_result() con un determinato frame_number possono includere i metadati del risultato.
I metadati parziali inviati non devono includere alcuna chiave dei metadati restituita in un risultato parziale precedente per un determinato frame. Ogni nuovo risultato parziale per quel frame deve anche impostare un valore partial_result distinto.
Se notify è stato chiamato con ERROR_RESULT, tutti gli altri risultati parziali per quel frame vengono ignorati dal framework.
La documentazione di questa struttura è stata generata dal seguente file:
- hardware/libhardware/include/hardware/ camera3.h