Flux de sortie
Le sous-système de l'appareil photo 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 à de nombreuses cibles telles que le GPU, l'encodeur vidéo, RenderScript ou les tampons visibles par l'application (balises RAW Bayer, tampons YUV traités ou tampons encodés en JPEG).
À des fins d'optimisation, ces flux de sortie doivent être configurés à l'avance, et il est possible qu'il n'en existe qu'un nombre limité à la fois. Cela permet de préallouer des tampons de mémoire et de configurer le matériel de la caméra. Ainsi, lorsque des requêtes sont envoyées avec plusieurs pipelines de sortie ou différents, il n'y a pas de retards ni de latence pour traiter la requête.
Pour en savoir plus sur les combinaisons de sortie de flux garanties qui dépendent du niveau matériel compatible, consultez createCaptureSession()
.
Recadrage
Le recadrage du tableau de pixels complet (pour le zoom numérique et les autres cas d'utilisation où un champ de vision plus petit est souhaitable) est communiqué via le paramètre ANDROID_SCALER_CROP_REGION. Ce paramètre est défini à la demande et peut changer à la demande, ce qui est essentiel pour implémenter un zoom numérique fluide.
La région est définie comme un rectangle (x, y, largeur, hauteur), où (x, y) décrit 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 indiqué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 région 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 zone recadrée doit répondre à des exigences spécifiques (par exemple, elle doit commencer avec des coordonnées régulières et que sa largeur/hauteur doit être égale), le HAL doit effectuer les arrondis nécessaires et écrire la zone de recadrage finale utilisée dans les métadonnées de résultat de sortie. De même, si le HAL implémente la stabilisation vidéo, il doit ajuster la région de recadrage du résultat pour décrire la région réellement incluse dans la sortie une fois la stabilisation vidéo appliquée. En général, une application utilisant une caméra doit pouvoir déterminer le champ de vision qu'elle reçoit en fonction de la zone de recadrage, des dimensions du capteur d'image et de la longueur focale de l'objectif.
Étant donné que la zone recadrée s'applique à tous les flux, qui peuvent présenter des formats différents de celui de la zone recadrée, la zone exacte du capteur utilisée pour chaque flux peut être plus petite que la zone recadrée. Plus précisément, chaque flux doit conserver des pixels carrés et son format en recadrant encore moins la zone recadrée définie. Si le format du flux est plus large que la région de recadrage, le flux doit être recadré verticalement. Si le format du flux est plus étroit que la région de recadrage, le flux doit être recadré horizontalement.
Dans tous les cas, le recadrage du flux doit être centré dans la zone recadrée complète, et chaque flux n'est recadré que horizontalement ou verticalement par rapport à la zone recadrée complète, jamais les deux.
Par exemple, si deux flux sont définis, un flux de 640 x 480 (format 4:3) et un flux de 1 280 x 720 (format 16:9), l'exemple ci-dessous illustre les régions de sortie attendues pour chaque flux pour quelques exemples de zones de recadrage, sur un capteur hypothétique de 3 Mpx (matrice de 2 000 x 1 500 pixels).
Région de recadrage: (500, 375, 1 000, 750) (format 4:3)
Recadrage du flux 640x480: (500, 375, 1 000, 750) (égal à la région de recadrage)
Recadrage du flux 1 280x720: (500, 469, 1 000, 562)
Région de recadrage: (500, 375, 1333, 750) (format 16:9)
Recadrage du flux 640x480: (666, 375, 1000, 750)
Recadrage du flux 1 280x720: (500, 375, 1333, 750) (égal à la région de recadrage)
Zone recadrée: (500, 375, 750, 750) (format 1:1)
Recadrage en flux continu de 640 x 480: (500, 469, 750, 562)
Recadrage en flux 1 280 x 720: (500, 543, 14)
Voici un dernier exemple, d'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)
Retraitement
La prise en charge supplémentaire des fichiers d'image bruts est assurée par la prise en charge du retraitement des données Bayer RAW. 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 (un frame entier enregistré précédemment) pour générer une nouvelle sortie YUV ou JPEG.
Zoom
Pour les appareils équipés d'Android 11 ou version ultérieure, une application peut utiliser le zoom (numérique et optique) d'un appareil photo 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 ceux du capteur d'appareil photo natif.
Un système multicaméra peut contenir plusieurs objectifs avec des longueurs focales différentes. L'utilisateur peut utiliser le zoom optique en basculant entre les objectifs.
L'utilisation de ANDROID_CONTROL_ZOOM_RATIO
présente des avantages dans les scénarios suivants:
- Zoom avant d'un objectif grand-angle vers un téléobjectif: un ratio à virgule flottante offre une meilleure précision par rapport aux valeurs entières de
ANDROID_SCALER_CROP_REGION
. - Zoom arrière d'un objectif grand angle vers un objectif ultra grand angle :
ANDROID_CONTROL_ZOOM_RATIO
prend en charge le zoom arrière (<1,0f), contrairement àANDROID_SCALER_CROP_REGION
.
Taux de zoom: 2,0 ; 1/4 du champ de vision d'origine
Région de recadrage: (0, 0, 2 000, 1 500) (format 4:3)
Recadrage du flux 640x480: (0, 0, 2 000, 1 500) (égal à la région de recadrage)
Recadrage du flux 1 280x720: (0, 187, 2 000, 1 125)
Taux 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) (format pillarbox)
Recadrage du flux 1 280 x 720: (0, 187, 2000, 1125) (égal à la région de recadrage)
Ratio de zoom: 0,5 ; champ de vision 4 fois supérieur à l'original (passage de l'objectif grand angle à l'objectif ultra grand angle)
Région de recadrage: (250, 0, 1 500, 1 500) (format 1:1)
Recadrage du flux 640 x 480: (250, 187, 1 500, 1 125) (letterbox)
Recadrage du flux 1 280 x 720: (250, 328, 1 500, 844) (letterbox)
Comme le montrent les graphiques ci-dessus, le système de coordonnées de la zone 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 et aux 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, le 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
sur le quart supérieur gauche du champ de vision du viseur, définissez android.control.aeRegions
sur (0, 0, 1000, 750)
et android.control.zoomRatio
sur 2.0
. L'application peut également définir android.control.aeRegions
sur la région équivalente de (500, 375, 1000, 750)
pour android.control.zoomRatio
de 1.0
.