Google si impegna a promuovere l'equità razziale per le comunità nere. Vedi come.
Questa pagina è stata tradotta dall'API Cloud Translation.
Switch to English

telecamera

Icona HAL della fotocamera Android

Il livello di astrazione hardware della fotocamera (HAL) di Android collega le API del framework della fotocamera di livello superiore in Camera 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 per l'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 è il codice dell'app, che utilizza l'API Camera 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 videocamera.
AIDL
L'interfaccia del raccoglitore associata a CameraService è disponibile in framework / av / camera / aidl / android / hardware . Il codice generato chiama il codice nativo di livello inferiore per ottenere l'accesso alla videocamera fisica e restituisce i dati utilizzati per creare gli CameraDevice e infine CameraCaptureSession a livello di framework.
quadro nativo
Questo framework residente in frameworks/av/ fornisce un equivalente nativo alle classi CameraDevice e CameraCaptureSession . Vedi anche riferimento NDK camera2 .
interfaccia IPC del raccoglitore
L'interfaccia del raccoglitore IPC facilita la comunicazione oltre i limiti del processo. Esistono diverse classi di raccoglitori di telecamere situate nella directory frameworks/av/camera/camera/aidl/android/hardware che chiamano in servizio telecamera. ICameraService è l'interfaccia per il servizio fotocamera; ICameraDeviceUser è l'interfaccia per uno specifico dispositivo aperto della fotocamera; e ICameraServiceListener e ICameraDeviceCallbacks sono i rispettivi CameraService e CameraDevice richiami alla struttura dell'applicazione.
servizio di telecamere
Il servizio videocamera, 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 che il servizio videocamera chiama e che è necessario implementare per far funzionare correttamente l'hardware della videocamera.

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 far funzionare correttamente l'hardware della fotocamera. Le interfacce HIDL per la videocamera HAL sono definite in hardware / interfacce / videocamera .

Un tipico HAL binderizzato deve implementare le seguenti interfacce HIDL:

Le implementazioni HIDL di riferimento sono disponibili 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 Camera HAL su Android 8.0 e versioni successive devono invece utilizzare l'API HIDL, descritta sopra.

Architecture (legacy)

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

Architettura della fotocamera Android

Figura 2. Architettura della fotocamera legacy

framework dell'app
A livello di framework dell'app è il codice dell'app, che utilizza l'API android.hardware.Camera per interagire con l'hardware della telecamera. Internamente, questo codice chiama una classe di colla JNI corrispondente per accedere al codice nativo che interagisce con la fotocamera.
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 telecamera fisica e restituisce i dati utilizzati per creare l'oggetto android.hardware.Camera a livello di framework.
quadro 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 del raccoglitore IPC per ottenere l'accesso al servizio videocamera.
proxy IPC leganti
I proxy del raccoglitore IPC facilitano la comunicazione oltre i limiti del processo. Esistono tre classi di raccoglitori per videocamera che si trovano nella directory frameworks/av/camera che chiama il servizio videocamera. ICameraService è l'interfaccia per il servizio della fotocamera, ICamera è l'interfaccia per uno specifico dispositivo aperto della fotocamera e ICameraClient è l'interfaccia del dispositivo al framework dell'app.
servizio di telecamere
Il servizio videocamera, 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 che il servizio videocamera chiama e che è necessario implementare per far funzionare correttamente l'hardware della videocamera.
driver del kernel
Il driver della videocamera interagisce con l'hardware effettivo della videocamera e l'implementazione dell'HAL. La fotocamera e il driver devono supportare i formati 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 far funzionare correttamente l'hardware della fotocamera. L'interfaccia HAL è definita nei file di intestazione hardware/libhardware/include/hardware/camera.h e hardware/libhardware/include/hardware/camera_common.h .

camera_common.h definisce camera_module , una struttura standard per ottenere informazioni generali sulla telecamera, come l'ID della telecamera e le proprietà comuni a tutte le telecamere (ovvero, che si tratti di una fotocamera frontale o posteriore).

camera.h contiene il codice corrispondente 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 telecamera che gli sviluppatori possono impostare, consultare 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 un'implementazione HAL, consultare l'implementazione per Galaxy Nexus HAL in hardware/ti/omap4xxx/camera .

Configurazione della libreria condivisa

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

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

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

  3. Specificare che il dispositivo dispone delle funzioni della fotocamera copiando i file XML della funzione necessari nella directory frameworks/native/data/etc con il makefile del dispositivo. Ad esempio, per specificare che il dispositivo ha un flash della fotocamera e può eseguire la messa a fuoco automatica, aggiungere 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 di un dispositivo, consultare device/samsung/tuna/device.mk .

  4. Dichiarare 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, consultare Esposizione dei codec al framework .
  5. Aggiungere le seguenti righe nel device/<company_name>/<device_name>/device.mk del dispositivo 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 tuo dispositivo, specificala nella variabile PRODUCT_PACKAGES nel makefile device/<company>/<device>/device.mk :
    PRODUCT_PACKAGES := \
    Gallery2 \
    ...