Google is committed to advancing racial equity for Black communities. See how.
Questa pagina è stata tradotta dall'API Cloud Translation.
Switch to English

telecamera

Icona di HAL della fotocamera Android

Il livello di astrazione hardware della fotocamera di Android (HAL) collega le API del framework della fotocamera di livello superiore nella fotocamera 2 al driver e all'hardware della fotocamera sottostante. Il sottosistema della telecamera include implementazioni per i componenti della pipeline della telecamera mentre l'HAL della telecamera fornisce interfacce da utilizzare nell'implementazione della versione di questi componenti.

Architettura

La figura e l'elenco seguenti descrivono i componenti HAL.

Architettura della fotocamera Android

Figura 1. Architettura della telecamera

framework dell'app
A livello di framework dell'app è presente il codice dell'app, che utilizza l'API della fotocamera 2 per interagire con l'hardware della fotocamera. Internamente, questo codice chiama le interfacce Binder corrispondenti per accedere al codice nativo che interagisce con la telecamera.
AIDL
L'interfaccia del raccoglitore associata a CameraService può essere trovata in frameworks / av / camera / aidl / android / hardware . Il codice generato chiama il codice nativo di livello inferiore per ottenere l'accesso alla telecamera fisica e restituisce i dati utilizzati per creare gli CameraDevice ed eventualmente CameraCaptureSession a livello di framework.
framework nativo
Questo framework che risiede in frameworks/av/ fornisce un equivalente nativo delle classi CameraDevice e CameraCaptureSession . Vedere anche Riferimenti a telecamera2 NDK .
binder interfaccia IPC
L'interfaccia del binder IPC facilita la comunicazione oltre i confini del processo. Esistono diverse classi di raccoglitori di fotocamere situate nella directory frameworks/av/camera/camera/aidl/android/hardware che richiamano il servizio della fotocamera. ICameraService è l'interfaccia per il servizio fotocamera; ICameraDeviceUser è l'interfaccia per uno specifico dispositivo fotocamera aperto; e ICameraServiceListener e ICameraDeviceCallbacks sono i rispettivi CameraService e CameraDevice richiami alla struttura dell'applicazione.
servizio fotocamera
Il servizio della fotocamera, situato in frameworks/av/services/camera/libcameraservice/CameraService.cpp , è il codice effettivo che interagisce con l'HAL.
HAL
Il livello di astrazione hardware definisce l'interfaccia standard in cui chiama il servizio della fotocamera e che è necessario implementare affinché l'hardware della fotocamera funzioni correttamente.

Implementazione dell'HAL

L'HAL si trova tra il driver della fotocamera e il framework Android di livello superiore e definisce un'interfaccia che è necessario implementare in modo che le app possano utilizzare correttamente l'hardware della fotocamera. Le interfacce HIDL per la telecamera HAL sono definite in hardware / interfacce / telecamera .

Un tipico HAL binderizzato deve implementare le seguenti interfacce HIDL:

Sono disponibili implementazioni HIDL di riferimento per CameraProvider.cpp , CameraDevice.cpp e CameraDeviceSession.cpp . L'implementazione include vecchi HAL che utilizzano ancora l' API legacy . A partire da Android 8.0, le implementazioni di Camera HAL devono utilizzare l'API HIDL; l'uso dell'interfaccia legacy non è supportato.

Componenti HAL legacy

Questa sezione descrive l'architettura dei componenti HAL legacy e come implementare l'HAL. Le implementazioni di HAL della fotocamera su Android 8.0 e versioni successive devono invece utilizzare l'API HIDL, descritta sopra.

Architettura (legacy)

La figura e l'elenco seguenti descrivono i componenti HAL della fotocamera legacy.

Architettura della fotocamera Android

Figura 2. Architettura della fotocamera precedente

framework dell'app
A livello di framework dell'app si trova il codice dell'app, che utilizza l'API android.hardware.Camera per interagire con l'hardware della fotocamera. Internamente, questo codice chiama una classe di colla JNI corrispondente per accedere al codice nativo che interagisce con la telecamera.
JNI
Il codice JNI associato a android.hardware.Camera si trova in frameworks/base/core/jni/android_hardware_Camera.cpp . Questo codice chiama il codice nativo di livello inferiore per ottenere l'accesso alla fotocamera fisica e restituisce i dati utilizzati per creare l'oggetto android.hardware.Camera a livello di framework.
framework nativo
Il framework nativo definito in frameworks/av/camera/Camera.cpp fornisce un equivalente nativo alla classe android.hardware.Camera . Questa classe chiama i proxy binder IPC per ottenere l'accesso al servizio della telecamera.
proxy IPC legante
I proxy binder IPC facilitano la comunicazione oltre i confini del processo. Ci sono tre classi di raccoglitori di telecamere che si trovano nella directory frameworks/av/camera che richiama il servizio della telecamera. ICameraService è l'interfaccia per il servizio della fotocamera, ICamera è l'interfaccia per uno specifico dispositivo con fotocamera aperta e ICameraClient è l'interfaccia del dispositivo per tornare al framework dell'app.
servizio fotocamera
Il servizio della fotocamera, situato in frameworks/av/services/camera/libcameraservice/CameraService.cpp , è il codice effettivo che interagisce con l'HAL.
HAL
Il livello di astrazione hardware definisce l'interfaccia standard in cui chiama il servizio della fotocamera e che è necessario implementare affinché l'hardware della fotocamera funzioni correttamente.
driver del kernel
Il driver della fotocamera interagisce con l'hardware effettivo della fotocamera e l'implementazione dell'HAL. La fotocamera e il driver devono supportare i formati di immagine YV12 e NV21 per fornire supporto per l'anteprima dell'immagine della telecamera sul display e la registrazione video.

Implementazione dell'HAL (legacy)

L'HAL si trova tra il driver della fotocamera e il framework Android di livello superiore e definisce un'interfaccia che è necessario implementare in modo che le app possano utilizzare correttamente l'hardware della fotocamera. L'interfaccia HAL è definita nei file di intestazione hardware/libhardware/include/hardware/camera.h hardware/libhardware/include/hardware/camera_common.h .

camera_common.h definisce camera_module , una struttura standard per ottenere informazioni generali sulla fotocamera, come l'ID della fotocamera e le proprietà comuni a tutte le fotocamere (ovvero, se si tratta di una fotocamera anteriore o posteriore).

camera.h contiene il codice che corrisponde a android.hardware.Camera . Questo file di intestazione dichiara una struttura camera_device che a sua volta contiene una struttura camera_device_ops con puntatori a funzioni che implementano l'interfaccia HAL. Per la documentazione sui parametri della fotocamera che gli sviluppatori possono impostare, fare riferimento a frameworks/av/include/camera/CameraParameters.h . Questi parametri sono impostati con la funzione puntata da int (*set_parameters)(struct camera_device *, const char *parms) .

Per un esempio di implementazione di HAL, fare riferimento all'implementazione per Galaxy Nexus HAL in hardware/ti/omap4xxx/camera .

Configurazione della libreria condivisa

Configura il sistema di build Android per impacchettare correttamente l'implementazione di HAL in una libreria condivisa e copiarla nella posizione appropriata creando un file Android.mk :

  1. Crea una device/<company_name>/<device_name>/camera per contenere i file di origine della libreria.
  2. Crea un file Android.mk per creare la libreria condivisa. Assicurati che il makefile contenga le seguenti righe:
    LOCAL_MODULE := camera.<device_name>
    LOCAL_MODULE_RELATIVE_PATH := hw
    

    La libreria deve essere denominata camera.<device_name> ( .so viene aggiunto automaticamente), in modo che Android possa caricare correttamente la libreria. Per un esempio, vedere il makefile per la fotocamera Galaxy Nexus che si trova in hardware/ti/omap4xxx/Android.mk .

  3. Specificare che il dispositivo dispone delle funzionalità della fotocamera copiando i file XML delle funzionalità necessari nella directory frameworks/native/data/etc con il makefile del dispositivo. Ad esempio, per specificare che il tuo dispositivo ha un flash della fotocamera e può eseguire la messa a fuoco automatica, aggiungi le seguenti righe nel makefile <device>/<company_name>/<device_name>/device.mk :
    PRODUCT_COPY_FILES := \ ...
    
    PRODUCT_COPY_FILES += \
    frameworks/native/data/etc/android.hardware.camera.flash-autofocus.xml:system/etc/permissions/android.hardware.camera.flash-autofocus.xml \
    

    Per un esempio di makefile del dispositivo, vedere device/samsung/tuna/device.mk .

  4. Dichiara il codec multimediale, il formato e le capacità di risoluzione della device/<company_name>/<device_name>/media_profiles.xml nei file XML device/<company_name>/<device_name>/media_profiles.xml e device/<company_name>/<device_name>/media_codecs.xml . Per i dettagli, vedere Esposizione di codec al framework .
  5. Aggiungi le seguenti righe nel makefile del device/<company_name>/<device_name>/device.mk per copiare i file media_profiles.xml e media_codecs.xml nella posizione appropriata:
    # media config xml file
    PRODUCT_COPY_FILES += \
        <device>/<company>/<device>/media_profiles.xml:system/etc/media_profiles.xml
    
    # media codec config xml file
    PRODUCT_COPY_FILES += \
        <device>/<company>/<device>/media_codecs.xml:system/etc/media_codecs.xml
    
  6. Per includere l'app Fotocamera nell'immagine di sistema del dispositivo, specificala nella variabile PRODUCT_PACKAGES nel dispositivo del device/<company>/<device>/device.mk makefile:
    PRODUCT_PACKAGES := \
    Gallery2 \
    ...