Migrer vers Camera2

Cette page identifie les différences entre le système de vue étendue (EVS) et Camera2. Elle explique également comment configurer votre implémentation Camera2.

Ouvrir et fermer la caméra

EVS

openCamera combine l'ouverture de l'appareil et la configuration d'un seul flux.

Camera2

Pour ouvrir et fermer un appareil avec Camera2 :

  1. Sélectionnez l'un des modes suivants :

  2. Pour configurer les flux, créez une session de capture avec les surfaces de sortie appropriées. Par exemple, à partir d'un ImageReader ou d'une SurfaceView avec CameraDevice.createCaptureSession() (Java) ou ACameraDevice_createCaptureSession() (NDK).

    Camera2 est compatible avec les flux multiples simultanés. Créez plusieurs flux pour des besoins tels que l'aperçu, l'enregistrement et le traitement d'images. Les flux servent de pipelines parallèles, qui traitent séquentiellement les trames brutes de la caméra.

  3. Pour fermer un appareil photo, utilisez CameraDevice.close() (Java) ou ACameraDevice_close() (NDK).

Considérez ces exemples d'extraits de code :

Java

CameraManager manager = (CameraManager) getSystemService(Context.CAMERA_SERVICE);
try {
    manager.openCamera(cameraId, new CameraDevice.StateCallback() {
        @Override
        public void onOpened(@NonNull CameraDevice camera) {
            // Camera opened, now create session
        }
        @Override
        public void onDisconnected(@NonNull CameraDevice camera) {}
        @Override
        public void onError(@NonNull CameraDevice camera, int error) {}
    }, handler);
} catch (CameraAccessException e) {
    // Handle exception
}

NDK

ACameraManager *cameraManager = ACameraManager_create();
ACameraDevice *cameraDevice = nullptr;
camera_status_t status = ACameraManager_openCamera(
    cameraManager, cameraId, &deviceStateCallbacks, &cameraDevice);

Diffuser les données de la caméra

Cette section explique comment diffuser des données de caméras.

EVS

Sur EVS, pour :

  1. Lancez le streaming à l'aide de startVideoStream.
  2. Pour arrêter la diffusion, utilisez stopVideoStream.

Camera2

Dans Camera2, pour :

  1. Créez un CaptureRequest adapté à l'aperçu, utilisez TEMPLATE_PREVIEW avec CameraDevice.createCaptureRequest() en Java ou ACameraDevice_createCaptureRequest() sur le NDK.

  2. Pour envoyer une requête de streaming continu, utilisez CameraCaptureSession.setSingleRepeatingRequest (Java) ou ACameraCaptureSession_setRepeatingRequestV2 (NDK).

  3. Pour arrêter le streaming, utilisez CameraCaptureSession.stopRepeating (Java) ou ACameraCaptureSession_stopRepeating (NDK).

Gestion du tampon

  • Sur EVS, setMaxFramesInFlight contrôlait auparavant le nombre de tampons, qui pouvait potentiellement être modifié en cours de flux. Lorsque le flux de caméras a démarré, EVS a fourni un ID de tampon pour chaque image, qui correspondait à la même adresse de tampon matériel en mémoire.

  • Sur Camera2, le nombre maximal d'images pour un AImageReader ou un ImageReader est défini avec AImageReader_new ou ImageReader.newInstance lorsqu'une session est initialisée. Ce paramètre ne peut pas être modifié de manière dynamique une fois la session démarrée. Pour obtenir un ID de tampon pour chaque frame, les clients peuvent conserver un mappage qui met en corrélation l'adresse du tampon matériel, obtenue à partir de l'objet Image, avec un identifiant unique.

Mettre en pause et reprendre la diffusion

  • EVS utilisé pauseVideoStream et resumeVideoStream.

  • Camera2 n'a pas d'équivalent direct. Au lieu de :

Paramètres de la caméra

  • EVS a utilisé des méthodes telles que setIntParameter pour modifier le paramètre de requête de capture de la caméra.

  • Sur Camera2, pour modifier les paramètres, appelez l'API set pour le compilateur CaptureRequest, puis envoyez-le.

Considérez ces exemples de code :

Java

CaptureRequest.Builder builder = cameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
builder.set(CaptureRequest.CONTROL_EFFECT_MODE, CaptureRequest.CONTROL_EFFECT_MODE_MONO);
// Submit this request

NDK

ACaptureRequest_setEntry_i32(captureRequest, ACAMERA_CONTROL_EFFECT_MODE, 1, &effectMode);

Caméras logiques

  • EVS : pour les caméras logiques, telles que la caméra de vision panoramique, le gestionnaire EVS ouvrait toutes les caméras physiques associées, lançait les flux vidéo et fournissait un ensemble cohérent d'images.

  • Camera2 : lorsque des fonctionnalités similaires sont nécessaires avec Camera2, les applications doivent gérer les caméras logiques, ce qui vous oblige à :

    • Identifiez les sous-caméras physiques associées à une caméra logique.
    • Ouvrez chaque caméra physique nécessaire.
    • Lancez les flux sur chaque caméra.
    • Synchronisez les images, si nécessaire. Idéalement, cette opération est gérée au niveau de la HAL pour la synchronisation matérielle.

Nous fournirons une bibliothèque de compatibilité (couche shim) aux clients EVS existants pour faciliter la transition. L'objectif est de prendre en charge les API Camera2 avec un minimum de modifications du code.

Autorisations

EVS

L'accès est limité aux identifiants uniques (UID) privilégiés. Par exemple, AID_AUTOMOTIVE_EVS. Les autorisations obsolètes incluent android.car.permission.USE_CAR_EVS_CAMERA.

Camera2

Camera2 nécessite android.permission.CAMERA. Pour les cas particuliers :

Les applications de caméras critiques pour la sécurité doivent respecter les règles Google intégrées avant l'octroi d'autorisations fournies dans Concevoir pour la conduite.

Clients principaux et secondaires

Pour l'accès partagé à la caméra :

  • EVS proposait des API explicites, setPrimaryClient et forcePrimaryClient, pour gérer le client principal, qui était autorisé à modifier les paramètres.

  • Avec Camera2, lorsque l'appareil photo est ouvert en mode partagé (Android 16 et versions ultérieures), la priorité du client accédant à l'appareil photo détermine le client principal. Le client ayant la priorité la plus élevée (généralement l'application au premier plan) peut modifier les paramètres de la requête de capture. Aucune API directe n'est utilisée pour forcer l'état principal. L'état principal est géré par le framework.

Caméras système

Pour restreindre l'accès à un appareil photo aux applications système ou propriétaires uniquement, déclarez la fonctionnalité ANDROID_REQUEST_AVAILABLE_CAPABILITIES_SYSTEM_CAMERA dans le HAL de l'appareil photo pour cet appareil. Les clients doivent disposer du rôle android.permission.SYSTEM_CAMERA en plus du rôle android.permission.CAMERA pour se connecter à cette caméra.

CarEVSManager et CarEVSService

Pour accéder à l'API, les applications Java doivent utiliser l'API android.hardware.camera2.CameraManager standard au lieu de CarEVSManager.

Pour la caméra de recul, la logique de CarEVSService qui surveille la propriété VHAL GEAR_SELECTION et lance une activité doit être migrée vers une application appartenant à l'OEM. Cette application :

  • Surveille la propriété VHAL GEAR_SELECTION.
  • Lance l'activité de la caméra de recul lorsque la marche arrière est enclenchée.
  • Utilise les API Camera2 pour afficher le flux de l'appareil photo.

Pour un affichage cohérent et non obstrué de la caméra de recul, en particulier lors des transitions utilisateur ou lorsque d'autres applications peuvent masquer l'aperçu, nous vous recommandons de suivre ces consignes lors de l'implémentation de la fonctionnalité de caméra de recul avec Camera2 :

Rendu de l'écran

Service d'affichage EVS et service d'affichage automobile.

Ces états sont obsolètes.

Camera2

Utilisez les méthodes de rendu Android standards avec Surface, android.hardware.display.DisplayManager et android.view.Display.

Pour les scénarios nécessitant un affichage précoce de la caméra, ImageReader Camera2 peut fournir un accès direct au tampon matériel afin que vous puissiez l'intégrer aux implémentations d'affichage existantes basées sur DRM pour le rendu.

Cet accès anticipé à la caméra est exclusivement autorisé pour les clients privilégiés qui disposent de AID_AUTOMOTIVE_EVS_UID et est limité aux caméras système situées à l'extérieur d'un véhicule.

HAL de l'émulateur (HAL de simulation EVS)

Nous prévoyons d'abandonner EVS Mock HAL. Les OEM doivent plutôt utiliser le HAL de l'appareil photo émulé Camera2, hardware/google/camera/devices/EmulatedCamera/, qui sera amélioré pour prendre en charge :

  • Nombre de caméras configurable.
  • Barres de couleur de test
  • Émulation de fichiers vidéo.

Pour inclure ce HAL dans la compilation :

# In device.mk
PRODUCT_SOONG_NAMESPACES += hardware/google/camera/devices/EmulatedCamera
PRODUCT_PACKAGES += com.google.emulated.camera.provider.hal

Des règles SELinux (Security-Enhanced Linux) appropriées sont également requises pour permettre à cameraserver d'interagir avec le service HAL de la caméra émulée.

HAL de la caméra V4L2 UVC

Nous prévoyons d'abandonner EVS V4L2 HAL. Utilisez la compatibilité des appareils photo externes Camera2 pour les caméras USB (UVC). Pour en savoir plus, consultez Appareils photo USB externes.

Accès anticipé à l'appareil photo

L'accès à la caméra EVS était limité aux clients privilégiés disposant de l'UID AID_AUTOMOTIVE_EVS. Pour l'accès à la caméra avant la fin du processus de démarrage d'Android, à condition que l'UID reste AID_AUTOMOTIVE_EVS. Toutefois, l'accès anticipé à la caméra est limité aux caméras système situées à l'extérieur du véhicule.

API Ultrasonics

Nous prévoyons d'abandonner les API EVS Ultrasonics. Utilisez plutôt ces propriétés VHAL introduites dans Android 15 pour les détections de capteurs à ultrasons.

Propriété Saisie Définition
ULTRASONICS_SENSOR_POSITION Statique {<x>, <y>, <z>}

En millimètres, chaque valeur représente la position du capteur le long de l'axe associé par rapport au repère de coordonnées du capteur AAOS.

ULTRASONICS_SENSOR_ORIENTATION Statique {<qw>, <qx>, <qy>, <qz>}

Il s'agit de la rotation du capteur par rapport au repère de coordonnées du capteur AAOS : $$w+xi+yj+zk$$

ULTRASONICS_SENSOR_FIELD_OF_VIEW Statique {<horizontal>, <vertical>}

Champ de vision horizontal et vertical du capteur, en degrés.

ULTRASONICS_SENSOR_DETECTION_RANGE Statique {<minimum>, <maximum>}

Plage de détection du capteur, en millimètres.

ULTRASONICS_SENSOR_DETECTION_RANGES Statique {<range_min_1>, <range_max_1>, <range_min_2>, <range_max_2>}

Tableau des plages de détection prises en charge par le capteur (en millimètres, inclus).

ULTRASONICS_SENSOR_DETECTION_RANGES Continu {<distance>, <distance_error>}

Distance mesurée par le capteur et erreur de distance, en millimètres. Si seule une plage est acceptée, il s'agit de la distance minimale de la plage détectée.