Flux de sortie, recadrage et zoom

Flux de sortie

Le sous-système de caméras fonctionne uniquement sur le pipeline basé sur ANativeWindow pour toutes les résolutions et tous les formats de sortie. Plusieurs flux peuvent être configurés en même temps pour envoyer un seul frame à plusieurs cibles telles que le GPU, l'encodeur vidéo, RenderScript ou les tampons visibles par l'application (tampons RAW Bayer, tampons YUV traités ou tampons encodés au format JPEG).

Pour optimiser le processus, ces flux de sortie doivent être configurés à l'avance et seul un nombre limité peut exister à la fois. Cela permet la pré-allocation des tampons de mémoire et la configuration du matériel de la caméra, de sorte que lorsque des requêtes sont envoyées avec plusieurs pipelines de sortie différents, il n'y ait pas de retard ni de latence dans le traitement de la requête.

Pour en savoir plus sur les combinaisons de flux de sortie garanties qui dépendent du niveau matériel compatible, consultez createCaptureSession().

Recadrage

Le recadrage de l'ensemble du tableau de pixels (pour le zoom numérique et d'autres cas d'utilisation où un champ de vision plus petit est souhaitable) est communiqué via le paramètre ANDROID_SCALER_CROP_REGION. Il s'agit d'un paramètre par requête, qui peut changer pour chaque requête. C'est essentiel pour implémenter un zoom numérique fluide.

La région est définie comme un rectangle (x, y, largeur, hauteur), avec (x, y) décrivant l'angle supérieur gauche du rectangle. Le rectangle est défini sur le système de coordonnées du tableau de pixels actifs du capteur, (0,0) étant le pixel en haut à gauche du tableau de pixels actifs. Par conséquent, la largeur et la hauteur ne peuvent pas être supérieures aux dimensions indiquées dans le champ d'informations statiques ANDROID_SENSOR_ACTIVE_PIXEL_ARRAY. La largeur et la hauteur minimales autorisées sont signalées par le HAL via le champ d'informations statiques ANDROID_SCALER_MAX_DIGITAL_ZOOM, qui décrit le facteur de zoom maximal accepté. Par conséquent, la largeur et la hauteur minimales de la zone de recadrage sont les suivantes :

  {width, height} =
   { floor(ANDROID_SENSOR_ACTIVE_PIXEL_ARRAY[0] /
       ANDROID_SCALER_MAX_DIGITAL_ZOOM),
     floor(ANDROID_SENSOR_ACTIVE_PIXEL_ARRAY[1] /
       ANDROID_SCALER_MAX_DIGITAL_ZOOM) }

Si la région de recadrage doit répondre à des exigences spécifiques (par exemple, elle doit commencer par des coordonnées paires et sa largeur/hauteur doit être paire), la HAL doit effectuer l'arrondi nécessaire et écrire la région de recadrage finale utilisée dans les métadonnées du résultat de sortie. De même, si la HAL implémente la stabilisation vidéo, elle doit ajuster la région de recadrage du résultat pour décrire la région réellement incluse dans la sortie après l'application de la stabilisation vidéo. En général, une application utilisant l'appareil photo doit être en mesure de déterminer le champ de vision qu'elle reçoit en fonction de la région de recadrage, des dimensions du capteur d'image et de la distance focale de l'objectif.

Étant donné que la région de recadrage s'applique à tous les flux, qui peuvent avoir des formats différents de la région de recadrage, la région du capteur exacte utilisée pour chaque flux peut être plus petite que la région de recadrage. Plus précisément, chaque flux doit conserver des pixels carrés et son format en recadrant au minimum la région de recadrage définie. Si le format du flux est plus large que la zone de recadrage, le flux doit être recadré davantage verticalement. Si le format du flux est plus étroit que la zone de recadrage, le flux doit être recadré davantage horizontalement.

Dans tous les cas, le recadrage du flux doit être centré dans la région de recadrage complète. De plus, chaque flux n'est recadré que horizontalement ou verticalement par rapport à la région de recadrage complète, jamais les deux.

Par exemple, si deux flux sont définis, un flux 640 x 480 (format 4:3) et un flux 1 280 x 720 (format 16:9), les régions de sortie attendues pour chaque flux pour quelques exemples de régions de recadrage sont illustrées ci-dessous, sur un capteur hypothétique de 3 MP (matrice de 2 000 x 1 500 pixels).

Région de recadrage : (500, 375, 1000, 750) (format 4:3)
Recadrage du flux 640 x 480 : (500, 375, 1000, 750) (identique à la région de recadrage)
Recadrage du flux 1 280 x 720 : (500, 469, 1000, 562)

crop-region-43-ratio

Figure 1 : Format 4:3

Région de recadrage : (500, 375, 1333, 750) (format 16:9)
Recadrage du flux 640 x 480 : (666, 375, 1000, 750)
Recadrage du flux 1 280 x 720 : (500, 375, 1333, 750) (identique à la région de recadrage)

crop-region-169-ratio

Figure 2. Format 16:9

Région de recadrage : (500, 375, 750, 750) (format 1:1)
Recadrage du flux 640 x 480 : (500, 469, 750, 562)
Recadrage du flux 1 280 x 720 : (500, 543, 750, 414)

crop-region-11-ratio

Figure 3. Format 1:1

Dernier exemple : un flux au format carré 1 024 x 1 024 au lieu du flux 480p :
Région de recadrage : (500, 375, 1 000, 750) (format 4:3)
Recadrage du flux 1 024 x 1 024 : (625, 375, 750, 750)
Recadrage du flux 1 280 x 720 : (500, 469, 1 000, 562)

crop-region-43-square-ratio

Figure 4. Format 4:3, carré

Retraitement

La prise en charge des fichiers image bruts est assurée par la prise en charge du retraitement des données RAW Bayer. Cette prise en charge permet au pipeline de l'appareil photo de traiter un tampon RAW et des métadonnées précédemment capturés (une image entière enregistrée précédemment) pour produire une nouvelle sortie YUV ou JPEG rendue.

Zoom

Pour les appareils équipés d'Android 11 ou version ultérieure, une application peut utiliser le zoom (numérique et optique) d'une caméra via le paramètre ANDROID_CONTROL_ZOOM_RATIO.

Le ratio de zoom est défini comme un facteur à virgule flottante. Au lieu d'utiliser ANDROID_SCALER_CROP_REGION pour le recadrage et le zoom, une application peut utiliser ANDROID_CONTROL_ZOOM_RATIO pour contrôler le niveau de zoom et ANDROID_SCALER_CROP_REGION pour le recadrage horizontal et vertical afin d'obtenir des formats différents de celui du capteur de caméra natif.

Un système multicaméra peut contenir plusieurs objectifs avec des focales différentes. L'utilisateur peut utiliser le zoom optique en passant d'un objectif à l'autre. L'utilisation de ANDROID_CONTROL_ZOOM_RATIO présente des avantages dans les scénarios ci-dessous :

  • Zoomer d'un objectif grand-angle à un téléobjectif : un ratio à virgule flottante offre une meilleure précision par rapport aux valeurs entières de ANDROID_SCALER_CROP_REGION.
  • Effectuer un zoom arrière d'un objectif grand angle à un objectif ultra grand angle : ANDROID_CONTROL_ZOOM_RATIO prend en charge le zoom arrière (<1.0f), contrairement à ANDROID_SCALER_CROP_REGION.

Pour illustrer cela, voici plusieurs scénarios avec différents rapports de zoom, régions de recadrage et flux de sortie, en utilisant la même caméra hypothétique définie dans la section précédente.

Rapport de zoom : 2,0 ; 1/4 du champ de vision d'origine
Région de recadrage : (0, 0, 2000, 1500) (format 4:3)
Recadrage du flux 640 x 480 : (0, 0, 2000, 1500) (égal à la région de recadrage)
Recadrage du flux 1 280 x 720 : (0, 187, 2000, 1125)

zoom-ratio-2-crop-43

Figure 5. Zoom x2, format 4:3

Ratio de zoom : 2,0 ; 1/4 du champ de vision d'origine
Région de recadrage : (0, 187, 2000, 1125) (format 16:9)
Recadrage du flux 640x480 : (250, 187, 1500, 1125) (avec bandes noires verticales)
Recadrage du flux 1280x720 : (0, 187, 2000, 1125) (égal à la région de recadrage)

zoom-ratio-2-crop-169

Figure 6. Zoom 2.0, format 16:9

Ratio de zoom : 0,5 ; 4x du champ de vision d'origine (passage de l'objectif grand angle à l'objectif ultra grand angle)
Région de recadrage : (250, 0, 1500, 1500) (format 1:1)
Recadrage du flux 640 x 480 : (250, 187, 1500, 1125) (letterbox)
Recadrage du flux 1 280 x 720 : (250, 328, 1500, 844) (letterbox)

images/zoom-ratio-0.5-crop-11

Figure 7. Zoom 0,5, format 1:1

Comme le montrent les graphiques ci-dessus, le système de coordonnées de la région de recadrage passe au champ de vision effectif après zoom et est représenté par le rectangle aux dimensions suivantes : (0, 0, activeArrayWith, activeArrayHeight). Il en va de même pour les régions AE/AWB/AF et les visages. Ce changement de système de coordonnées ne s'applique pas à la capture RAW ni à ses métadonnées associées, telles que intrinsicCalibration et lensShadingMap.

En utilisant le même exemple hypothétique ci-dessus et en supposant que le flux de sortie 1 (640x480) est le flux du viseur, un zoom x2 peut être obtenu de deux manières :

  • zoomRatio = 2.0, scaler.cropRegion = (0, 0, 2000, 1500)
  • zoomRatio = 1.0 (par défaut), scaler.cropRegion = (500, 375, 1000, 750)

Pour qu'une application définisse android.control.aeRegions comme quart supérieur gauche du champ de vision du viseur, définissez android.control.aeRegions sur (0, 0, 1000, 750) avec android.control.zoomRatio défini sur 2.0. L'application peut également définir android.control.aeRegions sur la région (500, 375, 1000, 750) équivalente pour android.control.zoomRatio de 1.0.