O Google está comprometido em promover a equidade racial para as comunidades negras. Veja como.
Esta página foi traduzida pela API Cloud Translation.
Switch to English

Câmera

Câmera Android HAL ícone

A camada de abstração de hardware de câmera (HAL) da câmera do Android conecta as APIs da estrutura de câmera de nível superior da Câmera 2 ao driver e hardware subjacentes da câmera. O subsistema de câmera inclui implementações para componentes de pipeline de câmera, enquanto o HAL da câmera fornece interfaces para uso na implementação de sua versão desses componentes.

Arquitetura

A figura e lista a seguir descrevem os componentes HAL.

Arquitetura da câmera Android

Figura 1. Arquitetura da câmera

estrutura do aplicativo
No nível da estrutura do aplicativo, está o código do aplicativo, que usa a API da câmera 2 para interagir com o hardware da câmera. Internamente, esse código chama as interfaces correspondentes do Binder para acessar o código nativo que interage com a câmera.
AIDL
A interface do fichário associada ao CameraService pode ser encontrada em frameworks / av / camera / aidl / android / hardware . O código gerado chama o código nativo de nível inferior para obter acesso à câmera física e retorna dados usados ​​para criar os CameraDevice e, eventualmente, CameraCaptureSession no nível da estrutura.
estrutura nativa
Esta residência quadro em frameworks/av/ fornece um equivalente nativo das CameraDevice e CameraCaptureSession classes. Veja também a referência da câmera NDK2 .
interface IPC do fichário
A interface do fichário do IPC facilita a comunicação através dos limites do processo. Existem várias classes de fichários de câmeras localizadas no diretório frameworks/av/camera/camera/aidl/android/hardware que chamam o serviço de câmera. ICameraService é a interface para o serviço de câmera; ICameraDeviceUser é a interface para um dispositivo de câmera aberto específico; e ICameraServiceListener e ICameraDeviceCallbacks são os respectivos CameraService e CameraDevice chamadas de retorno para a estrutura do aplicativo.
serviço de câmera
O serviço de câmera, localizado em frameworks/av/services/camera/libcameraservice/CameraService.cpp , é o código real que interage com o HAL.
HAL
A camada de abstração de hardware define a interface padrão para a qual o serviço da câmera chama e que você deve implementar para que o hardware da câmera funcione corretamente.

Implementando o HAL

O HAL fica entre o driver da câmera e a estrutura Android de nível superior e define uma interface que você deve implementar para que os aplicativos possam operar corretamente o hardware da câmera. As interfaces HIDL para o HAL da câmera são definidas em hardware / interfaces / câmera .

Um HAL encadernado típico deve implementar as seguintes interfaces HIDL:

As implementações de referência do HIDL estão disponíveis para CameraProvider.cpp , CameraDevice.cpp e CameraDeviceSession.cpp . A implementação envolve HALs antigos que ainda usam a API herdada . A partir do Android 8.0, as implementações do Camera HAL devem usar a API HIDL; o uso da interface herdada não é suportado.

Componentes HAL herdados

Esta seção descreve a arquitetura dos componentes HAL herdados e como implementar o HAL. As implementações de câmera HAL no Android 8.0 e superior devem usar a API HIDL, descrita acima.

Arquitetura (herdada)

A figura e lista a seguir descrevem os componentes HAL da câmera herdada.

Arquitetura da câmera Android

Figura 2. Arquitetura da câmera herdada

estrutura do aplicativo
No nível da estrutura do aplicativo, está o código do aplicativo, que usa a API android.hardware.Camera para interagir com o hardware da câmera. Internamente, esse código chama uma classe de cola JNI correspondente para acessar o código nativo que interage com a câmera.
JNI
O código JNI associado ao android.hardware.Camera está localizado em frameworks/base/core/jni/android_hardware_Camera.cpp . Esse código chama o código nativo de nível inferior para obter acesso à câmera física e retorna dados usados ​​para criar o objeto android.hardware.Camera no nível da estrutura.
estrutura nativa
A estrutura nativa definida em frameworks/av/camera/Camera.cpp fornece um equivalente nativo à classe android.hardware.Camera . Essa classe chama os proxies do fichário do IPC para obter acesso ao serviço da câmera.
proxies IPC do fichário
Os proxies do fichário do IPC facilitam a comunicação através dos limites do processo. Existem três classes de fichários de câmera que estão localizadas no diretório frameworks/av/camera que chama o serviço de câmera. ICameraService é a interface para o serviço de câmera, ICamera é a interface para um dispositivo de câmera aberto específico e ICameraClient é a interface do dispositivo de volta à estrutura do aplicativo.
serviço de câmera
O serviço de câmera, localizado em frameworks/av/services/camera/libcameraservice/CameraService.cpp , é o código real que interage com o HAL.
HAL
A camada de abstração de hardware define a interface padrão para a qual o serviço da câmera chama e que você deve implementar para que o hardware da câmera funcione corretamente.
driver do kernel
O driver da câmera interage com o hardware real da câmera e sua implementação do HAL. A câmera e o driver devem suportar os formatos de imagem YV12 e NV21 para fornecer suporte para a visualização da imagem da câmera no visor e na gravação de vídeo.

Implementando o HAL (legado)

O HAL fica entre o driver da câmera e a estrutura Android de nível superior e define uma interface que você deve implementar para que os aplicativos possam operar corretamente o hardware da câmera. A interface HAL é definida nos arquivos de cabeçalho hardware/libhardware/include/hardware/camera.h hardware/libhardware/include/hardware/camera_common.h .

camera_common.h define camera_module , uma estrutura padrão para obter informações gerais sobre a câmera, como o ID da câmera e as propriedades comuns a todas as câmeras (ou seja, se é uma câmera frontal ou traseira).

camera.h contém um código que corresponde a android.hardware.Camera . Esse arquivo de cabeçalho declara uma estrutura camera_device que, por sua vez, contém uma estrutura camera_device_ops com ponteiros para funções que implementam a interface HAL. Para obter documentação sobre os parâmetros da câmera que os desenvolvedores podem definir, consulte frameworks/av/include/camera/CameraParameters.h . Esses parâmetros são definidos com a função apontada por int (*set_parameters)(struct camera_device *, const char *parms) no HAL.

Para um exemplo de implementação do HAL, consulte a implementação do Galaxy Nexus HAL em hardware/ti/omap4xxx/camera .

Configurando a Biblioteca Compartilhada

Configure o sistema de compilação Android para empacotar corretamente a implementação HAL em uma biblioteca compartilhada e copiá-la para o local apropriado, criando um arquivo Android.mk :

  1. Crie um device/<company_name>/<device_name>/camera para conter os arquivos de origem da sua biblioteca.
  2. Crie um arquivo Android.mk para criar a biblioteca compartilhada. Verifique se o makefile contém as seguintes linhas:
    LOCAL_MODULE := camera.<device_name>
    LOCAL_MODULE_RELATIVE_PATH := hw
    

    Sua biblioteca deve ser nomeada camera.<device_name> ( .so é anexada automaticamente), para que o Android possa carregar corretamente a biblioteca. Por exemplo, consulte o makefile da câmera Galaxy Nexus localizado em hardware/ti/omap4xxx/Android.mk .

  3. Especifique o seu dispositivo com recursos de câmera, copiando os arquivos XML de recursos necessários no diretório frameworks/native/data/etc com o makefile do seu dispositivo. Por exemplo, para especificar que o dispositivo possui um flash da câmera e pode focar automaticamente, adicione as seguintes linhas no makefile <device>/<company_name>/<device_name>/device.mk makefile:
    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 \
    

    Para um exemplo de um makefile de dispositivo, consulte device/samsung/tuna/device.mk .

  4. Declare os recursos de codec, formato e resolução de mídia de sua câmera nos arquivos XML device/<company_name>/<device_name>/media_profiles.xml e device/<company_name>/<device_name>/media_codecs.xml . Para obter detalhes, consulte Expondo codecs à estrutura .
  5. Adicione as seguintes linhas no do seu dispositivo device/<company_name>/<device_name>/device.mk makefile para copiar os media_profiles.xml e media_codecs.xml arquivos para o local apropriado:
    # 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. Para incluir o aplicativo Câmera na imagem do sistema do seu dispositivo, especifique-o na variável PRODUCT_PACKAGES no device/<company>/<device>/device.mk do device/<company>/<device>/device.mk :
    PRODUCT_PACKAGES := \
    Gallery2 \
    ...