camera3_capture_result Riferimento alla struttura
#include < camera3.h >
Campi dati | |
uint32_t | numero_frame |
const camera_metadata_t * | risultato |
uint32_t | num_buffer_di_output |
const camera3_stream_buffer_t * | output_buffer |
const camera3_stream_buffer_t * | input_buffer |
uint32_t | risultato_parziale |
Descrizione dettagliata
camera3_capture_result_t:
Il risultato di una singola acquisizione/rielaborazione da parte del dispositivo HAL della fotocamera. Questo 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(). Più chiamate process_capture_result() possono essere eseguite dall'HAL per ciascuna richiesta.
Ogni chiamata, tutte con lo stesso numero di frame, può contenere qualche sottoinsieme dei buffer di output e/o i metadati dei risultati. I metadati possono essere forniti una sola volta per un determinato numero di fotogramma; tutte le altre chiamate devono impostare i metadati del risultato su NULL.
La struttura dei risultati contiene i metadati di output di questa acquisizione e l'insieme di buffer di output che sono stati/saranno riempiti per questa acquisizione. Ogni buffer di output può essere dotato di un recinto di sincronizzazione del rilascio che il framework attenderà prima di leggere, nel caso in cui il buffer non sia stato ancora riempito dall'HAL.
>= CAMERA_DEVICE_API_VERSION_3_2:
I metadati possono essere forniti più volte per un singolo numero di fotogramma. Il quadro accumulerà insieme il set di risultati finali combinando insieme ciascun risultato parziale nel set di risultati totale.
Se in una richiesta viene fornito un buffer di input, l'HAL deve restituirlo in una delle chiamate process_capture_result e la chiamata potrebbe consistere nel restituire semplicemente 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:
Anche le applicazioni riceveranno immediatamente questi risultati parziali, quindi l'invio di risultati parziali è un'ottimizzazione delle prestazioni altamente consigliata per evitare la latenza totale della pipeline prima di inviare i risultati per ciò che è noto molto presto nella pipeline.
Un caso d'uso tipico potrebbe essere il calcolo dello stato AF a metà della pipeline; rimandando immediatamente lo stato al framework, otteniamo un aumento del 50% delle prestazioni e della reattività percepita dell'autofocus.
Documentazione sul campo
uint32_t numero_frame |
Il numero di frame è un numero intero incrementale 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 del flusso di input per questa acquisizione. Potrebbe non essere ancora stato utilizzato nel momento in cui l'HAL chiama process_capture_result(); il framework attenderà i limiti di sincronizzazione del rilascio forniti dall'HAL prima di riutilizzare il buffer.
L'HAL dovrebbe 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 dovrebbe essere restituito il prima possibile. Se l'HAL supporta i limiti di sincronizzazione, può chiamare process_capture_result per restituirlo con i limiti di sincronizzazione impostati in modo appropriato. Se i limiti di sincronizzazione non sono supportati, il buffer può essere restituito solo quando viene utilizzato, il che potrebbe richiedere molto tempo; l'HAL può scegliere di copiare questo buffer di input per far sì che il buffer ritorni prima.
uint32_t num_output_buffer |
Il numero di buffer di output restituiti in questa struttura di risultati. Deve essere inferiore o uguale al conteggio della richiesta di acquisizione corrispondente. Se questo è inferiore al conteggio del buffer nella richiesta di acquisizione, è necessario effettuare almeno un'altra chiamata a process_capture_result con lo stesso frame_number per restituire i buffer di output rimanenti al framework. Può essere zero solo se la struttura include metadati di risultati validi o se in questo risultato viene restituito un buffer di input.
const camera3_stream_buffer_t * output_buffers |
Gli handle per i buffer del flusso di output per questa acquisizione. Potrebbero non essere ancora compilati nel momento in cui l'HAL chiama process_capture_result(); il framework attenderà i limiti di sincronizzazione del rilascio forniti dall'HAL prima di leggere i buffer.
L'HAL deve impostare il limite di sincronizzazione del rilascio del buffer del flusso su un sync fd 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 è riempito, il campo di stato del buffer deve essere impostato su CAMERA3_BUFFER_STATUS_ERROR. Se l'HAL non ha atteso il recinto di acquisizione prima di riscontrare l'errore, il recinto di acquisizione dovrebbe essere copiato nel recinto di rilascio, per consentire al framework di attendere sul recinto prima di riutilizzare il buffer.
Il recinto di acquisizione deve essere impostato su -1 per tutti i buffer di output. Se num_output_buffers è zero, potrebbe essere NULL. In tal caso, l'HAL deve effettuare almeno un'altra chiamata 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 quel flusso corrispondente devono essere già stati consegnati (le recinzioni non devono essere ancora state segnalate).
>= CAMERA_DEVICE_API_VERSION_3_2:
I buffer Gralloc per un frame possono essere inviati al framework prima della corrispondente notifica SHUTTER.
Considerazioni sulle prestazioni:
I buffer consegnati al framework non verranno inviati al livello di applicazione finché non viene ricevuto un timestamp di inizio esposizione tramite una chiamata SHUTTER notify(). Si consiglia vivamente di inviare la chiamata il prima possibile.
uint32_t risultato_parziale |
>= 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 ciascun frame.
Ogni nuovo risultato di acquisizione con un risultato parziale deve impostare questo campo (partial_result) su un valore inclusivo distinto compreso tra 1 e android.request.partialResultCount.
Gli HAL che non desiderano sfruttare questa funzionalità non devono impostare android.request.partialResultCount o partial_result su un valore diverso da 1.
Questo valore deve essere impostato su 0 quando un risultato di acquisizione contiene solo buffer e nessun metadato.
const camera_metadata_t * risultato |
I metadati dei risultati 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à statistiche abilitate.
Solo una chiamata a process_capture_result() con un dato frame_number può includere i metadati del risultato. Tutte le altre chiamate per lo stesso frame_number devono impostarlo su NULL.
Se si è verificato un errore durante la produzione 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 dato frame_number possono includere i metadati del risultato.
I metadati parziali inviati non devono includere alcuna chiave di metadati restituita in un risultato parziale precedente per un determinato fotogramma. Ogni nuovo risultato parziale per quel frame deve anche impostare un valore partial_result distinto.
Se la notifica è stata chiamata con ERROR_RESULT, tutti gli ulteriori risultati parziali per quel frame vengono ignorati dal framework.
La documentazione per questa struttura è stata generata dal seguente file:
- hardware/libhardware/include/hardware/ camera3.h